|
|
|
@ -375,15 +375,6 @@ void ff_h264_free_tables(H264Context *h, int free_rbsp) |
|
|
|
|
av_buffer_pool_uninit(&h->motion_val_pool); |
|
|
|
|
av_buffer_pool_uninit(&h->ref_index_pool); |
|
|
|
|
|
|
|
|
|
if (free_rbsp && h->DPB) { |
|
|
|
|
for (i = 0; i < H264_MAX_PICTURE_COUNT; i++) |
|
|
|
|
ff_h264_unref_picture(h, &h->DPB[i]); |
|
|
|
|
memset(h->delayed_pic, 0, sizeof(h->delayed_pic)); |
|
|
|
|
av_freep(&h->DPB); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
h->cur_pic_ptr = NULL; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < h->nb_slice_ctx; i++) { |
|
|
|
|
H264SliceContext *sl = &h->slice_ctx[i]; |
|
|
|
|
|
|
|
|
@ -413,7 +404,7 @@ int ff_h264_alloc_tables(H264Context *h) |
|
|
|
|
{ |
|
|
|
|
const int big_mb_num = h->mb_stride * (h->mb_height + 1); |
|
|
|
|
const int row_mb_num = 2*h->mb_stride*FFMAX(h->avctx->thread_count, 1); |
|
|
|
|
int x, y, i; |
|
|
|
|
int x, y; |
|
|
|
|
|
|
|
|
|
FF_ALLOCZ_ARRAY_OR_GOTO(h->avctx, h->intra4x4_pred_mode, |
|
|
|
|
row_mb_num, 8 * sizeof(uint8_t), fail) |
|
|
|
@ -459,15 +450,6 @@ int ff_h264_alloc_tables(H264Context *h) |
|
|
|
|
if (!h->dequant4_coeff[0]) |
|
|
|
|
ff_h264_init_dequant_tables(h); |
|
|
|
|
|
|
|
|
|
if (!h->DPB) { |
|
|
|
|
h->DPB = av_mallocz_array(H264_MAX_PICTURE_COUNT, sizeof(*h->DPB)); |
|
|
|
|
if (!h->DPB) |
|
|
|
|
goto fail; |
|
|
|
|
for (i = 0; i < H264_MAX_PICTURE_COUNT; i++) |
|
|
|
|
av_frame_unref(&h->DPB[i].f); |
|
|
|
|
av_frame_unref(&h->cur_pic.f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
fail: |
|
|
|
@ -644,6 +626,13 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
h->DPB = av_mallocz_array(H264_MAX_PICTURE_COUNT, sizeof(*h->DPB)); |
|
|
|
|
if (!h->DPB) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
for (i = 0; i < H264_MAX_PICTURE_COUNT; i++) |
|
|
|
|
av_frame_unref(&h->DPB[i].f); |
|
|
|
|
av_frame_unref(&h->cur_pic.f); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < h->nb_slice_ctx; i++) |
|
|
|
|
h->slice_ctx[i].h264 = h; |
|
|
|
|
|
|
|
|
@ -1914,6 +1903,15 @@ av_cold void ff_h264_free_context(H264Context *h) |
|
|
|
|
|
|
|
|
|
ff_h264_free_tables(h, 1); // FIXME cleanup init stuff perhaps
|
|
|
|
|
|
|
|
|
|
if (h->DPB) { |
|
|
|
|
for (i = 0; i < H264_MAX_PICTURE_COUNT; i++) |
|
|
|
|
ff_h264_unref_picture(h, &h->DPB[i]); |
|
|
|
|
memset(h->delayed_pic, 0, sizeof(h->delayed_pic)); |
|
|
|
|
av_freep(&h->DPB); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
h->cur_pic_ptr = NULL; |
|
|
|
|
|
|
|
|
|
av_freep(&h->slice_ctx); |
|
|
|
|
h->nb_slice_ctx = 0; |
|
|
|
|
|
|
|
|
|