Mercurial > libavcodec.hg
annotate pcm.c @ 12266:48d6738904a9 libavcodec
Fix SPLATB_REG mess. Used to be a if/elseif/elseif/elseif spaghetti, so this
splits it into small optimization-specific macros which are selected for each
DSP function. The advantage of this approach is that the sse4 functions now
use the ssse3 codepath also without needing an explicit sse4 codepath.
author | rbultje |
---|---|
date | Sat, 24 Jul 2010 19:33:05 +0000 |
parents | dde20597f15e |
children |
rev | line source |
---|---|
92 | 1 /* |
2 * PCM codecs | |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8599
diff
changeset
|
3 * Copyright (c) 2001 Fabrice Bellard |
92 | 4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
429 | 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:
3036
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
92 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
92 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 * Lesser General Public License for more details. | |
92 | 16 * |
429 | 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:
3036
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
92 | 20 */ |
2967 | 21 |
1108 | 22 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11571
diff
changeset
|
23 * @file |
1108 | 24 * PCM codecs |
25 */ | |
2967 | 26 |
92 | 27 #include "avcodec.h" |
10501
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10145
diff
changeset
|
28 #include "libavutil/common.h" /* for av_reverse */ |
4959 | 29 #include "bytestream.h" |
11571 | 30 #include "pcm_tablegen.h" |
92 | 31 |
5940
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5880
diff
changeset
|
32 #define MAX_CHANNELS 64 |
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5880
diff
changeset
|
33 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
34 static av_cold int pcm_encode_init(AVCodecContext *avctx) |
92 | 35 { |
36 avctx->frame_size = 1; | |
37 switch(avctx->codec->id) { | |
38 case CODEC_ID_PCM_ALAW: | |
11571 | 39 pcm_alaw_tableinit(); |
92 | 40 break; |
41 case CODEC_ID_PCM_MULAW: | |
11571 | 42 pcm_ulaw_tableinit(); |
92 | 43 break; |
44 default: | |
45 break; | |
46 } | |
2967 | 47 |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7770
diff
changeset
|
48 avctx->bits_per_coded_sample = av_get_bits_per_sample(avctx->codec->id); |
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7770
diff
changeset
|
49 avctx->block_align = avctx->channels * avctx->bits_per_coded_sample/8; |
925 | 50 avctx->coded_frame= avcodec_alloc_frame(); |
51 avctx->coded_frame->key_frame= 1; | |
2967 | 52 |
92 | 53 return 0; |
54 } | |
55 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
56 static av_cold int pcm_encode_close(AVCodecContext *avctx) |
92 | 57 { |
925 | 58 av_freep(&avctx->coded_frame); |
59 | |
92 | 60 return 0; |
61 } | |
62 | |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
63 /** |
7519 | 64 * Write PCM samples macro |
65 * @param type Datatype of native machine format | |
66 * @param endian bytestream_put_xxx() suffix | |
67 * @param src Source pointer (variable name) | |
68 * @param dst Destination pointer (variable name) | |
69 * @param n Total number of samples (variable name) | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
70 * @param shift Bitshift (bits) |
7519 | 71 * @param offset Sample value offset |
72 */ | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
73 #define ENCODE(type, endian, src, dst, n, shift, offset) \ |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
74 samples_##type = (type*)src; \ |
7519 | 75 for(;n>0;n--) { \ |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
76 register type v = (*samples_##type++ >> shift) + offset; \ |
7519 | 77 bytestream_put_##endian(&dst, v); \ |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
78 } |
7519 | 79 |
440
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
429
diff
changeset
|
80 static int pcm_encode_frame(AVCodecContext *avctx, |
2979 | 81 unsigned char *frame, int buf_size, void *data) |
92 | 82 { |
83 int n, sample_size, v; | |
12262
dde20597f15e
Use "const" qualifier for pointers that point to input data of
reimar
parents:
12171
diff
changeset
|
84 const short *samples; |
92 | 85 unsigned char *dst; |
12262
dde20597f15e
Use "const" qualifier for pointers that point to input data of
reimar
parents:
12171
diff
changeset
|
86 const uint8_t *srcu8; |
dde20597f15e
Use "const" qualifier for pointers that point to input data of
reimar
parents:
12171
diff
changeset
|
87 const int16_t *samples_int16_t; |
dde20597f15e
Use "const" qualifier for pointers that point to input data of
reimar
parents:
12171
diff
changeset
|
88 const int32_t *samples_int32_t; |
dde20597f15e
Use "const" qualifier for pointers that point to input data of
reimar
parents:
12171
diff
changeset
|
89 const int64_t *samples_int64_t; |
dde20597f15e
Use "const" qualifier for pointers that point to input data of
reimar
parents:
12171
diff
changeset
|
90 const uint16_t *samples_uint16_t; |
dde20597f15e
Use "const" qualifier for pointers that point to input data of
reimar
parents:
12171
diff
changeset
|
91 const uint32_t *samples_uint32_t; |
92 | 92 |
7477
2f6a2fd238fb
Simplify PCM codec; replace switch() statements with av_get_bits_per_sample().
pross
parents:
7476
diff
changeset
|
93 sample_size = av_get_bits_per_sample(avctx->codec->id)/8; |
92 | 94 n = buf_size / sample_size; |
95 samples = data; | |
96 dst = frame; | |
97 | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
98 if (avctx->sample_fmt!=avctx->codec->sample_fmts[0]) { |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
99 av_log(avctx, AV_LOG_ERROR, "invalid sample_fmt\n"); |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
100 return -1; |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
101 } |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
102 |
92 | 103 switch(avctx->codec->id) { |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
104 case CODEC_ID_PCM_U32LE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
105 ENCODE(uint32_t, le32, samples, dst, n, 0, 0x80000000) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
106 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
107 case CODEC_ID_PCM_U32BE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
108 ENCODE(uint32_t, be32, samples, dst, n, 0, 0x80000000) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
109 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
110 case CODEC_ID_PCM_S24LE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
111 ENCODE(int32_t, le24, samples, dst, n, 8, 0) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
112 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
113 case CODEC_ID_PCM_S24BE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
114 ENCODE(int32_t, be24, samples, dst, n, 8, 0) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
115 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
116 case CODEC_ID_PCM_U24LE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
117 ENCODE(uint32_t, le24, samples, dst, n, 8, 0x800000) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
118 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
119 case CODEC_ID_PCM_U24BE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
120 ENCODE(uint32_t, be24, samples, dst, n, 8, 0x800000) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
121 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
122 case CODEC_ID_PCM_S24DAUD: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
123 for(;n>0;n--) { |
10501
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10145
diff
changeset
|
124 uint32_t tmp = av_reverse[(*samples >> 8) & 0xff] + |
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10145
diff
changeset
|
125 (av_reverse[*samples & 0xff] << 8); |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
126 tmp <<= 4; // sync flags would go here |
4959 | 127 bytestream_put_be24(&dst, tmp); |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
128 samples++; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
129 } |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
130 break; |
92 | 131 case CODEC_ID_PCM_U16LE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
132 ENCODE(uint16_t, le16, samples, dst, n, 0, 0x8000) |
92 | 133 break; |
134 case CODEC_ID_PCM_U16BE: | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
135 ENCODE(uint16_t, be16, samples, dst, n, 0, 0x8000) |
92 | 136 break; |
137 case CODEC_ID_PCM_S8: | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
138 srcu8= data; |
92 | 139 for(;n>0;n--) { |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
140 v = *srcu8++; |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
141 *dst++ = v - 128; |
92 | 142 } |
143 break; | |
9985 | 144 #if HAVE_BIGENDIAN |
7613 | 145 case CODEC_ID_PCM_F64LE: |
146 ENCODE(int64_t, le64, samples, dst, n, 0, 0) | |
147 break; | |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
148 case CODEC_ID_PCM_S32LE: |
7613 | 149 case CODEC_ID_PCM_F32LE: |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
150 ENCODE(int32_t, le32, samples, dst, n, 0, 0) |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
151 break; |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
152 case CODEC_ID_PCM_S16LE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
153 ENCODE(int16_t, le16, samples, dst, n, 0, 0) |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
154 break; |
7613 | 155 case CODEC_ID_PCM_F64BE: |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
156 case CODEC_ID_PCM_F32BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
157 case CODEC_ID_PCM_S32BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
158 case CODEC_ID_PCM_S16BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
159 #else |
7613 | 160 case CODEC_ID_PCM_F64BE: |
161 ENCODE(int64_t, be64, samples, dst, n, 0, 0) | |
162 break; | |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
163 case CODEC_ID_PCM_F32BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
164 case CODEC_ID_PCM_S32BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
165 ENCODE(int32_t, be32, samples, dst, n, 0, 0) |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
166 break; |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
167 case CODEC_ID_PCM_S16BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
168 ENCODE(int16_t, be16, samples, dst, n, 0, 0) |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
169 break; |
7613 | 170 case CODEC_ID_PCM_F64LE: |
171 case CODEC_ID_PCM_F32LE: | |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
172 case CODEC_ID_PCM_S32LE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
173 case CODEC_ID_PCM_S16LE: |
9985 | 174 #endif /* HAVE_BIGENDIAN */ |
92 | 175 case CODEC_ID_PCM_U8: |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
176 memcpy(dst, samples, n*sample_size); |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
177 dst += n*sample_size; |
92 | 178 break; |
5422 | 179 case CODEC_ID_PCM_ZORK: |
180 for(;n>0;n--) { | |
181 v= *samples++ >> 8; | |
182 if(v<0) v = -v; | |
183 else v+= 128; | |
184 *dst++ = v; | |
185 } | |
186 break; | |
92 | 187 case CODEC_ID_PCM_ALAW: |
188 for(;n>0;n--) { | |
189 v = *samples++; | |
4960 | 190 *dst++ = linear_to_alaw[(v + 32768) >> 2]; |
92 | 191 } |
192 break; | |
193 case CODEC_ID_PCM_MULAW: | |
194 for(;n>0;n--) { | |
195 v = *samples++; | |
4960 | 196 *dst++ = linear_to_ulaw[(v + 32768) >> 2]; |
92 | 197 } |
198 break; | |
199 default: | |
200 return -1; | |
201 } | |
381
0d6178e4d503
* Mea culpa: it seems that I broke encoding to 8-bit pcm files. This fixes it.
philipjsg
parents:
372
diff
changeset
|
202 //avctx->frame_size = (dst - frame) / (sample_size * avctx->channels); |
372 | 203 |
92 | 204 return dst - frame; |
205 } | |
206 | |
207 typedef struct PCMDecode { | |
208 short table[256]; | |
209 } PCMDecode; | |
210 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
211 static av_cold int pcm_decode_init(AVCodecContext * avctx) |
92 | 212 { |
213 PCMDecode *s = avctx->priv_data; | |
214 int i; | |
215 | |
216 switch(avctx->codec->id) { | |
217 case CODEC_ID_PCM_ALAW: | |
218 for(i=0;i<256;i++) | |
219 s->table[i] = alaw2linear(i); | |
220 break; | |
221 case CODEC_ID_PCM_MULAW: | |
222 for(i=0;i<256;i++) | |
223 s->table[i] = ulaw2linear(i); | |
224 break; | |
225 default: | |
226 break; | |
227 } | |
7409
21770337ff2d
add CODEC_ID_PCM_F32BE (32-bit floating point PCM big endian decoder)
pross
parents:
7197
diff
changeset
|
228 |
7476
2321e0384521
Simplify PCM codec; use sample_fmts field to set the avctx->sample_fmt field.
pross
parents:
7451
diff
changeset
|
229 avctx->sample_fmt = avctx->codec->sample_fmts[0]; |
11863 | 230 |
231 if (avctx->sample_fmt == SAMPLE_FMT_S32) | |
232 avctx->bits_per_raw_sample = av_get_bits_per_sample(avctx->codec->id); | |
233 | |
92 | 234 return 0; |
235 } | |
236 | |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
237 /** |
7519 | 238 * Read PCM samples macro |
239 * @param type Datatype of native machine format | |
240 * @param endian bytestream_get_xxx() endian suffix | |
241 * @param src Source pointer (variable name) | |
242 * @param dst Destination pointer (variable name) | |
243 * @param n Total number of samples (variable name) | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
244 * @param shift Bitshift (bits) |
7519 | 245 * @param offset Sample value offset |
246 */ | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
247 #define DECODE(type, endian, src, dst, n, shift, offset) \ |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
248 dst_##type = (type*)dst; \ |
7519 | 249 for(;n>0;n--) { \ |
250 register type v = bytestream_get_##endian(&src); \ | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
251 *dst_##type++ = (v - offset) << shift; \ |
7519 | 252 } \ |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
253 dst = (short*)dst_##type; |
7519 | 254 |
440
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
429
diff
changeset
|
255 static int pcm_decode_frame(AVCodecContext *avctx, |
2979 | 256 void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9086
diff
changeset
|
257 AVPacket *avpkt) |
92 | 258 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9086
diff
changeset
|
259 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9086
diff
changeset
|
260 int buf_size = avpkt->size; |
92 | 261 PCMDecode *s = avctx->priv_data; |
7518
a40c76e98909
Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
pross
parents:
7517
diff
changeset
|
262 int sample_size, c, n; |
92 | 263 short *samples; |
7677
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
264 const uint8_t *src, *src8, *src2[MAX_CHANNELS]; |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
265 uint8_t *dstu8; |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
266 int16_t *dst_int16_t; |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
267 int32_t *dst_int32_t; |
7613 | 268 int64_t *dst_int64_t; |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
269 uint16_t *dst_uint16_t; |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
270 uint32_t *dst_uint32_t; |
92 | 271 |
272 samples = data; | |
273 src = buf; | |
274 | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
275 if (avctx->sample_fmt!=avctx->codec->sample_fmts[0]) { |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
276 av_log(avctx, AV_LOG_ERROR, "invalid sample_fmt\n"); |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
277 return -1; |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
278 } |
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
279 |
6821
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
280 if(avctx->channels <= 0 || avctx->channels > MAX_CHANNELS){ |
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
281 av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n"); |
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
282 return -1; |
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
283 } |
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
284 |
7518
a40c76e98909
Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
pross
parents:
7517
diff
changeset
|
285 sample_size = av_get_bits_per_sample(avctx->codec_id)/8; |
a40c76e98909
Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
pross
parents:
7517
diff
changeset
|
286 |
6821
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
287 /* av_get_bits_per_sample returns 0 for CODEC_ID_PCM_DVD */ |
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
288 if (CODEC_ID_PCM_DVD == avctx->codec_id) |
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
289 /* 2 samples are interleaved per block in PCM_DVD */ |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7770
diff
changeset
|
290 sample_size = avctx->bits_per_coded_sample * 2 / 8; |
7628
2f5ed95d1039
Fix PCM DVD divide by zero bug introduced in r14659. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7613
diff
changeset
|
291 |
2f5ed95d1039
Fix PCM DVD divide by zero bug introduced in r14659. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7613
diff
changeset
|
292 n = avctx->channels * sample_size; |
6821
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
293 |
6033
bd7600c7a061
Fix crash in PCM decoder when number of channels is not set.
benoit
parents:
5944
diff
changeset
|
294 if(n && buf_size % n){ |
9514 | 295 if (buf_size < n) { |
9515 | 296 av_log(avctx, AV_LOG_ERROR, "invalid PCM packet\n"); |
297 return -1; | |
9514 | 298 }else |
299 buf_size -= buf_size % n; | |
4506 | 300 } |
301 | |
4351 | 302 buf_size= FFMIN(buf_size, *data_size/2); |
303 *data_size=0; | |
2506 | 304 |
7518
a40c76e98909
Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
pross
parents:
7517
diff
changeset
|
305 n = buf_size/sample_size; |
5940
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5880
diff
changeset
|
306 |
92 | 307 switch(avctx->codec->id) { |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
308 case CODEC_ID_PCM_U32LE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
309 DECODE(uint32_t, le32, src, samples, n, 0, 0x80000000) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
310 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
311 case CODEC_ID_PCM_U32BE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
312 DECODE(uint32_t, be32, src, samples, n, 0, 0x80000000) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
313 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
314 case CODEC_ID_PCM_S24LE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
315 DECODE(int32_t, le24, src, samples, n, 8, 0) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
316 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
317 case CODEC_ID_PCM_S24BE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
318 DECODE(int32_t, be24, src, samples, n, 8, 0) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
319 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
320 case CODEC_ID_PCM_U24LE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
321 DECODE(uint32_t, le24, src, samples, n, 8, 0x800000) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
322 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
323 case CODEC_ID_PCM_U24BE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
324 DECODE(uint32_t, be24, src, samples, n, 8, 0x800000) |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
325 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
326 case CODEC_ID_PCM_S24DAUD: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
327 for(;n>0;n--) { |
4959 | 328 uint32_t v = bytestream_get_be24(&src); |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
329 v >>= 4; // sync flags are here |
10501
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10145
diff
changeset
|
330 *samples++ = av_reverse[(v >> 8) & 0xff] + |
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10145
diff
changeset
|
331 (av_reverse[v & 0xff] << 8); |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
332 } |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2506
diff
changeset
|
333 break; |
5940
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5880
diff
changeset
|
334 case CODEC_ID_PCM_S16LE_PLANAR: |
7518
a40c76e98909
Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
pross
parents:
7517
diff
changeset
|
335 n /= avctx->channels; |
a40c76e98909
Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
pross
parents:
7517
diff
changeset
|
336 for(c=0;c<avctx->channels;c++) |
7611
a909361cdfc4
Fix PCM_S16LE_PLANAR channel-address calculation bug introduced in r14659.
pross
parents:
7583
diff
changeset
|
337 src2[c] = &src[c*n*2]; |
a909361cdfc4
Fix PCM_S16LE_PLANAR channel-address calculation bug introduced in r14659.
pross
parents:
7583
diff
changeset
|
338 for(;n>0;n--) |
5940
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5880
diff
changeset
|
339 for(c=0;c<avctx->channels;c++) |
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5880
diff
changeset
|
340 *samples++ = bytestream_get_le16(&src2[c]); |
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5880
diff
changeset
|
341 src = src2[avctx->channels-1]; |
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5880
diff
changeset
|
342 break; |
92 | 343 case CODEC_ID_PCM_U16LE: |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
344 DECODE(uint16_t, le16, src, samples, n, 0, 0x8000) |
92 | 345 break; |
346 case CODEC_ID_PCM_U16BE: | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
347 DECODE(uint16_t, be16, src, samples, n, 0, 0x8000) |
92 | 348 break; |
349 case CODEC_ID_PCM_S8: | |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
350 dstu8= (uint8_t*)samples; |
92 | 351 for(;n>0;n--) { |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
352 *dstu8++ = *src++ + 128; |
92 | 353 } |
7537
4801922896e7
Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents:
7519
diff
changeset
|
354 samples= (short*)dstu8; |
92 | 355 break; |
9985 | 356 #if HAVE_BIGENDIAN |
7613 | 357 case CODEC_ID_PCM_F64LE: |
358 DECODE(int64_t, le64, src, samples, n, 0, 0) | |
359 break; | |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
360 case CODEC_ID_PCM_S32LE: |
7613 | 361 case CODEC_ID_PCM_F32LE: |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
362 DECODE(int32_t, le32, src, samples, n, 0, 0) |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
363 break; |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
364 case CODEC_ID_PCM_S16LE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
365 DECODE(int16_t, le16, src, samples, n, 0, 0) |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
366 break; |
7613 | 367 case CODEC_ID_PCM_F64BE: |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
368 case CODEC_ID_PCM_F32BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
369 case CODEC_ID_PCM_S32BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
370 case CODEC_ID_PCM_S16BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
371 #else |
7613 | 372 case CODEC_ID_PCM_F64BE: |
373 DECODE(int64_t, be64, src, samples, n, 0, 0) | |
374 break; | |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
375 case CODEC_ID_PCM_F32BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
376 case CODEC_ID_PCM_S32BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
377 DECODE(int32_t, be32, src, samples, n, 0, 0) |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
378 break; |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
379 case CODEC_ID_PCM_S16BE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
380 DECODE(int16_t, be16, src, samples, n, 0, 0) |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
381 break; |
7613 | 382 case CODEC_ID_PCM_F64LE: |
383 case CODEC_ID_PCM_F32LE: | |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
384 case CODEC_ID_PCM_S32LE: |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
385 case CODEC_ID_PCM_S16LE: |
9985 | 386 #endif /* HAVE_BIGENDIAN */ |
92 | 387 case CODEC_ID_PCM_U8: |
7583
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
388 memcpy(samples, src, n*sample_size); |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
389 src += n*sample_size; |
2a3f40605dec
Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents:
7551
diff
changeset
|
390 samples = (short*)((uint8_t*)data + n*sample_size); |
92 | 391 break; |
5422 | 392 case CODEC_ID_PCM_ZORK: |
393 for(;n>0;n--) { | |
394 int x= *src++; | |
395 if(x&128) x-= 128; | |
396 else x = -x; | |
397 *samples++ = x << 8; | |
398 } | |
399 break; | |
92 | 400 case CODEC_ID_PCM_ALAW: |
401 case CODEC_ID_PCM_MULAW: | |
402 for(;n>0;n--) { | |
4960 | 403 *samples++ = s->table[*src++]; |
92 | 404 } |
405 break; | |
6821
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
406 case CODEC_ID_PCM_DVD: |
7677
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
407 dst_int32_t = data; |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
408 n /= avctx->channels; |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7770
diff
changeset
|
409 switch (avctx->bits_per_coded_sample) { |
7677
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
410 case 20: |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
411 while (n--) { |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
412 c = avctx->channels; |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
413 src8 = src + 4*c; |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
414 while (c--) { |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
415 *dst_int32_t++ = (bytestream_get_be16(&src) << 16) + ((*src8 &0xf0) << 8); |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
416 *dst_int32_t++ = (bytestream_get_be16(&src) << 16) + ((*src8++ &0x0f) << 12); |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
417 } |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
418 src = src8; |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
419 } |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
420 break; |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
421 case 24: |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
422 while (n--) { |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
423 c = avctx->channels; |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
424 src8 = src + 4*c; |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
425 while (c--) { |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
426 *dst_int32_t++ = (bytestream_get_be16(&src) << 16) + ((*src8++) << 8); |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
427 *dst_int32_t++ = (bytestream_get_be16(&src) << 16) + ((*src8++) << 8); |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
428 } |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
429 src = src8; |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
430 } |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
431 break; |
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
432 default: |
6821
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
433 av_log(avctx, AV_LOG_ERROR, "PCM DVD unsupported sample depth\n"); |
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
434 return -1; |
7677
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
435 break; |
6821
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
436 } |
7677
3db125934e60
Upgrade 20/24-bit PCM DVD decoder use SAMPLE_FMT_S32. Patch supplied by lars dot taeuber at gmx dot net.
pross
parents:
7628
diff
changeset
|
437 samples = (short *) dst_int32_t; |
6821
1b9c458d6d60
LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents:
6817
diff
changeset
|
438 break; |
92 | 439 default: |
440 return -1; | |
441 } | |
1064 | 442 *data_size = (uint8_t *)samples - (uint8_t *)data; |
92 | 443 return src - buf; |
444 } | |
445 | |
8590 | 446 #if CONFIG_ENCODERS |
12171 | 447 #define PCM_ENCODER(id_,sample_fmt_,name_,long_name_) \ |
448 AVCodec name_ ## _encoder = { \ | |
449 .name = #name_, \ | |
450 .type = AVMEDIA_TYPE_AUDIO, \ | |
451 .id = id_, \ | |
452 .init = pcm_encode_init, \ | |
453 .encode = pcm_encode_frame, \ | |
454 .close = pcm_encode_close, \ | |
10145
7955db355703
Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents:
9985
diff
changeset
|
455 .sample_fmts = (const enum SampleFormat[]){sample_fmt_,SAMPLE_FMT_NONE}, \ |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6821
diff
changeset
|
456 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \ |
5880
6814207ffb27
split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents:
5861
diff
changeset
|
457 }; |
6814207ffb27
split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents:
5861
diff
changeset
|
458 #else |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7409
diff
changeset
|
459 #define PCM_ENCODER(id,sample_fmt_,name,long_name_) |
5880
6814207ffb27
split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents:
5861
diff
changeset
|
460 #endif |
6814207ffb27
split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents:
5861
diff
changeset
|
461 |
8590 | 462 #if CONFIG_DECODERS |
12171 | 463 #define PCM_DECODER(id_,sample_fmt_,name_,long_name_) \ |
464 AVCodec name_ ## _decoder = { \ | |
465 .name = #name_, \ | |
466 .type = AVMEDIA_TYPE_AUDIO, \ | |
467 .id = id_, \ | |
468 .priv_data_size = sizeof(PCMDecode), \ | |
469 .init = pcm_decode_init, \ | |
470 .decode = pcm_decode_frame, \ | |
10145
7955db355703
Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents:
9985
diff
changeset
|
471 .sample_fmts = (const enum SampleFormat[]){sample_fmt_,SAMPLE_FMT_NONE}, \ |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6821
diff
changeset
|
472 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \ |
5880
6814207ffb27
split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents:
5861
diff
changeset
|
473 }; |
6814207ffb27
split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents:
5861
diff
changeset
|
474 #else |
7476
2321e0384521
Simplify PCM codec; use sample_fmts field to set the avctx->sample_fmt field.
pross
parents:
7451
diff
changeset
|
475 #define PCM_DECODER(id,sample_fmt_,name,long_name_) |
5880
6814207ffb27
split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents:
5861
diff
changeset
|
476 #endif |
6814207ffb27
split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents:
5861
diff
changeset
|
477 |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7409
diff
changeset
|
478 #define PCM_CODEC(id, sample_fmt_, name, long_name_) \ |
7476
2321e0384521
Simplify PCM codec; use sample_fmts field to set the avctx->sample_fmt field.
pross
parents:
7451
diff
changeset
|
479 PCM_ENCODER(id,sample_fmt_,name,long_name_) PCM_DECODER(id,sample_fmt_,name,long_name_) |
92 | 480 |
7197
54f8d960f15b
Add a note to remind people that new PCM/ADPCM formats need to be added to
diego
parents:
7040
diff
changeset
|
481 /* Note: Do not forget to add new entries to the Makefile as well. */ |
9086
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
482 PCM_CODEC (CODEC_ID_PCM_ALAW, SAMPLE_FMT_S16, pcm_alaw, "PCM A-law"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
483 PCM_CODEC (CODEC_ID_PCM_DVD, SAMPLE_FMT_S32, pcm_dvd, "PCM signed 20|24-bit big-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
484 PCM_CODEC (CODEC_ID_PCM_F32BE, SAMPLE_FMT_FLT, pcm_f32be, "PCM 32-bit floating point big-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
485 PCM_CODEC (CODEC_ID_PCM_F32LE, SAMPLE_FMT_FLT, pcm_f32le, "PCM 32-bit floating point little-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
486 PCM_CODEC (CODEC_ID_PCM_F64BE, SAMPLE_FMT_DBL, pcm_f64be, "PCM 64-bit floating point big-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
487 PCM_CODEC (CODEC_ID_PCM_F64LE, SAMPLE_FMT_DBL, pcm_f64le, "PCM 64-bit floating point little-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
488 PCM_CODEC (CODEC_ID_PCM_MULAW, SAMPLE_FMT_S16, pcm_mulaw, "PCM mu-law"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
489 PCM_CODEC (CODEC_ID_PCM_S8, SAMPLE_FMT_U8, pcm_s8, "PCM signed 8-bit"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
490 PCM_CODEC (CODEC_ID_PCM_S16BE, SAMPLE_FMT_S16, pcm_s16be, "PCM signed 16-bit big-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
491 PCM_CODEC (CODEC_ID_PCM_S16LE, SAMPLE_FMT_S16, pcm_s16le, "PCM signed 16-bit little-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
492 PCM_DECODER(CODEC_ID_PCM_S16LE_PLANAR, SAMPLE_FMT_S16, pcm_s16le_planar, "PCM 16-bit little-endian planar"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
493 PCM_CODEC (CODEC_ID_PCM_S24BE, SAMPLE_FMT_S32, pcm_s24be, "PCM signed 24-bit big-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
494 PCM_CODEC (CODEC_ID_PCM_S24DAUD, SAMPLE_FMT_S16, pcm_s24daud, "PCM D-Cinema audio signed 24-bit"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
495 PCM_CODEC (CODEC_ID_PCM_S24LE, SAMPLE_FMT_S32, pcm_s24le, "PCM signed 24-bit little-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
496 PCM_CODEC (CODEC_ID_PCM_S32BE, SAMPLE_FMT_S32, pcm_s32be, "PCM signed 32-bit big-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
497 PCM_CODEC (CODEC_ID_PCM_S32LE, SAMPLE_FMT_S32, pcm_s32le, "PCM signed 32-bit little-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
498 PCM_CODEC (CODEC_ID_PCM_U8, SAMPLE_FMT_U8, pcm_u8, "PCM unsigned 8-bit"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
499 PCM_CODEC (CODEC_ID_PCM_U16BE, SAMPLE_FMT_S16, pcm_u16be, "PCM unsigned 16-bit big-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
500 PCM_CODEC (CODEC_ID_PCM_U16LE, SAMPLE_FMT_S16, pcm_u16le, "PCM unsigned 16-bit little-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
501 PCM_CODEC (CODEC_ID_PCM_U24BE, SAMPLE_FMT_S32, pcm_u24be, "PCM unsigned 24-bit big-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
502 PCM_CODEC (CODEC_ID_PCM_U24LE, SAMPLE_FMT_S32, pcm_u24le, "PCM unsigned 24-bit little-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
503 PCM_CODEC (CODEC_ID_PCM_U32BE, SAMPLE_FMT_S32, pcm_u32be, "PCM unsigned 32-bit big-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
504 PCM_CODEC (CODEC_ID_PCM_U32LE, SAMPLE_FMT_S32, pcm_u32le, "PCM unsigned 32-bit little-endian"); |
e1b522d24270
cosmetics: Reformat long_names so that "PCM" comes first.
diego
parents:
8718
diff
changeset
|
505 PCM_CODEC (CODEC_ID_PCM_ZORK, SAMPLE_FMT_S16, pcm_zork, "PCM Zork"); |