comparison wav.c @ 846:fd1c2109505e libavformat

Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
author reimar
date Fri, 02 Sep 2005 19:16:48 +0000
parents feca73904e67
children 66cc656ea404
comparison
equal deleted inserted replaced
845:e4e8c395d8e9 846:fd1c2109505e
23 { CODEC_ID_MP2, 0x50 }, 23 { CODEC_ID_MP2, 0x50 },
24 { CODEC_ID_MP3, 0x55 }, 24 { CODEC_ID_MP3, 0x55 },
25 { CODEC_ID_AC3, 0x2000 }, 25 { CODEC_ID_AC3, 0x2000 },
26 { CODEC_ID_PCM_S16LE, 0x01 }, 26 { CODEC_ID_PCM_S16LE, 0x01 },
27 { CODEC_ID_PCM_U8, 0x01 }, /* must come after s16le in this list */ 27 { CODEC_ID_PCM_U8, 0x01 }, /* must come after s16le in this list */
28 { CODEC_ID_PCM_S24LE, 0x01 },
29 { CODEC_ID_PCM_S32LE, 0x01 },
28 { CODEC_ID_PCM_ALAW, 0x06 }, 30 { CODEC_ID_PCM_ALAW, 0x06 },
29 { CODEC_ID_PCM_MULAW, 0x07 }, 31 { CODEC_ID_PCM_MULAW, 0x07 },
30 { CODEC_ID_ADPCM_MS, 0x02 }, 32 { CODEC_ID_ADPCM_MS, 0x02 },
31 { CODEC_ID_ADPCM_IMA_WAV, 0x11 }, 33 { CODEC_ID_ADPCM_IMA_WAV, 0x11 },
32 { CODEC_ID_ADPCM_YAMAHA, 0x20 }, 34 { CODEC_ID_ADPCM_YAMAHA, 0x20 },
66 bps = 8; 68 bps = 8;
67 } else if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3) { 69 } else if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3) {
68 bps = 0; 70 bps = 0;
69 } else if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV || enc->codec_id == CODEC_ID_ADPCM_MS || enc->codec_id == CODEC_ID_ADPCM_G726 || enc->codec_id == CODEC_ID_ADPCM_YAMAHA) { // 71 } else if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV || enc->codec_id == CODEC_ID_ADPCM_MS || enc->codec_id == CODEC_ID_ADPCM_G726 || enc->codec_id == CODEC_ID_ADPCM_YAMAHA) { //
70 bps = 4; 72 bps = 4;
73 } else if (enc->codec_id == CODEC_ID_PCM_S24LE) {
74 bps = 24;
75 } else if (enc->codec_id == CODEC_ID_PCM_S32LE) {
76 bps = 32;
71 } else { 77 } else {
72 bps = 16; 78 bps = 16;
73 } 79 }
74 80
75 if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3) { 81 if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3) {
80 } else if (enc->block_align != 0) { /* specified by the codec */ 86 } else if (enc->block_align != 0) { /* specified by the codec */
81 blkalign = enc->block_align; 87 blkalign = enc->block_align;
82 } else 88 } else
83 blkalign = enc->channels*bps >> 3; 89 blkalign = enc->channels*bps >> 3;
84 if (enc->codec_id == CODEC_ID_PCM_U8 || 90 if (enc->codec_id == CODEC_ID_PCM_U8 ||
91 enc->codec_id == CODEC_ID_PCM_S24LE ||
92 enc->codec_id == CODEC_ID_PCM_S32LE ||
85 enc->codec_id == CODEC_ID_PCM_S16LE) { 93 enc->codec_id == CODEC_ID_PCM_S16LE) {
86 bytespersec = enc->sample_rate * blkalign; 94 bytespersec = enc->sample_rate * blkalign;
87 } else { 95 } else {
88 bytespersec = enc->bit_rate / 8; 96 bytespersec = enc->bit_rate / 8;
89 } 97 }
177 if (id <= 0) 185 if (id <= 0)
178 return id; 186 return id;
179 /* handle specific u8 codec */ 187 /* handle specific u8 codec */
180 if (id == CODEC_ID_PCM_S16LE && bps == 8) 188 if (id == CODEC_ID_PCM_S16LE && bps == 8)
181 id = CODEC_ID_PCM_U8; 189 id = CODEC_ID_PCM_U8;
190 if (id == CODEC_ID_PCM_S16LE && bps == 24)
191 id = CODEC_ID_PCM_S24LE;
192 if (id == CODEC_ID_PCM_S16LE && bps == 32)
193 id = CODEC_ID_PCM_S32LE;
182 return id; 194 return id;
183 } 195 }
184 196
185 #ifdef CONFIG_ENCODERS 197 #ifdef CONFIG_ENCODERS
186 typedef struct { 198 typedef struct {