mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
h264: do not call frame_start() for missing frames
We do not need to do a full setup like for a real frame, just allocate a buffer and set cur_pic(_ptr).
This commit is contained in:
parent
d6dc5d15af
commit
f1ccd07680
@ -290,6 +290,33 @@ static int find_unused_picture(H264Context *h)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int initialize_cur_frame(H264Context *h)
|
||||||
|
{
|
||||||
|
H264Picture *cur;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
release_unused_pictures(h, 1);
|
||||||
|
ff_h264_unref_picture(h, &h->cur_pic);
|
||||||
|
h->cur_pic_ptr = NULL;
|
||||||
|
|
||||||
|
ret = find_unused_picture(h);
|
||||||
|
if (ret < 0) {
|
||||||
|
av_log(h->avctx, AV_LOG_ERROR, "no frame buffer available\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
cur = &h->DPB[ret];
|
||||||
|
|
||||||
|
ret = alloc_picture(h, cur);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = ff_h264_ref_picture(h, &h->cur_pic, cur);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
h->cur_pic_ptr = cur;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void init_dequant8_coeff_table(H264Context *h)
|
static void init_dequant8_coeff_table(H264Context *h)
|
||||||
{
|
{
|
||||||
@ -540,16 +567,11 @@ static int h264_frame_start(H264Context *h)
|
|||||||
int i, ret;
|
int i, ret;
|
||||||
const int pixel_shift = h->pixel_shift;
|
const int pixel_shift = h->pixel_shift;
|
||||||
|
|
||||||
release_unused_pictures(h, 1);
|
ret = initialize_cur_frame(h);
|
||||||
h->cur_pic_ptr = NULL;
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
i = find_unused_picture(h);
|
|
||||||
if (i < 0) {
|
|
||||||
av_log(h->avctx, AV_LOG_ERROR, "no frame buffer available\n");
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
pic = &h->DPB[i];
|
|
||||||
|
|
||||||
|
pic = h->cur_pic_ptr;
|
||||||
pic->reference = h->droppable ? 0 : h->picture_structure;
|
pic->reference = h->droppable ? 0 : h->picture_structure;
|
||||||
pic->f->coded_picture_number = h->coded_picture_number++;
|
pic->f->coded_picture_number = h->coded_picture_number++;
|
||||||
pic->field_picture = h->picture_structure != PICT_FRAME;
|
pic->field_picture = h->picture_structure != PICT_FRAME;
|
||||||
@ -563,14 +585,6 @@ static int h264_frame_start(H264Context *h)
|
|||||||
pic->mmco_reset = 0;
|
pic->mmco_reset = 0;
|
||||||
pic->recovered = 0;
|
pic->recovered = 0;
|
||||||
|
|
||||||
if ((ret = alloc_picture(h, pic)) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
h->cur_pic_ptr = pic;
|
|
||||||
ff_h264_unref_picture(h, &h->cur_pic);
|
|
||||||
if ((ret = ff_h264_ref_picture(h, &h->cur_pic, h->cur_pic_ptr)) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (CONFIG_ERROR_RESILIENCE && h->enable_er)
|
if (CONFIG_ERROR_RESILIENCE && h->enable_er)
|
||||||
ff_er_frame_start(&h->slice_ctx[0].er);
|
ff_er_frame_start(&h->slice_ctx[0].er);
|
||||||
|
|
||||||
@ -1336,7 +1350,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
|
|||||||
H264Picture *prev = h->short_ref_count ? h->short_ref[0] : NULL;
|
H264Picture *prev = h->short_ref_count ? h->short_ref[0] : NULL;
|
||||||
av_log(h->avctx, AV_LOG_DEBUG, "Frame num gap %d %d\n",
|
av_log(h->avctx, AV_LOG_DEBUG, "Frame num gap %d %d\n",
|
||||||
h->frame_num, h->prev_frame_num);
|
h->frame_num, h->prev_frame_num);
|
||||||
ret = h264_frame_start(h);
|
ret = initialize_cur_frame(h);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
h->first_field = 0;
|
h->first_field = 0;
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user