From: Marton Balint <cus@passwd.hu>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH 2/2] swresample/resample: rework resample_one function to work the same way as the others
Date: Thu, 29 Feb 2024 18:55:01 +0100 (CET)
Message-ID: <a46c7130-73f2-ed99-cdde-ea50f7f4fab5@passwd.hu> (raw)
In-Reply-To: <20240229122205.GD6420@pb2>
On Thu, 29 Feb 2024, Michael Niedermayer wrote:
> On Tue, Feb 27, 2024 at 10:48:10AM +0100, Marton Balint wrote:
>> Signed-off-by: Marton Balint <cus@passwd.hu>
>> ---
>> libswresample/resample.c | 29 +++++++----------------------
>> libswresample/resample.h | 4 ++--
>> libswresample/resample_template.c | 14 ++++++++++++--
>> 3 files changed, 21 insertions(+), 26 deletions(-)
>>
>> diff --git a/libswresample/resample.c b/libswresample/resample.c
>> index 17cebad01b..89859dec79 100644
>> --- a/libswresample/resample.c
>> +++ b/libswresample/resample.c
>> @@ -356,26 +356,7 @@ static int multiple_resample(ResampleContext *c, AudioData *dst, int dst_size, A
>>
>> *consumed = 0;
>>
>> - if (c->filter_length == 1 && c->phase_count == 1) {
>> - int64_t index2= (1LL<<32)*c->frac/c->src_incr + (1LL<<32)*c->index + 1;
>> - int64_t incr= (1LL<<32) * c->dst_incr / c->src_incr + 1;
>> - int new_size = (src_size * (int64_t)c->src_incr - c->frac + c->dst_incr - 1) / c->dst_incr;
>> -
>> - dst_size = FFMAX(FFMIN(dst_size, new_size), 0);
>> - if (dst_size > 0) {
>> - for (i = 0; i < dst->ch_count; i++) {
>> - c->dsp.resample_one(dst->ch[i], src->ch[i], dst_size, index2, incr);
>> - if (i+1 == dst->ch_count) {
>> - c->index += dst_size * c->dst_incr_div;
>> - c->index += (c->frac + dst_size * (int64_t)c->dst_incr_mod) / c->src_incr;
>> - av_assert2(c->index >= 0);
>> - *consumed = c->index;
>> - c->frac = (c->frac + dst_size * (int64_t)c->dst_incr_mod) % c->src_incr;
>> - c->index = 0;
>> - }
>> - }
>> - }
>> - } else {
>> + {
>> int64_t end_index = (1LL + src_size - c->filter_length) * c->phase_count;
>> int64_t delta_frac = (end_index - c->index) * c->src_incr - c->frac;
>> int delta_n = (delta_frac + c->dst_incr - 1) / c->dst_incr;
>> @@ -386,8 +367,12 @@ static int multiple_resample(ResampleContext *c, AudioData *dst, int dst_size, A
>> if (dst_size > 0) {
>> /* resample_linear and resample_common should have same behavior
>> * when frac and dst_incr_mod are zero */
>> - resample_func = (c->linear && (c->frac || c->dst_incr_mod)) ?
>> - c->dsp.resample_linear : c->dsp.resample_common;
>> + if (c->filter_length == 1 && c->phase_count == 1)
>> + resample_func = c->dsp.resample_one;
>> + else if (c->linear && (c->frac || c->dst_incr_mod))
>> + resample_func = c->dsp.resample_linear;
>> + else
>> + resample_func = c->dsp.resample_common;
>> for (i = 0; i < dst->ch_count; i++)
>> *consumed = resample_func(c, dst->ch[i], src->ch[i], dst_size, i+1 == dst->ch_count);
>> }
>> diff --git a/libswresample/resample.h b/libswresample/resample.h
>> index 1731dad3cf..8cc29effe8 100644
>> --- a/libswresample/resample.h
>> +++ b/libswresample/resample.h
>> @@ -51,8 +51,8 @@ typedef struct ResampleContext {
>> int phase_count_compensation; /* desired phase_count when compensation is enabled */
>>
>> struct {
>> - void (*resample_one)(void *dst, const void *src,
>> - int n, int64_t index, int64_t incr);
>> + int (*resample_one)(struct ResampleContext *c, void *dst,
>> + const void *src, int n, int update_ctx);
>> int (*resample_common)(struct ResampleContext *c, void *dst,
>> const void *src, int n, int update_ctx);
>> int (*resample_linear)(struct ResampleContext *c, void *dst,
>> diff --git a/libswresample/resample_template.c b/libswresample/resample_template.c
>> index 4c227b9940..a8114ea918 100644
>> --- a/libswresample/resample_template.c
>> +++ b/libswresample/resample_template.c
>> @@ -72,17 +72,27 @@
>>
>> #endif
>>
>> -static void RENAME(resample_one)(void *dest, const void *source,
>> - int dst_size, int64_t index2, int64_t incr)
>> +static int RENAME(resample_one)(ResampleContext *c,
>> + void *dest, const void *source,
>> + int dst_size, int update_ctx)
>> {
>> DELEM *dst = dest;
>> const DELEM *src = source;
>> int dst_index;
>
>> + int64_t index2 = (1LL << 32) * c->frac / c->src_incr + 1 + (1LL << 32) * c->index;
>> + int64_t incr = (1LL << 32) * c->dst_incr / c->src_incr + 1;
>
> This computation is done repeatedly for each channel, thats not needed
> its enough if its done once
I consider that negligable for real cases, and it makes the code cleaner
doing the computations here.
If you insist on this, then it is better to rework all the resample funcs
to work on all channels in a separate patch.
Regards,
Marton
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2024-02-29 17:55 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-26 0:45 [FFmpeg-devel] [PATCH 1/4] fate: never generate auto-generated references Marton Balint
2024-02-26 0:45 ` [FFmpeg-devel] [PATCH 2/4] swresample/resample: rework resample_one function to work the same way as the others Marton Balint
2024-02-26 22:19 ` Michael Niedermayer
2024-02-27 9:48 ` [FFmpeg-devel] [PATCH 1/2] swresample/resample: fix rounding errors with filter_size=1 and phase_shift=0 Marton Balint
2024-02-27 9:48 ` [FFmpeg-devel] [PATCH 2/2] swresample/resample: rework resample_one function to work the same way as the others Marton Balint
2024-02-27 17:54 ` Michael Niedermayer
2024-02-27 20:50 ` Marton Balint
2024-02-28 22:45 ` Michael Niedermayer
2024-02-29 0:19 ` Marton Balint
2024-02-29 12:22 ` Michael Niedermayer
2024-02-29 17:55 ` Marton Balint [this message]
2024-03-01 3:30 ` Michael Niedermayer
2024-03-01 22:24 ` Marton Balint
2024-02-27 17:53 ` [FFmpeg-devel] [PATCH 1/2] swresample/resample: fix rounding errors with filter_size=1 and phase_shift=0 Michael Niedermayer
2024-02-26 0:45 ` [FFmpeg-devel] [PATCH 3/4] fate/libswresample: force number of samples for the input of aresample async tests Marton Balint
2024-02-26 0:45 ` [FFmpeg-devel] [PATCH 4/4] avformat/wavdec: dynamically set max_size by default Marton Balint
2024-02-28 23:12 ` Andreas Rheinhardt
2024-02-29 0:18 ` Marton Balint
2024-03-01 22:30 ` Marton Balint
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a46c7130-73f2-ed99-cdde-ea50f7f4fab5@passwd.hu \
--to=cus@passwd.hu \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git