FFmpeg
|
#include "libavutil/channel_layout.h"
#include "libavutil/lfg.h"
#include "libavutil/mem.h"
#include "libavutil/mem_internal.h"
#include "libavutil/thread.h"
#include "libavutil/tx.h"
#include "audiodsp.h"
#include "avcodec.h"
#include "get_bits.h"
#include "bytestream.h"
#include "codec_internal.h"
#include "decode.h"
#include "sinewin.h"
#include "unary.h"
#include "cookdata.h"
Go to the source code of this file.
Data Structures | |
struct | cook_gains |
struct | COOKSubpacket |
struct | cook |
Macros | |
#define | MONO 0x1000001 |
#define | STEREO 0x1000002 |
#define | JOINT_STEREO 0x1000003 |
#define | MC_COOK 0x2000000 |
#define | SUBBAND_SIZE 20 |
#define | MAX_SUBPACKETS 5 |
#define | QUANT_VLC_BITS 9 |
#define | COUPLING_VLC_BITS 6 |
#define | DECODE_BYTES_PAD1(bytes) (3 - ((bytes) + 3) % 4) |
#define | DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) |
#define | PRINT(a, b) ff_dlog(q->avctx, " %s = %d\n", a, b); |
Functions | |
static av_cold void | init_pow2table (void) |
static av_cold void | init_gain_table (COOKContext *q) |
static av_cold int | build_vlc (VLC *vlc, int nb_bits, const uint8_t counts[16], const void *syms, int symbol_size, int offset, void *logctx) |
static av_cold int | init_cook_vlc_tables (COOKContext *q) |
static av_cold int | init_cook_mlt (COOKContext *q) |
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. More... | |
static av_cold int | cook_decode_close (AVCodecContext *avctx) |
static void | decode_gain_info (GetBitContext *gb, int *gaininfo) |
Fill the gain array for the timedomain quantization. More... | |
static int | decode_envelope (COOKContext *q, COOKSubpacket *p, int *quant_index_table) |
Create the quant index table needed for the envelope. More... | |
static void | categorize (COOKContext *q, COOKSubpacket *p, const int *quant_index_table, int *category, int *category_index) |
Calculate the category and category_index vector. More... | |
static void | expand_category (COOKContext *q, int *category, int *category_index) |
Expand the category vector. More... | |
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. More... | |
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. More... | |
static void | decode_vectors (COOKContext *q, COOKSubpacket *p, int *category, int *quant_index_table, float *mlt_buffer) |
Fill the mlt_buffer with mlt coefficients. More... | |
static int | mono_decode (COOKContext *q, COOKSubpacket *p, float *mlt_buffer) |
static void | interpolate_float (COOKContext *q, float *buffer, int gain_index, int gain_index_next) |
the actual requantization of the timedomain samples More... | |
static void | imlt_window_float (COOKContext *q, float *inbuffer, cook_gains *gains_ptr, float *previous_buffer) |
Apply transform window, overlap buffers. More... | |
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. More... | |
static int | decouple_info (COOKContext *q, COOKSubpacket *p, int *decouple_tab) |
function for getting the jointstereo coupling information More... | |
static void | decouple_float (COOKContext *q, COOKSubpacket *p, int subband, float f1, float f2, float *decode_buffer, float *mlt_buffer1, float *mlt_buffer2) |
function decouples a pair of signals from a single signal via multiplication. More... | |
static int | joint_decode (COOKContext *q, COOKSubpacket *p, float *mlt_buffer_left, float *mlt_buffer_right) |
function for decoding joint stereo data More... | |
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. More... | |
static void | saturate_output_float (COOKContext *q, float *out) |
Saturate the output signal and interleave. More... | |
static void | mlt_compensate_output (COOKContext *q, float *decode_buffer, cook_gains *gains_ptr, float *previous_buffer, float *out) |
Final part of subpacket decoding: Apply modulated lapped transform, gain compensation, clip and convert to integer. More... | |
static int | decode_subpacket (COOKContext *q, COOKSubpacket *p, const uint8_t *inbuffer, float **outbuffer) |
Cook subpacket decoding. More... | |
static int | cook_decode_frame (AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt) |
static void | dump_cook_context (COOKContext *q) |
static av_cold int | cook_decode_init (AVCodecContext *avctx) |
Cook initialization. More... | |
Variables | |
static float | pow2tab [127] |
static float | rootpow2tab [127] |
const FFCodec | ff_cook_decoder |
Cook compatible 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_PAD2 | ( | bytes | ) | ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) |
|
static |
Definition at line 175 of file cook.c.
Referenced by cook_decode_init().
|
static |
Definition at line 192 of file cook.c.
Referenced by cook_decode_init().
|
static |
Definition at line 201 of file cook.c.
Referenced by init_cook_vlc_tables().
|
static |
Definition at line 217 of file cook.c.
Referenced by cook_decode_init().
|
static |
Definition at line 249 of file cook.c.
Referenced by cook_decode_init().
|
static |
Definition at line 272 of file cook.c.
Referenced by cook_decode_init().
|
inlinestatic |
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 |
Definition at line 304 of file cook.c.
Referenced by decode_bytes_and_gain().
|
static |
|
static |
Fill the gain array for the timedomain quantization.
gb | pointer to the GetBitContext |
gaininfo | array[9] of gain indexes |
Definition at line 362 of file cook.c.
Referenced by decode_bytes_and_gain().
|
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 386 of file cook.c.
Referenced by mono_decode().
|
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 427 of file cook.c.
Referenced by mono_decode().
|
inlinestatic |
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 524 of file cook.c.
Referenced by mono_decode().
|
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 546 of file cook.c.
Referenced by cook_decode_init().
|
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 575 of file cook.c.
Referenced by decode_vectors().
|
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 619 of file cook.c.
Referenced by mono_decode().
|
static |
Definition at line 655 of file cook.c.
Referenced by decode_subpacket(), and joint_decode().
|
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 685 of file cook.c.
Referenced by cook_decode_init().
|
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 712 of file cook.c.
Referenced by cook_decode_init().
|
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 740 of file cook.c.
Referenced by mlt_compensate_output().
|
static |
function for getting the jointstereo coupling information
q | pointer to the COOKContext |
decouple_tab | decoupling array |
Definition at line 770 of file cook.c.
Referenced by joint_decode().
|
static |
function decouples a pair of signals from a single signal via multiplication.
q | pointer to the COOKContext |
subband | index of the current subband |
f1 | multiplier for channel 1 extraction |
f2 | multiplier for channel 2 extraction |
decode_buffer | input buffer |
mlt_buffer1 | pointer to left channel mlt coefficients |
mlt_buffer2 | pointer to right channel mlt coefficients |
Definition at line 809 of file cook.c.
Referenced by cook_decode_init().
|
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 831 of file cook.c.
Referenced by decode_subpacket().
|
inlinestatic |
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 883 of file cook.c.
Referenced by decode_subpacket().
|
static |
Saturate the output signal and interleave.
q | pointer to the COOKContext |
out | pointer to the output vector |
Definition at line 905 of file cook.c.
Referenced by cook_decode_init().
|
inlinestatic |
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 |
Definition at line 923 of file cook.c.
Referenced by decode_subpacket().
|
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 941 of file cook.c.
Referenced by cook_decode_frame().
|
static |
|
static |
Definition at line 1048 of file cook.c.
Referenced by cook_decode_init().
|
static |
Cook initialization.
avctx | pointer to the AVCodecContext |
|
static |
Definition at line 169 of file cook.c.
Referenced by imlt_window_float(), init_gain_table(), init_pow2table(), and interpolate_float().
|
static |
Definition at line 170 of file cook.c.
Referenced by init_pow2table(), and scalar_dequant_float().
const FFCodec ff_cook_decoder |