|
|
|
@ -357,6 +357,48 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static av_cold int h264_decode_end(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
H264Context *h = avctx->priv_data; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
ff_h264_remove_all_refs(h); |
|
|
|
|
ff_h264_free_tables(h); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < H264_MAX_PICTURE_COUNT; i++) { |
|
|
|
|
ff_h264_unref_picture(h, &h->DPB[i]); |
|
|
|
|
av_frame_free(&h->DPB[i].f); |
|
|
|
|
} |
|
|
|
|
memset(h->delayed_pic, 0, sizeof(h->delayed_pic)); |
|
|
|
|
|
|
|
|
|
h->cur_pic_ptr = NULL; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < h->nb_slice_ctx; i++) |
|
|
|
|
av_freep(&h->slice_ctx[i].rbsp_buffer); |
|
|
|
|
av_freep(&h->slice_ctx); |
|
|
|
|
h->nb_slice_ctx = 0; |
|
|
|
|
|
|
|
|
|
ff_h264_sei_uninit(&h->sei); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_SPS_COUNT; i++) |
|
|
|
|
av_buffer_unref(&h->ps.sps_list[i]); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_PPS_COUNT; i++) |
|
|
|
|
av_buffer_unref(&h->ps.pps_list[i]); |
|
|
|
|
|
|
|
|
|
av_buffer_unref(&h->ps.sps_ref); |
|
|
|
|
av_buffer_unref(&h->ps.pps_ref); |
|
|
|
|
|
|
|
|
|
ff_h2645_packet_uninit(&h->pkt); |
|
|
|
|
|
|
|
|
|
ff_h264_unref_picture(h, &h->cur_pic); |
|
|
|
|
av_frame_free(&h->cur_pic.f); |
|
|
|
|
ff_h264_unref_picture(h, &h->last_pic_for_ec); |
|
|
|
|
av_frame_free(&h->last_pic_for_ec.f); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static AVOnce h264_vlc_init = AV_ONCE_INIT; |
|
|
|
|
|
|
|
|
|
av_cold int ff_h264_decode_init(AVCodecContext *avctx) |
|
|
|
@ -1359,54 +1401,6 @@ static int h264_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
return get_consumed_bytes(buf_index, buf_size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
av_cold void ff_h264_free_context(H264Context *h) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
ff_h264_free_tables(h); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < H264_MAX_PICTURE_COUNT; i++) { |
|
|
|
|
ff_h264_unref_picture(h, &h->DPB[i]); |
|
|
|
|
av_frame_free(&h->DPB[i].f); |
|
|
|
|
} |
|
|
|
|
memset(h->delayed_pic, 0, sizeof(h->delayed_pic)); |
|
|
|
|
|
|
|
|
|
h->cur_pic_ptr = NULL; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < h->nb_slice_ctx; i++) |
|
|
|
|
av_freep(&h->slice_ctx[i].rbsp_buffer); |
|
|
|
|
av_freep(&h->slice_ctx); |
|
|
|
|
h->nb_slice_ctx = 0; |
|
|
|
|
|
|
|
|
|
ff_h264_sei_uninit(&h->sei); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_SPS_COUNT; i++) |
|
|
|
|
av_buffer_unref(&h->ps.sps_list[i]); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_PPS_COUNT; i++) |
|
|
|
|
av_buffer_unref(&h->ps.pps_list[i]); |
|
|
|
|
|
|
|
|
|
av_buffer_unref(&h->ps.sps_ref); |
|
|
|
|
av_buffer_unref(&h->ps.pps_ref); |
|
|
|
|
|
|
|
|
|
ff_h2645_packet_uninit(&h->pkt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static av_cold int h264_decode_end(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
H264Context *h = avctx->priv_data; |
|
|
|
|
|
|
|
|
|
ff_h264_remove_all_refs(h); |
|
|
|
|
ff_h264_free_context(h); |
|
|
|
|
|
|
|
|
|
ff_h264_unref_picture(h, &h->cur_pic); |
|
|
|
|
av_frame_free(&h->cur_pic.f); |
|
|
|
|
ff_h264_unref_picture(h, &h->last_pic_for_ec); |
|
|
|
|
av_frame_free(&h->last_pic_for_ec.f); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define OFFSET(x) offsetof(H264Context, x) |
|
|
|
|
#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM |
|
|
|
|
static const AVOption h264_options[] = { |
|
|
|
|