annotate ffmpeg/libavcodec/fmtconvert.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Format Conversion Utils
yading@10 3 * Copyright (c) 2000, 2001 Fabrice Bellard
yading@10 4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
yading@10 5 *
yading@10 6 * This file is part of FFmpeg.
yading@10 7 *
yading@10 8 * FFmpeg is free software; you can redistribute it and/or
yading@10 9 * modify it under the terms of the GNU Lesser General Public
yading@10 10 * License as published by the Free Software Foundation; either
yading@10 11 * version 2.1 of the License, or (at your option) any later version.
yading@10 12 *
yading@10 13 * FFmpeg is distributed in the hope that it will be useful,
yading@10 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 16 * Lesser General Public License for more details.
yading@10 17 *
yading@10 18 * You should have received a copy of the GNU Lesser General Public
yading@10 19 * License along with FFmpeg; if not, write to the Free Software
yading@10 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 21 */
yading@10 22
yading@10 23 #include "avcodec.h"
yading@10 24 #include "fmtconvert.h"
yading@10 25 #include "libavutil/common.h"
yading@10 26
yading@10 27 static void int32_to_float_fmul_scalar_c(float *dst, const int *src, float mul, int len){
yading@10 28 int i;
yading@10 29 for(i=0; i<len; i++)
yading@10 30 dst[i] = src[i] * mul;
yading@10 31 }
yading@10 32
yading@10 33 static av_always_inline int float_to_int16_one(const float *src){
yading@10 34 return av_clip_int16(lrintf(*src));
yading@10 35 }
yading@10 36
yading@10 37 static void float_to_int16_c(int16_t *dst, const float *src, long len)
yading@10 38 {
yading@10 39 int i;
yading@10 40 for(i=0; i<len; i++)
yading@10 41 dst[i] = float_to_int16_one(src+i);
yading@10 42 }
yading@10 43
yading@10 44 static void float_to_int16_interleave_c(int16_t *dst, const float **src,
yading@10 45 long len, int channels)
yading@10 46 {
yading@10 47 int i,j,c;
yading@10 48 if(channels==2){
yading@10 49 for(i=0; i<len; i++){
yading@10 50 dst[2*i] = float_to_int16_one(src[0]+i);
yading@10 51 dst[2*i+1] = float_to_int16_one(src[1]+i);
yading@10 52 }
yading@10 53 }else{
yading@10 54 for(c=0; c<channels; c++)
yading@10 55 for(i=0, j=c; i<len; i++, j+=channels)
yading@10 56 dst[j] = float_to_int16_one(src[c]+i);
yading@10 57 }
yading@10 58 }
yading@10 59
yading@10 60 void ff_float_interleave_c(float *dst, const float **src, unsigned int len,
yading@10 61 int channels)
yading@10 62 {
yading@10 63 int j, c;
yading@10 64 unsigned int i;
yading@10 65 if (channels == 2) {
yading@10 66 for (i = 0; i < len; i++) {
yading@10 67 dst[2*i] = src[0][i];
yading@10 68 dst[2*i+1] = src[1][i];
yading@10 69 }
yading@10 70 } else if (channels == 1 && len < INT_MAX / sizeof(float)) {
yading@10 71 memcpy(dst, src[0], len * sizeof(float));
yading@10 72 } else {
yading@10 73 for (c = 0; c < channels; c++)
yading@10 74 for (i = 0, j = c; i < len; i++, j += channels)
yading@10 75 dst[j] = src[c][i];
yading@10 76 }
yading@10 77 }
yading@10 78
yading@10 79 av_cold void ff_fmt_convert_init(FmtConvertContext *c, AVCodecContext *avctx)
yading@10 80 {
yading@10 81 c->int32_to_float_fmul_scalar = int32_to_float_fmul_scalar_c;
yading@10 82 c->float_to_int16 = float_to_int16_c;
yading@10 83 c->float_to_int16_interleave = float_to_int16_interleave_c;
yading@10 84 c->float_interleave = ff_float_interleave_c;
yading@10 85
yading@10 86 if (ARCH_ARM) ff_fmt_convert_init_arm(c, avctx);
yading@10 87 if (HAVE_ALTIVEC) ff_fmt_convert_init_altivec(c, avctx);
yading@10 88 if (ARCH_X86) ff_fmt_convert_init_x86(c, avctx);
yading@10 89 if (HAVE_MIPSFPU) ff_fmt_convert_init_mips(c);
yading@10 90 }
yading@10 91
yading@10 92 /* ffdshow custom code */
yading@10 93 void float_interleave(float *dst, const float **src, long len, int channels)
yading@10 94 {
yading@10 95 int i,j,c;
yading@10 96 if(channels==2){
yading@10 97 for(i=0; i<len; i++){
yading@10 98 dst[2*i] = src[0][i] / 32768.0f;
yading@10 99 dst[2*i+1] = src[1][i] / 32768.0f;
yading@10 100 }
yading@10 101 }else{
yading@10 102 for(c=0; c<channels; c++)
yading@10 103 for(i=0, j=c; i<len; i++, j+=channels)
yading@10 104 dst[j] = src[c][i] / 32768.0f;
yading@10 105 }
yading@10 106 }
yading@10 107
yading@10 108 void float_interleave_noscale(float *dst, const float **src, long len, int channels)
yading@10 109 {
yading@10 110 int i,j,c;
yading@10 111 if(channels==2){
yading@10 112 for(i=0; i<len; i++){
yading@10 113 dst[2*i] = src[0][i];
yading@10 114 dst[2*i+1] = src[1][i];
yading@10 115 }
yading@10 116 }else{
yading@10 117 for(c=0; c<channels; c++)
yading@10 118 for(i=0, j=c; i<len; i++, j+=channels)
yading@10 119 dst[j] = src[c][i];
yading@10 120 }
yading@10 121 }