cavsdsp: set idct permutation independently of dsputil
authorMans Rullgard <mans@mansr.com>
Tue, 4 Sep 2012 12:52:01 +0000 (13:52 +0100)
committerMans Rullgard <mans@mansr.com>
Fri, 7 Sep 2012 10:42:35 +0000 (11:42 +0100)
CAVS uses its own idct so using dsputil to set the permutation
is fragile.

Signed-off-by: Mans Rullgard <mans@mansr.com>
libavcodec/cavsdec.c
libavcodec/cavsdsp.c
libavcodec/cavsdsp.h
libavcodec/x86/cavsdsp.c
libavcodec/x86/dsputil_mmx.c

index e70dad038a02062b5ab45b16025923fd42c73c34..33e639b9ae3dab8a086be5f4d50f83b973cc4bf6 100644 (file)
@@ -915,9 +915,10 @@ static int decode_pic(AVSContext *h) {
     enum cavs_mb mb_type;
 
     if (!s->context_initialized) {
-        s->avctx->idct_algo = FF_IDCT_CAVS;
         if (ff_MPV_common_init(s) < 0)
             return -1;
+        ff_init_scantable_permutation(s->dsp.idct_permutation,
+                                      h->cdsp.idct_perm);
         ff_init_scantable(s->dsp.idct_permutation,&h->scantable,ff_zigzag_direct);
     }
     skip_bits(&s->gb,16);//bbv_dwlay
index 983d9d7f22d82e5b72f01928fa594d7cbcaca2f8..bdb8d6d0644cb8aadb0a72aa68c6dd977565fe7a 100644 (file)
@@ -544,6 +544,7 @@ av_cold void ff_cavsdsp_init(CAVSDSPContext* c, AVCodecContext *avctx) {
     c->cavs_filter_cv = cavs_filter_cv_c;
     c->cavs_filter_ch = cavs_filter_ch_c;
     c->cavs_idct8_add = cavs_idct8_add_c;
+    c->idct_perm = FF_NO_IDCT_PERM;
 
     if (HAVE_MMX) ff_cavsdsp_init_mmx(c, avctx);
 }
index b1133b726457499500e67e840b24f81bacd2c17e..99b0ea377466bb44c1dddc4f86b8b1077f844c12 100644 (file)
@@ -33,6 +33,7 @@ typedef struct CAVSDSPContext {
     void (*cavs_filter_cv)(uint8_t *pix, int stride, int alpha, int beta, int tc, int bs1, int bs2);
     void (*cavs_filter_ch)(uint8_t *pix, int stride, int alpha, int beta, int tc, int bs1, int bs2);
     void (*cavs_idct8_add)(uint8_t *dst, DCTELEM *block, int stride);
+    int idct_perm;
 } CAVSDSPContext;
 
 void ff_cavsdsp_init(CAVSDSPContext* c, AVCodecContext *avctx);
index e94003956f4f2d1e1db5b3508de064c1448fa9f6..aef74c4d360f7615abe58d0db4e9cdcf8a59b0a0 100644 (file)
@@ -461,6 +461,7 @@ static void ff_cavsdsp_init_mmx2(CAVSDSPContext* c, AVCodecContext *avctx) {
     dspfunc(avg_cavs_qpel, 1, 8);
 #undef dspfunc
     c->cavs_idct8_add = cavs_idct8_add_mmx;
+    c->idct_perm = FF_TRANSPOSE_IDCT_PERM;
 }
 
 static void ff_cavsdsp_init_3dnow(CAVSDSPContext* c, AVCodecContext *avctx) {
@@ -477,6 +478,7 @@ static void ff_cavsdsp_init_3dnow(CAVSDSPContext* c, AVCodecContext *avctx) {
     dspfunc(avg_cavs_qpel, 1, 8);
 #undef dspfunc
     c->cavs_idct8_add = cavs_idct8_add_mmx;
+    c->idct_perm = FF_TRANSPOSE_IDCT_PERM;
 }
 
 #endif /* HAVE_INLINE_ASM */
index 0876ceac9b19c3232d3a57b9a024b23f33b0bc66..af21765e65b4787089ff44100ef37ebee8fa1b42 100644 (file)
@@ -3021,8 +3021,6 @@ void ff_dsputil_init_mmx(DSPContext *c, AVCodecContext *avctx)
                 c->idct_add              = ff_simple_idct_add_mmx;
                 c->idct                  = ff_simple_idct_mmx;
                 c->idct_permutation_type = FF_SIMPLE_IDCT_PERM;
-            } else if (idct_algo == FF_IDCT_CAVS) {
-                    c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
             } else if (idct_algo == FF_IDCT_XVIDMMX) {
                 if (mm_flags & AV_CPU_FLAG_SSE2) {
                     c->idct_put              = ff_idct_xvid_sse2_put;