FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Macros | Functions | Variables
vp8dsp.c File Reference

VP8 compatible video decoder. More...

#include "dsputil.h"
#include "vp8dsp.h"
#include "libavutil/common.h"

Go to the source code of this file.

Macros

#define MK_IDCT_DC_ADD4_C(name)
 
#define LOAD_PIXELS
 
#define clip_int8(n)   (cm[n+0x80]-0x80)
 
#define NORMAL_LIMIT(vpn)
 E - limit at the macroblock edge I - limit for interior difference.
 
#define LOOP_FILTER(vpn, dir, size, stridea, strideb, maybe_inline)
 
#define UV_LOOP_FILTER(vpn, dir, stridea, strideb)
 
#define LOOP_FILTER_SIMPLE(vpn)
 
#define PUT_PIXELS(WIDTH)
 
#define FILTER_6TAP(src, F, stride)
 
#define FILTER_4TAP(src, F, stride)
 
#define VP8_EPEL_H(SIZE, TAPS)
 
#define VP8_EPEL_V(SIZE, TAPS)
 
#define VP8_EPEL_HV(SIZE, HTAPS, VTAPS)
 
#define VP8_BILINEAR(SIZE)
 
#define VP8_MC_FUNC(IDX, SIZE)
 
#define VP8_BILINEAR_MC_FUNC(IDX, SIZE)
 
#define VPX(f)   vp8_ ## f
 

Functions

static av_always_inline void filter_common (uint8_t *p, ptrdiff_t stride, int is4tap, int vpn)
 
static av_always_inline int vp7_simple_limit (uint8_t *p, ptrdiff_t stride, int flim)
 
static av_always_inline int vp8_simple_limit (uint8_t *p, ptrdiff_t stride, int flim)
 
static av_always_inline int hev (uint8_t *p, ptrdiff_t stride, int thresh)
 
static av_always_inline void filter_mbedge (uint8_t *p, ptrdiff_t stride)
 
av_cold void ff_vp8dsp_init (VP8DSPContext *dsp, int vp7)
 

Variables

static const uint8_t subpel_filters [7][6]
 

Detailed Description

VP8 compatible video decoder.

Definition in file vp8dsp.c.

Macro Definition Documentation

#define MK_IDCT_DC_ADD4_C (   name)
Value:
static void name ## _idct_dc_add4uv_c(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride)\
{\
name ## _idct_dc_add_c(dst+stride*0+0, block[0], stride);\
name ## _idct_dc_add_c(dst+stride*0+4, block[1], stride);\
name ## _idct_dc_add_c(dst+stride*4+0, block[2], stride);\
name ## _idct_dc_add_c(dst+stride*4+4, block[3], stride);\
}\
\
static void name ## _idct_dc_add4y_c(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride)\
{\
name ## _idct_dc_add_c(dst+ 0, block[0], stride);\
name ## _idct_dc_add_c(dst+ 4, block[1], stride);\
name ## _idct_dc_add_c(dst+ 8, block[2], stride);\
name ## _idct_dc_add_c(dst+12, block[3], stride);\
}

Definition at line 32 of file vp8dsp.c.

#define LOAD_PIXELS
Value:
int av_unused p3 = p[-4*stride];\
int av_unused p2 = p[-3*stride];\
int av_unused p1 = p[-2*stride];\
int av_unused p0 = p[-1*stride];\
int av_unused q0 = p[ 0*stride];\
int av_unused q1 = p[ 1*stride];\
int av_unused q2 = p[ 2*stride];\
int av_unused q3 = p[ 3*stride];

Definition at line 239 of file vp8dsp.c.

Referenced by filter_common(), filter_mbedge(), hev(), vp7_simple_limit(), and vp8_simple_limit().

#define clip_int8 (   n)    (cm[n+0x80]-0x80)

Definition at line 249 of file vp8dsp.c.

Referenced by filter_common(), and filter_mbedge().

#define NORMAL_LIMIT (   vpn)
Value:
static av_always_inline int vp ## vpn ## _normal_limit(uint8_t *p, ptrdiff_t stride, int E, int I)\
{\
LOAD_PIXELS\
return vp ## vpn ## _simple_limit(p, stride, E)\
&& FFABS(p3-p2) <= I && FFABS(p2-p1) <= I && FFABS(p1-p0) <= I\
&& FFABS(q3-q2) <= I && FFABS(q2-q1) <= I && FFABS(q1-q0) <= I;\
}

E - limit at the macroblock edge I - limit for interior difference.

Definition at line 302 of file vp8dsp.c.

#define LOOP_FILTER (   vpn,
  dir,
  size,
  stridea,
  strideb,
  maybe_inline 
)
Value:
static maybe_inline void vp ## vpn ## _ ## dir ## _loop_filter ## size ## _c(uint8_t *dst, ptrdiff_t stride,\
int flim_E, int flim_I, int hev_thresh)\
{\
int i;\
for (i = 0; i < size; i++)\
if (vp ## vpn ## _normal_limit(dst+i*stridea, strideb, flim_E, flim_I)) {\
if (hev(dst+i*stridea, strideb, hev_thresh))\
filter_common(dst+i*stridea, strideb, 1, vpn);\
filter_mbedge(dst+i*stridea, strideb);\
}\
}\
\
static maybe_inline void vp ## vpn ## _ ## dir ## _loop_filter ## size ## _inner_c(uint8_t *dst, ptrdiff_t stride,\
int flim_E, int flim_I, int hev_thresh)\
{\
int i;\
for (i = 0; i < size; i++)\
if (vp ## vpn ## _normal_limit(dst+i*stridea, strideb, flim_E, flim_I)) {\
int hv = hev(dst+i*stridea, strideb, hev_thresh);\
if (hv) \
filter_common(dst+i*stridea, strideb, 1, vpn);\
filter_common(dst+i*stridea, strideb, 0, vpn);\
}\
}

Definition at line 343 of file vp8dsp.c.

#define UV_LOOP_FILTER (   vpn,
  dir,
  stridea,
  strideb 
)
Value:
LOOP_FILTER(vpn, dir, 8, stridea, strideb, av_always_inline) \
static void vp ## vpn ## _ ## dir ## _loop_filter8uv_c(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride,\
int fE, int fI, int hev_thresh)\
{\
vp ## vpn ## _ ## dir ## _loop_filter8_c(dstU, stride, fE, fI, hev_thresh);\
vp ## vpn ## _ ## dir ## _loop_filter8_c(dstV, stride, fE, fI, hev_thresh);\
}\
static void vp ## vpn ## _ ## dir ## _loop_filter8uv_inner_c(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride,\
int fE, int fI, int hev_thresh)\
{\
vp ## vpn ## _ ## dir ## _loop_filter8_inner_c(dstU, stride, fE, fI, hev_thresh);\
vp ## vpn ## _ ## dir ## _loop_filter8_inner_c(dstV, stride, fE, fI, hev_thresh);\
}

Definition at line 373 of file vp8dsp.c.

#define LOOP_FILTER_SIMPLE (   vpn)
Value:
static void vp ## vpn ## _v_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, int flim)\
{\
int i;\
for (i = 0; i < 16; i++)\
if (vp ## vpn ## _simple_limit(dst+i, stride, flim))\
filter_common(dst+i, stride, 1, vpn);\
}\
\
static void vp ## vpn ## _h_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, int flim)\
{\
int i;\
for (i = 0; i < 16; i++)\
if (vp ## vpn ## _simple_limit(dst+i*stride, 1, flim))\
filter_common(dst+i*stride, 1, 1, vpn);\
}

Definition at line 388 of file vp8dsp.c.

#define PUT_PIXELS (   WIDTH)
Value:
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) { \
int i; \
for (i = 0; i < h; i++, dst+= dststride, src+= srcstride) { \
memcpy(dst, src, WIDTH); \
} \
}

Definition at line 433 of file vp8dsp.c.

#define FILTER_6TAP (   src,
  F,
  stride 
)
Value:
cm[(F[2]*src[x+0*stride] - F[1]*src[x-1*stride] + F[0]*src[x-2*stride] + \
F[3]*src[x+1*stride] - F[4]*src[x+2*stride] + F[5]*src[x+3*stride] + 64) >> 7]

Definition at line 445 of file vp8dsp.c.

#define FILTER_4TAP (   src,
  F,
  stride 
)
Value:
cm[(F[2]*src[x+0*stride] - F[1]*src[x-1*stride] + \
F[3]*src[x+1*stride] - F[4]*src[x+2*stride] + 64) >> 7]

Definition at line 449 of file vp8dsp.c.

#define VP8_EPEL_H (   SIZE,
  TAPS 
)
Value:
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) \
{ \
const uint8_t *filter = subpel_filters[mx-1]; \
int x, y; \
for (y = 0; y < h; y++) { \
for (x = 0; x < SIZE; x++) \
dst[x] = FILTER_ ## TAPS ## TAP(src, filter, 1); \
dst += dststride; \
src += srcstride; \
} \
}

Definition at line 453 of file vp8dsp.c.

#define VP8_EPEL_V (   SIZE,
  TAPS 
)
Value:
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) \
{ \
const uint8_t *filter = subpel_filters[my-1]; \
int x, y; \
for (y = 0; y < h; y++) { \
for (x = 0; x < SIZE; x++) \
dst[x] = FILTER_ ## TAPS ## TAP(src, filter, srcstride); \
dst += dststride; \
src += srcstride; \
} \
}

Definition at line 467 of file vp8dsp.c.

#define VP8_EPEL_HV (   SIZE,
  HTAPS,
  VTAPS 
)
Value:
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) \
{ \
const uint8_t *filter = subpel_filters[mx-1]; \
int x, y; \
uint8_t tmp_array[(2*SIZE+VTAPS-1)*SIZE]; \
uint8_t *tmp = tmp_array; \
src -= (2-(VTAPS==4))*srcstride; \
for (y = 0; y < h+VTAPS-1; y++) { \
for (x = 0; x < SIZE; x++) \
tmp[x] = FILTER_ ## HTAPS ## TAP(src, filter, 1); \
tmp += SIZE; \
src += srcstride; \
} \
\
tmp = tmp_array + (2-(VTAPS==4))*SIZE; \
filter = subpel_filters[my-1]; \
for (y = 0; y < h; y++) { \
for (x = 0; x < SIZE; x++) \
dst[x] = FILTER_ ## VTAPS ## TAP(tmp, filter, SIZE); \
dst += dststride; \
tmp += SIZE; \
} \
}

Definition at line 481 of file vp8dsp.c.

#define VP8_BILINEAR (   SIZE)

Definition at line 534 of file vp8dsp.c.

#define VP8_MC_FUNC (   IDX,
  SIZE 
)
Value:
dsp->put_vp8_epel_pixels_tab[IDX][0][0] = put_vp8_pixels ## SIZE ## _c; \
dsp->put_vp8_epel_pixels_tab[IDX][0][1] = put_vp8_epel ## SIZE ## _h4_c; \
dsp->put_vp8_epel_pixels_tab[IDX][0][2] = put_vp8_epel ## SIZE ## _h6_c; \
dsp->put_vp8_epel_pixels_tab[IDX][1][0] = put_vp8_epel ## SIZE ## _v4_c; \
dsp->put_vp8_epel_pixels_tab[IDX][1][1] = put_vp8_epel ## SIZE ## _h4v4_c; \
dsp->put_vp8_epel_pixels_tab[IDX][1][2] = put_vp8_epel ## SIZE ## _h6v4_c; \
dsp->put_vp8_epel_pixels_tab[IDX][2][0] = put_vp8_epel ## SIZE ## _v6_c; \
dsp->put_vp8_epel_pixels_tab[IDX][2][1] = put_vp8_epel ## SIZE ## _h4v6_c; \
dsp->put_vp8_epel_pixels_tab[IDX][2][2] = put_vp8_epel ## SIZE ## _h6v6_c

Definition at line 589 of file vp8dsp.c.

Referenced by ff_vp8dsp_init().

#define VP8_BILINEAR_MC_FUNC (   IDX,
  SIZE 
)
Value:
dsp->put_vp8_bilinear_pixels_tab[IDX][0][0] = put_vp8_pixels ## SIZE ## _c; \
dsp->put_vp8_bilinear_pixels_tab[IDX][0][1] = put_vp8_bilinear ## SIZE ## _h_c; \
dsp->put_vp8_bilinear_pixels_tab[IDX][0][2] = put_vp8_bilinear ## SIZE ## _h_c; \
dsp->put_vp8_bilinear_pixels_tab[IDX][1][0] = put_vp8_bilinear ## SIZE ## _v_c; \
dsp->put_vp8_bilinear_pixels_tab[IDX][1][1] = put_vp8_bilinear ## SIZE ## _hv_c; \
dsp->put_vp8_bilinear_pixels_tab[IDX][1][2] = put_vp8_bilinear ## SIZE ## _hv_c; \
dsp->put_vp8_bilinear_pixels_tab[IDX][2][0] = put_vp8_bilinear ## SIZE ## _v_c; \
dsp->put_vp8_bilinear_pixels_tab[IDX][2][1] = put_vp8_bilinear ## SIZE ## _hv_c; \
dsp->put_vp8_bilinear_pixels_tab[IDX][2][2] = put_vp8_bilinear ## SIZE ## _hv_c

Definition at line 600 of file vp8dsp.c.

Referenced by ff_vp8dsp_init().

#define VPX (   f)    vp8_ ## f

Referenced by ff_vp8dsp_init().

Function Documentation

static av_always_inline void filter_common ( uint8_t p,
ptrdiff_t  stride,
int  is4tap,
int  vpn 
)
static

Definition at line 251 of file vp8dsp.c.

static av_always_inline int vp7_simple_limit ( uint8_t p,
ptrdiff_t  stride,
int  flim 
)
static

Definition at line 286 of file vp8dsp.c.

static av_always_inline int vp8_simple_limit ( uint8_t p,
ptrdiff_t  stride,
int  flim 
)
static

Definition at line 292 of file vp8dsp.c.

static av_always_inline int hev ( uint8_t p,
ptrdiff_t  stride,
int  thresh 
)
static

Definition at line 315 of file vp8dsp.c.

Referenced by loop_filter().

static av_always_inline void filter_mbedge ( uint8_t p,
ptrdiff_t  stride 
)
static

Definition at line 321 of file vp8dsp.c.

av_cold void ff_vp8dsp_init ( VP8DSPContext dsp,
int  vp7 
)

Definition at line 611 of file vp8dsp.c.

Referenced by ff_vp8_decode_init().

Variable Documentation

const uint8_t subpel_filters[7][6]
static
Initial value:
= {
{ 0, 6, 123, 12, 1, 0 },
{ 2, 11, 108, 36, 8, 1 },
{ 0, 9, 93, 50, 6, 0 },
{ 3, 16, 77, 77, 16, 3 },
{ 0, 6, 50, 93, 9, 0 },
{ 1, 8, 36, 108, 11, 2 },
{ 0, 1, 12, 123, 6, 0 },
}

Definition at line 423 of file vp8dsp.c.