From patchwork Sun Jan 23 09:34:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Yan X-Patchwork-Id: 33752 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp1849823iog; Sun, 23 Jan 2022 01:34:55 -0800 (PST) X-Google-Smtp-Source: ABdhPJwzdsPjmd497VspDLarmbzqp6ehcENgo1RTbKbxfdYaqLu7u7EKPcX4mNXT0ias0D6DJu1y X-Received: by 2002:a17:907:97ca:: with SMTP id js10mr9404450ejc.78.1642930495205; Sun, 23 Jan 2022 01:34:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642930495; cv=none; d=google.com; s=arc-20160816; b=W6FUL4uwmcaaqxHps80N0OylE6UQe2PER5rWHTI96Rs29Cv7FOC+oVbq8Xo8lwar/b m1zdSR/tNth1yzKlwRdvxxCuTP04gSzx1aCXF+FMeTMnwWkqEJCkzcQQI0upQhnNxj6Z ZCh+FxCMW8LzUzlkg87nVimdK0uihLDCgW+Edp3y7h75Tt3NlsyRGGjgBixCAwURtNxC 49Hbt86HB0DQ1Ram9JkDMiDJSHihcFuriWfq8bJ/RzVWL0sD+UsNujvpBz+zpESP/Mdr 9QT2xRF7U8Mvs8OGkp9RovmPEvvp9145o/5o1xg3ZIuGxpsjw/u9wtwHHahwwPHcTInY 2OnA== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=JN4XuMMIhdatH614m67IUseSK3e/d31Q2yY64N+w+0g=; b=l4tWlHfa1XnrAhcNntu6yBcGxwNUbhs0lK6RjJStVe7Z6kvJjPlkvGeatitxdH6cIo uYEr8IN7+mrdZk8bcVWreFnJaRSwJTnlt47uQ08ZvKVuhz2BhD/u72NI5TZgAENf4pY/ 1E7mHW/HejPWxg8lU/SjaPVgqUODmRFUhpyZKfWqNMJRiMMqVjKubfdlMNSsOAUpWFXm hM4Tds8VhSiSH72X1/ciztFQU0xMhy5jDCyOu4Dh0ss6rBcogqHKYWrdiOBcrOhTm2xw 16zpRbn5HGiawsGs88m2/UdhWvM37I4K4nfPonSi23h4CC0Hgzus2V8CFBeEAXxbj+LQ aUXA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=IzVkz7Gm; 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=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id s30si7058415edi.340.2022.01.23.01.34.53; Sun, 23 Jan 2022 01:34:55 -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; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=IzVkz7Gm; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EF73868B01B; Sun, 23 Jan 2022 11:34:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 70FAA68AF8B for ; Sun, 23 Jan 2022 11:34:41 +0200 (EET) Received: by mail-pj1-f54.google.com with SMTP id o64so13347141pjo.2 for ; Sun, 23 Jan 2022 01:34:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=O3vuo/VAP2PI1LsHAhPtD5JJVoPdM715lmASRYhZ3k4=; b=IzVkz7GmK6TbSH3zcWQ5/Wm9AP8RRjQqKz/5AJGxwbiR7o9dOVR8uvGC/UfG7JPZHO QQCw1HYErTSfCM8gzvFFc0u92BnRCvmM/al+/Sx6+/XwxUMkCHsMhEHzRf8Crmqw3bfO gh9qVgVDgGzR0C0J/+AwRo33ot8ta1REx48FcU+L5ttMgXbafM09xLezeRTb+muVagE1 iX9VxJARjrrOvycDdhO7wiwEsxdWkBAJkgMZ/WddLXfWevHIPFDtzX8PtU/NjMcZNGOg dS5TZezjMwTe1ivL7i4GBoVhvbt5ktIG4/+3rTOtoauRMKd1T1VTjQcCto1iUsvMQM5t +4QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=O3vuo/VAP2PI1LsHAhPtD5JJVoPdM715lmASRYhZ3k4=; b=h2yxltZLAtZDQCc++hiO2CYG+HAQpnJUAE952ghp0XdiLof2noLyq+yJ0/6PJU4otA nCEmEzlHpS3IE1PxS+fVh8DyUWbp2Y8KPYO9hKGXNXam9+qZxPFKD4kt0zYHnkeMQshi tqmVCYyEkM3jiNJ8NKnfyjjbXHQOnKNELfi8kYUtADgyv12uhgOheW7P7T+1nzmDSr93 1KgKvZWBfcIvMCfILg8CBEhhkl/oarVH3jTFdKr+7ci/Ui9qHhze6LppP6l52obzDjFA 05kUQY9f0JLHjeCmDCm9nfJbt9nT2uMjOIKuZJSYPTWaLU1jFqVDIs5mvl4tdFW7XKJM 1YNg== X-Gm-Message-State: AOAM530WKZn8wDnuUiJOnHJ83SQwvKGXkkjJ5CxEr5cvJpySRITDhv4q KytGicOkyezfVOlx4bLCf+ddyF983p5TAA== X-Received: by 2002:a17:902:904b:b0:143:73ff:eb7d with SMTP id w11-20020a170902904b00b0014373ffeb7dmr10355152plz.85.1642930478544; Sun, 23 Jan 2022 01:34:38 -0800 (PST) Received: from ideapad.. ([161.81.112.246]) by smtp.gmail.com with ESMTPSA id c2sm13227455pfv.68.2022.01.23.01.34.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Jan 2022 01:34:37 -0800 (PST) From: Tom Yan To: ffmpeg-devel@ffmpeg.org Date: Sun, 23 Jan 2022 17:34:30 +0800 Message-Id: <20220123093430.9830-1-tom.ty89@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/wavenc: allow WAVEFORMATEXTENSIBLE to be suppressed 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: Tom Yan Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NLS9dDxzbcQf While WAVEFORMATEX sort of mandates WAVEFORMATEXTENSIBLE to be used for audio with sample size other than 8 or 16, PCMWAVEFORMAT does not practically have any limitation in supporting higher sample size that is a multiple of 8 (or sample rate higher than 48000). In terms of sample size, the only real reason that the extension exists is that it allows both an actual sample size and a multiple-of-8 container size to be stored. However, such facility is of no use when the actual sample size is a multiple of 8, let alone that muxer never made use of it (since it never actually supported sample size like 20 anyway; at least not in the way it is supposed to.) Although WAVEFORMATEXTENSIBLE has been around for more than two decades, apparently programs and libraries that do not support the format still exist. Therefore, adding an option that allows the WAVEFORMATEXTENSIBLE "extensions" to be suppressed and the format tag field to be set to WAVE_FORMAT_PCM (0x0001) for audio with sample size higher than 16 (or sample rate higher than 48000). Signed-off-by: Tom Yan --- libavformat/riff.h | 5 +++++ libavformat/riffenc.c | 4 ++-- libavformat/wavenc.c | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libavformat/riff.h b/libavformat/riff.h index 85d6786663..5794857f53 100644 --- a/libavformat/riff.h +++ b/libavformat/riff.h @@ -57,6 +57,11 @@ void ff_put_bmp_header(AVIOContext *pb, AVCodecParameters *par, int for_asf, int */ #define FF_PUT_WAV_HEADER_SKIP_CHANNELMASK 0x00000002 +/** + * Tell ff_put_wav_header() not to write WAVEFORMATEXTENSIBLE extensions if possible. + */ +#define FF_PUT_WAV_HEADER_FORCE_PCMWAVEFORMAT 0x00000004 + /** * Write WAVEFORMAT header structure. * diff --git a/libavformat/riffenc.c b/libavformat/riffenc.c index ffccfa3d48..4dc8ca6e0f 100644 --- a/libavformat/riffenc.c +++ b/libavformat/riffenc.c @@ -80,9 +80,9 @@ int ff_put_wav_header(AVFormatContext *s, AVIOContext *pb, waveformatextensible = (par->channels > 2 && par->channel_layout) || par->channels == 1 && par->channel_layout && par->channel_layout != AV_CH_LAYOUT_MONO || par->channels == 2 && par->channel_layout && par->channel_layout != AV_CH_LAYOUT_STEREO || - par->sample_rate > 48000 || par->codec_id == AV_CODEC_ID_EAC3 || - av_get_bits_per_sample(par->codec_id) > 16; + ((par->sample_rate > 48000 || av_get_bits_per_sample(par->codec_id) > 16) && + !(flags & FF_PUT_WAV_HEADER_FORCE_PCMWAVEFORMAT)); if (waveformatextensible) avio_wl16(pb, 0xfffe); diff --git a/libavformat/wavenc.c b/libavformat/wavenc.c index 2317700be1..bd41d6eeb3 100644 --- a/libavformat/wavenc.c +++ b/libavformat/wavenc.c @@ -83,6 +83,7 @@ typedef struct WAVMuxContext { int peak_block_pos; int peak_ppv; int peak_bps; + int extensible; } WAVMuxContext; #if CONFIG_WAV_MUXER @@ -324,9 +325,10 @@ static int wav_write_header(AVFormatContext *s) } if (wav->write_peak != PEAK_ONLY) { + int flags = !wav->extensible ? FF_PUT_WAV_HEADER_FORCE_PCMWAVEFORMAT : 0; /* format header */ fmt = ff_start_tag(pb, "fmt "); - if (ff_put_wav_header(s, pb, s->streams[0]->codecpar, 0) < 0) { + if (ff_put_wav_header(s, pb, s->streams[0]->codecpar, flags) < 0) { av_log(s, AV_LOG_ERROR, "Codec %s not supported in WAVE format\n", avcodec_get_name(s->streams[0]->codecpar->codec_id)); return AVERROR(ENOSYS); @@ -494,6 +496,7 @@ static const AVOption options[] = { { "peak_block_size", "Number of audio samples used to generate each peak frame.", OFFSET(peak_block_size), AV_OPT_TYPE_INT, { .i64 = 256 }, 0, 65536, ENC }, { "peak_format", "The format of the peak envelope data (1: uint8, 2: uint16).", OFFSET(peak_format), AV_OPT_TYPE_INT, { .i64 = PEAK_FORMAT_UINT16 }, PEAK_FORMAT_UINT8, PEAK_FORMAT_UINT16, ENC }, { "peak_ppv", "Number of peak points per peak value (1 or 2).", OFFSET(peak_ppv), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, 2, ENC }, + { "extensible", "Write WAVEFORMATEXTENSIBLE extensions.", OFFSET(extensible), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, ENC }, { NULL }, };