h264: drop the now unused per-slice H264Contexts
authorAnton Khirnov <anton@khirnov.net>
Wed, 28 Jan 2015 18:28:18 +0000 (19:28 +0100)
committerAnton Khirnov <anton@khirnov.net>
Sat, 21 Mar 2015 10:27:16 +0000 (11:27 +0100)
libavcodec/h264.c
libavcodec/h264.h
libavcodec/h264_parser.c
libavcodec/h264_slice.c

index 48ffeab..d26cbfd 100644 (file)
@@ -344,7 +344,6 @@ static int decode_rbsp_trailing(H264Context *h, const uint8_t *src)
 void ff_h264_free_tables(H264Context *h, int free_rbsp)
 {
     int i;
-    H264Context *hx;
 
     av_freep(&h->intra4x4_pred_mode);
     av_freep(&h->chroma_pred_mode_table);
@@ -376,15 +375,6 @@ void ff_h264_free_tables(H264Context *h, int free_rbsp)
 
     h->cur_pic_ptr = NULL;
 
-    for (i = 0; i < H264_MAX_THREADS; i++) {
-        hx = h->thread_context[i];
-        if (!hx)
-            continue;
-
-        if (i)
-            av_freep(&h->thread_context[i]);
-    }
-
     for (i = 0; i < h->nb_slice_ctx; i++) {
         H264SliceContext *sl = &h->slice_ctx[i];
 
@@ -653,7 +643,6 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
         return AVERROR(ENOMEM);
     }
 
-    h->thread_context[0] = h;
     for (i = 0; i < h->nb_slice_ctx; i++)
         h->slice_ctx[i].h264 = h;
 
index a24c7c7..8b73b75 100644 (file)
@@ -608,8 +608,6 @@ typedef struct H264Context {
      * @name Members for slice based multithreading
      * @{
      */
-    struct H264Context *thread_context[H264_MAX_THREADS];
-
     /**
      * current slice number, used to initalize slice_num of each thread/context
      */
index d04eeb1..f444355 100644 (file)
@@ -552,7 +552,6 @@ static av_cold int init(AVCodecParserContext *s)
         return 0;
     h->nb_slice_ctx = 1;
 
-    h->thread_context[0]   = h;
     h->slice_context_count = 1;
     ff_h264dsp_init(&h->h264dsp, 8, 1);
     return 0;
index 40ed93c..4044ba2 100644 (file)
@@ -371,31 +371,6 @@ void h264_init_dequant_tables(H264Context *h)
     }
 }
 
-/**
- * Mimic alloc_tables(), but for every context thread.
- */
-static void clone_tables(H264Context *dst, H264SliceContext *sl,
-                         H264Context *src, int i)
-{
-    sl->intra4x4_pred_mode     = src->intra4x4_pred_mode + i * 8 * 2 * src->mb_stride;
-    sl->mvd_table[0]           = src->mvd_table[0] + i * 8 * 2 * src->mb_stride;
-    sl->mvd_table[1]           = src->mvd_table[1] + i * 8 * 2 * src->mb_stride;
-
-    dst->non_zero_count         = src->non_zero_count;
-    dst->slice_table            = src->slice_table;
-    dst->cbp_table              = src->cbp_table;
-    dst->mb2b_xy                = src->mb2b_xy;
-    dst->mb2br_xy               = src->mb2br_xy;
-    dst->chroma_pred_mode_table = src->chroma_pred_mode_table;
-    dst->direct_table           = src->direct_table;
-    dst->list_counts            = src->list_counts;
-    dst->DPB                    = src->DPB;
-    dst->cur_pic_ptr            = src->cur_pic_ptr;
-    dst->cur_pic                = src->cur_pic;
-    ff_h264_pred_init(&dst->hpc, src->avctx->codec_id, src->sps.bit_depth_luma,
-                      src->sps.chroma_format_idc);
-}
-
 #define IN_RANGE(a, b, size) (((a) >= (b)) && ((a) < ((b) + (size))))
 
 #define REBASE_PICTURE(pic, new_ctx, old_ctx)             \
@@ -535,8 +510,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst,
             return ret;
         }
 
-        h->thread_context[0] = h;
-
         h->context_initialized = 1;
     }
 
@@ -602,7 +575,7 @@ int ff_h264_update_thread_context(AVCodecContext *dst,
     copy_fields(h, h1, poc_lsb, default_ref_list);
 
     // reference lists
-    copy_fields(h, h1, short_ref, thread_context);
+    copy_fields(h, h1, short_ref, current_slice);
 
     copy_picture_range(h->short_ref, h1->short_ref, 32, h, h1);
     copy_picture_range(h->long_ref, h1->long_ref, 32, h, h1);
@@ -1073,47 +1046,19 @@ static int h264_slice_header_init(H264Context *h, int reinit)
             return ret;
         }
     } else {
-        for (i = 1; i < h->slice_context_count; i++) {
-            H264Context *c;
-            c                    = h->thread_context[i] = av_mallocz(sizeof(H264Context));
-            if (!c)
-                return AVERROR(ENOMEM);
-            c->avctx             = h->avctx;
-            c->vdsp              = h->vdsp;
-            c->h264dsp           = h->h264dsp;
-            c->h264qpel          = h->h264qpel;
-            c->h264chroma        = h->h264chroma;
-            c->sps               = h->sps;
-            c->pps               = h->pps;
-            c->pixel_shift       = h->pixel_shift;
-            c->width             = h->width;
-            c->height            = h->height;
-            c->linesize          = h->linesize;
-            c->uvlinesize        = h->uvlinesize;
-            c->chroma_x_shift    = h->chroma_x_shift;
-            c->chroma_y_shift    = h->chroma_y_shift;
-            c->droppable         = h->droppable;
-            c->low_delay         = h->low_delay;
-            c->mb_width          = h->mb_width;
-            c->mb_height         = h->mb_height;
-            c->mb_stride         = h->mb_stride;
-            c->mb_num            = h->mb_num;
-            c->flags             = h->flags;
-            c->workaround_bugs   = h->workaround_bugs;
-            c->pict_type         = h->pict_type;
-
-            h->slice_ctx[i].h264 = c;
-
-            init_scan_tables(c);
-            clone_tables(c, &h->slice_ctx[i], h, i);
-            c->context_initialized = 1;
-        }
+        for (i = 0; i < h->slice_context_count; i++) {
+            H264SliceContext *sl = &h->slice_ctx[i];
 
-        for (i = 0; i < h->slice_context_count; i++)
-            if ((ret = ff_h264_slice_context_init(h, &h->slice_ctx[i])) < 0) {
+            sl->h264               = h;
+            sl->intra4x4_pred_mode = h->intra4x4_pred_mode + i * 8 * 2 * h->mb_stride;
+            sl->mvd_table[0]       = h->mvd_table[0]       + i * 8 * 2 * h->mb_stride;
+            sl->mvd_table[1]       = h->mvd_table[1]       + i * 8 * 2 * h->mb_stride;
+
+            if ((ret = ff_h264_slice_context_init(h, sl)) < 0) {
                 av_log(h->avctx, AV_LOG_ERROR, "context_init() failed.\n");
                 return ret;
             }
+        }
     }
 
     h->context_initialized = 1;