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
3971be0e
Commit
3971be0e
authored
Jun 09, 2012
by
John Stebbins
Committed by
Justin Ruggles
Jun 18, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add Dolby/DPLII downmix support to libavresample
Signed-off-by:
Justin Ruggles
<
justin.ruggles@gmail.com
>
parent
9fcda25e
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
72 additions
and
11 deletions
+72
-11
APIchanges
doc/APIchanges
+3
-0
audio_mix.c
libavresample/audio_mix.c
+2
-1
audio_mix_matrix.c
libavresample/audio_mix_matrix.c
+52
-8
avresample.h
libavresample/avresample.h
+2
-1
internal.h
libavresample/internal.h
+1
-0
options.c
libavresample/options.c
+4
-0
version.h
libavresample/version.h
+1
-1
audioconvert.h
libavutil/audioconvert.h
+7
-0
No files found.
doc/APIchanges
View file @
3971be0e
...
@@ -13,6 +13,9 @@ libavutil: 2011-04-18
...
@@ -13,6 +13,9 @@ libavutil: 2011-04-18
API changes, most recent first:
API changes, most recent first:
2012-xx-xx - xxxxxxx - lavr 0.0.3
Add a parameter to avresample_build_matrix() for Dolby/DPLII downmixing.
2012-xx-xx - xxxxxxx - lavfi 2.23.0 - avfilter.h
2012-xx-xx - xxxxxxx - lavfi 2.23.0 - avfilter.h
Add AVFilterContext.nb_inputs/outputs. Deprecate
Add AVFilterContext.nb_inputs/outputs. Deprecate
AVFilterContext.input/output_count.
AVFilterContext.input/output_count.
...
...
libavresample/audio_mix.c
View file @
3971be0e
...
@@ -320,7 +320,8 @@ int ff_audio_mix_init(AVAudioResampleContext *avr)
...
@@ -320,7 +320,8 @@ int ff_audio_mix_init(AVAudioResampleContext *avr)
avr
->
center_mix_level
,
avr
->
center_mix_level
,
avr
->
surround_mix_level
,
avr
->
surround_mix_level
,
avr
->
lfe_mix_level
,
1
,
matrix_dbl
,
avr
->
lfe_mix_level
,
1
,
matrix_dbl
,
avr
->
in_channels
);
avr
->
in_channels
,
avr
->
matrix_encoding
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
av_free
(
matrix_dbl
);
av_free
(
matrix_dbl
);
return
ret
;
return
ret
;
...
...
libavresample/audio_mix_matrix.c
View file @
3971be0e
...
@@ -54,6 +54,8 @@
...
@@ -54,6 +54,8 @@
#define SURROUND_DIRECT_LEFT 33
#define SURROUND_DIRECT_LEFT 33
#define SURROUND_DIRECT_RIGHT 34
#define SURROUND_DIRECT_RIGHT 34
#define SQRT3_2 1.22474487139158904909
/* sqrt(3/2) */
static
av_always_inline
int
even
(
uint64_t
layout
)
static
av_always_inline
int
even
(
uint64_t
layout
)
{
{
return
(
!
layout
||
(
layout
&
(
layout
-
1
)));
return
(
!
layout
||
(
layout
&
(
layout
-
1
)));
...
@@ -83,14 +85,21 @@ static int sane_layout(uint64_t layout)
...
@@ -83,14 +85,21 @@ static int sane_layout(uint64_t layout)
int
avresample_build_matrix
(
uint64_t
in_layout
,
uint64_t
out_layout
,
int
avresample_build_matrix
(
uint64_t
in_layout
,
uint64_t
out_layout
,
double
center_mix_level
,
double
surround_mix_level
,
double
center_mix_level
,
double
surround_mix_level
,
double
lfe_mix_level
,
int
normalize
,
double
lfe_mix_level
,
int
normalize
,
double
*
matrix_out
,
int
stride
)
double
*
matrix_out
,
int
stride
,
enum
AVMatrixEncoding
matrix_encoding
)
{
{
int
i
,
j
,
out_i
,
out_j
;
int
i
,
j
,
out_i
,
out_j
;
double
matrix
[
64
][
64
]
=
{{
0
}};
double
matrix
[
64
][
64
]
=
{{
0
}};
int64_t
unaccounted
=
in_layout
&
~
out_layout
;
int64_t
unaccounted
;
double
maxcoef
=
0
;
double
maxcoef
=
0
;
int
in_channels
,
out_channels
;
int
in_channels
,
out_channels
;
if
((
out_layout
&
AV_CH_LAYOUT_STEREO_DOWNMIX
)
==
AV_CH_LAYOUT_STEREO_DOWNMIX
)
{
out_layout
=
AV_CH_LAYOUT_STEREO
;
}
unaccounted
=
in_layout
&
~
out_layout
;
in_channels
=
av_get_channel_layout_nb_channels
(
in_layout
);
in_channels
=
av_get_channel_layout_nb_channels
(
in_layout
);
out_channels
=
av_get_channel_layout_nb_channels
(
out_layout
);
out_channels
=
av_get_channel_layout_nb_channels
(
out_layout
);
...
@@ -140,8 +149,19 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout,
...
@@ -140,8 +149,19 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout,
matrix
[
SIDE_LEFT
][
BACK_CENTER
]
+=
M_SQRT1_2
;
matrix
[
SIDE_LEFT
][
BACK_CENTER
]
+=
M_SQRT1_2
;
matrix
[
SIDE_RIGHT
][
BACK_CENTER
]
+=
M_SQRT1_2
;
matrix
[
SIDE_RIGHT
][
BACK_CENTER
]
+=
M_SQRT1_2
;
}
else
if
(
out_layout
&
AV_CH_FRONT_LEFT
)
{
}
else
if
(
out_layout
&
AV_CH_FRONT_LEFT
)
{
if
(
matrix_encoding
==
AV_MATRIX_ENCODING_DOLBY
||
matrix_encoding
==
AV_MATRIX_ENCODING_DPLII
)
{
if
(
unaccounted
&
(
AV_CH_BACK_LEFT
|
AV_CH_SIDE_LEFT
))
{
matrix
[
FRONT_LEFT
][
BACK_CENTER
]
-=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
BACK_CENTER
]
+=
surround_mix_level
*
M_SQRT1_2
;
}
else
{
matrix
[
FRONT_LEFT
][
BACK_CENTER
]
-=
surround_mix_level
;
matrix
[
FRONT_RIGHT
][
BACK_CENTER
]
+=
surround_mix_level
;
}
}
else
{
matrix
[
FRONT_LEFT
][
BACK_CENTER
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_LEFT
][
BACK_CENTER
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
BACK_CENTER
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
BACK_CENTER
]
+=
surround_mix_level
*
M_SQRT1_2
;
}
}
else
if
(
out_layout
&
AV_CH_FRONT_CENTER
)
{
}
else
if
(
out_layout
&
AV_CH_FRONT_CENTER
)
{
matrix
[
FRONT_CENTER
][
BACK_CENTER
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_CENTER
][
BACK_CENTER
]
+=
surround_mix_level
*
M_SQRT1_2
;
}
else
}
else
...
@@ -163,8 +183,20 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout,
...
@@ -163,8 +183,20 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout,
matrix
[
SIDE_RIGHT
][
BACK_RIGHT
]
+=
1
.
0
;
matrix
[
SIDE_RIGHT
][
BACK_RIGHT
]
+=
1
.
0
;
}
}
}
else
if
(
out_layout
&
AV_CH_FRONT_LEFT
)
{
}
else
if
(
out_layout
&
AV_CH_FRONT_LEFT
)
{
if
(
matrix_encoding
==
AV_MATRIX_ENCODING_DOLBY
)
{
matrix
[
FRONT_LEFT
][
BACK_LEFT
]
-=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_LEFT
][
BACK_RIGHT
]
-=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
BACK_LEFT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
BACK_RIGHT
]
+=
surround_mix_level
*
M_SQRT1_2
;
}
else
if
(
matrix_encoding
==
AV_MATRIX_ENCODING_DPLII
)
{
matrix
[
FRONT_LEFT
][
BACK_LEFT
]
-=
surround_mix_level
*
SQRT3_2
;
matrix
[
FRONT_LEFT
][
BACK_RIGHT
]
-=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
BACK_LEFT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
BACK_RIGHT
]
+=
surround_mix_level
*
SQRT3_2
;
}
else
{
matrix
[
FRONT_LEFT
][
BACK_LEFT
]
+=
surround_mix_level
;
matrix
[
FRONT_LEFT
][
BACK_LEFT
]
+=
surround_mix_level
;
matrix
[
FRONT_RIGHT
][
BACK_RIGHT
]
+=
surround_mix_level
;
matrix
[
FRONT_RIGHT
][
BACK_RIGHT
]
+=
surround_mix_level
;
}
}
else
if
(
out_layout
&
AV_CH_FRONT_CENTER
)
{
}
else
if
(
out_layout
&
AV_CH_FRONT_CENTER
)
{
matrix
[
FRONT_CENTER
][
BACK_LEFT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_CENTER
][
BACK_LEFT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_CENTER
][
BACK_RIGHT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_CENTER
][
BACK_RIGHT
]
+=
surround_mix_level
*
M_SQRT1_2
;
...
@@ -187,8 +219,20 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout,
...
@@ -187,8 +219,20 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout,
matrix
[
BACK_CENTER
][
SIDE_LEFT
]
+=
M_SQRT1_2
;
matrix
[
BACK_CENTER
][
SIDE_LEFT
]
+=
M_SQRT1_2
;
matrix
[
BACK_CENTER
][
SIDE_RIGHT
]
+=
M_SQRT1_2
;
matrix
[
BACK_CENTER
][
SIDE_RIGHT
]
+=
M_SQRT1_2
;
}
else
if
(
out_layout
&
AV_CH_FRONT_LEFT
)
{
}
else
if
(
out_layout
&
AV_CH_FRONT_LEFT
)
{
if
(
matrix_encoding
==
AV_MATRIX_ENCODING_DOLBY
)
{
matrix
[
FRONT_LEFT
][
SIDE_LEFT
]
-=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_LEFT
][
SIDE_RIGHT
]
-=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
SIDE_LEFT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
SIDE_RIGHT
]
+=
surround_mix_level
*
M_SQRT1_2
;
}
else
if
(
matrix_encoding
==
AV_MATRIX_ENCODING_DPLII
)
{
matrix
[
FRONT_LEFT
][
SIDE_LEFT
]
-=
surround_mix_level
*
SQRT3_2
;
matrix
[
FRONT_LEFT
][
SIDE_RIGHT
]
-=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
SIDE_LEFT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_RIGHT
][
SIDE_RIGHT
]
+=
surround_mix_level
*
SQRT3_2
;
}
else
{
matrix
[
FRONT_LEFT
][
SIDE_LEFT
]
+=
surround_mix_level
;
matrix
[
FRONT_LEFT
][
SIDE_LEFT
]
+=
surround_mix_level
;
matrix
[
FRONT_RIGHT
][
SIDE_RIGHT
]
+=
surround_mix_level
;
matrix
[
FRONT_RIGHT
][
SIDE_RIGHT
]
+=
surround_mix_level
;
}
}
else
if
(
out_layout
&
AV_CH_FRONT_CENTER
)
{
}
else
if
(
out_layout
&
AV_CH_FRONT_CENTER
)
{
matrix
[
FRONT_CENTER
][
SIDE_LEFT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_CENTER
][
SIDE_LEFT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_CENTER
][
SIDE_RIGHT
]
+=
surround_mix_level
*
M_SQRT1_2
;
matrix
[
FRONT_CENTER
][
SIDE_RIGHT
]
+=
surround_mix_level
*
M_SQRT1_2
;
...
...
libavresample/avresample.h
View file @
3971be0e
...
@@ -131,12 +131,13 @@ void avresample_free(AVAudioResampleContext **avr);
...
@@ -131,12 +131,13 @@ void avresample_free(AVAudioResampleContext **avr);
* the weight of input channel i in output channel o.
* the weight of input channel i in output channel o.
* @param stride distance between adjacent input channels in the
* @param stride distance between adjacent input channels in the
* matrix array
* matrix array
* @param matrix_encoding matrixed stereo downmix mode (e.g. dplii)
* @return 0 on success, negative AVERROR code on failure
* @return 0 on success, negative AVERROR code on failure
*/
*/
int
avresample_build_matrix
(
uint64_t
in_layout
,
uint64_t
out_layout
,
int
avresample_build_matrix
(
uint64_t
in_layout
,
uint64_t
out_layout
,
double
center_mix_level
,
double
surround_mix_level
,
double
center_mix_level
,
double
surround_mix_level
,
double
lfe_mix_level
,
int
normalize
,
double
*
matrix
,
double
lfe_mix_level
,
int
normalize
,
double
*
matrix
,
int
stride
);
int
stride
,
enum
AVMatrixEncoding
matrix_encoding
);
/**
/**
* Get the current channel mixing matrix.
* Get the current channel mixing matrix.
...
...
libavresample/internal.h
View file @
3971be0e
...
@@ -70,6 +70,7 @@ struct AVAudioResampleContext {
...
@@ -70,6 +70,7 @@ struct AVAudioResampleContext {
AudioConvert
*
ac_out
;
/**< output sample format conversion context */
AudioConvert
*
ac_out
;
/**< output sample format conversion context */
ResampleContext
*
resample
;
/**< resampling context */
ResampleContext
*
resample
;
/**< resampling context */
AudioMix
*
am
;
/**< channel mixing context */
AudioMix
*
am
;
/**< channel mixing context */
enum
AVMatrixEncoding
matrix_encoding
;
/**< matrixed stereo encoding */
};
};
#endif
/* AVRESAMPLE_INTERNAL_H */
#endif
/* AVRESAMPLE_INTERNAL_H */
libavresample/options.c
View file @
3971be0e
...
@@ -52,6 +52,10 @@ static const AVOption options[] = {
...
@@ -52,6 +52,10 @@ static const AVOption options[] = {
{
"phase_shift"
,
"Resampling Phase Shift"
,
OFFSET
(
phase_shift
),
AV_OPT_TYPE_INT
,
{
10
},
0
,
30
,
/* ??? */
PARAM
},
{
"phase_shift"
,
"Resampling Phase Shift"
,
OFFSET
(
phase_shift
),
AV_OPT_TYPE_INT
,
{
10
},
0
,
30
,
/* ??? */
PARAM
},
{
"linear_interp"
,
"Use Linear Interpolation"
,
OFFSET
(
linear_interp
),
AV_OPT_TYPE_INT
,
{
0
},
0
,
1
,
PARAM
},
{
"linear_interp"
,
"Use Linear Interpolation"
,
OFFSET
(
linear_interp
),
AV_OPT_TYPE_INT
,
{
0
},
0
,
1
,
PARAM
},
{
"cutoff"
,
"Cutoff Frequency Ratio"
,
OFFSET
(
cutoff
),
AV_OPT_TYPE_DOUBLE
,
{
0
.
8
},
0
.
0
,
1
.
0
,
PARAM
},
{
"cutoff"
,
"Cutoff Frequency Ratio"
,
OFFSET
(
cutoff
),
AV_OPT_TYPE_DOUBLE
,
{
0
.
8
},
0
.
0
,
1
.
0
,
PARAM
},
{
"matrix_encoding"
,
"Matrixed Stereo Encoding"
,
OFFSET
(
matrix_encoding
),
AV_OPT_TYPE_INT
,
{
AV_MATRIX_ENCODING_NONE
},
AV_MATRIX_ENCODING_NONE
,
AV_MATRIX_ENCODING_NB
-
1
,
PARAM
,
"matrix_encoding"
},
{
"none"
,
"None"
,
0
,
AV_OPT_TYPE_CONST
,
{
AV_MATRIX_ENCODING_NONE
},
INT_MIN
,
INT_MAX
,
PARAM
,
"matrix_encoding"
},
{
"dolby"
,
"Dolby"
,
0
,
AV_OPT_TYPE_CONST
,
{
AV_MATRIX_ENCODING_DOLBY
},
INT_MIN
,
INT_MAX
,
PARAM
,
"matrix_encoding"
},
{
"dplii"
,
"Dolby Pro Logic II"
,
0
,
AV_OPT_TYPE_CONST
,
{
AV_MATRIX_ENCODING_DPLII
},
INT_MIN
,
INT_MAX
,
PARAM
,
"matrix_encoding"
},
{
NULL
},
{
NULL
},
};
};
...
...
libavresample/version.h
View file @
3971be0e
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#define LIBAVRESAMPLE_VERSION_MAJOR 0
#define LIBAVRESAMPLE_VERSION_MAJOR 0
#define LIBAVRESAMPLE_VERSION_MINOR 0
#define LIBAVRESAMPLE_VERSION_MINOR 0
#define LIBAVRESAMPLE_VERSION_MICRO
2
#define LIBAVRESAMPLE_VERSION_MICRO
3
#define LIBAVRESAMPLE_VERSION_INT AV_VERSION_INT(LIBAVRESAMPLE_VERSION_MAJOR, \
#define LIBAVRESAMPLE_VERSION_INT AV_VERSION_INT(LIBAVRESAMPLE_VERSION_MAJOR, \
LIBAVRESAMPLE_VERSION_MINOR, \
LIBAVRESAMPLE_VERSION_MINOR, \
...
...
libavutil/audioconvert.h
View file @
3971be0e
...
@@ -101,6 +101,13 @@
...
@@ -101,6 +101,13 @@
#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)
#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)
#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)
#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)
enum
AVMatrixEncoding
{
AV_MATRIX_ENCODING_NONE
,
AV_MATRIX_ENCODING_DOLBY
,
AV_MATRIX_ENCODING_DPLII
,
AV_MATRIX_ENCODING_NB
};
/**
/**
* @}
* @}
*/
*/
...
...
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