LibVideo/VP9: Specify which spec section defines certain behaviors

This commit is contained in:
FalseHonesty 2021-06-26 13:31:34 -04:00 committed by Andreas Kling
parent ce524214c9
commit 91572a49c4
Notes: sideshowbarker 2024-07-18 09:23:53 +09:00
6 changed files with 51 additions and 36 deletions

View file

@ -37,13 +37,6 @@ u8 BitStream::read_f(size_t n)
return result;
}
i8 BitStream::read_s(size_t n)
{
auto value = read_f(n);
auto sign = read_bit();
return sign ? -value : value;
}
u8 BitStream::read_f8()
{
if (!m_current_byte.has_value())
@ -63,30 +56,6 @@ u16 BitStream::read_f16()
return (read_f8() << 8u) | read_f8();
}
u8 BitStream::read_literal(size_t n)
{
u8 return_value = 0;
for (size_t i = 0; i < n; i++) {
return_value = (2 * return_value) + read_bool(128);
}
return return_value;
}
u64 BitStream::get_position()
{
return (m_bytes_read * 8) + (7 - m_current_bit_position);
}
size_t BitStream::bytes_remaining()
{
return m_bytes_remaining;
}
size_t BitStream::bits_remaining()
{
return (bytes_remaining() * 8) + m_current_bit_position + 1;
}
/* 9.2.1 */
bool BitStream::init_bool(size_t bytes)
{
@ -139,4 +108,35 @@ bool BitStream::exit_bool()
return padding_element == 0;
}
u8 BitStream::read_literal(size_t n)
{
u8 return_value = 0;
for (size_t i = 0; i < n; i++) {
return_value = (2 * return_value) + read_bool(128);
}
return return_value;
}
i8 BitStream::read_s(size_t n)
{
auto value = read_f(n);
auto sign = read_bit();
return sign ? -value : value;
}
u64 BitStream::get_position()
{
return (m_bytes_read * 8) + (7 - m_current_bit_position);
}
size_t BitStream::bytes_remaining()
{
return m_bytes_remaining;
}
size_t BitStream::bits_remaining()
{
return (bytes_remaining() * 8) + m_current_bit_position + 1;
}
}

View file

@ -21,20 +21,25 @@ public:
u8 read_byte();
bool read_bit();
/* (9.1) */
u8 read_f(size_t n);
i8 read_s(size_t n);
u8 read_f8();
u16 read_f16();
/* (9.2) */
bool init_bool(size_t bytes);
bool read_bool(u8 probability);
bool exit_bool();
u8 read_literal(size_t n);
/* (4.9.2) */
i8 read_s(size_t n);
u64 get_position();
size_t bytes_remaining();
size_t bits_remaining();
bool init_bool(size_t bytes);
bool read_bool(u8 probability);
bool exit_bool();
private:
u8 const* m_data_ptr { nullptr };
size_t m_bytes_remaining { 0 };

View file

@ -22,6 +22,7 @@ Decoder::Decoder()
{
}
/* (6.1) */
bool Decoder::parse_frame(ByteBuffer const& frame_data)
{
m_bit_stream = make<BitStream>(frame_data.data(), frame_data.size());
@ -49,6 +50,7 @@ bool Decoder::parse_frame(ByteBuffer const& frame_data)
return true;
}
/* (6.2) */
bool Decoder::uncompressed_header()
{
auto frame_marker = m_bit_stream->read_f(2);

View file

@ -40,6 +40,7 @@ private:
return StudioSwing;
}
/* (6.2) Uncompressed Header Syntax */
bool uncompressed_header();
bool frame_sync_code();
bool color_config();
@ -59,6 +60,7 @@ private:
bool setup_past_independence();
bool trailing_bits();
/* (6.3) Compressed Header Syntax */
bool compressed_header();
bool read_tx_mode();
bool tx_mode_probs();
@ -79,6 +81,7 @@ private:
u8 update_mv_prob(u8 prob);
bool setup_compound_reference_mode();
/* (6.4) Decode Tiles Syntax */
bool decode_tiles();
bool clear_above_context();
u32 get_tile_offset(u32 tile_num, u32 mis, u32 tile_size_log2);

View file

@ -44,6 +44,7 @@ enum class SyntaxElementType {
class SyntaxElementCounter final {
public:
/* (8.3) Clear Counts Process */
void clear_counts();
u8 m_counts_intra_mode[BLOCK_SIZE_GROUPS][INTRA_MODES];

View file

@ -41,10 +41,14 @@ public:
TreeSelectionValue m_value;
};
/* (9.3.3) */
template<typename T = int>
T parse_tree(SyntaxElementType type);
/* (9.3.1) */
TreeSelection select_tree(SyntaxElementType type);
/* (9.3.2) */
u8 select_tree_probability(SyntaxElementType type, u8 node);
/* (9.3.4) */
void count_syntax_element(SyntaxElementType type, int value);
void set_default_intra_mode_variables(u8 idx, u8 idy)