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
fb1ddcdc
Commit
fb1ddcdc
authored
May 25, 2014
by
Luca Barbato
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avresample: Introduce AVFrame-based API
parent
8c6f4302
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
209 additions
and
2 deletions
+209
-2
APIchanges
doc/APIchanges
+6
-0
avresample.h
libavresample/avresample.h
+69
-0
utils.c
libavresample/utils.c
+130
-0
version.h
libavresample/version.h
+1
-1
error.h
libavutil/error.h
+2
-0
version.h
libavutil/version.h
+1
-1
No files found.
doc/APIchanges
View file @
fb1ddcdc
...
...
@@ -13,6 +13,12 @@ libavutil: 2014-08-09
API changes, most recent first:
2014-04-xx - xxxxxxx - lavr 2.1.0 - avresample.h
Add avresample_convert_frame() and avresample_config().
2014-04-xx - xxxxxxx - lavu 54.1.0 - error.h
Add AVERROR_INPUT_CHANGED and AVERROR_OUTPUT_CHANGED.
2014-08-xx - xxxxxxx - lavc 55.57.4 - avcodec.h
Deprecate FF_IDCT_XVIDMMX define and xvidmmx idct option.
Replaced by FF_IDCT_XVID and xvid respectively.
...
...
libavresample/avresample.h
View file @
fb1ddcdc
...
...
@@ -95,6 +95,7 @@
#include "libavutil/avutil.h"
#include "libavutil/channel_layout.h"
#include "libavutil/dict.h"
#include "libavutil/frame.h"
#include "libavutil/log.h"
#include "libavutil/mathematics.h"
...
...
@@ -165,6 +166,10 @@ AVAudioResampleContext *avresample_alloc_context(void);
/**
* Initialize AVAudioResampleContext.
* @note The context must be configured using the AVOption API.
*
* @see av_opt_set_int()
* @see av_opt_set_dict()
*
* @param avr audio resample context
* @return 0 on success, negative AVERROR code on failure
...
...
@@ -422,6 +427,70 @@ int avresample_available(AVAudioResampleContext *avr);
*/
int
avresample_read
(
AVAudioResampleContext
*
avr
,
uint8_t
**
output
,
int
nb_samples
);
/**
* Convert the samples in the input AVFrame and write them to the output AVFrame.
*
* Input and output AVFrames must have channel_layout, sample_rate and format set.
*
* The upper bound on the number of output samples is obtained through
* avresample_get_out_samples().
*
* If the output AVFrame does not have the data pointers allocated the nb_samples
* field will be set using avresample_get_out_samples() and av_frame_get_buffer()
* is called to allocate the frame.
*
* The output AVFrame can be NULL or have fewer allocated samples than required.
* In this case, any remaining samples not written to the output will be added
* to an internal FIFO buffer, to be returned at the next call to this function
* or to avresample_convert() or to avresample_read().
*
* If converting sample rate, there may be data remaining in the internal
* resampling delay buffer. avresample_get_delay() tells the number of
* remaining samples. To get this data as output, call this function or
* avresample_convert() with NULL input.
*
* At the end of the conversion process, there may be data remaining in the
* internal FIFO buffer. avresample_available() tells the number of remaining
* samples. To get this data as output, either call this function or
* avresample_convert() with NULL input or call avresample_read().
*
* If the AVAudioResampleContext configuration does not match the output and
* input AVFrame settings the conversion does not take place and depending on
* which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED
* or AVERROR_OUTPUT_CHANGED|AVERROR_INPUT_CHANGED is returned.
*
* @see avresample_get_out_samples()
* @see avresample_available()
* @see avresample_convert()
* @see avresample_read()
* @see avresample_get_delay()
*
* @param avr audio resample context
* @param output output AVFrame
* @param input input AVFrame
* @return 0 on success, AVERROR on failure or nonmatching
* configuration.
*/
int
avresample_convert_frame
(
AVAudioResampleContext
*
avr
,
AVFrame
*
output
,
AVFrame
*
input
);
/**
* Configure or reconfigure the AVAudioResampleContext using the information
* provided by the AVFrames.
*
* The original resampling context is reset even on failure.
* The function calls avresample_close() internally if the context is open.
*
* @see avresample_open();
* @see avresample_close();
*
* @param avr audio resample context
* @param output output AVFrame
* @param input input AVFrame
* @return 0 on success, AVERROR on failure.
*/
int
avresample_config
(
AVAudioResampleContext
*
avr
,
AVFrame
*
out
,
AVFrame
*
in
);
/**
* @}
*/
...
...
libavresample/utils.c
View file @
fb1ddcdc
...
...
@@ -21,6 +21,7 @@
#include "libavutil/common.h"
#include "libavutil/dict.h"
#include "libavutil/error.h"
#include "libavutil/frame.h"
#include "libavutil/log.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
...
...
@@ -500,6 +501,135 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr,
current_buffer
);
}
int
avresample_config
(
AVAudioResampleContext
*
avr
,
AVFrame
*
out
,
AVFrame
*
in
)
{
if
(
avresample_is_open
(
avr
))
{
avresample_close
(
avr
);
}
if
(
in
)
{
avr
->
in_channel_layout
=
in
->
channel_layout
;
avr
->
in_sample_rate
=
in
->
sample_rate
;
avr
->
in_sample_fmt
=
in
->
format
;
}
if
(
out
)
{
avr
->
out_channel_layout
=
out
->
channel_layout
;
avr
->
out_sample_rate
=
out
->
sample_rate
;
avr
->
out_sample_fmt
=
out
->
format
;
}
return
0
;
}
static
int
config_changed
(
AVAudioResampleContext
*
avr
,
AVFrame
*
out
,
AVFrame
*
in
)
{
int
ret
=
0
;
if
(
in
)
{
if
(
avr
->
in_channel_layout
!=
in
->
channel_layout
||
avr
->
in_sample_rate
!=
in
->
sample_rate
||
avr
->
in_sample_fmt
!=
in
->
format
)
{
ret
|=
AVERROR_INPUT_CHANGED
;
}
}
if
(
out
)
{
if
(
avr
->
out_channel_layout
!=
out
->
channel_layout
||
avr
->
out_sample_rate
!=
out
->
sample_rate
||
avr
->
out_sample_fmt
!=
out
->
format
)
{
ret
|=
AVERROR_OUTPUT_CHANGED
;
}
}
return
ret
;
}
static
inline
int
convert_frame
(
AVAudioResampleContext
*
avr
,
AVFrame
*
out
,
AVFrame
*
in
)
{
int
ret
;
uint8_t
**
out_data
=
NULL
,
**
in_data
=
NULL
;
int
out_linesize
=
0
,
in_linesize
=
0
;
int
out_nb_samples
=
0
,
in_nb_samples
=
0
;
if
(
out
)
{
out_data
=
out
->
extended_data
;
out_linesize
=
out
->
linesize
[
0
];
out_nb_samples
=
out
->
nb_samples
;
}
if
(
in
)
{
in_data
=
in
->
extended_data
;
in_linesize
=
in
->
linesize
[
0
];
in_nb_samples
=
in
->
nb_samples
;
}
ret
=
avresample_convert
(
avr
,
out_data
,
out_linesize
,
out_nb_samples
,
in_data
,
in_linesize
,
in_nb_samples
);
if
(
ret
<
0
)
{
if
(
out
)
out
->
nb_samples
=
0
;
return
ret
;
}
if
(
out
)
out
->
nb_samples
=
ret
;
return
0
;
}
static
inline
int
available_samples
(
AVFrame
*
out
)
{
int
bytes_per_sample
=
av_get_bytes_per_sample
(
out
->
format
);
int
samples
=
out
->
linesize
[
0
]
/
bytes_per_sample
;
if
(
av_sample_fmt_is_planar
(
out
->
format
))
{
return
samples
;
}
else
{
int
channels
=
av_get_channel_layout_nb_channels
(
out
->
channel_layout
);
return
samples
/
channels
;
}
}
int
avresample_convert_frame
(
AVAudioResampleContext
*
avr
,
AVFrame
*
out
,
AVFrame
*
in
)
{
int
ret
,
setup
=
0
;
if
(
!
avresample_is_open
(
avr
))
{
if
((
ret
=
avresample_config
(
avr
,
out
,
in
))
<
0
)
return
ret
;
if
((
ret
=
avresample_open
(
avr
))
<
0
)
return
ret
;
setup
=
1
;
}
else
{
// return as is or reconfigure for input changes?
if
((
ret
=
config_changed
(
avr
,
out
,
in
)))
return
ret
;
}
if
(
out
)
{
if
(
!
out
->
linesize
[
0
])
{
out
->
nb_samples
=
avresample_get_out_samples
(
avr
,
in
->
nb_samples
);
if
((
ret
=
av_frame_get_buffer
(
out
,
0
))
<
0
)
{
if
(
setup
)
avresample_close
(
avr
);
return
ret
;
}
}
else
{
if
(
!
out
->
nb_samples
)
out
->
nb_samples
=
available_samples
(
out
);
}
}
return
convert_frame
(
avr
,
out
,
in
);
}
int
avresample_get_matrix
(
AVAudioResampleContext
*
avr
,
double
*
matrix
,
int
stride
)
{
...
...
libavresample/version.h
View file @
fb1ddcdc
...
...
@@ -28,7 +28,7 @@
#include "libavutil/version.h"
#define LIBAVRESAMPLE_VERSION_MAJOR 2
#define LIBAVRESAMPLE_VERSION_MINOR
0
#define LIBAVRESAMPLE_VERSION_MINOR
1
#define LIBAVRESAMPLE_VERSION_MICRO 0
#define LIBAVRESAMPLE_VERSION_INT AV_VERSION_INT(LIBAVRESAMPLE_VERSION_MAJOR, \
...
...
libavutil/error.h
View file @
fb1ddcdc
...
...
@@ -60,6 +60,8 @@
#define AVERROR_BUG (-0x5fb8aabe) ///< Bug detected, please report the issue
#define AVERROR_UNKNOWN (-0x31b4b1ab) ///< Unknown error, typically from an external library
#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
#define AVERROR_INPUT_CHANGED (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED)
#define AVERROR_OUTPUT_CHANGED (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED)
/**
* Put a description of the AVERROR code errnum in errbuf.
...
...
libavutil/version.h
View file @
fb1ddcdc
...
...
@@ -54,7 +54,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 54
#define LIBAVUTIL_VERSION_MINOR
0
#define LIBAVUTIL_VERSION_MINOR
1
#define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
...
...
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