diff options
Diffstat (limited to 'libavcodec/dsputil.c')
-rw-r--r-- | libavcodec/dsputil.c | 248 |
1 files changed, 220 insertions, 28 deletions
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index cdd4b73..ec1f6dd 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -5,20 +5,20 @@ * * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer <michaelni@gmx.at> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -37,10 +37,12 @@ #include "mpegvideo.h" #include "config.h" #include "vorbis.h" +#include "diracdsp.h" uint8_t ff_cropTbl[256 + 2 * MAX_NEG_CROP] = {0, }; uint32_t ff_squareTbl[512] = {0, }; +#define pixeltmp int16_t #define BIT_DEPTH 9 #include "dsputil_template.c" #undef BIT_DEPTH @@ -49,8 +51,21 @@ uint32_t ff_squareTbl[512] = {0, }; #include "dsputil_template.c" #undef BIT_DEPTH +#undef pixeltmp +#define pixeltmp int32_t +#define BIT_DEPTH 12 +#include "dsputil_template.c" +#undef BIT_DEPTH + +#define BIT_DEPTH 14 +#include "dsputil_template.c" +#undef BIT_DEPTH + +#undef pixeltmp +#define pixeltmp int16_t #define BIT_DEPTH 8 #include "dsputil_template.c" +#undef pixeltmp // 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size #define pb_7f (~0UL/255 * 0x7f) @@ -337,7 +352,7 @@ static int sse16_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h) return s; } -static void diff_pixels_c(DCTELEM *restrict block, const uint8_t *s1, +static void diff_pixels_c(DCTELEM *av_restrict block, const uint8_t *s1, const uint8_t *s2, int stride){ int i; @@ -358,7 +373,7 @@ static void diff_pixels_c(DCTELEM *restrict block, const uint8_t *s1, } -static void put_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels, +static void put_pixels_clamped_c(const DCTELEM *block, uint8_t *av_restrict pixels, int line_size) { int i; @@ -379,8 +394,40 @@ static void put_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels, } } +static void put_pixels_clamped4_c(const DCTELEM *block, uint8_t *av_restrict pixels, + int line_size) +{ + int i; + + /* read the pixels */ + for(i=0;i<4;i++) { + pixels[0] = av_clip_uint8(block[0]); + pixels[1] = av_clip_uint8(block[1]); + pixels[2] = av_clip_uint8(block[2]); + pixels[3] = av_clip_uint8(block[3]); + + pixels += line_size; + block += 8; + } +} + +static void put_pixels_clamped2_c(const DCTELEM *block, uint8_t *av_restrict pixels, + int line_size) +{ + int i; + + /* read the pixels */ + for(i=0;i<2;i++) { + pixels[0] = av_clip_uint8(block[0]); + pixels[1] = av_clip_uint8(block[1]); + + pixels += line_size; + block += 8; + } +} + static void put_signed_pixels_clamped_c(const DCTELEM *block, - uint8_t *restrict pixels, + uint8_t *av_restrict pixels, int line_size) { int i, j; @@ -400,7 +447,7 @@ static void put_signed_pixels_clamped_c(const DCTELEM *block, } } -static void add_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels, +static void add_pixels_clamped_c(const DCTELEM *block, uint8_t *av_restrict pixels, int line_size) { int i; @@ -420,6 +467,36 @@ static void add_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels, } } +static void add_pixels_clamped4_c(const DCTELEM *block, uint8_t *av_restrict pixels, + int line_size) +{ + int i; + + /* read the pixels */ + for(i=0;i<4;i++) { + pixels[0] = av_clip_uint8(pixels[0] + block[0]); + pixels[1] = av_clip_uint8(pixels[1] + block[1]); + pixels[2] = av_clip_uint8(pixels[2] + block[2]); + pixels[3] = av_clip_uint8(pixels[3] + block[3]); + pixels += line_size; + block += 8; + } +} + +static void add_pixels_clamped2_c(const DCTELEM *block, uint8_t *av_restrict pixels, + int line_size) +{ + int i; + + /* read the pixels */ + for(i=0;i<2;i++) { + pixels[0] = av_clip_uint8(pixels[0] + block[0]); + pixels[1] = av_clip_uint8(pixels[1] + block[1]); + pixels += line_size; + block += 8; + } +} + static int sum_abs_dctelem_c(DCTELEM *block) { int sum=0, i; @@ -1256,6 +1333,51 @@ void ff_avg_rv40_qpel8_mc33_c(uint8_t *dst, uint8_t *src, int stride){ } #endif /* CONFIG_RV40_DECODER */ +#if CONFIG_DIRAC_DECODER +#define DIRAC_MC(OPNAME)\ +void ff_ ## OPNAME ## _dirac_pixels8_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\ +{\ + OPNAME ## _pixels8_8_c(dst, src[0], stride, h);\ +}\ +void ff_ ## OPNAME ## _dirac_pixels16_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\ +{\ + OPNAME ## _pixels16_8_c(dst, src[0], stride, h);\ +}\ +void ff_ ## OPNAME ## _dirac_pixels32_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\ +{\ + OPNAME ## _pixels16_8_c(dst , src[0] , stride, h);\ + OPNAME ## _pixels16_8_c(dst+16, src[0]+16, stride, h);\ +}\ +void ff_ ## OPNAME ## _dirac_pixels8_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\ +{\ + OPNAME ## _pixels8_l2_8(dst, src[0], src[1], stride, stride, stride, h);\ +}\ +void ff_ ## OPNAME ## _dirac_pixels16_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\ +{\ + OPNAME ## _pixels16_l2_8(dst, src[0], src[1], stride, stride, stride, h);\ +}\ +void ff_ ## OPNAME ## _dirac_pixels32_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\ +{\ + OPNAME ## _pixels16_l2_8(dst , src[0] , src[1] , stride, stride, stride, h);\ + OPNAME ## _pixels16_l2_8(dst+16, src[0]+16, src[1]+16, stride, stride, stride, h);\ +}\ +void ff_ ## OPNAME ## _dirac_pixels8_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\ +{\ + OPNAME ## _pixels8_l4_8(dst, src[0], src[1], src[2], src[3], stride, stride, stride, stride, stride, h);\ +}\ +void ff_ ## OPNAME ## _dirac_pixels16_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\ +{\ + OPNAME ## _pixels16_l4_8(dst, src[0], src[1], src[2], src[3], stride, stride, stride, stride, stride, h);\ +}\ +void ff_ ## OPNAME ## _dirac_pixels32_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\ +{\ + OPNAME ## _pixels16_l4_8(dst , src[0] , src[1] , src[2] , src[3] , stride, stride, stride, stride, stride, h);\ + OPNAME ## _pixels16_l4_8(dst+16, src[0]+16, src[1]+16, src[2]+16, src[3]+16, stride, stride, stride, stride, stride, h);\ +} +DIRAC_MC(put) +DIRAC_MC(avg) +#endif + static void wmv2_mspel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int w){ uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; int i; @@ -1690,7 +1812,7 @@ static int try_8x8basis_c(int16_t rem[64], int16_t weight[64], int16_t basis[64] int b= rem[i] + ((basis[i]*scale + (1<<(BASIS_SHIFT - RECON_SHIFT-1)))>>(BASIS_SHIFT - RECON_SHIFT)); int w= weight[i]; b>>= RECON_SHIFT; - assert(-512<b && b<512); + av_assert2(-512<b && b<512); sum += (w*b)*(w*b)>>4; } @@ -1809,7 +1931,7 @@ static void add_bytes_c(uint8_t *dst, uint8_t *src, int w){ dst[i+0] += src[i+0]; } -static void diff_bytes_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){ +static void diff_bytes_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w){ long i; #if !HAVE_FAST_UNALIGNED if((long)src2 & (sizeof(long)-1)){ @@ -1949,7 +2071,7 @@ static int hadamard8_diff8x8_c(/*MpegEncContext*/ void *s, uint8_t *dst, uint8_t int temp[64]; int sum=0; - assert(h==8); + av_assert2(h==8); for(i=0; i<8; i++){ //FIXME try pointer walks @@ -1994,7 +2116,7 @@ static int hadamard8_intra8x8_c(/*MpegEncContext*/ void *s, uint8_t *src, uint8_ int temp[64]; int sum=0; - assert(h==8); + av_assert2(h==8); for(i=0; i<8; i++){ //FIXME try pointer walks @@ -2041,7 +2163,7 @@ static int dct_sad8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2 MpegEncContext * const s= (MpegEncContext *)c; LOCAL_ALIGNED_16(DCTELEM, temp, [64]); - assert(h==8); + av_assert2(h==8); s->dsp.diff_pixels(temp, src1, src2, stride); s->dsp.fdct(temp); @@ -2106,7 +2228,7 @@ static int dct_max8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2 LOCAL_ALIGNED_16(DCTELEM, temp, [64]); int sum=0, i; - assert(h==8); + av_assert2(h==8); s->dsp.diff_pixels(temp, src1, src2, stride); s->dsp.fdct(temp); @@ -2123,7 +2245,7 @@ static int quant_psnr8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *s DCTELEM * const bak = temp+64; int sum=0, i; - assert(h==8); + av_assert2(h==8); s->mb_intra=0; s->dsp.diff_pixels(temp, src1, src2, stride); @@ -2151,7 +2273,7 @@ static int rd8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int uint8_t * length; uint8_t * last_length; - assert(h==8); + av_assert2(h==8); copy_block8(lsrc1, src1, 8, stride, 8); copy_block8(lsrc2, src2, 8, stride, 8); @@ -2193,7 +2315,7 @@ static int rd8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int level= temp[i] + 64; - assert(level - 64); + av_assert2(level - 64); if((level&(~127)) == 0){ bits+= last_length[UNI_AC_ENC_INDEX(run, level)]; @@ -2225,7 +2347,7 @@ static int bit8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, in uint8_t * length; uint8_t * last_length; - assert(h==8); + av_assert2(h==8); s->dsp.diff_pixels(temp, src1, src2, stride); @@ -2264,7 +2386,7 @@ static int bit8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, in level= temp[i] + 64; - assert(level - 64); + av_assert2(level - 64); if((level&(~127)) == 0){ bits+= last_length[UNI_AC_ENC_INDEX(run, level)]; @@ -2400,7 +2522,7 @@ static void vector_fmul_scalar_c(float *dst, const float *src, float mul, dst[i] = src[i] * mul; } -static void butterflies_float_c(float *restrict v1, float *restrict v2, +static void butterflies_float_c(float *av_restrict v1, float *av_restrict v2, int len) { int i; @@ -2623,6 +2745,37 @@ static void ff_jref_idct_add(uint8_t *dest, int line_size, DCTELEM *block) add_pixels_clamped_c(block, dest, line_size); } +static void ff_jref_idct4_put(uint8_t *dest, int line_size, DCTELEM *block) +{ + ff_j_rev_dct4 (block); + put_pixels_clamped4_c(block, dest, line_size); +} +static void ff_jref_idct4_add(uint8_t *dest, int line_size, DCTELEM *block) +{ + ff_j_rev_dct4 (block); + add_pixels_clamped4_c(block, dest, line_size); +} + +static void ff_jref_idct2_put(uint8_t *dest, int line_size, DCTELEM *block) +{ + ff_j_rev_dct2 (block); + put_pixels_clamped2_c(block, dest, line_size); +} +static void ff_jref_idct2_add(uint8_t *dest, int line_size, DCTELEM *block) +{ + ff_j_rev_dct2 (block); + add_pixels_clamped2_c(block, dest, line_size); +} + +static void ff_jref_idct1_put(uint8_t *dest, int line_size, DCTELEM *block) +{ + dest[0] = av_clip_uint8((block[0] + 4)>>3); +} +static void ff_jref_idct1_add(uint8_t *dest, int line_size, DCTELEM *block) +{ + dest[0] = av_clip_uint8(dest[0] + ((block[0] + 4)>>3)); +} + static void just_return(void *mem av_unused, int stride av_unused, int h av_unused) { return; } /* init static data */ @@ -2654,7 +2807,7 @@ int ff_check_alignment(void){ "Compiler did not align stack variables. Libavcodec has been miscompiled\n" "and may be very slow or crash. This is not a bug in libavcodec,\n" "but in the compiler. You may try recompiling using gcc >= 4.2.\n" - "Do not report crashes to Libav developers.\n"); + "Do not report crashes to FFmpeg developers.\n"); #endif did_fail=1; } @@ -2689,12 +2842,28 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx) } #endif //CONFIG_ENCODERS - if (avctx->bits_per_raw_sample == 10) { - c->idct_put = ff_simple_idct_put_10; - c->idct_add = ff_simple_idct_add_10; - c->idct = ff_simple_idct_10; - c->idct_permutation_type = FF_NO_IDCT_PERM; - } else { + if(avctx->lowres==1){ + c->idct_put= ff_jref_idct4_put; + c->idct_add= ff_jref_idct4_add; + c->idct = ff_j_rev_dct4; + c->idct_permutation_type= FF_NO_IDCT_PERM; + }else if(avctx->lowres==2){ + c->idct_put= ff_jref_idct2_put; + c->idct_add= ff_jref_idct2_add; + c->idct = ff_j_rev_dct2; + c->idct_permutation_type= FF_NO_IDCT_PERM; + }else if(avctx->lowres==3){ + c->idct_put= ff_jref_idct1_put; + c->idct_add= ff_jref_idct1_add; + c->idct = ff_j_rev_dct1; + c->idct_permutation_type= FF_NO_IDCT_PERM; + }else{ + if (avctx->bits_per_raw_sample == 10) { + c->idct_put = ff_simple_idct_put_10; + c->idct_add = ff_simple_idct_add_10; + c->idct = ff_simple_idct_10; + c->idct_permutation_type = FF_NO_IDCT_PERM; + } else { if(avctx->idct_algo==FF_IDCT_INT){ c->idct_put= ff_jref_idct_put; c->idct_add= ff_jref_idct_add; @@ -2716,6 +2885,7 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx) c->idct = ff_simple_idct_8; c->idct_permutation_type= FF_NO_IDCT_PERM; } + } } c->diff_pixels = diff_pixels_c; @@ -2965,8 +3135,24 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx) BIT_DEPTH_FUNCS(10, _16); } break; + case 12: + if (c->dct_bits == 32) { + BIT_DEPTH_FUNCS(12, _32); + } else { + BIT_DEPTH_FUNCS(12, _16); + } + break; + case 14: + if (c->dct_bits == 32) { + BIT_DEPTH_FUNCS(14, _32); + } else { + BIT_DEPTH_FUNCS(14, _16); + } + break; default: - BIT_DEPTH_FUNCS(8, _16); + if(avctx->bits_per_raw_sample<=8 || avctx->codec_type != AVMEDIA_TYPE_VIDEO) { + BIT_DEPTH_FUNCS(8, _16); + } break; } @@ -2979,6 +3165,7 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx) if (HAVE_MMI) ff_dsputil_init_mmi (c, avctx); if (ARCH_SH4) ff_dsputil_init_sh4 (c, avctx); if (ARCH_BFIN) ff_dsputil_init_bfin (c, avctx); + if (HAVE_MIPSFPU) ff_dsputil_init_mips (c, avctx); for (i = 0; i < 4; i++) { for (j = 0; j < 16; j++) { @@ -2994,3 +3181,8 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx) ff_init_scantable_permutation(c->idct_permutation, c->idct_permutation_type); } + +av_cold void dsputil_init(DSPContext* c, AVCodecContext *avctx) +{ + ff_dsputil_init(c, avctx); +} |