Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
669e7b7454 | ||
![]() |
62a57630cc | ||
![]() |
240f8e56e4 | ||
![]() |
3b3ee4a4db |
@ -146,6 +146,40 @@ TEST(DecodeAPI, Vp9InvalidDecode) {
|
|||||||
TestVp9Controls(&dec);
|
TestVp9Controls(&dec);
|
||||||
EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&dec));
|
EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&dec));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(DecodeAPI, Vp9PeekSI) {
|
||||||
|
const vpx_codec_iface_t *const codec = &vpx_codec_vp9_dx_algo;
|
||||||
|
// The first 9 bytes are valid and the rest of the bytes are made up. Until
|
||||||
|
// size 10, this should return VPX_CODEC_UNSUP_BITSTREAM and after that it
|
||||||
|
// should return VPX_CODEC_CORRUPT_FRAME.
|
||||||
|
const uint8_t data[32] = {
|
||||||
|
0x85, 0xa4, 0xc1, 0xa1, 0x38, 0x81, 0xa3, 0x49,
|
||||||
|
0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (uint32_t data_sz = 1; data_sz <= 32; ++data_sz) {
|
||||||
|
// Verify behavior of vpx_codec_decode. vpx_codec_decode doesn't even get
|
||||||
|
// to decoder_peek_si_internal on frames of size < 8.
|
||||||
|
if (data_sz >= 8) {
|
||||||
|
vpx_codec_ctx_t dec;
|
||||||
|
EXPECT_EQ(VPX_CODEC_OK, vpx_codec_dec_init(&dec, codec, NULL, 0));
|
||||||
|
EXPECT_EQ((data_sz < 10) ?
|
||||||
|
VPX_CODEC_UNSUP_BITSTREAM : VPX_CODEC_CORRUPT_FRAME,
|
||||||
|
vpx_codec_decode(&dec, data, data_sz, NULL, 0));
|
||||||
|
vpx_codec_iter_t iter = NULL;
|
||||||
|
EXPECT_EQ(NULL, vpx_codec_get_frame(&dec, &iter));
|
||||||
|
EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&dec));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify behavior of vpx_codec_peek_stream_info.
|
||||||
|
vpx_codec_stream_info_t si;
|
||||||
|
si.sz = sizeof(si);
|
||||||
|
EXPECT_EQ((data_sz < 10) ? VPX_CODEC_UNSUP_BITSTREAM : VPX_CODEC_OK,
|
||||||
|
vpx_codec_peek_stream_info(codec, data, data_sz, &si));
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif // CONFIG_VP9_DECODER
|
#endif // CONFIG_VP9_DECODER
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -1315,11 +1315,16 @@ static void setup_frame_size_with_refs(VP9_COMMON *cm,
|
|||||||
BufferPool *const pool = cm->buffer_pool;
|
BufferPool *const pool = cm->buffer_pool;
|
||||||
for (i = 0; i < REFS_PER_FRAME; ++i) {
|
for (i = 0; i < REFS_PER_FRAME; ++i) {
|
||||||
if (vpx_rb_read_bit(rb)) {
|
if (vpx_rb_read_bit(rb)) {
|
||||||
YV12_BUFFER_CONFIG *const buf = cm->frame_refs[i].buf;
|
if (cm->frame_refs[i].idx != INVALID_IDX) {
|
||||||
width = buf->y_crop_width;
|
YV12_BUFFER_CONFIG *const buf = cm->frame_refs[i].buf;
|
||||||
height = buf->y_crop_height;
|
width = buf->y_crop_width;
|
||||||
found = 1;
|
height = buf->y_crop_height;
|
||||||
break;
|
found = 1;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
|
||||||
|
"Failed to decode frame size");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1334,22 +1339,23 @@ static void setup_frame_size_with_refs(VP9_COMMON *cm,
|
|||||||
// has valid dimensions.
|
// has valid dimensions.
|
||||||
for (i = 0; i < REFS_PER_FRAME; ++i) {
|
for (i = 0; i < REFS_PER_FRAME; ++i) {
|
||||||
RefBuffer *const ref_frame = &cm->frame_refs[i];
|
RefBuffer *const ref_frame = &cm->frame_refs[i];
|
||||||
has_valid_ref_frame |= valid_ref_frame_size(ref_frame->buf->y_crop_width,
|
has_valid_ref_frame |= (ref_frame->idx != INVALID_IDX &&
|
||||||
ref_frame->buf->y_crop_height,
|
valid_ref_frame_size(ref_frame->buf->y_crop_width,
|
||||||
width, height);
|
ref_frame->buf->y_crop_height,
|
||||||
|
width, height));
|
||||||
}
|
}
|
||||||
if (!has_valid_ref_frame)
|
if (!has_valid_ref_frame)
|
||||||
vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
|
vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
|
||||||
"Referenced frame has invalid size");
|
"Referenced frame has invalid size");
|
||||||
for (i = 0; i < REFS_PER_FRAME; ++i) {
|
for (i = 0; i < REFS_PER_FRAME; ++i) {
|
||||||
RefBuffer *const ref_frame = &cm->frame_refs[i];
|
RefBuffer *const ref_frame = &cm->frame_refs[i];
|
||||||
if (!valid_ref_frame_img_fmt(
|
if (ref_frame->idx == INVALID_IDX ||
|
||||||
ref_frame->buf->bit_depth,
|
!valid_ref_frame_img_fmt(ref_frame->buf->bit_depth,
|
||||||
ref_frame->buf->subsampling_x,
|
ref_frame->buf->subsampling_x,
|
||||||
ref_frame->buf->subsampling_y,
|
ref_frame->buf->subsampling_y,
|
||||||
cm->bit_depth,
|
cm->bit_depth,
|
||||||
cm->subsampling_x,
|
cm->subsampling_x,
|
||||||
cm->subsampling_y))
|
cm->subsampling_y))
|
||||||
vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
|
vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
|
||||||
"Referenced frame has incompatible color format");
|
"Referenced frame has incompatible color format");
|
||||||
}
|
}
|
||||||
|
@ -508,7 +508,7 @@ vpx_codec_err_t vp9_parse_superframe_index(const uint8_t *data,
|
|||||||
uint32_t this_sz = 0;
|
uint32_t this_sz = 0;
|
||||||
|
|
||||||
for (j = 0; j < mag; ++j)
|
for (j = 0; j < mag; ++j)
|
||||||
this_sz |= (*x++) << (j * 8);
|
this_sz |= ((uint32_t)(*x++)) << (j * 8);
|
||||||
sizes[i] = this_sz;
|
sizes[i] = this_sz;
|
||||||
}
|
}
|
||||||
*count = frames;
|
*count = frames;
|
||||||
|
@ -127,7 +127,7 @@ static vpx_codec_err_t decoder_peek_si_internal(const uint8_t *data,
|
|||||||
vpx_decrypt_cb decrypt_cb,
|
vpx_decrypt_cb decrypt_cb,
|
||||||
void *decrypt_state) {
|
void *decrypt_state) {
|
||||||
int intra_only_flag = 0;
|
int intra_only_flag = 0;
|
||||||
uint8_t clear_buffer[9];
|
uint8_t clear_buffer[10];
|
||||||
|
|
||||||
if (data + data_sz <= data)
|
if (data + data_sz <= data)
|
||||||
return VPX_CODEC_INVALID_PARAM;
|
return VPX_CODEC_INVALID_PARAM;
|
||||||
@ -141,6 +141,11 @@ static vpx_codec_err_t decoder_peek_si_internal(const uint8_t *data,
|
|||||||
data = clear_buffer;
|
data = clear_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A maximum of 6 bits are needed to read the frame marker, profile and
|
||||||
|
// show_existing_frame.
|
||||||
|
if (data_sz < 1)
|
||||||
|
return VPX_CODEC_UNSUP_BITSTREAM;
|
||||||
|
|
||||||
{
|
{
|
||||||
int show_frame;
|
int show_frame;
|
||||||
int error_resilient;
|
int error_resilient;
|
||||||
@ -154,15 +159,19 @@ static vpx_codec_err_t decoder_peek_si_internal(const uint8_t *data,
|
|||||||
if (profile >= MAX_PROFILES)
|
if (profile >= MAX_PROFILES)
|
||||||
return VPX_CODEC_UNSUP_BITSTREAM;
|
return VPX_CODEC_UNSUP_BITSTREAM;
|
||||||
|
|
||||||
if ((profile >= 2 && data_sz <= 1) || data_sz < 1)
|
|
||||||
return VPX_CODEC_UNSUP_BITSTREAM;
|
|
||||||
|
|
||||||
if (vpx_rb_read_bit(&rb)) { // show an existing frame
|
if (vpx_rb_read_bit(&rb)) { // show an existing frame
|
||||||
|
// If profile is > 2 and show_existing_frame is true, then at least 1 more
|
||||||
|
// byte (6+3=9 bits) is needed.
|
||||||
|
if (profile > 2 && data_sz < 2)
|
||||||
|
return VPX_CODEC_UNSUP_BITSTREAM;
|
||||||
vpx_rb_read_literal(&rb, 3); // Frame buffer to show.
|
vpx_rb_read_literal(&rb, 3); // Frame buffer to show.
|
||||||
return VPX_CODEC_OK;
|
return VPX_CODEC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_sz <= 8)
|
// For the rest of the function, a maximum of 9 more bytes are needed
|
||||||
|
// (computed by taking the maximum possible bits needed in each case). Note
|
||||||
|
// that this has to be updated if we read any more bits in this function.
|
||||||
|
if (data_sz < 10)
|
||||||
return VPX_CODEC_UNSUP_BITSTREAM;
|
return VPX_CODEC_UNSUP_BITSTREAM;
|
||||||
|
|
||||||
si->is_kf = !vpx_rb_read_bit(&rb);
|
si->is_kf = !vpx_rb_read_bit(&rb);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user