Commit 20900107 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '217e4ff4'

* commit '217e4ff4':
  dca: Support for XLL (lossless extension)

Conflicts:
	Changelog
	doc/general.texi
	libavcodec/Makefile
	libavcodec/dca.h
	libavcodec/dca_exss.c
	libavcodec/dcadata.h
	libavcodec/dcadec.c
	libavcodec/version.h
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents e46a7fdc 217e4ff4
......@@ -4,6 +4,7 @@ releases are sorted from youngest to oldest.
version <next>:
- FFT video filter
- TDSC decoder
- DTS lossless extension (XLL) decoding (not lossless, disabled by default)
version 2.6:
......
......@@ -906,6 +906,7 @@ following image formats are supported:
@item COOK @tab @tab X
@tab All versions except 5.1 are supported.
@item DCA (DTS Coherent Acoustics) @tab X @tab X
@tab supported extensions: XCh, XLL (partially)
@item DPCM id RoQ @tab X @tab X
@tab Used in Quake III, Jedi Knight 2 and other computer games.
@item DPCM Interplay @tab @tab X
......
......@@ -193,7 +193,7 @@ OBJS-$(CONFIG_CSCD_DECODER) += cscd.o
OBJS-$(CONFIG_CYUV_DECODER) += cyuv.o
OBJS-$(CONFIG_DCA_DECODER) += dcadec.o dca.o dcadsp.o \
dcadata.o dca_exss.o \
synth_filter.o
dca_xll.o synth_filter.o
OBJS-$(CONFIG_DCA_ENCODER) += dcaenc.o dca.o dcadata.o
OBJS-$(CONFIG_DIRAC_DECODER) += diracdec.o dirac.o diracdsp.o \
dirac_arith.o mpeg12data.o dirac_dwt.o
......
......@@ -44,6 +44,21 @@
#define DCA_CHSETS_MAX (4)
#define DCA_CHSET_CHANS_MAX (8)
#define DCA_PRIM_CHANNELS_MAX (7)
#define DCA_ABITS_MAX (32) /* Should be 28 */
#define DCA_SUBSUBFRAMES_MAX (4)
#define DCA_SUBFRAMES_MAX (16)
#define DCA_BLOCKS_MAX (16)
#define DCA_LFE_MAX (3)
#define DCA_XLL_FBANDS_MAX (4)
#define DCA_XLL_SEGMENTS_MAX (16)
#define DCA_XLL_CHSETS_MAX (16)
#define DCA_XLL_CHANNELS_MAX (16)
#define DCA_XLL_AORDER_MAX (15)
/* Arbitrary limit; not sure what the maximum really is, but much larger. */
#define DCA_XLL_DMIX_NCOEFFS_MAX (18)
#define DCA_MAX_FRAME_SIZE 16384
#define DCA_MAX_EXSS_HEADER_SIZE 4096
......@@ -62,6 +77,61 @@ enum DCAExtensionMask {
DCA_EXT_EXSS_XLL = 0x200, ///< lossless extension in ExSS
};
typedef struct XllChSetSubHeader {
int channels; ///< number of channels in channel set, at most 16
int residual_encode; ///< residual channel encoding
int bit_resolution; ///< input sample bit-width
int bit_width; ///< original input sample bit-width
int sampling_frequency; ///< sampling frequency
int samp_freq_interp; ///< sampling frequency interpolation multiplier
int replacement_set; ///< replacement channel set group
int active_replace_set; ///< current channel set is active channel set
int primary_ch_set;
int downmix_coeff_code_embedded;
int downmix_embedded;
int downmix_type;
int hier_chset; ///< hierarchical channel set
int downmix_ncoeffs;
int downmix_coeffs[DCA_XLL_DMIX_NCOEFFS_MAX];
int ch_mask_enabled;
int ch_mask;
int mapping_coeffs_present;
int num_freq_bands;
/* m_nOrigChanOrder */
uint8_t orig_chan_order[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX];
uint8_t orig_chan_order_inv[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX];
/* Coefficients for channel pairs (at most 8), m_anPWChPairsCoeffs */
int8_t pw_ch_pairs_coeffs[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX/2];
/* m_nCurrHighestLPCOrder */
uint8_t adapt_order_max[DCA_XLL_FBANDS_MAX];
/* m_pnAdaptPredOrder */
uint8_t adapt_order[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX];
/* m_pnFixedPredOrder */
uint8_t fixed_order[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX];
/* m_pnLPCReflCoeffsQInd, unsigned version */
uint8_t lpc_refl_coeffs_q_ind[DCA_XLL_FBANDS_MAX]
[DCA_XLL_CHANNELS_MAX][DCA_XLL_AORDER_MAX];
int lsb_fsize[DCA_XLL_FBANDS_MAX];
int8_t scalable_lsbs[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX];
int8_t bit_width_adj_per_ch[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX];
} XllChSetSubHeader;
typedef struct XllNavi {
GetBitContext gb; // Context for parsing the data segments
unsigned band_size[DCA_XLL_FBANDS_MAX];
unsigned segment_size[DCA_XLL_FBANDS_MAX][DCA_XLL_SEGMENTS_MAX];
unsigned chset_size[DCA_XLL_FBANDS_MAX][DCA_XLL_SEGMENTS_MAX][DCA_XLL_CHSETS_MAX];
} XllNavi;
typedef struct QMF64_table {
float dct4_coeff[32][32];
float dct2_coeff[32][32];
float rcos[32];
float rsin[32];
} QMF64_table;
typedef struct DCAContext {
const AVClass *class; ///< class for AVOptions
AVCodecContext *avctx;
......@@ -134,8 +204,10 @@ typedef struct DCAContext {
/* Subband samples history (for ADPCM) */
DECLARE_ALIGNED(16, float, subband_samples_hist)[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][4];
DECLARE_ALIGNED(32, float, subband_fir_hist)[DCA_PRIM_CHANNELS_MAX][512];
DECLARE_ALIGNED(32, float, subband_fir_noidea)[DCA_PRIM_CHANNELS_MAX][32];
/* Half size is sufficient for core decoding, but for 96 kHz data
* we need QMF with 64 subbands and 1024 samples. */
DECLARE_ALIGNED(32, float, subband_fir_hist)[DCA_PRIM_CHANNELS_MAX][1024];
DECLARE_ALIGNED(32, float, subband_fir_noidea)[DCA_PRIM_CHANNELS_MAX][64];
int hist_index[DCA_PRIM_CHANNELS_MAX];
DECLARE_ALIGNED(32, float, raXin)[32];
......@@ -157,6 +229,7 @@ typedef struct DCAContext {
int current_subsubframe;
int core_ext_mask; ///< present extensions in the core substream
int exss_ext_mask; ///< Non-core extensions
/* XCh extension information */
int xch_present; ///< XCh extension present and valid
......@@ -177,6 +250,24 @@ typedef struct DCAContext {
int8_t xxch_order_tab[32];
int8_t lfe_index;
/* XLL extension information */
int xll_disable;
int xll_nch_sets; ///< number of channel sets per frame
int xll_channels; ///< total number of channels (in all channel sets)
int xll_residual_channels; ///< number of residual channels
int xll_segments; ///< number of segments per frame
int xll_log_smpl_in_seg; ///< supposedly this is "nBits4SamplLoci"
int xll_smpl_in_seg; ///< samples in segment per one frequency band for the first channel set
int xll_bits4seg_size; ///< number of bits used to read segment size
int xll_banddata_crc; ///< presence of CRC16 within each frequency band
int xll_scalable_lsb;
int xll_bits4ch_mask; ///< channel position mask
int xll_fixed_lsb_width;
XllChSetSubHeader xll_chsets[DCA_XLL_CHSETS_MAX];
XllNavi xll_navi;
int *xll_sample_buf;
unsigned int xll_sample_buf_size;
/* ExSS header parser */
int static_fields; ///< static fields present
int mix_metadata; ///< mixing metadata present
......@@ -184,12 +275,14 @@ typedef struct DCAContext {
int mix_config_num_ch[4]; ///< number of channels in each mix out configuration
int profile;
int one2one_map_chtospkr;
int debug_flag; ///< used for suppressing repeated error messages output
AVFloatDSPContext *fdsp;
FFTContext imdct;
SynthFilterContext synth;
DCADSPContext dcadsp;
QMF64_table *qmf64_table;
FmtConvertContext fmt_conv;
} DCAContext;
......@@ -206,4 +299,8 @@ int ff_dca_xxch_decode_frame(DCAContext *s);
void ff_dca_exss_parse_header(DCAContext *s);
int ff_dca_xll_decode_header(DCAContext *s);
int ff_dca_xll_decode_navi(DCAContext *s, int asset_end);
int ff_dca_xll_decode_audio(DCAContext *s, AVFrame *frame);
#endif /* AVCODEC_DCA_H */
......@@ -22,6 +22,7 @@
#include "libavutil/log.h"
#include "dca.h"
#include "dca_syncwords.h"
#include "get_bits.h"
/* extensions that reside in core substream */
......@@ -121,7 +122,8 @@ static int dca_exss_parse_asset_header(DCAContext *s)
skip_bits(&s->gb, 4); // max sample rate code
channels = get_bits(&s->gb, 8) + 1;
if (get_bits1(&s->gb)) { // 1-to-1 channels to speakers
s->one2one_map_chtospkr = get_bits1(&s->gb);
if (s->one2one_map_chtospkr) {
int spkr_remap_sets;
int spkr_mask_size = 16;
int num_spkrs[7];
......@@ -249,14 +251,14 @@ void ff_dca_exss_parse_header(DCAContext *s)
int num_assets = 1;
int active_ss_mask[8];
int i, j;
int start_posn;
int start_pos;
int hdrsize;
uint32_t mkr;
if (get_bits_left(&s->gb) < 52)
return;
start_posn = get_bits_count(&s->gb) - 32;
start_pos = get_bits_count(&s->gb) - 32;
skip_bits(&s->gb, 8); // user data
ss_index = get_bits(&s->gb, 2);
......@@ -317,38 +319,55 @@ void ff_dca_exss_parse_header(DCAContext *s)
av_assert0(num_assets > 0); // silence a warning
for (i = 0; i < num_assets; i++)
asset_size[i] = get_bits_long(&s->gb, 16 + 4 * blownup);
asset_size[i] = get_bits_long(&s->gb, 16 + 4 * blownup) + 1;
for (i = 0; i < num_assets; i++) {
if (dca_exss_parse_asset_header(s))
return;
}
/* not parsed further, we were only interested in the extensions mask
* from the asset header */
j = get_bits_count(&s->gb);
if (start_posn + hdrsize * 8 > j)
skip_bits_long(&s->gb, start_posn + hdrsize * 8 - j);
if (start_pos + hdrsize * 8 > j)
skip_bits_long(&s->gb, start_pos + hdrsize * 8 - j);
for (i = 0; i < num_assets; i++) {
start_posn = get_bits_count(&s->gb);
int end_pos;
start_pos = get_bits_count(&s->gb);
end_pos = start_pos + asset_size[i] * 8;
mkr = get_bits_long(&s->gb, 32);
/* parse extensions that we know about */
if (mkr == 0x655e315e) {
switch (mkr) {
case DCA_SYNCWORD_XBR:
ff_dca_xbr_parse_frame(s);
} else if (mkr == 0x47004a03) {
break;
case DCA_SYNCWORD_XXCH:
ff_dca_xxch_decode_frame(s);
s->core_ext_mask |= DCA_EXT_XXCH; /* xxx use for chan reordering */
} else {
break;
case DCA_SYNCWORD_XLL:
if (s->xll_disable) {
av_log(s->avctx, AV_LOG_DEBUG,
"DTS-XLL: ignoring XLL extension\n");
break;
}
av_log(s->avctx, AV_LOG_DEBUG,
"DTS-XLL: decoding XLL extension\n");
if (ff_dca_xll_decode_header(s) == 0 &&
ff_dca_xll_decode_navi(s, end_pos) == 0)
s->exss_ext_mask |= DCA_EXT_EXSS_XLL;
break;
default:
av_log(s->avctx, AV_LOG_DEBUG,
"DTS-ExSS: unknown marker = 0x%08x\n", mkr);
}
/* skip to end of block */
j = get_bits_count(&s->gb);
if (start_posn + asset_size[i] * 8 > j)
skip_bits_long(&s->gb, start_posn + asset_size[i] * 8 - j);
if (j > end_pos)
av_log(s->avctx, AV_LOG_ERROR,
"DTS-ExSS: Processed asset too long.\n");
if (j < end_pos)
skip_bits_long(&s->gb, end_pos - j);
}
}
This diff is collapsed.
This diff is collapsed.
......@@ -47,8 +47,14 @@ extern const float ff_dca_fir_32bands_nonperfect[512];
extern const float ff_dca_lfe_fir_64[256];
extern const float ff_dca_lfe_fir_128[256];
extern const float ff_dca_lfe_xll_fir_64[256];
extern const float ff_dca_fir_64bands[1024];
extern const uint16_t ff_dca_dmixtable[242];
#define FF_DCA_DMIXTABLE_SIZE 242
#define FF_DCA_INV_DMIXTABLE_SIZE 201
extern const uint16_t ff_dca_dmixtable[FF_DCA_DMIXTABLE_SIZE];
extern const uint32_t ff_dca_inv_dmixtable[FF_DCA_INV_DMIXTABLE_SIZE];
extern const float ff_dca_default_coeffs[10][6][2];
......@@ -57,6 +63,8 @@ extern const int ff_dca_ext_audio_descr_mask[8];
extern const uint64_t ff_dca_core_channel_layout[16];
extern const int32_t ff_dca_sampling_freqs[16];
extern const int8_t ff_dca_lfe_index[16];
extern const int8_t ff_dca_channel_reorder_lfe[16][9];
......
This diff is collapsed.
......@@ -29,7 +29,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 56
#define LIBAVCODEC_VERSION_MINOR 27
#define LIBAVCODEC_VERSION_MINOR 28
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment