1/* 2 * LPCM codecs for PCM formats found in MPEG streams 3 * Copyright (c) 2009 Christian Schmidt 4 * 5 * This file is part of Libav. 6 * 7 * Libav 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 * Libav 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 Libav; 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 27#include "libavutil/audioconvert.h" 28#include "avcodec.h" 29#include "bytestream.h" 30 31/* 32 * Channel Mapping according to 33 * Blu-ray Disc Read-Only Format Version 1 34 * Part 3: Audio Visual Basic Specifications 35 * mono M1 X 36 * stereo L R 37 * 3/0 L R C X 38 * 2/1 L R S X 39 * 3/1 L R C S 40 * 2/2 L R LS RS 41 * 3/2 L R C LS RS X 42 * 3/2+lfe L R C LS RS lfe 43 * 3/4 L R C LS Rls Rrs RS X 44 * 3/4+lfe L R C LS Rls Rrs RS lfe 45 */ 46 47/** 48 * Parse the header of a LPCM frame read from a MPEG-TS stream 49 * @param avctx the codec context 50 * @param header pointer to the first four bytes of the data packet 51 */ 52static int pcm_bluray_parse_header(AVCodecContext *avctx, 53 const uint8_t *header) 54{ 55 static const uint8_t bits_per_samples[4] = { 0, 16, 20, 24 }; 56 static const uint32_t channel_layouts[16] = { 57 0, AV_CH_LAYOUT_MONO, 0, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_SURROUND, 58 AV_CH_LAYOUT_2_1, AV_CH_LAYOUT_4POINT0, AV_CH_LAYOUT_2_2, AV_CH_LAYOUT_5POINT0, 59 AV_CH_LAYOUT_5POINT1, AV_CH_LAYOUT_7POINT0, AV_CH_LAYOUT_7POINT1, 0, 0, 0, 0 60 }; 61 static const uint8_t channels[16] = { 62 0, 1, 0, 2, 3, 3, 4, 4, 5, 6, 7, 8, 0, 0, 0, 0 63 }; 64 uint8_t channel_layout = header[2] >> 4; 65 66 if (avctx->debug & FF_DEBUG_PICT_INFO) 67 av_dlog(avctx, "pcm_bluray_parse_header: header = %02x%02x%02x%02x\n", 68 header[0], header[1], header[2], header[3]); 69 70 /* get the sample depth and derive the sample format from it */ 71 avctx->bits_per_coded_sample = bits_per_samples[header[3] >> 6]; 72 if (!avctx->bits_per_coded_sample) { 73 av_log(avctx, AV_LOG_ERROR, "unsupported sample depth (0)\n"); 74 return -1; 75 } 76 avctx->sample_fmt = avctx->bits_per_coded_sample == 16 ? AV_SAMPLE_FMT_S16 : 77 AV_SAMPLE_FMT_S32; 78 79 /* get the sample rate. Not all values are known or exist. */ 80 switch (header[2] & 0x0f) { 81 case 1: 82 avctx->sample_rate = 48000; 83 break; 84 case 4: 85 avctx->sample_rate = 96000; 86 break; 87 case 5: 88 avctx->sample_rate = 192000; 89 break; 90 default: 91 avctx->sample_rate = 0; 92 av_log(avctx, AV_LOG_ERROR, "unsupported sample rate (%d)\n", 93 header[2] & 0x0f); 94 return -1; 95 } 96 97 /* 98 * get the channel number (and mapping). Not all values are known or exist. 99 * It must be noted that the number of channels in the MPEG stream can 100 * differ from the actual meaningful number, e.g. mono audio still has two 101 * channels, one being empty. 102 */ 103 avctx->channel_layout = channel_layouts[channel_layout]; 104 avctx->channels = channels[channel_layout]; 105 if (!avctx->channels) { 106 av_log(avctx, AV_LOG_ERROR, "unsupported channel configuration (%d)\n", 107 channel_layout); 108 return -1; 109 } 110 111 avctx->bit_rate = avctx->channels * avctx->sample_rate * 112 avctx->bits_per_coded_sample; 113 114 if (avctx->debug & FF_DEBUG_PICT_INFO) 115 av_dlog(avctx, 116 "pcm_bluray_parse_header: %d channels, %d bits per sample, %d kHz, %d kbit\n", 117 avctx->channels, avctx->bits_per_coded_sample, 118 avctx->sample_rate, avctx->bit_rate); 119 return 0; 120} 121 122typedef struct PCMBRDecode { 123 AVFrame frame; 124} PCMBRDecode; 125 126static av_cold int pcm_bluray_decode_init(AVCodecContext * avctx) 127{ 128 PCMBRDecode *s = avctx->priv_data; 129 130 avcodec_get_frame_defaults(&s->frame); 131 avctx->coded_frame = &s->frame; 132 133 return 0; 134} 135 136static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, 137 int *got_frame_ptr, AVPacket *avpkt) 138{ 139 const uint8_t *src = avpkt->data; 140 int buf_size = avpkt->size; 141 PCMBRDecode *s = avctx->priv_data; 142 int num_source_channels, channel, retval; 143 int sample_size, samples; 144 int16_t *dst16; 145 int32_t *dst32; 146 147 if (buf_size < 4) { 148 av_log(avctx, AV_LOG_ERROR, "PCM packet too small\n"); 149 return -1; 150 } 151 152 if (pcm_bluray_parse_header(avctx, src)) 153 return -1; 154 src += 4; 155 buf_size -= 4; 156 157 /* There's always an even number of channels in the source */ 158 num_source_channels = FFALIGN(avctx->channels, 2); 159 sample_size = (num_source_channels * (avctx->sample_fmt == AV_SAMPLE_FMT_S16 ? 16 : 24)) >> 3; 160 samples = buf_size / sample_size; 161 162 /* get output buffer */ 163 s->frame.nb_samples = samples; 164 if ((retval = avctx->get_buffer(avctx, &s->frame)) < 0) { 165 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); 166 return retval; 167 } 168 dst16 = (int16_t *)s->frame.data[0]; 169 dst32 = (int32_t *)s->frame.data[0]; 170 171 if (samples) { 172 switch (avctx->channel_layout) { 173 /* cases with same number of source and coded channels */ 174 case AV_CH_LAYOUT_STEREO: 175 case AV_CH_LAYOUT_4POINT0: 176 case AV_CH_LAYOUT_2_2: 177 samples *= num_source_channels; 178 if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { 179#if HAVE_BIGENDIAN 180 memcpy(dst16, src, buf_size); 181#else 182 do { 183 *dst16++ = bytestream_get_be16(&src); 184 } while (--samples); 185#endif 186 } else { 187 do { 188 *dst32++ = bytestream_get_be24(&src) << 8; 189 } while (--samples); 190 } 191 break; 192 /* cases where number of source channels = coded channels + 1 */ 193 case AV_CH_LAYOUT_MONO: 194 case AV_CH_LAYOUT_SURROUND: 195 case AV_CH_LAYOUT_2_1: 196 case AV_CH_LAYOUT_5POINT0: 197 if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { 198 do { 199#if HAVE_BIGENDIAN 200 memcpy(dst16, src, avctx->channels * 2); 201 dst16 += avctx->channels; 202 src += sample_size; 203#else 204 channel = avctx->channels; 205 do { 206 *dst16++ = bytestream_get_be16(&src); 207 } while (--channel); 208 src += 2; 209#endif 210 } while (--samples); 211 } else { 212 do { 213 channel = avctx->channels; 214 do { 215 *dst32++ = bytestream_get_be24(&src) << 8; 216 } while (--channel); 217 src += 3; 218 } while (--samples); 219 } 220 break; 221 /* remapping: L, R, C, LBack, RBack, LF */ 222 case AV_CH_LAYOUT_5POINT1: 223 if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { 224 do { 225 dst16[0] = bytestream_get_be16(&src); 226 dst16[1] = bytestream_get_be16(&src); 227 dst16[2] = bytestream_get_be16(&src); 228 dst16[4] = bytestream_get_be16(&src); 229 dst16[5] = bytestream_get_be16(&src); 230 dst16[3] = bytestream_get_be16(&src); 231 dst16 += 6; 232 } while (--samples); 233 } else { 234 do { 235 dst32[0] = bytestream_get_be24(&src) << 8; 236 dst32[1] = bytestream_get_be24(&src) << 8; 237 dst32[2] = bytestream_get_be24(&src) << 8; 238 dst32[4] = bytestream_get_be24(&src) << 8; 239 dst32[5] = bytestream_get_be24(&src) << 8; 240 dst32[3] = bytestream_get_be24(&src) << 8; 241 dst32 += 6; 242 } while (--samples); 243 } 244 break; 245 /* remapping: L, R, C, LSide, LBack, RBack, RSide, <unused> */ 246 case AV_CH_LAYOUT_7POINT0: 247 if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { 248 do { 249 dst16[0] = bytestream_get_be16(&src); 250 dst16[1] = bytestream_get_be16(&src); 251 dst16[2] = bytestream_get_be16(&src); 252 dst16[5] = bytestream_get_be16(&src); 253 dst16[3] = bytestream_get_be16(&src); 254 dst16[4] = bytestream_get_be16(&src); 255 dst16[6] = bytestream_get_be16(&src); 256 dst16 += 7; 257 src += 2; 258 } while (--samples); 259 } else { 260 do { 261 dst32[0] = bytestream_get_be24(&src) << 8; 262 dst32[1] = bytestream_get_be24(&src) << 8; 263 dst32[2] = bytestream_get_be24(&src) << 8; 264 dst32[5] = bytestream_get_be24(&src) << 8; 265 dst32[3] = bytestream_get_be24(&src) << 8; 266 dst32[4] = bytestream_get_be24(&src) << 8; 267 dst32[6] = bytestream_get_be24(&src) << 8; 268 dst32 += 7; 269 src += 3; 270 } while (--samples); 271 } 272 break; 273 /* remapping: L, R, C, LSide, LBack, RBack, RSide, LF */ 274 case AV_CH_LAYOUT_7POINT1: 275 if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { 276 do { 277 dst16[0] = bytestream_get_be16(&src); 278 dst16[1] = bytestream_get_be16(&src); 279 dst16[2] = bytestream_get_be16(&src); 280 dst16[6] = bytestream_get_be16(&src); 281 dst16[4] = bytestream_get_be16(&src); 282 dst16[5] = bytestream_get_be16(&src); 283 dst16[7] = bytestream_get_be16(&src); 284 dst16[3] = bytestream_get_be16(&src); 285 dst16 += 8; 286 } while (--samples); 287 } else { 288 do { 289 dst32[0] = bytestream_get_be24(&src) << 8; 290 dst32[1] = bytestream_get_be24(&src) << 8; 291 dst32[2] = bytestream_get_be24(&src) << 8; 292 dst32[6] = bytestream_get_be24(&src) << 8; 293 dst32[4] = bytestream_get_be24(&src) << 8; 294 dst32[5] = bytestream_get_be24(&src) << 8; 295 dst32[7] = bytestream_get_be24(&src) << 8; 296 dst32[3] = bytestream_get_be24(&src) << 8; 297 dst32 += 8; 298 } while (--samples); 299 } 300 break; 301 } 302 } 303 304 *got_frame_ptr = 1; 305 *(AVFrame *)data = s->frame; 306 307 retval = src - avpkt->data; 308 if (avctx->debug & FF_DEBUG_BITSTREAM) 309 av_dlog(avctx, "pcm_bluray_decode_frame: decoded %d -> %d bytes\n", 310 retval, buf_size); 311 return retval; 312} 313 314AVCodec ff_pcm_bluray_decoder = { 315 .name = "pcm_bluray", 316 .type = AVMEDIA_TYPE_AUDIO, 317 .id = CODEC_ID_PCM_BLURAY, 318 .priv_data_size = sizeof(PCMBRDecode), 319 .init = pcm_bluray_decode_init, 320 .decode = pcm_bluray_decode_frame, 321 .capabilities = CODEC_CAP_DR1, 322 .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32, 323 AV_SAMPLE_FMT_NONE}, 324 .long_name = NULL_IF_CONFIG_SMALL("PCM signed 16|20|24-bit big-endian for Blu-ray media"), 325}; 326