|
|
|
@ -323,6 +323,39 @@ 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_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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
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]); |
|
|
|
|
|
|
|
|
|
ff_h2645_packet_uninit(&h->pkt); |
|
|
|
|
|
|
|
|
|
ff_h264_unref_picture(h, &h->cur_pic); |
|
|
|
|
av_frame_free(&h->cur_pic.f); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static AVOnce h264_vlc_init = AV_ONCE_INIT; |
|
|
|
|
|
|
|
|
|
av_cold int ff_h264_decode_init(AVCodecContext *avctx) |
|
|
|
@ -351,7 +384,7 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx) |
|
|
|
|
&h->ps, &h->is_avc, &h->nal_length_size, |
|
|
|
|
avctx->err_recognition, avctx); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
ff_h264_free_context(h); |
|
|
|
|
h264_decode_end(avctx); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1064,45 +1097,6 @@ out: |
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
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]); |
|
|
|
|
|
|
|
|
|
ff_h2645_packet_uninit(&h->pkt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static av_cold int h264_decode_end(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
H264Context *h = avctx->priv_data; |
|
|
|
|
|
|
|
|
|
ff_h264_free_context(h); |
|
|
|
|
|
|
|
|
|
ff_h264_unref_picture(h, &h->cur_pic); |
|
|
|
|
av_frame_free(&h->cur_pic.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[] = { |
|
|
|
|