#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include "libavutil/lfg.h"
#include "libavutil/random_seed.h"
#include "avcodec.h"
#include "get_bits.h"
#include "dsputil.h"
#include "bytestream.h"
#include "fft.h"
#include "libavutil/audioconvert.h"
#include "sinewin.h"
#include "cookdata.h"
Go to the source code of this file.
Data Structures | |
struct | cook_gains |
struct | COOKSubpacket |
struct | cook |
Defines | |
#define | MONO 0x1000001 |
#define | STEREO 0x1000002 |
#define | JOINT_STEREO 0x1000003 |
#define | MC_COOK 0x2000000 |
#define | SUBBAND_SIZE 20 |
#define | MAX_SUBPACKETS 5 |
#define | DECODE_BYTES_PAD1(bytes) (3 - ((bytes)+3) % 4) |
#define | DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) |
Typedefs | |
typedef struct cook | COOKContext |
Functions | |
static av_cold void | init_pow2table (void) |
static av_cold void | init_gain_table (COOKContext *q) |
static av_cold int | init_cook_vlc_tables (COOKContext *q) |
static av_cold int | init_cook_mlt (COOKContext *q) |
static const float * | maybe_reformat_buffer32 (COOKContext *q, const float *ptr, int n) |
static av_cold void | init_cplscales_table (COOKContext *q) |
static int | decode_bytes (const uint8_t *inbuffer, uint8_t *out, int bytes) |
Cook indata decoding, every 32 bits are XORed with 0x37c511f2. | |
static av_cold int | cook_decode_close (AVCodecContext *avctx) |
Cook uninit. | |
static void | decode_gain_info (GetBitContext *gb, int *gaininfo) |
Fill the gain array for the timedomain quantization. | |
static void | decode_envelope (COOKContext *q, COOKSubpacket *p, int *quant_index_table) |
Create the quant index table needed for the envelope. | |
static void | categorize (COOKContext *q, COOKSubpacket *p, int *quant_index_table, int *category, int *category_index) |
Calculate the category and category_index vector. | |
static void | expand_category (COOKContext *q, int *category, int *category_index) |
Expand the category vector. | |
static void | scalar_dequant_float (COOKContext *q, int index, int quant_index, int *subband_coef_index, int *subband_coef_sign, float *mlt_p) |
The real requantization of the mltcoefs. | |
static int | unpack_SQVH (COOKContext *q, COOKSubpacket *p, int category, int *subband_coef_index, int *subband_coef_sign) |
Unpack the subband_coef_index and subband_coef_sign vectors. | |
static void | decode_vectors (COOKContext *q, COOKSubpacket *p, int *category, int *quant_index_table, float *mlt_buffer) |
Fill the mlt_buffer with mlt coefficients. | |
static void | mono_decode (COOKContext *q, COOKSubpacket *p, float *mlt_buffer) |
function for decoding mono data | |
static void | interpolate_float (COOKContext *q, float *buffer, int gain_index, int gain_index_next) |
the actual requantization of the timedomain samples | |
static void | imlt_window_float (COOKContext *q, float *inbuffer, cook_gains *gains_ptr, float *previous_buffer) |
Apply transform window, overlap buffers. | |
static void | imlt_gain (COOKContext *q, float *inbuffer, cook_gains *gains_ptr, float *previous_buffer) |
The modulated lapped transform, this takes transform coefficients and transforms them into timedomain samples. | |
static void | decouple_info (COOKContext *q, COOKSubpacket *p, int *decouple_tab) |
function for getting the jointstereo coupling information | |
static void | decouple_float (COOKContext *q, COOKSubpacket *p, int subband, float f1, float f2, float *decode_buffer, float *mlt_buffer1, float *mlt_buffer2) |
static void | joint_decode (COOKContext *q, COOKSubpacket *p, float *mlt_buffer1, float *mlt_buffer2) |
function for decoding joint stereo data | |
static void | decode_bytes_and_gain (COOKContext *q, COOKSubpacket *p, const uint8_t *inbuffer, cook_gains *gains_ptr) |
First part of subpacket decoding: decode raw stream bytes and read gain info. | |
static void | saturate_output_float (COOKContext *q, int chan, int16_t *out) |
Saturate the output signal to signed 16bit integers. | |
static void | mlt_compensate_output (COOKContext *q, float *decode_buffer, cook_gains *gains_ptr, float *previous_buffer, int16_t *out, int chan) |
Final part of subpacket decoding: Apply modulated lapped transform, gain compensation, clip and convert to integer. | |
static void | decode_subpacket (COOKContext *q, COOKSubpacket *p, const uint8_t *inbuffer, int16_t *outbuffer) |
Cook subpacket decoding. | |
static int | cook_decode_frame (AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) |
Cook frame decoding. | |
static av_cold int | cook_count_channels (unsigned int mask) |
static av_cold int | cook_decode_init (AVCodecContext *avctx) |
Cook initialization. | |
Variables | |
static float | pow2tab [127] |
static float | rootpow2tab [127] |
AVCodec | ff_cook_decoder |
Bastardization of the G.722.1 standard. This decoder handles RealNetworks, RealAudio G2 data. Cook is identified by the codec name cook in RM files.
To use this decoder, a calling application must supply the extradata bytes provided from the RM container; 8+ bytes for mono streams and 16+ for stereo streams (maybe more).
Codec technicalities (all this assume a buffer length of 1024): Cook works with several different techniques to achieve its compression. In the timedomain the buffer is divided into 8 pieces and quantized. If two neighboring pieces have different quantization index a smooth quantization curve is used to get a smooth overlap between the different pieces. To get to the transformdomain Cook uses a modulated lapped transform. The transform domain has 50 subbands with 20 elements each. This means only a maximum of 50*20=1000 coefficients are used out of the 1024 available.
Definition in file cook.c.
#define DECODE_BYTES_PAD1 | ( | bytes | ) | (3 - ((bytes)+3) % 4) |
#define DECODE_BYTES_PAD2 | ( | bytes | ) | ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) |
#define MAX_SUBPACKETS 5 |
#define MC_COOK 0x2000000 |
#define MONO 0x1000001 |
#define SUBBAND_SIZE 20 |
Definition at line 67 of file cook.c.
Referenced by decode_vectors(), decouple_float(), joint_decode(), and scalar_dequant_float().
typedef struct cook COOKContext |
static void categorize | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
int * | quant_index_table, | |||
int * | category, | |||
int * | category_index | |||
) | [static] |
Calculate the category and category_index vector.
q | pointer to the COOKContext | |
quant_index_table | pointer to the array | |
category | pointer to the category array | |
category_index | pointer to the category_index array |
Definition at line 395 of file cook.c.
Referenced by mono_decode().
static av_cold int cook_count_channels | ( | unsigned int | mask | ) | [static] |
static av_cold int cook_decode_close | ( | AVCodecContext * | avctx | ) | [static] |
static int cook_decode_frame | ( | AVCodecContext * | avctx, | |
void * | data, | |||
int * | data_size, | |||
AVPacket * | avpkt | |||
) | [static] |
static av_cold int cook_decode_init | ( | AVCodecContext * | avctx | ) | [static] |
static int decode_bytes | ( | const uint8_t * | inbuffer, | |
uint8_t * | out, | |||
int | bytes | |||
) | [inline, static] |
Cook indata decoding, every 32 bits are XORed with 0x37c511f2.
Why? No idea, some checksum/error detection method maybe.
Out buffer size: extra bytes are needed to cope with padding/misalignment. Subpackets passed to the decoder can contain two, consecutive half-subpackets, of identical but arbitrary size. 1234 1234 1234 1234 extraA extraB Case 1: AAAA BBBB 0 0 Case 2: AAAA ABBB BB-- 3 3 Case 3: AAAA AABB BBBB 2 2 Case 4: AAAA AAAB BBBB BB-- 1 5
Nice way to waste CPU cycles.
inbuffer | pointer to byte array of indata | |
out | pointer to byte array of outdata | |
bytes | number of bytes |
static void decode_bytes_and_gain | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
const uint8_t * | inbuffer, | |||
cook_gains * | gains_ptr | |||
) | [inline, static] |
First part of subpacket decoding: decode raw stream bytes and read gain info.
q | pointer to the COOKContext | |
inbuffer | pointer to raw stream data | |
gains_ptr | array of current/prev gain pointers |
Definition at line 854 of file cook.c.
Referenced by decode_subpacket().
static void decode_envelope | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
int * | quant_index_table | |||
) | [static] |
Create the quant index table needed for the envelope.
q | pointer to the COOKContext | |
quant_index_table | pointer to the array |
Definition at line 365 of file cook.c.
Referenced by mono_decode().
static void decode_gain_info | ( | GetBitContext * | gb, | |
int * | gaininfo | |||
) | [static] |
Fill the gain array for the timedomain quantization.
gb | pointer to the GetBitContext | |
gaininfo | array[9] of gain indexes |
Definition at line 341 of file cook.c.
Referenced by decode_bytes_and_gain().
static void decode_subpacket | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
const uint8_t * | inbuffer, | |||
int16_t * | outbuffer | |||
) | [static] |
Cook subpacket decoding.
This function returns one decoded subpacket, usually 1024 samples per channel.
q | pointer to the COOKContext | |
inbuffer | pointer to the inbuffer | |
outbuffer | pointer to the outbuffer |
Definition at line 920 of file cook.c.
Referenced by cook_decode_frame().
static void decode_vectors | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
int * | category, | |||
int * | quant_index_table, | |||
float * | mlt_buffer | |||
) | [static] |
Fill the mlt_buffer with mlt coefficients.
q | pointer to the COOKContext | |
category | pointer to the category array | |
quant_index_table | pointer to the array | |
mlt_buffer | pointer to mlt coefficients |
Definition at line 589 of file cook.c.
Referenced by mono_decode().
static void decouple_float | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
int | subband, | |||
float | f1, | |||
float | f2, | |||
float * | decode_buffer, | |||
float * | mlt_buffer1, | |||
float * | mlt_buffer2 | |||
) | [static] |
static void decouple_info | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
int * | decouple_tab | |||
) | [static] |
function for getting the jointstereo coupling information
q | pointer to the COOKContext | |
decouple_tab | decoupling array |
Definition at line 748 of file cook.c.
Referenced by joint_decode().
static void expand_category | ( | COOKContext * | q, | |
int * | category, | |||
int * | category_index | |||
) | [inline, static] |
Expand the category vector.
q | pointer to the COOKContext | |
category | pointer to the category array | |
category_index | pointer to the category_index array |
Definition at line 498 of file cook.c.
Referenced by mono_decode().
static void imlt_gain | ( | COOKContext * | q, | |
float * | inbuffer, | |||
cook_gains * | gains_ptr, | |||
float * | previous_buffer | |||
) | [static] |
The modulated lapped transform, this takes transform coefficients and transforms them into timedomain samples.
Apply transform window, overlap buffers, apply gain profile and buffer management.
q | pointer to the COOKContext | |
inbuffer | pointer to the mltcoefficients | |
gains_ptr | current and previous gains | |
previous_buffer | pointer to the previous buffer to be used for overlapping |
Definition at line 716 of file cook.c.
Referenced by mlt_compensate_output().
static void imlt_window_float | ( | COOKContext * | q, | |
float * | inbuffer, | |||
cook_gains * | gains_ptr, | |||
float * | previous_buffer | |||
) | [static] |
Apply transform window, overlap buffers.
q | pointer to the COOKContext | |
inbuffer | pointer to the mltcoefficients | |
gains_ptr | current and previous gains | |
previous_buffer | pointer to the previous buffer to be used for overlapping |
Definition at line 686 of file cook.c.
Referenced by cook_decode_init().
static av_cold int init_cook_mlt | ( | COOKContext * | q | ) | [static] |
static av_cold int init_cook_vlc_tables | ( | COOKContext * | q | ) | [static] |
static av_cold void init_cplscales_table | ( | COOKContext * | q | ) | [static] |
static av_cold void init_gain_table | ( | COOKContext * | q | ) | [static] |
static av_cold void init_pow2table | ( | void | ) | [static] |
static void interpolate_float | ( | COOKContext * | q, | |
float * | buffer, | |||
int | gain_index, | |||
int | gain_index_next | |||
) | [static] |
the actual requantization of the timedomain samples
q | pointer to the COOKContext | |
buffer | pointer to the timedomain buffer | |
gain_index | index for the block multiplier | |
gain_index_next | index for the next block multiplier |
Definition at line 656 of file cook.c.
Referenced by cook_decode_init().
static void joint_decode | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
float * | mlt_buffer1, | |||
float * | mlt_buffer2 | |||
) | [static] |
function for decoding joint stereo data
q | pointer to the COOKContext | |
mlt_buffer1 | pointer to left channel mlt coefficients | |
mlt_buffer2 | pointer to right channel mlt coefficients |
Definition at line 804 of file cook.c.
Referenced by decode_subpacket().
static const float* maybe_reformat_buffer32 | ( | COOKContext * | q, | |
const float * | ptr, | |||
int | n | |||
) | [static] |
static void mlt_compensate_output | ( | COOKContext * | q, | |
float * | decode_buffer, | |||
cook_gains * | gains_ptr, | |||
float * | previous_buffer, | |||
int16_t * | out, | |||
int | chan | |||
) | [inline, static] |
Final part of subpacket decoding: Apply modulated lapped transform, gain compensation, clip and convert to integer.
q | pointer to the COOKContext | |
decode_buffer | pointer to the mlt coefficients | |
gains_ptr | array of current/prev gain pointers | |
previous_buffer | pointer to the previous buffer to be used for overlapping | |
out | pointer to the output buffer | |
chan | 0: left or single channel, 1: right channel |
Definition at line 903 of file cook.c.
Referenced by decode_subpacket().
static void mono_decode | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
float * | mlt_buffer | |||
) | [static] |
function for decoding mono data
q | pointer to the COOKContext | |
mlt_buffer | pointer to mlt coefficients |
Definition at line 630 of file cook.c.
Referenced by decode_subpacket(), and joint_decode().
static void saturate_output_float | ( | COOKContext * | q, | |
int | chan, | |||
int16_t * | out | |||
) | [static] |
Saturate the output signal to signed 16bit integers.
q | pointer to the COOKContext | |
chan | channel to saturate | |
out | pointer to the output vector |
Definition at line 877 of file cook.c.
Referenced by cook_decode_init().
static void scalar_dequant_float | ( | COOKContext * | q, | |
int | index, | |||
int | quant_index, | |||
int * | subband_coef_index, | |||
int * | subband_coef_sign, | |||
float * | mlt_p | |||
) | [static] |
The real requantization of the mltcoefs.
q | pointer to the COOKContext | |
index | index | |
quant_index | quantisation index | |
subband_coef_index | array of indexes to quant_centroid_tab | |
subband_coef_sign | signs of coefficients | |
mlt_p | pointer into the mlt buffer |
Definition at line 517 of file cook.c.
Referenced by cook_decode_init().
static int unpack_SQVH | ( | COOKContext * | q, | |
COOKSubpacket * | p, | |||
int | category, | |||
int * | subband_coef_index, | |||
int * | subband_coef_sign | |||
) | [static] |
Unpack the subband_coef_index and subband_coef_sign vectors.
q | pointer to the COOKContext | |
category | pointer to the category array | |
subband_coef_index | array of indexes to quant_centroid_tab | |
subband_coef_sign | signs of coefficients |
Definition at line 544 of file cook.c.
Referenced by decode_vectors().
Initial value:
{ .name = "cook", .type = AVMEDIA_TYPE_AUDIO, .id = CODEC_ID_COOK, .priv_data_size = sizeof(COOKContext), .init = cook_decode_init, .close = cook_decode_close, .decode = cook_decode_frame, .long_name = NULL_IF_CONFIG_SMALL("COOK"), }
float pow2tab[127] [static] |
Definition at line 165 of file cook.c.
Referenced by imlt_window_float(), init_gain_table(), init_pow2table(), and interpolate_float().
float rootpow2tab[127] [static] |