dsputil: Move mspel_pixels_tab to the only place it is used

This commit is contained in:
Diego Biurrun 2013-12-27 10:29:14 +01:00
parent 3832a65901
commit 256da0770e
5 changed files with 135 additions and 119 deletions

View File

@ -1191,113 +1191,12 @@ void ff_avg_pixels16x16_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
#define put_no_rnd_qpel8_mc00_c ff_put_pixels8x8_c #define put_no_rnd_qpel8_mc00_c ff_put_pixels8x8_c
#define put_no_rnd_qpel16_mc00_c ff_put_pixels16x16_c #define put_no_rnd_qpel16_mc00_c ff_put_pixels16x16_c
static void wmv2_mspel8_h_lowpass(uint8_t *dst, uint8_t *src, void ff_put_pixels8_l2_8(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
int dstStride, int srcStride, int h) int dst_stride, int src_stride1, int src_stride2,
int h)
{ {
const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP; put_pixels8_l2_8(dst, src1, src2, dst_stride, src_stride1, src_stride2, h);
int i;
for (i = 0; i < h; i++) {
dst[0] = cm[(9 * (src[0] + src[1]) - (src[-1] + src[2]) + 8) >> 4];
dst[1] = cm[(9 * (src[1] + src[2]) - (src[0] + src[3]) + 8) >> 4];
dst[2] = cm[(9 * (src[2] + src[3]) - (src[1] + src[4]) + 8) >> 4];
dst[3] = cm[(9 * (src[3] + src[4]) - (src[2] + src[5]) + 8) >> 4];
dst[4] = cm[(9 * (src[4] + src[5]) - (src[3] + src[6]) + 8) >> 4];
dst[5] = cm[(9 * (src[5] + src[6]) - (src[4] + src[7]) + 8) >> 4];
dst[6] = cm[(9 * (src[6] + src[7]) - (src[5] + src[8]) + 8) >> 4];
dst[7] = cm[(9 * (src[7] + src[8]) - (src[6] + src[9]) + 8) >> 4];
dst += dstStride;
src += srcStride;
}
}
static void wmv2_mspel8_v_lowpass(uint8_t *dst, uint8_t *src,
int dstStride, int srcStride, int w)
{
const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;
int i;
for (i = 0; i < w; i++) {
const int src_1 = src[-srcStride];
const int src0 = src[0];
const int src1 = src[srcStride];
const int src2 = src[2 * srcStride];
const int src3 = src[3 * srcStride];
const int src4 = src[4 * srcStride];
const int src5 = src[5 * srcStride];
const int src6 = src[6 * srcStride];
const int src7 = src[7 * srcStride];
const int src8 = src[8 * srcStride];
const int src9 = src[9 * srcStride];
dst[0 * dstStride] = cm[(9 * (src0 + src1) - (src_1 + src2) + 8) >> 4];
dst[1 * dstStride] = cm[(9 * (src1 + src2) - (src0 + src3) + 8) >> 4];
dst[2 * dstStride] = cm[(9 * (src2 + src3) - (src1 + src4) + 8) >> 4];
dst[3 * dstStride] = cm[(9 * (src3 + src4) - (src2 + src5) + 8) >> 4];
dst[4 * dstStride] = cm[(9 * (src4 + src5) - (src3 + src6) + 8) >> 4];
dst[5 * dstStride] = cm[(9 * (src5 + src6) - (src4 + src7) + 8) >> 4];
dst[6 * dstStride] = cm[(9 * (src6 + src7) - (src5 + src8) + 8) >> 4];
dst[7 * dstStride] = cm[(9 * (src7 + src8) - (src6 + src9) + 8) >> 4];
src++;
dst++;
}
}
static void put_mspel8_mc10_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t half[64];
wmv2_mspel8_h_lowpass(half, src, 8, stride, 8);
put_pixels8_l2_8(dst, src, half, stride, stride, 8, 8);
}
static void put_mspel8_mc20_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
wmv2_mspel8_h_lowpass(dst, src, stride, stride, 8);
}
static void put_mspel8_mc30_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t half[64];
wmv2_mspel8_h_lowpass(half, src, 8, stride, 8);
put_pixels8_l2_8(dst, src + 1, half, stride, stride, 8, 8);
}
static void put_mspel8_mc02_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
wmv2_mspel8_v_lowpass(dst, src, stride, stride, 8);
}
static void put_mspel8_mc12_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t halfH[88];
uint8_t halfV[64];
uint8_t halfHV[64];
wmv2_mspel8_h_lowpass(halfH, src - stride, 8, stride, 11);
wmv2_mspel8_v_lowpass(halfV, src, 8, stride, 8);
wmv2_mspel8_v_lowpass(halfHV, halfH + 8, 8, 8, 8);
put_pixels8_l2_8(dst, halfV, halfHV, stride, 8, 8, 8);
}
static void put_mspel8_mc32_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t halfH[88];
uint8_t halfV[64];
uint8_t halfHV[64];
wmv2_mspel8_h_lowpass(halfH, src - stride, 8, stride, 11);
wmv2_mspel8_v_lowpass(halfV, src + 1, 8, stride, 8);
wmv2_mspel8_v_lowpass(halfHV, halfH + 8, 8, 8, 8);
put_pixels8_l2_8(dst, halfV, halfHV, stride, 8, 8, 8);
}
static void put_mspel8_mc22_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t halfH[88];
wmv2_mspel8_h_lowpass(halfH, src - stride, 8, stride, 11);
wmv2_mspel8_v_lowpass(dst, halfH + 8, stride, 8, 8);
} }
static inline int pix_abs16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, static inline int pix_abs16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
@ -2360,15 +2259,6 @@ av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
#undef dspfunc #undef dspfunc
c->put_mspel_pixels_tab[0] = ff_put_pixels8x8_c;
c->put_mspel_pixels_tab[1] = put_mspel8_mc10_c;
c->put_mspel_pixels_tab[2] = put_mspel8_mc20_c;
c->put_mspel_pixels_tab[3] = put_mspel8_mc30_c;
c->put_mspel_pixels_tab[4] = put_mspel8_mc02_c;
c->put_mspel_pixels_tab[5] = put_mspel8_mc12_c;
c->put_mspel_pixels_tab[6] = put_mspel8_mc22_c;
c->put_mspel_pixels_tab[7] = put_mspel8_mc32_c;
#define SET_CMP_FUNC(name) \ #define SET_CMP_FUNC(name) \
c->name[0] = name ## 16_c; \ c->name[0] = name ## 16_c; \
c->name[1] = name ## 8x8_c; c->name[1] = name ## 8x8_c;

View File

@ -39,6 +39,10 @@ void ff_avg_pixels8x8_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
void ff_put_pixels16x16_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride); void ff_put_pixels16x16_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
void ff_avg_pixels16x16_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride); void ff_avg_pixels16x16_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
void ff_put_pixels8_l2_8(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
int dst_stride, int src_stride1, int src_stride2,
int h);
void ff_gmc_c(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int oy, void ff_gmc_c(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int oy,
int dxx, int dxy, int dyx, int dyy, int shift, int r, int dxx, int dxy, int dyx, int dyy, int shift, int r,
int width, int height); int width, int height);
@ -174,7 +178,6 @@ typedef struct DSPContext {
qpel_mc_func put_qpel_pixels_tab[2][16]; qpel_mc_func put_qpel_pixels_tab[2][16];
qpel_mc_func avg_qpel_pixels_tab[2][16]; qpel_mc_func avg_qpel_pixels_tab[2][16];
qpel_mc_func put_no_rnd_qpel_pixels_tab[2][16]; qpel_mc_func put_no_rnd_qpel_pixels_tab[2][16];
qpel_mc_func put_mspel_pixels_tab[8];
me_cmp_func pix_abs[2][4]; me_cmp_func pix_abs[2][4];

View File

@ -129,10 +129,10 @@ void ff_mspel_motion(MpegEncContext *s,
emu=1; emu=1;
} }
s->dsp.put_mspel_pixels_tab[dxy](dest_y , ptr , linesize); w->wdsp.put_mspel_pixels_tab[dxy](dest_y, ptr, linesize);
s->dsp.put_mspel_pixels_tab[dxy](dest_y+8 , ptr+8 , linesize); w->wdsp.put_mspel_pixels_tab[dxy](dest_y + 8, ptr + 8, linesize);
s->dsp.put_mspel_pixels_tab[dxy](dest_y +8*linesize, ptr +8*linesize, linesize); w->wdsp.put_mspel_pixels_tab[dxy](dest_y + 8 * linesize, ptr + 8 * linesize, linesize);
s->dsp.put_mspel_pixels_tab[dxy](dest_y+8+8*linesize, ptr+8+8*linesize, linesize); w->wdsp.put_mspel_pixels_tab[dxy](dest_y + 8 + 8 * linesize, ptr + 8 + 8 * linesize, linesize);
if(s->flags&CODEC_FLAG_GRAY) return; if(s->flags&CODEC_FLAG_GRAY) return;

View File

@ -20,6 +20,7 @@
#include "libavutil/common.h" #include "libavutil/common.h"
#include "avcodec.h" #include "avcodec.h"
#include "dsputil.h" #include "dsputil.h"
#include "mathops.h"
#include "wmv2dsp.h" #include "wmv2dsp.h"
#define W0 2048 #define W0 2048
@ -138,9 +139,127 @@ static void wmv2_idct_put_c(uint8_t *dest, int line_size, int16_t *block)
} }
} }
static void wmv2_mspel8_h_lowpass(uint8_t *dst, uint8_t *src,
int dstStride, int srcStride, int h)
{
const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;
int i;
for (i = 0; i < h; i++) {
dst[0] = cm[(9 * (src[0] + src[1]) - (src[-1] + src[2]) + 8) >> 4];
dst[1] = cm[(9 * (src[1] + src[2]) - (src[0] + src[3]) + 8) >> 4];
dst[2] = cm[(9 * (src[2] + src[3]) - (src[1] + src[4]) + 8) >> 4];
dst[3] = cm[(9 * (src[3] + src[4]) - (src[2] + src[5]) + 8) >> 4];
dst[4] = cm[(9 * (src[4] + src[5]) - (src[3] + src[6]) + 8) >> 4];
dst[5] = cm[(9 * (src[5] + src[6]) - (src[4] + src[7]) + 8) >> 4];
dst[6] = cm[(9 * (src[6] + src[7]) - (src[5] + src[8]) + 8) >> 4];
dst[7] = cm[(9 * (src[7] + src[8]) - (src[6] + src[9]) + 8) >> 4];
dst += dstStride;
src += srcStride;
}
}
static void wmv2_mspel8_v_lowpass(uint8_t *dst, uint8_t *src,
int dstStride, int srcStride, int w)
{
const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;
int i;
for (i = 0; i < w; i++) {
const int src_1 = src[-srcStride];
const int src0 = src[0];
const int src1 = src[srcStride];
const int src2 = src[2 * srcStride];
const int src3 = src[3 * srcStride];
const int src4 = src[4 * srcStride];
const int src5 = src[5 * srcStride];
const int src6 = src[6 * srcStride];
const int src7 = src[7 * srcStride];
const int src8 = src[8 * srcStride];
const int src9 = src[9 * srcStride];
dst[0 * dstStride] = cm[(9 * (src0 + src1) - (src_1 + src2) + 8) >> 4];
dst[1 * dstStride] = cm[(9 * (src1 + src2) - (src0 + src3) + 8) >> 4];
dst[2 * dstStride] = cm[(9 * (src2 + src3) - (src1 + src4) + 8) >> 4];
dst[3 * dstStride] = cm[(9 * (src3 + src4) - (src2 + src5) + 8) >> 4];
dst[4 * dstStride] = cm[(9 * (src4 + src5) - (src3 + src6) + 8) >> 4];
dst[5 * dstStride] = cm[(9 * (src5 + src6) - (src4 + src7) + 8) >> 4];
dst[6 * dstStride] = cm[(9 * (src6 + src7) - (src5 + src8) + 8) >> 4];
dst[7 * dstStride] = cm[(9 * (src7 + src8) - (src6 + src9) + 8) >> 4];
src++;
dst++;
}
}
static void put_mspel8_mc10_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t half[64];
wmv2_mspel8_h_lowpass(half, src, 8, stride, 8);
ff_put_pixels8_l2_8(dst, src, half, stride, stride, 8, 8);
}
static void put_mspel8_mc20_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
wmv2_mspel8_h_lowpass(dst, src, stride, stride, 8);
}
static void put_mspel8_mc30_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t half[64];
wmv2_mspel8_h_lowpass(half, src, 8, stride, 8);
ff_put_pixels8_l2_8(dst, src + 1, half, stride, stride, 8, 8);
}
static void put_mspel8_mc02_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
wmv2_mspel8_v_lowpass(dst, src, stride, stride, 8);
}
static void put_mspel8_mc12_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t halfH[88];
uint8_t halfV[64];
uint8_t halfHV[64];
wmv2_mspel8_h_lowpass(halfH, src - stride, 8, stride, 11);
wmv2_mspel8_v_lowpass(halfV, src, 8, stride, 8);
wmv2_mspel8_v_lowpass(halfHV, halfH + 8, 8, 8, 8);
ff_put_pixels8_l2_8(dst, halfV, halfHV, stride, 8, 8, 8);
}
static void put_mspel8_mc32_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t halfH[88];
uint8_t halfV[64];
uint8_t halfHV[64];
wmv2_mspel8_h_lowpass(halfH, src - stride, 8, stride, 11);
wmv2_mspel8_v_lowpass(halfV, src + 1, 8, stride, 8);
wmv2_mspel8_v_lowpass(halfHV, halfH + 8, 8, 8, 8);
ff_put_pixels8_l2_8(dst, halfV, halfHV, stride, 8, 8, 8);
}
static void put_mspel8_mc22_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
{
uint8_t halfH[88];
wmv2_mspel8_h_lowpass(halfH, src - stride, 8, stride, 11);
wmv2_mspel8_v_lowpass(dst, halfH + 8, stride, 8, 8);
}
av_cold void ff_wmv2dsp_init(WMV2DSPContext *c) av_cold void ff_wmv2dsp_init(WMV2DSPContext *c)
{ {
c->idct_add = wmv2_idct_add_c; c->idct_add = wmv2_idct_add_c;
c->idct_put = wmv2_idct_put_c; c->idct_put = wmv2_idct_put_c;
c->idct_perm = FF_NO_IDCT_PERM; c->idct_perm = FF_NO_IDCT_PERM;
c->put_mspel_pixels_tab[0] = ff_put_pixels8x8_c;
c->put_mspel_pixels_tab[1] = put_mspel8_mc10_c;
c->put_mspel_pixels_tab[2] = put_mspel8_mc20_c;
c->put_mspel_pixels_tab[3] = put_mspel8_mc30_c;
c->put_mspel_pixels_tab[4] = put_mspel8_mc02_c;
c->put_mspel_pixels_tab[5] = put_mspel8_mc12_c;
c->put_mspel_pixels_tab[6] = put_mspel8_mc22_c;
c->put_mspel_pixels_tab[7] = put_mspel8_mc32_c;
} }

View File

@ -21,10 +21,14 @@
#include <stdint.h> #include <stdint.h>
#include "dsputil.h"
typedef struct WMV2DSPContext { typedef struct WMV2DSPContext {
void (*idct_add)(uint8_t *dest, int line_size, int16_t *block); void (*idct_add)(uint8_t *dest, int line_size, int16_t *block);
void (*idct_put)(uint8_t *dest, int line_size, int16_t *block); void (*idct_put)(uint8_t *dest, int line_size, int16_t *block);
qpel_mc_func put_mspel_pixels_tab[8];
int idct_perm; int idct_perm;
} WMV2DSPContext; } WMV2DSPContext;