mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
vp3: Simplify buffer management
Originally committed as revision 22357 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
01f9640b21
commit
739b5090af
@ -1809,6 +1809,12 @@ static int vp3_decode_frame(AVCodecContext *avctx,
|
|||||||
if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe)
|
if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe)
|
||||||
return buf_size;
|
return buf_size;
|
||||||
|
|
||||||
|
s->current_frame.reference = 3;
|
||||||
|
if (avctx->get_buffer(avctx, &s->current_frame) < 0) {
|
||||||
|
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (s->keyframe) {
|
if (s->keyframe) {
|
||||||
if (!s->theora)
|
if (!s->theora)
|
||||||
{
|
{
|
||||||
@ -1827,35 +1833,10 @@ static int vp3_decode_frame(AVCodecContext *avctx,
|
|||||||
av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n");
|
||||||
skip_bits(&gb, 2); /* reserved? */
|
skip_bits(&gb, 2); /* reserved? */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->last_frame.data[0] == s->golden_frame.data[0]) {
|
|
||||||
if (s->golden_frame.data[0])
|
|
||||||
avctx->release_buffer(avctx, &s->golden_frame);
|
|
||||||
s->last_frame= s->golden_frame; /* ensure that we catch any access to this released frame */
|
|
||||||
} else {
|
|
||||||
if (s->golden_frame.data[0])
|
|
||||||
avctx->release_buffer(avctx, &s->golden_frame);
|
|
||||||
if (s->last_frame.data[0])
|
|
||||||
avctx->release_buffer(avctx, &s->last_frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
s->golden_frame.reference = 3;
|
|
||||||
if(avctx->get_buffer(avctx, &s->golden_frame) < 0) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "vp3: get_buffer() failed\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* golden frame is also the current frame */
|
|
||||||
s->current_frame= s->golden_frame;
|
|
||||||
} else {
|
} else {
|
||||||
/* allocate a new current frame */
|
|
||||||
s->current_frame.reference = 3;
|
|
||||||
if (!s->golden_frame.data[0]) {
|
if (!s->golden_frame.data[0]) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "vp3: first frame not a keyframe\n");
|
av_log(s->avctx, AV_LOG_ERROR, "vp3: first frame not a keyframe\n");
|
||||||
return -1;
|
avctx->release_buffer(avctx, &s->current_frame);
|
||||||
}
|
|
||||||
if(avctx->get_buffer(avctx, &s->current_frame) < 0) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "vp3: get_buffer() failed\n");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1915,6 +1896,13 @@ static int vp3_decode_frame(AVCodecContext *avctx,
|
|||||||
|
|
||||||
/* shuffle frames (last = current) */
|
/* shuffle frames (last = current) */
|
||||||
s->last_frame= s->current_frame;
|
s->last_frame= s->current_frame;
|
||||||
|
|
||||||
|
if (s->keyframe) {
|
||||||
|
if (s->golden_frame.data[0])
|
||||||
|
avctx->release_buffer(avctx, &s->golden_frame);
|
||||||
|
s->golden_frame = s->current_frame;
|
||||||
|
}
|
||||||
|
|
||||||
s->current_frame.data[0]= NULL; /* ensure that we catch any access to this released frame */
|
s->current_frame.data[0]= NULL; /* ensure that we catch any access to this released frame */
|
||||||
|
|
||||||
return buf_size;
|
return buf_size;
|
||||||
|
Loading…
Reference in New Issue
Block a user