]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/intrax8.c
libopenh264dec: Export the decoded profile and level in AVCodecContext
[ffmpeg] / libavcodec / intrax8.c
index 209b857fa40b452572482d282eea7d98660d17ef..d32bb059e17aaea5eeef741f1c1a073f6a5798c8 100644 (file)
@@ -24,7 +24,6 @@
 #include "avcodec.h"
 #include "get_bits.h"
 #include "idctdsp.h"
-#include "mpegvideo.h"
 #include "msmpeg4data.h"
 #include "intrax8huf.h"
 #include "intrax8.h"
@@ -217,9 +216,9 @@ static void x8_get_ac_rlf(IntraX8Context *const w, const int mode,
     if (i < 46) { // [0-45]
         int t, l;
         if (i < 0) {
-            (*level) =
-            (*final) =      // prevent 'may be used unilitialized'
-            (*run)   = 64;  // this would cause error exit in the ac loop
+            *level =
+            *final =      // prevent 'may be used uninitialized'
+            *run   = 64;  // this would cause error exit in the ac loop
             return;
         }
 
@@ -230,20 +229,20 @@ static void x8_get_ac_rlf(IntraX8Context *const w, const int mode,
          * i == 22    r = 0    l = 3; r = i & %00000
          */
 
-        (*final) =
-        t        = (i > 22);
-        i       -= 23 * t;
+        *final =
+        t      = i > 22;
+        i     -= 23 * t;
 
         /* l = lut_l[i / 2] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3 }[i >> 1];
          *     11 10'01 01'00 00'00 00'00 00'00 00 => 0xE50000 */
-        l = (0xE50000 >> (i & (0x1E))) & 3; // 0x1E or (~1) or ((i >> 1) << 1)
+        l = (0xE50000 >> (i & 0x1E)) & 3; // 0x1E or ~1 or (i >> 1 << 1)
 
         /* t = lut_mask[l] = { 0x0f, 0x03, 0x01, 0x00 }[l];
          *     as i < 256 the higher bits do not matter */
-        t = (0x01030F >> (l << 3));
+        t = 0x01030F >> (l << 3);
 
-        (*run)   = i & t;
-        (*level) = l;
+        *run   = i & t;
+        *level = l;
     } else if (i < 73) { // [46-72]
         uint32_t sm;
         uint32_t mask;
@@ -252,13 +251,13 @@ static void x8_get_ac_rlf(IntraX8Context *const w, const int mode,
         sm = ac_decode_table[i];
 
         e    = get_bits(w->gb, sm & 0xF);
-        sm >>= 8;                               // 3bits
+        sm >>= 8;                               // 3 bits
         mask = sm & 0xff;
-        sm >>= 8;                               // 1bit
+        sm >>= 8;                               // 1 bit
 
-        (*run)   = (sm & 0xff) + (e & (mask));  // 6bits
-        (*level) = (sm >> 8)   + (e & (~mask)); // 5bits
-        (*final) = i > (58 - 46);
+        *run   = (sm &  0xff) + (e &  mask);    // 6 bits
+        *level = (sm >>    8) + (e & ~mask);    // 5 bits
+        *final = i > (58 - 46);
     } else if (i < 75) { // [73-74]
         static const uint8_t crazy_mix_runlevel[32] = {
             0x22, 0x32, 0x33, 0x53, 0x23, 0x42, 0x43, 0x63,
@@ -267,14 +266,14 @@ static void x8_get_ac_rlf(IntraX8Context *const w, const int mode,
             0x28, 0x92, 0x36, 0x74, 0x29, 0xa2, 0x46, 0x84,
         };
 
-        (*final) = !(i & 1);
-        e        = get_bits(w->gb, 5); // get the extra bits
-        (*run)   = crazy_mix_runlevel[e] >> 4;
-        (*level) = crazy_mix_runlevel[e] & 0x0F;
+        *final = !(i & 1);
+        e      = get_bits(w->gb, 5); // get the extra bits
+        *run   = crazy_mix_runlevel[e] >> 4;
+        *level = crazy_mix_runlevel[e] & 0x0F;
     } else {
-        (*level) = get_bits(w->gb, 7 - 3 * (i & 1));
-        (*run)   = get_bits(w->gb, 6);
-        (*final) = get_bits1(w->gb);
+        *level = get_bits(w->gb, 7 - 3 * (i & 1));
+        *run   = get_bits(w->gb, 6);
+        *final = get_bits1(w->gb);
     }
     return;
 }
@@ -303,12 +302,12 @@ static int x8_get_dc_rlf(IntraX8Context *const w, const int mode,
     i = get_vlc2(w->gb, w->j_dc_vlc[mode]->table, DC_VLC_BITS, DC_VLC_MTD);
 
     /* (i >= 17) { i -= 17; final =1; } */
-    c        = i > 16;
-    (*final) = c;
-    i       -= 17 * c;
+    c      = i > 16;
+    *final = c;
+    i      -= 17 * c;
 
     if (i <= 0) {
-        (*level) = 0;
+        *level = 0;
         return -i;
     }
     c  = (i + 1) >> 1; // hackish way to calculate dc_extra_sbits[]
@@ -317,8 +316,8 @@ static int x8_get_dc_rlf(IntraX8Context *const w, const int mode,
     e = get_bits(w->gb, c); // get the extra bits
     i = dc_index_offset[i] + (e >> 1);
 
-    e        = -(e & 1); // 0, 0xffffff
-    (*level) = (i ^ e) - e; // (i ^ 0) -0  , (i ^ 0xff) - (-1)
+    e      = -(e & 1);     // 0, 0xffffff
+    *level =  (i ^ e) - e; // (i ^ 0) - 0, (i ^ 0xff) - (-1)
     return 0;
 }
 
@@ -349,7 +348,7 @@ static int x8_setup_spatial_predictor(IntraX8Context *const w, const int chroma)
             w->flat_dc      = 1;
             sum            += 9;
             // ((1 << 17) + 9) / (8 + 8 + 1 + 2) = 6899
-            w->predicted_dc = (sum * 6899) >> 17;
+            w->predicted_dc = sum * 6899 >> 17;
         }
     }
     if (chroma)
@@ -394,8 +393,8 @@ static void x8_update_predictions(IntraX8Context *const w, const int orient,
 
 static void x8_get_prediction_chroma(IntraX8Context *const w)
 {
-    w->edges  = 1 * (!(w->mb_x >> 1));
-    w->edges |= 2 * (!(w->mb_y >> 1));
+    w->edges  = 1 * !(w->mb_x >> 1);
+    w->edges |= 2 * !(w->mb_y >> 1);
     w->edges |= 4 * (w->mb_x >= (2 * w->mb_width - 1)); // mb_x for chroma would always be odd
 
     w->raw_orient = 0;
@@ -412,8 +411,8 @@ static void x8_get_prediction(IntraX8Context *const w)
 {
     int a, b, c, i;
 
-    w->edges  = 1 * (!w->mb_x);
-    w->edges |= 2 * (!w->mb_y);
+    w->edges  = 1 * !w->mb_x;
+    w->edges |= 2 * !w->mb_y;
     w->edges |= 4 * (w->mb_x >= (2 * w->mb_width - 1));
 
     switch (w->edges & 3) {
@@ -480,9 +479,8 @@ static void x8_get_prediction(IntraX8Context *const w)
 static void x8_ac_compensation(IntraX8Context *const w, const int direction,
                                const int dc_level)
 {
-    MpegEncContext *const s = w->s;
     int t;
-#define B(x, y) s->block[0][w->idsp.idct_permutation[(x) + (y) * 8]]
+#define B(x, y) w->block[0][w->idsp.idct_permutation[(x) + (y) * 8]]
 #define T(x)  ((x) * dc_level + 0x8000) >> 16;
     switch (direction) {
     case 0:
@@ -526,7 +524,7 @@ static void x8_ac_compensation(IntraX8Context *const w, const int direction,
         t        = T(1084); // g
         B(1, 1) += t;
 
-        s->block_last_index[0] = FFMAX(s->block_last_index[0], 7 * 8);
+        w->block_last_index[0] = FFMAX(w->block_last_index[0], 7 * 8);
         break;
     case 1:
         B(0, 1) -= T(6269);
@@ -534,7 +532,7 @@ static void x8_ac_compensation(IntraX8Context *const w, const int direction,
         B(0, 5) -= T(172);
         B(0, 7) -= T(73);
 
-        s->block_last_index[0] = FFMAX(s->block_last_index[0], 7 * 8);
+        w->block_last_index[0] = FFMAX(w->block_last_index[0], 7 * 8);
         break;
     case 2:
         B(1, 0) -= T(6269);
@@ -542,7 +540,7 @@ static void x8_ac_compensation(IntraX8Context *const w, const int direction,
         B(5, 0) -= T(172);
         B(7, 0) -= T(73);
 
-        s->block_last_index[0] = FFMAX(s->block_last_index[0], 7);
+        w->block_last_index[0] = FFMAX(w->block_last_index[0], 7);
         break;
     }
 #undef B
@@ -550,7 +548,7 @@ static void x8_ac_compensation(IntraX8Context *const w, const int direction,
 }
 
 static void dsp_x8_put_solidcolor(const uint8_t pix, uint8_t *dst,
-                                  const int linesize)
+                                  const ptrdiff_t linesize)
 {
     int k;
     for (k = 0; k < 8; k++) {
@@ -572,8 +570,6 @@ static const int16_t quant_table[64] = {
 
 static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
 {
-    MpegEncContext *const s = w->s;
-
     uint8_t *scantable;
     int final, run, level;
     int ac_mode, dc_mode, est_run, dc_level;
@@ -583,7 +579,7 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
     int sign;
 
     assert(w->orient < 12);
-    w->bdsp.clear_block(s->block[0]);
+    w->bdsp.clear_block(w->block[0]);
 
     if (chroma)
         dc_mode = 2;
@@ -644,12 +640,12 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
             if (use_quant_matrix)
                 level = (level * quant_table[pos]) >> 8;
 
-            s->block[0][scantable[pos]] = level;
+            w->block[0][scantable[pos]] = level;
         } while (!final);
 
-        s->block_last_index[0] = pos;
+        w->block_last_index[0] = pos;
     } else { // DC only
-        s->block_last_index[0] = 0;
+        w->block_last_index[0] = 0;
         if (w->flat_dc && ((unsigned) (dc_level + 1)) < 3) { // [-1; 1]
             int32_t divide_quant = !chroma ? w->divide_quant_dc_luma
                                            : w->divide_quant_dc_chroma;
@@ -666,12 +662,12 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
 
             goto block_placed;
         }
-        zeros_only = (dc_level == 0);
+        zeros_only = dc_level == 0;
     }
     if (!chroma)
-        s->block[0][0] = dc_level * w->quant;
+        w->block[0][0] = dc_level * w->quant;
     else
-        s->block[0][0] = dc_level * w->quant_dc_chroma;
+        w->block[0][0] = dc_level * w->quant_dc_chroma;
 
     // there is !zero_only check in the original, but dc_level check is enough
     if ((unsigned int) (dc_level + 1) >= 3 && (w->edges & 3) != 3) {
@@ -681,7 +677,7 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
         direction = (0x6A017C >> (w->orient * 2)) & 3;
         if (direction != 3) {
             // modify block_last[]
-            x8_ac_compensation(w, direction, s->block[0][0]);
+            x8_ac_compensation(w, direction, w->block[0][0]);
         }
     }
 
@@ -696,7 +692,7 @@ static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
     if (!zeros_only)
         w->idsp.idct_add(w->dest[chroma],
                          w->frame->linesize[!!chroma],
-                         s->block[0]);
+                         w->block[0]);
 
 block_placed:
     if (!chroma)
@@ -704,7 +700,7 @@ block_placed:
 
     if (w->loopfilter) {
         uint8_t *ptr = w->dest[chroma];
-        int linesize = w->frame->linesize[!!chroma];
+        ptrdiff_t linesize = w->frame->linesize[!!chroma];
 
         if (!((w->edges & 2) || (zeros_only && (w->orient | 4) == 4)))
             w->dsp.h_loop_filter(ptr, linesize, w->quant);
@@ -720,23 +716,24 @@ static void x8_init_block_index(IntraX8Context *w, AVFrame *frame)
 {
     // not parent codec linesize as this would be wrong for field pics
     // not that IntraX8 has interlacing support ;)
-    const int linesize   = frame->linesize[0];
-    const int uvlinesize = frame->linesize[1];
+    const ptrdiff_t linesize   = frame->linesize[0];
+    const ptrdiff_t uvlinesize = frame->linesize[1];
 
     w->dest[0] = frame->data[0];
     w->dest[1] = frame->data[1];
     w->dest[2] = frame->data[2];
 
-    w->dest[0] +=  w->mb_y         * linesize   << 3;
+    w->dest[0] +=  w->mb_y       * linesize   << 3;
     // chroma blocks are on add rows
-    w->dest[1] += (w->mb_y & (~1)) * uvlinesize << 2;
-    w->dest[2] += (w->mb_y & (~1)) * uvlinesize << 2;
+    w->dest[1] += (w->mb_y & ~1) * uvlinesize << 2;
+    w->dest[2] += (w->mb_y & ~1) * uvlinesize << 2;
 }
 
 av_cold int ff_intrax8_common_init(AVCodecContext *avctx,
                                    IntraX8Context *w, IDCTDSPContext *idsp,
-                                   int mb_width, int mb_height,
-                                   MpegEncContext *const s)
+                                   int16_t (*block)[64],
+                                   int block_last_index[12],
+                                   int mb_width, int mb_height)
 {
     int ret = x8_vlc_init();
     if (ret < 0)
@@ -746,7 +743,8 @@ av_cold int ff_intrax8_common_init(AVCodecContext *avctx,
     w->idsp = *idsp;
     w->mb_width  = mb_width;
     w->mb_height = mb_height;
-    w->s = s;
+    w->block = block;
+    w->block_last_index = block_last_index;
 
     // two rows, 2 blocks per cannon mb
     w->prediction_table = av_mallocz(w->mb_width * 2 * 2);
@@ -761,7 +759,7 @@ av_cold int ff_intrax8_common_init(AVCodecContext *avctx,
                       ff_wmv1_scantable[3]);
 
     ff_intrax8dsp_init(&w->dsp);
-    ff_blockdsp_init(&w->bdsp, avctx);
+    ff_blockdsp_init(&w->bdsp);
 
     return 0;
 }
@@ -771,14 +769,12 @@ av_cold void ff_intrax8_common_end(IntraX8Context *w)
     av_freep(&w->prediction_table);
 }
 
-int ff_intrax8_decode_picture(IntraX8Context *const w, Picture *pict,
+int ff_intrax8_decode_picture(IntraX8Context *w, Picture *pict,
                               GetBitContext *gb, int *mb_x, int *mb_y,
                               int dquant, int quant_offset,
                               int loopfilter, int lowdelay)
 {
-    MpegEncContext *const s = w->s;
     int mb_xy;
-    assert(s);
 
     w->gb     = gb;
     w->dquant = dquant;
@@ -827,9 +823,6 @@ int ff_intrax8_decode_picture(IntraX8Context *const w, Picture *pict,
                 w->dest[1] += 8;
                 w->dest[2] += 8;
 
-                /* emulate MB info in the relevant tables */
-                s->mbskip_table[mb_xy]                 = 0;
-                s->mbintra_table[mb_xy]                = 1;
                 pict->qscale_table[mb_xy] = w->quant;
                 mb_xy++;
             }