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

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Sun Sep 5 19:12:42 EEST 2021


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?)

> +    }
> +
> +    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
> -
> 



More information about the ffmpeg-devel mailing list