uint32_t ff_square_tab[512] = { 0, };
#define BIT_DEPTH 16
-#include "dsputil_template.c"
+#include "dsputilenc_template.c"
#undef BIT_DEPTH
#define BIT_DEPTH 8
+#include "hpel_template.c"
+#include "tpel_template.c"
#include "dsputil_template.c"
+#include "dsputilenc_template.c"
// 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size
#define pb_7f (~0UL / 255 * 0x7f)
*dst++ = av_bswap16(*src++);
}
-static int sse4_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
+static int sse4_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
+ int line_size, int h)
{
int s = 0, i;
uint32_t *sq = ff_square_tab + 256;
return s;
}
-static int sse8_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
+static int sse8_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
+ int line_size, int h)
{
int s = 0, i;
uint32_t *sq = ff_square_tab + 256;
return s;
}
-static int sse16_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
+static int sse16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
+ int line_size, int h)
{
int s = 0, i;
uint32_t *sq = ff_square_tab + 256;
}
}
-static inline void put_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- switch (width) {
- case 2:
- put_pixels2_8_c(dst, src, stride, height);
- break;
- case 4:
- put_pixels4_8_c(dst, src, stride, height);
- break;
- case 8:
- put_pixels8_8_c(dst, src, stride, height);
- break;
- case 16:
- put_pixels16_8_c(dst, src, stride, height);
- break;
- }
-}
-
-static inline void put_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = ((2 * src[j] + src[j + 1] + 1) *
- 683) >> 11;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void put_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = ((src[j] + 2 * src[j + 1] + 1) *
- 683) >> 11;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void put_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = ((2 * src[j] + src[j + stride] + 1) *
- 683) >> 11;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void put_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = ((4 * src[j] + 3 * src[j + 1] +
- 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) *
- 2731) >> 15;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void put_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = ((3 * src[j] + 2 * src[j + 1] +
- 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
- 2731) >> 15;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void put_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = ((src[j] + 2 * src[j + stride] + 1) *
- 683) >> 11;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void put_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = ((3 * src[j] + 4 * src[j + 1] +
- 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
- 2731) >> 15;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void put_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = ((2 * src[j] + 3 * src[j + 1] +
- 3 * src[j + stride] + 4 * src[j + stride + 1] + 6) *
- 2731) >> 15;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void avg_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- switch (width) {
- case 2:
- avg_pixels2_8_c(dst, src, stride, height);
- break;
- case 4:
- avg_pixels4_8_c(dst, src, stride, height);
- break;
- case 8:
- avg_pixels8_8_c(dst, src, stride, height);
- break;
- case 16:
- avg_pixels16_8_c(dst, src, stride, height);
- break;
- }
-}
-
-static inline void avg_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = (dst[j] +
- (((2 * src[j] + src[j + 1] + 1) *
- 683) >> 11) + 1) >> 1;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void avg_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = (dst[j] +
- (((src[j] + 2 * src[j + 1] + 1) *
- 683) >> 11) + 1) >> 1;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void avg_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = (dst[j] +
- (((2 * src[j] + src[j + stride] + 1) *
- 683) >> 11) + 1) >> 1;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void avg_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = (dst[j] +
- (((4 * src[j] + 3 * src[j + 1] +
- 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) *
- 2731) >> 15) + 1) >> 1;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void avg_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = (dst[j] +
- (((3 * src[j] + 2 * src[j + 1] +
- 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
- 2731) >> 15) + 1) >> 1;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void avg_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = (dst[j] +
- (((src[j] + 2 * src[j + stride] + 1) *
- 683) >> 11) + 1) >> 1;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void avg_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = (dst[j] +
- (((3 * src[j] + 4 * src[j + 1] +
- 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
- 2731) >> 15) + 1) >> 1;
- src += stride;
- dst += stride;
- }
-}
-
-static inline void avg_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src,
- int stride, int width, int height)
-{
- int i, j;
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++)
- dst[j] = (dst[j] +
- (((2 * src[j] + 3 * src[j + 1] +
- 3 * src[j + stride] + 4 * src[j + stride + 1] + 6) *
- 2731) >> 15) + 1) >> 1;
- src += stride;
- dst += stride;
- }
-}
-
#define QPEL_MC(r, OPNAME, RND, OP) \
static void OPNAME ## mpeg4_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, \
int dstStride, int srcStride, \
}
}
-#if CONFIG_RV40_DECODER
-void ff_put_rv40_qpel16_mc33_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
-{
- put_pixels16_xy2_8_c(dst, src, stride, 16);
-}
-
-void ff_avg_rv40_qpel16_mc33_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
-{
- avg_pixels16_xy2_8_c(dst, src, stride, 16);
-}
-
-void ff_put_rv40_qpel8_mc33_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
-{
- put_pixels8_xy2_8_c(dst, src, stride, 8);
-}
-
-void ff_avg_rv40_qpel8_mc33_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
-{
- avg_pixels8_xy2_8_c(dst, src, stride, 8);
-}
-#endif /* CONFIG_RV40_DECODER */
-
#if CONFIG_DIRAC_DECODER
#define DIRAC_MC(OPNAME)\
void ff_ ## OPNAME ## _dirac_pixels8_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
wmv2_mspel8_v_lowpass(dst, halfH + 8, stride, 8, 8);
}
-static inline int pix_abs16_c(void *v, uint8_t *pix1, uint8_t *pix2,
+static inline int pix_abs16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
int line_size, int h)
{
int s = 0, i;
return s;
}
-static int pix_abs16_x2_c(void *v, uint8_t *pix1, uint8_t *pix2,
+static int pix_abs16_x2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
int line_size, int h)
{
int s = 0, i;
return s;
}
-static int pix_abs16_y2_c(void *v, uint8_t *pix1, uint8_t *pix2,
+static int pix_abs16_y2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
int line_size, int h)
{
int s = 0, i;
return s;
}
-static int pix_abs16_xy2_c(void *v, uint8_t *pix1, uint8_t *pix2,
+static int pix_abs16_xy2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
int line_size, int h)
{
int s = 0, i;
return s;
}
-static inline int pix_abs8_c(void *v, uint8_t *pix1, uint8_t *pix2,
+static inline int pix_abs8_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
int line_size, int h)
{
int s = 0, i;
return s;
}
-static int pix_abs8_x2_c(void *v, uint8_t *pix1, uint8_t *pix2,
+static int pix_abs8_x2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
int line_size, int h)
{
int s = 0, i;
return s;
}
-static int pix_abs8_y2_c(void *v, uint8_t *pix1, uint8_t *pix2,
+static int pix_abs8_y2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
int line_size, int h)
{
int s = 0, i;
return s;
}
-static int pix_abs8_xy2_c(void *v, uint8_t *pix1, uint8_t *pix2,
+static int pix_abs8_xy2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
int line_size, int h)
{
int s = 0, i;
return s;
}
-static int nsse16_c(void *v, uint8_t *s1, uint8_t *s2, int stride, int h)
+static int nsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h)
{
- MpegEncContext *c = v;
int score1 = 0, score2 = 0, x, y;
for (y = 0; y < h; y++) {
return score1 + FFABS(score2) * 8;
}
-static int nsse8_c(void *v, uint8_t *s1, uint8_t *s2, int stride, int h)
+static int nsse8_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h)
{
- MpegEncContext *c = v;
int score1 = 0, score2 = 0, x, y;
for (y = 0; y < h; y++) {
(BASIS_SHIFT - RECON_SHIFT);
}
-static int zero_cmp(void *s, uint8_t *a, uint8_t *b, int stride, int h)
+static int zero_cmp(MpegEncContext *s, uint8_t *a, uint8_t *b,
+ int stride, int h)
{
return 0;
}
#define BUTTERFLYA(x, y) (FFABS((x) + (y)) + FFABS((x) - (y)))
-static int hadamard8_diff8x8_c(/* MpegEncContext */ void *s, uint8_t *dst,
+static int hadamard8_diff8x8_c(MpegEncContext *s, uint8_t *dst,
uint8_t *src, int stride, int h)
{
int i, temp[64], sum = 0;
return sum;
}
-static int hadamard8_intra8x8_c(/* MpegEncContext */ void *s, uint8_t *src,
+static int hadamard8_intra8x8_c(MpegEncContext *s, uint8_t *src,
uint8_t *dummy, int stride, int h)
{
int i, temp[64], sum = 0;
return sum;
}
-static int dct_sad8x8_c(/* MpegEncContext */ void *c, uint8_t *src1,
+static int dct_sad8x8_c(MpegEncContext *s, uint8_t *src1,
uint8_t *src2, int stride, int h)
{
- MpegEncContext *const s = (MpegEncContext *) c;
LOCAL_ALIGNED_16(int16_t, temp, [64]);
av_assert2(h == 8);
DST(7, (a4 >> 2) - a7); \
}
-static int dct264_sad8x8_c(/* MpegEncContext */ void *c, uint8_t *src1,
+static int dct264_sad8x8_c(MpegEncContext *s, uint8_t *src1,
uint8_t *src2, int stride, int h)
{
- MpegEncContext *const s = (MpegEncContext *) c;
int16_t dct[8][8];
int i, sum = 0;
}
#endif
-static int dct_max8x8_c(/* MpegEncContext */ void *c, uint8_t *src1,
+static int dct_max8x8_c(MpegEncContext *s, uint8_t *src1,
uint8_t *src2, int stride, int h)
{
- MpegEncContext *const s = (MpegEncContext *) c;
LOCAL_ALIGNED_16(int16_t, temp, [64]);
int sum = 0, i;
return sum;
}
-static int quant_psnr8x8_c(/* MpegEncContext */ void *c, uint8_t *src1,
+static int quant_psnr8x8_c(MpegEncContext *s, uint8_t *src1,
uint8_t *src2, int stride, int h)
{
- MpegEncContext *const s = c;
LOCAL_ALIGNED_16(int16_t, temp, [64 * 2]);
int16_t *const bak = temp + 64;
int sum = 0, i;
return sum;
}
-static int rd8x8_c(/* MpegEncContext */ void *c, uint8_t *src1, uint8_t *src2,
+static int rd8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2,
int stride, int h)
{
- MpegEncContext *const s = (MpegEncContext *) c;
const uint8_t *scantable = s->intra_scantable.permutated;
LOCAL_ALIGNED_16(int16_t, temp, [64]);
LOCAL_ALIGNED_16(uint8_t, lsrc1, [64]);
return distortion + ((bits * s->qscale * s->qscale * 109 + 64) >> 7);
}
-static int bit8x8_c(/* MpegEncContext */ void *c, uint8_t *src1, uint8_t *src2,
+static int bit8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2,
int stride, int h)
{
- MpegEncContext *const s = (MpegEncContext *) c;
const uint8_t *scantable = s->intra_scantable.permutated;
LOCAL_ALIGNED_16(int16_t, temp, [64]);
int i, last, run, bits, level, start_i;
}
#define VSAD_INTRA(size) \
-static int vsad_intra ## size ## _c(/* MpegEncContext */ void *c, \
+static int vsad_intra ## size ## _c(MpegEncContext *c, \
uint8_t *s, uint8_t *dummy, \
int stride, int h) \
{ \
VSAD_INTRA(8)
VSAD_INTRA(16)
-static int vsad16_c(/* MpegEncContext */ void *c, uint8_t *s1, uint8_t *s2,
+static int vsad16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2,
int stride, int h)
{
int score = 0, x, y;
#define SQ(a) ((a) * (a))
#define VSSE_INTRA(size) \
-static int vsse_intra ## size ## _c(/* MpegEncContext */ void *c, \
+static int vsse_intra ## size ## _c(MpegEncContext *c, \
uint8_t *s, uint8_t *dummy, \
int stride, int h) \
{ \
VSSE_INTRA(8)
VSSE_INTRA(16)
-static int vsse16_c(/* MpegEncContext */ void *c, uint8_t *s1, uint8_t *s2,
+static int vsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2,
int stride, int h)
{
int score = 0, x, y;
}
#define WRAPPER8_16_SQ(name8, name16) \
-static int name16(void /*MpegEncContext*/ *s, \
- uint8_t *dst, uint8_t *src, \
+static int name16(MpegEncContext *s, uint8_t *dst, uint8_t *src, \
int stride, int h) \
{ \
int score = 0; \
dest[0] = av_clip_uint8(dest[0] + ((block[0] + 4)>>3));
}
+/* draw the edges of width 'w' of an image of size width, height */
+// FIXME: Check that this is OK for MPEG-4 interlaced.
+static void draw_edges_8_c(uint8_t *buf, int wrap, int width, int height,
+ int w, int h, int sides)
+{
+ uint8_t *ptr = buf, *last_line;
+ int i;
+
+ /* left and right */
+ for (i = 0; i < height; i++) {
+ memset(ptr - w, ptr[0], w);
+ memset(ptr + width, ptr[width - 1], w);
+ ptr += wrap;
+ }
+
+ /* top and bottom + corners */
+ buf -= w;
+ last_line = buf + (height - 1) * wrap;
+ if (sides & EDGE_TOP)
+ for (i = 0; i < h; i++)
+ // top
+ memcpy(buf - (i + 1) * wrap, buf, width + w + w);
+ if (sides & EDGE_BOTTOM)
+ for (i = 0; i < h; i++)
+ // bottom
+ memcpy(last_line + (i + 1) * wrap, last_line, width + w + w);
+}
+
+static void clear_block_8_c(int16_t *block)
+{
+ memset(block, 0, sizeof(int16_t) * 64);
+}
+
+static void clear_blocks_8_c(int16_t *blocks)
+{
+ memset(blocks, 0, sizeof(int16_t) * 6 * 64);
+}
+
/* init static data */
av_cold void ff_dsputil_static_init(void)
{
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
{
+ const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8;
+
ff_check_alignment();
#if CONFIG_ENCODERS
c->pix_abs[1][2] = pix_abs8_y2_c;
c->pix_abs[1][3] = pix_abs8_xy2_c;
- c->put_tpel_pixels_tab[0] = put_tpel_pixels_mc00_c;
- c->put_tpel_pixels_tab[1] = put_tpel_pixels_mc10_c;
- c->put_tpel_pixels_tab[2] = put_tpel_pixels_mc20_c;
- c->put_tpel_pixels_tab[4] = put_tpel_pixels_mc01_c;
- c->put_tpel_pixels_tab[5] = put_tpel_pixels_mc11_c;
- c->put_tpel_pixels_tab[6] = put_tpel_pixels_mc21_c;
- c->put_tpel_pixels_tab[8] = put_tpel_pixels_mc02_c;
- c->put_tpel_pixels_tab[9] = put_tpel_pixels_mc12_c;
- c->put_tpel_pixels_tab[10] = put_tpel_pixels_mc22_c;
-
- c->avg_tpel_pixels_tab[0] = avg_tpel_pixels_mc00_c;
- c->avg_tpel_pixels_tab[1] = avg_tpel_pixels_mc10_c;
- c->avg_tpel_pixels_tab[2] = avg_tpel_pixels_mc20_c;
- c->avg_tpel_pixels_tab[4] = avg_tpel_pixels_mc01_c;
- c->avg_tpel_pixels_tab[5] = avg_tpel_pixels_mc11_c;
- c->avg_tpel_pixels_tab[6] = avg_tpel_pixels_mc21_c;
- c->avg_tpel_pixels_tab[8] = avg_tpel_pixels_mc02_c;
- c->avg_tpel_pixels_tab[9] = avg_tpel_pixels_mc12_c;
- c->avg_tpel_pixels_tab[10] = avg_tpel_pixels_mc22_c;
-
#define dspfunc(PFX, IDX, NUM) \
c->PFX ## _pixels_tab[IDX][0] = PFX ## NUM ## _mc00_c; \
c->PFX ## _pixels_tab[IDX][1] = PFX ## NUM ## _mc10_c; \
c->add_pixels8 = add_pixels8_c;
-#undef FUNC
-#undef FUNCC
-#define FUNC(f, depth) f ## _ ## depth
-#define FUNCC(f, depth) f ## _ ## depth ## _c
-
- c->draw_edges = FUNCC(draw_edges, 8);
-
- c->clear_block = FUNCC(clear_block, 8);
- c->clear_blocks = FUNCC(clear_blocks, 8);
+ c->draw_edges = draw_edges_8_c;
-#define BIT_DEPTH_FUNCS(depth) \
- c->get_pixels = FUNCC(get_pixels, depth);
+ c->clear_block = clear_block_8_c;
+ c->clear_blocks = clear_blocks_8_c;
switch (avctx->bits_per_raw_sample) {
case 9:
case 10:
case 12:
case 14:
- BIT_DEPTH_FUNCS(16);
+ c->get_pixels = get_pixels_16_c;
break;
default:
if (avctx->bits_per_raw_sample<=8 || avctx->codec_type != AVMEDIA_TYPE_VIDEO) {
- BIT_DEPTH_FUNCS(8);
+ c->get_pixels = get_pixels_8_c;
}
break;
}
if (ARCH_ALPHA)
ff_dsputil_init_alpha(c, avctx);
if (ARCH_ARM)
- ff_dsputil_init_arm(c, avctx);
+ ff_dsputil_init_arm(c, avctx, high_bit_depth);
if (ARCH_BFIN)
- ff_dsputil_init_bfin(c, avctx);
+ ff_dsputil_init_bfin(c, avctx, high_bit_depth);
if (ARCH_PPC)
- ff_dsputil_init_ppc(c, avctx);
+ ff_dsputil_init_ppc(c, avctx, high_bit_depth);
if (ARCH_X86)
- ff_dsputil_init_x86(c, avctx);
+ ff_dsputil_init_x86(c, avctx, high_bit_depth);
ff_init_scantable_permutation(c->idct_permutation,
c->idct_permutation_type);