diff mbox series

[FFmpeg-devel,10/13] avformat/flvdec: add support for reading multi track audio

Message ID 20240521090316.782-11-timo@rothenpieler.org
State New
Headers show
Series flvdec/flvenc: add support for enhanced rtmp codecs and multitrack/multichannel | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished

Commit Message

Timo Rothenpieler May 21, 2024, 9:02 a.m. UTC
---
 libavformat/flvdec.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index 890958351a..5877828c52 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -1336,12 +1336,26 @@  retry:
             pkt_type = flags & ~FLV_AUDIO_CODECID_MASK;
 
             if (pkt_type == AudioPacketTypeMultitrack) {
-                av_log(s, AV_LOG_ERROR, "Multitrack audio is unsupported!\n");
-                return AVERROR_PATCHWELCOME;
+                uint8_t types = avio_r8(s->pb);
+                int multitrack_type = types >> 4;
+                pkt_type = types & 0xF;
+
+                if (multitrack_type != MultitrackTypeOneTrack) {
+                    av_log(s, AV_LOG_ERROR, "Audio multitrack types other than MultitrackTypeOneTrack are unsupported!\n");
+                    return AVERROR_PATCHWELCOME;
+                }
+
+                multitrack = 1;
+                size--;
             }
 
             codec_id = avio_rb32(s->pb);
             size -= 4;
+
+            if (multitrack) {
+                track_idx = avio_r8(s->pb);
+                size--;
+            }
         }
     } else if (type == FLV_TAG_TYPE_VIDEO) {
         stream_type = FLV_STREAM_TYPE_VIDEO;
@@ -1438,7 +1452,8 @@  skip:
         st = s->streams[i];
         if (stream_type == FLV_STREAM_TYPE_AUDIO) {
             if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
-                (s->audio_codec_id || flv_same_audio_codec(st->codecpar, flags, codec_id)))
+                (s->audio_codec_id || flv_same_audio_codec(st->codecpar, flags, codec_id)) &&
+                st->id == track_idx)
                 break;
         } else if (stream_type == FLV_STREAM_TYPE_VIDEO) {
             if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&