1 /*
2 * LPCM codecs for PCM formats found in MPEG streams
3 * Copyright (c) 2009 Christian Schmidt
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * PCM codecs for encodings found in MPEG streams (DVD/Blu-ray)
25 */
26
31
32 /*
33 * Channel Mapping according to
34 * Blu-ray Disc Read-Only Format Version 1
35 * Part 3: Audio Visual Basic Specifications
36 * mono M1 X
37 * stereo L R
38 * 3/0 L R C X
39 * 2/1 L R S X
40 * 3/1 L R C S
41 * 2/2 L R LS RS
42 * 3/2 L R C LS RS X
43 * 3/2+lfe L R C LS RS lfe
44 * 3/4 L R C LS Rls Rrs RS X
45 * 3/4+lfe L R C LS Rls Rrs RS lfe
46 */
47
48 /**
49 * Parse the header of a LPCM frame read from a MPEG-TS stream
50 * @param avctx the codec context
51 * @param header pointer to the first four bytes of the data packet
52 */
55 {
56 static const uint8_t bits_per_samples[4] = { 0, 16, 20, 24 };
57 static const uint32_t channel_layouts[16] = {
61 };
62 static const uint8_t channels[16] = {
63 0, 1, 0, 2, 3, 3, 4, 4, 5, 6, 7, 8, 0, 0, 0, 0
64 };
65 uint8_t channel_layout = header[2] >> 4;
66
68 av_dlog(avctx,
"pcm_bluray_parse_header: header = %02x%02x%02x%02x\n",
69 header[0], header[1], header[2], header[3]);
70
71 /* get the sample depth and derive the sample format from it */
75 return -1;
76 }
81
82 /* get the sample rate. Not all values are used. */
83 switch (header[2] & 0x0f) {
84 case 1:
86 break;
87 case 4:
89 break;
90 case 5:
92 break;
93 default:
96 header[2] & 0x0f);
97 return -1;
98 }
99
100 /*
101 * get the channel number (and mapping). Not all values are used.
102 * It must be noted that the number of channels in the MPEG stream can
103 * differ from the actual meaningful number, e.g. mono audio still has two
104 * channels, one being empty.
105 */
107 avctx->
channels = channels[channel_layout];
110 channel_layout);
111 return -1;
112 }
113
116
119 "pcm_bluray_parse_header: %d channels, %d bits per sample, %d Hz, %d bit/s\n",
122 return 0;
123 }
124
128
130 {
132
135
136 return 0;
137 }
138
140 int *got_frame_ptr,
AVPacket *avpkt)
141 {
143 int buf_size = avpkt->
size;
146 int num_source_channels, channel, retval;
148 int16_t *dst16;
150
151 if (buf_size < 4) {
153 return -1;
154 }
155
157 return -1;
158 src += 4;
159 buf_size -= 4;
160
162
163 /* There's always an even number of channels in the source */
166 samples = buf_size / sample_size;
167
168 /* get output buffer */
172 return retval;
173 }
176
177 if (samples) {
179 /* cases with same number of source and coded channels */
183 samples *= num_source_channels;
185 #if HAVE_BIGENDIAN
187 #else
188 do {
189 *dst16++ = bytestream2_get_be16u(&gb);
190 } while (--samples);
191 #endif
192 } else {
193 do {
194 *dst32++ = bytestream2_get_be24u(&gb) << 8;
195 } while (--samples);
196 }
197 break;
198 /* cases where number of source channels = coded channels + 1 */
204 do {
205 #if HAVE_BIGENDIAN
208 #else
210 do {
211 *dst16++ = bytestream2_get_be16u(&gb);
212 } while (--channel);
213 #endif
215 } while (--samples);
216 } else {
217 do {
219 do {
220 *dst32++ = bytestream2_get_be24u(&gb) << 8;
221 } while (--channel);
223 } while (--samples);
224 }
225 break;
226 /* remapping: L, R, C, LBack, RBack, LF */
229 do {
230 dst16[0] = bytestream2_get_be16u(&gb);
231 dst16[1] = bytestream2_get_be16u(&gb);
232 dst16[2] = bytestream2_get_be16u(&gb);
233 dst16[4] = bytestream2_get_be16u(&gb);
234 dst16[5] = bytestream2_get_be16u(&gb);
235 dst16[3] = bytestream2_get_be16u(&gb);
236 dst16 += 6;
237 } while (--samples);
238 } else {
239 do {
240 dst32[0] = bytestream2_get_be24u(&gb) << 8;
241 dst32[1] = bytestream2_get_be24u(&gb) << 8;
242 dst32[2] = bytestream2_get_be24u(&gb) << 8;
243 dst32[4] = bytestream2_get_be24u(&gb) << 8;
244 dst32[5] = bytestream2_get_be24u(&gb) << 8;
245 dst32[3] = bytestream2_get_be24u(&gb) << 8;
246 dst32 += 6;
247 } while (--samples);
248 }
249 break;
250 /* remapping: L, R, C, LSide, LBack, RBack, RSide, <unused> */
253 do {
254 dst16[0] = bytestream2_get_be16u(&gb);
255 dst16[1] = bytestream2_get_be16u(&gb);
256 dst16[2] = bytestream2_get_be16u(&gb);
257 dst16[5] = bytestream2_get_be16u(&gb);
258 dst16[3] = bytestream2_get_be16u(&gb);
259 dst16[4] = bytestream2_get_be16u(&gb);
260 dst16[6] = bytestream2_get_be16u(&gb);
261 dst16 += 7;
263 } while (--samples);
264 } else {
265 do {
266 dst32[0] = bytestream2_get_be24u(&gb) << 8;
267 dst32[1] = bytestream2_get_be24u(&gb) << 8;
268 dst32[2] = bytestream2_get_be24u(&gb) << 8;
269 dst32[5] = bytestream2_get_be24u(&gb) << 8;
270 dst32[3] = bytestream2_get_be24u(&gb) << 8;
271 dst32[4] = bytestream2_get_be24u(&gb) << 8;
272 dst32[6] = bytestream2_get_be24u(&gb) << 8;
273 dst32 += 7;
275 } while (--samples);
276 }
277 break;
278 /* remapping: L, R, C, LSide, LBack, RBack, RSide, LF */
281 do {
282 dst16[0] = bytestream2_get_be16u(&gb);
283 dst16[1] = bytestream2_get_be16u(&gb);
284 dst16[2] = bytestream2_get_be16u(&gb);
285 dst16[6] = bytestream2_get_be16u(&gb);
286 dst16[4] = bytestream2_get_be16u(&gb);
287 dst16[5] = bytestream2_get_be16u(&gb);
288 dst16[7] = bytestream2_get_be16u(&gb);
289 dst16[3] = bytestream2_get_be16u(&gb);
290 dst16 += 8;
291 } while (--samples);
292 } else {
293 do {
294 dst32[0] = bytestream2_get_be24u(&gb) << 8;
295 dst32[1] = bytestream2_get_be24u(&gb) << 8;
296 dst32[2] = bytestream2_get_be24u(&gb) << 8;
297 dst32[6] = bytestream2_get_be24u(&gb) << 8;
298 dst32[4] = bytestream2_get_be24u(&gb) << 8;
299 dst32[5] = bytestream2_get_be24u(&gb) << 8;
300 dst32[7] = bytestream2_get_be24u(&gb) << 8;
301 dst32[3] = bytestream2_get_be24u(&gb) << 8;
302 dst32 += 8;
303 } while (--samples);
304 }
305 break;
306 }
307 }
308
309 *got_frame_ptr = 1;
311
314 av_dlog(avctx,
"pcm_bluray_decode_frame: decoded %d -> %d bytes\n",
315 retval, buf_size);
316 return retval + 4;
317 }
318
320 .
name =
"pcm_bluray",
329 },
331 };