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
bcb82fe1
Commit
bcb82fe1
authored
Apr 05, 2012
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avconv: use libavresample
parent
c8af852b
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
68 additions
and
72 deletions
+68
-72
avconv.c
avconv.c
+64
-71
cmdutils.c
cmdutils.c
+4
-1
No files found.
avconv.c
View file @
bcb82fe1
...
...
@@ -31,8 +31,8 @@
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
#include "libswscale/swscale.h"
#include "libavresample/avresample.h"
#include "libavutil/opt.h"
#include "libavcodec/audioconvert.h"
#include "libavutil/audioconvert.h"
#include "libavutil/parseutils.h"
#include "libavutil/samplefmt.h"
...
...
@@ -266,12 +266,11 @@ typedef struct OutputStream {
/* audio only */
int
audio_resample
;
ReSampleContext
*
resample
;
/* for audio resampling */
AVAudioResampleContext
*
avr
;
int
resample_sample_fmt
;
int
resample_channels
;
uint64_t
resample_channel_layout
;
int
resample_sample_rate
;
int
reformat_pair
;
AVAudioConvert
*
reformat_ctx
;
AVFifoBuffer
*
fifo
;
/* for compression: one audio fifo per codec */
FILE
*
logfile
;
...
...
@@ -1314,7 +1313,7 @@ static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
}
static
int
alloc_audio_output_buf
(
AVCodecContext
*
dec
,
AVCodecContext
*
enc
,
int
nb_samples
)
int
nb_samples
,
int
*
buf_linesize
)
{
int64_t
audio_buf_samples
;
int
audio_buf_size
;
...
...
@@ -1327,7 +1326,7 @@ static int alloc_audio_output_buf(AVCodecContext *dec, AVCodecContext *enc,
if
(
audio_buf_samples
>
INT_MAX
)
return
AVERROR
(
EINVAL
);
audio_buf_size
=
av_samples_get_buffer_size
(
NULL
,
enc
->
channels
,
audio_buf_size
=
av_samples_get_buffer_size
(
buf_linesize
,
enc
->
channels
,
audio_buf_samples
,
enc
->
sample_fmt
,
0
);
if
(
audio_buf_size
<
0
)
...
...
@@ -1345,77 +1344,88 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost,
{
uint8_t
*
buftmp
;
int
size_out
,
frame_bytes
,
resample_changed
;
int
size_out
,
frame_bytes
,
resample_changed
,
ret
;
AVCodecContext
*
enc
=
ost
->
st
->
codec
;
AVCodecContext
*
dec
=
ist
->
st
->
codec
;
int
osize
=
av_get_bytes_per_sample
(
enc
->
sample_fmt
);
int
isize
=
av_get_bytes_per_sample
(
dec
->
sample_fmt
);
uint8_t
*
buf
=
decoded_frame
->
data
[
0
];
int
size
=
decoded_frame
->
nb_samples
*
dec
->
channels
*
isize
;
int
out_linesize
=
0
;
int
buf_linesize
=
decoded_frame
->
linesize
[
0
];
get_default_channel_layouts
(
ost
,
ist
);
if
(
alloc_audio_output_buf
(
dec
,
enc
,
decoded_frame
->
nb_samples
)
<
0
)
{
if
(
alloc_audio_output_buf
(
dec
,
enc
,
decoded_frame
->
nb_samples
,
&
out_linesize
)
<
0
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Error allocating audio buffer
\n
"
);
exit_program
(
1
);
}
if
(
enc
->
channels
!=
dec
->
channels
||
enc
->
sample_rate
!=
dec
->
sample_rate
)
if
(
audio_sync_method
>
1
||
enc
->
channels
!=
dec
->
channels
||
enc
->
channel_layout
!=
dec
->
channel_layout
||
enc
->
sample_rate
!=
dec
->
sample_rate
||
dec
->
sample_fmt
!=
enc
->
sample_fmt
)
ost
->
audio_resample
=
1
;
resample_changed
=
ost
->
resample_sample_fmt
!=
dec
->
sample_fmt
||
ost
->
resample_channels
!=
dec
->
channels
||
ost
->
resample_channel_layout
!=
dec
->
channel_layout
||
ost
->
resample_sample_rate
!=
dec
->
sample_rate
;
if
((
ost
->
audio_resample
&&
!
ost
->
resample
)
||
resample_changed
)
{
if
((
ost
->
audio_resample
&&
!
ost
->
avr
)
||
resample_changed
)
{
if
(
resample_changed
)
{
av_log
(
NULL
,
AV_LOG_INFO
,
"Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d
to rate:%d fmt:%s ch:%d
\n
"
,
av_log
(
NULL
,
AV_LOG_INFO
,
"Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d
chl:0x%"
PRIx64
" to rate:%d fmt:%s ch:%d chl:0x%"
PRIx64
"
\n
"
,
ist
->
file_index
,
ist
->
st
->
index
,
ost
->
resample_sample_rate
,
av_get_sample_fmt_name
(
ost
->
resample_sample_fmt
),
ost
->
resample_channels
,
dec
->
sample_rate
,
av_get_sample_fmt_name
(
dec
->
sample_fmt
),
dec
->
channels
);
ost
->
resample_sample_rate
,
av_get_sample_fmt_name
(
ost
->
resample_sample_fmt
),
ost
->
resample_channels
,
ost
->
resample_channel_layout
,
dec
->
sample_rate
,
av_get_sample_fmt_name
(
dec
->
sample_fmt
),
dec
->
channels
,
dec
->
channel_layout
);
ost
->
resample_sample_fmt
=
dec
->
sample_fmt
;
ost
->
resample_channels
=
dec
->
channels
;
ost
->
resample_channel_layout
=
dec
->
channel_layout
;
ost
->
resample_sample_rate
=
dec
->
sample_rate
;
if
(
ost
->
resample
)
a
udio_resample_close
(
ost
->
resample
);
if
(
ost
->
avr
)
a
vresample_close
(
ost
->
avr
);
}
/* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
if
(
audio_sync_method
<=
1
&&
ost
->
resample_sample_fmt
==
enc
->
sample_fmt
&&
ost
->
resample_channels
==
enc
->
channels
&&
ost
->
resample_channel_layout
==
enc
->
channel_layout
&&
ost
->
resample_sample_rate
==
enc
->
sample_rate
)
{
ost
->
resample
=
NULL
;
ost
->
audio_resample
=
0
;
}
else
if
(
ost
->
audio_resample
)
{
if
(
dec
->
sample_fmt
!=
AV_SAMPLE_FMT_S16
)
av_log
(
NULL
,
AV_LOG_WARNING
,
"Using s16 intermediate sample format for resampling
\n
"
);
ost
->
resample
=
av_audio_resample_init
(
enc
->
channels
,
dec
->
channels
,
enc
->
sample_rate
,
dec
->
sample_rate
,
enc
->
sample_fmt
,
dec
->
sample_fmt
,
16
,
10
,
0
,
0
.
8
);
if
(
!
ost
->
resample
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Can not resample %d channels @ %d Hz to %d channels @ %d Hz
\n
"
,
dec
->
channels
,
dec
->
sample_rate
,
enc
->
channels
,
enc
->
sample_rate
);
exit_program
(
1
);
if
(
!
ost
->
avr
)
{
ost
->
avr
=
avresample_alloc_context
();
if
(
!
ost
->
avr
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Error allocating context for libavresample
\n
"
);
exit_program
(
1
);
}
}
}
}
#define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
if
(
!
ost
->
audio_resample
&&
dec
->
sample_fmt
!=
enc
->
sample_fmt
&&
MAKE_SFMT_PAIR
(
enc
->
sample_fmt
,
dec
->
sample_fmt
)
!=
ost
->
reformat_pair
)
{
if
(
ost
->
reformat_ctx
)
av_audio_convert_free
(
ost
->
reformat_ctx
);
ost
->
reformat_ctx
=
av_audio_convert_alloc
(
enc
->
sample_fmt
,
1
,
dec
->
sample_fmt
,
1
,
NULL
,
0
);
if
(
!
ost
->
reformat_ctx
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Cannot convert %s sample format to %s sample format
\n
"
,
av_get_sample_fmt_name
(
dec
->
sample_fmt
),
av_get_sample_fmt_name
(
enc
->
sample_fmt
));
exit_program
(
1
);
av_opt_set_int
(
ost
->
avr
,
"in_channel_layout"
,
dec
->
channel_layout
,
0
);
av_opt_set_int
(
ost
->
avr
,
"in_sample_fmt"
,
dec
->
sample_fmt
,
0
);
av_opt_set_int
(
ost
->
avr
,
"in_sample_rate"
,
dec
->
sample_rate
,
0
);
av_opt_set_int
(
ost
->
avr
,
"out_channel_layout"
,
enc
->
channel_layout
,
0
);
av_opt_set_int
(
ost
->
avr
,
"out_sample_fmt"
,
enc
->
sample_fmt
,
0
);
av_opt_set_int
(
ost
->
avr
,
"out_sample_rate"
,
enc
->
sample_rate
,
0
);
if
(
audio_sync_method
>
1
)
av_opt_set_int
(
ost
->
avr
,
"force_resampling"
,
1
,
0
);
/* if both the input and output formats are s16 or u8, use s16 as
the internal sample format */
if
(
av_get_bytes_per_sample
(
dec
->
sample_fmt
)
<=
2
&&
av_get_bytes_per_sample
(
enc
->
sample_fmt
)
<=
2
)
{
av_opt_set_int
(
ost
->
avr
,
"internal_sample_fmt"
,
AV_SAMPLE_FMT_S16P
,
0
);
}
ret
=
avresample_open
(
ost
->
avr
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Error opening libavresample
\n
"
);
exit_program
(
1
);
}
}
ost
->
reformat_pair
=
MAKE_SFMT_PAIR
(
enc
->
sample_fmt
,
dec
->
sample_fmt
);
}
if
(
audio_sync_method
>
0
)
{
...
...
@@ -1444,7 +1454,7 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost,
exit_program
(
1
);
}
if
(
alloc_audio_output_buf
(
dec
,
enc
,
decoded_frame
->
nb_samples
+
idelta
)
<
0
)
{
if
(
alloc_audio_output_buf
(
dec
,
enc
,
decoded_frame
->
nb_samples
+
idelta
,
&
out_linesize
)
<
0
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Error allocating audio buffer
\n
"
);
exit_program
(
1
);
}
...
...
@@ -1454,15 +1464,15 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost,
memcpy
(
async_buf
+
byte_delta
,
buf
,
size
);
buf
=
async_buf
;
size
+=
byte_delta
;
buf_linesize
=
allocated_async_buf_size
;
av_log
(
NULL
,
AV_LOG_VERBOSE
,
"adding %d audio samples of silence
\n
"
,
idelta
);
}
}
else
if
(
audio_sync_method
>
1
)
{
int
comp
=
av_clip
(
delta
,
-
audio_sync_method
,
audio_sync_method
);
av_assert0
(
ost
->
audio_resample
);
av_log
(
NULL
,
AV_LOG_VERBOSE
,
"compensating audio timestamp drift:%f compensation:%d in:%d
\n
"
,
delta
,
comp
,
enc
->
sample_rate
);
// fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2));
av
_resample_compensate
(
*
(
struct
AVResampleContext
**
)
ost
->
resample
,
comp
,
enc
->
sample_rate
);
av
resample_set_compensation
(
ost
->
avr
,
comp
,
enc
->
sample_rate
);
}
}
}
else
if
(
audio_sync_method
==
0
)
...
...
@@ -1471,31 +1481,16 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost,
if
(
ost
->
audio_resample
)
{
buftmp
=
audio_buf
;
size_out
=
audio_resample
(
ost
->
resample
,
(
short
*
)
buftmp
,
(
short
*
)
buf
,
size
/
(
dec
->
channels
*
isize
));
size_out
=
avresample_convert
(
ost
->
avr
,
(
void
**
)
&
buftmp
,
allocated_audio_buf_size
,
out_linesize
,
(
void
**
)
&
buf
,
buf_linesize
,
size
/
(
dec
->
channels
*
isize
));
size_out
=
size_out
*
enc
->
channels
*
osize
;
}
else
{
buftmp
=
buf
;
size_out
=
size
;
}
if
(
!
ost
->
audio_resample
&&
dec
->
sample_fmt
!=
enc
->
sample_fmt
)
{
const
void
*
ibuf
[
6
]
=
{
buftmp
};
void
*
obuf
[
6
]
=
{
audio_buf
};
int
istride
[
6
]
=
{
isize
};
int
ostride
[
6
]
=
{
osize
};
int
len
=
size_out
/
istride
[
0
];
if
(
av_audio_convert
(
ost
->
reformat_ctx
,
obuf
,
ostride
,
ibuf
,
istride
,
len
)
<
0
)
{
printf
(
"av_audio_convert() failed
\n
"
);
if
(
exit_on_error
)
exit_program
(
1
);
return
;
}
buftmp
=
audio_buf
;
size_out
=
len
*
osize
;
}
/* now encode as many frames as possible */
if
(
!
(
enc
->
codec
->
capabilities
&
CODEC_CAP_VARIABLE_FRAME_SIZE
))
{
/* output resampled raw samples */
...
...
@@ -2709,7 +2704,6 @@ static int transcode_init(void)
if
(
!
ost
->
fifo
)
{
return
AVERROR
(
ENOMEM
);
}
ost
->
reformat_pair
=
MAKE_SFMT_PAIR
(
AV_SAMPLE_FMT_NONE
,
AV_SAMPLE_FMT_NONE
);
if
(
!
codec
->
sample_rate
)
codec
->
sample_rate
=
icodec
->
sample_rate
;
...
...
@@ -2722,15 +2716,16 @@ static int transcode_init(void)
if
(
!
codec
->
channels
)
codec
->
channels
=
icodec
->
channels
;
codec
->
channel_layout
=
icodec
->
channel_layout
;
if
(
!
codec
->
channel_layout
)
codec
->
channel_layout
=
icodec
->
channel_layout
;
if
(
av_get_channel_layout_nb_channels
(
codec
->
channel_layout
)
!=
codec
->
channels
)
codec
->
channel_layout
=
0
;
ost
->
audio_resample
=
codec
->
sample_rate
!=
icodec
->
sample_rate
||
audio_sync_method
>
1
;
icodec
->
request_channels
=
codec
->
channels
;
ost
->
resample_sample_fmt
=
icodec
->
sample_fmt
;
ost
->
resample_sample_rate
=
icodec
->
sample_rate
;
ost
->
resample_channels
=
icodec
->
channels
;
ost
->
resample_channel_layout
=
icodec
->
channel_layout
;
break
;
case
AVMEDIA_TYPE_VIDEO
:
if
(
!
ost
->
filter
)
{
...
...
@@ -3202,10 +3197,8 @@ static int transcode(void)
initialized but set to zero */
av_freep
(
&
ost
->
st
->
codec
->
subtitle_header
);
av_free
(
ost
->
forced_kf_pts
);
if
(
ost
->
resample
)
audio_resample_close
(
ost
->
resample
);
if
(
ost
->
reformat_ctx
)
av_audio_convert_free
(
ost
->
reformat_ctx
);
if
(
ost
->
avr
)
avresample_free
(
&
ost
->
avr
);
av_dict_free
(
&
ost
->
opts
);
}
}
...
...
cmdutils.c
View file @
bcb82fe1
...
...
@@ -32,6 +32,7 @@
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
#include "libavdevice/avdevice.h"
#include "libavresample/avresample.h"
#include "libswscale/swscale.h"
#include "libavutil/avstring.h"
#include "libavutil/mathematics.h"
...
...
@@ -460,7 +461,8 @@ static int warned_cfg = 0;
const char *indent = flags & INDENT? " " : ""; \
if (flags & SHOW_VERSION) { \
unsigned int version = libname##_version(); \
av_log(NULL, level, "%slib%-9s %2d.%3d.%2d / %2d.%3d.%2d\n",\
av_log(NULL, level, \
"%slib%-10s %2d.%3d.%2d / %2d.%3d.%2d\n", \
indent, #libname, \
LIB##LIBNAME##_VERSION_MAJOR, \
LIB##LIBNAME##_VERSION_MINOR, \
...
...
@@ -489,6 +491,7 @@ static void print_all_libs_info(int flags, int level)
PRINT_LIB_INFO
(
avformat
,
AVFORMAT
,
flags
,
level
);
PRINT_LIB_INFO
(
avdevice
,
AVDEVICE
,
flags
,
level
);
PRINT_LIB_INFO
(
avfilter
,
AVFILTER
,
flags
,
level
);
PRINT_LIB_INFO
(
avresample
,
AVRESAMPLE
,
flags
,
level
);
PRINT_LIB_INFO
(
swscale
,
SWSCALE
,
flags
,
level
);
}
...
...
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