|
FFmpeg
|
Cook compatible decoder. More...
#include "libavutil/channel_layout.h"#include "libavutil/lfg.h"#include "audiodsp.h"#include "avcodec.h"#include "get_bits.h"#include "bytestream.h"#include "fft.h"#include "internal.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 | COOKContext |
Macros | |
| #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))) |
| #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 | 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, void *data, 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] |
| AVCodec | 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 MONO 0x1000001 |
Definition at line 60 of file cook.c.
Referenced by cook_decode_init(), libshine_encode_init(), and mp3lame_encode_init().
| #define STEREO 0x1000002 |
Definition at line 61 of file cook.c.
Referenced by cook_decode_init(), dump_cook_context(), libshine_encode_init(), and mp3lame_encode_init().
| #define JOINT_STEREO 0x1000003 |
Definition at line 62 of file cook.c.
Referenced by cook_decode_init().
| #define MC_COOK 0x2000000 |
Definition at line 63 of file cook.c.
Referenced by cook_decode_init().
| #define SUBBAND_SIZE 20 |
Definition at line 65 of file cook.c.
Referenced by decode_vectors(), decouple_float(), joint_decode(), and scalar_dequant_float().
| #define MAX_SUBPACKETS 5 |
Definition at line 66 of file cook.c.
Referenced by cook_decode_init().
| #define DECODE_BYTES_PAD1 | ( | bytes | ) | (3 - ((bytes) + 3) % 4) |
Definition at line 258 of file cook.c.
Referenced by cook_decode_init().
| #define DECODE_BYTES_PAD2 | ( | bytes | ) | ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) |
Definition at line 167 of file cook.c.
Referenced by cook_decode_init().
|
static |
Definition at line 184 of file cook.c.
Referenced by cook_decode_init().
|
static |
Definition at line 194 of file cook.c.
Referenced by cook_decode_init().
|
static |
Definition at line 225 of file cook.c.
Referenced by cook_decode_init().
|
static |
Definition at line 249 of file cook.c.
Referenced by cook_decode_init().
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 281 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 339 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 363 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 404 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 501 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 523 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 552 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 596 of file cook.c.
Referenced by mono_decode().
|
static |
Definition at line 632 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 662 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 689 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 717 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 747 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 786 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 808 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 860 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 882 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 900 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 918 of file cook.c.
Referenced by cook_decode_frame().
|
static |
|
static |
Definition at line 1026 of file cook.c.
Referenced by cook_decode_init().
|
static |
Cook initialization.
| avctx | pointer to the AVCodecContext |
|
static |
Definition at line 161 of file cook.c.
Referenced by imlt_window_float(), init_gain_table(), init_pow2table(), and interpolate_float().
|
static |
Definition at line 162 of file cook.c.
Referenced by init_pow2table(), and scalar_dequant_float().
| AVCodec ff_cook_decoder |
1.8.6