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 "rdft.h"
#include "mpegaudiodsp.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 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)
 Fill 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)
 Replace 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 *got_frame_ptr, 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 []
AVCodec ff_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 BITS_LEFT ( length,
gb   )     ((length) - get_bits_count ((gb)))

#define BITSTREAM_READER_LE

Definition at line 38 of file qdm2.c.

#define FIX_NOISE_IDX ( noise_idx   ) 

Value:

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

Definition at line 66 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 53 of file qdm2.c.

Referenced by qdm2_decode_super_block().

#define QDM2_MAX_FRAME_SIZE   512

Definition at line 80 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 74 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 77 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 70 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 82 of file qdm2.c.


Function Documentation

static void average_quantized_coeffs ( QDM2Context q  )  [static]

Replace 8 elements with their average value.

Called by qdm2_decode_superblock before starting subblock decoding.

Parameters:
q context

Definition at line 446 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 476 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 641 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 546 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 501 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:
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 1597 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 1911 of file qdm2.c.

Referenced by qdm2_decode_frame().

static av_cold int qdm2_decode_close ( AVCodecContext avctx  )  [static]

Definition at line 1901 of file qdm2.c.

static void qdm2_decode_fft_packets ( QDM2Context q  )  [static]

Definition at line 1407 of file qdm2.c.

Referenced by qdm2_decode().

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

Definition at line 1976 of file qdm2.c.

static av_cold int qdm2_decode_init ( AVCodecContext avctx  )  [static]

Init parameters from codec extradata.

Definition at line 1719 of file qdm2.c.

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

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

Parameters:
gb bitreader context
sub_packet packet under analysis

Definition at line 395 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 1328 of file qdm2.c.

Referenced by qdm2_decode_fft_packets().

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

Definition at line 1480 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 1312 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 1525 of file qdm2.c.

Referenced by qdm2_decode().

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

Definition at line 362 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 1653 of file qdm2.c.

Referenced by qdm2_decode_init().

static av_cold void qdm2_init_vlc ( void   )  [static]

Definition at line 225 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 379 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 429 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 1614 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 769 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 205 of file qdm2.c.

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

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,
    .capabilities = CODEC_CAP_DR1,
    .long_name = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
}

Definition at line 2010 of file qdm2.c.

Definition at line 210 of file qdm2.c.

Definition at line 211 of file qdm2.c.

Definition at line 212 of file qdm2.c.

Definition at line 213 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 221 of file qdm2.c.

Referenced by qdm2_init_vlc().

VLC vlc_tab_diff [static]

Definition at line 208 of file qdm2.c.

Definition at line 219 of file qdm2.c.

VLC vlc_tab_level [static]

Definition at line 207 of file qdm2.c.

VLC vlc_tab_run [static]

Definition at line 209 of file qdm2.c.

Definition at line 214 of file qdm2.c.

Definition at line 216 of file qdm2.c.

Definition at line 215 of file qdm2.c.

VLC vlc_tab_type30 [static]

Definition at line 217 of file qdm2.c.

VLC vlc_tab_type34 [static]

Definition at line 218 of file qdm2.c.


Generated on Fri Oct 26 02:46:10 2012 for FFmpeg by  doxygen 1.5.8