00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #include <stdint.h>
00028
00029 #include "libavutil/channel_layout.h"
00030 #include "libavutil/crc.h"
00031 #include "get_bits.h"
00032 #include "parser.h"
00033 #include "mlp_parser.h"
00034 #include "mlp.h"
00035
00036 static const uint8_t mlp_quants[16] = {
00037 16, 20, 24, 0, 0, 0, 0, 0,
00038 0, 0, 0, 0, 0, 0, 0, 0,
00039 };
00040
00041 static const uint8_t mlp_channels[32] = {
00042 1, 2, 3, 4, 3, 4, 5, 3, 4, 5, 4, 5, 6, 4, 5, 4,
00043 5, 6, 5, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00044 };
00045
00046 const uint64_t ff_mlp_layout[32] = {
00047 AV_CH_LAYOUT_MONO,
00048 AV_CH_LAYOUT_STEREO,
00049 AV_CH_LAYOUT_2_1,
00050 AV_CH_LAYOUT_QUAD,
00051 AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY,
00052 AV_CH_LAYOUT_2_1|AV_CH_LOW_FREQUENCY,
00053 AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,
00054 AV_CH_LAYOUT_SURROUND,
00055 AV_CH_LAYOUT_4POINT0,
00056 AV_CH_LAYOUT_5POINT0_BACK,
00057 AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
00058 AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
00059 AV_CH_LAYOUT_5POINT1_BACK,
00060 AV_CH_LAYOUT_4POINT0,
00061 AV_CH_LAYOUT_5POINT0_BACK,
00062 AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
00063 AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
00064 AV_CH_LAYOUT_5POINT1_BACK,
00065 AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,
00066 AV_CH_LAYOUT_5POINT0_BACK,
00067 AV_CH_LAYOUT_5POINT1_BACK,
00068 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00069 };
00070
00071 static const uint8_t thd_chancount[13] = {
00072
00073 2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1
00074 };
00075
00076 static const uint64_t thd_layout[13] = {
00077 AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT,
00078 AV_CH_FRONT_CENTER,
00079 AV_CH_LOW_FREQUENCY,
00080 AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT,
00081 AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT,
00082 AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER,
00083 AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT,
00084 AV_CH_BACK_CENTER,
00085 AV_CH_TOP_CENTER,
00086 AV_CH_SURROUND_DIRECT_LEFT|AV_CH_SURROUND_DIRECT_RIGHT,
00087 AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT,
00088 AV_CH_TOP_FRONT_CENTER,
00089 AV_CH_LOW_FREQUENCY_2,
00090 };
00091
00092 static int mlp_samplerate(int in)
00093 {
00094 if (in == 0xF)
00095 return 0;
00096
00097 return (in & 8 ? 44100 : 48000) << (in & 7) ;
00098 }
00099
00100 static int truehd_channels(int chanmap)
00101 {
00102 int channels = 0, i;
00103
00104 for (i = 0; i < 13; i++)
00105 channels += thd_chancount[i] * ((chanmap >> i) & 1);
00106
00107 return channels;
00108 }
00109
00110 uint64_t ff_truehd_layout(int chanmap)
00111 {
00112 int i;
00113 uint64_t layout = 0;
00114
00115 for (i = 0; i < 13; i++)
00116 layout |= thd_layout[i] * ((chanmap >> i) & 1);
00117
00118 return layout;
00119 }
00120
00127 int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb)
00128 {
00129 int ratebits;
00130 uint16_t checksum;
00131
00132 av_assert1(get_bits_count(gb) == 0);
00133
00134 if (gb->size_in_bits < 28 << 3) {
00135 av_log(log, AV_LOG_ERROR, "packet too short, unable to read major sync\n");
00136 return -1;
00137 }
00138
00139 checksum = ff_mlp_checksum16(gb->buffer, 26);
00140 if (checksum != AV_RL16(gb->buffer+26)) {
00141 av_log(log, AV_LOG_ERROR, "major sync info header checksum error\n");
00142 return AVERROR_INVALIDDATA;
00143 }
00144
00145 if (get_bits_long(gb, 24) != 0xf8726f)
00146 return AVERROR_INVALIDDATA;
00147
00148 mh->stream_type = get_bits(gb, 8);
00149
00150 if (mh->stream_type == 0xbb) {
00151 mh->group1_bits = mlp_quants[get_bits(gb, 4)];
00152 mh->group2_bits = mlp_quants[get_bits(gb, 4)];
00153
00154 ratebits = get_bits(gb, 4);
00155 mh->group1_samplerate = mlp_samplerate(ratebits);
00156 mh->group2_samplerate = mlp_samplerate(get_bits(gb, 4));
00157
00158 skip_bits(gb, 11);
00159
00160 mh->channels_mlp = get_bits(gb, 5);
00161 } else if (mh->stream_type == 0xba) {
00162 mh->group1_bits = 24;
00163 mh->group2_bits = 0;
00164
00165 ratebits = get_bits(gb, 4);
00166 mh->group1_samplerate = mlp_samplerate(ratebits);
00167 mh->group2_samplerate = 0;
00168
00169 skip_bits(gb, 8);
00170
00171 mh->channels_thd_stream1 = get_bits(gb, 5);
00172
00173 skip_bits(gb, 2);
00174
00175 mh->channels_thd_stream2 = get_bits(gb, 13);
00176 } else
00177 return AVERROR_INVALIDDATA;
00178
00179 mh->access_unit_size = 40 << (ratebits & 7);
00180 mh->access_unit_size_pow2 = 64 << (ratebits & 7);
00181
00182 skip_bits_long(gb, 48);
00183
00184 mh->is_vbr = get_bits1(gb);
00185
00186 mh->peak_bitrate = (get_bits(gb, 15) * mh->group1_samplerate + 8) >> 4;
00187
00188 mh->num_substreams = get_bits(gb, 4);
00189
00190 skip_bits_long(gb, 4 + 11 * 8);
00191
00192 return 0;
00193 }
00194
00195 typedef struct MLPParseContext
00196 {
00197 ParseContext pc;
00198
00199 int bytes_left;
00200
00201 int in_sync;
00202
00203 int num_substreams;
00204 } MLPParseContext;
00205
00206 static av_cold int mlp_init(AVCodecParserContext *s)
00207 {
00208 ff_mlp_init_crc();
00209 return 0;
00210 }
00211
00212 static int mlp_parse(AVCodecParserContext *s,
00213 AVCodecContext *avctx,
00214 const uint8_t **poutbuf, int *poutbuf_size,
00215 const uint8_t *buf, int buf_size)
00216 {
00217 MLPParseContext *mp = s->priv_data;
00218 int sync_present;
00219 uint8_t parity_bits;
00220 int next;
00221 int i, p = 0;
00222
00223 *poutbuf_size = 0;
00224 if (buf_size == 0)
00225 return 0;
00226
00227 if (!mp->in_sync) {
00228
00229
00230 for (i = 0; i < buf_size; i++) {
00231 mp->pc.state = (mp->pc.state << 8) | buf[i];
00232 if ((mp->pc.state & 0xfffffffe) == 0xf8726fba &&
00233
00234 mp->pc.index + i >= 7) {
00235 mp->in_sync = 1;
00236 mp->bytes_left = 0;
00237 break;
00238 }
00239 }
00240
00241 if (!mp->in_sync) {
00242 if (ff_combine_frame(&mp->pc, END_NOT_FOUND, &buf, &buf_size) != -1)
00243 av_log(avctx, AV_LOG_WARNING, "ff_combine_frame failed\n");
00244 return buf_size;
00245 }
00246
00247 ff_combine_frame(&mp->pc, i - 7, &buf, &buf_size);
00248
00249 return i - 7;
00250 }
00251
00252 if (mp->bytes_left == 0) {
00253
00254
00255
00256 for(; mp->pc.overread>0; mp->pc.overread--) {
00257 mp->pc.buffer[mp->pc.index++]= mp->pc.buffer[mp->pc.overread_index++];
00258 }
00259
00260 if (mp->pc.index + buf_size < 2) {
00261 if (ff_combine_frame(&mp->pc, END_NOT_FOUND, &buf, &buf_size) != -1)
00262 av_log(avctx, AV_LOG_WARNING, "ff_combine_frame failed\n");
00263 return buf_size;
00264 }
00265
00266 mp->bytes_left = ((mp->pc.index > 0 ? mp->pc.buffer[0] : buf[0]) << 8)
00267 | (mp->pc.index > 1 ? mp->pc.buffer[1] : buf[1-mp->pc.index]);
00268 mp->bytes_left = (mp->bytes_left & 0xfff) * 2;
00269 if (mp->bytes_left <= 0) {
00270 goto lost_sync;
00271 }
00272 mp->bytes_left -= mp->pc.index;
00273 }
00274
00275 next = (mp->bytes_left > buf_size) ? END_NOT_FOUND : mp->bytes_left;
00276
00277 if (ff_combine_frame(&mp->pc, next, &buf, &buf_size) < 0) {
00278 mp->bytes_left -= buf_size;
00279 return buf_size;
00280 }
00281
00282 mp->bytes_left = 0;
00283
00284 sync_present = (AV_RB32(buf + 4) & 0xfffffffe) == 0xf8726fba;
00285
00286 if (!sync_present) {
00287
00288
00289
00290
00291 parity_bits = 0;
00292 for (i = -1; i < mp->num_substreams; i++) {
00293 parity_bits ^= buf[p++];
00294 parity_bits ^= buf[p++];
00295
00296 if (i < 0 || buf[p-2] & 0x80) {
00297 parity_bits ^= buf[p++];
00298 parity_bits ^= buf[p++];
00299 }
00300 }
00301
00302 if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
00303 av_log(avctx, AV_LOG_INFO, "mlpparse: Parity check failed.\n");
00304 goto lost_sync;
00305 }
00306 } else {
00307 GetBitContext gb;
00308 MLPHeaderInfo mh;
00309
00310 init_get_bits(&gb, buf + 4, (buf_size - 4) << 3);
00311 if (ff_mlp_read_major_sync(avctx, &mh, &gb) < 0)
00312 goto lost_sync;
00313
00314 avctx->bits_per_raw_sample = mh.group1_bits;
00315 if (avctx->bits_per_raw_sample > 16)
00316 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
00317 else
00318 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
00319 avctx->sample_rate = mh.group1_samplerate;
00320 s->duration = mh.access_unit_size;
00321
00322 if(!avctx->channels || !avctx->channel_layout) {
00323 if (mh.stream_type == 0xbb) {
00324
00325 avctx->channels = mlp_channels[mh.channels_mlp];
00326 avctx->channel_layout = ff_mlp_layout[mh.channels_mlp];
00327 } else {
00328
00329 if (mh.channels_thd_stream2) {
00330 avctx->channels = truehd_channels(mh.channels_thd_stream2);
00331 avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream2);
00332 } else {
00333 avctx->channels = truehd_channels(mh.channels_thd_stream1);
00334 avctx->channel_layout = ff_truehd_layout(mh.channels_thd_stream1);
00335 }
00336 }
00337 }
00338
00339 if (!mh.is_vbr)
00340 avctx->bit_rate = mh.peak_bitrate;
00341
00342 mp->num_substreams = mh.num_substreams;
00343 }
00344
00345 *poutbuf = buf;
00346 *poutbuf_size = buf_size;
00347
00348 return next;
00349
00350 lost_sync:
00351 mp->in_sync = 0;
00352 return 1;
00353 }
00354
00355 AVCodecParser ff_mlp_parser = {
00356 .codec_ids = { AV_CODEC_ID_MLP, AV_CODEC_ID_TRUEHD },
00357 .priv_data_size = sizeof(MLPParseContext),
00358 .parser_init = mlp_init,
00359 .parser_parse = mlp_parse,
00360 .parser_close = ff_parse_close,
00361 };