diff options
Diffstat (limited to 'vp9/decoder/vp9_reader.c')
-rw-r--r-- | vp9/decoder/vp9_reader.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/vp9/decoder/vp9_reader.c b/vp9/decoder/vp9_reader.c index fb44c8898..6bb4f9f73 100644 --- a/vp9/decoder/vp9_reader.c +++ b/vp9/decoder/vp9_reader.c @@ -18,7 +18,11 @@ // Even relatively modest values like 100 would work fine. #define LOTS_OF_BITS 0x40000000 -int vp9_reader_init(vp9_reader *r, const uint8_t *buffer, size_t size) { +int vp9_reader_init(vp9_reader *r, + const uint8_t *buffer, + size_t size, + vpx_decrypt_cb decrypt_cb, + void *decrypt_state) { if (size && !buffer) { return 1; } else { @@ -27,6 +31,8 @@ int vp9_reader_init(vp9_reader *r, const uint8_t *buffer, size_t size) { r->value = 0; r->count = -8; r->range = 255; + r->decrypt_cb = decrypt_cb; + r->decrypt_state = decrypt_state; vp9_reader_fill(r); return vp9_read_bit(r) != 0; // marker bit } @@ -35,12 +41,21 @@ int vp9_reader_init(vp9_reader *r, const uint8_t *buffer, size_t size) { void vp9_reader_fill(vp9_reader *r) { const uint8_t *const buffer_end = r->buffer_end; const uint8_t *buffer = r->buffer; + const uint8_t *buffer_start = buffer; BD_VALUE value = r->value; int count = r->count; int shift = BD_VALUE_SIZE - CHAR_BIT - (count + CHAR_BIT); int loop_end = 0; - const int bits_left = (int)((buffer_end - buffer) * CHAR_BIT); - const int x = shift + CHAR_BIT - bits_left; + const size_t bytes_left = buffer_end - buffer; + const size_t bits_left = bytes_left * CHAR_BIT; + const int x = (int)(shift + CHAR_BIT - bits_left); + + if (r->decrypt_cb) { + size_t n = MIN(sizeof(r->clear_buffer), bytes_left); + r->decrypt_cb(r->decrypt_state, buffer, r->clear_buffer, (int)n); + buffer = r->clear_buffer; + buffer_start = r->clear_buffer; + } if (x >= 0) { count += LOTS_OF_BITS; @@ -55,7 +70,10 @@ void vp9_reader_fill(vp9_reader *r) { } } - r->buffer = buffer; + // NOTE: Variable 'buffer' may not relate to 'r->buffer' after decryption, + // so we increase 'r->buffer' by the amount that 'buffer' moved, rather than + // assign 'buffer' to 'r->buffer'. + r->buffer += buffer - buffer_start; r->value = value; r->count = count; } |