annotate ffmpeg/libavcodec/x86/fmtconvert_init.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 * MMX optimization by Nick Kurshev <nickols_k@mail.ru>
yading@10 7 *
yading@10 8 * This file is part of FFmpeg.
yading@10 9 *
yading@10 10 * FFmpeg is free software; you can redistribute it and/or
yading@10 11 * modify it under the terms of the GNU Lesser General Public
yading@10 12 * License as published by the Free Software Foundation; either
yading@10 13 * version 2.1 of the License, or (at your option) any later version.
yading@10 14 *
yading@10 15 * FFmpeg is distributed in the hope that it will be useful,
yading@10 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 18 * Lesser General Public License for more details.
yading@10 19 *
yading@10 20 * You should have received a copy of the GNU Lesser General Public
yading@10 21 * License along with FFmpeg; if not, write to the Free Software
yading@10 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 23 */
yading@10 24
yading@10 25 #include "libavutil/attributes.h"
yading@10 26 #include "libavutil/cpu.h"
yading@10 27 #include "libavutil/x86/asm.h"
yading@10 28 #include "libavutil/x86/cpu.h"
yading@10 29 #include "libavcodec/fmtconvert.h"
yading@10 30
yading@10 31 #if HAVE_YASM
yading@10 32
yading@10 33 void ff_int32_to_float_fmul_scalar_sse (float *dst, const int *src, float mul, int len);
yading@10 34 void ff_int32_to_float_fmul_scalar_sse2(float *dst, const int *src, float mul, int len);
yading@10 35
yading@10 36 void ff_float_to_int16_3dnow(int16_t *dst, const float *src, long len);
yading@10 37 void ff_float_to_int16_sse (int16_t *dst, const float *src, long len);
yading@10 38 void ff_float_to_int16_sse2 (int16_t *dst, const float *src, long len);
yading@10 39
yading@10 40 void ff_float_to_int16_step_3dnow(int16_t *dst, const float *src, long len, long step);
yading@10 41 void ff_float_to_int16_step_sse (int16_t *dst, const float *src, long len, long step);
yading@10 42 void ff_float_to_int16_step_sse2 (int16_t *dst, const float *src, long len, long step);
yading@10 43
yading@10 44 void ff_float_to_int16_interleave2_3dnow(int16_t *dst, const float **src, long len);
yading@10 45 void ff_float_to_int16_interleave2_sse (int16_t *dst, const float **src, long len);
yading@10 46 void ff_float_to_int16_interleave2_sse2 (int16_t *dst, const float **src, long len);
yading@10 47
yading@10 48 void ff_float_to_int16_interleave6_sse(int16_t *dst, const float **src, int len);
yading@10 49 void ff_float_to_int16_interleave6_3dnow(int16_t *dst, const float **src, int len);
yading@10 50 void ff_float_to_int16_interleave6_3dnowext(int16_t *dst, const float **src, int len);
yading@10 51
yading@10 52 #define ff_float_to_int16_interleave6_sse2 ff_float_to_int16_interleave6_sse
yading@10 53
yading@10 54 #define FLOAT_TO_INT16_INTERLEAVE(cpu) \
yading@10 55 /* gcc pessimizes register allocation if this is in the same function as float_to_int16_interleave_sse2*/\
yading@10 56 static av_noinline void float_to_int16_interleave_misc_##cpu(int16_t *dst, const float **src, long len, int channels){\
yading@10 57 int c;\
yading@10 58 for(c=0; c<channels; c++){\
yading@10 59 ff_float_to_int16_step_##cpu(dst+c, src[c], len, channels);\
yading@10 60 }\
yading@10 61 }\
yading@10 62 \
yading@10 63 static void float_to_int16_interleave_##cpu(int16_t *dst, const float **src, long len, int channels){\
yading@10 64 if(channels==1)\
yading@10 65 ff_float_to_int16_##cpu(dst, src[0], len);\
yading@10 66 else if(channels==2){\
yading@10 67 ff_float_to_int16_interleave2_##cpu(dst, src, len);\
yading@10 68 }else if(channels==6){\
yading@10 69 ff_float_to_int16_interleave6_##cpu(dst, src, len);\
yading@10 70 }else\
yading@10 71 float_to_int16_interleave_misc_##cpu(dst, src, len, channels);\
yading@10 72 }
yading@10 73
yading@10 74 FLOAT_TO_INT16_INTERLEAVE(3dnow)
yading@10 75 FLOAT_TO_INT16_INTERLEAVE(sse)
yading@10 76 FLOAT_TO_INT16_INTERLEAVE(sse2)
yading@10 77
yading@10 78 static void float_to_int16_interleave_3dnowext(int16_t *dst, const float **src,
yading@10 79 long len, int channels)
yading@10 80 {
yading@10 81 if(channels==6)
yading@10 82 ff_float_to_int16_interleave6_3dnowext(dst, src, len);
yading@10 83 else
yading@10 84 float_to_int16_interleave_3dnow(dst, src, len, channels);
yading@10 85 }
yading@10 86
yading@10 87 void ff_float_interleave2_mmx(float *dst, const float **src, unsigned int len);
yading@10 88 void ff_float_interleave2_sse(float *dst, const float **src, unsigned int len);
yading@10 89
yading@10 90 void ff_float_interleave6_mmx(float *dst, const float **src, unsigned int len);
yading@10 91 void ff_float_interleave6_sse(float *dst, const float **src, unsigned int len);
yading@10 92
yading@10 93 static void float_interleave_mmx(float *dst, const float **src,
yading@10 94 unsigned int len, int channels)
yading@10 95 {
yading@10 96 if (channels == 2) {
yading@10 97 ff_float_interleave2_mmx(dst, src, len);
yading@10 98 } else if (channels == 6)
yading@10 99 ff_float_interleave6_mmx(dst, src, len);
yading@10 100 else
yading@10 101 ff_float_interleave_c(dst, src, len, channels);
yading@10 102 }
yading@10 103
yading@10 104 static void float_interleave_sse(float *dst, const float **src,
yading@10 105 unsigned int len, int channels)
yading@10 106 {
yading@10 107 if (channels == 2) {
yading@10 108 ff_float_interleave2_sse(dst, src, len);
yading@10 109 } else if (channels == 6)
yading@10 110 ff_float_interleave6_sse(dst, src, len);
yading@10 111 else
yading@10 112 ff_float_interleave_c(dst, src, len, channels);
yading@10 113 }
yading@10 114 #endif /* HAVE_YASM */
yading@10 115
yading@10 116 av_cold void ff_fmt_convert_init_x86(FmtConvertContext *c, AVCodecContext *avctx)
yading@10 117 {
yading@10 118 #if HAVE_YASM
yading@10 119 int mm_flags = av_get_cpu_flags();
yading@10 120
yading@10 121 if (EXTERNAL_MMX(mm_flags)) {
yading@10 122 c->float_interleave = float_interleave_mmx;
yading@10 123
yading@10 124 if (EXTERNAL_AMD3DNOW(mm_flags)) {
yading@10 125 if(!(avctx->flags & CODEC_FLAG_BITEXACT)){
yading@10 126 c->float_to_int16 = ff_float_to_int16_3dnow;
yading@10 127 c->float_to_int16_interleave = float_to_int16_interleave_3dnow;
yading@10 128 }
yading@10 129 }
yading@10 130 if (EXTERNAL_AMD3DNOWEXT(mm_flags)) {
yading@10 131 if(!(avctx->flags & CODEC_FLAG_BITEXACT)){
yading@10 132 c->float_to_int16_interleave = float_to_int16_interleave_3dnowext;
yading@10 133 }
yading@10 134 }
yading@10 135 if (EXTERNAL_SSE(mm_flags)) {
yading@10 136 c->int32_to_float_fmul_scalar = ff_int32_to_float_fmul_scalar_sse;
yading@10 137 c->float_to_int16 = ff_float_to_int16_sse;
yading@10 138 c->float_to_int16_interleave = float_to_int16_interleave_sse;
yading@10 139 c->float_interleave = float_interleave_sse;
yading@10 140 }
yading@10 141 if (EXTERNAL_SSE2(mm_flags)) {
yading@10 142 c->int32_to_float_fmul_scalar = ff_int32_to_float_fmul_scalar_sse2;
yading@10 143 c->float_to_int16 = ff_float_to_int16_sse2;
yading@10 144 c->float_to_int16_interleave = float_to_int16_interleave_sse2;
yading@10 145 }
yading@10 146 }
yading@10 147 #endif /* HAVE_YASM */
yading@10 148 }