From patchwork Thu Oct 5 12:36:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 44159 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a09:b0:15d:8365:d4b8 with SMTP id fr9csp44056pzb; Thu, 5 Oct 2023 05:51:36 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGNuNNBClBqP0rdoPmp56jKUqwnO8MNnz8Ao8B3inZtAV+szT1XFgAn66iFY7y+yZJeVyvA X-Received: by 2002:a05:6402:134f:b0:532:bb18:7986 with SMTP id y15-20020a056402134f00b00532bb187986mr4975285edw.39.1696510295801; Thu, 05 Oct 2023 05:51:35 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f15-20020a05640214cf00b00532c7f80069si742722edx.6.2023.10.05.05.51.35; Thu, 05 Oct 2023 05:51:35 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=ecWZcNzn; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9B91D68CBAB; Thu, 5 Oct 2023 15:51:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-vi1eur04olkn2063.outbound.protection.outlook.com [40.92.75.63]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EF31D68CA05 for ; Thu, 5 Oct 2023 15:51:24 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QhUAzoWNf/cW7yN6dELFg33myhSu8WxCnsM7N1pDnea6bLEuM01cEk5rLSprD5ZkyUtincF4eVD/vdVEH2Et8e6m/LNebvL9TFiRnX1cvoVtcx22cIQHYKBrHd3WB07hlh7NjR6mk/HFgJdBDptIYu90em1FpfneYsW7yAZEgsjjgkXX4Q9z0vR/7SaSh37wSBpjMdb6/NoKeAyhQbdQx4UnuezC1yF+YHVGyxI794l2QEEXXwhYxLwrYoLYvzbf6Z/yEIBBy8Jd0IfAdheehJDeN8hl9i8n2HDmSjRFvNVjNO8QKNy9R6wXc5KgvWn0jARd+paOeVL0/bfkvrzS9A== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=F2wbvELofaU2uXuVYVLhk4VuqeniK+lvUs6pbMD6XuY=; b=jrTAO57EQzcRFAZIsZ25fC1NGEYstvWj8bo2xvfL0P8H/tAuChDWwNBb/9qmZgo1pEEpP9jVdf19iYnhLlwnkyhte5o2Rxd10ULkJk7qc/sDDqL0Yc47H0qMb8ODvar/v8CEKgUEGDXfPHQz+vx4witi2JKWtJnJ1EJCLa2/GocGb2eAoBYJGTL/+XC8X06n++KkhFLT6gqReJ8ABgUCoqKeadXNB+z6QL1R2yOY3V7Q18MVZn16WfzdseGkQdey6Bg/2MqOea5ibetgEeiglXFIcDcu9RQ7fK2hGlHK13J6YZoZ0PTrSE4Xn9TXLgL8I5lsxNPnSkYXCApXe/d/0A== 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=F2wbvELofaU2uXuVYVLhk4VuqeniK+lvUs6pbMD6XuY=; b=ecWZcNznYOop63dsTcxiiGl3xfXEJK0thKbQgWptVkK6grxB/F8cf/ZirSXkIKVK8bWNr5o+wgAcE2AygjB8F8Mz47qy0Zn/bGaUj9kn+mEyAP0XK7d2+tYn9gWXtCCxz4lVd65ob8J8IDnZMFWjExr913MuhFApa4EWvrBNv24JQzkqHOMuROVrwx5R2PKFTcDMSa3QUe5uiS5rxNphAGOXwAHiuXP4kbbO8I4fxPqbFLmX3LeepvKbSuR0xYNtPdr1eKrIWOtyAZI+5k1xFFjwqilhUh9PuYyVevowWIVig9j7xDjWK+liVjD+RvBDR4Y50cd+s8yidYZF9dV5kw== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0392.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:32b::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6838.33; Thu, 5 Oct 2023 12:35:45 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa%3]) with mapi id 15.20.6792.026; Thu, 5 Oct 2023 12:35:45 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 5 Oct 2023 14:36:52 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [+g6NCf+WXPEpJ2KduOJLNEbHbw7yiZrD] X-ClientProxiedBy: ZR2P278CA0004.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:50::8) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20231005123652.4019214-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0392:EE_ X-MS-Office365-Filtering-Correlation-Id: 9bf2e321-47f6-4a33-6cdd-08dbc59f982f X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: qiTgHfLHdQtdzKWIus35BNYXs8Uk8oZlmu648UxhZbmTAONhqBCpms2kmZfg9Q9v93wLOGE2opDYlzqSTdw1zzumotf9tI/UW3dXetdG3NIvk+AUt7QdRBSLl++LvxJfvtj69MtPuNy59ckLao2chrtR9WEp9/BpoEVhjyJE/lWXcvrOO9zJNju9Gz7VABrQwdT83dhasGfR0twi0sWd9TA5kktiIU3Xxts6e3lVxiT9cRjoaS0pmROUxa+9DpfxjQoHriG1rK97myocf1m1c2mMC3H9Jl7UMR4DfEpPuv40qdKyPbJRzd2NFveR0CQpf5THV+phnLn2J+UoZgRgkbFCRmH1wHOlUwQB5g9VrGZI5WdKrYdS7DhNdTaL3GVx7s3bjVM0qBva3OhPwiOK7f66kmqB/9IQ3HV+gKbb1zbm6HfbmXA0SmwzLwkTlMRnY3eLCvkLngP8S4NMTUjM9sH7VUCbrG9e4KPcT3RQnsCjtsEM10Oyy2sn8HUhupR++Dx+xYeHTA3cTWQD3MNpGARCBIF00nH/l2zQVo3tXQpSngADgFRAopQGAaj5zLwK9YyBY/0LwRYuNhVY9HX3pXLl5OzZoIkGwLGA4+8jNA+4Xg+u2ckDOTLbACpsSQki X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 4tPUvnKo1B6sIE2+lkFBj0MehTzniMfAgII74WQf6z0e5x5ZSWG1HSAmkbXh/hFFIo+BVYtbgJpcKfMvf/Cef6FhUvvjV3x26EOLJaAmLeqmqXxtFYM82XYUmX/PxqB0/670DuA5f6uhny1+jmkgR2EtuWz2AfMz/LDDycvrYlRUy53Fnf5+j0i/TlTDdVMh7+uHZZHnbQkMTgsWy/+hgXS5fGfx5TbUfk0qgGYVhxN1f3XgK73mlkFwuqqirQLJscC5RtY5/su6Nim3PwXek6lunHKOv4YgwWO5qWfzMSNwSWXqEdJCoDYyQGhV/qsw755sb8upGz2IRywNk3JR3MY0nGfoKbFkXqrdvlQjfRJgKgelWxXfOYI0R1KS8FFcJ8aEMATZBUKF6VvuKo2ZVYKvo8SyzMt1KiJ8q2qdxrhnDuI6fI/i8l1/fDZlhyNfbbU3zHxqfNoHsjb4kFTFdosVZjyKcWTtwMklQoQ42JEy/dokQE7BDcWpJ2YimSkHt6k6sjqmM/AC30dH4gsgxCmSSRGWtCc0vHDRzP24M5x3+Hryu5iPbHeBv0P5dQyaAglLok3OYK5BUtKPMmn4XxNIFqiYiqbj2RAZooMMp9kSFrVXUUdHvdwmF50KP0P6l56BHEbReufDGkclaxPvrSLRbPaQ4TnsUtDEwkDJj/wS0bZaHQQRWPRme2oL3aWB4j4Zcc7hPvuz9MVc0nobUoFHJ7QQWK8LJC8o7T8ZvqhwIZeNeSp1fQZR4rwdHIVRZAhnmfZDOJWSSCEMgP6WcWQaey9d3U+PR5mEycwBZi7PxDzAslXJaj/ZzXBva5TYrpzeTprpVh91dl2RyDqK3snOEWfrhHckunG3Erha8sH3Ov8E+2KAlvbgM0BL1EyBUvFlSZ/O79uCQMzlIzO6TzP74ZOfRZsapzOHlG3KCFOttz//xTJNVmMTnIe1ZiyXwmWtTwJjFt7AHQ3Oh+ugcvrSBHpqRfxOxgkP6Abxvtx52BLjCayQFmbc04bax5O9s/8+ZPi0r4Ug9oUhVOqJ/X/IDCdnunKEOKarGtd3fehpUZDDuaAPTz5uke7mTZUqMtU7f1Pbfy17fh2fK+NnMzh+LPPv0k2aEcnmo/j6ux0riNadE5KXrwmoa2OuYH3A508DFDZ+I3cFpaaQDiHkd5Fu2r93UHP/drAaLJDUMvKw0w9tTKPiiDT9zzr5H/MYcrp4f+P4EtBqgQv8ceeTGzOTvISJV7xy8EFz7gkEh/yuV1MDlfkyY8qC5P2boHdr X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9bf2e321-47f6-4a33-6cdd-08dbc59f982f X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Oct 2023 12:35:44.9363 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8P250MB0392 Subject: [FFmpeg-devel] [PATCH] avformat/matroskadec: Output palette as stream side data X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: NTsu7c3WrkO3 This is simpler implementation-wise (it avoids an almost-always-false check in read_packet and decreases sizeof(MatroskaTrack) by about 2/3) and makes the side-data available directly after read_header. It also fixes the Matroska analog of ticket #10602: If a Matroska track has a palette, said palette will be attached as side-data to the first packet of said track and most likely, this is one read during avformat_find_stream_info(). Yet if this packet is discarded because of a seek performed immediately after avformat_find_stream_info(), the information about the global palette will never reach the user. Signed-off-by: Andreas Rheinhardt --- Ticket #10602 can unfortunately not be fixed in this way, because avi allows to update the palette mid-stream, so that the palette contained in extradata must not be exported via global side data due to the semantics of the latter. libavformat/matroskadec.c | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 941c0bcdc9..74f3fc7ae7 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -285,9 +285,6 @@ typedef struct MatroskaTrack { int needs_decoding; uint64_t max_block_additional_id; EbmlList block_addition_mappings; - - uint32_t palette[AVPALETTE_COUNT]; - int has_palette; } MatroskaTrack; typedef struct MatroskaAttachment { @@ -2852,7 +2849,8 @@ static int mka_parse_audio(MatroskaTrack *track, AVStream *st, } /* Performs the codec-specific part of parsing a video track. */ -static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par, +static int mkv_parse_video_codec(AVStream *st, MatroskaTrack *track, + AVCodecParameters *par, const MatroskaDemuxContext *matroska, int *extradata_offset) { @@ -2886,11 +2884,15 @@ static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par, if (track->codec_priv.size >= 86) { FFIOContext b; unsigned bit_depth = AV_RB16(track->codec_priv.data + 82); + uint32_t palette[256] = { 0 }; ffio_init_read_context(&b, track->codec_priv.data, track->codec_priv.size); - if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) { + if (ff_get_qtpalette(codec_id, &b.pub, palette)) { + void *side_data = av_stream_new_side_data(st, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE); + if (!side_data) + return AVERROR(ENOMEM); + memcpy(side_data, palette, AVPALETTE_SIZE); bit_depth &= 0x1F; - track->has_palette = 1; } par->bits_per_coded_sample = bit_depth; } @@ -2934,7 +2936,7 @@ static int mkv_parse_video(MatroskaTrack *track, AVStream *st, if (track->video.color_space.size == 4) par->codec_tag = AV_RL32(track->video.color_space.data); - ret = mkv_parse_video_codec(track, par, matroska, + ret = mkv_parse_video_codec(st, track, par, matroska, extradata_offset); if (ret < 0) return ret; @@ -3398,30 +3400,13 @@ static int matroska_read_header(AVFormatContext *s) /* * Put one packet in an application-supplied AVPacket struct. - * Returns 0 on success or -1 on failure. + * Returns 0 on success or < 0 (most likely AVERROR(EAGAIN) + * if no packet was available. */ static int matroska_deliver_packet(MatroskaDemuxContext *matroska, AVPacket *pkt) { - if (matroska->queue.head) { - MatroskaTrack *tracks = matroska->tracks.elem; - MatroskaTrack *track; - - avpriv_packet_list_get(&matroska->queue, pkt); - track = &tracks[pkt->stream_index]; - if (track->has_palette) { - uint8_t *pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE); - if (!pal) { - av_log(matroska->ctx, AV_LOG_ERROR, "Cannot append palette to packet\n"); - } else { - memcpy(pal, track->palette, AVPALETTE_SIZE); - } - track->has_palette = 0; - } - return 0; - } - - return -1; + return avpriv_packet_list_get(&matroska->queue, pkt); } /*