#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include "libavutil/common.h"
#include "libavutil/intmath.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/mathematics.h"
#include "libavutil/audioconvert.h"
#include "avcodec.h"
#include "dsputil.h"
#include "fft.h"
#include "get_bits.h"
#include "put_bits.h"
#include "dcadata.h"
#include "dcahuff.h"
#include "dca.h"
#include "synth_filter.h"
#include "dcadsp.h"
#include "fmtconvert.h"
Go to the source code of this file.
Data Structures | |
struct | BitAlloc |
Bit allocation. More... | |
struct | DCAContext |
Defines | |
#define | DCA_PRIM_CHANNELS_MAX (7) |
#define | DCA_SUBBANDS (32) |
#define | DCA_ABITS_MAX (32) |
#define | DCA_SUBSUBFRAMES_MAX (4) |
#define | DCA_SUBFRAMES_MAX (16) |
#define | DCA_BLOCKS_MAX (16) |
#define | DCA_LFE_MAX (3) |
#define | DCA_CORE_EXTS (DCA_EXT_XCH | DCA_EXT_XXCH | DCA_EXT_X96) |
#define | DCA_DOLBY 101 |
#define | DCA_CHANNEL_BITS 6 |
#define | DCA_CHANNEL_MASK 0x3F |
#define | DCA_LFE 0x80 |
#define | HEADER_SIZE 14 |
#define | DCA_MAX_FRAME_SIZE 16384 |
#define | DCA_MAX_EXSS_HEADER_SIZE 4096 |
#define | DCA_BUFFER_PADDING_SIZE 1024 |
#define | MIX_REAR1(samples, si1, rs, coef) |
#define | MIX_REAR2(samples, si1, si2, rs, coef) |
#define | MIX_FRONT3(samples, coef) |
#define | DOWNMIX_TO_STEREO(op1, op2) |
Enumerations | |
enum | DCAMode { DCA_MONO = 0, DCA_CHANNEL, DCA_STEREO, DCA_STEREO_SUMDIFF, DCA_STEREO_TOTAL, DCA_3F, DCA_2F1R, DCA_3F1R, DCA_2F2R, DCA_3F2R, DCA_4F2R } |
enum | DCAExSSSpeakerMask { DCA_EXSS_FRONT_CENTER = 0x0001, DCA_EXSS_FRONT_LEFT_RIGHT = 0x0002, DCA_EXSS_SIDE_REAR_LEFT_RIGHT = 0x0004, DCA_EXSS_LFE = 0x0008, DCA_EXSS_REAR_CENTER = 0x0010, DCA_EXSS_FRONT_HIGH_LEFT_RIGHT = 0x0020, DCA_EXSS_REAR_LEFT_RIGHT = 0x0040, DCA_EXSS_FRONT_HIGH_CENTER = 0x0080, DCA_EXSS_OVERHEAD = 0x0100, DCA_EXSS_CENTER_LEFT_RIGHT = 0x0200, DCA_EXSS_WIDE_LEFT_RIGHT = 0x0400, DCA_EXSS_SIDE_LEFT_RIGHT = 0x0800, DCA_EXSS_LFE2 = 0x1000, DCA_EXSS_SIDE_HIGH_LEFT_RIGHT = 0x2000, DCA_EXSS_REAR_HIGH_CENTER = 0x4000, DCA_EXSS_REAR_HIGH_LEFT_RIGHT = 0x8000 } |
enum | DCAExtensionMask { DCA_EXT_CORE = 0x001, DCA_EXT_XXCH = 0x002, DCA_EXT_X96 = 0x004, DCA_EXT_XCH = 0x008, DCA_EXT_EXSS_CORE = 0x010, DCA_EXT_EXSS_XBR = 0x020, DCA_EXT_EXSS_XXCH = 0x040, DCA_EXT_EXSS_X96 = 0x080, DCA_EXT_EXSS_LBR = 0x100, DCA_EXT_EXSS_XLL = 0x200 } |
Functions | |
static av_always_inline int | get_bitalloc (GetBitContext *gb, BitAlloc *ba, int idx) |
static av_cold void | dca_init_vlcs (void) |
static void | get_array (GetBitContext *gb, int *dst, int len, int bits) |
static int | dca_parse_audio_coding_header (DCAContext *s, int base_channel) |
static int | dca_parse_frame_header (DCAContext *s) |
static int | get_scale (GetBitContext *gb, int level, int value) |
static int | dca_subframe_header (DCAContext *s, int base_channel, int block_index) |
static void | qmf_32_subbands (DCAContext *s, int chans, float samples_in[32][8], float *samples_out, float scale) |
static void | lfe_interpolation_fir (DCAContext *s, int decimation_select, int num_deci_sample, float *samples_in, float *samples_out, float scale) |
static void | dca_downmix (float *samples, int srcfmt, int downmix_coef[DCA_PRIM_CHANNELS_MAX][2], const int8_t *channel_mapping) |
static int | decode_blockcode (int code, int levels, int *values) |
static int | dca_subsubframe (DCAContext *s, int base_channel, int block_index) |
static int | dca_filter_channels (DCAContext *s, int block_index) |
static int | dca_subframe_footer (DCAContext *s, int base_channel) |
static int | dca_decode_block (DCAContext *s, int base_channel, int block_index) |
Decode a dca frame block. | |
static int | dca_convert_bitstream (const uint8_t *src, int src_size, uint8_t *dst, int max_size) |
Convert bitstream to one representation based on sync marker. | |
static int | dca_exss_mask2count (int mask) |
Return the number of channels in an ExSS speaker mask (HD). | |
static void | dca_exss_skip_mix_coeffs (GetBitContext *gb, int channels, int out_ch) |
Skip mixing coefficients of a single mix out configuration (HD). | |
static int | dca_exss_parse_asset_header (DCAContext *s) |
Parse extension substream asset header (HD). | |
static void | dca_exss_parse_header (DCAContext *s) |
Parse extension substream header (HD). | |
static int | dca_decode_frame (AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) |
Main frame decoding function FIXME add arguments. | |
static av_cold int | dca_decode_init (AVCodecContext *avctx) |
DCA initialization. | |
static av_cold int | dca_decode_end (AVCodecContext *avctx) |
Variables | |
static const int | dca_ext_audio_descr_mask [] |
static const int64_t | dca_core_channel_layout [] |
static const int8_t | dca_lfe_index [] |
static const int8_t | dca_channel_reorder_lfe [][9] |
static const int8_t | dca_channel_reorder_lfe_xch [][9] |
static const int8_t | dca_channel_reorder_nolfe [][9] |
static const int8_t | dca_channel_reorder_nolfe_xch [][9] |
static BitAlloc | dca_bitalloc_index |
indexes for samples VLC select | |
static BitAlloc | dca_tmode |
transition mode VLCs | |
static BitAlloc | dca_scalefactor |
scalefactor VLCs | |
static BitAlloc | dca_smpl_bitalloc [11] |
samples VLCs | |
static const uint16_t | dca_vlc_offs [] |
static const uint8_t | abits_sizes [7] = { 7, 10, 12, 13, 15, 17, 19 } |
static const uint8_t | abits_levels [7] = { 3, 5, 7, 9, 13, 17, 25 } |
static const AVProfile | profiles [] |
AVCodec | ff_dca_decoder |
#define DCA_CHANNEL_MASK 0x3F |
#define DCA_CORE_EXTS (DCA_EXT_XCH | DCA_EXT_XXCH | DCA_EXT_X96) |
#define DCA_LFE 0x80 |
Definition at line 232 of file dca.c.
Referenced by dca_filter_channels(), and dca_parse_frame_header().
#define DCA_MAX_EXSS_HEADER_SIZE 4096 |
#define DCA_MAX_FRAME_SIZE 16384 |
#define DCA_PRIM_CHANNELS_MAX (7) |
Definition at line 48 of file dca.c.
Referenced by dca_decode_init(), and dca_parse_audio_coding_header().
#define DCA_SUBBANDS (32) |
Definition at line 49 of file dca.c.
Referenced by dca_filter_channels(), dca_parse_audio_coding_header(), dca_subsubframe(), put_primary_audio_header(), and put_subframe().
#define DOWNMIX_TO_STEREO | ( | op1, | |||
op2 | ) |
Value:
for (i = 0; i < 256; i++){ \
op1 \
op2 \
}
Definition at line 972 of file dca.c.
Referenced by dca_downmix().
#define HEADER_SIZE 14 |
Definition at line 234 of file dca.c.
Referenced by decode_frame(), encode_frame(), mp_decode_frame(), msnwc_tcp_probe(), msnwc_tcp_read_header(), and msnwc_tcp_read_packet().
#define MIX_FRONT3 | ( | samples, | |||
coef | ) |
#define MIX_REAR1 | ( | samples, | |||
si1, | |||||
rs, | |||||
coef | ) |
#define MIX_REAR2 | ( | samples, | |||
si1, | |||||
si2, | |||||
rs, | |||||
coef | ) |
enum DCAExSSSpeakerMask |
enum DCAExtensionMask |
enum DCAMode |
static int dca_convert_bitstream | ( | const uint8_t * | src, | |
int | src_size, | |||
uint8_t * | dst, | |||
int | max_size | |||
) | [static] |
Convert bitstream to one representation based on sync marker.
Definition at line 1312 of file dca.c.
Referenced by dca_decode_frame().
static int dca_decode_block | ( | DCAContext * | s, | |
int | base_channel, | |||
int | block_index | |||
) | [static] |
Decode a dca frame block.
s | pointer to the DCAContext |
Definition at line 1265 of file dca.c.
Referenced by dca_decode_frame().
static av_cold int dca_decode_end | ( | AVCodecContext * | avctx | ) | [static] |
static int dca_decode_frame | ( | AVCodecContext * | avctx, | |
void * | data, | |||
int * | data_size, | |||
AVPacket * | avpkt | |||
) | [static] |
static av_cold int dca_decode_init | ( | AVCodecContext * | avctx | ) | [static] |
static void dca_downmix | ( | float * | samples, | |
int | srcfmt, | |||
int | downmix_coef[DCA_PRIM_CHANNELS_MAX][2], | |||
const int8_t * | channel_mapping | |||
) | [static] |
static int dca_exss_mask2count | ( | int | mask | ) | [static] |
Return the number of channels in an ExSS speaker mask (HD).
Definition at line 1353 of file dca.c.
Referenced by dca_exss_parse_asset_header(), and dca_exss_parse_header().
static int dca_exss_parse_asset_header | ( | DCAContext * | s | ) | [static] |
Parse extension substream asset header (HD).
Definition at line 1387 of file dca.c.
Referenced by dca_exss_parse_header().
static void dca_exss_parse_header | ( | DCAContext * | s | ) | [static] |
Parse extension substream header (HD).
Definition at line 1537 of file dca.c.
Referenced by dca_decode_frame().
static void dca_exss_skip_mix_coeffs | ( | GetBitContext * | gb, | |
int | channels, | |||
int | out_ch | |||
) | [static] |
Skip mixing coefficients of a single mix out configuration (HD).
Definition at line 1373 of file dca.c.
Referenced by dca_exss_parse_asset_header().
static int dca_filter_channels | ( | DCAContext * | s, | |
int | block_index | |||
) | [static] |
static av_cold void dca_init_vlcs | ( | void | ) | [static] |
static int dca_parse_audio_coding_header | ( | DCAContext * | s, | |
int | base_channel | |||
) | [static] |
Definition at line 436 of file dca.c.
Referenced by dca_decode_frame(), and dca_parse_frame_header().
static int dca_parse_frame_header | ( | DCAContext * | s | ) | [static] |
static int dca_subframe_footer | ( | DCAContext * | s, | |
int | base_channel | |||
) | [static] |
static int dca_subframe_header | ( | DCAContext * | s, | |
int | base_channel, | |||
int | block_index | |||
) | [static] |
static int dca_subsubframe | ( | DCAContext * | s, | |
int | base_channel, | |||
int | block_index | |||
) | [static] |
static int decode_blockcode | ( | int | code, | |
int | levels, | |||
int * | values | |||
) | [static] |
static void get_array | ( | GetBitContext * | gb, | |
int * | dst, | |||
int | len, | |||
int | bits | |||
) | [inline, static] |
static av_always_inline int get_bitalloc | ( | GetBitContext * | gb, | |
BitAlloc * | ba, | |||
int | idx | |||
) | [static] |
Definition at line 254 of file dca.c.
Referenced by dca_subframe_header(), dca_subsubframe(), and get_scale().
static int get_scale | ( | GetBitContext * | gb, | |
int | level, | |||
int | value | |||
) | [inline, static] |
static void lfe_interpolation_fir | ( | DCAContext * | s, | |
int | decimation_select, | |||
int | num_deci_sample, | |||
float * | samples_in, | |||
float * | samples_out, | |||
float | scale | |||
) | [static] |
static void qmf_32_subbands | ( | DCAContext * | s, | |
int | chans, | |||
float | samples_in[32][8], | |||
float * | samples_out, | |||
float | scale | |||
) | [static] |
const uint8_t abits_levels[7] = { 3, 5, 7, 9, 13, 17, 25 } [static] |
const uint8_t abits_sizes[7] = { 7, 10, 12, 13, 15, 17, 19 } [static] |
BitAlloc dca_bitalloc_index [static] |
const int8_t dca_channel_reorder_lfe[][9] [static] |
Initial value:
{ { 0, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, 3, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, 4, -1, -1, -1, -1, -1}, { 0, 1, 3, 4, -1, -1, -1, -1, -1}, { 2, 0, 1, 4, 5, -1, -1, -1, -1}, { 3, 4, 0, 1, 5, 6, -1, -1, -1}, { 2, 0, 1, 4, 5, 6, -1, -1, -1}, { 0, 6, 4, 5, 2, 3, -1, -1, -1}, { 4, 2, 5, 0, 1, 6, 7, -1, -1}, { 5, 6, 0, 1, 7, 3, 8, 4, -1}, { 4, 2, 5, 0, 1, 6, 8, 7, -1}, }
Definition at line 151 of file dca.c.
Referenced by dca_decode_frame(), and encode_init().
const int8_t dca_channel_reorder_lfe_xch[][9] [static] |
Initial value:
{ { 0, 2, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, 3, -1, -1, -1, -1, -1, -1}, { 0, 1, 3, -1, -1, -1, -1, -1, -1}, { 0, 1, 3, -1, -1, -1, -1, -1, -1}, { 0, 1, 3, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, 4, -1, -1, -1, -1, -1}, { 0, 1, 3, 4, -1, -1, -1, -1, -1}, { 2, 0, 1, 4, 5, -1, -1, -1, -1}, { 0, 1, 4, 5, 3, -1, -1, -1, -1}, { 2, 0, 1, 5, 6, 4, -1, -1, -1}, { 3, 4, 0, 1, 6, 7, 5, -1, -1}, { 2, 0, 1, 4, 5, 6, 7, -1, -1}, { 0, 6, 4, 5, 2, 3, 7, -1, -1}, { 4, 2, 5, 0, 1, 7, 8, 6, -1}, { 5, 6, 0, 1, 8, 3, 9, 4, 7}, { 4, 2, 5, 0, 1, 6, 9, 8, 7}, }
Definition at line 170 of file dca.c.
Referenced by dca_decode_frame().
const int8_t dca_channel_reorder_nolfe[][9] [static] |
Initial value:
{ { 0, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, 2, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, 3, -1, -1, -1, -1, -1}, { 0, 1, 2, 3, -1, -1, -1, -1, -1}, { 2, 0, 1, 3, 4, -1, -1, -1, -1}, { 2, 3, 0, 1, 4, 5, -1, -1, -1}, { 2, 0, 1, 3, 4, 5, -1, -1, -1}, { 0, 5, 3, 4, 1, 2, -1, -1, -1}, { 3, 2, 4, 0, 1, 5, 6, -1, -1}, { 4, 5, 0, 1, 6, 2, 7, 3, -1}, { 3, 2, 4, 0, 1, 5, 7, 6, -1}, }
Definition at line 189 of file dca.c.
Referenced by dca_decode_frame(), and encode_init().
const int8_t dca_channel_reorder_nolfe_xch[][9] [static] |
Initial value:
{ { 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, 2, -1, -1, -1, -1, -1, -1}, { 0, 1, 2, -1, -1, -1, -1, -1, -1}, { 0, 1, 2, -1, -1, -1, -1, -1, -1}, { 0, 1, 2, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, 3, -1, -1, -1, -1, -1}, { 0, 1, 2, 3, -1, -1, -1, -1, -1}, { 2, 0, 1, 3, 4, -1, -1, -1, -1}, { 0, 1, 3, 4, 2, -1, -1, -1, -1}, { 2, 0, 1, 4, 5, 3, -1, -1, -1}, { 2, 3, 0, 1, 5, 6, 4, -1, -1}, { 2, 0, 1, 3, 4, 5, 6, -1, -1}, { 0, 5, 3, 4, 1, 2, 6, -1, -1}, { 3, 2, 4, 0, 1, 6, 7, 5, -1}, { 4, 5, 0, 1, 7, 2, 8, 3, 6}, { 3, 2, 4, 0, 1, 5, 8, 7, 6}, }
Definition at line 208 of file dca.c.
Referenced by dca_decode_frame().
const int64_t dca_core_channel_layout[] [static] |
Initial value:
{ AV_CH_FRONT_CENTER, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER, AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER, AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER|AV_CH_BACK_CENTER, AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT, AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT, AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER, AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT|AV_CH_FRONT_CENTER|AV_CH_BACK_CENTER, AV_CH_FRONT_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_BACK_CENTER|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT, AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER|AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT, AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER|AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT, AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER|AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_BACK_CENTER|AV_CH_SIDE_RIGHT, }
Definition at line 128 of file dca.c.
Referenced by dca_decode_frame().
const int dca_ext_audio_descr_mask[] [static] |
Initial value:
{ DCA_EXT_XCH, -1, DCA_EXT_X96, DCA_EXT_XCH | DCA_EXT_X96, -1, -1, DCA_EXT_XXCH, -1, }
Definition at line 104 of file dca.c.
Referenced by dca_decode_frame().
const int8_t dca_lfe_index[] [static] |
Initial value:
{ 1,2,2,2,2,3,2,3,2,3,2,3,1,3,2,3 }
Definition at line 147 of file dca.c.
Referenced by dca_filter_channels(), and encode_init().
BitAlloc dca_scalefactor [static] |
BitAlloc dca_smpl_bitalloc[11] [static] |
const uint16_t dca_vlc_offs[] [static] |
Initial value:
{ 0, 512, 640, 768, 1282, 1794, 2436, 3080, 3770, 4454, 5364, 5372, 5380, 5388, 5392, 5396, 5412, 5420, 5428, 5460, 5492, 5508, 5572, 5604, 5668, 5796, 5860, 5892, 6412, 6668, 6796, 7308, 7564, 7820, 8076, 8620, 9132, 9388, 9910, 10166, 10680, 11196, 11726, 12240, 12752, 13298, 13810, 14326, 14840, 15500, 16022, 16540, 17158, 17678, 18264, 18796, 19352, 19926, 20468, 21472, 22398, 23014, 23622, }
Definition at line 368 of file dca.c.
Referenced by dca_init_vlcs().
Initial value:
{ .name = "dca", .type = AVMEDIA_TYPE_AUDIO, .id = CODEC_ID_DTS, .priv_data_size = sizeof(DCAContext), .init = dca_decode_init, .decode = dca_decode_frame, .close = dca_decode_end, .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"), .capabilities = CODEC_CAP_CHANNEL_CONF, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, .profiles = NULL_IF_CONFIG_SMALL(profiles), }
Initial value:
{ { 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_UNKNOWN }, }