diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-05-29 19:41:55 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-05-29 19:48:03 +0200 |
commit | c2625c26c5e58edfa39360b51125f1ddd593e4db (patch) | |
tree | 6a2030197973c643876b85848c48f6a68f2a12dd | |
parent | f8f42f48218138d37956407ebf10227eb86d4a2d (diff) | |
download | ffmpeg-c2625c26c5e58edfa39360b51125f1ddd593e4db.tar.gz |
mpegvideo: implement ff_put_h264_chroma_mc1 & ff_avg_h264_chroma_mc2
These are needed for lowres 3
This may fix Ticket2538
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/h264chroma.c | 2 | ||||
-rw-r--r-- | libavcodec/h264chroma.h | 4 | ||||
-rw-r--r-- | libavcodec/h264chroma_template.c | 28 | ||||
-rw-r--r-- | libavcodec/mpegvideo.c | 2 |
4 files changed, 33 insertions, 3 deletions
diff --git a/libavcodec/h264chroma.c b/libavcodec/h264chroma.c index fcc480772f..5f8ed9193b 100644 --- a/libavcodec/h264chroma.c +++ b/libavcodec/h264chroma.c @@ -32,9 +32,11 @@ c->put_h264_chroma_pixels_tab[0] = put_h264_chroma_mc8_ ## depth ## _c; \ c->put_h264_chroma_pixels_tab[1] = put_h264_chroma_mc4_ ## depth ## _c; \ c->put_h264_chroma_pixels_tab[2] = put_h264_chroma_mc2_ ## depth ## _c; \ + c->put_h264_chroma_pixels_tab[3] = put_h264_chroma_mc1_ ## depth ## _c; \ c->avg_h264_chroma_pixels_tab[0] = avg_h264_chroma_mc8_ ## depth ## _c; \ c->avg_h264_chroma_pixels_tab[1] = avg_h264_chroma_mc4_ ## depth ## _c; \ c->avg_h264_chroma_pixels_tab[2] = avg_h264_chroma_mc2_ ## depth ## _c; \ + c->avg_h264_chroma_pixels_tab[3] = avg_h264_chroma_mc1_ ## depth ## _c; \ av_cold void ff_h264chroma_init(H264ChromaContext *c, int bit_depth) { diff --git a/libavcodec/h264chroma.h b/libavcodec/h264chroma.h index 46fae425ed..45bbc7d35e 100644 --- a/libavcodec/h264chroma.h +++ b/libavcodec/h264chroma.h @@ -24,8 +24,8 @@ typedef void (*h264_chroma_mc_func)(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int srcStride, int h, int x, int y); typedef struct H264ChromaContext { - h264_chroma_mc_func put_h264_chroma_pixels_tab[3]; - h264_chroma_mc_func avg_h264_chroma_pixels_tab[3]; + h264_chroma_mc_func put_h264_chroma_pixels_tab[4]; + h264_chroma_mc_func avg_h264_chroma_pixels_tab[4]; } H264ChromaContext; void ff_h264chroma_init(H264ChromaContext *c, int bit_depth); diff --git a/libavcodec/h264chroma_template.c b/libavcodec/h264chroma_template.c index 93559d7c68..b64172aadf 100644 --- a/libavcodec/h264chroma_template.c +++ b/libavcodec/h264chroma_template.c @@ -24,6 +24,34 @@ #include "bit_depth_template.c" #define H264_CHROMA_MC(OPNAME, OP)\ +static void FUNCC(OPNAME ## h264_chroma_mc1)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\ + pixel *dst = (pixel*)_dst;\ + pixel *src = (pixel*)_src;\ + const int A=(8-x)*(8-y);\ + const int B=( x)*(8-y);\ + const int C=(8-x)*( y);\ + const int D=( x)*( y);\ + int i;\ + stride >>= sizeof(pixel)-1;\ + \ + av_assert2(x<8 && y<8 && x>=0 && y>=0);\ +\ + if(D){\ + for(i=0; i<h; i++){\ + OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\ + dst+= stride;\ + src+= stride;\ + }\ + }else{\ + const int E= B+C;\ + const int step= C ? stride : 1;\ + for(i=0; i<h; i++){\ + OP(dst[0], (A*src[0] + E*src[step+0]));\ + dst+= stride;\ + src+= stride;\ + }\ + }\ +}\ static void FUNCC(OPNAME ## h264_chroma_mc2)(uint8_t *_dst/*align 8*/, uint8_t *_src/*align 1*/, int stride, int h, int x, int y){\ pixel *dst = (pixel*)_dst;\ pixel *src = (pixel*)_src;\ diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index e76fc34c99..8c9553a269 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -2179,7 +2179,7 @@ static inline int hpel_motion_lowres(MpegEncContext *s, int motion_x, int motion_y) { const int lowres = s->avctx->lowres; - const int op_index = FFMIN(lowres, 2); + const int op_index = FFMIN(lowres, 3); const int s_mask = (2 << lowres) - 1; int emu = 0; int sx, sy; |