2015-09-30 6:44 GMT+09:00 Shawn Singh <shawnsi...@google.com>: > The DDTS atom is defined in ETSI TS 102 114, v1.4.1, Annex E. > This is useful for DTS-HD formats, some of which cannot be > decoded by dcadec.c or libdcadec. >
How useful? DTS audio has scalability, and 'ddts' box indicates only one of properties of the stream. > > Signed-off-by: Shawn Singh <shawnsi...@google.com> > --- > libavformat/mov.c | 56 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 56 insertions(+) > > diff --git a/libavformat/mov.c b/libavformat/mov.c > index c57aaeb..da170a6 100644 > --- a/libavformat/mov.c > +++ b/libavformat/mov.c > @@ -744,6 +744,61 @@ static int mov_read_dec3(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > return 0; > } > > +static int mov_read_ddts(MOVContext *c, AVIOContext *pb, MOVAtom atom) > +{ > + const uint32_t ddts_size = 20; > + AVStream *st = NULL; > + uint8_t *buf = NULL; > + uint32_t frame_duration_code = 0; > + uint32_t channel_layout_code = 0; > + GetBitContext gb; > + > + buf = av_malloc(ddts_size + FF_INPUT_BUFFER_PADDING_SIZE); > + if (!buf) { > + return AVERROR(ENOMEM); > + } > + if (avio_read(pb, buf, ddts_size) < ddts_size) { > + av_free(buf); > + return AVERROR_INVALIDDATA; > + } > + > + init_get_bits(&gb, buf, 8*ddts_size); > + > + if (c->fc->nb_streams < 1) { > + return 0; > + } > + st = c->fc->streams[c->fc->nb_streams-1]; > + > + st->codec->sample_rate = get_bits_long(&gb, 32); > + skip_bits_long(&gb, 32); /* max bitrate */ > + st->codec->bit_rate = get_bits_long(&gb, 32); > + st->codec->bits_per_coded_sample = get_bits(&gb, 8); > This field is set to 0 as a reserved field if the file is compatible with Ultra Violet's Common File Format (CFF). I prefer that the reference about this is here. > + frame_duration_code = get_bits(&gb, 2); > + skip_bits(&gb, 30); /* various fields */ > + channel_layout_code = get_bits(&gb, 16); > + > + st->codec->frame_size = > + (frame_duration_code == 0) ? 512 : > + (frame_duration_code == 1) ? 1024 : > + (frame_duration_code == 2) ? 2048 : > + (frame_duration_code == 3) ? 4096 : 0; > Wrong if LBRDurationMod is set to 1. > + > + if (channel_layout_code > 0xff) { > + av_log(c->fc, AV_LOG_WARNING, "Unsupported DTS audio channel > layout"); > + } > + st->codec->channel_layout = > + ((channel_layout_code & 0x1) ? AV_CH_FRONT_CENTER : 0) | > + ((channel_layout_code & 0x2) ? AV_CH_FRONT_LEFT : 0) | > + ((channel_layout_code & 0x2) ? AV_CH_FRONT_RIGHT : 0) | > + ((channel_layout_code & 0x4) ? AV_CH_SIDE_LEFT : 0) | > + ((channel_layout_code & 0x4) ? AV_CH_SIDE_RIGHT : 0) | > + ((channel_layout_code & 0x8) ? AV_CH_LOW_FREQUENCY : 0); > + > + st->codec->channels = > av_get_channel_layout_nb_channels(st->codec->channel_layout); > + > + return 0; > +} > + > static int mov_read_chan(MOVContext *c, AVIOContext *pb, MOVAtom atom) > { > AVStream *st; > @@ -3824,6 +3879,7 @@ static const MOVParseTableEntry > mov_default_parse_table[] = { > { MKTAG('e','s','d','s'), mov_read_esds }, > { MKTAG('d','a','c','3'), mov_read_dac3 }, /* AC-3 info */ > { MKTAG('d','e','c','3'), mov_read_dec3 }, /* EAC-3 info */ > +{ MKTAG('d','d','t','s'), mov_read_ddts }, /* DTS audio descriptor */ > { MKTAG('w','i','d','e'), mov_read_wide }, /* place holder */ > { MKTAG('w','f','e','x'), mov_read_wfex }, > { MKTAG('c','m','o','v'), mov_read_cmov }, > -- > 2.6.0.rc2.230.g3dd15c0 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel