Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
BC
public
external
ffmpeg
Commits
72025ac3
Commit
72025ac3
authored
Mar 23, 2015
by
Hendrik Leppkes
Committed by
Anton Khirnov
Mar 29, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc: add libdcadec decoder
Signed-off-by:
Anton Khirnov
<
anton@khirnov.net
>
parent
6fe2641d
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
212 additions
and
0 deletions
+212
-0
Changelog
Changelog
+1
-0
configure
configure
+4
-0
libavcodec/Makefile
libavcodec/Makefile
+1
-0
libavcodec/allcodecs.c
libavcodec/allcodecs.c
+1
-0
libavcodec/libdcadec.c
libavcodec/libdcadec.c
+205
-0
No files found.
Changelog
View file @
72025ac3
...
...
@@ -26,6 +26,7 @@ version <next>:
- DTS lossless extension (XLL) decoding (not lossless, disabled by default)
- Intel QSV-accelerated H.264 encoding
- MMAL-accelerated H.264 decoding
- DTS decoding through libdcadec
version 11:
...
...
configure
View file @
72025ac3
...
...
@@ -184,6 +184,7 @@ External library support:
--enable-libcdio enable audio CD grabbing with libcdio
--enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
and libraw1394 [no]
--enable-libdcadec enable DCA decoding via libdcadec [no]
--enable-libfaac enable AAC encoding via libfaac [no]
--enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no]
--enable-libfreetype enable libfreetype [no]
...
...
@@ -1150,6 +1151,7 @@ EXTERNAL_LIBRARY_LIST="
libbs2b
libcdio
libdc1394
libdcadec
libfaac
libfdk_aac
libfontconfig
...
...
@@ -2016,6 +2018,7 @@ mpeg4video_parser_select="error_resilience h263dsp mpeg_er mpegvideo qpeldsp"
vc1_parser_select
=
"mpegvideo startcode vc1_decoder"
# external libraries
libdcadec_decoder_deps
=
"libdcadec"
libfaac_encoder_deps
=
"libfaac"
libfaac_encoder_select
=
"audio_frame_queue"
libfdk_aac_decoder_deps
=
"libfdk_aac"
...
...
@@ -4218,6 +4221,7 @@ enabled avisynth && { { check_header "avisynth/avisynth_c.h" && check_l
enabled frei0r
&&
{
check_header frei0r.h
||
die
"ERROR: frei0r.h header not found"
;
}
enabled gnutls
&&
require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
enabled libbs2b
&&
require_pkg_config libbs2b bs2b.h bs2b_open
enabled libdcadec
&&
require libdcadec libdcadec/dca_context.h dcadec_context_create
-ldcadec
enabled libfaac
&&
require2 libfaac
"stdint.h faac.h"
faacEncGetVersion
-lfaac
enabled libfdk_aac
&&
require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen
-lfdk-aac
enabled libfontconfig
&&
require_pkg_config fontconfig
"fontconfig/fontconfig.h"
FcInit
...
...
libavcodec/Makefile
View file @
72025ac3
...
...
@@ -611,6 +611,7 @@ OBJS-$(CONFIG_WEBM_MUXER) += mpeg4audio.o mpegaudiodata.o \
OBJS-$(CONFIG_WTV_DEMUXER)
+=
mpeg4audio.o mpegaudiodata.o
# external codec libraries
OBJS-$(CONFIG_LIBDCADEC_DECODER)
+=
libdcadec.o dca.o
OBJS-$(CONFIG_LIBFAAC_ENCODER)
+=
libfaac.o
OBJS-$(CONFIG_LIBFDK_AAC_DECODER)
+=
libfdk-aacdec.o
OBJS-$(CONFIG_LIBFDK_AAC_ENCODER)
+=
libfdk-aacenc.o
...
...
libavcodec/allcodecs.c
View file @
72025ac3
...
...
@@ -442,6 +442,7 @@ void avcodec_register_all(void)
REGISTER_ENCDEC
(
XSUB
,
xsub
);
/* external libraries */
REGISTER_DECODER
(
LIBDCADEC
,
libdcadec
)
REGISTER_ENCODER
(
LIBFAAC
,
libfaac
);
REGISTER_ENCDEC
(
LIBFDK_AAC
,
libfdk_aac
);
REGISTER_ENCDEC
(
LIBGSM
,
libgsm
);
...
...
libavcodec/libdcadec.c
0 → 100644
View file @
72025ac3
/*
* libdcadec decoder wrapper
* Copyright (C) 2015 Hendrik Leppkes
*
* This file is part of Libav.
*
* Libav 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.
*
* Libav 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 Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <libdcadec/dca_context.h>
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/opt.h"
#include "avcodec.h"
#include "dca.h"
#include "dca_syncwords.h"
#include "internal.h"
typedef
struct
DCADecContext
{
struct
dcadec_context
*
ctx
;
uint8_t
*
buffer
;
int
buffer_size
;
}
DCADecContext
;
static
int
dcadec_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
DCADecContext
*
s
=
avctx
->
priv_data
;
AVFrame
*
frame
=
data
;
int
ret
,
i
,
k
;
int
**
samples
,
nsamples
,
channel_mask
,
sample_rate
,
bits_per_sample
,
profile
;
uint32_t
mrk
;
uint8_t
*
input
=
avpkt
->
data
;
int
input_size
=
avpkt
->
size
;
/* convert bytestream syntax to RAW BE format if required */
if
(
input_size
<
8
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Input size too small
\n
"
);
return
AVERROR_INVALIDDATA
;
}
mrk
=
AV_RB32
(
input
);
if
(
mrk
!=
DCA_SYNCWORD_CORE_BE
&&
mrk
!=
DCA_SYNCWORD_SUBSTREAM
)
{
s
->
buffer
=
av_fast_realloc
(
s
->
buffer
,
&
s
->
buffer_size
,
avpkt
->
size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
if
(
!
s
->
buffer
)
return
AVERROR
(
ENOMEM
);
if
((
ret
=
ff_dca_convert_bitstream
(
avpkt
->
data
,
avpkt
->
size
,
s
->
buffer
,
s
->
buffer_size
))
<
0
)
return
ret
;
input
=
s
->
buffer
;
input_size
=
ret
;
}
if
((
ret
=
dcadec_context_parse
(
s
->
ctx
,
input
,
input_size
))
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"dcadec_context_parse() failed: %d (%s)
\n
"
,
-
ret
,
dcadec_strerror
(
ret
));
return
AVERROR_UNKNOWN
;
}
if
((
ret
=
dcadec_context_filter
(
s
->
ctx
,
&
samples
,
&
nsamples
,
&
channel_mask
,
&
sample_rate
,
&
bits_per_sample
,
&
profile
))
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"dcadec_context_filter() failed: %d (%s)
\n
"
,
-
ret
,
dcadec_strerror
(
ret
));
return
AVERROR_UNKNOWN
;
}
avctx
->
channels
=
av_get_channel_layout_nb_channels
(
channel_mask
);
avctx
->
channel_layout
=
channel_mask
;
avctx
->
sample_rate
=
sample_rate
;
if
(
bits_per_sample
==
16
)
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S16P
;
else
if
(
bits_per_sample
<=
24
)
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S32P
;
else
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Unsupported number of bits per sample: %d
\n
"
,
bits_per_sample
);
return
AVERROR
(
ENOSYS
);
}
avctx
->
bits_per_raw_sample
=
bits_per_sample
;
switch
(
profile
)
{
case
DCADEC_PROFILE_DS
:
avctx
->
profile
=
FF_PROFILE_DTS
;
break
;
case
DCADEC_PROFILE_DS_96_24
:
avctx
->
profile
=
FF_PROFILE_DTS_96_24
;
break
;
case
DCADEC_PROFILE_DS_ES
:
avctx
->
profile
=
FF_PROFILE_DTS_ES
;
break
;
case
DCADEC_PROFILE_HD_HRA
:
avctx
->
profile
=
FF_PROFILE_DTS_HD_HRA
;
break
;
case
DCADEC_PROFILE_HD_MA
:
avctx
->
profile
=
FF_PROFILE_DTS_HD_MA
;
break
;
case
DCADEC_PROFILE_EXPRESS
:
avctx
->
profile
=
FF_PROFILE_DTS_EXPRESS
;
break
;
case
DCADEC_PROFILE_UNKNOWN
:
default:
avctx
->
profile
=
FF_PROFILE_UNKNOWN
;
break
;
}
/* bitrate is only meaningful if there are no HD extensions, as they distort the bitrate */
if
(
profile
==
DCADEC_PROFILE_DS
||
profile
==
DCADEC_PROFILE_DS_96_24
||
profile
==
DCADEC_PROFILE_DS_ES
)
{
struct
dcadec_core_info
*
info
=
dcadec_context_get_core_info
(
s
->
ctx
);
avctx
->
bit_rate
=
info
->
bit_rate
;
dcadec_context_free_core_info
(
info
);
}
else
avctx
->
bit_rate
=
0
;
frame
->
nb_samples
=
nsamples
;
if
((
ret
=
ff_get_buffer
(
avctx
,
frame
,
0
))
<
0
)
return
ret
;
for
(
i
=
0
;
i
<
avctx
->
channels
;
i
++
)
{
if
(
frame
->
format
==
AV_SAMPLE_FMT_S16P
)
{
int16_t
*
plane
=
(
int16_t
*
)
frame
->
extended_data
[
i
];
for
(
k
=
0
;
k
<
nsamples
;
k
++
)
plane
[
k
]
=
samples
[
i
][
k
];
}
else
{
int32_t
*
plane
=
(
int32_t
*
)
frame
->
extended_data
[
i
];
int
shift
=
32
-
bits_per_sample
;
for
(
k
=
0
;
k
<
nsamples
;
k
++
)
plane
[
k
]
=
samples
[
i
][
k
]
<<
shift
;
}
}
*
got_frame_ptr
=
1
;
return
avpkt
->
size
;
}
static
av_cold
void
dcadec_flush
(
AVCodecContext
*
avctx
)
{
DCADecContext
*
s
=
avctx
->
priv_data
;
dcadec_context_clear
(
s
->
ctx
);
}
static
av_cold
int
dcadec_close
(
AVCodecContext
*
avctx
)
{
DCADecContext
*
s
=
avctx
->
priv_data
;
dcadec_context_destroy
(
s
->
ctx
);
s
->
ctx
=
NULL
;
av_freep
(
&
s
->
buffer
);
return
0
;
}
static
av_cold
int
dcadec_init
(
AVCodecContext
*
avctx
)
{
DCADecContext
*
s
=
avctx
->
priv_data
;
s
->
ctx
=
dcadec_context_create
(
0
);
if
(
!
s
->
ctx
)
return
AVERROR
(
ENOMEM
);
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S32P
;
avctx
->
bits_per_raw_sample
=
24
;
return
0
;
}
static
const
AVProfile
profiles
[]
=
{
{
FF_PROFILE_DTS
,
"DTS"
},
{
FF_PROFILE_DTS_ES
,
"DTS-ES"
},
{
FF_PROFILE_DTS_96_24
,
"DTS 96/24"
},
{
FF_PROFILE_DTS_HD_HRA
,
"DTS-HD HRA"
},
{
FF_PROFILE_DTS_HD_MA
,
"DTS-HD MA"
},
{
FF_PROFILE_DTS_EXPRESS
,
"DTS Express"
},
{
FF_PROFILE_UNKNOWN
},
};
AVCodec
ff_libdcadec_decoder
=
{
.
name
=
"libdcadec"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"dcadec DCA decoder"
),
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
AV_CODEC_ID_DTS
,
.
priv_data_size
=
sizeof
(
DCADecContext
),
.
init
=
dcadec_init
,
.
decode
=
dcadec_decode_frame
,
.
close
=
dcadec_close
,
.
flush
=
dcadec_flush
,
.
capabilities
=
CODEC_CAP_DR1
|
CODEC_CAP_CHANNEL_CONF
,
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_S32P
,
AV_SAMPLE_FMT_S16P
,
AV_SAMPLE_FMT_NONE
},
.
profiles
=
NULL_IF_CONFIG_SMALL
(
profiles
),
};
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