]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/idctdsp.c
h264: use the main H264Context as the parent for all slice contexts
[ffmpeg] / libavcodec / idctdsp.c
index 8542ab35aa7f6ff647358b736744a57131ca1e55..a9b8727468ba31baad494f6edf780364c44ba8f9 100644 (file)
@@ -47,29 +47,29 @@ av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st,
 }
 
 av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation,
-                                           int idct_permutation_type)
+                                           enum idct_permutation_type perm_type)
 {
     int i;
 
     if (ARCH_X86)
         if (ff_init_scantable_permutation_x86(idct_permutation,
-                                              idct_permutation_type))
+                                              perm_type))
             return;
 
-    switch (idct_permutation_type) {
-    case FF_NO_IDCT_PERM:
+    switch (perm_type) {
+    case FF_IDCT_PERM_NONE:
         for (i = 0; i < 64; i++)
             idct_permutation[i] = i;
         break;
-    case FF_LIBMPEG2_IDCT_PERM:
+    case FF_IDCT_PERM_LIBMPEG2:
         for (i = 0; i < 64; i++)
             idct_permutation[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
         break;
-    case FF_TRANSPOSE_IDCT_PERM:
+    case FF_IDCT_PERM_TRANSPOSE:
         for (i = 0; i < 64; i++)
             idct_permutation[i] = ((i & 7) << 3) | (i >> 3);
         break;
-    case FF_PARTTRANS_IDCT_PERM:
+    case FF_IDCT_PERM_PARTTRANS:
         for (i = 0; i < 64; i++)
             idct_permutation[i] = (i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3);
         break;
@@ -79,6 +79,9 @@ av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation,
     }
 }
 
+void (*ff_put_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size);
+void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size);
+
 static void put_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
                                  int line_size)
 {
@@ -141,50 +144,41 @@ static void add_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
     }
 }
 
-static void jref_idct_put(uint8_t *dest, int line_size, int16_t *block)
-{
-    ff_j_rev_dct(block);
-    put_pixels_clamped_c(block, dest, line_size);
-}
-
-static void jref_idct_add(uint8_t *dest, int line_size, int16_t *block)
-{
-    ff_j_rev_dct(block);
-    add_pixels_clamped_c(block, dest, line_size);
-}
-
 av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
 {
     const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8;
 
     if (avctx->bits_per_raw_sample == 10) {
-        c->idct_put              = ff_simple_idct_put_10;
-        c->idct_add              = ff_simple_idct_add_10;
-        c->idct                  = ff_simple_idct_10;
-        c->idct_permutation_type = FF_NO_IDCT_PERM;
-    } else {
-        if (avctx->idct_algo == FF_IDCT_INT) {
-            c->idct_put              = jref_idct_put;
-            c->idct_add              = jref_idct_add;
-            c->idct                  = ff_j_rev_dct;
-            c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
-        } else if (avctx->idct_algo == FF_IDCT_FAAN) {
-            c->idct_put              = ff_faanidct_put;
-            c->idct_add              = ff_faanidct_add;
-            c->idct                  = ff_faanidct;
-            c->idct_permutation_type = FF_NO_IDCT_PERM;
-        } else { // accurate/default
-            c->idct_put              = ff_simple_idct_put_8;
-            c->idct_add              = ff_simple_idct_add_8;
-            c->idct                  = ff_simple_idct_8;
-            c->idct_permutation_type = FF_NO_IDCT_PERM;
-        }
+        c->idct_put  = ff_simple_idct_put_10;
+        c->idct_add  = ff_simple_idct_add_10;
+        c->idct      = ff_simple_idct_10;
+        c->perm_type = FF_IDCT_PERM_NONE;
+    } else if (avctx->idct_algo == FF_IDCT_INT) {
+        c->idct_put  = ff_jref_idct_put;
+        c->idct_add  = ff_jref_idct_add;
+        c->idct      = ff_j_rev_dct;
+        c->perm_type = FF_IDCT_PERM_LIBMPEG2;
+#if CONFIG_FAANIDCT
+    } else if (avctx->idct_algo == FF_IDCT_FAAN) {
+        c->idct_put  = ff_faanidct_put;
+        c->idct_add  = ff_faanidct_add;
+        c->idct      = ff_faanidct;
+        c->perm_type = FF_IDCT_PERM_NONE;
+#endif /* CONFIG_FAANIDCT */
+    } else { // accurate/default
+        c->idct_put  = ff_simple_idct_put_8;
+        c->idct_add  = ff_simple_idct_add_8;
+        c->idct      = ff_simple_idct_8;
+        c->perm_type = FF_IDCT_PERM_NONE;
     }
 
     c->put_pixels_clamped        = put_pixels_clamped_c;
     c->put_signed_pixels_clamped = put_signed_pixels_clamped_c;
     c->add_pixels_clamped        = add_pixels_clamped_c;
 
+    ff_put_pixels_clamped = c->put_pixels_clamped;
+    ff_add_pixels_clamped = c->add_pixels_clamped;
+
     if (ARCH_ARM)
         ff_idctdsp_init_arm(c, avctx, high_bit_depth);
     if (ARCH_PPC)
@@ -193,5 +187,5 @@ av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
         ff_idctdsp_init_x86(c, avctx, high_bit_depth);
 
     ff_init_scantable_permutation(c->idct_permutation,
-                                  c->idct_permutation_type);
+                                  c->perm_type);
 }