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

Paul B Mahol onemda at gmail.com
Sun Sep 5 18:58:36 EEST 2021


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);
+    }
+
+    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
-
-- 
2.17.1



More information about the ffmpeg-devel mailing list