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
d5d32805
Commit
d5d32805
authored
Feb 19, 2016
by
Rodger Combs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc: add AudioToolbox decoders
Part of trac #4828
parent
db1a642c
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
389 additions
and
2 deletions
+389
-2
Changelog
Changelog
+1
-0
configure
configure
+24
-0
Makefile
libavcodec/Makefile
+14
-0
allcodecs.c
libavcodec/allcodecs.c
+14
-0
audiotoolboxdec.c
libavcodec/audiotoolboxdec.c
+334
-0
version.h
libavcodec/version.h
+2
-2
No files found.
Changelog
View file @
d5d32805
...
...
@@ -13,6 +13,7 @@ version <next>:
- protocol blacklisting API
- MediaCodec H264 decoding
- VC-2 HQ RTP payload format (draft v1) depacketizer
- AudioToolbox audio decoders
version 3.0:
...
...
configure
View file @
d5d32805
...
...
@@ -194,6 +194,7 @@ Individual component options:
--disable-filters disable all filters
External library support:
--disable-audiotoolbox enable AudioToolbox decoders and encoders [autodetect]
--enable-avisynth enable reading of AviSynth script files [no]
--disable-bzlib disable bzlib [autodetect]
--enable-cuda enable dynamically linked CUDA [no]
...
...
@@ -1446,6 +1447,7 @@ EXAMPLE_LIST="
"
EXTERNAL_LIBRARY_LIST
=
"
audiotoolbox
avisynth
bzlib
chromaprint
...
...
@@ -2506,6 +2508,10 @@ zlib_encoder_select="zlib"
zmbv_decoder_select
=
"zlib"
zmbv_encoder_select
=
"zlib"
# platform codecs
audiotoolbox_deps
=
"AudioToolbox_AudioToolbox_h"
audiotoolbox_extralibs
=
"-framework CoreFoundation -framework AudioToolbox -framework CoreMedia"
# hardware accelerators
crystalhd_deps
=
"libcrystalhd_libcrystalhd_if_h"
d3d11va_deps
=
"d3d11_h dxva_h ID3D11VideoDecoder ID3D11VideoContext"
...
...
@@ -2641,6 +2647,20 @@ vc1_parser_select="vc1dsp"
mjpeg2jpeg_bsf_select
=
"jpegtables"
# external libraries
aac_at_decoder_deps
=
"audiotoolbox"
ac3_at_decoder_deps
=
"audiotoolbox"
adpcm_ima_qt_at_decoder_deps
=
"audiotoolbox"
alac_at_decoder_deps
=
"audiotoolbox"
amr_nb_at_decoder_deps
=
"audiotoolbox"
gsm_ms_at_decoder_deps
=
"audiotoolbox"
ilbc_at_decoder_deps
=
"audiotoolbox"
mp1_at_decoder_deps
=
"audiotoolbox"
mp2_at_decoder_deps
=
"audiotoolbox"
mp3_at_decoder_deps
=
"audiotoolbox"
pcm_alaw_at_decoder_deps
=
"audiotoolbox"
pcm_mulaw_at_decoder_deps
=
"audiotoolbox"
qdmc_at_decoder_deps
=
"audiotoolbox"
qdm2_at_decoder_deps
=
"audiotoolbox"
chromaprint_muxer_deps
=
"chromaprint"
h264_videotoolbox_encoder_deps
=
"videotoolbox_encoder pthreads"
libcelt_decoder_deps
=
"libcelt"
...
...
@@ -3087,6 +3107,9 @@ enable valgrind_backtrace
sws_max_filter_size_default
=
256
set_default sws_max_filter_size
# Enable platform codecs by default.
enable
audiotoolbox
# Enable hwaccels by default.
enable
d3d11va dxva2 vaapi vda vdpau videotoolbox_hwaccel xvmc
enable
xlib
...
...
@@ -5365,6 +5388,7 @@ check_func_headers glob.h glob
enabled xlib
&&
check_func_headers
"X11/Xlib.h X11/extensions/Xvlib.h"
XvGetPortAttribute
-lXv
-lX11
-lXext
check_header AudioToolbox/AudioToolbox.h
check_header direct.h
check_header dirent.h
check_header dlfcn.h
...
...
libavcodec/Makefile
View file @
d5d32805
...
...
@@ -801,6 +801,20 @@ OBJS-$(CONFIG_WEBM_MUXER) += mpeg4audio.o mpegaudiodata.o \
OBJS-$(CONFIG_ELBG_FILTER)
+=
elbg.o
# external codec libraries
OBJS-$(CONFIG_AAC_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_AC3_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_ADPCM_IMA_QT_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_ALAC_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_AMR_NB_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_GSM_MS_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_ILBC_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_MP1_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_MP2_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_MP3_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_PCM_MULAW_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_PCM_ALAW_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_QDMC_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_QDM2_AT_DECODER)
+=
audiotoolboxdec.o
OBJS-$(CONFIG_LIBCELT_DECODER)
+=
libcelt_dec.o
OBJS-$(CONFIG_LIBDCADEC_DECODER)
+=
libdcadec.o
dca.o
OBJS-$(CONFIG_LIBFAAC_ENCODER)
+=
libfaac.o
...
...
libavcodec/allcodecs.c
View file @
d5d32805
...
...
@@ -563,6 +563,20 @@ void avcodec_register_all(void)
REGISTER_ENCDEC
(
XSUB
,
xsub
);
/* external libraries */
REGISTER_DECODER
(
AAC_AT
,
aac_at
);
REGISTER_DECODER
(
AC3_AT
,
ac3_at
);
REGISTER_DECODER
(
ADPCM_IMA_QT_AT
,
adpcm_ima_qt_at
);
REGISTER_DECODER
(
ALAC_AT
,
alac_at
);
REGISTER_DECODER
(
AMR_NB_AT
,
amr_nb_at
);
REGISTER_DECODER
(
GSM_MS_AT
,
gsm_ms_at
);
REGISTER_DECODER
(
ILBC_AT
,
ilbc_at
);
REGISTER_DECODER
(
MP1_AT
,
mp1_at
);
REGISTER_DECODER
(
MP2_AT
,
mp2_at
);
REGISTER_DECODER
(
MP3_AT
,
mp3_at
);
REGISTER_DECODER
(
PCM_ALAW_AT
,
pcm_alaw_at
);
REGISTER_DECODER
(
PCM_MULAW_AT
,
pcm_mulaw_at
);
REGISTER_DECODER
(
QDMC_AT
,
qdmc_at
);
REGISTER_DECODER
(
QDM2_AT
,
qdm2_at
);
REGISTER_DECODER
(
LIBCELT
,
libcelt
);
REGISTER_DECODER
(
LIBDCADEC
,
libdcadec
)
REGISTER_ENCODER
(
LIBFAAC
,
libfaac
);
...
...
libavcodec/audiotoolboxdec.c
0 → 100644
View file @
d5d32805
/*
* 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 "avcodec.h"
#include "bytestream.h"
#include "internal.h"
#include "libavutil/avassert.h"
#include "libavutil/opt.h"
#include "libavutil/log.h"
typedef
struct
ATDecodeContext
{
AVClass
*
av_class
;
AudioConverterRef
converter
;
AudioStreamPacketDescription
pkt_desc
;
AVPacket
in_pkt
;
AVPacket
new_in_pkt
;
unsigned
pkt_size
;
int64_t
last_pts
;
int
eof
;
}
ATDecodeContext
;
static
UInt32
ffat_get_format_id
(
enum
AVCodecID
codec
,
int
profile
)
{
switch
(
codec
)
{
case
AV_CODEC_ID_AAC
:
return
kAudioFormatMPEG4AAC
;
case
AV_CODEC_ID_AC3
:
return
kAudioFormatAC3
;
case
AV_CODEC_ID_ADPCM_IMA_QT
:
return
kAudioFormatAppleIMA4
;
case
AV_CODEC_ID_ALAC
:
return
kAudioFormatAppleLossless
;
case
AV_CODEC_ID_AMR_NB
:
return
kAudioFormatAMR
;
case
AV_CODEC_ID_GSM_MS
:
return
kAudioFormatMicrosoftGSM
;
case
AV_CODEC_ID_ILBC
:
return
kAudioFormatiLBC
;
case
AV_CODEC_ID_MP1
:
return
kAudioFormatMPEGLayer1
;
case
AV_CODEC_ID_MP2
:
return
kAudioFormatMPEGLayer2
;
case
AV_CODEC_ID_MP3
:
return
kAudioFormatMPEGLayer3
;
case
AV_CODEC_ID_PCM_ALAW
:
return
kAudioFormatALaw
;
case
AV_CODEC_ID_PCM_MULAW
:
return
kAudioFormatULaw
;
case
AV_CODEC_ID_QDMC
:
return
kAudioFormatQDesign
;
case
AV_CODEC_ID_QDM2
:
return
kAudioFormatQDesign2
;
default:
av_assert0
(
!
"Invalid codec ID!"
);
return
0
;
}
}
static
void
ffat_update_ctx
(
AVCodecContext
*
avctx
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
AudioStreamBasicDescription
in_format
;
UInt32
size
=
sizeof
(
in_format
);
if
(
!
AudioConverterGetProperty
(
at
->
converter
,
kAudioConverterCurrentInputStreamDescription
,
&
size
,
&
in_format
))
{
avctx
->
channels
=
in_format
.
mChannelsPerFrame
;
at
->
pkt_size
=
in_format
.
mFramesPerPacket
;
}
if
(
!
at
->
pkt_size
)
at
->
pkt_size
=
2048
;
}
static
void
put_descr
(
PutByteContext
*
pb
,
int
tag
,
unsigned
int
size
)
{
int
i
=
3
;
bytestream2_put_byte
(
pb
,
tag
);
for
(;
i
>
0
;
i
--
)
bytestream2_put_byte
(
pb
,
(
size
>>
(
7
*
i
))
|
0x80
);
bytestream2_put_byte
(
pb
,
size
&
0x7F
);
}
static
av_cold
int
ffat_init_decoder
(
AVCodecContext
*
avctx
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
OSStatus
status
;
enum
AVSampleFormat
sample_fmt
=
(
avctx
->
bits_per_raw_sample
==
32
)
?
AV_SAMPLE_FMT_S32
:
AV_SAMPLE_FMT_S16
;
AudioStreamBasicDescription
in_format
=
{
.
mSampleRate
=
avctx
->
sample_rate
?
avctx
->
sample_rate
:
44100
,
.
mFormatID
=
ffat_get_format_id
(
avctx
->
codec_id
,
avctx
->
profile
),
.
mBytesPerPacket
=
avctx
->
block_align
,
.
mChannelsPerFrame
=
avctx
->
channels
?
avctx
->
channels
:
1
,
};
AudioStreamBasicDescription
out_format
=
{
.
mSampleRate
=
in_format
.
mSampleRate
,
.
mFormatID
=
kAudioFormatLinearPCM
,
.
mFormatFlags
=
kAudioFormatFlagIsSignedInteger
|
kAudioFormatFlagIsPacked
,
.
mFramesPerPacket
=
1
,
.
mChannelsPerFrame
=
in_format
.
mChannelsPerFrame
,
.
mBitsPerChannel
=
av_get_bytes_per_sample
(
sample_fmt
)
*
8
,
};
avctx
->
sample_fmt
=
sample_fmt
;
if
(
avctx
->
codec_id
==
AV_CODEC_ID_ADPCM_IMA_QT
)
in_format
.
mFramesPerPacket
=
64
;
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
;
}
if
(
avctx
->
extradata_size
)
{
char
*
extradata
=
avctx
->
extradata
;
int
extradata_size
=
avctx
->
extradata_size
;
if
(
avctx
->
codec_id
==
AV_CODEC_ID_AAC
)
{
PutByteContext
pb
;
extradata_size
=
5
+
3
+
5
+
13
+
5
+
avctx
->
extradata_size
;
if
(
!
(
extradata
=
av_malloc
(
extradata_size
)))
return
AVERROR
(
ENOMEM
);
bytestream2_init_writer
(
&
pb
,
extradata
,
extradata_size
);
// ES descriptor
put_descr
(
&
pb
,
0x03
,
3
+
5
+
13
+
5
+
avctx
->
extradata_size
);
bytestream2_put_be16
(
&
pb
,
0
);
bytestream2_put_byte
(
&
pb
,
0x00
);
// flags (= no flags)
// DecoderConfig descriptor
put_descr
(
&
pb
,
0x04
,
13
+
5
+
avctx
->
extradata_size
);
// Object type indication
bytestream2_put_byte
(
&
pb
,
0x40
);
bytestream2_put_byte
(
&
pb
,
0x15
);
// flags (= Audiostream)
bytestream2_put_be24
(
&
pb
,
0
);
// Buffersize DB
bytestream2_put_be32
(
&
pb
,
0
);
// maxbitrate
bytestream2_put_be32
(
&
pb
,
0
);
// avgbitrate
// DecoderSpecific info descriptor
put_descr
(
&
pb
,
0x05
,
avctx
->
extradata_size
);
bytestream2_put_buffer
(
&
pb
,
avctx
->
extradata
,
avctx
->
extradata_size
);
}
status
=
AudioConverterSetProperty
(
at
->
converter
,
kAudioConverterDecompressionMagicCookie
,
extradata_size
,
extradata
);
if
(
status
!=
0
)
av_log
(
avctx
,
AV_LOG_WARNING
,
"AudioToolbox cookie error: %i
\n
"
,
(
int
)
status
);
}
ffat_update_ctx
(
avctx
);
at
->
last_pts
=
AV_NOPTS_VALUE
;
return
0
;
}
static
OSStatus
ffat_decode_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_packet_move_ref
(
&
at
->
in_pkt
,
&
at
->
new_in_pkt
);
at
->
new_in_pkt
.
data
=
0
;
at
->
new_in_pkt
.
size
=
0
;
if
(
!
at
->
in_pkt
.
data
)
{
*
nb_packets
=
0
;
return
1
;
}
data
->
mNumberBuffers
=
1
;
data
->
mBuffers
[
0
].
mNumberChannels
=
0
;
data
->
mBuffers
[
0
].
mDataByteSize
=
at
->
in_pkt
.
size
;
data
->
mBuffers
[
0
].
mData
=
at
->
in_pkt
.
data
;
*
nb_packets
=
1
;
if
(
packets
)
{
*
packets
=
&
at
->
pkt_desc
;
at
->
pkt_desc
.
mDataByteSize
=
at
->
in_pkt
.
size
;
}
return
0
;
}
static
int
ffat_decode
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
AVFrame
*
frame
=
data
;
OSStatus
ret
;
AudioBufferList
out_buffers
=
{
.
mNumberBuffers
=
1
,
.
mBuffers
=
{
{
.
mNumberChannels
=
avctx
->
channels
,
.
mDataByteSize
=
av_get_bytes_per_sample
(
avctx
->
sample_fmt
)
*
at
->
pkt_size
*
avctx
->
channels
,
}
}
};
av_packet_unref
(
&
at
->
new_in_pkt
);
if
(
avpkt
->
size
)
{
if
((
ret
=
av_packet_ref
(
&
at
->
new_in_pkt
,
avpkt
))
<
0
)
return
ret
;
}
else
{
at
->
eof
=
1
;
}
frame
->
sample_rate
=
avctx
->
sample_rate
;
frame
->
nb_samples
=
at
->
pkt_size
;
ff_get_buffer
(
avctx
,
frame
,
0
);
out_buffers
.
mBuffers
[
0
].
mData
=
frame
->
data
[
0
];
ret
=
AudioConverterFillComplexBuffer
(
at
->
converter
,
ffat_decode_callback
,
avctx
,
&
frame
->
nb_samples
,
&
out_buffers
,
NULL
);
if
((
!
ret
||
ret
==
1
)
&&
frame
->
nb_samples
)
{
*
got_frame_ptr
=
1
;
if
(
at
->
last_pts
!=
AV_NOPTS_VALUE
)
{
frame
->
pts
=
at
->
last_pts
;
at
->
last_pts
=
avpkt
->
pts
;
}
}
else
if
(
ret
&&
ret
!=
1
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"Decode error: %i
\n
"
,
ret
);
}
else
{
at
->
last_pts
=
avpkt
->
pts
;
}
return
avpkt
->
size
;
}
static
av_cold
void
ffat_decode_flush
(
AVCodecContext
*
avctx
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
AudioConverterReset
(
at
->
converter
);
av_packet_unref
(
&
at
->
new_in_pkt
);
av_packet_unref
(
&
at
->
in_pkt
);
}
static
av_cold
int
ffat_close_decoder
(
AVCodecContext
*
avctx
)
{
ATDecodeContext
*
at
=
avctx
->
priv_data
;
AudioConverterDispose
(
at
->
converter
);
av_packet_unref
(
&
at
->
new_in_pkt
);
av_packet_unref
(
&
at
->
in_pkt
);
return
0
;
}
#define FFAT_DEC_CLASS(NAME) \
static const AVClass ffat_##NAME##_dec_class = { \
.class_name = "at_" #NAME "_dec", \
.version = LIBAVUTIL_VERSION_INT, \
};
#define FFAT_DEC(NAME, ID) \
FFAT_DEC_CLASS(NAME) \
AVCodec ff_##NAME##_at_decoder = { \
.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_decoder, \
.close = ffat_close_decoder, \
.decode = ffat_decode, \
.flush = ffat_decode_flush, \
.priv_class = &ffat_##NAME##_dec_class, \
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, \
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, \
};
FFAT_DEC
(
aac
,
AV_CODEC_ID_AAC
)
FFAT_DEC
(
ac3
,
AV_CODEC_ID_AC3
)
FFAT_DEC
(
adpcm_ima_qt
,
AV_CODEC_ID_ADPCM_IMA_QT
)
FFAT_DEC
(
alac
,
AV_CODEC_ID_ALAC
)
FFAT_DEC
(
amr_nb
,
AV_CODEC_ID_AMR_NB
)
FFAT_DEC
(
gsm_ms
,
AV_CODEC_ID_GSM_MS
)
FFAT_DEC
(
ilbc
,
AV_CODEC_ID_ILBC
)
FFAT_DEC
(
mp1
,
AV_CODEC_ID_MP1
)
FFAT_DEC
(
mp2
,
AV_CODEC_ID_MP2
)
FFAT_DEC
(
mp3
,
AV_CODEC_ID_MP3
)
FFAT_DEC
(
pcm_alaw
,
AV_CODEC_ID_PCM_ALAW
)
FFAT_DEC
(
pcm_mulaw
,
AV_CODEC_ID_PCM_MULAW
)
FFAT_DEC
(
qdmc
,
AV_CODEC_ID_QDMC
)
FFAT_DEC
(
qdm2
,
AV_CODEC_ID_QDM2
)
libavcodec/version.h
View file @
d5d32805
...
...
@@ -28,8 +28,8 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 57
#define LIBAVCODEC_VERSION_MINOR 2
8
#define LIBAVCODEC_VERSION_MICRO 10
3
#define LIBAVCODEC_VERSION_MINOR 2
9
#define LIBAVCODEC_VERSION_MICRO 10
0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \
...
...
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