diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-07-23 21:04:06 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-07-23 21:25:09 +0200 |
commit | 2cb4d516549526b5e17e941f6d2375a2c501ade6 (patch) | |
tree | f472c62e0b34c2faaa955d51874cddb6be759910 /libavcodec/ppc | |
parent | 7e15df7551cf45ad1d3e39d20fdc8d6c651d4705 (diff) | |
parent | d04c5293ce88927ad359ca276e287bfa63c2329d (diff) | |
download | ffmpeg-streaming-2cb4d516549526b5e17e941f6d2375a2c501ade6.zip ffmpeg-streaming-2cb4d516549526b5e17e941f6d2375a2c501ade6.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
v410dec: Implement explode mode support
zerocodec: fix direct rendering.
wav: init st to NULL to avoid a false-positive warning.
wavpack: set bits_per_raw_sample for S32 samples to properly identify 24-bit
h264: refactor NAL decode loop
RTMPTE protocol support
RTMPE protocol support
rtmp: Add ff_rtmp_calc_digest_pos()
rtmp: Rename rtmp_calc_digest to ff_rtmp_calc_digest and make it global
swscale: add missing HAVE_INLINE_ASM check.
lavfi: place x86 inline assembly under HAVE_INLINE_ASM.
vc1: Add a test for interlaced field pictures
swscale: Mark all init functions as av_cold
swscale: x86: Drop pointless _mmx suffix from filenames
lavf: use conditional notation for default codec in muxer declarations.
swscale: place inline assembly bilinear scaler under HAVE_INLINE_ASM.
dsputil: ppc: cosmetics: pretty-print
dsputil: x86: add SHUFFLE_MASK_W macro
configure: respect CC_O setting in check_cc
Conflicts:
Changelog
configure
libavcodec/v410dec.c
libavcodec/zerocodec.c
libavformat/asfenc.c
libavformat/version.h
libswscale/utils.c
libswscale/x86/swscale.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/ppc')
-rw-r--r-- | libavcodec/ppc/fmtconvert_altivec.c | 126 |
1 files changed, 64 insertions, 62 deletions
diff --git a/libavcodec/ppc/fmtconvert_altivec.c b/libavcodec/ppc/fmtconvert_altivec.c index 6f24199..1e1a3b6 100644 --- a/libavcodec/ppc/fmtconvert_altivec.c +++ b/libavcodec/ppc/fmtconvert_altivec.c @@ -23,7 +23,8 @@ #include "libavutil/ppc/util_altivec.h" #include "dsputil_altivec.h" -static void int32_to_float_fmul_scalar_altivec(float *dst, const int *src, float mul, int len) +static void int32_to_float_fmul_scalar_altivec(float *dst, const int *src, + float mul, int len) { union { vector float v; @@ -36,7 +37,7 @@ static void int32_to_float_fmul_scalar_altivec(float *dst, const int *src, float mul_u.s[0] = mul; mul_v = vec_splat(mul_u.v, 0); - for(i=0; i<len; i+=8) { + for (i = 0; i < len; i += 8) { src1 = vec_ctf(vec_ld(0, src+i), 0); src2 = vec_ctf(vec_ld(16, src+i), 0); dst1 = vec_madd(src1, mul_v, zero); @@ -47,8 +48,7 @@ static void int32_to_float_fmul_scalar_altivec(float *dst, const int *src, float } -static vector signed short -float_to_int16_one_altivec(const float *src) +static vector signed short float_to_int16_one_altivec(const float *src) { vector float s0 = vec_ld(0, src); vector float s1 = vec_ld(16, src); @@ -62,80 +62,82 @@ static void float_to_int16_altivec(int16_t *dst, const float *src, long len) int i; vector signed short d0, d1, d; vector unsigned char align; - if(((long)dst)&15) //FIXME - for(i=0; i<len-7; i+=8) { - d0 = vec_ld(0, dst+i); - d = float_to_int16_one_altivec(src+i); - d1 = vec_ld(15, dst+i); - d1 = vec_perm(d1, d0, vec_lvsl(0,dst+i)); - align = vec_lvsr(0, dst+i); - d0 = vec_perm(d1, d, align); - d1 = vec_perm(d, d1, align); - vec_st(d0, 0, dst+i); - vec_st(d1,15, dst+i); - } - else - for(i=0; i<len-7; i+=8) { - d = float_to_int16_one_altivec(src+i); - vec_st(d, 0, dst+i); + if (((long)dst) & 15) { //FIXME + for (i = 0; i < len - 7; i += 8) { + d0 = vec_ld(0, dst+i); + d = float_to_int16_one_altivec(src + i); + d1 = vec_ld(15, dst+i); + d1 = vec_perm(d1, d0, vec_lvsl(0, dst + i)); + align = vec_lvsr(0, dst + i); + d0 = vec_perm(d1, d, align); + d1 = vec_perm(d, d1, align); + vec_st(d0, 0, dst + i); + vec_st(d1, 15, dst + i); + } + } else { + for (i = 0; i < len - 7; i += 8) { + d = float_to_int16_one_altivec(src + i); + vec_st(d, 0, dst + i); + } } } -static void -float_to_int16_interleave_altivec(int16_t *dst, const float **src, - long len, int channels) +static void float_to_int16_interleave_altivec(int16_t *dst, const float **src, + long len, int channels) { int i; vector signed short d0, d1, d2, c0, c1, t0, t1; vector unsigned char align; - if(channels == 1) + + if (channels == 1) float_to_int16_altivec(dst, src[0], len); - else + else { if (channels == 2) { - if(((long)dst)&15) - for(i=0; i<len-7; i+=8) { - d0 = vec_ld(0, dst + i); - t0 = float_to_int16_one_altivec(src[0] + i); - d1 = vec_ld(31, dst + i); - t1 = float_to_int16_one_altivec(src[1] + i); - c0 = vec_mergeh(t0, t1); - c1 = vec_mergel(t0, t1); - d2 = vec_perm(d1, d0, vec_lvsl(0, dst + i)); - align = vec_lvsr(0, dst + i); - d0 = vec_perm(d2, c0, align); - d1 = vec_perm(c0, c1, align); - vec_st(d0, 0, dst + i); - d0 = vec_perm(c1, d2, align); - vec_st(d1, 15, dst + i); - vec_st(d0, 31, dst + i); - dst+=8; - } - else - for(i=0; i<len-7; i+=8) { - t0 = float_to_int16_one_altivec(src[0] + i); - t1 = float_to_int16_one_altivec(src[1] + i); - d0 = vec_mergeh(t0, t1); - d1 = vec_mergel(t0, t1); - vec_st(d0, 0, dst + i); - vec_st(d1, 16, dst + i); - dst+=8; - } - } else { - DECLARE_ALIGNED(16, int16_t, tmp)[len]; - int c, j; - for (c = 0; c < channels; c++) { - float_to_int16_altivec(tmp, src[c], len); - for (i = 0, j = c; i < len; i++, j+=channels) { - dst[j] = tmp[i]; + if (((long)dst) & 15) { + for (i = 0; i < len - 7; i += 8) { + d0 = vec_ld(0, dst + i); + t0 = float_to_int16_one_altivec(src[0] + i); + d1 = vec_ld(31, dst + i); + t1 = float_to_int16_one_altivec(src[1] + i); + c0 = vec_mergeh(t0, t1); + c1 = vec_mergel(t0, t1); + d2 = vec_perm(d1, d0, vec_lvsl(0, dst + i)); + align = vec_lvsr(0, dst + i); + d0 = vec_perm(d2, c0, align); + d1 = vec_perm(c0, c1, align); + vec_st(d0, 0, dst + i); + d0 = vec_perm(c1, d2, align); + vec_st(d1, 15, dst + i); + vec_st(d0, 31, dst + i); + dst += 8; + } + } else { + for (i = 0; i < len - 7; i += 8) { + t0 = float_to_int16_one_altivec(src[0] + i); + t1 = float_to_int16_one_altivec(src[1] + i); + d0 = vec_mergeh(t0, t1); + d1 = vec_mergel(t0, t1); + vec_st(d0, 0, dst + i); + vec_st(d1, 16, dst + i); + dst += 8; + } + } + } else { + DECLARE_ALIGNED(16, int16_t, tmp)[len]; + int c, j; + for (c = 0; c < channels; c++) { + float_to_int16_altivec(tmp, src[c], len); + for (i = 0, j = c; i < len; i++, j+=channels) + dst[j] = tmp[i]; } } - } + } } void ff_fmt_convert_init_altivec(FmtConvertContext *c, AVCodecContext *avctx) { c->int32_to_float_fmul_scalar = int32_to_float_fmul_scalar_altivec; - if(!(avctx->flags & CODEC_FLAG_BITEXACT)) { + if (!(avctx->flags & CODEC_FLAG_BITEXACT)) { c->float_to_int16 = float_to_int16_altivec; c->float_to_int16_interleave = float_to_int16_interleave_altivec; } |