From patchwork Mon Feb 12 21:15:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 46226 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9002:b0:19e:cdac:8cce with SMTP id d2csp921838pzc; Mon, 12 Feb 2024 13:16:30 -0800 (PST) X-Google-Smtp-Source: AGHT+IEHr+wXc+U/zD2oBlSUpBLmcO0HT8/DGJ9s67cc/RX/ndxKlga48RE9EDSizmIMPFObgWuv X-Received: by 2002:ac2:46da:0:b0:511:96d0:5ae1 with SMTP id p26-20020ac246da000000b0051196d05ae1mr317850lfo.40.1707772590629; Mon, 12 Feb 2024 13:16:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1707772590; cv=none; d=google.com; s=arc-20160816; b=spV6cO0e3f1vBVHy+pADNUQKUy7cBlAU3PSgRlUaJfOYcq20nsvMGSi9d6zoo77R32 xB8ja15F9w/9kWyDbLAYYi9CXQhpCH5PVKpYwxrm5dxNxJbfZen4BLzP28f3FGdlWyWr jgFXrHlLsSsnhMlVvNskMqJOuxzZ44Ot6UZdS62jPvBJXrauaddWU3jYqBgg6bxf6ME3 /pif6L+w0XbQCiZsAagB3a/0tSJdzYZMFlDpwwWJYryCMAa9b8+wvRSvkdkCIn5uvyq0 gbvOvEsd9lVMytaw0aj9/WM0jNZ3DtkdD8xIUD2mS9kNoGhk9f53Cy64tts8dzBKE8AP hF5A== 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=1+K+3kIhM9y+mQCyj/eWcXegMYC2n78BDbdoBOhBg/E=; fh=W/KuhEpuTsrv4ghP9NitVteR1Kxzu1NKFL/r6DPXRlM=; b=ExQ5IIEXY9rnTGpI0VY/D/SOpCiHEgBJKccJjv+yIZuLx8Tjp6ouHLX7yTT9SJZ+VW p0PSboWIq18+RfbM1xUyjS0mVYDgyHrIJBTE8Bzb/DaRCOIazRwAC4ujHEYWFp4Ynrz2 qRNRn3dIWr7xj703ceof8KaX2Rl0g/cipO0sMrYmXPl68K+CzZFAkdMA9qmWWTz8Ln6t c6kkfvJevex9McHoYtkCrWpEfpNEGZNeKI2DpV3zBCxFHsNhlcbmz7NNtLdlmCk5Z/jq fExoFUO6BsOgK0/ihyZUbBokZFUtp+W732eV1dTHTobRBDiJ7XhilfQ2MBMd9+0J9wUT xPRA==; 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; AJvYcCWy1cFeAVgTaqGQYz/P5AqNHdxnc7MwEjVImFbONySPntYAHOZA55mNjVsOPbYnh+1nJ00o/ehcyhhqWEDwC4vGTQAKzrCjKkKlYOET7vuRciOXESWouynTIOf2+jURBIGZKwCMKVnNEdnHAFjrojZnJeDEz55+lVkssECD5v2f1d9WwRzKQc717RgC8g5K8+V9Y+UE4EbA8YaNYZ20qt1kCvvzLgDqomTa51y4pgSZO8pTjPjg172h651jL32NTJwlbTEB8oOuxmzoyhu1Ygevs/wEDE2zKSF72AsRgk00usLNa/W8mSAukG6kz6YhFCuoQJIySwR1hfhN1fpeOgjvj6pt38JCx7lUhTKEEHoKJPfRWTlWlphnLAyHAZcNKi9QoE/u9SdD+zQOGs+7hkJMoxLqmIwrMQI8RYFy9kRn2u10lANxzKsa80QlXqRoToXFV8moDexeDST/1SUhwnrVMJQGPAoBNOqMli/y/J3Vlcoi3FvsqW80j+ono0erJWgXSK6ExfjQuy4maeOvmzNoxg5eHyyiBg/aDCDkUVndzPB+taKxH/bXdMspv7WtNzRUrvYlfsvOd2IZfqLbYErPBV9hd64uJDj8h1PZ03NC+oElLJtrqNbdqLs5PwISvvOzuc1y9dU6zq5Q+IMmdymK6V2zJ8+6pH8uhTXw5Kf+D57hnkedDbVbSB+9wWUX4WPbet/oj/P+ahjf2ZhrRMFroC8i4JNVtSjL74F40SQd748ihBK5tRXdqU6HX5mtzjM+VWa8TdxBhIIZzz+3VjGNUa0gt4WcNsHJbcQkRhguPVnrjg+YP1OxYH1+oceu1023I2DOrpdIufSXLj6FujuHSTH0dfb6T4zRBTJvRwmAaqjSytcOJyg/Z8hs7c3Mw+Es+kgNr+KpQ5XKapeOqKpwv8v/l2SkIpOQJvnHiRFF0ZuXb4hH+6drxfA6M9/75qiq7h I4/i/hO4bpg03sd+hP1YS8oEqMsZWrvZvkZz5eddq0s7xnobJ15T4dfcux6MkOc7FMX1f+bSD4IEmGdygiFrveEhCwXWlO9OZ/7Ss05Ck6Qo5/zXV9fwBCziL0n5Qc5MV62CR3/hV+FIJD1XBUEacCABO+VjtGd6kJyS6rGkULIwUQYx8D4Zma35PY5m8CBNJb38YqeS+7fVz5Aggn2jokR6kynsNJKx/K5rTe4MCudfLRm+EgOuLba/sIgptDs2f8Yyw/m8KU1MdcL4YbA0CXijCGDkxNwQx/CaPTZAGmFZtr97Otnt0PUqtaZeVinbF1Xw6IXQoFPi45Lvv+FlL3eQ4gTsD0wqGo8XPvdZovQlq3gUrtb7N4dsy3MSJQvMEUfJQdxcvg1eF3KbYKmeEdROtVVFMmUOwUwyCdazn0gfUoS5Hu1pUMhCnNa6+AcgRnsiUCxt7f3v+Q/3rYR+hKItE15NaE/Gd1IkvlY/bgjqbvnrhjzRVrkiRvPW5v2PFOwrydk5E5IycyasmJ76UCJZdwVA+DB8JyXuZTD6M8I8AUaNeBT6uW/3eZ42+1Hr+Zjb60+UV9cTWorWyM3idb8Y7NML8iuV6e3w== Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v18-20020a170906489200b00a3cc8de6dfdsi551901ejq.26.2024.02.12.13.16.30; Mon, 12 Feb 2024 13:16:30 -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 8B52E68D16B; Mon, 12 Feb 2024 23:16:12 +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 B0C4068D147 for ; Mon, 12 Feb 2024 23:16:05 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 80EF4E9F63; Mon, 12 Feb 2024 22:16:05 +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 3uwIiwNPWIKC; Mon, 12 Feb 2024 22:16:03 +0100 (CET) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 863C1E9F59; Mon, 12 Feb 2024 22:16:03 +0100 (CET) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Mon, 12 Feb 2024 22:15:36 +0100 Message-Id: <20240212211537.18468-4-cus@passwd.hu> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20240212211537.18468-1-cus@passwd.hu> References: <20240212211537.18468-1-cus@passwd.hu> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/5] avformat/mov: factorize reading the main part of the chnl atom to mov_chan 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: ZjyeoN7Bsv5v Signed-off-by: Marton Balint --- libavformat/mov.c | 58 +++-------------------------------------- libavformat/mov_chan.c | 59 ++++++++++++++++++++++++++++++++++++++++++ libavformat/mov_chan.h | 10 +++++++ 3 files changed, 73 insertions(+), 54 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 42b0135987..52436d71d6 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -953,9 +953,8 @@ static int mov_read_chan(MOVContext *c, AVIOContext *pb, MOVAtom atom) static int mov_read_chnl(MOVContext *c, AVIOContext *pb, MOVAtom atom) { int64_t end = av_sat_add64(avio_tell(pb), atom.size); - int stream_structure; int version, flags; - int ret = 0; + int ret; AVStream *st; if (c->fc->nb_streams < 1) @@ -971,58 +970,9 @@ static int mov_read_chnl(MOVContext *c, AVIOContext *pb, MOVAtom atom) return AVERROR_INVALIDDATA; } - stream_structure = avio_r8(pb); - - // stream carries channels - if (stream_structure & 1) { - int layout = avio_r8(pb); - - av_log(c->fc, AV_LOG_TRACE, "'chnl' layout %d\n", layout); - if (!layout) { - uint8_t *positions = av_malloc(st->codecpar->ch_layout.nb_channels); - - if (!positions) - return AVERROR(ENOMEM); - for (int i = 0; i < st->codecpar->ch_layout.nb_channels; i++) { - int speaker_pos = avio_r8(pb); - - av_log(c->fc, AV_LOG_TRACE, "speaker_position %d\n", speaker_pos); - if (speaker_pos == 126) { // explicit position - avpriv_request_sample(c->fc, "explicit position"); - av_freep(&positions); - return AVERROR_PATCHWELCOME; - } else { - positions[i] = speaker_pos; - } - } - - ret = ff_mov_get_layout_from_channel_positions(positions, - st->codecpar->ch_layout.nb_channels, - &st->codecpar->ch_layout); - av_freep(&positions); - if (ret) { - av_log(c->fc, AV_LOG_ERROR, - "get channel layout from speaker positions failed, %s\n", - av_err2str(ret)); - return ret; - } - } else { - uint64_t omitted_channel_map = avio_rb64(pb); - - if (omitted_channel_map) { - avpriv_request_sample(c->fc, "omitted_channel_map 0x%" PRIx64 " != 0", - omitted_channel_map); - return AVERROR_PATCHWELCOME; - } - ff_mov_get_channel_layout_from_config(layout, &st->codecpar->ch_layout); - } - } - - // stream carries objects - if (stream_structure & 2) { - int obj_count = avio_r8(pb); - av_log(c->fc, AV_LOG_TRACE, "'chnl' with object_count %d\n", obj_count); - } + ret = ff_mov_read_chnl(c->fc, pb, st); + if (ret < 0) + return ret; if (avio_tell(pb) != end) { av_log(c->fc, AV_LOG_WARNING, "skip %" PRId64 " bytes of unknown data inside chnl\n", diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c index 79768bc210..cce9d7a697 100644 --- a/libavformat/mov_chan.c +++ b/libavformat/mov_chan.c @@ -863,3 +863,62 @@ error: av_channel_layout_uninit(layout); return ret; } + +int ff_mov_read_chnl(AVFormatContext *s, AVIOContext *pb, AVStream *st) +{ + int stream_structure = avio_r8(pb); + int ret; + + // stream carries channels + if (stream_structure & 1) { + int layout = avio_r8(pb); + + av_log(s, AV_LOG_TRACE, "'chnl' layout %d\n", layout); + if (!layout) { + uint8_t *positions = av_malloc(st->codecpar->ch_layout.nb_channels); + + if (!positions) + return AVERROR(ENOMEM); + for (int i = 0; i < st->codecpar->ch_layout.nb_channels; i++) { + int speaker_pos = avio_r8(pb); + + av_log(s, AV_LOG_TRACE, "speaker_position %d\n", speaker_pos); + if (speaker_pos == 126) { // explicit position + avpriv_request_sample(s, "explicit position"); + av_freep(&positions); + return AVERROR_PATCHWELCOME; + } else { + positions[i] = speaker_pos; + } + } + + ret = ff_mov_get_layout_from_channel_positions(positions, + st->codecpar->ch_layout.nb_channels, + &st->codecpar->ch_layout); + av_freep(&positions); + if (ret) { + av_log(s, AV_LOG_ERROR, + "get channel layout from speaker positions failed, %s\n", + av_err2str(ret)); + return ret; + } + } else { + uint64_t omitted_channel_map = avio_rb64(pb); + + if (omitted_channel_map) { + avpriv_request_sample(s, "omitted_channel_map 0x%" PRIx64 " != 0", + omitted_channel_map); + return AVERROR_PATCHWELCOME; + } + ff_mov_get_channel_layout_from_config(layout, &st->codecpar->ch_layout); + } + } + + // stream carries objects + if (stream_structure & 2) { + int obj_count = avio_r8(pb); + av_log(s, AV_LOG_TRACE, "'chnl' with object_count %d\n", obj_count); + } + + return 0; +} diff --git a/libavformat/mov_chan.h b/libavformat/mov_chan.h index 8c807798ab..b7d435b99f 100644 --- a/libavformat/mov_chan.h +++ b/libavformat/mov_chan.h @@ -189,4 +189,14 @@ int ff_mov_get_channel_positions_from_layout(const AVChannelLayout *layout, int ff_mov_get_layout_from_channel_positions(const uint8_t *position, int position_num, AVChannelLayout *layout); +/** + * Read 'chnl' tag from the input stream. + * + * @param s AVFormatContext + * @param pb AVIOContext + * @param st The stream to set codec values for + * @return 0 if ok, or negative AVERROR code on failure + */ +int ff_mov_read_chnl(AVFormatContext *s, AVIOContext *pb, AVStream *st); + #endif /* AVFORMAT_MOV_CHAN_H */