[FFmpeg-devel] [PATCH] libavformat/mov.c: Add parsing for DDTS atom for DTS audio

Michael Niedermayer michaelni at gmx.at
Wed Sep 30 14:53:17 CEST 2015


On Wed, Sep 30, 2015 at 02:17:02PM +0900, Yusuke Nakamura wrote:
> 2015-09-30 6:44 GMT+09:00 Shawn Singh <shawnsingh at 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 <shawnsingh at 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 you think its better to revert this patch, just say so and ill
revert

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The worst form of inequality is to try to make unequal things equal.
-- Aristotle
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150930/e46f0191/attachment.sig>


More information about the ffmpeg-devel mailing list