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
65cff814
Commit
65cff814
authored
Feb 24, 2016
by
Rodger Combs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc: add AudioToolbox encoders
Fixes trac #4828
parent
d5d32805
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
493 additions
and
6 deletions
+493
-6
Changelog
Changelog
+1
-0
configure
configure
+10
-0
Makefile
libavcodec/Makefile
+5
-0
allcodecs.c
libavcodec/allcodecs.c
+5
-5
audiotoolboxenc.c
libavcodec/audiotoolboxenc.c
+471
-0
version.h
libavcodec/version.h
+1
-1
No files found.
Changelog
View file @
65cff814
...
@@ -14,6 +14,7 @@ version <next>:
...
@@ -14,6 +14,7 @@ version <next>:
- MediaCodec H264 decoding
- MediaCodec H264 decoding
- VC-2 HQ RTP payload format (draft v1) depacketizer
- VC-2 HQ RTP payload format (draft v1) depacketizer
- AudioToolbox audio decoders
- AudioToolbox audio decoders
- AudioToolbox audio encoders
version 3.0:
version 3.0:
...
...
configure
View file @
65cff814
...
@@ -2661,6 +2661,16 @@ pcm_alaw_at_decoder_deps="audiotoolbox"
...
@@ -2661,6 +2661,16 @@ pcm_alaw_at_decoder_deps="audiotoolbox"
pcm_mulaw_at_decoder_deps
=
"audiotoolbox"
pcm_mulaw_at_decoder_deps
=
"audiotoolbox"
qdmc_at_decoder_deps
=
"audiotoolbox"
qdmc_at_decoder_deps
=
"audiotoolbox"
qdm2_at_decoder_deps
=
"audiotoolbox"
qdm2_at_decoder_deps
=
"audiotoolbox"
aac_at_encoder_deps
=
"audiotoolbox"
aac_at_encoder_select
=
"audio_frame_queue"
alac_at_encoder_deps
=
"audiotoolbox"
alac_at_encoder_select
=
"audio_frame_queue"
ilbc_at_encoder_deps
=
"audiotoolbox"
ilbc_at_encoder_select
=
"audio_frame_queue"
pcm_alaw_at_encoder_deps
=
"audiotoolbox"
pcm_alaw_at_encoder_select
=
"audio_frame_queue"
pcm_mulaw_at_encoder_deps
=
"audiotoolbox"
pcm_mulaw_at_encoder_select
=
"audio_frame_queue"
chromaprint_muxer_deps
=
"chromaprint"
chromaprint_muxer_deps
=
"chromaprint"
h264_videotoolbox_encoder_deps
=
"videotoolbox_encoder pthreads"
h264_videotoolbox_encoder_deps
=
"videotoolbox_encoder pthreads"
libcelt_decoder_deps
=
"libcelt"
libcelt_decoder_deps
=
"libcelt"
...
...
libavcodec/Makefile
View file @
65cff814
...
@@ -815,6 +815,11 @@ OBJS-$(CONFIG_PCM_MULAW_AT_DECODER) += audiotoolboxdec.o
...
@@ -815,6 +815,11 @@ OBJS-$(CONFIG_PCM_MULAW_AT_DECODER) += audiotoolboxdec.o
OBJS-$(CONFIG_PCM_ALAW_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_PCM_ALAW_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_QDMC_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_QDMC_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_QDM2_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_QDM2_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_AAC_AT_ENCODER)
+=
audiotoolboxenc.o
OBJS-$(CONFIG_ALAC_AT_ENCODER)
+=
audiotoolboxenc.o
OBJS-$(CONFIG_ILBC_AT_ENCODER)
+=
audiotoolboxenc.o
OBJS-$(CONFIG_PCM_ALAW_AT_ENCODER)
+=
audiotoolboxenc.o
OBJS-$(CONFIG_PCM_MULAW_AT_ENCODER)
+=
audiotoolboxenc.o
OBJS-$(CONFIG_LIBCELT_DECODER)
+=
libcelt_dec.o
OBJS-$(CONFIG_LIBCELT_DECODER)
+=
libcelt_dec.o
OBJS-$(CONFIG_LIBDCADEC_DECODER)
+=
libdcadec.o
dca.o
OBJS-$(CONFIG_LIBDCADEC_DECODER)
+=
libdcadec.o
dca.o
OBJS-$(CONFIG_LIBFAAC_ENCODER)
+=
libfaac.o
OBJS-$(CONFIG_LIBFAAC_ENCODER)
+=
libfaac.o
...
...
libavcodec/allcodecs.c
View file @
65cff814
...
@@ -563,18 +563,18 @@ void avcodec_register_all(void)
...
@@ -563,18 +563,18 @@ void avcodec_register_all(void)
REGISTER_ENCDEC
(
XSUB
,
xsub
);
REGISTER_ENCDEC
(
XSUB
,
xsub
);
/* external libraries */
/* external libraries */
REGISTER_
DECODER
(
AAC_AT
,
aac_at
);
REGISTER_
ENCDEC
(
AAC_AT
,
aac_at
);
REGISTER_DECODER
(
AC3_AT
,
ac3_at
);
REGISTER_DECODER
(
AC3_AT
,
ac3_at
);
REGISTER_DECODER
(
ADPCM_IMA_QT_AT
,
adpcm_ima_qt_at
);
REGISTER_DECODER
(
ADPCM_IMA_QT_AT
,
adpcm_ima_qt_at
);
REGISTER_
DECODER
(
ALAC_AT
,
alac_at
);
REGISTER_
ENCDEC
(
ALAC_AT
,
alac_at
);
REGISTER_DECODER
(
AMR_NB_AT
,
amr_nb_at
);
REGISTER_DECODER
(
AMR_NB_AT
,
amr_nb_at
);
REGISTER_DECODER
(
GSM_MS_AT
,
gsm_ms_at
);
REGISTER_DECODER
(
GSM_MS_AT
,
gsm_ms_at
);
REGISTER_
DECODER
(
ILBC_AT
,
ilbc_at
);
REGISTER_
ENCDEC
(
ILBC_AT
,
ilbc_at
);
REGISTER_DECODER
(
MP1_AT
,
mp1_at
);
REGISTER_DECODER
(
MP1_AT
,
mp1_at
);
REGISTER_DECODER
(
MP2_AT
,
mp2_at
);
REGISTER_DECODER
(
MP2_AT
,
mp2_at
);
REGISTER_DECODER
(
MP3_AT
,
mp3_at
);
REGISTER_DECODER
(
MP3_AT
,
mp3_at
);
REGISTER_
DECODER
(
PCM_ALAW_AT
,
pcm_alaw_at
);
REGISTER_
ENCDEC
(
PCM_ALAW_AT
,
pcm_alaw_at
);
REGISTER_
DECODER
(
PCM_MULAW_AT
,
pcm_mulaw_at
);
REGISTER_
ENCDEC
(
PCM_MULAW_AT
,
pcm_mulaw_at
);
REGISTER_DECODER
(
QDMC_AT
,
qdmc_at
);
REGISTER_DECODER
(
QDMC_AT
,
qdmc_at
);
REGISTER_DECODER
(
QDM2_AT
,
qdm2_at
);
REGISTER_DECODER
(
QDM2_AT
,
qdm2_at
);
REGISTER_DECODER
(
LIBCELT
,
libcelt
);
REGISTER_DECODER
(
LIBCELT
,
libcelt
);
...
...
libavcodec/audiotoolboxenc.c
0 → 100644
View file @
65cff814
/*
* Audio Toolbox system codecs
*
* copyright (c) 2016 Rodger Combs
*
* 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
*/
#include <AudioToolbox/AudioToolbox.h>
#include "config.h"
#include "audio_frame_queue.h"
#include "avcodec.h"
#include "bytestream.h"
#include "internal.h"
#include "libavformat/isom.h"
#include "libavutil/avassert.h"
#include "libavutil/opt.h"
#include "libavutil/log.h"
typedef
struct
ATDecodeContext
{
AVClass
*
av_class
;
int
mode
;
int
quality
;
AudioConverterRef
converter
;
AudioStreamPacketDescription
pkt_desc
;
AVFrame
in_frame
;
AVFrame
new_in_frame
;
unsigned
pkt_size
;
AudioFrameQueue
afq
;
int
eof
;
int
frame_size
;
}
ATDecodeContext
;
static
UInt32
ffat_get_format_id
(
enum
AVCodecID
codec
,
int
profile
)
{
switch
(
codec
)
{
case
AV_CODEC_ID_AAC
:
switch
(
profile
)
{
case
FF_PROFILE_AAC_LOW
:
default:
return
kAudioFormatMPEG4AAC
;
case
FF_PROFILE_AAC_HE
:
return
kAudioFormatMPEG4AAC_HE
;
case
FF_PROFILE_AAC_HE_V2
:
return
kAudioFormatMPEG4AAC_HE_V2
;
case
FF_PROFILE_AAC_LD
:
return
kAudioFormatMPEG4AAC_LD
;
case
FF_PROFILE_AAC_ELD
:
return
kAudioFormatMPEG4AAC_ELD
;
}
case
AV_CODEC_ID_ADPCM_IMA_QT
:
return
kAudioFormatAppleIMA4
;
case
AV_CODEC_ID_ALAC
:
return
kAudioFormatAppleLossless
;
case
AV_CODEC_ID_ILBC
:
return
kAudioFormatiLBC
;
case
AV_CODEC_ID_PCM_ALAW
:
return
kAudioFormatALaw
;
case
AV_CODEC_ID_PCM_MULAW
:
return
kAudioFormatULaw
;
default:
av_assert0
(
!
"Invalid codec ID!"
);
return
0
;
}
}
static
void
ffat_update_ctx
(
AVCodecContext
*
avctx
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
UInt32
size
=
sizeof
(
unsigned
);
AudioConverterPrimeInfo
prime_info
;
AudioStreamBasicDescription
out_format
;
AudioConverterGetProperty
(
at
->
converter
,
kAudioConverterPropertyMaximumOutputPacketSize
,
&
size
,
&
at
->
pkt_size
);
if
(
at
->
pkt_size
<=
0
)
at
->
pkt_size
=
1024
*
50
;
size
=
sizeof
(
prime_info
);
if
(
!
AudioConverterGetProperty
(
at
->
converter
,
kAudioConverterPrimeInfo
,
&
size
,
&
prime_info
))
{
avctx
->
initial_padding
=
prime_info
.
leadingFrames
;
}
size
=
sizeof
(
out_format
);
if
(
!
AudioConverterGetProperty
(
at
->
converter
,
kAudioConverterCurrentOutputStreamDescription
,
&
size
,
&
out_format
))
{
if
(
out_format
.
mFramesPerPacket
)
avctx
->
frame_size
=
out_format
.
mFramesPerPacket
;
if
(
out_format
.
mBytesPerPacket
&&
avctx
->
codec_id
==
AV_CODEC_ID_ILBC
)
avctx
->
block_align
=
out_format
.
mBytesPerPacket
;
}
at
->
frame_size
=
avctx
->
frame_size
;
if
(
avctx
->
codec_id
==
AV_CODEC_ID_PCM_MULAW
||
avctx
->
codec_id
==
AV_CODEC_ID_PCM_ALAW
)
{
at
->
pkt_size
*=
1024
;
avctx
->
frame_size
*=
1024
;
}
}
static
int
read_descr
(
GetByteContext
*
gb
,
int
*
tag
)
{
int
len
=
0
;
int
count
=
4
;
*
tag
=
bytestream2_get_byte
(
gb
);
while
(
count
--
)
{
int
c
=
bytestream2_get_byte
(
gb
);
len
=
(
len
<<
7
)
|
(
c
&
0x7f
);
if
(
!
(
c
&
0x80
))
break
;
}
return
len
;
}
static
int
get_ilbc_mode
(
AVCodecContext
*
avctx
)
{
if
(
avctx
->
block_align
==
38
)
return
20
;
else
if
(
avctx
->
block_align
==
50
)
return
30
;
else
if
(
avctx
->
bit_rate
>
0
)
return
avctx
->
bit_rate
<=
14000
?
30
:
20
;
else
return
30
;
}
static
av_cold
int
ffat_init_encoder
(
AVCodecContext
*
avctx
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
OSStatus
status
;
AudioStreamBasicDescription
in_format
=
{
.
mSampleRate
=
avctx
->
sample_rate
,
.
mFormatID
=
kAudioFormatLinearPCM
,
.
mFormatFlags
=
((
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_FLT
||
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_DBL
)
?
kAudioFormatFlagIsFloat
:
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_U8
?
0
:
kAudioFormatFlagIsSignedInteger
)
|
kAudioFormatFlagIsPacked
,
.
mBytesPerPacket
=
av_get_bytes_per_sample
(
avctx
->
sample_fmt
)
*
avctx
->
channels
,
.
mFramesPerPacket
=
1
,
.
mBytesPerFrame
=
av_get_bytes_per_sample
(
avctx
->
sample_fmt
)
*
avctx
->
channels
,
.
mChannelsPerFrame
=
avctx
->
channels
,
.
mBitsPerChannel
=
av_get_bytes_per_sample
(
avctx
->
sample_fmt
)
*
8
,
};
AudioStreamBasicDescription
out_format
=
{
.
mSampleRate
=
avctx
->
sample_rate
,
.
mFormatID
=
ffat_get_format_id
(
avctx
->
codec_id
,
avctx
->
profile
),
.
mChannelsPerFrame
=
in_format
.
mChannelsPerFrame
,
};
AudioChannelLayout
channel_layout
=
{
.
mChannelLayoutTag
=
kAudioChannelLayoutTag_UseChannelBitmap
,
.
mChannelBitmap
=
avctx
->
channel_layout
,
};
UInt32
size
=
sizeof
(
channel_layout
);
if
(
avctx
->
codec_id
==
AV_CODEC_ID_ILBC
)
{
int
mode
=
get_ilbc_mode
(
avctx
);
out_format
.
mFramesPerPacket
=
8000
*
mode
/
1000
;
out_format
.
mBytesPerPacket
=
(
mode
==
20
?
38
:
50
);
}
status
=
AudioConverterNew
(
&
in_format
,
&
out_format
,
&
at
->
converter
);
if
(
status
!=
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"AudioToolbox init error: %i
\n
"
,
(
int
)
status
);
return
AVERROR_UNKNOWN
;
}
size
=
sizeof
(
UInt32
);
AudioConverterSetProperty
(
at
->
converter
,
kAudioConverterInputChannelLayout
,
size
,
&
channel_layout
);
AudioConverterSetProperty
(
at
->
converter
,
kAudioConverterOutputChannelLayout
,
size
,
&
channel_layout
);
if
(
avctx
->
bits_per_raw_sample
)
{
size
=
sizeof
(
avctx
->
bits_per_raw_sample
);
AudioConverterSetProperty
(
at
->
converter
,
kAudioConverterPropertyBitDepthHint
,
size
,
&
avctx
->
bits_per_raw_sample
);
}
if
(
at
->
mode
==
-
1
)
at
->
mode
=
(
avctx
->
flags
&
AV_CODEC_FLAG_QSCALE
)
?
kAudioCodecBitRateControlMode_Variable
:
kAudioCodecBitRateControlMode_Constant
;
AudioConverterSetProperty
(
at
->
converter
,
kAudioCodecPropertyBitRateControlMode
,
size
,
&
at
->
mode
);
if
(
at
->
mode
==
kAudioCodecBitRateControlMode_Variable
)
{
int
q
=
avctx
->
global_quality
/
FF_QP2LAMBDA
;
if
(
q
<
0
||
q
>
14
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"VBR quality %d out of range, should be 0-14
\n
"
,
q
);
q
=
av_clip
(
q
,
0
,
14
);
}
q
=
127
-
q
*
9
;
AudioConverterSetProperty
(
at
->
converter
,
kAudioCodecPropertySoundQualityForVBR
,
size
,
&
q
);
}
else
if
(
avctx
->
bit_rate
>
0
)
{
UInt32
rate
=
avctx
->
bit_rate
;
AudioConverterSetProperty
(
at
->
converter
,
kAudioConverterEncodeBitRate
,
size
,
&
rate
);
}
at
->
quality
=
96
-
at
->
quality
*
32
;
AudioConverterSetProperty
(
at
->
converter
,
kAudioConverterCodecQuality
,
size
,
&
at
->
quality
);
if
(
!
AudioConverterGetPropertyInfo
(
at
->
converter
,
kAudioConverterCompressionMagicCookie
,
&
avctx
->
extradata_size
,
NULL
)
&&
avctx
->
extradata_size
)
{
int
extradata_size
=
avctx
->
extradata_size
;
uint8_t
*
extradata
;
if
(
!
(
avctx
->
extradata
=
av_mallocz
(
avctx
->
extradata_size
+
AV_INPUT_BUFFER_PADDING_SIZE
)))
return
AVERROR
(
ENOMEM
);
if
(
avctx
->
codec_id
==
AV_CODEC_ID_ALAC
)
{
avctx
->
extradata_size
=
0x24
;
AV_WB32
(
avctx
->
extradata
,
0x24
);
AV_WB32
(
avctx
->
extradata
+
4
,
MKBETAG
(
'a'
,
'l'
,
'a'
,
'c'
));
extradata
=
avctx
->
extradata
+
12
;
avctx
->
extradata_size
=
0x24
;
}
else
{
extradata
=
avctx
->
extradata
;
}
status
=
AudioConverterGetProperty
(
at
->
converter
,
kAudioConverterCompressionMagicCookie
,
&
extradata_size
,
extradata
);
if
(
status
!=
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"AudioToolbox cookie error: %i
\n
"
,
(
int
)
status
);
return
AVERROR_UNKNOWN
;
}
else
if
(
avctx
->
codec_id
==
AV_CODEC_ID_AAC
)
{
GetByteContext
gb
;
int
tag
,
len
;
bytestream2_init
(
&
gb
,
extradata
,
extradata_size
);
do
{
len
=
read_descr
(
&
gb
,
&
tag
);
if
(
tag
==
MP4DecConfigDescrTag
)
{
bytestream2_skip
(
&
gb
,
13
);
len
=
read_descr
(
&
gb
,
&
tag
);
if
(
tag
==
MP4DecSpecificDescrTag
)
{
len
=
FFMIN
(
gb
.
buffer_end
-
gb
.
buffer
,
len
);
memmove
(
extradata
,
gb
.
buffer
,
len
);
avctx
->
extradata_size
=
len
;
break
;
}
}
else
if
(
tag
==
MP4ESDescrTag
)
{
int
flags
;
bytestream2_skip
(
&
gb
,
2
);
flags
=
bytestream2_get_byte
(
&
gb
);
if
(
flags
&
0x80
)
//streamDependenceFlag
bytestream2_skip
(
&
gb
,
2
);
if
(
flags
&
0x40
)
//URL_Flag
bytestream2_skip
(
&
gb
,
bytestream2_get_byte
(
&
gb
));
if
(
flags
&
0x20
)
//OCRstreamFlag
bytestream2_skip
(
&
gb
,
2
);
}
}
while
(
bytestream2_get_bytes_left
(
&
gb
));
}
else
if
(
avctx
->
codec_id
!=
AV_CODEC_ID_ALAC
)
{
avctx
->
extradata_size
=
extradata_size
;
}
}
ffat_update_ctx
(
avctx
);
if
(
at
->
mode
==
kAudioCodecBitRateControlMode_Variable
&&
avctx
->
rc_max_rate
)
{
int
max_size
=
avctx
->
rc_max_rate
*
avctx
->
frame_size
/
avctx
->
sample_rate
;
if
(
max_size
)
AudioConverterSetProperty
(
at
->
converter
,
kAudioCodecPropertyPacketSizeLimitForVBR
,
size
,
&
max_size
);
}
ff_af_queue_init
(
avctx
,
&
at
->
afq
);
return
0
;
}
static
OSStatus
ffat_encode_callback
(
AudioConverterRef
converter
,
UInt32
*
nb_packets
,
AudioBufferList
*
data
,
AudioStreamPacketDescription
**
packets
,
void
*
inctx
)
{
AVCodecContext
*
avctx
=
inctx
;
ATDecodeContext
*
at
=
avctx
->
priv_data
;
if
(
at
->
eof
)
{
*
nb_packets
=
0
;
if
(
packets
)
{
*
packets
=
&
at
->
pkt_desc
;
at
->
pkt_desc
.
mDataByteSize
=
0
;
}
return
0
;
}
av_frame_unref
(
&
at
->
in_frame
);
av_frame_move_ref
(
&
at
->
in_frame
,
&
at
->
new_in_frame
);
if
(
!
at
->
in_frame
.
data
[
0
])
{
*
nb_packets
=
0
;
return
1
;
}
data
->
mNumberBuffers
=
1
;
data
->
mBuffers
[
0
].
mNumberChannels
=
0
;
data
->
mBuffers
[
0
].
mDataByteSize
=
at
->
in_frame
.
nb_samples
*
av_get_bytes_per_sample
(
avctx
->
sample_fmt
)
*
avctx
->
channels
;
data
->
mBuffers
[
0
].
mData
=
at
->
in_frame
.
data
[
0
];
*
nb_packets
=
(
at
->
in_frame
.
nb_samples
+
(
at
->
frame_size
-
1
))
/
at
->
frame_size
;
if
(
packets
)
{
*
packets
=
&
at
->
pkt_desc
;
at
->
pkt_desc
.
mDataByteSize
=
data
->
mBuffers
[
0
].
mDataByteSize
;
at
->
pkt_desc
.
mVariableFramesInPacket
=
at
->
in_frame
.
nb_samples
;
}
return
0
;
}
static
int
ffat_encode
(
AVCodecContext
*
avctx
,
AVPacket
*
avpkt
,
const
AVFrame
*
frame
,
int
*
got_packet_ptr
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
OSStatus
ret
;
AudioBufferList
out_buffers
=
{
.
mNumberBuffers
=
1
,
.
mBuffers
=
{
{
.
mNumberChannels
=
avctx
->
channels
,
.
mDataByteSize
=
at
->
pkt_size
,
}
}
};
AudioStreamPacketDescription
out_pkt_desc
=
{
0
};
if
((
ret
=
ff_alloc_packet2
(
avctx
,
avpkt
,
at
->
pkt_size
,
0
))
<
0
)
return
ret
;
av_frame_unref
(
&
at
->
new_in_frame
);
if
(
frame
)
{
if
((
ret
=
ff_af_queue_add
(
&
at
->
afq
,
frame
))
<
0
)
return
ret
;
if
((
ret
=
av_frame_ref
(
&
at
->
new_in_frame
,
frame
))
<
0
)
return
ret
;
}
else
{
at
->
eof
=
1
;
}
out_buffers
.
mBuffers
[
0
].
mData
=
avpkt
->
data
;
*
got_packet_ptr
=
avctx
->
frame_size
/
at
->
frame_size
;
ret
=
AudioConverterFillComplexBuffer
(
at
->
converter
,
ffat_encode_callback
,
avctx
,
got_packet_ptr
,
&
out_buffers
,
(
avctx
->
frame_size
>
at
->
frame_size
)
?
NULL
:
&
out_pkt_desc
);
if
((
!
ret
||
ret
==
1
)
&&
*
got_packet_ptr
)
{
avpkt
->
size
=
out_buffers
.
mBuffers
[
0
].
mDataByteSize
;
ff_af_queue_remove
(
&
at
->
afq
,
out_pkt_desc
.
mVariableFramesInPacket
?
out_pkt_desc
.
mVariableFramesInPacket
:
avctx
->
frame_size
,
&
avpkt
->
pts
,
&
avpkt
->
duration
);
}
else
if
(
ret
&&
ret
!=
1
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"Encode error: %i
\n
"
,
ret
);
}
return
0
;
}
static
av_cold
void
ffat_encode_flush
(
AVCodecContext
*
avctx
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
AudioConverterReset
(
at
->
converter
);
av_frame_unref
(
&
at
->
new_in_frame
);
av_frame_unref
(
&
at
->
in_frame
);
}
static
av_cold
int
ffat_close_encoder
(
AVCodecContext
*
avctx
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
AudioConverterDispose
(
at
->
converter
);
av_frame_unref
(
&
at
->
new_in_frame
);
av_frame_unref
(
&
at
->
in_frame
);
ff_af_queue_close
(
&
at
->
afq
);
return
0
;
}
static
const
AVProfile
aac_profiles
[]
=
{
{
FF_PROFILE_AAC_LOW
,
"LC"
},
{
FF_PROFILE_AAC_HE
,
"HE-AAC"
},
{
FF_PROFILE_AAC_HE_V2
,
"HE-AACv2"
},
{
FF_PROFILE_AAC_LD
,
"LD"
},
{
FF_PROFILE_AAC_ELD
,
"ELD"
},
{
FF_PROFILE_UNKNOWN
},
};
#define AE AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static
const
AVOption
options
[]
=
{
{
"aac_at_mode"
,
"ratecontrol mode"
,
offsetof
(
ATDecodeContext
,
mode
),
AV_OPT_TYPE_INT
,
{.
i64
=
-
1
},
-
1
,
kAudioCodecBitRateControlMode_Variable
,
AE
,
"mode"
},
{
"auto"
,
"VBR if global quality is given; CBR otherwise"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
-
1
},
INT_MIN
,
INT_MAX
,
AE
,
"mode"
},
{
"cbr"
,
"constant bitrate"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
kAudioCodecBitRateControlMode_Constant
},
INT_MIN
,
INT_MAX
,
AE
,
"mode"
},
{
"abr"
,
"long-term average bitrate"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
kAudioCodecBitRateControlMode_LongTermAverage
},
INT_MIN
,
INT_MAX
,
AE
,
"mode"
},
{
"cvbr"
,
"constrained variable bitrate"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
kAudioCodecBitRateControlMode_VariableConstrained
},
INT_MIN
,
INT_MAX
,
AE
,
"mode"
},
{
"vbr"
,
"variable bitrate"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
kAudioCodecBitRateControlMode_Variable
},
INT_MIN
,
INT_MAX
,
AE
,
"mode"
},
{
"aac_at_quality"
,
"quality vs speed control"
,
offsetof
(
ATDecodeContext
,
quality
),
AV_OPT_TYPE_INT
,
{.
i64
=
0
},
0
,
2
,
AE
},
{
NULL
},
};
#define FFAT_ENC_CLASS(NAME) \
static const AVClass ffat_##NAME##_enc_class = { \
.class_name = "at_" #NAME "_enc", \
.item_name = av_default_item_name, \
.option = options, \
.version = LIBAVUTIL_VERSION_INT, \
};
#define FFAT_ENC(NAME, ID, PROFILES, ...) \
FFAT_ENC_CLASS(NAME) \
AVCodec ff_##NAME##_at_encoder = { \
.name = #NAME "_at", \
.long_name = NULL_IF_CONFIG_SMALL(#NAME " (AudioToolbox)"), \
.type = AVMEDIA_TYPE_AUDIO, \
.id = ID, \
.priv_data_size = sizeof(ATDecodeContext), \
.init = ffat_init_encoder, \
.close = ffat_close_encoder, \
.encode2 = ffat_encode, \
.flush = ffat_encode_flush, \
.priv_class = &ffat_##NAME##_enc_class, \
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY __VA_ARGS__, \
.sample_fmts = (const enum AVSampleFormat[]) { \
AV_SAMPLE_FMT_S16, \
AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_NONE \
}, \
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, \
.profiles = PROFILES, \
};
FFAT_ENC
(
aac
,
AV_CODEC_ID_AAC
,
aac_profiles
)
//FFAT_ENC(adpcm_ima_qt, AV_CODEC_ID_ADPCM_IMA_QT, NULL)
FFAT_ENC
(
alac
,
AV_CODEC_ID_ALAC
,
NULL
,
|
AV_CODEC_CAP_VARIABLE_FRAME_SIZE
|
AV_CODEC_CAP_LOSSLESS
)
FFAT_ENC
(
ilbc
,
AV_CODEC_ID_ILBC
,
NULL
)
FFAT_ENC
(
pcm_alaw
,
AV_CODEC_ID_PCM_ALAW
,
NULL
)
FFAT_ENC
(
pcm_mulaw
,
AV_CODEC_ID_PCM_MULAW
,
NULL
)
libavcodec/version.h
View file @
65cff814
...
@@ -28,7 +28,7 @@
...
@@ -28,7 +28,7 @@
#include "libavutil/version.h"
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 57
#define LIBAVCODEC_VERSION_MAJOR 57
#define LIBAVCODEC_VERSION_MINOR
29
#define LIBAVCODEC_VERSION_MINOR
30
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_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