From patchwork Fri Apr 16 19:18:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 26951 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 7FAF544B40C for ; Fri, 16 Apr 2021 22:18:42 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 53F5C68A10A; Fri, 16 Apr 2021 22:18:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-oln040092067066.outbound.protection.outlook.com [40.92.67.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C991D68A10A for ; Fri, 16 Apr 2021 22:18:35 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AQwABi67ePzZD1KmogfQ/V/VK4IkIB7kBydvZwdliaNpKKK2E380FOGjqRd6fkAR8GHlyHzJ08POd+ZyeVivuu5lhpxakjR8JfEMKjXqy+13rYj+gBtMaykC6F9eUpqdn+vUbp9jvImVL+ypQjajSOOpG0hye0fmxGTC9kSqI297auAB6LcGbJ8ogVC3hsgai8BEleUwRu9wKoQXfngmJDygN67P4oexLukKaj1jFhcQOQ50c5deCBTc+xB13m8nUKEHYJZ3yoiTUvxQiadu+nTNx9zrGby0bvnEq3Ptmh589Sp94pmH3psVPwhNiZVW1wz+5rT/K5PDfKoiC22zbA== 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=SwdvjyZsRsmu9/SardM+/SB8tP8lD8FwFswBLMWHlNs=; b=lh3oHTXrVK1btRxKIbkVvjmevQWWdDR0ahPNcHvnnMK9bGs8mLMHHaBG+8uESY9Xd4lAe/m0uZLRz5WKcwN2yYCXkVCZblfxNJgvR+yDXuiiacVsqusypDffBSjFg+YmPym7icRrdQuo86GoFmSZrZgNTrXXlNuUiA5N6i5sk9y2Wfw+k1wNHgX8+Xkg/W8sVmPW9ZyWS331bJ26jjbS5FyKIBVSocKsHwTqULT3A4k41t/GcV6YA4kfzZaMDs1YQHJe75IVXwfN6tQI3scoUOnItmsOsEEExsiaERuOKAIdyHJ/IT11rtOekwMMrr/KFTyZYhVXhsdnpQeWM5cz5g== 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=SwdvjyZsRsmu9/SardM+/SB8tP8lD8FwFswBLMWHlNs=; b=E1IWlvike7uqGxCobXD3FGmbccCFUpTmUMXZIPDg2QA7sLz6XrnTVG+JkTJPTBUxq+KP1qduxZq5Kr9mlaNS02g4htxb+L9NjtArFO3PeLPdjP6Ma/g7IENPjQehA7uLegJGGequ0zqj763tVnIY67g1eLqjInd3GVZREPBHWWXg5VgPPE/WKjwRqwtycSr447cFPcAF2L6TVAph4VcpW+hFtiPBqfms00snmugZbupppUL6HW6ciUhqwPvqh9+snHlyPd1NqCFITOsBxeWm20hksDixvk+CoDSltQmLrvF0OavyOzVfWC4hn4ePMNvwnXcAEPZVjVDJHootE9tqJg== Received: from AM5EUR02FT058.eop-EUR02.prod.protection.outlook.com (2a01:111:e400:7e1c::53) by AM5EUR02HT051.eop-EUR02.prod.protection.outlook.com (2a01:111:e400:7e1c::420) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4042.16; Fri, 16 Apr 2021 19:18:34 +0000 Received: from VI1PR0301MB2159.eurprd03.prod.outlook.com (2a01:111:e400:7e1c::40) by AM5EUR02FT058.mail.protection.outlook.com (2a01:111:e400:7e1c::396) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4042.16 via Frontend Transport; Fri, 16 Apr 2021 19:18:34 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:B2EFBCC8EA935AB4FE3E399D4F083EEFD4B8E44DD307B7B324B10D8B3E21840E; UpperCasedChecksum:F11FE7ED0DB8329C01191559F465E28241A845F2FA6F1FF0114AF5B1A58AD556; SizeAsReceived:7404; Count:46 Received: from VI1PR0301MB2159.eurprd03.prod.outlook.com ([fe80::9574:7cdc:6be4:137f]) by VI1PR0301MB2159.eurprd03.prod.outlook.com ([fe80::9574:7cdc:6be4:137f%5]) with mapi id 15.20.4020.023; Fri, 16 Apr 2021 19:18:34 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 16 Apr 2021 21:18:25 +0200 Message-ID: X-Mailer: git-send-email 2.27.0 X-TMN: [xs7eG47L/Racpq2RA8UAntmZfA2KJB8r] X-ClientProxiedBy: AM0PR04CA0050.eurprd04.prod.outlook.com (2603:10a6:208:1::27) To VI1PR0301MB2159.eurprd03.prod.outlook.com (2603:10a6:800:26::20) X-Microsoft-Original-Message-ID: <20210416191825.2199037-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.137.96) by AM0PR04CA0050.eurprd04.prod.outlook.com (2603:10a6:208:1::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4042.16 via Frontend Transport; Fri, 16 Apr 2021 19:18:33 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 46 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 18010bce-b0e5-4ffe-5ea6-08d9010c6d65 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiQEjcSWVrNq6wBG75UJ8HQrDhpOXWW5MxlYujPhSzOWIg478ivibKXN0LjO+XtdtQF4y3wkhpXoCHf+7c5T3BekrUpOB1faHb+iovy2wTeHGKmlL2fawYiZrqpomrpO9vPuwA4/dvYb0xyeRu/XuRH907lpi6gds0UvXEV2JReJ+4uuZuM9mRagApLroCMvjYa0KvI5cpe9YYwPWS1agDdwySOrMV5LU/lO0KRNS83UchnKvMfYkeF2TLFj6mTPX1ri9nFTkKWlF9gDxCbfaTpa5//zbcRB5eFQcpyev8duQ4qn0Y1SdSbkY2S3RN6kG2qpYzkwTOgsk9GS8YkBXEayGyd2BzxLkbXmRrkDU4zgTzPKWctKDhxPgiqL6Go5KlsoZgctWMEP5Vqse6c8PU5U93X/phzOCq5nu/mJeDJedmmk3QcwK526+LJfWew7M3Mu2RGy2H8L0gxIaCp8bZSBngE2DueC2ErXylTFczTLBd3FfEQWAL8IOHyzfml6raYBq7aBV7juwiWSMh16sVBhcziFI8Qcm220T1ePYs+eUxE+GV1UaF9B9hCgwfxhKP31yDNTUKpAvHANs6sYqCmehnR/vNcQjKa6Lc+i6ZdEsoUduHSDxhyhKSQ523IArYhoF+TYQ0KjnErTF5bzzJ9HViHcDqcRlMyusOkG4Ri+QzGM1UHeBRIaklsiAwkze2NYj+/4JUQ/diQjvovq+R54L0AD+NAa6HTUneMwxogzP67LBGVCOKdn6Hl64kt4mok= X-MS-TrafficTypeDiagnostic: AM5EUR02HT051: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: yN71OsNrdA9khI8IOLaDWn190+beT4ggU8LlictpLRD6Hqkh0Tp0wyBfdCMu5Y7WDcOWRene9kF/Q78VRhDi/RLMmN/j6lDCU4zyqLSgXhoCbGl7xCwtiINxLIDMUxntIy9PD+F905d2YnjFsFJmuG7X7lgQ0n1FhAu+vNMxL3cS6tCoH4yyntMd2fazcvTRfWYzxEk8Tz7sCkTbrq3YIiH9vpc3pXC6RvteS0qkf9u99r0FsvBJgcoMWw8lmISBLA2SlDdlTU73wn6hLcdIjJWI/Q4lUw+MKVInE7Bvw+X74gt7pLt4Si7RuPWlXI8w8U8qAC5MeNQpCQAkRxMENJkc94foJSzKI9gP5dW8hX4W7potc8FGygPpWaQ65BfhBrRG9EHJ6srppc1+cr07pQ== X-MS-Exchange-AntiSpam-MessageData: y18OGAo2Ip6k2eVdrfVr35zCKJqJPrFUqVN1aZRU+R4nhPeIiDsixcaxKi79wfiC2z/uITahNNAYTH0WwBs46/n5QYfo0VKsbiFXhaAqvmT2r0VXZ2e4bqsh/4xSCdMliG+OCR5vIf1Z56sVpQR9mA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 18010bce-b0e5-4ffe-5ea6-08d9010c6d65 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Apr 2021 19:18:34.1668 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: AM5EUR02FT058.eop-EUR02.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: AM5EUR02HT051 Subject: [FFmpeg-devel] [PATCH] 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" In this case the cover images will get the stream index 0, violating the hardcoded assumption that this is the index of the audio stream. Fixes #8540; regression since f5aad350d3695b5b16e7d135154a4c61e4dce9d8. Signed-off-by: Andreas Rheinhardt --- libavformat/wavdec.c | 51 +++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c index 8214ab8498..6e584bbbb3 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 *ast, *vst; int64_t smv_data_ofs; int smv_block_size; int smv_frames_per_jpeg; @@ -77,7 +78,7 @@ static const AVOption demux_options[] = { static void set_spdif(AVFormatContext *s, WAVDemuxContext *wav) { - if (CONFIG_SPDIF_DEMUXER && s->streams[0]->codecpar->codec_tag == 1) { + if (CONFIG_SPDIF_DEMUXER && wav->ast->codecpar->codec_tag == 1) { enum AVCodecID codec; int len = 1<<16; int ret = ffio_ensure_seekback(s->pb, len); @@ -92,7 +93,7 @@ static void set_spdif(AVFormatContext *s, WAVDemuxContext *wav) if (len >= 0) { ret = ff_spdif_probe(buf, len, &codec); if (ret > AVPROBE_SCORE_EXTENSION) { - s->streams[0]->codecpar->codec_id = codec; + wav->ast->codecpar->codec_id = codec; wav->spdif = 1; } } @@ -180,6 +181,7 @@ static int wav_parse_fmt_tag(AVFormatContext *s, int64_t size, AVStream **st) *st = avformat_new_stream(s, NULL); if (!*st) return AVERROR(ENOMEM); + wav->ast = *st; ret = ff_get_wav_header(s, pb, (*st)->codecpar, size, wav->rifx); if (ret < 0) @@ -196,6 +198,7 @@ static int wav_parse_fmt_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; + WAVDemuxContext *wav = s->priv_data; int version, num_streams, i, channels = 0, ret; if (size < 36) @@ -204,6 +207,7 @@ static int wav_parse_xma2_tag(AVFormatContext *s, int64_t size, AVStream **st) *st = avformat_new_stream(s, NULL); if (!*st) return AVERROR(ENOMEM); + wav->ast = *st; (*st)->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; (*st)->codecpar->codec_id = AV_CODEC_ID_XMA2; @@ -484,6 +488,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 +698,29 @@ static int wav_read_packet(AVFormatContext *s, AVPacket *pkt) { int ret, size; int64_t left; - AVStream *st; WAVDemuxContext *wav = s->priv_data; + AVStream *st = wav->ast; - if (CONFIG_SPDIF_DEMUXER && wav->spdif == 1) - return ff_spdif_read_packet(s, pkt); + if (CONFIG_SPDIF_DEMUXER && wav->spdif == 1) { + ret = ff_spdif_read_packet(s, pkt); + if (ret < 0) + return ret; + pkt->stream_index = st->index; + return 0; + } 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 +743,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 +754,6 @@ smv_out: } } - st = s->streams[0]; - left = wav->data_end - avio_tell(s->pb); if (wav->ignore_length) left = INT_MAX; @@ -772,7 +781,7 @@ smv_out: ret = av_get_packet(s->pb, pkt, size); if (ret < 0) return ret; - pkt->stream_index = 0; + pkt->stream_index = st->index; return ret; } @@ -781,22 +790,25 @@ static int wav_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { WAVDemuxContext *wav = s->priv_data; - AVStream *st; + AVStream *ast = wav->ast, *vst = wav->vst; wav->smv_eof = 0; wav->audio_eof = 0; + + if (stream_index != ast->index && + (!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); + if (stream_index == ast->index) + 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: @@ -870,6 +882,7 @@ static int w64_read_header(AVFormatContext *s) st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); + wav->ast = st; while (!avio_feof(pb)) { if (avio_read(pb, guid, 16) != 16)