#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 QDM2SubPNode * | qdm2_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 |
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 BITS_LEFT | ( | length, | |||
gb | ) | ((length) - get_bits_count ((gb))) |
Definition at line 72 of file qdm2.c.
Referenced by init_quantized_coeffs_elem0(), init_tone_level_dequantization(), and synthfilt_build_sb_samples().
#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 | ) |
#define QDM2_MAX_FRAME_SIZE 512 |
#define QDM2_SB_USED | ( | sub_sampling | ) | (((sub_sampling) >= 2) ? 30 : 8 << (sub_sampling)) |
Definition at line 64 of file qdm2.c.
Referenced by average_quantized_coeffs(), fill_tone_level_array(), init_tone_level_dequantization(), process_subpacket_12(), process_subpacket_9(), and qdm2_synthesis_filter().
#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); |
#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 int8_t sb_int8_array[2][30][64] |
static void average_quantized_coeffs | ( | QDM2Context * | q | ) | [static] |
Replace 8 elements with their average value.
Called by qdm2_decode_superblock before starting subblock decoding.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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] |
static void qdm2_calculate_fft | ( | QDM2Context * | q, | |
int | channel, | |||
int | sub_packet | |||
) | [static] |
static int qdm2_decode | ( | QDM2Context * | q, | |
const uint8_t * | in, | |||
int16_t * | out | |||
) | [static] |
static av_cold int qdm2_decode_close | ( | AVCodecContext * | avctx | ) | [static] |
static void qdm2_decode_fft_packets | ( | QDM2Context * | q | ) | [static] |
static int qdm2_decode_frame | ( | AVCodecContext * | avctx, | |
void * | data, | |||
int * | got_frame_ptr, | |||
AVPacket * | avpkt | |||
) | [static] |
static av_cold int qdm2_decode_init | ( | AVCodecContext * | avctx | ) | [static] |
static void qdm2_decode_sub_packet_header | ( | GetBitContext * | gb, | |
QDM2SubPacket * | sub_packet | |||
) | [static] |
Fill a QDM2SubPacket structure with packet type, size, and data pointer.
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] |
static void qdm2_fft_decode_tones | ( | QDM2Context * | q, | |
int | duration, | |||
GetBitContext * | gb, | |||
int | b | |||
) | [static] |
static void qdm2_fft_generate_tone | ( | QDM2Context * | q, | |
FFTTone * | tone | |||
) | [static] |
static void qdm2_fft_init_coefficient | ( | QDM2Context * | q, | |
int | sub_packet, | |||
int | offset, | |||
int | duration, | |||
int | channel, | |||
int | exp, | |||
int | phase | |||
) | [static] |
static void qdm2_fft_tone_synthesizer | ( | QDM2Context * | q, | |
int | sub_packet | |||
) | [static] |
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] |
Definition at line 339 of file qdm2.c.
Referenced by init_quantized_coeffs_elem0(), init_tone_level_dequantization(), process_subpacket_9(), qdm2_decode_super_block(), qdm2_fft_decode_tones(), qdm2_get_se_vlc(), and synthfilt_build_sb_samples().
static av_cold void qdm2_init | ( | QDM2Context * | q | ) | [static] |
Init static data (does not depend on specific file).
q | context |
Definition at line 1653 of file qdm2.c.
Referenced by qdm2_decode_init().
static av_cold void qdm2_init_vlc | ( | void | ) | [static] |
static uint16_t qdm2_packet_checksum | ( | const uint8_t * | data, | |
int | length, | |||
int | value | |||
) | [static] |
QDM2 checksum.
data | pointer to data to be checksum'ed | |
length | data length | |
value | checksum value |
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.
list | list of subpackets to be scanned | |
type | type of searched subpacket |
Definition at line 429 of file qdm2.c.
Referenced by process_synthesis_subpackets().
static void qdm2_synthesis_filter | ( | QDM2Context * | q, | |
int | index | |||
) | [static] |
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.
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().
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"), }
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] |
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] |
VLC vlc_tab_fft_tone_offset[5] [static] |
VLC vlc_tab_level [static] |
VLC vlc_tab_run [static] |
VLC vlc_tab_tone_level_idx_hi1 [static] |
VLC vlc_tab_tone_level_idx_hi2 [static] |
VLC vlc_tab_tone_level_idx_mid [static] |
VLC vlc_tab_type30 [static] |
VLC vlc_tab_type34 [static] |