In preparation for sliced threading.
---
 libavcodec/vp8.c |   54 ++++++++++++++++++++++++++++++------------------------
 libavcodec/vp8.h |   11 +++++------
 2 files changed, 35 insertions(+), 30 deletions(-)

diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index 6ab4b26..bc2476e 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -38,7 +38,6 @@ static void free_buffers(VP8Context *s)
 {
     av_freep(&s->macroblocks_base);
     av_freep(&s->filter_strength);
-    av_freep(&s->intra4x4_pred_mode_top);
     av_freep(&s->top_nnz);
     av_freep(&s->edge_emu_buffer);
     av_freep(&s->top_border);
@@ -123,15 +122,14 @@ static int update_dimensions(VP8Context *s, int width, 
int height)
 
     s->macroblocks_base        = 
av_mallocz((s->mb_width+2)*(s->mb_height+2)*sizeof(*s->macroblocks));
     s->filter_strength         = 
av_mallocz(s->mb_width*sizeof(*s->filter_strength));
-    s->intra4x4_pred_mode_top  = av_mallocz(s->mb_width*4);
     s->top_nnz                 = av_mallocz(s->mb_width*sizeof(*s->top_nnz));
     s->top_border              = 
av_mallocz((s->mb_width+1)*sizeof(*s->top_border));
 
-    if (!s->macroblocks_base || !s->filter_strength || 
!s->intra4x4_pred_mode_top ||
+    if (!s->macroblocks_base || !s->filter_strength ||
         !s->top_nnz || !s->top_border)
         return AVERROR(ENOMEM);
 
-    s->macroblocks        = s->macroblocks_base + s->mb_width + 2;
+    s->macroblocks        = s->macroblocks_base + s->mb_width + 1;
 
     return 0;
 }
@@ -622,14 +620,19 @@ void decode_mvs(VP8Context *s, VP8Macroblock *mb, int 
mb_x, int mb_y)
 }
 
 static av_always_inline
-void decode_intra4x4_modes(VP8Context *s, VP56RangeCoder *c,
+void decode_intra4x4_modes(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb,
                            int mb_x, int keyframe)
 {
-    uint8_t *intra4x4 = s->intra4x4_pred_mode_mb;
+    VP8Macroblock *mb_top  = mb - s->mb_width - 1;
+    VP8Macroblock *mb_left = mb - 1;
+    uint8_t *intra4x4 = mb->intra4x4_pred_mode_mb;
+
+    memcpy(mb->intra4x4_pred_mode_left, mb_left->intra4x4_pred_mode_left, 4);
+    memcpy(mb->intra4x4_pred_mode_top,  mb_top->intra4x4_pred_mode_top,   4);
     if (keyframe) {
         int x, y;
-        uint8_t* const top = s->intra4x4_pred_mode_top + 4 * mb_x;
-        uint8_t* const left = s->intra4x4_pred_mode_left;
+        uint8_t* const top = mb->intra4x4_pred_mode_top;
+        uint8_t* const left = mb->intra4x4_pred_mode_left;
         for (y = 0; y < 4; y++) {
             for (x = 0; x < 4; x++) {
                 const uint8_t *ctx;
@@ -655,7 +658,7 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int 
mb_x, int mb_y, uint8_
         *segment = vp8_rac_get_tree(c, vp8_segmentid_tree, s->prob->segmentid);
     else if (s->segmentation.enabled)
         *segment = ref ? *ref : *segment;
-    s->segment = *segment;
+    mb->segment = *segment;
 
     mb->skip = s->mbskip_enabled ? vp56_rac_get_prob(c, s->prob->mbskip) : 0;
 
@@ -663,14 +666,14 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int 
mb_x, int mb_y, uint8_
         mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_intra, 
vp8_pred16x16_prob_intra);
 
         if (mb->mode == MODE_I4x4) {
-            decode_intra4x4_modes(s, c, mb_x, 1);
+            decode_intra4x4_modes(s, c, mb, mb_x, 1);
         } else {
             const uint32_t modes = vp8_pred4x4_mode[mb->mode] * 0x01010101u;
-            AV_WN32A(s->intra4x4_pred_mode_top + 4 * mb_x, modes);
-            AV_WN32A(s->intra4x4_pred_mode_left, modes);
+            AV_WN32A(mb->intra4x4_pred_mode_top,  modes);
+            AV_WN32A(mb->intra4x4_pred_mode_left, modes);
         }
 
-        s->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, 
vp8_pred8x8c_prob_intra);
+        mb->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, 
vp8_pred8x8c_prob_intra);
         mb->ref_frame = VP56_FRAME_CURRENT;
     } else if (vp56_rac_get_prob_branchy(c, s->prob->intra)) {
         // inter MB, 16.2
@@ -688,9 +691,9 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int 
mb_x, int mb_y, uint8_
         mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_inter, 
s->prob->pred16x16);
 
         if (mb->mode == MODE_I4x4)
-            decode_intra4x4_modes(s, c, mb_x, 0);
+            decode_intra4x4_modes(s, c, mb, mb_x, 0);
 
-        s->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, 
s->prob->pred8x8c);
+        mb->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, 
s->prob->pred8x8c);
         mb->ref_frame = VP56_FRAME_CURRENT;
         mb->partitioning = VP8_SPLITMVMODE_NONE;
         AV_ZERO32(&mb->bmv[0]);
@@ -791,7 +794,7 @@ void decode_mb_coeffs(VP8Context *s, VP56RangeCoder *c, 
VP8Macroblock *mb,
 {
     int i, x, y, luma_start = 0, luma_ctx = 3;
     int nnz_pred, nnz, nnz_total = 0;
-    int segment = s->segment;
+    int segment = mb->segment;
     int block_dc = 0;
 
     if (mb->mode != MODE_I4x4 && mb->mode != VP8_MVMODE_SPLIT) {
@@ -1002,7 +1005,7 @@ void intra_predict(VP8Context *s, uint8_t *dst[3], 
VP8Macroblock *mb,
         s->hpc.pred16x16[mode](dst[0], s->linesize);
     } else {
         uint8_t *ptr = dst[0];
-        uint8_t *intra4x4 = s->intra4x4_pred_mode_mb;
+        uint8_t *intra4x4 = mb->intra4x4_pred_mode_mb;
         uint8_t tr_top[4] = { 127, 127, 127, 127 };
 
         // all blocks on the right edge of the macroblock use bottom edge
@@ -1087,9 +1090,9 @@ void intra_predict(VP8Context *s, uint8_t *dst[3], 
VP8Macroblock *mb,
     }
 
     if (avctx->flags & CODEC_FLAG_EMU_EDGE) {
-        mode = check_intra_pred8x8_mode_emuedge(s->chroma_pred_mode, mb_x, 
mb_y);
+        mode = check_intra_pred8x8_mode_emuedge(mb->chroma_pred_mode, mb_x, 
mb_y);
     } else {
-        mode = check_intra_pred8x8_mode(s->chroma_pred_mode, mb_x, mb_y);
+        mode = check_intra_pred8x8_mode(mb->chroma_pred_mode, mb_x, mb_y);
     }
     s->hpc.pred8x8[mode](dst[1], s->uvlinesize);
     s->hpc.pred8x8[mode](dst[2], s->uvlinesize);
@@ -1408,7 +1411,7 @@ static av_always_inline void 
filter_level_for_mb(VP8Context *s, VP8Macroblock *m
     int interior_limit, filter_level;
 
     if (s->segmentation.enabled) {
-        filter_level = s->segmentation.filter_level[s->segment];
+        filter_level = s->segmentation.filter_level[mb->segment];
         if (!s->segmentation.absolute_vals)
             filter_level += s->filter.level;
     } else
@@ -1578,7 +1581,7 @@ static void release_queued_segmaps(VP8Context *s, int 
is_close)
 static void vp8_decode_mb_row(AVCodecContext *avctx, AVFrame *curframe, 
AVFrame *prev_frame, int mb_y) {
     VP8Context *s = avctx->priv_data;
     VP56RangeCoder *c = &s->coeff_partition[mb_y & 
(s->num_coeff_partitions-1)];
-    VP8Macroblock *mb = s->macroblocks + ((s->mb_width+1)*(mb_y + 1) + 1);
+    VP8Macroblock *mb = s->macroblocks_base + ((s->mb_width+1)*(mb_y + 1) + 1);
     int i, y, mb_x, mb_xy = mb_y*s->mb_width;
     uint8_t *dst[3] = {
         curframe->data[0] + 16*mb_y*s->linesize,
@@ -1588,7 +1591,7 @@ static void vp8_decode_mb_row(AVCodecContext *avctx, 
AVFrame *curframe, AVFrame
 
     memset(mb - 1, 0, sizeof(*mb));   // zero left macroblock
     memset(s->left_nnz, 0, sizeof(s->left_nnz));
-    AV_WN32A(s->intra4x4_pred_mode_left, DC_PRED*0x01010101);
+    AV_WN32A((mb-1)->intra4x4_pred_mode_left, DC_PRED*0x01010101);
 
     // left edge of 129 for intra prediction
     if (!(avctx->flags & CODEC_FLAG_EMU_EDGE)) {
@@ -1765,8 +1768,11 @@ static int vp8_decode_frame(AVCodecContext *avctx, void 
*data, int *data_size,
         memset(s->top_border[1]-1, 127, s->mb_width*sizeof(*s->top_border)+1);
     }
     memset(s->ref_count, 0, sizeof(s->ref_count));
-    if (s->keyframe)
-        memset(s->intra4x4_pred_mode_top, DC_PRED, s->mb_width*4);
+    if (s->keyframe) {
+        VP8Macroblock *mb = s->macroblocks_base;
+        for (i = 0; i < s->mb_width+1; i++, mb++)
+            memset(mb->intra4x4_pred_mode_top, DC_PRED, 4);
+    }
 
     s->mv_min.y = -MARGIN;
     s->mv_max.y = ((s->mb_height - 1) << 6) + MARGIN;
diff --git a/libavcodec/vp8.h b/libavcodec/vp8.h
index a738cb7..c533147 100644
--- a/libavcodec/vp8.h
+++ b/libavcodec/vp8.h
@@ -79,6 +79,11 @@ typedef struct {
     uint8_t mode;
     uint8_t ref_frame;
     uint8_t partitioning;
+    uint8_t chroma_pred_mode;
+    uint8_t segment;
+    uint8_t intra4x4_pred_mode_mb[16];
+    uint8_t intra4x4_pred_mode_top[4];
+    uint8_t intra4x4_pred_mode_left[4];
     VP56mv mv;
     VP56mv bmv[16];
 } VP8Macroblock;
@@ -97,8 +102,6 @@ typedef struct {
     uint8_t keyframe;
     uint8_t deblock_filter;
     uint8_t mbskip_enabled;
-    uint8_t segment;             ///< segment of the current macroblock
-    uint8_t chroma_pred_mode;    ///< 8x8c pred mode of the current macroblock
     uint8_t profile;
     VP56mv mv_min;
     VP56mv mv_max;
@@ -128,9 +131,6 @@ typedef struct {
     VP8Macroblock *macroblocks;
     VP8FilterStrength *filter_strength;
 
-    uint8_t *intra4x4_pred_mode_top;
-    uint8_t intra4x4_pred_mode_left[4];
-
     /**
      * Macroblocks can have one of 4 different quants in a frame when
      * segmentation is enabled.
@@ -193,7 +193,6 @@ typedef struct {
     VP56RangeCoder c;   ///< header context, includes mb modes and motion 
vectors
     DECLARE_ALIGNED(16, DCTELEM, block)[6][4][16];
     DECLARE_ALIGNED(16, DCTELEM, block_dc)[16];
-    uint8_t intra4x4_pred_mode_mb[16];
 
     /**
      * These are all of the updatable probabilities for binary decisions.
-- 
1.7.7.3

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to