[FFmpeg-devel] [PATCH] avformat/mlpdec: fix time_base for packet timestamps

Paul B Mahol onemda at gmail.com
Sun Sep 5 19:14:45 EEST 2021


On Sun, Sep 5, 2021 at 6:12 PM Andreas Rheinhardt <
andreas.rheinhardt at outlook.com> wrote:

> Paul B Mahol:
> > Signed-off-by: Paul B Mahol <onemda at gmail.com>
> > ---
> >  libavformat/mlpdec.c | 38 +++++++++++++++++++++++++++++++++++---
> >  1 file changed, 35 insertions(+), 3 deletions(-)
> >
> > diff --git a/libavformat/mlpdec.c b/libavformat/mlpdec.c
> > index 8f0aabb510..f13d0fac8c 100644
> > --- a/libavformat/mlpdec.c
> > +++ b/libavformat/mlpdec.c
> > @@ -22,8 +22,11 @@
> >   */
> >
> >  #include "avformat.h"
> > +#include "avio_internal.h"
> > +#include "internal.h"
> >  #include "rawdec.h"
> >  #include "libavutil/intreadwrite.h"
> > +#include "libavcodec/mlp_parse.h"
> >
> >  static int av_always_inline mlp_thd_probe(const AVProbeData *p,
> uint32_t sync)
> >  {
> > @@ -50,6 +53,36 @@ static int av_always_inline mlp_thd_probe(const
> AVProbeData *p, uint32_t sync)
> >      return 0;
> >  }
> >
> > +static int mlp_read_header(AVFormatContext *s)
> > +{
> > +    int ret = ff_raw_audio_read_header(s);
> > +
> > +    if (ret < 0)
> > +        return ret;
> > +
> > +    ret = ffio_ensure_seekback(s->pb, 10);
> > +    if (ret == 0) {
> > +        int sample_rate, type;
> > +
> > +        avio_skip(s->pb, 7);
> > +        type = avio_r8(s->pb);
> > +
> > +        switch (type) {
> > +        case 0xba:
> > +            sample_rate = mlp_samplerate(avio_r8(s->pb) >> 4);
> > +            break;
> > +        case 0xbb:
> > +            sample_rate = mlp_samplerate((avio_rb16(s->pb) >> 4) & 0xF);
> > +            break;
> > +        }
> > +
> > +        avpriv_set_pts_info(s->streams[0], 64, 1, sample_rate);
> > +        avio_seek(s->pb, -9 - (type == 0xbb), SEEK_CUR);
>
> This presumes that one of the two cases of the switch will be taken.
> I think it would be easier if you just read the first 10 bytes into a
> stack buffer and parsed from it instead. Then you can always seek back
> by 10 bytes.
>
> (I always thought that thd can have very high samplerates (up to
> 192kHz). Am I wrong?)
>

Yes, but lowest is 44100 Hz.

>
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> >  #if CONFIG_MLP_DEMUXER
> >  static int mlp_probe(const AVProbeData *p)
> >  {
> > @@ -60,7 +93,7 @@ const AVInputFormat ff_mlp_demuxer = {
> >      .name           = "mlp",
> >      .long_name      = NULL_IF_CONFIG_SMALL("raw MLP"),
> >      .read_probe     = mlp_probe,
> > -    .read_header    = ff_raw_audio_read_header,
> > +    .read_header    = mlp_read_header,
> >      .read_packet    = ff_raw_read_partial_packet,
> >      .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
> >      .extensions     = "mlp",
> > @@ -80,7 +113,7 @@ const AVInputFormat ff_truehd_demuxer = {
> >      .name           = "truehd",
> >      .long_name      = NULL_IF_CONFIG_SMALL("raw TrueHD"),
> >      .read_probe     = thd_probe,
> > -    .read_header    = ff_raw_audio_read_header,
> > +    .read_header    = mlp_read_header,
> >      .read_packet    = ff_raw_read_partial_packet,
> >      .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
> >      .extensions     = "thd",
> > @@ -89,4 +122,3 @@ const AVInputFormat ff_truehd_demuxer = {
> >      .priv_class     = &ff_raw_demuxer_class,
> >  };
> >  #endif
> > -
> >
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>


More information about the ffmpeg-devel mailing list