[FFmpeg-cvslog] intrax8: Pass macroblock size to ff_intrax8_common_init

Vittorio Giovara git at videolan.org
Sat May 7 22:50:58 CEST 2016


ffmpeg | branch: master | Vittorio Giovara <vittorio.giovara at gmail.com> | Sat Feb 20 01:09:40 2016 -0500| [d0540fd02171a6233d2016b199d013299debf7e3] | committer: Vittorio Giovara

intrax8: Pass macroblock size to ff_intrax8_common_init

Helps in decoupling this code from mpegvideo.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d0540fd02171a6233d2016b199d013299debf7e3
---

 libavcodec/intrax8.c |   18 +++++++++++-------
 libavcodec/intrax8.h |    7 +++++++
 libavcodec/vc1dec.c  |    4 +++-
 libavcodec/wmv2dec.c |    3 ++-
 4 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/libavcodec/intrax8.c b/libavcodec/intrax8.c
index e7eda24..a0be10c 100644
--- a/libavcodec/intrax8.c
+++ b/libavcodec/intrax8.c
@@ -399,7 +399,7 @@ static void x8_get_prediction_chroma(IntraX8Context *const w)
 
     w->edges  = 1 * (!(s->mb_x >> 1));
     w->edges |= 2 * (!(s->mb_y >> 1));
-    w->edges |= 4 * (s->mb_x >= (2 * s->mb_width - 1)); // mb_x for chroma would always be odd
+    w->edges |= 4 * (s->mb_x >= (2 * w->mb_width - 1)); // mb_x for chroma would always be odd
 
     w->raw_orient = 0;
     // lut_co[8] = {inv,4,8,8, inv,4,8,8} <- => {1,1,0,0;1,1,0,0} => 0xCC
@@ -418,7 +418,7 @@ static void x8_get_prediction(IntraX8Context *const w)
 
     w->edges  = 1 * (!s->mb_x);
     w->edges |= 2 * (!s->mb_y);
-    w->edges |= 4 * (s->mb_x >= (2 * s->mb_width - 1));
+    w->edges |= 4 * (s->mb_x >= (2 * w->mb_width - 1));
 
     switch (w->edges & 3) {
     case 0:
@@ -739,6 +739,7 @@ static void x8_init_block_index(IntraX8Context *w, AVFrame *frame, int mb_y)
 
 av_cold int ff_intrax8_common_init(AVCodecContext *avctx,
                                    IntraX8Context *w, IDCTDSPContext *idsp,
+                                   int mb_width, int mb_height,
                                    MpegEncContext *const s)
 {
     int ret = x8_vlc_init();
@@ -747,10 +748,14 @@ av_cold int ff_intrax8_common_init(AVCodecContext *avctx,
 
     w->avctx = avctx;
     w->idsp = *idsp;
+    s->mb_x = 0;
+    s->mb_y = 0;
+    w->mb_width  = mb_width;
+    w->mb_height = mb_height;
     w->s = s;
 
     // two rows, 2 blocks per cannon mb
-    w->prediction_table = av_mallocz(s->mb_width * 2 * 2);
+    w->prediction_table = av_mallocz(w->mb_width * 2 * 2);
     if (!w->prediction_table)
         return AVERROR(ENOMEM);
 
@@ -798,11 +803,10 @@ int ff_intrax8_decode_picture(IntraX8Context *const w, Picture *pict,
     }
     x8_reset_vlc_tables(w);
 
-    for (s->mb_y = 0; s->mb_y < s->mb_height * 2; s->mb_y++) {
+    for (s->mb_y = 0; s->mb_y < w->mb_height * 2; s->mb_y++) {
         x8_init_block_index(w, w->frame, s->mb_y);
-        mb_xy = (s->mb_y >> 1) * s->mb_stride;
-
-        for (s->mb_x = 0; s->mb_x < s->mb_width * 2; s->mb_x++) {
+        mb_xy = (s->mb_y >> 1) * (w->mb_width + 1);
+        for (s->mb_x = 0; s->mb_x < w->mb_width * 2; s->mb_x++) {
             x8_get_prediction(w);
             if (x8_setup_spatial_predictor(w, 0))
                 goto error;
diff --git a/libavcodec/intrax8.h b/libavcodec/intrax8.h
index 44954e1..d640cdf 100644
--- a/libavcodec/intrax8.h
+++ b/libavcodec/intrax8.h
@@ -65,6 +65,10 @@ typedef struct IntraX8Context {
     int chroma_orient;
     int orient;
     int est_run;
+
+    // block props
+    int mb_x, mb_y;
+    int mb_width, mb_height;
 } IntraX8Context;
 
 /**
@@ -73,11 +77,14 @@ typedef struct IntraX8Context {
  * @param avctx pointer to AVCodecContext
  * @param w pointer to IntraX8Context
  * @param idsp pointer to IDCTDSPContext
+ * @param mb_width macroblock width
+ * @param mb_height macroblock height
  * @param s pointer to MpegEncContext of the parent codec
  * @return 0 on success, a negative AVERROR value on error
  */
 int ff_intrax8_common_init(AVCodecContext *avctx,
                            IntraX8Context *w, IDCTDSPContext *idsp,
+                           int mb_width, int mb_height,
                            MpegEncContext *const s);
 
 /**
diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
index 250d72a..d1a99d7 100644
--- a/libavcodec/vc1dec.c
+++ b/libavcodec/vc1dec.c
@@ -379,7 +379,9 @@ av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v)
         }
     }
 
-    ret = ff_intrax8_common_init(s->avctx, &v->x8, &s->idsp, s);
+    ret = ff_intrax8_common_init(s->avctx, &v->x8, &s->idsp,
+                                 s->mb_width, s->mb_height,
+                                 s);
     if (ret < 0)
         goto error;
 
diff --git a/libavcodec/wmv2dec.c b/libavcodec/wmv2dec.c
index 0560d95..db32689 100644
--- a/libavcodec/wmv2dec.c
+++ b/libavcodec/wmv2dec.c
@@ -473,7 +473,8 @@ static av_cold int wmv2_decode_init(AVCodecContext *avctx)
 
     ff_wmv2_common_init(w);
 
-    return ff_intrax8_common_init(avctx, &w->x8, &w->s.idsp, &w->s);
+    return ff_intrax8_common_init(avctx, &w->x8, &w->s.idsp,
+                                  w->s.mb_width, w->s.mb_height, &w->s);
 }
 
 static av_cold int wmv2_decode_end(AVCodecContext *avctx)



More information about the ffmpeg-cvslog mailing list