From patchwork Sat Apr 17 01:33:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 26952 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 5D6304496DD for ; Sat, 17 Apr 2021 04:33:58 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3787D68A5F8; Sat, 17 Apr 2021 04:33:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR06-DB8-obe.outbound.protection.outlook.com (mail-db8eur06olkn2094.outbound.protection.outlook.com [40.92.51.94]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9ACE568994E for ; Sat, 17 Apr 2021 04:33:51 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gG77xZ7QK9VA4+pjQT/dkK/I6v6LAvuQClZH4bnl8iO3K7lPVi064TfNjbWQkc4vsbi/xfr6pJyDNpRKAfGY9l2LGuV+h/UvbRQoZ+j0bavQLuXkjkWj1ihBsBNr46IOt0BEsi1uj2sBgQn/5MrRmGWP6sAyE1iPU1tD4gkaCLtS6lrEMlWwhHWwgemzere5tngXM+JD5a7mrCOVAtfj2qxgzwrCh01E05j0qL5JDvCYLjEtV0BLRWHxh9b6U77C2ShSZ2VMgmG5s+MofxLMgBon7nI5kynMqL+bmJBGFxJA9vcZKE1AvxLad2I5jVCxtI/r4S/g83GxYjuhFLrMog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+tQ00r+r6TYuhZd/1vAvPgufscxFhKL5QIlWx42/wbo=; b=kyQnoPXC+TLePsRjVnPbNSpgVBU/bKvxw5x6g7EOT0MC2Gxmrfa1TB4eYlNT+PeD1i77FrZdUj+1ubHAFFqTX0O1rdcmM7pEmi1OOOPkSX9NFBbepEH+cM7KBJwBhs0mjSbPJjSaESDZmMH60fEeNpU6Gb+Oxpl9g/P1fQkgSS+C4j7FPIGjwD1AQfY9tJlKbfLY+PcVzm+Y6mJbqBpLcX9tb5wDsnRyl2jge1eCx+wnMP1Iaputuz68boSaihgZPvJ77kxS5Hii0nlkOY6d5Ae9jTb7rvcxz6KnkRV+q1193BwIvVNSaiQrIErNvWYd29Fl0CWEf6pp+s0IFlGifA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+tQ00r+r6TYuhZd/1vAvPgufscxFhKL5QIlWx42/wbo=; b=Wz1yzUmMW6PcphaOeZx5/nmS/tbbxNOxMmm524HuCw9cBhcVYrIG/owKEmjf8RiXIMKoteDsE4CVOnBY0h5xhASMvH7H8Buf5C1xb7Ao/emXGFgyhY/mtq656i3vtZgvXrYTDLQ/axwPUyWYzdx9pJcZALKQvSoLcKv2yhJLHhEm6ycQIkRaSBPMJeTVG7Y0aA6z9zEwrTPb5yT0HIEai46MsXBbChEdOKbBhpUdjdJpK+39eKyBVHsb8Cas/ndFDTDDVf7VfrhI5pGR0UjBtd/cyq0bID5zAVHw7FHQAouR4H739QKNSZKIRG1y4/RG9GkzKnCOdMEJfzFrTPtH1g== Received: from DB8EUR06FT068.eop-eur06.prod.protection.outlook.com (2a01:111:e400:fc35::51) by DB8EUR06HT121.eop-eur06.prod.protection.outlook.com (2a01:111:e400:fc35::470) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4042.16; Sat, 17 Apr 2021 01:33:49 +0000 Received: from HE1PR0301MB2154.eurprd03.prod.outlook.com (2a01:111:e400:fc35::4f) by DB8EUR06FT068.mail.protection.outlook.com (2a01:111:e400:fc35::378) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4042.16 via Frontend Transport; Sat, 17 Apr 2021 01:33:49 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:7AD05E884B013CAED243910D84576A305531848BB88FD037D05A80F3EAD0816E; UpperCasedChecksum:060C46C59993A415234257C1F113088984E2A716A5AD3E1361C2819E21EA184F; SizeAsReceived:7397; Count:46 Received: from HE1PR0301MB2154.eurprd03.prod.outlook.com ([fe80::45bb:c44f:2b75:23b7]) by HE1PR0301MB2154.eurprd03.prod.outlook.com ([fe80::45bb:c44f:2b75:23b7%5]) with mapi id 15.20.4042.020; Sat, 17 Apr 2021 01:33:30 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 17 Apr 2021 03:33:22 +0200 Message-ID: X-Mailer: git-send-email 2.27.0 X-TMN: [0UqYGvvLzpC11qwFgkMJxYi4ysFBEHfr] X-ClientProxiedBy: AM9P195CA0004.EURP195.PROD.OUTLOOK.COM (2603:10a6:20b:21f::9) To HE1PR0301MB2154.eurprd03.prod.outlook.com (2603:10a6:3:2a::22) X-Microsoft-Original-Message-ID: <20210417013322.2368452-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.137.96) by AM9P195CA0004.EURP195.PROD.OUTLOOK.COM (2603:10a6:20b:21f::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4042.16 via Frontend Transport; Sat, 17 Apr 2021 01:33:30 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 46 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 6f5b9039-b960-4f82-2f0c-08d90140ceba X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiQEjcSWVrNq6xueYTKr3AqNCnj+ueXx3uy08/JWBzTA1lodLUgSlzY4IwQZr+gMj+Dmk29IchFfMB4yefhF6EQOcEH07DWQ/mt//uGGxPoRGVPAKkichA9lWJgmmKzzHSWGqEMUXFrmgX/gbAsBDj+bNdf2t0DpSLZWTmlAnFN6Czm4BFZm+UEYZsuYLHt48l5PbMxfB4R2VfAU6kSMOdRODRHAkAn/MUX7lL2mDklwQEHFNrkh2FhgabiGtI77DIJ1HfCYHKPFUQN7q2xR29O4pLirPDAL9pSlwCU3b4vByTTdJeSJeOBhL1dyTmgeiOKbxwSv71F4j4HvoGdBd9M0uuAFTKi7FGAUPn7CV/VKIPvUj1LkaQSBf27hRv2xUKw/YW4zCWve3hK+BZH0hFrHsAwd2zCmzRlml0MQKYez0d2S1L4FeVE+o90zR3E7toFJxYadbSUiOLn7tGxKmYqelfbnnU6+6exRKt0zhq3h7PJDpmrgRJgff9P4bcUUYVnPSdY6czPkEjBwE9Krb7viYffz/5thm0lN+k6PP7TTrYhwCJNX/Jqo99oGtftUHor09ynugofNUlbbSo6rpLWt8lWDYGlZESHalkaVofPmQ8pBpG7TOdz/KTgl1hoqmKFIxH4uUugnIB7b9QC88R9W6xVL9iOUbwjMdU9iAipI+LgAkibklEQO+wCBYQxWQp/RS/E0YnmFxX2vGtNqkYAKOZa/9GmE/6oKtf+oL2LLjGt1zM8BKHOo627Px8peHYg= X-MS-TrafficTypeDiagnostic: DB8EUR06HT121: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: RAeq+NuXb6q0xgmdpnH1AcNvNnL9b5mTGWzKtd+bVniPOcqn0WZud6ktPcDDSZHCBo8Scg8I5HmEzT1dLc/j7Nuw/oFLPw9Ct/f+8PxOLVw8ZjD1Ava8HZKU6LoEjYJG5soXycbpXchFPgHC/Ik8qvSi59p/aCI8PxNekskb+DV/IYlxwNs253Oay3iV39dtkS28fC3krJewzwZTcPmaITHlSK+0SsNP3FzEeX3P4+ymgnOozpMxFHJeJdJ1XGpmpFjNCHP5Kt051DvvbpqXUGi5MaGughvCm8D/0E3fWt2g62dMhF6WY5UyRa33gQ2yCoi/LsoxjbGweWx9EGBecdwP/I3rCTe65U7TPMOumxvI7PGeqdm1Z5C+yOdCG6uoYuDOGP9orhNTsvOAd260oQ== X-MS-Exchange-AntiSpam-MessageData: v8B5rhHlgIoIvHq482KUf+HbyBHcivuDAde1RcJjvZP/0GFbLOqYCjglGmcKiJ8uxYCDE9l7ZEyEf+TDwjLjeMFNREpkuL+4A2d2MtRt9u3wr/DMQT5VA5i518TTqJcbMaUy5GnPKSw9t3nQjUs9qA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6f5b9039-b960-4f82-2f0c-08d90140ceba X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Apr 2021 01:33:30.9457 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: DB8EUR06FT068.eop-eur06.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8EUR06HT121 Subject: [FFmpeg-devel] [PATCH v2] avformat/wavdec: Fix reading files with id3v2 apic before fmt tag X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Up until now the cover images will get the stream index 0 in this case, violating the hardcoded assumption that this is the index of the audio stream. Fix this by creating the audio stream first; this is also in line with the expectations of ff_pcm_read_seek() and ff_spdif_read_packet(). It also simplifies the code to parse the fmt and xma2 tags. Fixes #8540; regression since f5aad350d3695b5b16e7d135154a4c61e4dce9d8. Signed-off-by: Andreas Rheinhardt --- libavformat/wavdec.c | 78 ++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c index 8214ab8498..791ae23b4a 100644 --- a/libavformat/wavdec.c +++ b/libavformat/wavdec.c @@ -49,6 +49,7 @@ typedef struct WAVDemuxContext { const AVClass *class; int64_t data_end; int w64; + AVStream *vst; int64_t smv_data_ofs; int smv_block_size; int smv_frames_per_jpeg; @@ -170,30 +171,26 @@ static void handle_stream_probing(AVStream *st) } } -static int wav_parse_fmt_tag(AVFormatContext *s, int64_t size, AVStream **st) +static int wav_parse_fmt_tag(AVFormatContext *s, int64_t size, AVStream *st) { AVIOContext *pb = s->pb; WAVDemuxContext *wav = s->priv_data; int ret; /* parse fmt header */ - *st = avformat_new_stream(s, NULL); - if (!*st) - return AVERROR(ENOMEM); - - ret = ff_get_wav_header(s, pb, (*st)->codecpar, size, wav->rifx); + ret = ff_get_wav_header(s, pb, st->codecpar, size, wav->rifx); if (ret < 0) return ret; - handle_stream_probing(*st); + handle_stream_probing(st); - (*st)->need_parsing = AVSTREAM_PARSE_FULL_RAW; + st->need_parsing = AVSTREAM_PARSE_FULL_RAW; - avpriv_set_pts_info(*st, 64, 1, (*st)->codecpar->sample_rate); + avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate); return 0; } -static int wav_parse_xma2_tag(AVFormatContext *s, int64_t size, AVStream **st) +static int wav_parse_xma2_tag(AVFormatContext *s, int64_t size, AVStream *st) { AVIOContext *pb = s->pb; int version, num_streams, i, channels = 0, ret; @@ -201,13 +198,9 @@ static int wav_parse_xma2_tag(AVFormatContext *s, int64_t size, AVStream **st) if (size < 36) return AVERROR_INVALIDDATA; - *st = avformat_new_stream(s, NULL); - if (!*st) - return AVERROR(ENOMEM); - - (*st)->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; - (*st)->codecpar->codec_id = AV_CODEC_ID_XMA2; - (*st)->need_parsing = AVSTREAM_PARSE_FULL_RAW; + st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; + st->codecpar->codec_id = AV_CODEC_ID_XMA2; + st->need_parsing = AVSTREAM_PARSE_FULL_RAW; version = avio_r8(pb); if (version != 3 && version != 4) @@ -216,26 +209,26 @@ static int wav_parse_xma2_tag(AVFormatContext *s, int64_t size, AVStream **st) if (size != (32 + ((version==3)?0:8) + 4*num_streams)) return AVERROR_INVALIDDATA; avio_skip(pb, 10); - (*st)->codecpar->sample_rate = avio_rb32(pb); + st->codecpar->sample_rate = avio_rb32(pb); if (version == 4) avio_skip(pb, 8); avio_skip(pb, 4); - (*st)->duration = avio_rb32(pb); + st->duration = avio_rb32(pb); avio_skip(pb, 8); for (i = 0; i < num_streams; i++) { channels += avio_r8(pb); avio_skip(pb, 3); } - (*st)->codecpar->channels = channels; + st->codecpar->channels = channels; - if ((*st)->codecpar->channels <= 0 || (*st)->codecpar->sample_rate <= 0) + if (st->codecpar->channels <= 0 || st->codecpar->sample_rate <= 0) return AVERROR_INVALIDDATA; - avpriv_set_pts_info(*st, 64, 1, (*st)->codecpar->sample_rate); + avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate); avio_seek(pb, -size, SEEK_CUR); - if ((ret = ff_get_extradata(s, (*st)->codecpar, pb, size)) < 0) + if ((ret = ff_get_extradata(s, st->codecpar, pb, size)) < 0) return ret; return 0; @@ -407,6 +400,11 @@ static int wav_read_header(AVFormatContext *s) } + /* Create the audio stream now so that its index is always zero */ + st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + for (;;) { AVStream *vst; size = next_tag(pb, &tag, wav->rifx); @@ -418,7 +416,7 @@ static int wav_read_header(AVFormatContext *s) switch (tag) { case MKTAG('f', 'm', 't', ' '): /* only parse the first 'fmt ' tag found */ - if (!got_xma2 && !got_fmt && (ret = wav_parse_fmt_tag(s, size, &st)) < 0) { + if (!got_xma2 && !got_fmt && (ret = wav_parse_fmt_tag(s, size, st)) < 0) { return ret; } else if (got_fmt) av_log(s, AV_LOG_WARNING, "found more than one 'fmt ' tag\n"); @@ -427,7 +425,7 @@ static int wav_read_header(AVFormatContext *s) break; case MKTAG('X', 'M', 'A', '2'): /* only parse the first 'XMA2' tag found */ - if (!got_fmt && !got_xma2 && (ret = wav_parse_xma2_tag(s, size, &st)) < 0) { + if (!got_fmt && !got_xma2 && (ret = wav_parse_xma2_tag(s, size, st)) < 0) { return ret; } else if (got_xma2) av_log(s, AV_LOG_WARNING, "found more than one 'XMA2' tag\n"); @@ -484,6 +482,7 @@ static int wav_read_header(AVFormatContext *s) vst = avformat_new_stream(s, NULL); if (!vst) return AVERROR(ENOMEM); + wav->vst = vst; avio_r8(pb); vst->id = 1; vst->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; @@ -693,23 +692,24 @@ static int wav_read_packet(AVFormatContext *s, AVPacket *pkt) { int ret, size; int64_t left; - AVStream *st; WAVDemuxContext *wav = s->priv_data; + AVStream *st = s->streams[0]; if (CONFIG_SPDIF_DEMUXER && wav->spdif == 1) return ff_spdif_read_packet(s, pkt); if (wav->smv_data_ofs > 0) { int64_t audio_dts, video_dts; + AVStream *vst = wav->vst; smv_retry: - audio_dts = (int32_t)s->streams[0]->cur_dts; - video_dts = (int32_t)s->streams[1]->cur_dts; + audio_dts = (int32_t)st->cur_dts; + video_dts = (int32_t)vst->cur_dts; if (audio_dts != AV_NOPTS_VALUE && video_dts != AV_NOPTS_VALUE) { /*We always return a video frame first to get the pixel format first*/ wav->smv_last_stream = wav->smv_given_first ? - av_compare_ts(video_dts, s->streams[1]->time_base, - audio_dts, s->streams[0]->time_base) > 0 : 0; + av_compare_ts(video_dts, vst->time_base, + audio_dts, st->time_base) > 0 : 0; wav->smv_given_first = 1; } wav->smv_last_stream = !wav->smv_last_stream; @@ -732,7 +732,7 @@ smv_retry: pkt->duration = wav->smv_frames_per_jpeg; wav->smv_block++; - pkt->stream_index = 1; + pkt->stream_index = vst->index; smv_out: avio_seek(s->pb, old_pos, SEEK_SET); if (ret == AVERROR_EOF) { @@ -743,8 +743,6 @@ smv_out: } } - st = s->streams[0]; - left = wav->data_end - avio_tell(s->pb); if (wav->ignore_length) left = INT_MAX; @@ -781,22 +779,24 @@ static int wav_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { WAVDemuxContext *wav = s->priv_data; - AVStream *st; + AVStream *ast = s->streams[0], *vst = wav->vst; wav->smv_eof = 0; wav->audio_eof = 0; + + if (stream_index != 0 && (!vst || stream_index != vst->index)) + return AVERROR(EINVAL); if (wav->smv_data_ofs > 0) { int64_t smv_timestamp = timestamp; if (stream_index == 0) - smv_timestamp = av_rescale_q(timestamp, s->streams[0]->time_base, s->streams[1]->time_base); + smv_timestamp = av_rescale_q(timestamp, ast->time_base, vst->time_base); else - timestamp = av_rescale_q(smv_timestamp, s->streams[1]->time_base, s->streams[0]->time_base); + timestamp = av_rescale_q(smv_timestamp, vst->time_base, ast->time_base); if (wav->smv_frames_per_jpeg > 0) { wav->smv_block = smv_timestamp / wav->smv_frames_per_jpeg; } } - st = s->streams[0]; - switch (st->codecpar->codec_id) { + switch (ast->codecpar->codec_id) { case AV_CODEC_ID_MP2: case AV_CODEC_ID_MP3: case AV_CODEC_ID_AC3: @@ -807,7 +807,7 @@ static int wav_read_seek(AVFormatContext *s, default: break; } - return ff_pcm_read_seek(s, stream_index, timestamp, flags); + return ff_pcm_read_seek(s, 0, timestamp, flags); } static const AVClass wav_demuxer_class = {