libavcodec/qdm2.c File Reference

QDM2 decoder. More...

#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include "avcodec.h"
#include "get_bits.h"
#include "dsputil.h"
#include "fft.h"
#include "mpegaudio.h"
#include "qdm2data.h"
#include "qdm2_tablegen.h"
#include <assert.h>

Go to the source code of this file.

Data Structures

struct  QDM2SubPacket
 Subpacket. More...
struct  QDM2SubPNode
 A node in the subpacket list. More...
struct  QDM2Complex
struct  FFTTone
struct  FFTCoefficient
struct  QDM2FFT
struct  QDM2Context
 QDM2 decoder context. More...

Defines

#define ALT_BITSTREAM_READER_LE
#define QDM2_LIST_ADD(list, size, packet)
#define QDM2_SB_USED(sub_sampling)   (((sub_sampling) >= 2) ? 30 : 8 << (sub_sampling))
#define FIX_NOISE_IDX(noise_idx)
#define SB_DITHERING_NOISE(sb, noise_idx)   (noise_table[(noise_idx)++] * sb_noise_attenuation[(sb)])
#define BITS_LEFT(length, gb)   ((length) - get_bits_count ((gb)))
#define SAMPLES_NEEDED   av_log (NULL,AV_LOG_INFO,"This file triggers some untested code. Please contact the developers.\n");
#define SAMPLES_NEEDED_2(why)   av_log (NULL,AV_LOG_INFO,"This file triggers some missing code. Please contact the developers.\nPosition: %s\n",why);
#define QDM2_MAX_FRAME_SIZE   512

Typedefs

typedef int8_t sb_int8_array [2][30][64]

Functions

static av_cold void qdm2_init_vlc (void)
static int qdm2_get_vlc (GetBitContext *gb, VLC *vlc, int flag, int depth)
static int qdm2_get_se_vlc (VLC *vlc, GetBitContext *gb, int depth)
static uint16_t qdm2_packet_checksum (const uint8_t *data, int length, int value)
 QDM2 checksum.
static void qdm2_decode_sub_packet_header (GetBitContext *gb, QDM2SubPacket *sub_packet)
 Fills a QDM2SubPacket structure with packet type, size, and data pointer.
static QDM2SubPNodeqdm2_search_subpacket_type_in_list (QDM2SubPNode *list, int type)
 Return node pointer to first packet of requested type in list.
static void average_quantized_coeffs (QDM2Context *q)
 Replaces 8 elements with their average value.
static void build_sb_samples_from_noise (QDM2Context *q, int sb)
 Build subband samples with noise weighted by q->tone_level.
static void fix_coding_method_array (int sb, int channels, sb_int8_array coding_method)
 Called while processing data from subpackets 11 and 12.
static void fill_tone_level_array (QDM2Context *q, int flag)
 Related to synthesis filter Called by process_subpacket_10.
static void fill_coding_method_array (sb_int8_array tone_level_idx, sb_int8_array tone_level_idx_temp, sb_int8_array coding_method, int nb_channels, int c, int superblocktype_2_3, int cm_table_select)
 Related to synthesis filter Called by process_subpacket_11 c is built with data from subpacket 11 Most of this function is used only if superblock_type_2_3 == 0, never seen it in samples.
static void synthfilt_build_sb_samples (QDM2Context *q, GetBitContext *gb, int length, int sb_min, int sb_max)
 Called by process_subpacket_11 to process more data from subpacket 11 with sb 0-8 Called by process_subpacket_12 to process data from subpacket 12 with sb 8-sb_used.
static void init_quantized_coeffs_elem0 (int8_t *quantized_coeffs, GetBitContext *gb, int length)
 Init the first element of a channel in quantized_coeffs with data from packet 10 (quantized_coeffs[ch][0]).
static void init_tone_level_dequantization (QDM2Context *q, GetBitContext *gb, int length)
 Related to synthesis filter, process data from packet 10 Init part of quantized_coeffs via function init_quantized_coeffs_elem0 Init tone_level_idx_hi1, tone_level_idx_hi2, tone_level_idx_mid with data from packet 10.
static void process_subpacket_9 (QDM2Context *q, QDM2SubPNode *node)
 Process subpacket 9, init quantized_coeffs with data from it.
static void process_subpacket_10 (QDM2Context *q, QDM2SubPNode *node, int length)
 Process subpacket 10 if not null, else.
static void process_subpacket_11 (QDM2Context *q, QDM2SubPNode *node, int length)
 Process subpacket 11.
static void process_subpacket_12 (QDM2Context *q, QDM2SubPNode *node, int length)
 Process subpacket 12.
static void process_synthesis_subpackets (QDM2Context *q, QDM2SubPNode *list)
static void qdm2_decode_super_block (QDM2Context *q)
static void qdm2_fft_init_coefficient (QDM2Context *q, int sub_packet, int offset, int duration, int channel, int exp, int phase)
static void qdm2_fft_decode_tones (QDM2Context *q, int duration, GetBitContext *gb, int b)
static void qdm2_decode_fft_packets (QDM2Context *q)
static void qdm2_fft_generate_tone (QDM2Context *q, FFTTone *tone)
static void qdm2_fft_tone_synthesizer (QDM2Context *q, int sub_packet)
static void qdm2_calculate_fft (QDM2Context *q, int channel, int sub_packet)
static void qdm2_synthesis_filter (QDM2Context *q, int index)
static av_cold void qdm2_init (QDM2Context *q)
 Init static data (does not depend on specific file).
static av_cold int qdm2_decode_init (AVCodecContext *avctx)
 Init parameters from codec extradata.
static av_cold int qdm2_decode_close (AVCodecContext *avctx)
static int qdm2_decode (QDM2Context *q, const uint8_t *in, int16_t *out)
static int qdm2_decode_frame (AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)

Variables

static uint8_t empty_buffer [FF_INPUT_BUFFER_PADDING_SIZE]
static VLC vlc_tab_level
static VLC vlc_tab_diff
static VLC vlc_tab_run
static VLC fft_level_exp_alt_vlc
static VLC fft_level_exp_vlc
static VLC fft_stereo_exp_vlc
static VLC fft_stereo_phase_vlc
static VLC vlc_tab_tone_level_idx_hi1
static VLC vlc_tab_tone_level_idx_mid
static VLC vlc_tab_tone_level_idx_hi2
static VLC vlc_tab_type30
static VLC vlc_tab_type34
static VLC vlc_tab_fft_tone_offset [5]
static const uint16_t qdm2_vlc_offs []
static const float f2i_scale = (float) (1 << (FRAC_BITS - 15))
AVCodec qdm2_decoder


Detailed Description

QDM2 decoder.

Author:
Ewald Snel, Benjamin Larsson, Alex Beregszaszi, Roberto Togni The decoder is not perfect yet, there are still some distortions especially on files encoded with 16 or 8 subbands.

Definition in file qdm2.c.


Define Documentation

#define ALT_BITSTREAM_READER_LE

Definition at line 37 of file qdm2.c.

#define BITS_LEFT ( length,
gb   )     ((length) - get_bits_count ((gb)))

#define FIX_NOISE_IDX ( noise_idx   ) 

Value:

if ((noise_idx) >= 3840) \
    (noise_idx) -= 3840; \

Definition at line 64 of file qdm2.c.

Referenced by build_sb_samples_from_noise(), and synthfilt_build_sb_samples().

#define QDM2_LIST_ADD ( list,
size,
packet   ) 

Value:

do { \
      if (size > 0) { \
    list[size - 1].next = &list[size]; \
      } \
      list[size].packet = packet; \
      list[size].next = NULL; \
      size++; \
} while(0)

Definition at line 51 of file qdm2.c.

Referenced by qdm2_decode_super_block().

#define QDM2_MAX_FRAME_SIZE   512

Definition at line 78 of file qdm2.c.

Referenced by qdm2_decode_init().

#define QDM2_SB_USED ( sub_sampling   )     (((sub_sampling) >= 2) ? 30 : 8 << (sub_sampling))

#define SAMPLES_NEEDED   av_log (NULL,AV_LOG_INFO,"This file triggers some untested code. Please contact the developers.\n");

Definition at line 72 of file qdm2.c.

Referenced by fill_coding_method_array(), and fix_coding_method_array().

#define SAMPLES_NEEDED_2 ( why   )     av_log (NULL,AV_LOG_INFO,"This file triggers some missing code. Please contact the developers.\nPosition: %s\n",why);

Definition at line 75 of file qdm2.c.

Referenced by qdm2_decode(), and qdm2_decode_super_block().

#define SB_DITHERING_NOISE ( sb,
noise_idx   )     (noise_table[(noise_idx)++] * sb_noise_attenuation[(sb)])

Definition at line 68 of file qdm2.c.

Referenced by build_sb_samples_from_noise(), and synthfilt_build_sb_samples().


Typedef Documentation

typedef int8_t sb_int8_array[2][30][64]

Definition at line 80 of file qdm2.c.


Function Documentation

static void average_quantized_coeffs ( QDM2Context q  )  [static]

Replaces 8 elements with their average value.

Called by qdm2_decode_superblock before starting subblock decoding.

Parameters:
q context

Definition at line 445 of file qdm2.c.

Referenced by qdm2_decode_super_block().

static void build_sb_samples_from_noise ( QDM2Context q,
int  sb 
) [static]

Build subband samples with noise weighted by q->tone_level.

Called by synthfilt_build_sb_samples.

Parameters:
q context
sb subband index

Definition at line 475 of file qdm2.c.

Referenced by synthfilt_build_sb_samples().

static void fill_coding_method_array ( sb_int8_array  tone_level_idx,
sb_int8_array  tone_level_idx_temp,
sb_int8_array  coding_method,
int  nb_channels,
int  c,
int  superblocktype_2_3,
int  cm_table_select 
) [static]

Related to synthesis filter Called by process_subpacket_11 c is built with data from subpacket 11 Most of this function is used only if superblock_type_2_3 == 0, never seen it in samples.

Parameters:
tone_level_idx 
tone_level_idx_temp 
coding_method q->coding_method[0][0][0]
nb_channels number of channels
c coming from subpacket 11, passed as 8*c
superblocktype_2_3 flag based on superblock packet type
cm_table_select q->cm_table_select

Definition at line 640 of file qdm2.c.

Referenced by process_subpacket_11().

static void fill_tone_level_array ( QDM2Context q,
int  flag 
) [static]

Related to synthesis filter Called by process_subpacket_10.

Parameters:
q context
flag 1 if called after getting data from subpacket 10, 0 if no subpacket 10

Definition at line 545 of file qdm2.c.

Referenced by process_subpacket_10().

static void fix_coding_method_array ( int  sb,
int  channels,
sb_int8_array  coding_method 
) [static]

Called while processing data from subpackets 11 and 12.

Used after making changes to coding_method array.

Parameters:
sb subband index
channels number of channels
coding_method q->coding_method[0][0][0]

Definition at line 500 of file qdm2.c.

Referenced by fill_coding_method_array(), and synthfilt_build_sb_samples().

static void init_quantized_coeffs_elem0 ( int8_t *  quantized_coeffs,
GetBitContext gb,
int  length 
) [static]

Init the first element of a channel in quantized_coeffs with data from packet 10 (quantized_coeffs[ch][0]).

This is similar to process_subpacket_9, but for a single channel and for element [0] same VLC tables as process_subpacket_9 are used.

Parameters:
q context
quantized_coeffs pointer to quantized_coeffs[ch][0]
gb bitreader context
length packet length in bits

Definition at line 959 of file qdm2.c.

Referenced by init_tone_level_dequantization().

static void init_tone_level_dequantization ( QDM2Context q,
GetBitContext gb,
int  length 
) [static]

Related to synthesis filter, process data from packet 10 Init part of quantized_coeffs via function init_quantized_coeffs_elem0 Init tone_level_idx_hi1, tone_level_idx_hi2, tone_level_idx_mid with data from packet 10.

Parameters:
q context
gb bitreader context
length packet length in bits

Definition at line 996 of file qdm2.c.

Referenced by process_subpacket_10().

static void process_subpacket_10 ( QDM2Context q,
QDM2SubPNode node,
int  length 
) [static]

Process subpacket 10 if not null, else.

Parameters:
q context
node pointer to node with packet
length packet length in bits

Definition at line 1098 of file qdm2.c.

Referenced by process_synthesis_subpackets(), and qdm2_decode_super_block().

static void process_subpacket_11 ( QDM2Context q,
QDM2SubPNode node,
int  length 
) [static]

Process subpacket 11.

Parameters:
q context
node pointer to node with packet
length packet length in bit

Definition at line 1120 of file qdm2.c.

Referenced by process_synthesis_subpackets(), and qdm2_decode_super_block().

static void process_subpacket_12 ( QDM2Context q,
QDM2SubPNode node,
int  length 
) [static]

Process subpacket 12.

Parameters:
q context
node pointer to node with packet
length packet length in bits

Definition at line 1144 of file qdm2.c.

Referenced by process_synthesis_subpackets(), and qdm2_decode_super_block().

static void process_subpacket_9 ( QDM2Context q,
QDM2SubPNode node 
) [static]

Process subpacket 9, init quantized_coeffs with data from it.

Parameters:
q context
node pointer to node with packet

Definition at line 1059 of file qdm2.c.

Referenced by process_synthesis_subpackets().

static void process_synthesis_subpackets ( QDM2Context q,
QDM2SubPNode list 
) [static]

Definition at line 1158 of file qdm2.c.

Referenced by qdm2_decode_super_block().

static void qdm2_calculate_fft ( QDM2Context q,
int  channel,
int  sub_packet 
) [static]

Definition at line 1596 of file qdm2.c.

Referenced by qdm2_decode().

static int qdm2_decode ( QDM2Context q,
const uint8_t *  in,
int16_t *  out 
) [static]

Definition at line 1901 of file qdm2.c.

Referenced by qdm2_decode_frame().

static av_cold int qdm2_decode_close ( AVCodecContext avctx  )  [static]

Definition at line 1891 of file qdm2.c.

static void qdm2_decode_fft_packets ( QDM2Context q  )  [static]

Definition at line 1406 of file qdm2.c.

Referenced by qdm2_decode().

static int qdm2_decode_frame ( AVCodecContext avctx,
void *  data,
int *  data_size,
AVPacket avpkt 
) [static]

Definition at line 1963 of file qdm2.c.

static av_cold int qdm2_decode_init ( AVCodecContext avctx  )  [static]

Init parameters from codec extradata.

Definition at line 1718 of file qdm2.c.

static void qdm2_decode_sub_packet_header ( GetBitContext gb,
QDM2SubPacket sub_packet 
) [static]

Fills a QDM2SubPacket structure with packet type, size, and data pointer.

Parameters:
gb bitreader context
sub_packet packet under analysis

Definition at line 394 of file qdm2.c.

Referenced by qdm2_decode_super_block().

static void qdm2_decode_super_block ( QDM2Context q  )  [static]

Definition at line 1191 of file qdm2.c.

Referenced by qdm2_decode().

static void qdm2_fft_decode_tones ( QDM2Context q,
int  duration,
GetBitContext gb,
int  b 
) [static]

Definition at line 1327 of file qdm2.c.

Referenced by qdm2_decode_fft_packets().

static void qdm2_fft_generate_tone ( QDM2Context q,
FFTTone tone 
) [static]

Definition at line 1479 of file qdm2.c.

Referenced by qdm2_fft_tone_synthesizer().

static void qdm2_fft_init_coefficient ( QDM2Context q,
int  sub_packet,
int  offset,
int  duration,
int  channel,
int  exp,
int  phase 
) [static]

Definition at line 1311 of file qdm2.c.

Referenced by qdm2_fft_decode_tones().

static void qdm2_fft_tone_synthesizer ( QDM2Context q,
int  sub_packet 
) [static]

Definition at line 1524 of file qdm2.c.

Referenced by qdm2_decode().

static int qdm2_get_se_vlc ( VLC vlc,
GetBitContext gb,
int  depth 
) [static]

Definition at line 361 of file qdm2.c.

Referenced by init_quantized_coeffs_elem0(), and process_subpacket_9().

static int qdm2_get_vlc ( GetBitContext gb,
VLC vlc,
int  flag,
int  depth 
) [static]

static av_cold void qdm2_init ( QDM2Context q  )  [static]

Init static data (does not depend on specific file).

Parameters:
q context

Definition at line 1652 of file qdm2.c.

Referenced by qdm2_decode_init().

static av_cold void qdm2_init_vlc ( void   )  [static]

Definition at line 219 of file qdm2.c.

Referenced by qdm2_init().

static uint16_t qdm2_packet_checksum ( const uint8_t *  data,
int  length,
int  value 
) [static]

QDM2 checksum.

Parameters:
data pointer to data to be checksum'ed
length data length
value checksum value
Returns:
0 if checksum is OK

Definition at line 378 of file qdm2.c.

Referenced by qdm2_decode_super_block().

static QDM2SubPNode* qdm2_search_subpacket_type_in_list ( QDM2SubPNode list,
int  type 
) [static]

Return node pointer to first packet of requested type in list.

Parameters:
list list of subpackets to be scanned
type type of searched subpacket
Returns:
node pointer for subpacket if found, else NULL

Definition at line 428 of file qdm2.c.

Referenced by process_synthesis_subpackets().

static void qdm2_synthesis_filter ( QDM2Context q,
int  index 
) [static]

Parameters:
q context
index subpacket number

Definition at line 1613 of file qdm2.c.

Referenced by qdm2_decode().

static void synthfilt_build_sb_samples ( QDM2Context q,
GetBitContext gb,
int  length,
int  sb_min,
int  sb_max 
) [static]

Called by process_subpacket_11 to process more data from subpacket 11 with sb 0-8 Called by process_subpacket_12 to process data from subpacket 12 with sb 8-sb_used.

Parameters:
q context
gb bitreader context
length packet length in bits
sb_min lower subband processed (sb_min included)
sb_max higher subband processed (sb_max excluded)

Definition at line 768 of file qdm2.c.

Referenced by process_subpacket_11(), and process_subpacket_12().


Variable Documentation

uint8_t empty_buffer[FF_INPUT_BUFFER_PADDING_SIZE] [static]

Definition at line 199 of file qdm2.c.

Referenced by process_subpacket_10(), process_subpacket_11(), and process_subpacket_12().

const float f2i_scale = (float) (1 << (FRAC_BITS - 15)) [static]

Definition at line 335 of file qdm2.c.

Referenced by build_sb_samples_from_noise(), and synthfilt_build_sb_samples().

Definition at line 204 of file qdm2.c.

Definition at line 205 of file qdm2.c.

Definition at line 206 of file qdm2.c.

Definition at line 207 of file qdm2.c.

Initial value:

{
    .name = "qdm2",
    .type = AVMEDIA_TYPE_AUDIO,
    .id = CODEC_ID_QDM2,
    .priv_data_size = sizeof(QDM2Context),
    .init = qdm2_decode_init,
    .close = qdm2_decode_close,
    .decode = qdm2_decode_frame,
    .long_name = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
}

Definition at line 1999 of file qdm2.c.

const uint16_t qdm2_vlc_offs[] [static]

Initial value:

 {
    0,260,566,598,894,1166,1230,1294,1678,1950,2214,2278,2310,2570,2834,3124,3448,3838,
}

Definition at line 215 of file qdm2.c.

Referenced by qdm2_init_vlc().

VLC vlc_tab_diff [static]

Definition at line 202 of file qdm2.c.

Definition at line 213 of file qdm2.c.

VLC vlc_tab_level [static]

Definition at line 201 of file qdm2.c.

VLC vlc_tab_run [static]

Definition at line 203 of file qdm2.c.

Definition at line 208 of file qdm2.c.

Definition at line 210 of file qdm2.c.

Definition at line 209 of file qdm2.c.

VLC vlc_tab_type30 [static]

Definition at line 211 of file qdm2.c.

VLC vlc_tab_type34 [static]

Definition at line 212 of file qdm2.c.


Generated on Fri Oct 26 02:36:53 2012 for FFmpeg by  doxygen 1.5.8