From patchwork Sat Mar 4 23:21:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takayuki 'January June' Suwa X-Patchwork-Id: 2757 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.31.14 with SMTP id f14csp1108086vsf; Sun, 5 Mar 2017 11:00:49 -0800 (PST) X-Received: by 10.223.162.205 with SMTP id t13mr12200423wra.155.1488740448991; Sun, 05 Mar 2017 11:00:48 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j142si11525684wmg.127.2017.03.05.11.00.48; Sun, 05 Mar 2017 11:00:48 -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; 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=NONE 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 20CC46882C5; Sun, 5 Mar 2017 21:00:34 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 21D126879BC for ; Sun, 5 Mar 2017 01:54:20 +0200 (EET) Received: by mail-pf0-f196.google.com with SMTP id 67so9167340pfg.2 for ; Sat, 04 Mar 2017 15:54:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=SiNn0kPnfa4bwiLO4AwvbA65tMCMj5gYKNBHxKa+I1o=; b=GbuIVzK8ITWiFeHYhUL4IL2k33GSEAFKlyel7BG/jggK9Hkw+bzDUysVIgttXZkjxa 9ta4w/ndqfG5quvwFte1JVyWLQviLHGG6RPuSapD8to39hOKqkLcklctk+T5Ab7s/bfm sp4yrriPYSEyBgFZpxpcqx4e67fkSPR84wClT+f9K5oFN0/fyCdaZqLLVqrcBDLmRnoC anabJcYJ3FRskIk6+6FgrsCfEQU1W/HSaciA27aRTK/uG7p7X8BL/+82IztX5UIBKsFm B7IwaT50ZecxNI3F+dw+K6JkDfii8NKp+Ra0fNevHBRZyxBdjFX//qJ78v+MI9HR23TF eYfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=SiNn0kPnfa4bwiLO4AwvbA65tMCMj5gYKNBHxKa+I1o=; b=b/2sOZKs7Kk/v6UFja87O10Xuz9OsTnSqJdb9fQ0VzJiiscLBjW1WeJwHJ218J7PPo vSPZX2IlY29qkkjkz0Ex9DSlqoopwMKKDsN051OnnkNR/Zo3NkP6BGPjIWEo+VIH9iZy 4UylAEU9hr4yRv/xAjQhNnf6WaVg9Lm4Zh3ZMbFpym9ShNJzFVGOZSeKNCMUvZlE2cu9 TbyDNsmQmU41E45+ZlLKPQx6Efy/4nKtWJXWzWCO47gLYW1a2jNqzkG13UwAQht9AQrN 7E8XXeP5YNmZuidxLI1OshQYFR4LbyVyQmzFIWm+57HK+/+rlZk9bCbvtI+ZBFhC9Nn+ PszQ== X-Gm-Message-State: AMke39mBwt4sHBQrAkmH3EZ3bPkqftPriq1gzEQkIm1R7+/yDF64VBE6yC0+k6dqQRFcmQ== X-Received: by 10.98.94.2 with SMTP id s2mr12128496pfb.133.1488669720755; Sat, 04 Mar 2017 15:22:00 -0800 (PST) Received: from localhost.localdomain (h175-177-005-137.catv02.itscom.jp. [175.177.5.137]) by smtp.gmail.com with ESMTPSA id e76sm22910052pfk.75.2017.03.04.15.21.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 04 Mar 2017 15:22:00 -0800 (PST) From: Takayuki 'January June' Suwa To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Mar 2017 08:21:48 +0900 Message-Id: <1488669708-10270-1-git-send-email-jjsuwa.sys3175@gmail.com> X-Mailer: git-send-email 2.1.4 X-Mailman-Approved-At: Sun, 05 Mar 2017 21:00:31 +0200 Subject: [FFmpeg-devel] [PATCH] af_aresample: add 'sample_rate_list' option 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: Takayuki 'January June' Suwa MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Takayuki 'January June' Suwa This adds '|'-separated list of desired sample rates. examples: -i 44.1k_from_cd_da_source -af "aresample=sample_rate_list=44100|48000|192000" ... -i 48k_from_dat_source -af "aresample=sample_rate_list=44100|48000|192000" ... -i 192k_hires_source -af "aresample=sample_rate_list=44100|48000|192000" ... Each above will retain its source sample rate, and -i 352.8k_from_dsd64_source -af "aresample=sample_rate_list=44100|48000|192000" ... -i 96k_hires_source -af "aresample=sample_rate_list=44100|48000|192000" ... will produce 192k and 48k resampled-to-nearest outputs. --- libavfilter/af_aresample.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/libavfilter/af_aresample.c b/libavfilter/af_aresample.c index 028e105..3a0c4e4 100644 --- a/libavfilter/af_aresample.c +++ b/libavfilter/af_aresample.c @@ -37,6 +37,7 @@ typedef struct { const AVClass *class; int sample_rate_arg; + char *sample_rate_list; double ratio; struct SwrContext *swr; int64_t next_pts; @@ -74,6 +75,7 @@ static av_cold void uninit(AVFilterContext *ctx) { AResampleContext *aresample = ctx->priv; swr_free(&aresample->swr); + av_freep(&aresample->sample_rate_list); } static int query_formats(AVFilterContext *ctx) @@ -109,6 +111,30 @@ static int query_formats(AVFilterContext *ctx) if(out_rate > 0) { int ratelist[] = { out_rate, -1 }; out_samplerates = ff_make_format_list(ratelist); + } else if (aresample->sample_rate_list) { + int cnt = 0, *lst = NULL; + const char *srl; + for (srl = aresample->sample_rate_list; *srl; cnt++) { + char *tok; + if (!(tok = av_get_token(&srl, "|"))) { + av_log(ctx, AV_LOG_FATAL, "Could not get token from '-sample_rate_list'.\n"); + av_freep(&lst); + return AVERROR(ENOMEM); + } + if (*srl) + srl++; + if ((ret = av_reallocp_array(&lst, cnt + 1, sizeof(*lst))) < 0) + return ret; + if ((ret = ff_parse_sample_rate(&lst[cnt], tok, ctx)) < 0) { + av_freep(&lst); + return ret; + } + } + if ((ret = av_reallocp_array(&lst, cnt + 1, sizeof(*lst))) < 0) + return ret; + lst[cnt] = -1; + out_samplerates = ff_make_format_list(lst); + av_freep(&lst); } else { out_samplerates = ff_all_samplerates(); } @@ -306,7 +332,8 @@ static void *resample_child_next(void *obj, void *prev) #define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM static const AVOption options[] = { - {"sample_rate", NULL, OFFSET(sample_rate_arg), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS }, + {"sample_rate", "set sample rate", OFFSET(sample_rate_arg), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS }, + {"sample_rate_list", "set the '|'-separated list of sample rates", OFFSET(sample_rate_list), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS }, {NULL} };