annotate pcm.c @ 9473:e38284cd69dc libavcodec

Use memcpy instead of the very inefficient bytecopy where both are correct (i.e. no overlap of src and dst is possible).
author reimar
date Fri, 17 Apr 2009 17:20:48 +0000
parents 0dce4fe6e6f3
children 446bc9d714b1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
1 /*
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
15 * Lesser General Public License for more details.
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
16 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2853
diff changeset
21
1108
bfc18110d4b6 typos & cosmetics
michaelni
parents: 1064
diff changeset
22 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8629
diff changeset
23 * @file libavcodec/pcm.c
1108
bfc18110d4b6 typos & cosmetics
michaelni
parents: 1064
diff changeset
24 * PCM codecs
bfc18110d4b6 typos & cosmetics
michaelni
parents: 1064
diff changeset
25 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2853
diff changeset
26
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
27 #include "avcodec.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
28 #include "get_bits.h" // for ff_reverse
4959
e00e16be833a Use bytestream
ramiro
parents: 4958
diff changeset
29 #include "bytestream.h"
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
30
5940
d63186919b60 add pcm_s16le_planar support for electronicarts files
aurel
parents: 5880
diff changeset
31 #define MAX_CHANNELS 64
d63186919b60 add pcm_s16le_planar support for electronicarts files
aurel
parents: 5880
diff changeset
32
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
33 /* from g711.c by SUN microsystems (unrestricted use) */
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
34
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
35 #define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
36 #define QUANT_MASK (0xf) /* Quantization field mask. */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
37 #define NSEGS (8) /* Number of A-law segments. */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
38 #define SEG_SHIFT (4) /* Left shift for segment number. */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
39 #define SEG_MASK (0x70) /* Segment field mask. */
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
40
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
41 #define BIAS (0x84) /* Bias for linear code. */
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
42
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
43 /*
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
44 * alaw2linear() - Convert an A-law value to 16-bit linear PCM
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
45 *
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
46 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
47 static av_cold int alaw2linear(unsigned char a_val)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
48 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
49 int t;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
50 int seg;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
51
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
52 a_val ^= 0x55;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
53
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
54 t = a_val & QUANT_MASK;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
55 seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
56 if(seg) t= (t + t + 1 + 32) << (seg + 2);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
57 else t= (t + t + 1 ) << 3;
1485
d7bb818768c5 simpler
michaelni
parents: 1108
diff changeset
58
6750
c93570aeb3eb Remove unnecessary parentheses from return calls.
diego
parents: 6637
diff changeset
59 return (a_val & SIGN_BIT) ? t : -t;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
60 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
61
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
62 static av_cold int ulaw2linear(unsigned char u_val)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
63 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
64 int t;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
65
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
66 /* Complement to obtain normal u-law value. */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
67 u_val = ~u_val;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
68
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
69 /*
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
70 * Extract and bias the quantization bits. Then
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
71 * shift up by the segment number and subtract out the bias.
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
72 */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
73 t = ((u_val & QUANT_MASK) << 3) + BIAS;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
74 t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
75
6750
c93570aeb3eb Remove unnecessary parentheses from return calls.
diego
parents: 6637
diff changeset
76 return (u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS);
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
77 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
78
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
79 /* 16384 entries per table */
4660
c800e1a03b9c 10^10l to whoever wrote this
michael
parents: 4506
diff changeset
80 static uint8_t linear_to_alaw[16384];
c800e1a03b9c 10^10l to whoever wrote this
michael
parents: 4506
diff changeset
81 static uint8_t linear_to_ulaw[16384];
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
82
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
83 static av_cold void build_xlaw_table(uint8_t *linear_to_xlaw,
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
84 int (*xlaw2linear)(unsigned char),
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2853
diff changeset
85 int mask)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
86 {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
87 int i, j, v, v1, v2;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
88
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
89 j = 0;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
90 for(i=0;i<128;i++) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
91 if (i != 127) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
92 v1 = xlaw2linear(i ^ mask);
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
93 v2 = xlaw2linear((i + 1) ^ mask);
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
94 v = (v1 + v2 + 4) >> 3;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
95 } else {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
96 v = 8192;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
97 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
98 for(;j<v;j++) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
99 linear_to_xlaw[8192 + j] = (i ^ mask);
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
100 if (j > 0)
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
101 linear_to_xlaw[8192 - j] = (i ^ (mask ^ 0x80));
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
102 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
103 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
104 linear_to_xlaw[0] = linear_to_xlaw[1];
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
105 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
106
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
107 static av_cold int pcm_encode_init(AVCodecContext *avctx)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
108 {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
109 avctx->frame_size = 1;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
110 switch(avctx->codec->id) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
111 case CODEC_ID_PCM_ALAW:
4660
c800e1a03b9c 10^10l to whoever wrote this
michael
parents: 4506
diff changeset
112 build_xlaw_table(linear_to_alaw, alaw2linear, 0xd5);
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
113 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
114 case CODEC_ID_PCM_MULAW:
4660
c800e1a03b9c 10^10l to whoever wrote this
michael
parents: 4506
diff changeset
115 build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff);
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
116 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
117 default:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
118 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
119 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2853
diff changeset
120
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7770
diff changeset
121 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
122 avctx->block_align = avctx->channels * avctx->bits_per_coded_sample/8;
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 649
diff changeset
123 avctx->coded_frame= avcodec_alloc_frame();
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 649
diff changeset
124 avctx->coded_frame->key_frame= 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2853
diff changeset
125
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
126 return 0;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
127 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
128
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
129 static av_cold int pcm_encode_close(AVCodecContext *avctx)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
130 {
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 649
diff changeset
131 av_freep(&avctx->coded_frame);
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 649
diff changeset
132
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
133 return 0;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
134 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
135
2852
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
136 /**
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
137 * Write PCM samples macro
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
138 * @param type Datatype of native machine format
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
139 * @param endian bytestream_put_xxx() suffix
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
140 * @param src Source pointer (variable name)
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
141 * @param dst Destination pointer (variable name)
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
142 * @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
143 * @param shift Bitshift (bits)
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
144 * @param offset Sample value offset
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
145 */
7537
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
146 #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
147 samples_##type = (type*)src; \
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
148 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
149 register type v = (*samples_##type++ >> shift) + offset; \
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
150 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
151 }
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
152
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 429
diff changeset
153 static int pcm_encode_frame(AVCodecContext *avctx,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
154 unsigned char *frame, int buf_size, void *data)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
155 {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
156 int n, sample_size, v;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
157 short *samples;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
158 unsigned char *dst;
7537
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
159 uint8_t *srcu8;
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
160 int16_t *samples_int16_t;
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
161 int32_t *samples_int32_t;
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
162 int64_t *samples_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
163 uint16_t *samples_uint16_t;
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
164 uint32_t *samples_uint32_t;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
165
7477
2f6a2fd238fb Simplify PCM codec; replace switch() statements with av_get_bits_per_sample().
pross
parents: 7476
diff changeset
166 sample_size = av_get_bits_per_sample(avctx->codec->id)/8;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
167 n = buf_size / sample_size;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
168 samples = data;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
169 dst = frame;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
170
7537
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
171 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
172 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
173 return -1;
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
174 }
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
175
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
176 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
177 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
178 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
179 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
180 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
181 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
182 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
183 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
184 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
185 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
186 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
187 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
188 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
189 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
190 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
191 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
192 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
193 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
194 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
195 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
196 for(;n>0;n--) {
7517
d4e19b465fcb Prevent DAUD PCM encoder from fetching values outside of ff_reverse[] array bounds when input sample values are < 0.
pross
parents: 7477
diff changeset
197 uint32_t tmp = ff_reverse[(*samples >> 8) & 0xff] +
2852
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
198 (ff_reverse[*samples & 0xff] << 8);
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
199 tmp <<= 4; // sync flags would go here
4959
e00e16be833a Use bytestream
ramiro
parents: 4958
diff changeset
200 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
201 samples++;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
202 }
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
203 break;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
204 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
205 ENCODE(uint16_t, le16, samples, dst, n, 0, 0x8000)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
206 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
207 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
208 ENCODE(uint16_t, be16, samples, dst, n, 0, 0x8000)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
209 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
210 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
211 srcu8= data;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
212 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
213 v = *srcu8++;
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
214 *dst++ = v - 128;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
215 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
216 break;
8599
db00335551ca WORDS_BIGENDIAN must be checked with #ifdef
aurel
parents: 8590
diff changeset
217 #ifdef WORDS_BIGENDIAN
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
218 case CODEC_ID_PCM_F64LE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
219 ENCODE(int64_t, le64, samples, dst, n, 0, 0)
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
220 break;
7583
2a3f40605dec Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents: 7551
diff changeset
221 case CODEC_ID_PCM_S32LE:
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
222 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
223 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
224 break;
2a3f40605dec Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents: 7551
diff changeset
225 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
226 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
227 break;
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
228 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
229 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
230 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
231 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
232 #else
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
233 case CODEC_ID_PCM_F64BE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
234 ENCODE(int64_t, be64, samples, dst, n, 0, 0)
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
235 break;
7583
2a3f40605dec Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents: 7551
diff changeset
236 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
237 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
238 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
239 break;
2a3f40605dec Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents: 7551
diff changeset
240 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
241 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
242 break;
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
243 case CODEC_ID_PCM_F64LE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
244 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
245 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
246 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
247 #endif /* WORDS_BIGENDIAN */
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
248 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
249 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
250 dst += n*sample_size;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
251 break;
5422
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
252 case CODEC_ID_PCM_ZORK:
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
253 for(;n>0;n--) {
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
254 v= *samples++ >> 8;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
255 if(v<0) v = -v;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
256 else v+= 128;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
257 *dst++ = v;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
258 }
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
259 break;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
260 case CODEC_ID_PCM_ALAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
261 for(;n>0;n--) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
262 v = *samples++;
4960
1745d0452e87 Simplify ptr[0]; ptr++; to *ptr++
ramiro
parents: 4959
diff changeset
263 *dst++ = linear_to_alaw[(v + 32768) >> 2];
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
264 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
265 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
266 case CODEC_ID_PCM_MULAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
267 for(;n>0;n--) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
268 v = *samples++;
4960
1745d0452e87 Simplify ptr[0]; ptr++; to *ptr++
ramiro
parents: 4959
diff changeset
269 *dst++ = linear_to_ulaw[(v + 32768) >> 2];
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
270 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
271 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
272 default:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
273 return -1;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
274 }
381
0d6178e4d503 * Mea culpa: it seems that I broke encoding to 8-bit pcm files. This fixes it.
philipjsg
parents: 372
diff changeset
275 //avctx->frame_size = (dst - frame) / (sample_size * avctx->channels);
372
19b6a1fa6f6d * Every frame is a key_frame
philipjsg
parents: 92
diff changeset
276
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
277 return dst - frame;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
278 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
279
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
280 typedef struct PCMDecode {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
281 short table[256];
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
282 } PCMDecode;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
283
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
284 static av_cold int pcm_decode_init(AVCodecContext * avctx)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
285 {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
286 PCMDecode *s = avctx->priv_data;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
287 int i;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
288
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
289 switch(avctx->codec->id) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
290 case CODEC_ID_PCM_ALAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
291 for(i=0;i<256;i++)
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
292 s->table[i] = alaw2linear(i);
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
293 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
294 case CODEC_ID_PCM_MULAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
295 for(i=0;i<256;i++)
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
296 s->table[i] = ulaw2linear(i);
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
297 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
298 default:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
299 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
300 }
7409
21770337ff2d add CODEC_ID_PCM_F32BE (32-bit floating point PCM big endian decoder)
pross
parents: 7197
diff changeset
301
7476
2321e0384521 Simplify PCM codec; use sample_fmts field to set the avctx->sample_fmt field.
pross
parents: 7451
diff changeset
302 avctx->sample_fmt = avctx->codec->sample_fmts[0];
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
303 return 0;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
304 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
305
2852
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
306 /**
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
307 * Read PCM samples macro
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
308 * @param type Datatype of native machine format
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
309 * @param endian bytestream_get_xxx() endian suffix
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
310 * @param src Source pointer (variable name)
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
311 * @param dst Destination pointer (variable name)
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
312 * @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
313 * @param shift Bitshift (bits)
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
314 * @param offset Sample value offset
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
315 */
7537
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
316 #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
317 dst_##type = (type*)dst; \
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
318 for(;n>0;n--) { \
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
319 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
320 *dst_##type++ = (v - offset) << shift; \
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
321 } \
7537
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
322 dst = (short*)dst_##type;
7519
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
323
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 429
diff changeset
324 static int pcm_decode_frame(AVCodecContext *avctx,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
325 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9086
diff changeset
326 AVPacket *avpkt)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
327 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9086
diff changeset
328 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9086
diff changeset
329 int buf_size = avpkt->size;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
330 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
331 int sample_size, c, n;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
332 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
333 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
334 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
335 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
336 int32_t *dst_int32_t;
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
337 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
338 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
339 uint32_t *dst_uint32_t;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
340
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
341 samples = data;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
342 src = buf;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
343
7537
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
344 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
345 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
346 return -1;
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
347 }
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
348
6821
1b9c458d6d60 LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents: 6817
diff changeset
349 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
350 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
351 return -1;
1b9c458d6d60 LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents: 6817
diff changeset
352 }
1b9c458d6d60 LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents: 6817
diff changeset
353
7518
a40c76e98909 Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
pross
parents: 7517
diff changeset
354 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
355
6821
1b9c458d6d60 LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents: 6817
diff changeset
356 /* 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
357 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
358 /* 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
359 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
360
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
361 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
362
6033
bd7600c7a061 Fix crash in PCM decoder when number of channels is not set.
benoit
parents: 5944
diff changeset
363 if(n && buf_size % n){
4506
709ddd620e04 packets with half pcm samples are invalid
michael
parents: 4351
diff changeset
364 av_log(avctx, AV_LOG_ERROR, "invalid PCM packet\n");
709ddd620e04 packets with half pcm samples are invalid
michael
parents: 4351
diff changeset
365 return -1;
709ddd620e04 packets with half pcm samples are invalid
michael
parents: 4351
diff changeset
366 }
709ddd620e04 packets with half pcm samples are invalid
michael
parents: 4351
diff changeset
367
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 3947
diff changeset
368 buf_size= FFMIN(buf_size, *data_size/2);
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 3947
diff changeset
369 *data_size=0;
2506
9404bbf9de07 buffer overflow
michael
parents: 2340
diff changeset
370
7518
a40c76e98909 Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
pross
parents: 7517
diff changeset
371 n = buf_size/sample_size;
5940
d63186919b60 add pcm_s16le_planar support for electronicarts files
aurel
parents: 5880
diff changeset
372
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
373 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
374 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
375 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
376 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
377 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
378 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
379 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
380 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
381 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
382 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
383 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
384 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
385 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
386 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
387 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
388 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
389 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
390 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
391 break;
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
392 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
393 for(;n>0;n--) {
4959
e00e16be833a Use bytestream
ramiro
parents: 4958
diff changeset
394 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
395 v >>= 4; // sync flags are here
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
396 *samples++ = ff_reverse[(v >> 8) & 0xff] +
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
397 (ff_reverse[v & 0xff] << 8);
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
398 }
6f7428adc6ad Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents: 2506
diff changeset
399 break;
5940
d63186919b60 add pcm_s16le_planar support for electronicarts files
aurel
parents: 5880
diff changeset
400 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
401 n /= avctx->channels;
a40c76e98909 Simplify PCM codec; change 'n' in pcm_decode_frame() to equal "total number of samples".
pross
parents: 7517
diff changeset
402 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
403 src2[c] = &src[c*n*2];
a909361cdfc4 Fix PCM_S16LE_PLANAR channel-address calculation bug introduced in r14659.
pross
parents: 7583
diff changeset
404 for(;n>0;n--)
5940
d63186919b60 add pcm_s16le_planar support for electronicarts files
aurel
parents: 5880
diff changeset
405 for(c=0;c<avctx->channels;c++)
d63186919b60 add pcm_s16le_planar support for electronicarts files
aurel
parents: 5880
diff changeset
406 *samples++ = bytestream_get_le16(&src2[c]);
d63186919b60 add pcm_s16le_planar support for electronicarts files
aurel
parents: 5880
diff changeset
407 src = src2[avctx->channels-1];
d63186919b60 add pcm_s16le_planar support for electronicarts files
aurel
parents: 5880
diff changeset
408 break;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
409 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
410 DECODE(uint16_t, le16, src, samples, n, 0, 0x8000)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
411 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
412 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
413 DECODE(uint16_t, be16, src, samples, n, 0, 0x8000)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
414 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
415 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
416 dstu8= (uint8_t*)samples;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
417 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
418 *dstu8++ = *src++ + 128;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
419 }
7537
4801922896e7 Apply PCM ENCODE/DECODE() macros to the S/U,8/24/32,LE/BE PCM codecs.
pross
parents: 7519
diff changeset
420 samples= (short*)dstu8;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
421 break;
8599
db00335551ca WORDS_BIGENDIAN must be checked with #ifdef
aurel
parents: 8590
diff changeset
422 #ifdef WORDS_BIGENDIAN
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
423 case CODEC_ID_PCM_F64LE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
424 DECODE(int64_t, le64, src, samples, n, 0, 0)
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
425 break;
7583
2a3f40605dec Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents: 7551
diff changeset
426 case CODEC_ID_PCM_S32LE:
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
427 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
428 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
429 break;
2a3f40605dec Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents: 7551
diff changeset
430 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
431 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
432 break;
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
433 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
434 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
435 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
436 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
437 #else
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
438 case CODEC_ID_PCM_F64BE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
439 DECODE(int64_t, be64, src, samples, n, 0, 0)
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
440 break;
7583
2a3f40605dec Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents: 7551
diff changeset
441 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
442 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
443 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
444 break;
2a3f40605dec Use memcpy() for PCM S16/S32 codecs when codec byte-order matches machine byte-order.
pross
parents: 7551
diff changeset
445 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
446 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
447 break;
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
448 case CODEC_ID_PCM_F64LE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
449 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
450 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
451 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
452 #endif /* WORDS_BIGENDIAN */
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
453 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
454 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
455 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
456 samples = (short*)((uint8_t*)data + n*sample_size);
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
457 break;
5422
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
458 case CODEC_ID_PCM_ZORK:
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
459 for(;n>0;n--) {
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
460 int x= *src++;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
461 if(x&128) x-= 128;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
462 else x = -x;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
463 *samples++ = x << 8;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
464 }
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
465 break;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
466 case CODEC_ID_PCM_ALAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
467 case CODEC_ID_PCM_MULAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
468 for(;n>0;n--) {
4960
1745d0452e87 Simplify ptr[0]; ptr++; to *ptr++
ramiro
parents: 4959
diff changeset
469 *samples++ = s->table[*src++];
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
470 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
471 break;
6821
1b9c458d6d60 LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents: 6817
diff changeset
472 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
473 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
474 n /= avctx->channels;
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7770
diff changeset
475 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
476 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
477 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
478 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
479 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
480 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
481 *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
482 *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
483 }
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
484 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
485 }
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
486 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
487 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
488 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
489 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
490 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
491 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
492 *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
493 *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
494 }
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
495 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
496 }
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
497 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
498 default:
6821
1b9c458d6d60 LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents: 6817
diff changeset
499 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
500 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
501 break;
6821
1b9c458d6d60 LPCM 24 bits support, patch by Lars T¸«£uber, lars.taeuber gmx net
diego
parents: 6817
diff changeset
502 }
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
503 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
504 break;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
505 default:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
506 return -1;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
507 }
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1014
diff changeset
508 *data_size = (uint8_t *)samples - (uint8_t *)data;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
509 return src - buf;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
510 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
511
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 7823
diff changeset
512 #if CONFIG_ENCODERS
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7409
diff changeset
513 #define PCM_ENCODER(id,sample_fmt_,name,long_name_) \
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
514 AVCodec name ## _encoder = { \
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
515 #name, \
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
516 CODEC_TYPE_AUDIO, \
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
517 id, \
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
518 0, \
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
519 pcm_encode_init, \
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
520 pcm_encode_frame, \
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
521 pcm_encode_close, \
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
522 NULL, \
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7409
diff changeset
523 .sample_fmts = (enum SampleFormat[]){sample_fmt_,SAMPLE_FMT_NONE}, \
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6821
diff changeset
524 .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
525 };
6814207ffb27 split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents: 5861
diff changeset
526 #else
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7409
diff changeset
527 #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
528 #endif
6814207ffb27 split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents: 5861
diff changeset
529
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 7823
diff changeset
530 #if CONFIG_DECODERS
7476
2321e0384521 Simplify PCM codec; use sample_fmts field to set the avctx->sample_fmt field.
pross
parents: 7451
diff changeset
531 #define PCM_DECODER(id,sample_fmt_,name,long_name_) \
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
532 AVCodec name ## _decoder = { \
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
533 #name, \
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
534 CODEC_TYPE_AUDIO, \
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
535 id, \
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
536 sizeof(PCMDecode), \
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
537 pcm_decode_init, \
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
538 NULL, \
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
539 NULL, \
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 429
diff changeset
540 pcm_decode_frame, \
7476
2321e0384521 Simplify PCM codec; use sample_fmts field to set the avctx->sample_fmt field.
pross
parents: 7451
diff changeset
541 .sample_fmts = (enum SampleFormat[]){sample_fmt_,SAMPLE_FMT_NONE}, \
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6821
diff changeset
542 .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
543 };
6814207ffb27 split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents: 5861
diff changeset
544 #else
7476
2321e0384521 Simplify PCM codec; use sample_fmts field to set the avctx->sample_fmt field.
pross
parents: 7451
diff changeset
545 #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
546 #endif
6814207ffb27 split definition of PCM_CODEC into PCM_ENCODER and PCM_DECODER
aurel
parents: 5861
diff changeset
547
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7409
diff changeset
548 #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
549 PCM_ENCODER(id,sample_fmt_,name,long_name_) PCM_DECODER(id,sample_fmt_,name,long_name_)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
550
7197
54f8d960f15b Add a note to remind people that new PCM/ADPCM formats need to be added to
diego
parents: 7040
diff changeset
551 /* 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
552 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
553 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
554 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
555 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
556 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
557 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
558 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
559 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
560 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
561 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
562 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
563 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
564 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
565 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
566 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
567 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
568 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
569 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
570 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
571 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
572 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
573 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
574 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
575 PCM_CODEC (CODEC_ID_PCM_ZORK, SAMPLE_FMT_S16, pcm_zork, "PCM Zork");