Commit fa5358f0 authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/rv34: Delay failure return for B frames with a missing reference

Failing earlier causes the context to be insufficiently initialized which
can break decoding future frames with threads
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 80d23d9d
......@@ -1645,6 +1645,7 @@ int ff_rv34_decode_frame(AVCodecContext *avctx,
int slice_count;
const uint8_t *slices_hdr = NULL;
int last = 0;
int faulty_b = 0;
/* no supplementary picture */
if (buf_size == 0) {
......@@ -1682,7 +1683,7 @@ int ff_rv34_decode_frame(AVCodecContext *avctx,
si.type == AV_PICTURE_TYPE_B) {
av_log(avctx, AV_LOG_ERROR, "Invalid decoder state: B-frame without "
"reference data.\n");
return AVERROR_INVALIDDATA;
faulty_b = 1;
}
if( (avctx->skip_frame >= AVDISCARD_NONREF && si.type==AV_PICTURE_TYPE_B)
|| (avctx->skip_frame >= AVDISCARD_NONKEY && si.type!=AV_PICTURE_TYPE_I)
......@@ -1772,6 +1773,8 @@ int ff_rv34_decode_frame(AVCodecContext *avctx,
"multithreading mode (start MB is %d).\n", si.start);
return AVERROR_INVALIDDATA;
}
if (faulty_b)
return AVERROR_INVALIDDATA;
for(i = 0; i < slice_count; i++){
int offset = get_slice_offset(avctx, slices_hdr, i);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment