From patchwork Thu Feb 8 20:16:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 46117 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:a586:b0:19e:8a94:b663 with SMTP id gd6csp517030pzc; Thu, 8 Feb 2024 12:16:58 -0800 (PST) X-Google-Smtp-Source: AGHT+IFpFAb0i8STC21EAqRfIG807iBB+Vg9RYbt2l/dUPAKY8L4qomUY/1MDN+H3V8+yQaHWBOY X-Received: by 2002:a50:9fe7:0:b0:560:129c:6c6f with SMTP id c94-20020a509fe7000000b00560129c6c6fmr259737edf.0.1707423418003; Thu, 08 Feb 2024 12:16:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1707423417; cv=none; d=google.com; s=arc-20160816; b=HZe6eyR4ZIhvoSDz23aaGf5yarAXwT6kO33/WX1mPKAuoefK+qLCDsRBrpetvVfPwl IktY1OgTedu8eY7n7BCUr5SG8Ej84Un8HhbjMnKgR9Zv9kCS1rqmJaTDsnGX76gYhPDh PNMa0kFQiy0F/xLdqw7bsJpDAj4BvF9ri/zA+ar3T4t94lSbVL+pT+GkQjgiPpUe6ejD s2B+uC74ZdydHsVYpyxwXeXQyo0VdJRxv4Bz5sXScQ8nfhu6jR4plbk/XmtaXXfUUvdI qS69+5yR48iKe2fd9SGtCD5CQkcH55nLmFYJnLasDHOS8/StlkD2fFBR+6wnc2sHeT3o KxcQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=s62dvqy95hfw5pYsfzcZ9CIABAG1LS/okFL9DGYAEvI=; fh=6RInonCK3p92mDHGzEGQmwn4xiKVJYuOXaBnRWgwg0I=; b=1KWQzZiYmMmnnlzRrY1pa1HFdBukWOzi50PdGftA1Qxxs5AHxjp5nWVz3/wwy6qJ26 GOBtXgcqu7KdNna3Pf12rbJFFt8+kTIhiRrHB5V91hrAj5VJbeszRf5MDp72Qt0JuM9e AIizVjonsRsGf3yIvHMRbuRgIlKKE8wGp47aXLABSffRgOjtjKX9Hq+JA9XDp7Z9Rfj3 fgVdAg4ct8phbkSeQ4+03l2Sa6xZFkAZjzIgjhHK4MJdkMghmqBaeibfy9NA9BVtlPXl RyVKwYP3xGprZGDltBxxeDE+CTukmvQ1mdo9dfw2Mqikp+PVzJv3S2PnP5Z9zEEvs9Nq Ms7g==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; 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 X-Forwarded-Encrypted: i=1; AJvYcCWvHpJAOv3QTacnM8pozlcIKFsTCIIlHmz1NzaqUjJ3cpSVa2W0fYCwFWjazalgQ2BbQ4lXZ9VjrWtPJVHoOoZA04NdpC9BC/kb6qtOvNNwxM88tayg4sY9EgtzRPKttwC2R4wkaXKFKjMB2iqMhoV5vb6DTwTH7rbXafBi0V1TPtPBs281y3TpA8WDrDr/JD5tvZ0IAZxHkJZjB2+TJ5G0j0/cX9JAKuxjyQWyM3JaztzTvz5V3pPTottNWUJpwp2R3lrEIKQ9BhT6ORLn9D+zdDDMgz+s+/nE53SX4EjZ3EloZbJa9pFgGol+CTpuriAI+KqqGw71857PW0VYXjrqeOdwtgSHjDY4HugNSYyfiGPkdVD4nqm7lkl98I9vbxi8kiHPP8qN0tG+KLMaqn3+4b8My0QA5M3x9j5EzIPuK3I7zItsHVz6vv28L6v3I4FWzhJbPuKJtN2nQ082ss227isLIF3/Q7nu+3vaJ5baz8psE1Zp2w/exOHf4VpgdAPjZAzhSc+n/o3aba7VoXKLogKi4JoLyjt4tTiVMss6T6oyLla+iuHg+khg31gMZSQCvtqW6pCXW62qDZY0iV4EnHHf7IXFi9/1de6PJ7jfRIb40AYTWZVc7B6AN1XEjyrpq8tASvoTNfL1ABB25JqX1COTen0AjHXwlOqTn2Y93/aZyORHbTALNy9g8+O/ZPHCZoslkMgnjlmHDexl7quQfAYAbvEiqvMJSKlZ/8E5Y6LSHKvy9VhOcjd0C0gfWV2mX1nWYQPzkCp7UW9wzCW7FdBhWwD8r5CazPWQ03fz0XDfG1vgS3Zu29v8pzv9ObESsrFC1C6QeiFK03IfRWAG6B+UkuQ6kD2sQ1Ep9rgYz1gZYwFM8G9TRytRBUh5lPs3fMMiQs5HDmnrPUqjDHq4Ct8fJNsnHWGGsCInrQ3Xmi/AzDzgi0I5ZPakfFcZkSLRzy CCyXd6RoSR6+1lfiN+6rslVbGefNlluWAW27jFgJFf7qtaDWwV2zHLbos1OlZ/yeWHojs/1pwXxUVLXqBm0vNXUcdSraJN6P0ZNGULkIpCZS5Gt1YeSc6zB08vpOyUheGnO5I/LOnnlJmQeqrurWNzdXl6IKolxwvXNWRQKM/txX3D/NblRUa9yfST88V/oMwX5Ms/mCrS5bBX7KH82jHivmCYvH9loo/bdRd+TknIT17SR/mj/e1o0RV2OPN+v0nwP438OcB7+3kd8QFSkFeN+1pH0hMylTB14ayZ/NZIHzHsO3u/De+6MtUS5SfST7+njoLLyBUY8V/sMn2Bsi3D+252tSVXroiU0tJuBlSKF9XSIMRdOehpaxgrMFcya4nuOUTXeEaN43IhGR/OFuPbvcMDHMnYBBvKKoCzTaNaI+eJGm628eeQSpfBwXi+LIuhNNlMrxcyxZPjV7vW94MmgQ/5GAJs6v03MsxnVxnVnj5iaabN0t3YdwlCOz6vYPQ/pOmgOoBjj/45w2M6w1hKCWn7zRhAg2N5nw3PijEVFsGf0JybdLFYzhDry1WbzX9qFdLRrCn0/C+9ify3ST+ZCaALdnfs4Q== Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id bd19-20020a056402207300b0055ec0610657si66533edb.517.2024.02.08.12.16.57; Thu, 08 Feb 2024 12:16:57 -0800 (PST) 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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E990C68D180; Thu, 8 Feb 2024 22:16:53 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1D94E68D115 for ; Thu, 8 Feb 2024 22:16:48 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id CBC5EE9F03; Thu, 8 Feb 2024 21:16:47 +0100 (CET) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SbMeVYmVRDgS; Thu, 8 Feb 2024 21:16:46 +0100 (CET) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 07F5FE9EFC; Thu, 8 Feb 2024 21:16:46 +0100 (CET) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Thu, 8 Feb 2024 21:16:40 +0100 Message-Id: <20240208201640.10857-1-cus@passwd.hu> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20240204192812.28129-3-cus@passwd.hu> References: <20240204192812.28129-3-cus@passwd.hu> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 5/5] avformat/mov_chan: add support for reading custom channel layouts when layout_tag == 0 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: Marton Balint Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: KIgY2R9KA98t v3: also try simplifying custom layout to unspecified layout Signed-off-by: Marton Balint --- libavformat/mov_chan.c | 101 +++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 45 deletions(-) diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c index 6b206745b4..79768bc210 100644 --- a/libavformat/mov_chan.c +++ b/libavformat/mov_chan.c @@ -377,23 +377,23 @@ static uint64_t mov_get_channel_layout(uint32_t tag, uint32_t bitmap) return layout_map[i].layout; } -static uint64_t mov_get_channel_mask(uint32_t label) +static enum AVChannel mov_get_channel_id(uint32_t label) { if (label == 0) - return 0; + return AV_CHAN_UNUSED; if (label <= 18) - return 1U << (label - 1); + return (label - 1); if (label == 35) - return AV_CH_WIDE_LEFT; + return AV_CHAN_WIDE_LEFT; if (label == 36) - return AV_CH_WIDE_RIGHT; + return AV_CHAN_WIDE_RIGHT; if (label == 37) - return AV_CH_LOW_FREQUENCY_2; + return AV_CHAN_LOW_FREQUENCY_2; if (label == 38) - return AV_CH_STEREO_LEFT; + return AV_CHAN_STEREO_LEFT; if (label == 39) - return AV_CH_STEREO_RIGHT; - return 0; + return AV_CHAN_STEREO_RIGHT; + return AV_CHAN_UNKNOWN; } static uint32_t mov_get_channel_label(enum AVChannel channel) @@ -497,8 +497,8 @@ int ff_mov_read_chan(AVFormatContext *s, AVIOContext *pb, AVStream *st, int64_t size) { uint32_t layout_tag, bitmap, num_descr; - uint64_t label_mask, mask = 0; - int i; + int ret; + AVChannelLayout *ch_layout = &st->codecpar->ch_layout; if (size < 12) return AVERROR_INVALIDDATA; @@ -514,47 +514,58 @@ int ff_mov_read_chan(AVFormatContext *s, AVIOContext *pb, AVStream *st, if (size < 12ULL + num_descr * 20ULL) return 0; - label_mask = 0; - for (i = 0; i < num_descr; i++) { - uint32_t label; - if (pb->eof_reached) { - av_log(s, AV_LOG_ERROR, - "reached EOF while reading channel layout\n"); - return AVERROR_INVALIDDATA; + if (layout_tag == 0) { + int nb_channels = ch_layout->nb_channels ? ch_layout->nb_channels : num_descr; + if (num_descr > nb_channels) { + av_log(s, AV_LOG_WARNING, "got %d channel descriptions, capping to the number of channels %d\n", + num_descr, nb_channels); + num_descr = nb_channels; } - label = avio_rb32(pb); // mChannelLabel - avio_rb32(pb); // mChannelFlags - avio_rl32(pb); // mCoordinates[0] - avio_rl32(pb); // mCoordinates[1] - avio_rl32(pb); // mCoordinates[2] - size -= 20; - if (layout_tag == 0) { - uint64_t mask_incr = mov_get_channel_mask(label); - if (mask_incr == 0 || mask_incr <= label_mask) { - label_mask = 0; - break; + + av_channel_layout_uninit(ch_layout); + ret = av_channel_layout_custom_init(ch_layout, nb_channels); + if (ret < 0) + goto out; + + for (int i = 0; i < num_descr; i++) { + uint32_t label; + if (pb->eof_reached) { + av_log(s, AV_LOG_ERROR, + "reached EOF while reading channel layout\n"); + return AVERROR_INVALIDDATA; } - label_mask |= mask_incr; + label = avio_rb32(pb); // mChannelLabel + avio_rb32(pb); // mChannelFlags + avio_rl32(pb); // mCoordinates[0] + avio_rl32(pb); // mCoordinates[1] + avio_rl32(pb); // mCoordinates[2] + size -= 20; + ch_layout->u.map[i].id = mov_get_channel_id(label); } - } - if (layout_tag == 0) { - if (label_mask) - mask = label_mask; - } else - mask = mov_get_channel_layout(layout_tag, bitmap); - - if (mask) { - if (!st->codecpar->ch_layout.nb_channels || av_popcount64(mask) == st->codecpar->ch_layout.nb_channels) { - av_channel_layout_uninit(&st->codecpar->ch_layout); - av_channel_layout_from_mask(&st->codecpar->ch_layout, mask); - } else { - av_log(s, AV_LOG_WARNING, "ignoring channel layout with %d channels because the real number of channels is %d\n", - av_popcount64(mask), st->codecpar->ch_layout.nb_channels); + + ret = av_channel_layout_retype(ch_layout, AV_CHANNEL_ORDER_NATIVE, AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS); + if (ret == AVERROR(ENOSYS)) + ret = av_channel_layout_retype(ch_layout, AV_CHANNEL_ORDER_UNSPEC, AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS); + if (ret < 0 && ret != AVERROR(ENOSYS)) + goto out; + } else { + uint64_t mask = mov_get_channel_layout(layout_tag, bitmap); + if (mask) { + if (!ch_layout->nb_channels || av_popcount64(mask) == ch_layout->nb_channels) { + av_channel_layout_uninit(ch_layout); + av_channel_layout_from_mask(ch_layout, mask); + } else { + av_log(s, AV_LOG_WARNING, "ignoring channel layout with %d channels because number of channels is %d\n", + av_popcount64(mask), ch_layout->nb_channels); + } } } + ret = 0; + +out: avio_skip(pb, size - 12); - return 0; + return ret; } /* ISO/IEC 23001-8, 8.2 */