Mercurial > libavcodec.hg
annotate audioconvert.c @ 11034:fd5921186064 libavcodec
Make the fast loop filter path work with unavailable left MBs.
This prevents the issue with having to switch between slow and
fast code paths in each row.
0.5% faster loopfilter for cathedral
author | michael |
---|---|
date | Thu, 28 Jan 2010 02:15:25 +0000 |
parents | e0fe929c5dc4 |
children | 01d5e38a0d35 |
rev | line source |
---|---|
3594 | 1 /* |
3596 | 2 * audio conversion |
3594 | 3 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> |
4 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3596
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3596
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3596
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
3594 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3596
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
3594 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3596
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
3594 | 13 * 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 | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3596
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3594 | 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 */ | |
21 | |
22 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8635
diff
changeset
|
23 * @file libavcodec/audioconvert.c |
3596 | 24 * audio conversion |
3594 | 25 * @author Michael Niedermayer <michaelni@gmx.at> |
26 */ | |
27 | |
8630
ffb82d54ecdc
Use "" instead of <> when #including non-system headers.
diego
parents:
8155
diff
changeset
|
28 #include "libavutil/avstring.h" |
7458
eb63aa50bf85
Revert r14484 hunk that deleted the 'include avcodec.h' statement.
pross
parents:
7453
diff
changeset
|
29 #include "avcodec.h" |
7453
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
30 #include "audioconvert.h" |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
31 |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
32 typedef struct SampleFmtInfo { |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
33 const char *name; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
34 int bits; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
35 } SampleFmtInfo; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
36 |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
37 /** this table gives more information about formats */ |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
38 static const SampleFmtInfo sample_fmt_info[SAMPLE_FMT_NB] = { |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
39 [SAMPLE_FMT_U8] = { .name = "u8", .bits = 8 }, |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
40 [SAMPLE_FMT_S16] = { .name = "s16", .bits = 16 }, |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
41 [SAMPLE_FMT_S32] = { .name = "s32", .bits = 32 }, |
7612 | 42 [SAMPLE_FMT_FLT] = { .name = "flt", .bits = 32 }, |
43 [SAMPLE_FMT_DBL] = { .name = "dbl", .bits = 64 }, | |
7453
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
44 }; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
45 |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
46 const char *avcodec_get_sample_fmt_name(int sample_fmt) |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
47 { |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
48 if (sample_fmt < 0 || sample_fmt >= SAMPLE_FMT_NB) |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
49 return NULL; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
50 return sample_fmt_info[sample_fmt].name; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
51 } |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
52 |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
53 enum SampleFormat avcodec_get_sample_fmt(const char* name) |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
54 { |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
55 int i; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
56 |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
57 for (i=0; i < SAMPLE_FMT_NB; i++) |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
58 if (!strcmp(sample_fmt_info[i].name, name)) |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
59 return i; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
60 return SAMPLE_FMT_NONE; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
61 } |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
62 |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
63 void avcodec_sample_fmt_string (char *buf, int buf_size, int sample_fmt) |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
64 { |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
65 /* print header */ |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
66 if (sample_fmt < 0) |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
67 snprintf (buf, buf_size, "name " " depth"); |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
68 else if (sample_fmt < SAMPLE_FMT_NB) { |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
69 SampleFmtInfo info= sample_fmt_info[sample_fmt]; |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
70 snprintf (buf, buf_size, "%-6s" " %2d ", info.name, info.bits); |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
71 } |
d1d15f2dca4c
Add sample format support functions: avcodec_get_sample_fmt_name(), avcodec_get_sample_fmt(), avcodec_sample_fmt_string()
pross
parents:
5215
diff
changeset
|
72 } |
3594 | 73 |
8098 | 74 static const char* const channel_names[]={ |
75 "FL", "FR", "FC", "LFE", "BL", "BR", "FLC", "FRC", | |
76 "BC", "SL", "SR", "TC", "TFL", "TFC", "TFR", "TBL", | |
77 "TBC", "TBR", | |
78 [29] = "DL", | |
79 [30] = "DR", | |
80 }; | |
81 | |
82 const char *get_channel_name(int channel_id) | |
83 { | |
84 if (channel_id<0 || channel_id>=FF_ARRAY_ELEMS(channel_names)) | |
85 return NULL; | |
86 return channel_names[channel_id]; | |
87 } | |
88 | |
89 int64_t avcodec_guess_channel_layout(int nb_channels, enum CodecID codec_id, const char *fmt_name) | |
90 { | |
91 switch(nb_channels) { | |
8102
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
92 case 1: return CH_LAYOUT_MONO; |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
93 case 2: return CH_LAYOUT_STEREO; |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
94 case 3: return CH_LAYOUT_SURROUND; |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
95 case 4: return CH_LAYOUT_QUAD; |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
96 case 5: return CH_LAYOUT_5POINT0; |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
97 case 6: return CH_LAYOUT_5POINT1; |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
98 case 8: return CH_LAYOUT_7POINT1; |
8098 | 99 default: return 0; |
100 } | |
101 } | |
102 | |
103 static const struct { | |
104 const char *name; | |
105 int nb_channels; | |
106 int64_t layout; | |
8155 | 107 } channel_layout_map[] = { |
8102
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
108 { "mono", 1, CH_LAYOUT_MONO }, |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
109 { "stereo", 2, CH_LAYOUT_STEREO }, |
9502 | 110 { "4.0", 4, CH_LAYOUT_4POINT0 }, |
8102
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
111 { "quad", 4, CH_LAYOUT_QUAD }, |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
112 { "5.0", 5, CH_LAYOUT_5POINT0 }, |
9410
f7bd7e90ef9f
Add names for 5.0 and 5.1 back speaker channel layouts.
jbr
parents:
8784
diff
changeset
|
113 { "5.0", 5, CH_LAYOUT_5POINT0_BACK }, |
8102
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
114 { "5.1", 6, CH_LAYOUT_5POINT1 }, |
9410
f7bd7e90ef9f
Add names for 5.0 and 5.1 back speaker channel layouts.
jbr
parents:
8784
diff
changeset
|
115 { "5.1", 6, CH_LAYOUT_5POINT1_BACK }, |
8102
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
116 { "5.1+downmix", 8, CH_LAYOUT_5POINT1|CH_LAYOUT_STEREO_DOWNMIX, }, |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
117 { "7.1", 8, CH_LAYOUT_7POINT1 }, |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
118 { "7.1(wide)", 8, CH_LAYOUT_7POINT1_WIDE }, |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8098
diff
changeset
|
119 { "7.1+downmix", 10, CH_LAYOUT_7POINT1|CH_LAYOUT_STEREO_DOWNMIX, }, |
8098 | 120 { 0 } |
121 }; | |
122 | |
123 void avcodec_get_channel_layout_string(char *buf, int buf_size, int nb_channels, int64_t channel_layout) | |
124 { | |
125 int i; | |
126 | |
127 for (i=0; channel_layout_map[i].name; i++) | |
128 if (nb_channels == channel_layout_map[i].nb_channels && | |
129 channel_layout == channel_layout_map[i].layout) { | |
8784 | 130 av_strlcpy(buf, channel_layout_map[i].name, buf_size); |
8098 | 131 return; |
132 } | |
133 | |
134 snprintf(buf, buf_size, "%d channels", nb_channels); | |
135 if (channel_layout) { | |
136 int i,ch; | |
137 av_strlcat(buf, " (", buf_size); | |
138 for(i=0,ch=0; i<64; i++) { | |
139 if ((channel_layout & (1L<<i))) { | |
140 const char *name = get_channel_name(i); | |
141 if (name) { | |
142 if (ch>0) av_strlcat(buf, "|", buf_size); | |
143 av_strlcat(buf, name, buf_size); | |
144 } | |
145 ch++; | |
146 } | |
147 } | |
148 av_strlcat(buf, ")", buf_size); | |
149 } | |
150 } | |
151 | |
9511
c2dba7ed94dc
Check that channel layout is compatible with number of channels for
jbr
parents:
9502
diff
changeset
|
152 int avcodec_channel_layout_num_channels(int64_t channel_layout) |
c2dba7ed94dc
Check that channel layout is compatible with number of channels for
jbr
parents:
9502
diff
changeset
|
153 { |
c2dba7ed94dc
Check that channel layout is compatible with number of channels for
jbr
parents:
9502
diff
changeset
|
154 int count; |
c2dba7ed94dc
Check that channel layout is compatible with number of channels for
jbr
parents:
9502
diff
changeset
|
155 uint64_t x = channel_layout; |
c2dba7ed94dc
Check that channel layout is compatible with number of channels for
jbr
parents:
9502
diff
changeset
|
156 for (count = 0; x; count++) |
c2dba7ed94dc
Check that channel layout is compatible with number of channels for
jbr
parents:
9502
diff
changeset
|
157 x &= x-1; // unset lowest set bit |
c2dba7ed94dc
Check that channel layout is compatible with number of channels for
jbr
parents:
9502
diff
changeset
|
158 return count; |
c2dba7ed94dc
Check that channel layout is compatible with number of channels for
jbr
parents:
9502
diff
changeset
|
159 } |
c2dba7ed94dc
Check that channel layout is compatible with number of channels for
jbr
parents:
9502
diff
changeset
|
160 |
7459
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
161 struct AVAudioConvert { |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
162 int in_channels, out_channels; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
163 int fmt_pair; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
164 }; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
165 |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
166 AVAudioConvert *av_audio_convert_alloc(enum SampleFormat out_fmt, int out_channels, |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
167 enum SampleFormat in_fmt, int in_channels, |
7984 | 168 const float *matrix, int flags) |
7459
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
169 { |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
170 AVAudioConvert *ctx; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
171 if (in_channels!=out_channels) |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
172 return NULL; /* FIXME: not supported */ |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
173 ctx = av_malloc(sizeof(AVAudioConvert)); |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
174 if (!ctx) |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
175 return NULL; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
176 ctx->in_channels = in_channels; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
177 ctx->out_channels = out_channels; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
178 ctx->fmt_pair = out_fmt + SAMPLE_FMT_NB*in_fmt; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
179 return ctx; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
180 } |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
181 |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
182 void av_audio_convert_free(AVAudioConvert *ctx) |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
183 { |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
184 av_free(ctx); |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
185 } |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
186 |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
187 int av_audio_convert(AVAudioConvert *ctx, |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
188 void * const out[6], const int out_stride[6], |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
189 const void * const in[6], const int in_stride[6], int len) |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
190 { |
3594 | 191 int ch; |
192 | |
193 //FIXME optimize common cases | |
194 | |
7459
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
195 for(ch=0; ch<ctx->out_channels; ch++){ |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
196 const int is= in_stride[ch]; |
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
197 const int os= out_stride[ch]; |
8635 | 198 const uint8_t *pi= in[ch]; |
3594 | 199 uint8_t *po= out[ch]; |
7459
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
200 uint8_t *end= po + os*len; |
3594 | 201 if(!out[ch]) |
202 continue; | |
203 | |
204 #define CONV(ofmt, otype, ifmt, expr)\ | |
7459
283eeda62184
Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions.
pross
parents:
7458
diff
changeset
|
205 if(ctx->fmt_pair == ofmt + SAMPLE_FMT_NB*ifmt){\ |
3594 | 206 do{\ |
207 *(otype*)po = expr; pi += is; po += os;\ | |
208 }while(po < end);\ | |
209 } | |
210 | |
5127 | 211 //FIXME put things below under ifdefs so we do not waste space for cases no codec will need |
212 //FIXME rounding and clipping ? | |
3594 | 213 |
8635 | 214 CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_U8 , *(const uint8_t*)pi) |
215 else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<8) | |
216 else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<24) | |
217 else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0 / (1<<7))) | |
218 else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0 / (1<<7))) | |
219 else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_S16, (*(const int16_t*)pi>>8) + 0x80) | |
220 else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_S16, *(const int16_t*)pi) | |
221 else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_S16, *(const int16_t*)pi<<16) | |
222 else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0 / (1<<15))) | |
223 else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0 / (1<<15))) | |
224 else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_S32, (*(const int32_t*)pi>>24) + 0x80) | |
225 else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_S32, *(const int32_t*)pi>>16) | |
226 else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_S32, *(const int32_t*)pi) | |
227 else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1<<31))) | |
228 else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1<<31))) | |
229 else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_FLT, lrintf(*(const float*)pi * (1<<7)) + 0x80) | |
230 else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_FLT, lrintf(*(const float*)pi * (1<<15))) | |
231 else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_FLT, lrintf(*(const float*)pi * (1<<31))) | |
232 else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_FLT, *(const float*)pi) | |
233 else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_FLT, *(const float*)pi) | |
234 else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_DBL, lrint(*(const double*)pi * (1<<7)) + 0x80) | |
235 else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_DBL, lrint(*(const double*)pi * (1<<15))) | |
236 else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_DBL, lrint(*(const double*)pi * (1<<31))) | |
237 else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_DBL, *(const double*)pi) | |
238 else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_DBL, *(const double*)pi) | |
3594 | 239 else return -1; |
240 } | |
241 return 0; | |
242 } |