FFmpeg
|
QDM2 decoder. More...
#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include "libavutil/channel_layout.h"
#include "avcodec.h"
#include "get_bits.h"
#include "internal.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... | |
Macros | |
#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 | 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 int | 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 int | 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. | |
static int | init_quantized_coeffs_elem0 (int8_t *quantized_coeffs, GetBitContext *gb) |
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) |
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 int | 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) |
Process subpacket 10 if not null, else. | |
static void | process_subpacket_11 (QDM2Context *q, QDM2SubPNode *node) |
Process subpacket 11. | |
static void | process_subpacket_12 (QDM2Context *q, QDM2SubPNode *node) |
Process subpacket 12. | |
static void | process_synthesis_subpackets (QDM2Context *q, QDM2SubPNode *list) |
Process new subpackets for synthesis filter. | |
static void | qdm2_decode_super_block (QDM2Context *q) |
Decode superblock, fill packet lists. | |
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_static_data (AVCodec *codec) |
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 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 int | switchtable [23] |
AVCodec | ff_qdm2_decoder |
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 QDM2_LIST_ADD | ( | list, | |
size, | |||
packet | |||
) |
#define QDM2_SB_USED | ( | sub_sampling | ) | (((sub_sampling) >= 2) ? 30 : 8 << (sub_sampling)) |
Definition at line 65 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 FIX_NOISE_IDX | ( | noise_idx | ) |
Definition at line 67 of file qdm2.c.
Referenced by build_sb_samples_from_noise(), and synthfilt_build_sb_samples().
#define SB_DITHERING_NOISE | ( | sb, | |
noise_idx | |||
) | (noise_table[(noise_idx)++] * sb_noise_attenuation[(sb)]) |
Definition at line 71 of file qdm2.c.
Referenced by build_sb_samples_from_noise(), and synthfilt_build_sb_samples().
#define SAMPLES_NEEDED av_log (NULL,AV_LOG_INFO,"This file triggers some untested code. Please contact the developers.\n"); |
Definition at line 73 of file qdm2.c.
Referenced by 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 76 of file qdm2.c.
Referenced by qdm2_decode(), and qdm2_decode_super_block().
#define QDM2_MAX_FRAME_SIZE 512 |
Definition at line 79 of file qdm2.c.
Referenced by qdm2_decode_init().
Definition at line 223 of file qdm2.c.
Referenced by qdm2_init_static_data().
|
static |
Definition at line 366 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 |
Definition at line 395 of file qdm2.c.
Referenced by init_quantized_coeffs_elem0(), and process_subpacket_9().
|
static |
QDM2 checksum.
data | pointer to data to be checksum'ed |
length | data length |
value | checksum value |
Definition at line 411 of file qdm2.c.
Referenced by qdm2_decode_super_block().
|
static |
Fill a QDM2SubPacket structure with packet type, size, and data pointer.
gb | bitreader context |
sub_packet | packet under analysis |
Definition at line 427 of file qdm2.c.
Referenced by qdm2_decode_super_block().
|
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 462 of file qdm2.c.
Referenced by process_synthesis_subpackets().
|
static |
Replace 8 elements with their average value.
Called by qdm2_decode_superblock before starting subblock decoding.
q | context |
Definition at line 479 of file qdm2.c.
Referenced by qdm2_decode_super_block().
|
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 508 of file qdm2.c.
Referenced by synthfilt_build_sb_samples().
|
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 535 of file qdm2.c.
Referenced by fill_coding_method_array(), and synthfilt_build_sb_samples().
|
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 601 of file qdm2.c.
Referenced by process_subpacket_10().
|
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 690 of file qdm2.c.
Referenced by process_subpacket_11().
|
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 817 of file qdm2.c.
Referenced by process_subpacket_11(), and process_subpacket_12().
|
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 |
Definition at line 1033 of file qdm2.c.
Referenced by init_tone_level_dequantization().
|
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 |
Definition at line 1074 of file qdm2.c.
Referenced by process_subpacket_10().
|
static |
Process subpacket 9, init quantized_coeffs with data from it.
q | context |
node | pointer to node with packet |
Definition at line 1137 of file qdm2.c.
Referenced by process_synthesis_subpackets().
|
static |
Process subpacket 10 if not null, else.
q | context |
node | pointer to node with packet |
Definition at line 1179 of file qdm2.c.
Referenced by process_synthesis_subpackets(), and qdm2_decode_super_block().
|
static |
Process subpacket 11.
q | context |
node | pointer to node with packet |
Definition at line 1198 of file qdm2.c.
Referenced by process_synthesis_subpackets(), and qdm2_decode_super_block().
|
static |
Process subpacket 12.
q | context |
node | pointer to node with packet |
Definition at line 1227 of file qdm2.c.
Referenced by process_synthesis_subpackets(), and qdm2_decode_super_block().
|
static |
Process new subpackets for synthesis filter.
q | context |
list | list with synthesis filter packets (list D) |
Definition at line 1246 of file qdm2.c.
Referenced by qdm2_decode_super_block().
|
static |
Decode superblock, fill packet lists.
q | context |
Definition at line 1278 of file qdm2.c.
Referenced by qdm2_decode().
|
static |
Definition at line 1402 of file qdm2.c.
Referenced by qdm2_fft_decode_tones().
|
static |
Definition at line 1418 of file qdm2.c.
Referenced by qdm2_decode_fft_packets().
|
static |
Definition at line 1504 of file qdm2.c.
Referenced by qdm2_decode().
|
static |
Definition at line 1578 of file qdm2.c.
Referenced by qdm2_fft_tone_synthesizer().
|
static |
Definition at line 1624 of file qdm2.c.
Referenced by qdm2_decode().
|
static |
Definition at line 1695 of file qdm2.c.
Referenced by qdm2_decode().
|
static |
q | context |
index | subpacket number |
Definition at line 1715 of file qdm2.c.
Referenced by qdm2_decode().
|
static |
|
static |
|
static |
Definition at line 1946 of file qdm2.c.
Referenced by qdm2_decode_frame().
|
static |
|
static |
Definition at line 215 of file qdm2.c.
Referenced by qdm2_init_vlc().
|
static |
Definition at line 219 of file qdm2.c.
Referenced by fix_coding_method_array().
AVCodec ff_qdm2_decoder |