#include "qdm2data.h"
#include "qdm2_tablegen.h"
-#undef NDEBUG
-#include <assert.h>
-
#define QDM2_LIST_ADD(list, size, packet) \
do { \
/**
* Subpacket
*/
-typedef struct {
+typedef struct QDM2SubPacket {
int type; ///< subpacket type
unsigned int size; ///< subpacket size
const uint8_t *data; ///< pointer to subpacket data (points to input data buffer, it's not a private copy)
struct QDM2SubPNode *next; ///< pointer to next packet in the list, NULL if leaf node
} QDM2SubPNode;
-typedef struct {
+typedef struct QDM2Complex {
float re;
float im;
} QDM2Complex;
-typedef struct {
+typedef struct FFTTone {
float level;
QDM2Complex *complex;
const float *table;
short cutoff;
} FFTTone;
-typedef struct {
+typedef struct FFTCoefficient {
int16_t sub_packet;
uint8_t channel;
int16_t offset;
uint8_t phase;
} FFTCoefficient;
-typedef struct {
+typedef struct QDM2FFT {
DECLARE_ALIGNED(32, QDM2Complex, complex)[MPA_MAX_CHANNELS][256];
} QDM2FFT;
/**
* QDM2 decoder context
*/
-typedef struct {
+typedef struct QDM2Context {
/// Parameters from codec header, do not change during playback
int nb_channels; ///< number of channels
int channels; ///< number of channels
/**
* QDM2 checksum
*
- * @param data pointer to data to be checksum'ed
+ * @param data pointer to data to be checksummed
* @param length data length
* @param value checksum value
*
static QDM2SubPNode *qdm2_search_subpacket_type_in_list(QDM2SubPNode *list,
int type)
{
- while (list != NULL && list->packet != NULL) {
+ while (list && list->packet) {
if (list->packet->type == type)
return list;
list = list->next;
for (j = 0; j < 64; j++)
acc += tone_level_idx_temp[ch][sb][j];
- multres = 0x66666667 * (acc * 10);
+ multres = 0x66666667LL * (acc * 10);
esp_40 = (multres >> 32) / 8 + ((multres & 0xffffffff) >> 31);
for (ch = 0; ch < nb_channels; ch++)
for (sb = 0; sb < 30; sb++)
}
/**
- *
* 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
if (length == 0) {
// If no data use noise
for (sb=sb_min; sb < sb_max; sb++)
- build_sb_samples_from_noise (q, sb);
+ build_sb_samples_from_noise(q, sb);
return;
}
else if (sb >= 24)
joined_stereo = 1;
else
- joined_stereo = (get_bits_left(gb) >= 1) ? get_bits1 (gb) : 0;
+ joined_stereo = (get_bits_left(gb) >= 1) ? get_bits1(gb) : 0;
if (joined_stereo) {
if (get_bits_left(gb) >= 16)
for (j = 0; j < 16; j++)
- sign_bits[j] = get_bits1 (gb);
+ sign_bits[j] = get_bits1(gb);
for (j = 0; j < 64; j++)
if (q->coding_method[1][sb][j] > q->coding_method[0][sb][j])
* @param q context
* @param gb bitreader context
*/
-static void init_tone_level_dequantization (QDM2Context *q, GetBitContext *gb)
+static void init_tone_level_dequantization(QDM2Context *q, GetBitContext *gb)
{
int sb, j, k, n, ch;
QDM2SubPNode *nodes[4];
nodes[0] = qdm2_search_subpacket_type_in_list(list, 9);
- if (nodes[0] != NULL)
+ if (nodes[0])
process_subpacket_9(q, nodes[0]);
nodes[1] = qdm2_search_subpacket_type_in_list(list, 10);
- if (nodes[1] != NULL)
+ if (nodes[1])
process_subpacket_10(q, nodes[1]);
else
process_subpacket_10(q, NULL);
nodes[2] = qdm2_search_subpacket_type_in_list(list, 11);
- if (nodes[0] != NULL && nodes[1] != NULL && nodes[2] != NULL)
+ if (nodes[0] && nodes[1] && nodes[2])
process_subpacket_11(q, nodes[2]);
else
process_subpacket_11(q, NULL);
nodes[3] = qdm2_search_subpacket_type_in_list(list, 12);
- if (nodes[0] != NULL && nodes[1] != NULL && nodes[3] != NULL)
+ if (nodes[0] && nodes[1] && nodes[3])
process_subpacket_12(q, nodes[3]);
else
process_subpacket_12(q, NULL);
}
} // Packet bytes loop
- if (q->sub_packet_list_D[0].packet != NULL) {
+ if (q->sub_packet_list_D[0].packet) {
process_synthesis_subpackets(q, q->sub_packet_list_D);
q->do_synth_filter = 1;
} else if (q->do_synth_filter) {
int i, j, min, max, value, type, unknown_flag;
GetBitContext gb;
- if (q->sub_packet_list_B[0].packet == NULL)
+ if (!q->sub_packet_list_B[0].packet)
return;
/* reset minimum indexes for FFT coefficients */
if (!avctx->extradata || (avctx->extradata_size < 48)) {
av_log(avctx, AV_LOG_ERROR, "extradata missing or truncated\n");
- return -1;
+ return AVERROR_INVALIDDATA;
}
extradata = avctx->extradata;
if (extradata_size < 12) {
av_log(avctx, AV_LOG_ERROR, "not enough extradata (%i)\n",
extradata_size);
- return -1;
+ return AVERROR_INVALIDDATA;
}
if (memcmp(extradata, "frmaQDM", 7)) {
av_log(avctx, AV_LOG_ERROR, "invalid headers, QDM? not found\n");
- return -1;
+ return AVERROR_INVALIDDATA;
}
if (extradata[7] == 'C') {
// s->is_qdmc = 1;
- av_log(avctx, AV_LOG_ERROR, "stream is QDMC version 1, which is not supported\n");
- return -1;
+ avpriv_report_missing_feature(avctx, "QDMC version 1");
+ return AVERROR_PATCHWELCOME;
}
extradata += 8;
if(size > extradata_size){
av_log(avctx, AV_LOG_ERROR, "extradata size too small, %i < %i\n",
extradata_size, size);
- return -1;
+ return AVERROR_INVALIDDATA;
}
extradata += 4;
av_log(avctx, AV_LOG_DEBUG, "size: %d\n", size);
if (AV_RB32(extradata) != MKBETAG('Q','D','C','A')) {
av_log(avctx, AV_LOG_ERROR, "invalid extradata, expecting QDCA\n");
- return -1;
+ return AVERROR_INVALIDDATA;
}
extradata += 8;
// Fail on unknown fft order
if ((s->fft_order < 7) || (s->fft_order > 9)) {
- av_log(avctx, AV_LOG_ERROR, "Unknown FFT order (%d), contact the developers!\n", s->fft_order);
- return -1;
+ avpriv_request_sample(avctx, "Unknown FFT order %d", s->fft_order);
+ return AVERROR_PATCHWELCOME;
}
if (s->fft_size != (1 << (s->fft_order - 1))) {
av_log(avctx, AV_LOG_ERROR, "FFT size %d not power of 2.\n", s->fft_size);
for (ch = 0; ch < q->channels; ch++) {
qdm2_calculate_fft(q, ch, q->sub_packet);
- if (!q->has_errors && q->sub_packet_list_C[0].packet != NULL) {
+ if (!q->has_errors && q->sub_packet_list_C[0].packet) {
SAMPLES_NEEDED_2("has errors, and C list is not empty")
return -1;
}
q->sub_packet = (q->sub_packet + 1) % 16;
- /* clip and convert output float[] to 16bit signed samples */
+ /* clip and convert output float[] to 16-bit signed samples */
for (i = 0; i < frame_size; i++) {
int value = (int)q->output_buffer[i];
out = (int16_t *)frame->data[0];
for (i = 0; i < 16; i++) {
- if (qdm2_decode(s, buf, out) < 0)
- return -1;
+ if ((ret = qdm2_decode(s, buf, out)) < 0)
+ return ret;
out += s->channels * s->frame_size;
}
AVCodec ff_qdm2_decoder = {
.name = "qdm2",
+ .long_name = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
.type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_QDM2,
.priv_data_size = sizeof(QDM2Context),
.init_static_data = qdm2_init_static_data,
.close = qdm2_decode_close,
.decode = qdm2_decode_frame,
- .capabilities = CODEC_CAP_DR1,
- .long_name = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
+ .capabilities = AV_CODEC_CAP_DR1,
};