Signed-off-by: sunzhenliang <hisunzhenli...@outlook.com> --- libavformat/amr.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/libavformat/amr.c b/libavformat/amr.c index 836b276fd5..2762010ebe 100644 --- a/libavformat/amr.c +++ b/libavformat/amr.c @@ -36,8 +36,10 @@ typedef struct { uint64_t block_count; } AMRContext; -static const char AMR_header[] = "#!AMR\n"; -static const char AMRWB_header[] = "#!AMR-WB\n"; +static const char AMR_header[] = "#!AMR\n"; +static const char AMR_MC_header[] = "#!AMR_MC1.0\n"; +static const char AMRWB_header[] = "#!AMR-WB\n"; +static const char AMRWB_MC_header[] = "#!AMR-WB_MC1.0\n"; static const uint8_t amrnb_packed_size[16] = { 13, 14, 16, 18, 20, 21, 27, 32, 6, 1, 1, 1, 1, 1, 1, 1 @@ -82,7 +84,7 @@ static int amr_read_header(AVFormatContext *s) { AVIOContext *pb = s->pb; AVStream *st; - uint8_t header[9]; + uint8_t header[15]; if (avio_read(pb, header, 6) != 6) return AVERROR_INVALIDDATA; @@ -94,7 +96,19 @@ static int amr_read_header(AVFormatContext *s) if (avio_read(pb, header + 6, 3) != 3) return AVERROR_INVALIDDATA; if (memcmp(header, AMRWB_header, 9)) { - return -1; + if (avio_read(pb, header + 6 + 3, 3) != 3) + return AVERROR_INVALIDDATA; + if (memcmp(header, AMR_MC_header, 12)) { + if (avio_read(pb, header + 6 + 3 + 3, 3) != 3) + return AVERROR_INVALIDDATA; + if (memcmp(header, AMRWB_MC_header, 15)) { + return -1; + } + avpriv_report_missing_feature(s, "multi-channel AMRWB"); + return AVERROR_PATCHWELCOME; + } + avpriv_report_missing_feature(s, "multi-channel AMR"); + return AVERROR_PATCHWELCOME; } st->codecpar->codec_tag = MKTAG('s', 'a', 'w', 'b'); -- 2.25.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".