36 for (i = 0; i < 4; i++) {
37 t0 = dc[0*4+
i] + dc[3*4+
i];
38 t1 = dc[1*4+
i] + dc[2*4+
i];
39 t2 = dc[1*4+
i] - dc[2*4+
i];
40 t3 = dc[0*4+
i] - dc[3*4+
i];
48 for (i = 0; i < 4; i++) {
49 t0 = dc[i*4+0] + dc[i*4+3] + 3;
50 t1 = dc[i*4+1] + dc[i*4+2];
51 t2 = dc[i*4+1] - dc[i*4+2];
52 t3 = dc[i*4+0] - dc[i*4+3] + 3;
58 block[
i][0][0] = (t0 +
t1) >> 3;
59 block[
i][1][0] = (t3 +
t2) >> 3;
60 block[
i][2][0] = (t0 -
t1) >> 3;
61 block[
i][3][0] = (t3 -
t2) >> 3;
67 int i,
val = (dc[0] + 3) >> 3;
70 for (i = 0; i < 4; i++) {
78 #define MUL_20091(a) ((((a)*20091) >> 16) + (a)) 79 #define MUL_35468(a) (((a)*35468) >> 16) 86 for (i = 0; i < 4; i++) {
87 t0 = block[0*4+
i] + block[2*4+
i];
88 t1 = block[0*4+
i] - block[2*4+
i];
102 for (i = 0; i < 4; i++) {
103 t0 = tmp[0*4+
i] + tmp[2*4+
i];
104 t1 = tmp[0*4+
i] - tmp[2*4+
i];
108 dst[0] = av_clip_uint8(dst[0] + ((t0 + t3 + 4) >> 3));
109 dst[1] = av_clip_uint8(dst[1] + ((t1 + t2 + 4) >> 3));
110 dst[2] = av_clip_uint8(dst[2] + ((t1 - t2 + 4) >> 3));
111 dst[3] = av_clip_uint8(dst[3] + ((t0 - t3 + 4) >> 3));
118 int i,
dc = (block[0] + 4) >> 3;
121 for (i = 0; i < 4; i++) {
122 dst[0] = av_clip_uint8(dst[0] + dc);
123 dst[1] = av_clip_uint8(dst[1] + dc);
124 dst[2] = av_clip_uint8(dst[2] + dc);
125 dst[3] = av_clip_uint8(dst[3] + dc);
148 int av_unused p3 = p[-4*stride];\ 149 int av_unused p2 = p[-3*stride];\ 150 int av_unused p1 = p[-2*stride];\ 151 int av_unused p0 = p[-1*stride];\ 152 int av_unused q0 = p[ 0*stride];\ 153 int av_unused q1 = p[ 1*stride];\ 154 int av_unused q2 = p[ 2*stride];\ 155 int av_unused q3 = p[ 3*stride]; 157 #define clip_int8(n) (cm[n+0x80]-0x80) 174 f1 =
FFMIN(a+4, 127) >> 3;
175 f2 =
FFMIN(a+3, 127) >> 3;
193 return 2*
FFABS(p0-q0) + (
FFABS(p1-q1) >> 1) <= flim;
212 return FFABS(p1-p0) > thresh ||
FFABS(q1-q0) > thresh;
225 a0 = (27*w + 63) >> 7;
226 a1 = (18*w + 63) >> 7;
227 a2 = ( 9*w + 63) >> 7;
237 #define LOOP_FILTER(dir, size, stridea, strideb, maybe_inline) \ 238 static maybe_inline void vp8_ ## dir ## _loop_filter ## size ## _c(uint8_t *dst, ptrdiff_t stride,\ 239 int flim_E, int flim_I, int hev_thresh)\ 243 for (i = 0; i < size; i++)\ 244 if (normal_limit(dst+i*stridea, strideb, flim_E, flim_I)) {\ 245 if (hev(dst+i*stridea, strideb, hev_thresh))\ 246 filter_common(dst+i*stridea, strideb, 1);\ 248 filter_mbedge(dst+i*stridea, strideb);\ 252 static maybe_inline void vp8_ ## dir ## _loop_filter ## size ## _inner_c(uint8_t *dst, ptrdiff_t stride,\ 253 int flim_E, int flim_I, int hev_thresh)\ 257 for (i = 0; i < size; i++)\ 258 if (normal_limit(dst+i*stridea, strideb, flim_E, flim_I)) {\ 259 int hv = hev(dst+i*stridea, strideb, hev_thresh);\ 261 filter_common(dst+i*stridea, strideb, 1);\ 263 filter_common(dst+i*stridea, strideb, 0);\ 270 #define UV_LOOP_FILTER(dir, stridea, strideb) \ 271 LOOP_FILTER(dir, 8, stridea, strideb, av_always_inline) \ 272 static void vp8_ ## dir ## _loop_filter8uv_c(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride,\ 273 int fE, int fI, int hev_thresh)\ 275 vp8_ ## dir ## _loop_filter8_c(dstU, stride, fE, fI, hev_thresh);\ 276 vp8_ ## dir ## _loop_filter8_c(dstV, stride, fE, fI, hev_thresh);\ 278 static void vp8_ ## dir ## _loop_filter8uv_inner_c(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride,\ 279 int fE, int fI, int hev_thresh)\ 281 vp8_ ## dir ## _loop_filter8_inner_c(dstU, stride, fE, fI, hev_thresh);\ 282 vp8_ ## dir ## _loop_filter8_inner_c(dstV, stride, fE, fI, hev_thresh);\ 292 for (i = 0; i < 16; i++)
301 for (i = 0; i < 16; i++)
307 { 0, 6, 123, 12, 1, 0 },
308 { 2, 11, 108, 36, 8, 1 },
309 { 0, 9, 93, 50, 6, 0 },
310 { 3, 16, 77, 77, 16, 3 },
311 { 0, 6, 50, 93, 9, 0 },
312 { 1, 8, 36, 108, 11, 2 },
313 { 0, 1, 12, 123, 6, 0 },
316 #define PUT_PIXELS(WIDTH) \ 317 static void put_vp8_pixels ## WIDTH ##_c(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int h, int x, int y) { \ 319 for (i = 0; i < h; i++, dst+= dststride, src+= srcstride) { \ 320 memcpy(dst, src, WIDTH); \ 328 #define FILTER_6TAP(src, F, stride) \ 329 cm[(F[2]*src[x+0*stride] - F[1]*src[x-1*stride] + F[0]*src[x-2*stride] + \ 330 F[3]*src[x+1*stride] - F[4]*src[x+2*stride] + F[5]*src[x+3*stride] + 64) >> 7] 332 #define FILTER_4TAP(src, F, stride) \ 333 cm[(F[2]*src[x+0*stride] - F[1]*src[x-1*stride] + \ 334 F[3]*src[x+1*stride] - F[4]*src[x+2*stride] + 64) >> 7] 336 #define VP8_EPEL_H(SIZE, TAPS) \ 337 static void put_vp8_epel ## SIZE ## _h ## TAPS ## _c(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int h, int mx, int my) \ 339 const uint8_t *filter = subpel_filters[mx-1]; \ 340 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; \ 343 for (y = 0; y < h; y++) { \ 344 for (x = 0; x < SIZE; x++) \ 345 dst[x] = FILTER_ ## TAPS ## TAP(src, filter, 1); \ 350 #define VP8_EPEL_V(SIZE, TAPS) \ 351 static void put_vp8_epel ## SIZE ## _v ## TAPS ## _c(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int h, int mx, int my) \ 353 const uint8_t *filter = subpel_filters[my-1]; \ 354 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; \ 357 for (y = 0; y < h; y++) { \ 358 for (x = 0; x < SIZE; x++) \ 359 dst[x] = FILTER_ ## TAPS ## TAP(src, filter, srcstride); \ 364 #define VP8_EPEL_HV(SIZE, HTAPS, VTAPS) \ 365 static void put_vp8_epel ## SIZE ## _h ## HTAPS ## v ## VTAPS ## _c(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int h, int mx, int my) \ 367 const uint8_t *filter = subpel_filters[mx-1]; \ 368 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; \ 370 uint8_t tmp_array[(2*SIZE+VTAPS-1)*SIZE]; \ 371 uint8_t *tmp = tmp_array; \ 372 src -= (2-(VTAPS==4))*srcstride; \ 374 for (y = 0; y < h+VTAPS-1; y++) { \ 375 for (x = 0; x < SIZE; x++) \ 376 tmp[x] = FILTER_ ## HTAPS ## TAP(src, filter, 1); \ 381 tmp = tmp_array + (2-(VTAPS==4))*SIZE; \ 382 filter = subpel_filters[my-1]; \ 384 for (y = 0; y < h; y++) { \ 385 for (x = 0; x < SIZE; x++) \ 386 dst[x] = FILTER_ ## VTAPS ## TAP(tmp, filter, SIZE); \ 417 #define VP8_BILINEAR(SIZE) \ 418 static void put_vp8_bilinear ## SIZE ## _h_c(uint8_t *dst, ptrdiff_t stride, uint8_t *src, ptrdiff_t s2, int h, int mx, int my) \ 420 int a = 8-mx, b = mx; \ 423 for (y = 0; y < h; y++) { \ 424 for (x = 0; x < SIZE; x++) \ 425 dst[x] = (a*src[x] + b*src[x+1] + 4) >> 3; \ 430 static void put_vp8_bilinear ## SIZE ## _v_c(uint8_t *dst, ptrdiff_t stride, uint8_t *src, ptrdiff_t s2, int h, int mx, int my) \ 432 int c = 8-my, d = my; \ 435 for (y = 0; y < h; y++) { \ 436 for (x = 0; x < SIZE; x++) \ 437 dst[x] = (c*src[x] + d*src[x+stride] + 4) >> 3; \ 443 static void put_vp8_bilinear ## SIZE ## _hv_c(uint8_t *dst, ptrdiff_t stride, uint8_t *src, ptrdiff_t s2, int h, int mx, int my) \ 445 int a = 8-mx, b = mx; \ 446 int c = 8-my, d = my; \ 448 uint8_t tmp_array[(2*SIZE+1)*SIZE]; \ 449 uint8_t *tmp = tmp_array; \ 451 for (y = 0; y < h+1; y++) { \ 452 for (x = 0; x < SIZE; x++) \ 453 tmp[x] = (a*src[x] + b*src[x+1] + 4) >> 3; \ 460 for (y = 0; y < h; y++) { \ 461 for (x = 0; x < SIZE; x++) \ 462 dst[x] = (c*tmp[x] + d*tmp[x+SIZE] + 4) >> 3; \ 472 #define VP8_MC_FUNC(IDX, SIZE) \ 473 dsp->put_vp8_epel_pixels_tab[IDX][0][0] = put_vp8_pixels ## SIZE ## _c; \ 474 dsp->put_vp8_epel_pixels_tab[IDX][0][1] = put_vp8_epel ## SIZE ## _h4_c; \ 475 dsp->put_vp8_epel_pixels_tab[IDX][0][2] = put_vp8_epel ## SIZE ## _h6_c; \ 476 dsp->put_vp8_epel_pixels_tab[IDX][1][0] = put_vp8_epel ## SIZE ## _v4_c; \ 477 dsp->put_vp8_epel_pixels_tab[IDX][1][1] = put_vp8_epel ## SIZE ## _h4v4_c; \ 478 dsp->put_vp8_epel_pixels_tab[IDX][1][2] = put_vp8_epel ## SIZE ## _h6v4_c; \ 479 dsp->put_vp8_epel_pixels_tab[IDX][2][0] = put_vp8_epel ## SIZE ## _v6_c; \ 480 dsp->put_vp8_epel_pixels_tab[IDX][2][1] = put_vp8_epel ## SIZE ## _h4v6_c; \ 481 dsp->put_vp8_epel_pixels_tab[IDX][2][2] = put_vp8_epel ## SIZE ## _h6v6_c 483 #define VP8_BILINEAR_MC_FUNC(IDX, SIZE) \ 484 dsp->put_vp8_bilinear_pixels_tab[IDX][0][0] = put_vp8_pixels ## SIZE ## _c; \ 485 dsp->put_vp8_bilinear_pixels_tab[IDX][0][1] = put_vp8_bilinear ## SIZE ## _h_c; \ 486 dsp->put_vp8_bilinear_pixels_tab[IDX][0][2] = put_vp8_bilinear ## SIZE ## _h_c; \ 487 dsp->put_vp8_bilinear_pixels_tab[IDX][1][0] = put_vp8_bilinear ## SIZE ## _v_c; \ 488 dsp->put_vp8_bilinear_pixels_tab[IDX][1][1] = put_vp8_bilinear ## SIZE ## _hv_c; \ 489 dsp->put_vp8_bilinear_pixels_tab[IDX][1][2] = put_vp8_bilinear ## SIZE ## _hv_c; \ 490 dsp->put_vp8_bilinear_pixels_tab[IDX][2][0] = put_vp8_bilinear ## SIZE ## _v_c; \ 491 dsp->put_vp8_bilinear_pixels_tab[IDX][2][1] = put_vp8_bilinear ## SIZE ## _hv_c; \ 492 dsp->put_vp8_bilinear_pixels_tab[IDX][2][2] = put_vp8_bilinear ## SIZE ## _hv_c static void vp8_luma_dc_wht_dc_c(int16_t block[4][4][16], int16_t dc[16])
static void vp8_v_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, int flim)
void(* vp8_idct_dc_add)(uint8_t *dst, int16_t block[16], ptrdiff_t stride)
#define VP8_EPEL_V(SIZE, TAPS)
void(* vp8_idct_dc_add4y)(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride)
void(* vp8_v_loop_filter8uv_inner)(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
av_cold void ff_vp8dsp_init_arm(VP8DSPContext *dsp)
output residual component w
av_cold void ff_vp8dsp_init_altivec(VP8DSPContext *c)
void(* vp8_luma_dc_wht_dc)(int16_t block[4][4][16], int16_t dc[16])
void(* vp8_idct_dc_add4uv)(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride)
av_cold void ff_vp8dsp_init(VP8DSPContext *dsp)
VP8 compatible video decoder.
static void vp8_idct_dc_add4uv_c(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride)
#define VP8_BILINEAR_MC_FUNC(IDX, SIZE)
static void vp8_luma_dc_wht_c(int16_t block[4][4][16], int16_t dc[16])
static const uint8_t subpel_filters[7][6]
static void vp8_idct_dc_add4y_c(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride)
void(* vp8_v_loop_filter8uv)(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
#define VP8_EPEL_H(SIZE, TAPS)
static void vp8_h_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, int flim)
void(* vp8_idct_add)(uint8_t *dst, int16_t block[16], ptrdiff_t stride)
#define VP8_BILINEAR(SIZE)
static void vp8_idct_add_c(uint8_t *dst, int16_t block[16], ptrdiff_t stride)
static av_always_inline void filter_common(uint8_t *p, ptrdiff_t stride, int is4tap)
void(* vp8_h_loop_filter8uv_inner)(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
static av_always_inline int simple_limit(uint8_t *p, ptrdiff_t stride, int flim)
#define VP8_EPEL_HV(SIZE, HTAPS, VTAPS)
void(* vp8_v_loop_filter16y)(uint8_t *dst, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
FIXME Range Coding of cr are mx and my are Motion Vector top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff)*mv_scale Intra DC Predicton block[y][x] dc[1]
#define VP8_MC_FUNC(IDX, SIZE)
synthesis window for stochastic i
static void vp8_idct_dc_add_c(uint8_t *dst, int16_t block[16], ptrdiff_t stride)
static av_always_inline void filter_mbedge(uint8_t *p, ptrdiff_t stride)
void(* vp8_h_loop_filter8uv)(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
#define LOOP_FILTER(dir, size, stridea, strideb, maybe_inline)
void ff_vp8dsp_init_x86(VP8DSPContext *c)
#define UV_LOOP_FILTER(dir, stridea, strideb)
void(* vp8_h_loop_filter16y_inner)(uint8_t *dst, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
void(* vp8_luma_dc_wht)(int16_t block[4][4][16], int16_t dc[16])
void(* vp8_v_loop_filter_simple)(uint8_t *dst, ptrdiff_t stride, int flim)
void(* vp8_h_loop_filter_simple)(uint8_t *dst, ptrdiff_t stride, int flim)
common internal and external API header
void(* vp8_v_loop_filter16y_inner)(uint8_t *dst, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
#define PUT_PIXELS(WIDTH)
static av_always_inline int normal_limit(uint8_t *p, ptrdiff_t stride, int E, int I)
E - limit at the macroblock edge I - limit for interior difference.
else dst[i][x+y *dst_stride[i]]
void(* vp8_h_loop_filter16y)(uint8_t *dst, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh)
static av_always_inline int hev(uint8_t *p, ptrdiff_t stride, int thresh)