History

dsputil: move VC1-specific stuff into VC1DSPContext. (cherry picked from commit 12802ec0601c3bd7b9c7a2503518e28fd5e7d744)

Ronald S. Bultje committed 15 years ago

Commit 9a1ced31 parent 6c0d93613 files · +272 −221Browse files

Unified · Split

13 files
  1. libavcodec/dsputil.c +0 −53
  2. libavcodec/dsputil.h +0 −27
  3. libavcodec/ppc/dsputil_altivec.h +0 −1
  4. libavcodec/ppc/dsputil_ppc.c +0 −2
  5. libavcodec/ppc/vc1dsp_altivec.c +5 −1
  6. libavcodec/vc1.c +8 −8
  7. libavcodec/vc1.h +2 −0
  8. libavcodec/vc1dec.c +88 −86
  9. libavcodec/vc1dsp.c +59 −2
  10. libavcodec/vc1dsp.h +67 −0
  11. libavcodec/x86/dsputil_mmx.c +0 −20
  12. libavcodec/x86/dsputil_mmx.h +0 −1
  13. libavcodec/x86/vc1dsp_mmx.c +43 −20
libavcodec/dsputil.c+0−53
@@ -1600,54 +1600,6 @@ H264_CHROMA_MC(avg_ , op_avg) · 1599 unmodified lines
16001600 #undef op_avg
16011601 #undef op_put
16021602
1603−static void put_no_rnd_vc1_chroma_mc8_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
1604− const int A=(8-x)*(8-y);
1605− const int B=( x)*(8-y);
1606− const int C=(8-x)*( y);
1607− const int D=( x)*( y);
1608− int i;
1609−
1610− assert(x<8 && y<8 && x>=0 && y>=0);
1611−
1612− for(i=0; i<h; i++)
1613− {
1614− dst[0] = (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + 32 - 4) >> 6;
1615− dst[1] = (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + 32 - 4) >> 6;
1616− dst[2] = (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + 32 - 4) >> 6;
1617− dst[3] = (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + 32 - 4) >> 6;
1618− dst[4] = (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5] + 32 - 4) >> 6;
1619− dst[5] = (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6] + 32 - 4) >> 6;
1620− dst[6] = (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7] + 32 - 4) >> 6;
1621− dst[7] = (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8] + 32 - 4) >> 6;
1622− dst+= stride;
1623− src+= stride;
1624− }
1625−}
1626−
1627−static void avg_no_rnd_vc1_chroma_mc8_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
1628− const int A=(8-x)*(8-y);
1629− const int B=( x)*(8-y);
1630− const int C=(8-x)*( y);
1631− const int D=( x)*( y);
1632− int i;
1633−
1634− assert(x<8 && y<8 && x>=0 && y>=0);
1635−
1636− for(i=0; i<h; i++)
1637− {
1638− dst[0] = avg2(dst[0], ((A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + 32 - 4) >> 6));
1639− dst[1] = avg2(dst[1], ((A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + 32 - 4) >> 6));
1640− dst[2] = avg2(dst[2], ((A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + 32 - 4) >> 6));
1641− dst[3] = avg2(dst[3], ((A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + 32 - 4) >> 6));
1642− dst[4] = avg2(dst[4], ((A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5] + 32 - 4) >> 6));
1643− dst[5] = avg2(dst[5], ((A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6] + 32 - 4) >> 6));
1644− dst[6] = avg2(dst[6], ((A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7] + 32 - 4) >> 6));
1645− dst[7] = avg2(dst[7], ((A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8] + 32 - 4) >> 6));
1646− dst+= stride;
1647− src+= stride;
1648− }
1649−}
1650−
16511603 #define QPEL_MC(r, OPNAME, RND, OP) \
16521604 static void OPNAME ## mpeg4_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\
16531605 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
@@ -4301,17 +4253,12 @@ av_cold void dsputil_init(DSPContext* c, AVCodecContext *avctx) · 2647 unmodified lines
43014253 c->avg_h264_chroma_pixels_tab[0]= avg_h264_chroma_mc8_c;
43024254 c->avg_h264_chroma_pixels_tab[1]= avg_h264_chroma_mc4_c;
43034255 c->avg_h264_chroma_pixels_tab[2]= avg_h264_chroma_mc2_c;
4304− c->put_no_rnd_vc1_chroma_pixels_tab[0]= put_no_rnd_vc1_chroma_mc8_c;
4305− c->avg_no_rnd_vc1_chroma_pixels_tab[0]= avg_no_rnd_vc1_chroma_mc8_c;
43064256
43074257 c->draw_edges = draw_edges_c;
43084258
43094259 #if CONFIG_MLP_DECODER || CONFIG_TRUEHD_DECODER
43104260 ff_mlp_init(c, avctx);
43114261 #endif
4312−#if CONFIG_VC1_DECODER
4313− ff_vc1dsp_init(c,avctx);
4314−#endif
43154262 #if CONFIG_WMV2_DECODER || CONFIG_VC1_DECODER
43164263 ff_intrax8dsp_init(c,avctx);
43174264 #endif
libavcodec/dsputil.h+0−27
@@ -341,9 +341,6 @@ typedef struct DSPContext { · 340 unmodified lines
341341 */
342342 h264_chroma_mc_func put_h264_chroma_pixels_tab[3];
343343 h264_chroma_mc_func avg_h264_chroma_pixels_tab[3];
344− /* This is really one func used in VC-1 decoding */
345− h264_chroma_mc_func put_no_rnd_vc1_chroma_pixels_tab[3];
346− h264_chroma_mc_func avg_no_rnd_vc1_chroma_pixels_tab[3];
347344
348345 qpel_mc_func put_h264_qpel_pixels_tab[4][16];
349346 qpel_mc_func avg_h264_qpel_pixels_tab[4][16];
@@ -503,29 +500,6 @@ typedef struct DSPContext { · 153 unmodified lines
503500 unsigned int filter_shift, int32_t mask, int blocksize,
504501 int32_t *sample_buffer);
505502
506− /* vc1 functions */
507− void (*vc1_inv_trans_8x8)(DCTELEM *b);
508− void (*vc1_inv_trans_8x4)(uint8_t *dest, int line_size, DCTELEM *block);
509− void (*vc1_inv_trans_4x8)(uint8_t *dest, int line_size, DCTELEM *block);
510− void (*vc1_inv_trans_4x4)(uint8_t *dest, int line_size, DCTELEM *block);
511− void (*vc1_inv_trans_8x8_dc)(uint8_t *dest, int line_size, DCTELEM *block);
512− void (*vc1_inv_trans_8x4_dc)(uint8_t *dest, int line_size, DCTELEM *block);
513− void (*vc1_inv_trans_4x8_dc)(uint8_t *dest, int line_size, DCTELEM *block);
514− void (*vc1_inv_trans_4x4_dc)(uint8_t *dest, int line_size, DCTELEM *block);
515− void (*vc1_v_overlap)(uint8_t* src, int stride);
516− void (*vc1_h_overlap)(uint8_t* src, int stride);
517− void (*vc1_v_loop_filter4)(uint8_t *src, int stride, int pq);
518− void (*vc1_h_loop_filter4)(uint8_t *src, int stride, int pq);
519− void (*vc1_v_loop_filter8)(uint8_t *src, int stride, int pq);
520− void (*vc1_h_loop_filter8)(uint8_t *src, int stride, int pq);
521− void (*vc1_v_loop_filter16)(uint8_t *src, int stride, int pq);
522− void (*vc1_h_loop_filter16)(uint8_t *src, int stride, int pq);
523− /* put 8x8 block with bicubic interpolation and quarterpel precision
524− * last argument is actually round value instead of height
525− */
526− op_pixels_func put_vc1_mspel_pixels_tab[16];
527− op_pixels_func avg_vc1_mspel_pixels_tab[16];
528−
529503 /* intrax8 functions */
530504 void (*x8_spatial_compensation[12])(uint8_t *src , uint8_t *dst, int linesize);
531505 void (*x8_setup_spatial_compensation)(uint8_t *src, uint8_t *dst, int linesize,
@@ -629,7 +603,6 @@ void dsputil_init_vis(DSPContext* c, AVCodecContext *avctx); · 97 unmodified lines
629603 void ff_dsputil_init_dwt(DSPContext *c);
630604 void ff_rv30dsp_init(DSPContext* c, AVCodecContext *avctx);
631605 void ff_rv40dsp_init(DSPContext* c, AVCodecContext *avctx);
632−void ff_vc1dsp_init(DSPContext* c, AVCodecContext *avctx);
633606 void ff_intrax8dsp_init(DSPContext* c, AVCodecContext *avctx);
634607 void ff_mlp_init(DSPContext* c, AVCodecContext *avctx);
635608 void ff_mlp_init_x86(DSPContext* c, AVCodecContext *avctx);
libavcodec/ppc/dsputil_altivec.h+0−1
@@ -43,7 +43,6 @@ void ff_vp3_idct_add_altivec(uint8_t *dest, int line_size, DCTELEM *block); · 42 unmodified lines
4343 void dsputil_h264_init_ppc(DSPContext* c, AVCodecContext *avctx);
4444
4545 void dsputil_init_altivec(DSPContext* c, AVCodecContext *avctx);
46−void vc1dsp_init_altivec(DSPContext* c, AVCodecContext *avctx);
4746 void float_init_altivec(DSPContext* c, AVCodecContext *avctx);
4847 void int_init_altivec(DSPContext* c, AVCodecContext *avctx);
4948
libavcodec/ppc/dsputil_ppc.c+0−2
@@ -171,8 +171,6 @@ void dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx) · 170 unmodified lines
171171
172172 if (av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC) {
173173 dsputil_init_altivec(c, avctx);
174− if(CONFIG_VC1_DECODER)
175− vc1dsp_init_altivec(c, avctx);
176174 float_init_altivec(c, avctx);
177175 int_init_altivec(c, avctx);
178176 c->gmc1 = gmc1_altivec;
libavcodec/ppc/vc1dsp_altivec.c+5−1
@@ -322,7 +322,11 @@ static void vc1_inv_trans_8x4_altivec(uint8_t *dest, int stride, DCTELEM *block) · 321 unmodified lines
322322 }
323323
324324
325−void vc1dsp_init_altivec(DSPContext* dsp, AVCodecContext *avctx) {
325+void ff_vc1dsp_init_altivec(VC1DSPContext* dsp)
326+{
327+ if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
328+ return;
329+
326330 dsp->vc1_inv_trans_8x8 = vc1_inv_trans_8x8_altivec;
327331 dsp->vc1_inv_trans_8x4 = vc1_inv_trans_8x4_altivec;
328332 }
libavcodec/vc1.c+8−8
@@ -337,14 +337,14 @@ int vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitConte · 336 unmodified lines
337337 v->res_fasttx = get_bits1(gb);
338338 if (!v->res_fasttx)
339339 {
340− v->s.dsp.vc1_inv_trans_8x8 = ff_simple_idct;
341− v->s.dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
342− v->s.dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
343− v->s.dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
344− v->s.dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add;
345− v->s.dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
346− v->s.dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
347− v->s.dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
340+ v->vc1dsp.vc1_inv_trans_8x8 = ff_simple_idct;
341+ v->vc1dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
342+ v->vc1dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
343+ v->vc1dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
344+ v->vc1dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add;
345+ v->vc1dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
346+ v->vc1dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
347+ v->vc1dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
348348 }
349349
350350 v->fastuvmc = get_bits1(gb); //common
libavcodec/vc1.h+2−0
@@ -26,6 +26,7 @@ · 25 unmodified lines
2626 #include "avcodec.h"
2727 #include "mpegvideo.h"
2828 #include "intrax8.h"
29+#include "vc1dsp.h"
2930
3031 /** Markers used in VC-1 AP frame data */
3132 //@{
@@ -155,6 +156,7 @@ enum COTypes { · 123 unmodified lines
155156 typedef struct VC1Context{
156157 MpegEncContext s;
157158 IntraX8Context x8;
159+ VC1DSPContext vc1dsp;
158160
159161 int bits;
160162
libavcodec/vc1dec.c+88−86
@@ -160,29 +160,30 @@ enum Imode { · 159 unmodified lines
160160
161161 /** @} */ //Bitplane group
162162
163−static void vc1_loop_filter_iblk(MpegEncContext *s, int pq)
163+static void vc1_loop_filter_iblk(VC1Context *v, int pq)
164164 {
165+ MpegEncContext *s = &v->s;
165166 int j;
166167 if (!s->first_slice_line) {
167− s->dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
168+ v->vc1dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
168169 if (s->mb_x)
169− s->dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize, s->linesize, pq);
170− s->dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize+8, s->linesize, pq);
170+ v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize, s->linesize, pq);
171+ v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize+8, s->linesize, pq);
171172 for(j = 0; j < 2; j++){
172− s->dsp.vc1_v_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
173+ v->vc1dsp.vc1_v_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
173174 if (s->mb_x)
174− s->dsp.vc1_h_loop_filter8(s->dest[j+1]-8*s->uvlinesize, s->uvlinesize, pq);
175+ v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1]-8*s->uvlinesize, s->uvlinesize, pq);
175176 }
176177 }
177− s->dsp.vc1_v_loop_filter16(s->dest[0] + 8*s->linesize, s->linesize, pq);
178+ v->vc1dsp.vc1_v_loop_filter16(s->dest[0] + 8*s->linesize, s->linesize, pq);
178179
179180 if (s->mb_y == s->mb_height-1) {
180181 if (s->mb_x) {
181− s->dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
182− s->dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
183− s->dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
182+ v->vc1dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
183+ v->vc1dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
184+ v->vc1dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
184185 }
185− s->dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
186+ v->vc1dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
186187 }
187188 }
188189
@@ -342,11 +343,11 @@ static void vc1_mc_1mv(VC1Context *v, int dir) · 153 unmodified lines
342343
343344 if(s->mspel) {
344345 dxy = ((my & 3) << 2) | (mx & 3);
345− dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
346− dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
346+ v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
347+ v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
347348 srcY += s->linesize * 8;
348− dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
349− dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
349+ v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
350+ v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
350351 } else { // hpel mc - always used for luma
351352 dxy = (my & 2) | ((mx & 2) >> 1);
352353
@@ -364,8 +365,8 @@ static void vc1_mc_1mv(VC1Context *v, int dir) · 11 unmodified lines
364365 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
365366 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
366367 }else{
367− dsp->put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
368− dsp->put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
368+ v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
369+ v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
369370 }
370371 }
371372
@@ -433,7 +434,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n) · 61 unmodified lines
433434
434435 if(s->mspel) {
435436 dxy = ((my & 3) << 2) | (mx & 3);
436− dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd);
437+ v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd);
437438 } else { // hpel mc - always used for luma
438439 dxy = (my & 2) | ((mx & 2) >> 1);
439440 if(!v->rnd)
@@ -583,8 +584,8 @@ static void vc1_mc_4mv_chroma(VC1Context *v) · 143 unmodified lines
583584 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
584585 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
585586 }else{
586− dsp->put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
587− dsp->put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
587+ v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
588+ v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
588589 }
589590 }
590591
@@ -906,11 +907,11 @@ static void vc1_interp_mc(VC1Context *v) · 315 unmodified lines
906907
907908 if(s->mspel) {
908909 dxy = ((my & 3) << 2) | (mx & 3);
909− dsp->avg_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
910− dsp->avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
910+ v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
911+ v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
911912 srcY += s->linesize * 8;
912− dsp->avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
913− dsp->avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
913+ v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
914+ v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
914915 } else { // hpel mc
915916 dxy = (my & 2) | ((mx & 2) >> 1);
916917
@@ -928,8 +929,8 @@ static void vc1_interp_mc(VC1Context *v) · 11 unmodified lines
928929 dsp->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
929930 dsp->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
930931 }else{
931− dsp->avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
932− dsp->avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
932+ v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
933+ v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
933934 }
934935 }
935936
@@ -2039,15 +2040,15 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan · 1103 unmodified lines
20392040 }
20402041 if(!skip_block){
20412042 if(i==1)
2042− s->dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
2043+ v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
20432044 else{
2044− s->dsp.vc1_inv_trans_8x8(block);
2045+ v->vc1dsp.vc1_inv_trans_8x8(block);
20452046 s->dsp.add_pixels_clamped(block, dst, linesize);
20462047 }
20472048 if(apply_filter && cbp_top & 0xC)
2048− s->dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
2049+ v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
20492050 if(apply_filter && cbp_left & 0xA)
2050− s->dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
2051+ v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
20512052 }
20522053 break;
20532054 case TT_4X4:
@@ -2068,13 +2069,13 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan · 14 unmodified lines
20682069 }
20692070 if(!(subblkpat & (1 << (3 - j))) && !skip_block){
20702071 if(i==1)
2071− s->dsp.vc1_inv_trans_4x4_dc(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
2072+ v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
20722073 else
2073− s->dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
2074+ v->vc1dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
20742075 if(apply_filter && (j&2 ? pat & (1<<(j-2)) : (cbp_top & (1 << (j + 2)))))
2075− s->dsp.vc1_v_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, v->pq);
2076+ v->vc1dsp.vc1_v_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, v->pq);
20762077 if(apply_filter && (j&1 ? pat & (1<<(j-1)) : (cbp_left & (1 << (j + 1)))))
2077− s->dsp.vc1_h_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, v->pq);
2078+ v->vc1dsp.vc1_h_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, v->pq);
20782079 }
20792080 }
20802081 break;
@@ -2096,13 +2097,13 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan · 15 unmodified lines
20962097 }
20972098 if(!(subblkpat & (1 << (1 - j))) && !skip_block){
20982099 if(i==1)
2099− s->dsp.vc1_inv_trans_8x4_dc(dst + j*4*linesize, linesize, block + off);
2100+ v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j*4*linesize, linesize, block + off);
21002101 else
2101− s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off);
2102+ v->vc1dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off);
21022103 if(apply_filter && j ? pat & 0x3 : (cbp_top & 0xC))
2103− s->dsp.vc1_v_loop_filter8(dst + j*4*linesize, linesize, v->pq);
2104+ v->vc1dsp.vc1_v_loop_filter8(dst + j*4*linesize, linesize, v->pq);
21042105 if(apply_filter && cbp_left & (2 << j))
2105− s->dsp.vc1_h_loop_filter4(dst + j*4*linesize, linesize, v->pq);
2106+ v->vc1dsp.vc1_h_loop_filter4(dst + j*4*linesize, linesize, v->pq);
21062107 }
21072108 }
21082109 break;
@@ -2124,13 +2125,13 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan · 15 unmodified lines
21242125 }
21252126 if(!(subblkpat & (1 << (1 - j))) && !skip_block){
21262127 if(i==1)
2127− s->dsp.vc1_inv_trans_4x8_dc(dst + j*4, linesize, block + off);
2128+ v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j*4, linesize, block + off);
21282129 else
2129− s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
2130+ v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
21302131 if(apply_filter && cbp_top & (2 << j))
2131− s->dsp.vc1_v_loop_filter4(dst + j*4, linesize, v->pq);
2132+ v->vc1dsp.vc1_v_loop_filter4(dst + j*4, linesize, v->pq);
21322133 if(apply_filter && j ? pat & 0x5 : (cbp_left & 0xA))
2133− s->dsp.vc1_h_loop_filter8(dst + j*4, linesize, v->pq);
2134+ v->vc1dsp.vc1_h_loop_filter8(dst + j*4, linesize, v->pq);
21342135 }
21352136 }
21362137 break;
@@ -2232,14 +2233,14 @@ static int vc1_decode_p_mb(VC1Context *v) · 95 unmodified lines
22322233
22332234 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
22342235 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
2235− s->dsp.vc1_inv_trans_8x8(s->block[i]);
2236+ v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
22362237 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
22372238 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
22382239 if(v->pq >= 9 && v->overlap) {
22392240 if(v->c_avail)
2240− s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
2241+ v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
22412242 if(v->a_avail)
2242− s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
2243+ v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
22432244 }
22442245 if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
22452246 int left_cbp, top_cbp;
@@ -2251,9 +2252,9 @@ static int vc1_decode_p_mb(VC1Context *v) · 5 unmodified lines
22512252 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
22522253 }
22532254 if(left_cbp & 0xC)
2254− s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
2255+ v->vc1dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
22552256 if(top_cbp & 0xA)
2256− s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
2257+ v->vc1dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
22572258 }
22582259 block_cbp |= 0xF << (i << 2);
22592260 } else if(val) {
@@ -2268,9 +2269,9 @@ static int vc1_decode_p_mb(VC1Context *v) · 8 unmodified lines
22682269 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
22692270 }
22702271 if(left_cbp & 0xC)
2271− s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
2272+ v->vc1dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
22722273 if(top_cbp & 0xA)
2273− s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
2274+ v->vc1dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
22742275 }
22752276 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp);
22762277 block_cbp |= pat << (i << 2);
@@ -2363,14 +2364,14 @@ static int vc1_decode_p_mb(VC1Context *v) · 86 unmodified lines
23632364
23642365 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset);
23652366 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
2366− s->dsp.vc1_inv_trans_8x8(s->block[i]);
2367+ v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
23672368 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
23682369 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
23692370 if(v->pq >= 9 && v->overlap) {
23702371 if(v->c_avail)
2371− s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
2372+ v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
23722373 if(v->a_avail)
2373− s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
2374+ v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
23742375 }
23752376 if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
23762377 int left_cbp, top_cbp;
@@ -2382,9 +2383,9 @@ static int vc1_decode_p_mb(VC1Context *v) · 5 unmodified lines
23822383 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
23832384 }
23842385 if(left_cbp & 0xC)
2385− s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
2386+ v->vc1dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
23862387 if(top_cbp & 0xA)
2387− s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
2388+ v->vc1dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
23882389 }
23892390 block_cbp |= 0xF << (i << 2);
23902391 } else if(is_coded[i]) {
@@ -2399,9 +2400,9 @@ static int vc1_decode_p_mb(VC1Context *v) · 8 unmodified lines
23992400 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
24002401 }
24012402 if(left_cbp & 0xC)
2402− s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
2403+ v->vc1dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
24032404 if(top_cbp & 0xA)
2404− s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
2405+ v->vc1dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
24052406 }
24062407 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp);
24072408 block_cbp |= pat << (i << 2);
@@ -2568,7 +2569,7 @@ static void vc1_decode_b_mb(VC1Context *v) · 160 unmodified lines
25682569
25692570 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
25702571 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
2571− s->dsp.vc1_inv_trans_8x8(s->block[i]);
2572+ v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
25722573 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
25732574 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
25742575 } else if(val) {
@@ -2650,7 +2651,7 @@ static void vc1_decode_i_blocks(VC1Context *v) · 75 unmodified lines
26502651
26512652 vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2);
26522653
2653− s->dsp.vc1_inv_trans_8x8(s->block[k]);
2654+ v->vc1dsp.vc1_inv_trans_8x8(s->block[k]);
26542655 if(v->pq >= 9 && v->overlap) {
26552656 for(j = 0; j < 64; j++) s->block[k][j] += 128;
26562657 }
@@ -2659,27 +2660,27 @@ static void vc1_decode_i_blocks(VC1Context *v) · 2 unmodified lines
26592660 vc1_put_block(v, s->block);
26602661 if(v->pq >= 9 && v->overlap) {
26612662 if(s->mb_x) {
2662− s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
2663− s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
2663+ v->vc1dsp.vc1_h_overlap(s->dest[0], s->linesize);
2664+ v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
26642665 if(!(s->flags & CODEC_FLAG_GRAY)) {
2665− s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
2666− s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
2666+ v->vc1dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
2667+ v->vc1dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
26672668 }
26682669 }
2669− s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
2670− s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
2670+ v->vc1dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
2671+ v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
26712672 if(!s->first_slice_line) {
2672− s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
2673− s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
2673+ v->vc1dsp.vc1_v_overlap(s->dest[0], s->linesize);
2674+ v->vc1dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
26742675 if(!(s->flags & CODEC_FLAG_GRAY)) {
2675− s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
2676− s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
2676+ v->vc1dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
2677+ v->vc1dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
26772678 }
26782679 }
2679− s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
2680− s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
2680+ v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
2681+ v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
26812682 }
2682− if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
2683+ if(v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
26832684
26842685 if(get_bits_count(&s->gb) > v->bits) {
26852686 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
@@ -2790,34 +2791,34 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) · 104 unmodified lines
27902791
27912792 vc1_decode_i_block_adv(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2, mquant);
27922793
2793− s->dsp.vc1_inv_trans_8x8(s->block[k]);
2794+ v->vc1dsp.vc1_inv_trans_8x8(s->block[k]);
27942795 for(j = 0; j < 64; j++) s->block[k][j] += 128;
27952796 }
27962797
27972798 vc1_put_block(v, s->block);
27982799 if(overlap) {
27992800 if(s->mb_x) {
2800− s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
2801− s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
2801+ v->vc1dsp.vc1_h_overlap(s->dest[0], s->linesize);
2802+ v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
28022803 if(!(s->flags & CODEC_FLAG_GRAY)) {
2803− s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
2804− s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
2804+ v->vc1dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
2805+ v->vc1dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
28052806 }
28062807 }
2807− s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
2808− s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
2808+ v->vc1dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
2809+ v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
28092810 if(!s->first_slice_line) {
2810− s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
2811− s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
2811+ v->vc1dsp.vc1_v_overlap(s->dest[0], s->linesize);
2812+ v->vc1dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
28122813 if(!(s->flags & CODEC_FLAG_GRAY)) {
2813− s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
2814− s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
2814+ v->vc1dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
2815+ v->vc1dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
28152816 }
28162817 }
2817− s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
2818− s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
2818+ v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
2819+ v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
28192820 }
2820− if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
2821+ if(v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
28212822
28222823 if(get_bits_count(&s->gb) > v->bits) {
28232824 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
@@ -2929,7 +2930,7 @@ static void vc1_decode_b_blocks(VC1Context *v) · 105 unmodified lines
29292930 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
29302931 return;
29312932 }
2932− if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
2933+ if(v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
29332934 }
29342935 if (!v->s.loop_filter)
29352936 ff_draw_horiz_band(s, s->mb_y * 16, 16);
@@ -3023,6 +3024,7 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx) · 87 unmodified lines
30233024 if(ff_msmpeg4_decode_init(avctx) < 0)
30243025 return -1;
30253026 if (vc1_init_common(v) < 0) return -1;
3027+ ff_vc1dsp_init(&v->vc1dsp);
30263028 for (i = 0; i < 64; i++) {
30273029 #define transpose(x) ((x>>3) | ((x&7)<<3))
30283030 v->zz_8x8[0][i] = transpose(wmv1_scantable[0][i]);
libavcodec/vc1dsp.c+59−2
@@ -25,7 +25,7 @@ · 24 unmodified lines
2525 *
2626 */
2727
28−#include "dsputil.h"
28+#include "vc1dsp.h"
2929
3030
3131 /** Apply overlap transform to horizontal edge
@@ -612,7 +612,56 @@ PUT_VC1_MSPEL(1, 3) · 580 unmodified lines
612612 PUT_VC1_MSPEL(2, 3)
613613 PUT_VC1_MSPEL(3, 3)
614614
615−av_cold void ff_vc1dsp_init(DSPContext* dsp, AVCodecContext *avctx) {
615+static void put_no_rnd_vc1_chroma_mc8_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
616+ const int A=(8-x)*(8-y);
617+ const int B=( x)*(8-y);
618+ const int C=(8-x)*( y);
619+ const int D=( x)*( y);
620+ int i;
621+
622+ assert(x<8 && y<8 && x>=0 && y>=0);
623+
624+ for(i=0; i<h; i++)
625+ {
626+ dst[0] = (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + 32 - 4) >> 6;
627+ dst[1] = (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + 32 - 4) >> 6;
628+ dst[2] = (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + 32 - 4) >> 6;
629+ dst[3] = (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + 32 - 4) >> 6;
630+ dst[4] = (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5] + 32 - 4) >> 6;
631+ dst[5] = (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6] + 32 - 4) >> 6;
632+ dst[6] = (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7] + 32 - 4) >> 6;
633+ dst[7] = (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8] + 32 - 4) >> 6;
634+ dst+= stride;
635+ src+= stride;
636+ }
637+}
638+
639+#define avg2(a,b) ((a+b+1)>>1)
640+static void avg_no_rnd_vc1_chroma_mc8_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){
641+ const int A=(8-x)*(8-y);
642+ const int B=( x)*(8-y);
643+ const int C=(8-x)*( y);
644+ const int D=( x)*( y);
645+ int i;
646+
647+ assert(x<8 && y<8 && x>=0 && y>=0);
648+
649+ for(i=0; i<h; i++)
650+ {
651+ dst[0] = avg2(dst[0], ((A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + 32 - 4) >> 6));
652+ dst[1] = avg2(dst[1], ((A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + 32 - 4) >> 6));
653+ dst[2] = avg2(dst[2], ((A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + 32 - 4) >> 6));
654+ dst[3] = avg2(dst[3], ((A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + 32 - 4) >> 6));
655+ dst[4] = avg2(dst[4], ((A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5] + 32 - 4) >> 6));
656+ dst[5] = avg2(dst[5], ((A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6] + 32 - 4) >> 6));
657+ dst[6] = avg2(dst[6], ((A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7] + 32 - 4) >> 6));
658+ dst[7] = avg2(dst[7], ((A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8] + 32 - 4) >> 6));
659+ dst+= stride;
660+ src+= stride;
661+ }
662+}
663+
664+av_cold void ff_vc1dsp_init(VC1DSPContext* dsp) {
616665 dsp->vc1_inv_trans_8x8 = vc1_inv_trans_8x8_c;
617666 dsp->vc1_inv_trans_4x8 = vc1_inv_trans_4x8_c;
618667 dsp->vc1_inv_trans_8x4 = vc1_inv_trans_8x4_c;
@@ -663,4 +712,12 @@ av_cold void ff_vc1dsp_init(DSPContext* dsp, AVCodecContext *avctx) { · 44 unmodified lines
663712 dsp->avg_vc1_mspel_pixels_tab[13] = avg_vc1_mspel_mc13_c;
664713 dsp->avg_vc1_mspel_pixels_tab[14] = avg_vc1_mspel_mc23_c;
665714 dsp->avg_vc1_mspel_pixels_tab[15] = avg_vc1_mspel_mc33_c;
715+
716+ dsp->put_no_rnd_vc1_chroma_pixels_tab[0]= put_no_rnd_vc1_chroma_mc8_c;
717+ dsp->avg_no_rnd_vc1_chroma_pixels_tab[0]= avg_no_rnd_vc1_chroma_mc8_c;
718+
719+ if (HAVE_ALTIVEC)
720+ ff_vc1dsp_init_altivec(dsp);
721+ if (HAVE_MMX)
722+ ff_vc1dsp_init_mmx(dsp);
666723 }
libavcodec/vc1dsp.h+67−0
@@ -0,0 +1,67 @@
1+/*
2+ * VC-1 and WMV3 decoder - DSP functions
3+ * Copyright (c) 2006 Konstantin Shishkov
4+ *
5+ * This file is part of FFmpeg.
6+ *
7+ * FFmpeg is free software; you can redistribute it and/or
8+ * modify it under the terms of the GNU Lesser General Public
9+ * License as published by the Free Software Foundation; either
10+ * version 2.1 of the License, or (at your option) any later version.
11+ *
12+ * FFmpeg is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+ * Lesser General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU Lesser General Public
18+ * License along with FFmpeg; if not, write to the Free Software
19+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20+ */
21+
22+/**
23+ * @file
24+ * VC-1 and WMV3 decoder
25+ *
26+ */
27+
28+#ifndef AVCODEC_VC1DSP_H
29+#define AVCODEC_VC1DSP_H
30+
31+#include "dsputil.h"
32+
33+typedef struct VC1DSPContext {
34+ /* vc1 functions */
35+ void (*vc1_inv_trans_8x8)(DCTELEM *b);
36+ void (*vc1_inv_trans_8x4)(uint8_t *dest, int line_size, DCTELEM *block);
37+ void (*vc1_inv_trans_4x8)(uint8_t *dest, int line_size, DCTELEM *block);
38+ void (*vc1_inv_trans_4x4)(uint8_t *dest, int line_size, DCTELEM *block);
39+ void (*vc1_inv_trans_8x8_dc)(uint8_t *dest, int line_size, DCTELEM *block);
40+ void (*vc1_inv_trans_8x4_dc)(uint8_t *dest, int line_size, DCTELEM *block);
41+ void (*vc1_inv_trans_4x8_dc)(uint8_t *dest, int line_size, DCTELEM *block);
42+ void (*vc1_inv_trans_4x4_dc)(uint8_t *dest, int line_size, DCTELEM *block);
43+ void (*vc1_v_overlap)(uint8_t* src, int stride);
44+ void (*vc1_h_overlap)(uint8_t* src, int stride);
45+ void (*vc1_v_loop_filter4)(uint8_t *src, int stride, int pq);
46+ void (*vc1_h_loop_filter4)(uint8_t *src, int stride, int pq);
47+ void (*vc1_v_loop_filter8)(uint8_t *src, int stride, int pq);
48+ void (*vc1_h_loop_filter8)(uint8_t *src, int stride, int pq);
49+ void (*vc1_v_loop_filter16)(uint8_t *src, int stride, int pq);
50+ void (*vc1_h_loop_filter16)(uint8_t *src, int stride, int pq);
51+
52+ /* put 8x8 block with bicubic interpolation and quarterpel precision
53+ * last argument is actually round value instead of height
54+ */
55+ op_pixels_func put_vc1_mspel_pixels_tab[16];
56+ op_pixels_func avg_vc1_mspel_pixels_tab[16];
57+
58+ /* This is really one func used in VC-1 decoding */
59+ h264_chroma_mc_func put_no_rnd_vc1_chroma_pixels_tab[3];
60+ h264_chroma_mc_func avg_no_rnd_vc1_chroma_pixels_tab[3];
61+} VC1DSPContext;
62+
63+void ff_vc1dsp_init(VC1DSPContext* c);
64+void ff_vc1dsp_init_altivec(VC1DSPContext* c);
65+void ff_vc1dsp_init_mmx(VC1DSPContext* dsp);
66+
67+#endif /* AVCODEC_VC1DSP_H */
libavcodec/x86/dsputil_mmx.c+0−20
@@ -1894,20 +1894,14 @@ PREFETCH(prefetch_3dnow, prefetch) · 1893 unmodified lines
18941894
18951895 void ff_put_h264_chroma_mc8_mmx_rnd (uint8_t *dst, uint8_t *src,
18961896 int stride, int h, int x, int y);
1897−void ff_put_vc1_chroma_mc8_mmx_nornd (uint8_t *dst, uint8_t *src,
1898− int stride, int h, int x, int y);
18991897 void ff_put_rv40_chroma_mc8_mmx (uint8_t *dst, uint8_t *src,
19001898 int stride, int h, int x, int y);
19011899 void ff_avg_h264_chroma_mc8_mmx2_rnd (uint8_t *dst, uint8_t *src,
19021900 int stride, int h, int x, int y);
1903−void ff_avg_vc1_chroma_mc8_mmx2_nornd (uint8_t *dst, uint8_t *src,
1904− int stride, int h, int x, int y);
19051901 void ff_avg_rv40_chroma_mc8_mmx2 (uint8_t *dst, uint8_t *src,
19061902 int stride, int h, int x, int y);
19071903 void ff_avg_h264_chroma_mc8_3dnow_rnd (uint8_t *dst, uint8_t *src,
19081904 int stride, int h, int x, int y);
1909−void ff_avg_vc1_chroma_mc8_3dnow_nornd(uint8_t *dst, uint8_t *src,
1910− int stride, int h, int x, int y);
19111905 void ff_avg_rv40_chroma_mc8_3dnow (uint8_t *dst, uint8_t *src,
19121906 int stride, int h, int x, int y);
19131907
@@ -1931,15 +1925,11 @@ void ff_avg_h264_chroma_mc2_mmx2 (uint8_t *dst, uint8_t *src, · 17 unmodified lines
19311925
19321926 void ff_put_h264_chroma_mc8_ssse3_rnd (uint8_t *dst, uint8_t *src,
19331927 int stride, int h, int x, int y);
1934−void ff_put_vc1_chroma_mc8_ssse3_nornd(uint8_t *dst, uint8_t *src,
1935− int stride, int h, int x, int y);
19361928 void ff_put_h264_chroma_mc4_ssse3 (uint8_t *dst, uint8_t *src,
19371929 int stride, int h, int x, int y);
19381930
19391931 void ff_avg_h264_chroma_mc8_ssse3_rnd (uint8_t *dst, uint8_t *src,
19401932 int stride, int h, int x, int y);
1941−void ff_avg_vc1_chroma_mc8_ssse3_nornd(uint8_t *dst, uint8_t *src,
1942− int stride, int h, int x, int y);
19431933 void ff_avg_h264_chroma_mc4_ssse3 (uint8_t *dst, uint8_t *src,
19441934 int stride, int h, int x, int y);
19451935
@@ -2535,7 +2525,6 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) · 589 unmodified lines
25352525 #if HAVE_YASM
25362526 c->put_h264_chroma_pixels_tab[0]= ff_put_h264_chroma_mc8_mmx_rnd;
25372527 c->put_h264_chroma_pixels_tab[1]= ff_put_h264_chroma_mc4_mmx;
2538− c->put_no_rnd_vc1_chroma_pixels_tab[0]= ff_put_vc1_chroma_mc8_mmx_nornd;
25392528
25402529 c->put_rv40_chroma_pixels_tab[0]= ff_put_rv40_chroma_mc8_mmx;
25412530 c->put_rv40_chroma_pixels_tab[1]= ff_put_rv40_chroma_mc4_mmx;
@@ -2622,8 +2611,6 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) · 80 unmodified lines
26222611 c->avg_rv40_chroma_pixels_tab[0]= ff_avg_rv40_chroma_mc8_mmx2;
26232612 c->avg_rv40_chroma_pixels_tab[1]= ff_avg_rv40_chroma_mc4_mmx2;
26242613
2625− c->avg_no_rnd_vc1_chroma_pixels_tab[0]= ff_avg_vc1_chroma_mc8_mmx2_nornd;
2626−
26272614 c->avg_h264_chroma_pixels_tab[0]= ff_avg_h264_chroma_mc8_mmx2_rnd;
26282615 c->avg_h264_chroma_pixels_tab[1]= ff_avg_h264_chroma_mc4_mmx2;
26292616 c->avg_h264_chroma_pixels_tab[2]= ff_avg_h264_chroma_mc2_mmx2;
@@ -2636,9 +2623,6 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) · 6 unmodified lines
26362623 c->add_hfyu_median_prediction = add_hfyu_median_prediction_cmov;
26372624 #endif
26382625
2639− if (CONFIG_VC1_DECODER)
2640− ff_vc1dsp_init_mmx(c, avctx);
2641−
26422626 c->add_png_paeth_prediction= add_png_paeth_prediction_mmx2;
26432627 } else if (mm_flags & AV_CPU_FLAG_3DNOW) {
26442628 c->prefetch = prefetch_3dnow;
@@ -2695,8 +2679,6 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) · 50 unmodified lines
26952679 c->avg_h264_chroma_pixels_tab[0]= ff_avg_h264_chroma_mc8_3dnow_rnd;
26962680 c->avg_h264_chroma_pixels_tab[1]= ff_avg_h264_chroma_mc4_3dnow;
26972681
2698− c->avg_no_rnd_vc1_chroma_pixels_tab[0]= ff_avg_vc1_chroma_mc8_3dnow_nornd;
2699−
27002682 c->avg_rv40_chroma_pixels_tab[0]= ff_avg_rv40_chroma_mc8_3dnow;
27012683 c->avg_rv40_chroma_pixels_tab[1]= ff_avg_rv40_chroma_mc4_3dnow;
27022684 #endif
@@ -2745,8 +2727,6 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) · 42 unmodified lines
27452727 H264_QPEL_FUNCS(3, 3, ssse3);
27462728 c->add_png_paeth_prediction= add_png_paeth_prediction_ssse3;
27472729 #if HAVE_YASM
2748− c->put_no_rnd_vc1_chroma_pixels_tab[0]= ff_put_vc1_chroma_mc8_ssse3_nornd;
2749− c->avg_no_rnd_vc1_chroma_pixels_tab[0]= ff_avg_vc1_chroma_mc8_ssse3_nornd;
27502730 c->put_h264_chroma_pixels_tab[0]= ff_put_h264_chroma_mc8_ssse3_rnd;
27512731 c->avg_h264_chroma_pixels_tab[0]= ff_avg_h264_chroma_mc8_ssse3_rnd;
27522732 c->put_h264_chroma_pixels_tab[1]= ff_put_h264_chroma_mc4_ssse3;
libavcodec/x86/dsputil_mmx.h+0−1
@@ -196,7 +196,6 @@ void ff_avg_cavs_qpel8_mc00_mmx2(uint8_t *dst, uint8_t *src, int stride); · 195 unmodified lines
196196 void ff_put_cavs_qpel16_mc00_mmx2(uint8_t *dst, uint8_t *src, int stride);
197197 void ff_avg_cavs_qpel16_mc00_mmx2(uint8_t *dst, uint8_t *src, int stride);
198198
199−void ff_vc1dsp_init_mmx(DSPContext* dsp, AVCodecContext *avctx);
200199 void ff_put_vc1_mspel_mc00_mmx(uint8_t *dst, const uint8_t *src, int stride, int rnd);
201200 void ff_avg_vc1_mspel_mc00_mmx2(uint8_t *dst, const uint8_t *src, int stride, int rnd);
202201
libavcodec/x86/vc1dsp_mmx.c+43−20
@@ -28,6 +28,7 @@ · 27 unmodified lines
2828 #include "libavutil/x86_cpu.h"
2929 #include "libavcodec/dsputil.h"
3030 #include "dsputil_mmx.h"
31+#include "libavcodec/vc1dsp.h"
3132
3233 #define OP_PUT(S,D)
3334 #define OP_AVG(S,D) "pavgb " #S ", " #D " \n\t"
@@ -712,30 +713,45 @@ static void vc1_h_loop_filter16_sse4(uint8_t *src, int stride, int pq) · 678 unmodified lines
712713 ff_vc1_h_loop_filter8_sse4(src, stride, pq);
713714 ff_vc1_h_loop_filter8_sse4(src+8*stride, stride, pq);
714715 }
716+
715717 #endif
716718
717−void ff_vc1dsp_init_mmx(DSPContext* dsp, AVCodecContext *avctx) {
719+void ff_put_vc1_chroma_mc8_mmx_nornd (uint8_t *dst, uint8_t *src,
720+ int stride, int h, int x, int y);
721+void ff_avg_vc1_chroma_mc8_mmx2_nornd (uint8_t *dst, uint8_t *src,
722+ int stride, int h, int x, int y);
723+void ff_avg_vc1_chroma_mc8_3dnow_nornd(uint8_t *dst, uint8_t *src,
724+ int stride, int h, int x, int y);
725+void ff_put_vc1_chroma_mc8_ssse3_nornd(uint8_t *dst, uint8_t *src,
726+ int stride, int h, int x, int y);
727+void ff_avg_vc1_chroma_mc8_ssse3_nornd(uint8_t *dst, uint8_t *src,
728+ int stride, int h, int x, int y);
729+
730+void ff_vc1dsp_init_mmx(VC1DSPContext *dsp)
731+{
718732 int mm_flags = av_get_cpu_flags();
719733
720− dsp->put_vc1_mspel_pixels_tab[ 0] = ff_put_vc1_mspel_mc00_mmx;
721− dsp->put_vc1_mspel_pixels_tab[ 4] = put_vc1_mspel_mc01_mmx;
722− dsp->put_vc1_mspel_pixels_tab[ 8] = put_vc1_mspel_mc02_mmx;
723− dsp->put_vc1_mspel_pixels_tab[12] = put_vc1_mspel_mc03_mmx;
724−
725− dsp->put_vc1_mspel_pixels_tab[ 1] = put_vc1_mspel_mc10_mmx;
726− dsp->put_vc1_mspel_pixels_tab[ 5] = put_vc1_mspel_mc11_mmx;
727− dsp->put_vc1_mspel_pixels_tab[ 9] = put_vc1_mspel_mc12_mmx;
728− dsp->put_vc1_mspel_pixels_tab[13] = put_vc1_mspel_mc13_mmx;
729−
730− dsp->put_vc1_mspel_pixels_tab[ 2] = put_vc1_mspel_mc20_mmx;
731− dsp->put_vc1_mspel_pixels_tab[ 6] = put_vc1_mspel_mc21_mmx;
732− dsp->put_vc1_mspel_pixels_tab[10] = put_vc1_mspel_mc22_mmx;
733− dsp->put_vc1_mspel_pixels_tab[14] = put_vc1_mspel_mc23_mmx;
734−
735− dsp->put_vc1_mspel_pixels_tab[ 3] = put_vc1_mspel_mc30_mmx;
736− dsp->put_vc1_mspel_pixels_tab[ 7] = put_vc1_mspel_mc31_mmx;
737− dsp->put_vc1_mspel_pixels_tab[11] = put_vc1_mspel_mc32_mmx;
738− dsp->put_vc1_mspel_pixels_tab[15] = put_vc1_mspel_mc33_mmx;
734+ if (mm_flags & AV_CPU_FLAG_MMX) {
735+ dsp->put_vc1_mspel_pixels_tab[ 0] = ff_put_vc1_mspel_mc00_mmx;
736+ dsp->put_vc1_mspel_pixels_tab[ 4] = put_vc1_mspel_mc01_mmx;
737+ dsp->put_vc1_mspel_pixels_tab[ 8] = put_vc1_mspel_mc02_mmx;
738+ dsp->put_vc1_mspel_pixels_tab[12] = put_vc1_mspel_mc03_mmx;
739+
740+ dsp->put_vc1_mspel_pixels_tab[ 1] = put_vc1_mspel_mc10_mmx;
741+ dsp->put_vc1_mspel_pixels_tab[ 5] = put_vc1_mspel_mc11_mmx;
742+ dsp->put_vc1_mspel_pixels_tab[ 9] = put_vc1_mspel_mc12_mmx;
743+ dsp->put_vc1_mspel_pixels_tab[13] = put_vc1_mspel_mc13_mmx;
744+
745+ dsp->put_vc1_mspel_pixels_tab[ 2] = put_vc1_mspel_mc20_mmx;
746+ dsp->put_vc1_mspel_pixels_tab[ 6] = put_vc1_mspel_mc21_mmx;
747+ dsp->put_vc1_mspel_pixels_tab[10] = put_vc1_mspel_mc22_mmx;
748+ dsp->put_vc1_mspel_pixels_tab[14] = put_vc1_mspel_mc23_mmx;
749+
750+ dsp->put_vc1_mspel_pixels_tab[ 3] = put_vc1_mspel_mc30_mmx;
751+ dsp->put_vc1_mspel_pixels_tab[ 7] = put_vc1_mspel_mc31_mmx;
752+ dsp->put_vc1_mspel_pixels_tab[11] = put_vc1_mspel_mc32_mmx;
753+ dsp->put_vc1_mspel_pixels_tab[15] = put_vc1_mspel_mc33_mmx;
754+ }
739755
740756 if (mm_flags & AV_CPU_FLAG_MMX2){
741757 dsp->avg_vc1_mspel_pixels_tab[ 0] = ff_avg_vc1_mspel_mc00_mmx2;
@@ -775,11 +791,16 @@ void ff_vc1dsp_init_mmx(DSPContext* dsp, AVCodecContext *avctx) { · 33 unmodified lines
775791 #if HAVE_YASM
776792 if (mm_flags & AV_CPU_FLAG_MMX) {
777793 ASSIGN_LF(mmx);
794+ dsp->put_no_rnd_vc1_chroma_pixels_tab[0]= ff_put_vc1_chroma_mc8_mmx_nornd;
778795 }
779796 return;
780797 if (mm_flags & AV_CPU_FLAG_MMX2) {
781798 ASSIGN_LF(mmx2);
799+ dsp->avg_no_rnd_vc1_chroma_pixels_tab[0]= ff_avg_vc1_chroma_mc8_mmx2_nornd;
800+ } else if (mm_flags & AV_CPU_FLAG_3DNOW) {
801+ dsp->avg_no_rnd_vc1_chroma_pixels_tab[0]= ff_avg_vc1_chroma_mc8_3dnow_nornd;
782802 }
803+
783804 if (mm_flags & AV_CPU_FLAG_SSE2) {
784805 dsp->vc1_v_loop_filter8 = ff_vc1_v_loop_filter8_sse2;
785806 dsp->vc1_h_loop_filter8 = ff_vc1_h_loop_filter8_sse2;
@@ -788,6 +809,8 @@ void ff_vc1dsp_init_mmx(DSPContext* dsp, AVCodecContext *avctx) { · 2 unmodified lines
788809 }
789810 if (mm_flags & AV_CPU_FLAG_SSSE3) {
790811 ASSIGN_LF(ssse3);
812+ dsp->put_no_rnd_vc1_chroma_pixels_tab[0]= ff_put_vc1_chroma_mc8_ssse3_nornd;
813+ dsp->avg_no_rnd_vc1_chroma_pixels_tab[0]= ff_avg_vc1_chroma_mc8_ssse3_nornd;
791814 }
792815 if (mm_flags & AV_CPU_FLAG_SSE4) {
793816 dsp->vc1_h_loop_filter8 = ff_vc1_h_loop_filter8_sse4;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t