mirror of https://git.ffmpeg.org/ffmpeg.git
mpegvideo: claim ownership of referenced pictures
Under certain conditions pictures could be released before they were returned with frame-threading. Broken mv computation in the upcoming rv34 frame-threading patch was caused by this. To prevent contexts from running out of available pictures the loop releasing "unused" pictures has to be run for B frames too.
This commit is contained in:
parent
17ce52912f
commit
3ab7700018
|
@ -1170,25 +1170,26 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
|
|||
s->codec_id == CODEC_ID_SVQ3);
|
||||
|
||||
/* mark & release old frames */
|
||||
if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
|
||||
s->last_picture_ptr != s->next_picture_ptr &&
|
||||
s->last_picture_ptr->f.data[0]) {
|
||||
if (s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3) {
|
||||
if (s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3) {
|
||||
if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
|
||||
s->last_picture_ptr != s->next_picture_ptr &&
|
||||
s->last_picture_ptr->f.data[0]) {
|
||||
if (s->last_picture_ptr->owner2 == s)
|
||||
free_frame_buffer(s, s->last_picture_ptr);
|
||||
}
|
||||
|
||||
/* release forgotten pictures */
|
||||
/* if (mpeg124/h263) */
|
||||
if (!s->encoding) {
|
||||
for (i = 0; i < s->picture_count; i++) {
|
||||
if (s->picture[i].owner2 == s && s->picture[i].f.data[0] &&
|
||||
&s->picture[i] != s->next_picture_ptr &&
|
||||
s->picture[i].f.reference) {
|
||||
if (!(avctx->active_thread_type & FF_THREAD_FRAME))
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"releasing zombie picture\n");
|
||||
free_frame_buffer(s, &s->picture[i]);
|
||||
}
|
||||
/* release forgotten pictures */
|
||||
/* if (mpeg124/h263) */
|
||||
if (!s->encoding) {
|
||||
for (i = 0; i < s->picture_count; i++) {
|
||||
if (s->picture[i].owner2 == s && s->picture[i].f.data[0] &&
|
||||
&s->picture[i] != s->last_picture_ptr &&
|
||||
&s->picture[i] != s->next_picture_ptr &&
|
||||
s->picture[i].f.reference) {
|
||||
if (!(avctx->active_thread_type & FF_THREAD_FRAME))
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"releasing zombie picture\n");
|
||||
free_frame_buffer(s, &s->picture[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1295,6 +1296,14 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
|
|||
if (s->next_picture_ptr)
|
||||
ff_copy_picture(&s->next_picture, s->next_picture_ptr);
|
||||
|
||||
if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME) &&
|
||||
(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3)) {
|
||||
if (s->next_picture_ptr)
|
||||
s->next_picture_ptr->owner2 = s;
|
||||
if (s->last_picture_ptr)
|
||||
s->last_picture_ptr->owner2 = s;
|
||||
}
|
||||
|
||||
assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr &&
|
||||
s->last_picture_ptr->f.data[0]));
|
||||
|
||||
|
|
Loading…
Reference in New Issue