annotate pcm.c @ 12506:747e5f278c4b libavcodec

The debug text output of macroblocks can indicate MB_TYPE_INTERLACED, but it used to do it only for h264 codec. Allow it for other codecs, as mpeg2 and mpeg4 also set this flag.
author iive
date Tue, 21 Sep 2010 22:44:27 +0000
parents dde20597f15e
children
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11571
diff changeset
23 * @file
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"
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
e00e16be833a Use bytestream
ramiro
parents: 4958
diff changeset
29 #include "bytestream.h"
11571
7d324b40c3d6 Allow hardcoding of ulaw and alaw tables.
reimar
parents: 11560
diff changeset
30 #include "pcm_tablegen.h"
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
35 {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
36 avctx->frame_size = 1;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
37 switch(avctx->codec->id) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
38 case CODEC_ID_PCM_ALAW:
11571
7d324b40c3d6 Allow hardcoding of ulaw and alaw tables.
reimar
parents: 11560
diff changeset
39 pcm_alaw_tableinit();
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
40 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
41 case CODEC_ID_PCM_MULAW:
11571
7d324b40c3d6 Allow hardcoding of ulaw and alaw tables.
reimar
parents: 11560
diff changeset
42 pcm_ulaw_tableinit();
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
43 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
44 default:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
45 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
46 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2853
diff changeset
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
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 649
diff changeset
50 avctx->coded_frame= avcodec_alloc_frame();
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 649
diff changeset
51 avctx->coded_frame->key_frame= 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2853
diff changeset
52
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
53 return 0;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
54 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
57 {
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 649
diff changeset
58 av_freep(&avctx->coded_frame);
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 649
diff changeset
59
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
60 return 0;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
61 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
64 * Write PCM samples macro
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
65 * @param type Datatype of native machine format
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
66 * @param endian bytestream_put_xxx() suffix
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
67 * @param src Source pointer (variable name)
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
68 * @param dst Destination pointer (variable name)
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
71 * @param offset Sample value offset
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
81 unsigned char *frame, int buf_size, void *data)
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
82 {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
94 n = buf_size / sample_size;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
95 samples = data;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
96 dst = frame;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
e00e16be833a Use bytestream
ramiro
parents: 4958
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
133 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
136 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
142 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
143 break;
9985
266bf83f634d Replace WORDS_BIGENDIAN with HAVE_BIGENDIAN
mru
parents: 9515
diff changeset
144 #if HAVE_BIGENDIAN
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
145 case CODEC_ID_PCM_F64LE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
146 ENCODE(int64_t, le64, samples, dst, n, 0, 0)
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
160 case CODEC_ID_PCM_F64BE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
161 ENCODE(int64_t, be64, samples, dst, n, 0, 0)
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
170 case CODEC_ID_PCM_F64LE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
266bf83f634d Replace WORDS_BIGENDIAN with HAVE_BIGENDIAN
mru
parents: 9515
diff changeset
174 #endif /* HAVE_BIGENDIAN */
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
178 break;
5422
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
179 case CODEC_ID_PCM_ZORK:
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
180 for(;n>0;n--) {
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
181 v= *samples++ >> 8;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
182 if(v<0) v = -v;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
183 else v+= 128;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
184 *dst++ = v;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
185 }
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
186 break;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
187 case CODEC_ID_PCM_ALAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
188 for(;n>0;n--) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
189 v = *samples++;
4960
1745d0452e87 Simplify ptr[0]; ptr++; to *ptr++
ramiro
parents: 4959
diff changeset
190 *dst++ = linear_to_alaw[(v + 32768) >> 2];
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
191 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
192 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
193 case CODEC_ID_PCM_MULAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
194 for(;n>0;n--) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
195 v = *samples++;
4960
1745d0452e87 Simplify ptr[0]; ptr++; to *ptr++
ramiro
parents: 4959
diff changeset
196 *dst++ = linear_to_ulaw[(v + 32768) >> 2];
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
197 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
198 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
199 default:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
200 return -1;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
19b6a1fa6f6d * Every frame is a key_frame
philipjsg
parents: 92
diff changeset
203
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
204 return dst - frame;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
205 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
206
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
207 typedef struct PCMDecode {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
208 short table[256];
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
209 } PCMDecode;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
212 {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
213 PCMDecode *s = avctx->priv_data;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
214 int i;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
215
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
216 switch(avctx->codec->id) {
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
217 case CODEC_ID_PCM_ALAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
218 for(i=0;i<256;i++)
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
219 s->table[i] = alaw2linear(i);
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
220 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
221 case CODEC_ID_PCM_MULAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
222 for(i=0;i<256;i++)
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
223 s->table[i] = ulaw2linear(i);
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
224 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
225 default:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
226 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
a12d8bdd0cac Set bits_per_raw_sample in the pcm decoder.
jbr
parents: 11644
diff changeset
230
a12d8bdd0cac Set bits_per_raw_sample in the pcm decoder.
jbr
parents: 11644
diff changeset
231 if (avctx->sample_fmt == SAMPLE_FMT_S32)
a12d8bdd0cac Set bits_per_raw_sample in the pcm decoder.
jbr
parents: 11644
diff changeset
232 avctx->bits_per_raw_sample = av_get_bits_per_sample(avctx->codec->id);
a12d8bdd0cac Set bits_per_raw_sample in the pcm decoder.
jbr
parents: 11644
diff changeset
233
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
234 return 0;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
235 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
238 * Read PCM samples macro
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
239 * @param type Datatype of native machine format
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
240 * @param endian bytestream_get_xxx() endian suffix
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
241 * @param src Source pointer (variable name)
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
242 * @param dst Destination pointer (variable name)
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
245 * @param offset Sample value offset
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
249 for(;n>0;n--) { \
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
4b6f7cdce8c5 Add simpler/cleaner/faster F32BE encoding/decoding.
pross
parents: 7518
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
271
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
272 samples = data;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
273 src = buf;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
446bc9d714b1 Do not discard truncated packets.
michael
parents: 9428
diff changeset
295 if (buf_size < n) {
9515
michael
parents: 9514
diff changeset
296 av_log(avctx, AV_LOG_ERROR, "invalid PCM packet\n");
michael
parents: 9514
diff changeset
297 return -1;
9514
446bc9d714b1 Do not discard truncated packets.
michael
parents: 9428
diff changeset
298 }else
446bc9d714b1 Do not discard truncated packets.
michael
parents: 9428
diff changeset
299 buf_size -= buf_size % n;
4506
709ddd620e04 packets with half pcm samples are invalid
michael
parents: 4351
diff changeset
300 }
709ddd620e04 packets with half pcm samples are invalid
michael
parents: 4351
diff changeset
301
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 3947
diff changeset
302 buf_size= FFMIN(buf_size, *data_size/2);
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 3947
diff changeset
303 *data_size=0;
2506
9404bbf9de07 buffer overflow
michael
parents: 2340
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
e00e16be833a Use bytestream
ramiro
parents: 4958
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
345 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
348 break;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
355 break;
9985
266bf83f634d Replace WORDS_BIGENDIAN with HAVE_BIGENDIAN
mru
parents: 9515
diff changeset
356 #if HAVE_BIGENDIAN
7613
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
357 case CODEC_ID_PCM_F64LE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
358 DECODE(int64_t, le64, src, samples, n, 0, 0)
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
372 case CODEC_ID_PCM_F64BE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
373 DECODE(int64_t, be64, src, samples, n, 0, 0)
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
382 case CODEC_ID_PCM_F64LE:
ff395fe35161 Add F64BE, F64LE and F64BE PCM codecs.
pross
parents: 7611
diff changeset
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
266bf83f634d Replace WORDS_BIGENDIAN with HAVE_BIGENDIAN
mru
parents: 9515
diff changeset
386 #endif /* HAVE_BIGENDIAN */
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
391 break;
5422
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
392 case CODEC_ID_PCM_ZORK:
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
393 for(;n>0;n--) {
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
394 int x= *src++;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
395 if(x&128) x-= 128;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
396 else x = -x;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
397 *samples++ = x << 8;
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
398 }
ad384eda0cb7 support silly PCM variant used by zork nemesis
michael
parents: 4973
diff changeset
399 break;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
400 case CODEC_ID_PCM_ALAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
401 case CODEC_ID_PCM_MULAW:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
402 for(;n>0;n--) {
4960
1745d0452e87 Simplify ptr[0]; ptr++; to *ptr++
ramiro
parents: 4959
diff changeset
403 *samples++ = s->table[*src++];
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
404 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
439 default:
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
440 return -1;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
441 }
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1014
diff changeset
442 *data_size = (uint8_t *)samples - (uint8_t *)data;
92
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
443 return src - buf;
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
444 }
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
445
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 7823
diff changeset
446 #if CONFIG_ENCODERS
12171
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
447 #define PCM_ENCODER(id_,sample_fmt_,name_,long_name_) \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
448 AVCodec name_ ## _encoder = { \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
449 .name = #name_, \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
450 .type = AVMEDIA_TYPE_AUDIO, \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
451 .id = id_, \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
452 .init = pcm_encode_init, \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
453 .encode = pcm_encode_frame, \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
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
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 7823
diff changeset
462 #if CONFIG_DECODERS
12171
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
463 #define PCM_DECODER(id_,sample_fmt_,name_,long_name_) \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
464 AVCodec name_ ## _decoder = { \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
465 .name = #name_, \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
466 .type = AVMEDIA_TYPE_AUDIO, \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
467 .id = id_, \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
468 .priv_data_size = sizeof(PCMDecode), \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
469 .init = pcm_decode_init, \
77b51328fc59 Use designated initialisers for pcm codec struct
pross
parents: 11863
diff changeset
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
1d3eb6cdc6b5 added pcm codecs
glantau
parents:
diff changeset
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");