summaryrefslogtreecommitdiff
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2015-03-23 05:46:49 +0100
committerAnton Khirnov <anton@khirnov.net>2015-04-05 12:02:35 +0200
commite1f907711a91e5ce19402a1831cfbe8f709b67f7 (patch)
tree98ff172ff4fa9590fa8e8ca78f879672b5f26e65 /libavcodec/h264.c
parent43fd3dd80ca2d1c2ccf6a7b7632db544c809c690 (diff)
h264: factor out common code from init() and init_thread_copy()
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r--libavcodec/h264.c82
1 files changed, 43 insertions, 39 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 311f5bb0fe..f7857db7f6 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -584,36 +584,31 @@ int ff_h264_decode_extradata(H264Context *h)
return 0;
}
-av_cold int ff_h264_decode_init(AVCodecContext *avctx)
+static int h264_init_context(AVCodecContext *avctx, H264Context *h)
{
- H264Context *h = avctx->priv_data;
int i;
- int ret;
-
- h->avctx = avctx;
- h->dequant_coeff_pps = -1;
+ h->avctx = avctx;
+ h->dequant_coeff_pps = -1;
h->cur_chroma_format_idc = -1;
- memset(h->pps.scaling_matrix4, 16, 6 * 16 * sizeof(uint8_t));
- memset(h->pps.scaling_matrix8, 16, 2 * 64 * sizeof(uint8_t));
+ h->picture_structure = PICT_FRAME;
+ h->slice_context_count = 1;
+ h->workaround_bugs = avctx->workaround_bugs;
+ h->flags = avctx->flags;
+ h->prev_poc_msb = 1 << 16;
+ h->x264_build = -1;
+ h->recovery_frame = -1;
+ h->frame_recovered = 0;
- h->picture_structure = PICT_FRAME;
- h->slice_context_count = 1;
- h->workaround_bugs = avctx->workaround_bugs;
- h->flags = avctx->flags;
+ h->outputed_poc = h->next_outputed_poc = INT_MIN;
+ for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
+ h->last_pocs[i] = INT_MIN;
- /* set defaults */
- // s->decode_mb = ff_h263_decode_mb;
- if (!avctx->has_b_frames)
- h->low_delay = 1;
+ ff_h264_reset_sei(h);
avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
- ff_h264_decode_init_vlc();
-
- ff_init_cabac_states();
-
h->nb_slice_ctx = (avctx->active_thread_type & FF_THREAD_SLICE) ? H264_MAX_THREADS : 1;
h->slice_ctx = av_mallocz_array(h->nb_slice_ctx, sizeof(*h->slice_ctx));
if (!h->slice_ctx) {
@@ -624,14 +619,30 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
for (i = 0; i < h->nb_slice_ctx; i++)
h->slice_ctx[i].h264 = h;
- h->outputed_poc = h->next_outputed_poc = INT_MIN;
- for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
- h->last_pocs[i] = INT_MIN;
- h->prev_poc_msb = 1 << 16;
- h->x264_build = -1;
- ff_h264_reset_sei(h);
- h->recovery_frame = -1;
- h->frame_recovered = 0;
+ return 0;
+}
+
+av_cold int ff_h264_decode_init(AVCodecContext *avctx)
+{
+ H264Context *h = avctx->priv_data;
+ int ret;
+
+ ret = h264_init_context(avctx, h);
+ if (ret < 0)
+ return ret;
+
+ memset(h->pps.scaling_matrix4, 16, 6 * 16 * sizeof(uint8_t));
+ memset(h->pps.scaling_matrix8, 16, 2 * 64 * sizeof(uint8_t));
+
+ /* set defaults */
+ // s->decode_mb = ff_h263_decode_mb;
+ if (!avctx->has_b_frames)
+ h->low_delay = 1;
+
+ ff_h264_decode_init_vlc();
+
+ ff_init_cabac_states();
+
if (avctx->codec_id == AV_CODEC_ID_H264) {
if (avctx->ticks_per_frame == 1)
h->avctx->framerate.num *= 2;
@@ -666,24 +677,17 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
static int decode_init_thread_copy(AVCodecContext *avctx)
{
H264Context *h = avctx->priv_data;
- int i;
+ int ret;
if (!avctx->internal->is_copy)
return 0;
memset(h->sps_buffers, 0, sizeof(h->sps_buffers));
memset(h->pps_buffers, 0, sizeof(h->pps_buffers));
- h->nb_slice_ctx = (avctx->active_thread_type & FF_THREAD_SLICE) ? H264_MAX_THREADS : 1;
- h->slice_ctx = av_mallocz_array(h->nb_slice_ctx, sizeof(*h->slice_ctx));
- if (!h->slice_ctx) {
- h->nb_slice_ctx = 0;
- return AVERROR(ENOMEM);
- }
-
- for (i = 0; i < h->nb_slice_ctx; i++)
- h->slice_ctx[i].h264 = h;
+ ret = h264_init_context(avctx, h);
+ if (ret < 0)
+ return ret;
- h->avctx = avctx;
h->context_initialized = 0;
return 0;