Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
7f1ae79d
Commit
7f1ae79d
authored
Apr 10, 2012
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
swr: support float & int32 in the resampler
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
605bcf61
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
220 additions
and
129 deletions
+220
-129
resample.c
libswresample/resample.c
+102
-126
resample_template.c
libswresample/resample_template.c
+113
-0
swresample.c
libswresample/swresample.c
+1
-1
swresample_internal.h
libswresample/swresample_internal.h
+4
-2
No files found.
libswresample/resample.c
View file @
7f1ae79d
This diff is collapsed.
Click to expand it.
libswresample/resample_template.c
0 → 100644
View file @
7f1ae79d
/*
* audio resampling
* Copyright (c) 2004-2012 Michael Niedermayer <michaelni@gmx.at>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file
* audio resampling
* @author Michael Niedermayer <michaelni@gmx.at>
*/
int
RENAME
(
swri_resample
)(
ResampleContext
*
c
,
DELEM
*
dst
,
const
DELEM
*
src
,
int
*
consumed
,
int
src_size
,
int
dst_size
,
int
update_ctx
){
int
dst_index
,
i
;
int
index
=
c
->
index
;
int
frac
=
c
->
frac
;
int
dst_incr_frac
=
c
->
dst_incr
%
c
->
src_incr
;
int
dst_incr
=
c
->
dst_incr
/
c
->
src_incr
;
int
compensation_distance
=
c
->
compensation_distance
;
av_assert1
(
c
->
filter_shift
==
FILTER_SHIFT
);
av_assert1
(
c
->
felem_size
==
sizeof
(
FELEM
));
if
(
compensation_distance
==
0
&&
c
->
filter_length
==
1
&&
c
->
phase_shift
==
0
){
int64_t
index2
=
((
int64_t
)
index
)
<<
32
;
int64_t
incr
=
(
1LL
<<
32
)
*
c
->
dst_incr
/
c
->
src_incr
;
dst_size
=
FFMIN
(
dst_size
,
(
src_size
-
1
-
index
)
*
(
int64_t
)
c
->
src_incr
/
c
->
dst_incr
);
for
(
dst_index
=
0
;
dst_index
<
dst_size
;
dst_index
++
){
dst
[
dst_index
]
=
src
[
index2
>>
32
];
index2
+=
incr
;
}
index
+=
dst_index
*
dst_incr
;
index
+=
(
frac
+
dst_index
*
(
int64_t
)
dst_incr_frac
)
/
c
->
src_incr
;
frac
=
(
frac
+
dst_index
*
(
int64_t
)
dst_incr_frac
)
%
c
->
src_incr
;
}
else
{
for
(
dst_index
=
0
;
dst_index
<
dst_size
;
dst_index
++
){
FELEM
*
filter
=
((
FELEM
*
)
c
->
filter_bank
)
+
c
->
filter_length
*
(
index
&
c
->
phase_mask
);
int
sample_index
=
index
>>
c
->
phase_shift
;
FELEM2
val
=
0
;
if
(
sample_index
+
c
->
filter_length
>
src_size
||
-
sample_index
>=
src_size
){
break
;
}
else
if
(
sample_index
<
0
){
for
(
i
=
0
;
i
<
c
->
filter_length
;
i
++
)
val
+=
src
[
FFABS
(
sample_index
+
i
)]
*
filter
[
i
];
}
else
if
(
c
->
linear
){
FELEM2
v2
=
0
;
for
(
i
=
0
;
i
<
c
->
filter_length
;
i
++
){
val
+=
src
[
sample_index
+
i
]
*
(
FELEM2
)
filter
[
i
];
v2
+=
src
[
sample_index
+
i
]
*
(
FELEM2
)
filter
[
i
+
c
->
filter_length
];
}
val
+=
(
v2
-
val
)
*
(
FELEML
)
frac
/
c
->
src_incr
;
}
else
{
for
(
i
=
0
;
i
<
c
->
filter_length
;
i
++
){
val
+=
src
[
sample_index
+
i
]
*
(
FELEM2
)
filter
[
i
];
}
}
OUT
(
dst
[
dst_index
],
val
);
frac
+=
dst_incr_frac
;
index
+=
dst_incr
;
if
(
frac
>=
c
->
src_incr
){
frac
-=
c
->
src_incr
;
index
++
;
}
if
(
dst_index
+
1
==
compensation_distance
){
compensation_distance
=
0
;
dst_incr_frac
=
c
->
ideal_dst_incr
%
c
->
src_incr
;
dst_incr
=
c
->
ideal_dst_incr
/
c
->
src_incr
;
}
}
}
*
consumed
=
FFMAX
(
index
,
0
)
>>
c
->
phase_shift
;
if
(
index
>=
0
)
index
&=
c
->
phase_mask
;
if
(
compensation_distance
){
compensation_distance
-=
dst_index
;
assert
(
compensation_distance
>
0
);
}
if
(
update_ctx
){
c
->
frac
=
frac
;
c
->
index
=
index
;
c
->
dst_incr
=
dst_incr_frac
+
c
->
src_incr
*
dst_incr
;
c
->
compensation_distance
=
compensation_distance
;
}
#if 0
if(update_ctx && !c->compensation_distance){
#undef rand
av_resample_compensate(c, rand() % (8000*2) - 8000, 8000*2);
av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", c->dst_incr, c->ideal_dst_incr, c->compensation_distance);
}
#endif
return
dst_index
;
}
libswresample/swresample.c
View file @
7f1ae79d
...
@@ -190,7 +190,7 @@ int swr_init(struct SwrContext *s){
...
@@ -190,7 +190,7 @@ int swr_init(struct SwrContext *s){
if
(
s
->
out_sample_rate
!=
s
->
in_sample_rate
||
(
s
->
flags
&
SWR_FLAG_RESAMPLE
)){
if
(
s
->
out_sample_rate
!=
s
->
in_sample_rate
||
(
s
->
flags
&
SWR_FLAG_RESAMPLE
)){
s
->
resample
=
swri_resample_init
(
s
->
resample
,
s
->
out_sample_rate
,
s
->
in_sample_rate
,
16
,
10
,
0
,
0
.
8
);
s
->
resample
=
swri_resample_init
(
s
->
resample
,
s
->
out_sample_rate
,
s
->
in_sample_rate
,
16
,
10
,
0
,
0
.
8
,
s
->
int_sample_fmt
);
}
else
}
else
swri_resample_free
(
&
s
->
resample
);
swri_resample_free
(
&
s
->
resample
);
if
(
s
->
int_sample_fmt
!=
AV_SAMPLE_FMT_S16
&&
s
->
resample
){
if
(
s
->
int_sample_fmt
!=
AV_SAMPLE_FMT_S16
&&
s
->
resample
){
...
...
libswresample/swresample_internal.h
View file @
7f1ae79d
...
@@ -78,11 +78,13 @@ struct SwrContext {
...
@@ -78,11 +78,13 @@ struct SwrContext {
/* TODO: callbacks for ASM optimizations */
/* TODO: callbacks for ASM optimizations */
};
};
struct
ResampleContext
*
swri_resample_init
(
struct
ResampleContext
*
,
int
out_rate
,
int
in_rate
,
int
filter_size
,
int
phase_shift
,
int
linear
,
double
cutoff
);
struct
ResampleContext
*
swri_resample_init
(
struct
ResampleContext
*
,
int
out_rate
,
int
in_rate
,
int
filter_size
,
int
phase_shift
,
int
linear
,
double
cutoff
,
enum
AVSampleFormat
);
void
swri_resample_free
(
struct
ResampleContext
**
c
);
void
swri_resample_free
(
struct
ResampleContext
**
c
);
int
swri_multiple_resample
(
struct
ResampleContext
*
c
,
AudioData
*
dst
,
int
dst_size
,
AudioData
*
src
,
int
src_size
,
int
*
consumed
);
int
swri_multiple_resample
(
struct
ResampleContext
*
c
,
AudioData
*
dst
,
int
dst_size
,
AudioData
*
src
,
int
src_size
,
int
*
consumed
);
void
swri_resample_compensate
(
struct
ResampleContext
*
c
,
int
sample_delta
,
int
compensation_distance
);
void
swri_resample_compensate
(
struct
ResampleContext
*
c
,
int
sample_delta
,
int
compensation_distance
);
int
swri_resample
(
struct
ResampleContext
*
c
,
int16_t
*
dst
,
const
int16_t
*
src
,
int
*
consumed
,
int
src_size
,
int
dst_size
,
int
update_ctx
);
int
swri_resample_int16
(
struct
ResampleContext
*
c
,
int16_t
*
dst
,
const
int16_t
*
src
,
int
*
consumed
,
int
src_size
,
int
dst_size
,
int
update_ctx
);
int
swri_resample_int32
(
struct
ResampleContext
*
c
,
int32_t
*
dst
,
const
int32_t
*
src
,
int
*
consumed
,
int
src_size
,
int
dst_size
,
int
update_ctx
);
int
swri_resample_float
(
struct
ResampleContext
*
c
,
float
*
dst
,
const
float
*
src
,
int
*
consumed
,
int
src_size
,
int
dst_size
,
int
update_ctx
);
int
swri_rematrix_init
(
SwrContext
*
s
);
int
swri_rematrix_init
(
SwrContext
*
s
);
int
swri_rematrix
(
SwrContext
*
s
,
AudioData
*
out
,
AudioData
*
in
,
int
len
,
int
mustcopy
);
int
swri_rematrix
(
SwrContext
*
s
,
AudioData
*
out
,
AudioData
*
in
,
int
len
,
int
mustcopy
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment