Pārlūkot izejas kodu

LibVideo/VP9: Move the transform mode field from Parser to FrameContext

Zaggy1024 2 gadi atpakaļ
vecāks
revīzija
b966f9d811

+ 2 - 0
Userland/Libraries/LibVideo/VP9/Context.h

@@ -329,6 +329,8 @@ public:
 
     u16 header_size_in_bytes { 0 };
 
+    TXMode transform_mode;
+
 private:
     friend struct TileContext;
 

+ 1 - 1
Userland/Libraries/LibVideo/VP9/Decoder.cpp

@@ -298,7 +298,7 @@ DecoderErrorOr<void> Decoder::adapt_non_coef_probs(FrameContext const& frame_con
     if (frame_context.interpolation_filter == Switchable) {
         ADAPT_TREE(interp_filter, interp_filter, interp_filter, INTERP_FILTER_CONTEXTS);
     }
-    if (m_parser->m_tx_mode == TXModeSelect) {
+    if (frame_context.transform_mode == TXModeSelect) {
         for (size_t i = 0; i < TX_SIZE_CONTEXTS; i++) {
             auto& tx_probs = probs.tx_probs();
             auto& tx_counts = counter.m_counts_tx_size;

+ 14 - 15
Userland/Libraries/LibVideo/VP9/Parser.cpp

@@ -542,10 +542,10 @@ void Parser::setup_past_independence()
 
 DecoderErrorOr<void> Parser::compressed_header(FrameContext& frame_context)
 {
-    TRY(read_tx_mode(frame_context));
-    if (m_tx_mode == TXModeSelect)
+    frame_context.transform_mode = TRY(read_tx_mode(frame_context));
+    if (frame_context.transform_mode == TXModeSelect)
         TRY(tx_mode_probs());
-    TRY(read_coef_probs());
+    TRY(read_coef_probs(frame_context.transform_mode));
     TRY(read_skip_prob());
     if (frame_context.is_inter_predicted()) {
         TRY(read_inter_mode_probs());
@@ -561,17 +561,16 @@ DecoderErrorOr<void> Parser::compressed_header(FrameContext& frame_context)
     return {};
 }
 
-DecoderErrorOr<void> Parser::read_tx_mode(FrameContext const& frame_context)
+DecoderErrorOr<TXMode> Parser::read_tx_mode(FrameContext const& frame_context)
 {
     if (frame_context.is_lossless()) {
-        m_tx_mode = Only_4x4;
-    } else {
-        auto tx_mode = TRY_READ(m_bit_stream->read_literal(2));
-        if (tx_mode == Allow_32x32)
-            tx_mode += TRY_READ(m_bit_stream->read_literal(1));
-        m_tx_mode = static_cast<TXMode>(tx_mode);
+        return TXMode::Only_4x4;
     }
-    return {};
+
+    auto tx_mode = TRY_READ(m_bit_stream->read_literal(2));
+    if (tx_mode == Allow_32x32)
+        tx_mode += TRY_READ(m_bit_stream->read_literal(1));
+    return static_cast<TXMode>(tx_mode);
 }
 
 DecoderErrorOr<void> Parser::tx_mode_probs()
@@ -635,9 +634,9 @@ u8 Parser::inv_recenter_nonneg(u8 v, u8 m)
     return m + (v >> 1u);
 }
 
-DecoderErrorOr<void> Parser::read_coef_probs()
+DecoderErrorOr<void> Parser::read_coef_probs(TXMode transform_mode)
 {
-    auto max_tx_size = tx_mode_to_biggest_tx_size[m_tx_mode];
+    auto max_tx_size = tx_mode_to_biggest_tx_size[transform_mode];
     for (u8 tx_size = 0; tx_size <= max_tx_size; tx_size++) {
         auto update_probs = TRY_READ(m_bit_stream->read_literal(1));
         if (update_probs == 1) {
@@ -1047,9 +1046,9 @@ bool Parser::seg_feature_active(BlockContext const& block_context, u8 feature)
 DecoderErrorOr<TXSize> Parser::read_tx_size(BlockContext& block_context, FrameBlockContext above_context, FrameBlockContext left_context, bool allow_select)
 {
     auto max_tx_size = max_txsize_lookup[block_context.size];
-    if (allow_select && m_tx_mode == TXModeSelect && block_context.size >= Block_8x8)
+    if (allow_select && block_context.frame_context.transform_mode == TXModeSelect && block_context.size >= Block_8x8)
         return (TRY_READ(TreeParser::parse_tx_size(*m_bit_stream, *m_probability_tables, *m_syntax_element_counter, max_tx_size, above_context, left_context)));
-    return min(max_tx_size, tx_mode_to_biggest_tx_size[m_tx_mode]);
+    return min(max_tx_size, tx_mode_to_biggest_tx_size[block_context.frame_context.transform_mode]);
 }
 
 DecoderErrorOr<void> Parser::inter_frame_mode_info(BlockContext& block_context, FrameBlockContext above_context, FrameBlockContext left_context)

+ 2 - 3
Userland/Libraries/LibVideo/VP9/Parser.h

@@ -74,13 +74,13 @@ private:
 
     /* (6.3) Compressed Header Syntax */
     DecoderErrorOr<void> compressed_header(FrameContext&);
-    DecoderErrorOr<void> read_tx_mode(FrameContext const&);
+    DecoderErrorOr<TXMode> read_tx_mode(FrameContext const&);
     DecoderErrorOr<void> tx_mode_probs();
     DecoderErrorOr<u8> diff_update_prob(u8 prob);
     DecoderErrorOr<u8> decode_term_subexp();
     u8 inv_remap_prob(u8 delta_prob, u8 prob);
     u8 inv_recenter_nonneg(u8 v, u8 m);
-    DecoderErrorOr<void> read_coef_probs();
+    DecoderErrorOr<void> read_coef_probs(TXMode);
     DecoderErrorOr<void> read_skip_prob();
     DecoderErrorOr<void> read_inter_mode_probs();
     DecoderErrorOr<void> read_interp_filter_probs();
@@ -169,7 +169,6 @@ private:
     u8 m_token_cache[1024];
     i32 m_tokens[1024];
     bool m_use_hp { false };
-    TXMode m_tx_mode;
     ReferenceMode m_reference_mode;
     ReferenceFrameType m_comp_fixed_ref;
     ReferenceFramePair m_comp_var_ref;