h264: factor out common code from init() and init_thread_copy()
authorAnton Khirnov <anton@khirnov.net>
Mon, 23 Mar 2015 04:46:49 +0000 (05:46 +0100)
committerAnton Khirnov <anton@khirnov.net>
Sun, 5 Apr 2015 10:02:35 +0000 (12:02 +0200)
libavcodec/h264.c

index 311f5bb..f7857db 100644 (file)
@@ -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;