|
|
|
@ -1515,26 +1515,26 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) |
|
|
|
|
s->mb_skipped = 0; |
|
|
|
|
|
|
|
|
|
/* 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]) { |
|
|
|
|
ff_mpeg_unref_picture(s, s->last_picture_ptr); |
|
|
|
|
} |
|
|
|
|
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]) { |
|
|
|
|
ff_mpeg_unref_picture(s, s->last_picture_ptr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* release forgotten pictures */ |
|
|
|
|
/* if (mpeg124/h263) */ |
|
|
|
|
if (!s->encoding) { |
|
|
|
|
for (i = 0; i < MAX_PICTURE_COUNT; i++) { |
|
|
|
|
if (&s->picture[i] != s->last_picture_ptr && |
|
|
|
|
&s->picture[i] != s->next_picture_ptr && |
|
|
|
|
s->picture[i].reference && !s->picture[i].needs_realloc) { |
|
|
|
|
if (!(avctx->active_thread_type & FF_THREAD_FRAME)) |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
|
"releasing zombie picture\n"); |
|
|
|
|
ff_mpeg_unref_picture(s, &s->picture[i]); |
|
|
|
|
} |
|
|
|
|
/* release forgotten pictures */ |
|
|
|
|
/* if (mpeg124/h263) */ |
|
|
|
|
if (!s->encoding) { |
|
|
|
|
for (i = 0; i < MAX_PICTURE_COUNT; i++) { |
|
|
|
|
if (&s->picture[i] != s->last_picture_ptr && |
|
|
|
|
&s->picture[i] != s->next_picture_ptr && |
|
|
|
|
s->picture[i].reference && !s->picture[i].needs_realloc) { |
|
|
|
|
if (!(avctx->active_thread_type & FF_THREAD_FRAME)) |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
|
"releasing zombie picture\n"); |
|
|
|
|
ff_mpeg_unref_picture(s, &s->picture[i]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!s->encoding) { |
|
|
|
|
ff_release_unused_pictures(s, 1); |
|
|
|
@ -1600,79 +1600,79 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) |
|
|
|
|
s->current_picture_ptr ? s->current_picture_ptr->f.data[0] : NULL, |
|
|
|
|
s->pict_type, s->droppable); |
|
|
|
|
|
|
|
|
|
if ((s->last_picture_ptr == NULL || |
|
|
|
|
s->last_picture_ptr->f.data[0] == NULL) && |
|
|
|
|
(s->pict_type != AV_PICTURE_TYPE_I || |
|
|
|
|
s->picture_structure != PICT_FRAME)) { |
|
|
|
|
int h_chroma_shift, v_chroma_shift; |
|
|
|
|
av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, |
|
|
|
|
&h_chroma_shift, &v_chroma_shift); |
|
|
|
|
if (s->pict_type != AV_PICTURE_TYPE_I) |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
|
"warning: first frame is no keyframe\n"); |
|
|
|
|
else if (s->picture_structure != PICT_FRAME) |
|
|
|
|
av_log(avctx, AV_LOG_INFO, |
|
|
|
|
"allocate dummy last picture for field based first keyframe\n"); |
|
|
|
|
|
|
|
|
|
/* Allocate a dummy frame */ |
|
|
|
|
i = ff_find_unused_picture(s, 0); |
|
|
|
|
if (i < 0) { |
|
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n"); |
|
|
|
|
return i; |
|
|
|
|
} |
|
|
|
|
s->last_picture_ptr = &s->picture[i]; |
|
|
|
|
if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) { |
|
|
|
|
s->last_picture_ptr = NULL; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
memset(s->last_picture_ptr->f.data[0], 0, |
|
|
|
|
avctx->height * s->last_picture_ptr->f.linesize[0]); |
|
|
|
|
memset(s->last_picture_ptr->f.data[1], 0x80, |
|
|
|
|
(avctx->height >> v_chroma_shift) * |
|
|
|
|
s->last_picture_ptr->f.linesize[1]); |
|
|
|
|
memset(s->last_picture_ptr->f.data[2], 0x80, |
|
|
|
|
(avctx->height >> v_chroma_shift) * |
|
|
|
|
s->last_picture_ptr->f.linesize[2]); |
|
|
|
|
|
|
|
|
|
ff_thread_report_progress(&s->last_picture_ptr->tf, INT_MAX, 0); |
|
|
|
|
ff_thread_report_progress(&s->last_picture_ptr->tf, INT_MAX, 1); |
|
|
|
|
if ((s->last_picture_ptr == NULL || |
|
|
|
|
s->last_picture_ptr->f.data[0] == NULL) && |
|
|
|
|
(s->pict_type != AV_PICTURE_TYPE_I || |
|
|
|
|
s->picture_structure != PICT_FRAME)) { |
|
|
|
|
int h_chroma_shift, v_chroma_shift; |
|
|
|
|
av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, |
|
|
|
|
&h_chroma_shift, &v_chroma_shift); |
|
|
|
|
if (s->pict_type != AV_PICTURE_TYPE_I) |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
|
"warning: first frame is no keyframe\n"); |
|
|
|
|
else if (s->picture_structure != PICT_FRAME) |
|
|
|
|
av_log(avctx, AV_LOG_INFO, |
|
|
|
|
"allocate dummy last picture for field based first keyframe\n"); |
|
|
|
|
|
|
|
|
|
/* Allocate a dummy frame */ |
|
|
|
|
i = ff_find_unused_picture(s, 0); |
|
|
|
|
if (i < 0) { |
|
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n"); |
|
|
|
|
return i; |
|
|
|
|
} |
|
|
|
|
if ((s->next_picture_ptr == NULL || |
|
|
|
|
s->next_picture_ptr->f.data[0] == NULL) && |
|
|
|
|
s->pict_type == AV_PICTURE_TYPE_B) { |
|
|
|
|
/* Allocate a dummy frame */ |
|
|
|
|
i = ff_find_unused_picture(s, 0); |
|
|
|
|
if (i < 0) { |
|
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n"); |
|
|
|
|
return i; |
|
|
|
|
} |
|
|
|
|
s->next_picture_ptr = &s->picture[i]; |
|
|
|
|
if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) { |
|
|
|
|
s->next_picture_ptr = NULL; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
ff_thread_report_progress(&s->next_picture_ptr->tf, INT_MAX, 0); |
|
|
|
|
ff_thread_report_progress(&s->next_picture_ptr->tf, INT_MAX, 1); |
|
|
|
|
s->last_picture_ptr = &s->picture[i]; |
|
|
|
|
if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) { |
|
|
|
|
s->last_picture_ptr = NULL; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->last_picture_ptr) { |
|
|
|
|
ff_mpeg_unref_picture(s, &s->last_picture); |
|
|
|
|
if (s->last_picture_ptr->f.data[0] && |
|
|
|
|
(ret = ff_mpeg_ref_picture(s, &s->last_picture, |
|
|
|
|
s->last_picture_ptr)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
memset(s->last_picture_ptr->f.data[0], 0, |
|
|
|
|
avctx->height * s->last_picture_ptr->f.linesize[0]); |
|
|
|
|
memset(s->last_picture_ptr->f.data[1], 0x80, |
|
|
|
|
(avctx->height >> v_chroma_shift) * |
|
|
|
|
s->last_picture_ptr->f.linesize[1]); |
|
|
|
|
memset(s->last_picture_ptr->f.data[2], 0x80, |
|
|
|
|
(avctx->height >> v_chroma_shift) * |
|
|
|
|
s->last_picture_ptr->f.linesize[2]); |
|
|
|
|
|
|
|
|
|
ff_thread_report_progress(&s->last_picture_ptr->tf, INT_MAX, 0); |
|
|
|
|
ff_thread_report_progress(&s->last_picture_ptr->tf, INT_MAX, 1); |
|
|
|
|
} |
|
|
|
|
if ((s->next_picture_ptr == NULL || |
|
|
|
|
s->next_picture_ptr->f.data[0] == NULL) && |
|
|
|
|
s->pict_type == AV_PICTURE_TYPE_B) { |
|
|
|
|
/* Allocate a dummy frame */ |
|
|
|
|
i = ff_find_unused_picture(s, 0); |
|
|
|
|
if (i < 0) { |
|
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n"); |
|
|
|
|
return i; |
|
|
|
|
} |
|
|
|
|
if (s->next_picture_ptr) { |
|
|
|
|
ff_mpeg_unref_picture(s, &s->next_picture); |
|
|
|
|
if (s->next_picture_ptr->f.data[0] && |
|
|
|
|
(ret = ff_mpeg_ref_picture(s, &s->next_picture, |
|
|
|
|
s->next_picture_ptr)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
s->next_picture_ptr = &s->picture[i]; |
|
|
|
|
if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) { |
|
|
|
|
s->next_picture_ptr = NULL; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
ff_thread_report_progress(&s->next_picture_ptr->tf, INT_MAX, 0); |
|
|
|
|
ff_thread_report_progress(&s->next_picture_ptr->tf, INT_MAX, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->last_picture_ptr) { |
|
|
|
|
ff_mpeg_unref_picture(s, &s->last_picture); |
|
|
|
|
if (s->last_picture_ptr->f.data[0] && |
|
|
|
|
(ret = ff_mpeg_ref_picture(s, &s->last_picture, |
|
|
|
|
s->last_picture_ptr)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
if (s->next_picture_ptr) { |
|
|
|
|
ff_mpeg_unref_picture(s, &s->next_picture); |
|
|
|
|
if (s->next_picture_ptr->f.data[0] && |
|
|
|
|
(ret = ff_mpeg_ref_picture(s, &s->next_picture, |
|
|
|
|
s->next_picture_ptr)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr && |
|
|
|
|
s->last_picture_ptr->f.data[0])); |
|
|
|
|
assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr && |
|
|
|
|
s->last_picture_ptr->f.data[0])); |
|
|
|
|
|
|
|
|
|
if (s->picture_structure!= PICT_FRAME) { |
|
|
|
|
int i; |
|
|
|
|