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
d1241ff3
Commit
d1241ff3
authored
Nov 21, 2011
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avconv: use avcodec_decode_audio4() instead of avcodec_decode_audio3()
parent
6d23d197
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
26 additions
and
29 deletions
+26
-29
avconv.c
avconv.c
+26
-29
No files found.
avconv.c
View file @
d1241ff3
...
...
@@ -137,8 +137,6 @@ static uint8_t *audio_buf;
static
uint8_t
*
audio_out
;
static
unsigned
int
allocated_audio_out_size
,
allocated_audio_buf_size
;
static
void
*
samples
;
#define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
typedef
struct
InputStream
{
...
...
@@ -541,7 +539,6 @@ void exit_program(int ret)
av_free
(
audio_buf
);
av_free
(
audio_out
);
allocated_audio_buf_size
=
allocated_audio_out_size
=
0
;
av_free
(
samples
);
#if CONFIG_AVFILTER
avfilter_uninit
();
...
...
@@ -737,14 +734,11 @@ static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_
memset
(
buf
,
fill_char
,
size
);
}
static
void
do_audio_out
(
AVFormatContext
*
s
,
OutputStream
*
ost
,
InputStream
*
ist
,
unsigned
char
*
buf
,
int
size
)
static
void
do_audio_out
(
AVFormatContext
*
s
,
OutputStream
*
ost
,
InputStream
*
ist
,
AVFrame
*
decoded_frame
)
{
uint8_t
*
buftmp
;
int64_t
audio_out_size
,
audio_buf_size
;
int64_t
allocated_for_size
=
size
;
int
size_out
,
frame_bytes
,
ret
,
resample_changed
;
AVCodecContext
*
enc
=
ost
->
st
->
codec
;
...
...
@@ -752,6 +746,9 @@ static void do_audio_out(AVFormatContext *s,
int
osize
=
av_get_bytes_per_sample
(
enc
->
sample_fmt
);
int
isize
=
av_get_bytes_per_sample
(
dec
->
sample_fmt
);
const
int
coded_bps
=
av_get_bits_per_sample
(
enc
->
codec
->
id
);
uint8_t
*
buf
=
decoded_frame
->
data
[
0
];
int
size
=
decoded_frame
->
nb_samples
*
dec
->
channels
*
isize
;
int64_t
allocated_for_size
=
size
;
need_realloc
:
audio_buf_size
=
(
allocated_for_size
+
isize
*
dec
->
channels
-
1
)
/
(
isize
*
dec
->
channels
);
...
...
@@ -1620,39 +1617,40 @@ static void rate_emu_sleep(InputStream *ist)
static
int
transcode_audio
(
InputStream
*
ist
,
AVPacket
*
pkt
,
int
*
got_output
)
{
static
unsigned
int
samples_size
=
0
;
AVFrame
*
decoded_frame
;
AVCodecContext
*
avctx
=
ist
->
st
->
codec
;
int
bps
=
av_get_bytes_per_sample
(
ist
->
st
->
codec
->
sample_fmt
);
uint8_t
*
decoded_data_buf
=
NULL
;
int
decoded_data_size
=
0
;
int
i
,
ret
;
if
(
pkt
&&
samples_size
<
FFMAX
(
pkt
->
size
*
bps
,
AVCODEC_MAX_AUDIO_FRAME_SIZE
))
{
av_free
(
samples
);
samples_size
=
FFMAX
(
pkt
->
size
*
bps
,
AVCODEC_MAX_AUDIO_FRAME_SIZE
);
samples
=
av_malloc
(
samples_size
);
}
decoded_data_size
=
samples_size
;
if
(
!
(
decoded_frame
=
avcodec_alloc_frame
()))
return
AVERROR
(
ENOMEM
);
ret
=
avcodec_decode_audio
3
(
ist
->
st
->
codec
,
samples
,
&
decoded_data_size
,
pkt
);
if
(
ret
<
0
)
ret
=
avcodec_decode_audio
4
(
avctx
,
decoded_frame
,
got_output
,
pkt
);
if
(
ret
<
0
)
{
av_freep
(
&
decoded_frame
);
return
ret
;
*
got_output
=
decoded_data_size
>
0
;
}
/* Some bug in mpeg audio decoder gives */
/* decoded_data_size < 0, it seems they are overflows */
if
(
!*
got_output
)
{
/* no audio frame */
return
ret
;
}
decoded_data_buf
=
(
uint8_t
*
)
samples
;
ist
->
next_pts
+=
((
int64_t
)
AV_TIME_BASE
/
bps
*
decoded_data_size
)
/
(
ist
->
st
->
codec
->
sample_rate
*
ist
->
st
->
codec
->
channels
);
/* if the decoder provides a pts, use it instead of the last packet pts.
the decoder could be delaying output by a packet or more. */
if
(
decoded_frame
->
pts
!=
AV_NOPTS_VALUE
)
ist
->
next_pts
=
decoded_frame
->
pts
;
/* increment next_pts to use for the case where the input stream does not
have timestamps or there are multiple frames in the packet */
ist
->
next_pts
+=
((
int64_t
)
AV_TIME_BASE
*
decoded_frame
->
nb_samples
)
/
avctx
->
sample_rate
;
// preprocess audio (volume)
if
(
audio_volume
!=
256
)
{
switch
(
ist
->
st
->
codec
->
sample_fmt
)
{
int
decoded_data_size
=
decoded_frame
->
nb_samples
*
avctx
->
channels
*
bps
;
void
*
samples
=
decoded_frame
->
data
[
0
];
switch
(
avctx
->
sample_fmt
)
{
case
AV_SAMPLE_FMT_U8
:
{
uint8_t
*
volp
=
samples
;
...
...
@@ -1713,8 +1711,7 @@ static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
if
(
!
check_output_constraints
(
ist
,
ost
)
||
!
ost
->
encoding_needed
)
continue
;
do_audio_out
(
output_files
[
ost
->
file_index
].
ctx
,
ost
,
ist
,
decoded_data_buf
,
decoded_data_size
);
do_audio_out
(
output_files
[
ost
->
file_index
].
ctx
,
ost
,
ist
,
decoded_frame
);
}
return
ret
;
}
...
...
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