| 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 | 
 1.8.17
 1.8.17