ffmpeg / libavcodec / audioconvert.c @ 2912e87a
History | View | Annotate | Download (6.3 KB)
1 | 0eb6817d | Michael Niedermayer | /*
|
---|---|---|---|
2 | ed567d9c | Michael Niedermayer | * audio conversion
|
3 | 0eb6817d | Michael Niedermayer | * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
|
4 | *
|
||
5 | 2912e87a | Mans Rullgard | * This file is part of Libav.
|
6 | b78e7197 | Diego Biurrun | *
|
7 | 2912e87a | Mans Rullgard | * Libav is free software; you can redistribute it and/or
|
8 | 0eb6817d | Michael Niedermayer | * modify it under the terms of the GNU Lesser General Public
|
9 | * License as published by the Free Software Foundation; either
|
||
10 | b78e7197 | Diego Biurrun | * version 2.1 of the License, or (at your option) any later version.
|
11 | 0eb6817d | Michael Niedermayer | *
|
12 | 2912e87a | Mans Rullgard | * Libav is distributed in the hope that it will be useful,
|
13 | 0eb6817d | Michael Niedermayer | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
15 | * Lesser General Public License for more details.
|
||
16 | *
|
||
17 | * You should have received a copy of the GNU Lesser General Public
|
||
18 | 2912e87a | Mans Rullgard | * License along with Libav; if not, write to the Free Software
|
19 | 0eb6817d | Michael Niedermayer | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 | */
|
||
21 | |||
22 | /**
|
||
23 | ba87f080 | Diego Biurrun | * @file
|
24 | ed567d9c | Michael Niedermayer | * audio conversion
|
25 | 0eb6817d | Michael Niedermayer | * @author Michael Niedermayer <michaelni@gmx.at>
|
26 | */
|
||
27 | |||
28 | c2fef0c1 | Diego Biurrun | #include "libavutil/avstring.h" |
29 | 07876e25 | Måns Rullgård | #include "libavutil/libm.h" |
30 | 737eb597 | Reinhard Tartler | #include "libavutil/samplefmt.h" |
31 | 8a464e75 | Peter Ross | #include "avcodec.h" |
32 | c2b28bb9 | Peter Ross | #include "audioconvert.h" |
33 | |||
34 | d63e456a | Stefano Sabatini | #if FF_API_OLD_SAMPLE_FMT
|
35 | c2b28bb9 | Peter Ross | const char *avcodec_get_sample_fmt_name(int sample_fmt) |
36 | { |
||
37 | d63e456a | Stefano Sabatini | return av_get_sample_fmt_name(sample_fmt);
|
38 | c2b28bb9 | Peter Ross | } |
39 | |||
40 | 5d6e4c16 | Stefano Sabatini | enum AVSampleFormat avcodec_get_sample_fmt(const char* name) |
41 | c2b28bb9 | Peter Ross | { |
42 | d63e456a | Stefano Sabatini | return av_get_sample_fmt(name);
|
43 | c2b28bb9 | Peter Ross | } |
44 | |||
45 | void avcodec_sample_fmt_string (char *buf, int buf_size, int sample_fmt) |
||
46 | { |
||
47 | d63e456a | Stefano Sabatini | av_get_sample_fmt_string(buf, buf_size, sample_fmt); |
48 | c2b28bb9 | Peter Ross | } |
49 | d63e456a | Stefano Sabatini | #endif
|
50 | 0eb6817d | Michael Niedermayer | |
51 | 0d72e7d0 | Peter Ross | int64_t avcodec_guess_channel_layout(int nb_channels, enum CodecID codec_id, const char *fmt_name) |
52 | { |
||
53 | switch(nb_channels) {
|
||
54 | 63e8d976 | Stefano Sabatini | case 1: return AV_CH_LAYOUT_MONO; |
55 | case 2: return AV_CH_LAYOUT_STEREO; |
||
56 | case 3: return AV_CH_LAYOUT_SURROUND; |
||
57 | case 4: return AV_CH_LAYOUT_QUAD; |
||
58 | case 5: return AV_CH_LAYOUT_5POINT0; |
||
59 | case 6: return AV_CH_LAYOUT_5POINT1; |
||
60 | case 8: return AV_CH_LAYOUT_7POINT1; |
||
61 | 0d72e7d0 | Peter Ross | default: return 0; |
62 | } |
||
63 | } |
||
64 | |||
65 | 176a6157 | Stefano Sabatini | #if FF_API_OLD_AUDIOCONVERT
|
66 | 5da19b53 | S.N. Hemanth Meenakshisundaram | int64_t avcodec_get_channel_layout(const char *name) |
67 | { |
||
68 | 176a6157 | Stefano Sabatini | return av_get_channel_layout(name);
|
69 | 5da19b53 | S.N. Hemanth Meenakshisundaram | } |
70 | |||
71 | 0d72e7d0 | Peter Ross | void avcodec_get_channel_layout_string(char *buf, int buf_size, int nb_channels, int64_t channel_layout) |
72 | { |
||
73 | 176a6157 | Stefano Sabatini | av_get_channel_layout_string(buf, buf_size, nb_channels, channel_layout); |
74 | 0d72e7d0 | Peter Ross | } |
75 | |||
76 | be233a56 | Justin Ruggles | int avcodec_channel_layout_num_channels(int64_t channel_layout)
|
77 | { |
||
78 | 176a6157 | Stefano Sabatini | return av_get_channel_layout_nb_channels(channel_layout);
|
79 | be233a56 | Justin Ruggles | } |
80 | 176a6157 | Stefano Sabatini | #endif
|
81 | be233a56 | Justin Ruggles | |
82 | 82cee279 | Peter Ross | struct AVAudioConvert {
|
83 | int in_channels, out_channels;
|
||
84 | int fmt_pair;
|
||
85 | }; |
||
86 | |||
87 | 5d6e4c16 | Stefano Sabatini | AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, |
88 | enum AVSampleFormat in_fmt, int in_channels, |
||
89 | d3b9e7f1 | Diego Pettenò | const float *matrix, int flags) |
90 | 82cee279 | Peter Ross | { |
91 | AVAudioConvert *ctx; |
||
92 | if (in_channels!=out_channels)
|
||
93 | return NULL; /* FIXME: not supported */ |
||
94 | ctx = av_malloc(sizeof(AVAudioConvert));
|
||
95 | if (!ctx)
|
||
96 | return NULL; |
||
97 | ctx->in_channels = in_channels; |
||
98 | ctx->out_channels = out_channels; |
||
99 | 5d6e4c16 | Stefano Sabatini | ctx->fmt_pair = out_fmt + AV_SAMPLE_FMT_NB*in_fmt; |
100 | 82cee279 | Peter Ross | return ctx;
|
101 | } |
||
102 | |||
103 | void av_audio_convert_free(AVAudioConvert *ctx)
|
||
104 | { |
||
105 | av_free(ctx); |
||
106 | } |
||
107 | |||
108 | int av_audio_convert(AVAudioConvert *ctx,
|
||
109 | void * const out[6], const int out_stride[6], |
||
110 | const void * const in[6], const int in_stride[6], int len) |
||
111 | { |
||
112 | 0eb6817d | Michael Niedermayer | int ch;
|
113 | |||
114 | //FIXME optimize common cases
|
||
115 | |||
116 | 82cee279 | Peter Ross | for(ch=0; ch<ctx->out_channels; ch++){ |
117 | const int is= in_stride[ch]; |
||
118 | const int os= out_stride[ch]; |
||
119 | 4d6f600c | Baptiste Coudurier | const uint8_t *pi= in[ch];
|
120 | 0eb6817d | Michael Niedermayer | uint8_t *po= out[ch]; |
121 | 82cee279 | Peter Ross | uint8_t *end= po + os*len; |
122 | 0eb6817d | Michael Niedermayer | if(!out[ch])
|
123 | continue;
|
||
124 | |||
125 | #define CONV(ofmt, otype, ifmt, expr)\
|
||
126 | 5d6e4c16 | Stefano Sabatini | if(ctx->fmt_pair == ofmt + AV_SAMPLE_FMT_NB*ifmt){\
|
127 | 0eb6817d | Michael Niedermayer | do{\
|
128 | *(otype*)po = expr; pi += is; po += os;\ |
||
129 | }while(po < end);\
|
||
130 | } |
||
131 | |||
132 | 755bfeab | Diego Biurrun | //FIXME put things below under ifdefs so we do not waste space for cases no codec will need
|
133 | b1078e9f | Ronald S. Bultje | //FIXME rounding ?
|
134 | 0eb6817d | Michael Niedermayer | |
135 | 5d6e4c16 | Stefano Sabatini | CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_U8 , *(const uint8_t*)pi)
|
136 | else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<8) |
||
137 | else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<24) |
||
138 | else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0 / (1<<7))) |
||
139 | else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0 / (1<<7))) |
||
140 | else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_S16, (*(const int16_t*)pi>>8) + 0x80) |
||
141 | else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S16, *(const int16_t*)pi) |
||
142 | else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S16, *(const int16_t*)pi<<16) |
||
143 | else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0 / (1<<15))) |
||
144 | else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0 / (1<<15))) |
||
145 | else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_S32, (*(const int32_t*)pi>>24) + 0x80) |
||
146 | else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S32, *(const int32_t*)pi>>16) |
||
147 | else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S32, *(const int32_t*)pi) |
||
148 | else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1<<31))) |
||
149 | else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1<<31))) |
||
150 | else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8( lrintf(*(const float*)pi * (1<<7)) + 0x80)) |
||
151 | else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16( lrintf(*(const float*)pi * (1<<15)))) |
||
152 | else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float*)pi * (1U<<31)))) |
||
153 | else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_FLT, *(const float*)pi) |
||
154 | else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_FLT, *(const float*)pi) |
||
155 | else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8( lrint(*(const double*)pi * (1<<7)) + 0x80)) |
||
156 | else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16( lrint(*(const double*)pi * (1<<15)))) |
||
157 | else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double*)pi * (1U<<31)))) |
||
158 | else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_DBL, *(const double*)pi) |
||
159 | else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_DBL, *(const double*)pi) |
||
160 | 0eb6817d | Michael Niedermayer | else return -1; |
161 | } |
||
162 | return 0; |
||
163 | } |