FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Functions | Variables
mlpdec.c File Reference

MLP decoder. More...

#include <stdint.h>
#include "avcodec.h"
#include "libavutil/internal.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/channel_layout.h"
#include "get_bits.h"
#include "internal.h"
#include "libavutil/crc.h"
#include "parser.h"
#include "mlp_parser.h"
#include "mlpdsp.h"
#include "mlp.h"
#include "config.h"

Go to the source code of this file.

Data Structures

struct  SubStream
 
struct  MLPDecodeContext
 

Macros

#define VLC_BITS   9
 number of bits used for VLC lookup - longest Huffman code is 9
 
#define VLC_STATIC_SIZE   512
 
#define MSB_MASK(bits)   (-1u << (bits))
 
#define PARAM_BLOCKSIZE   (1 << 7)
 
#define PARAM_MATRIX   (1 << 6)
 
#define PARAM_OUTSHIFT   (1 << 5)
 
#define PARAM_QUANTSTEP   (1 << 4)
 
#define PARAM_FIR   (1 << 3)
 
#define PARAM_IIR   (1 << 2)
 
#define PARAM_HUFFOFFSET   (1 << 1)
 
#define PARAM_PRESENCE   (1 << 0)
 

Functions

static uint64_t thd_channel_layout_extract_channel (uint64_t channel_layout, int index)
 
static av_cold void init_static (void)
 Initialize static data, constant between all invocations of the codec.
 
static int32_t calculate_sign_huff (MLPDecodeContext *m, unsigned int substr, unsigned int ch)
 
static int read_huff_channels (MLPDecodeContext *m, GetBitContext *gbp, unsigned int substr, unsigned int pos)
 Read a sample, consisting of either, both or neither of entropy-coded MSBs and plain LSBs.
 
static av_cold int mlp_decode_init (AVCodecContext *avctx)
 
static int read_major_sync (MLPDecodeContext *m, GetBitContext *gb)
 Read a major sync info header - contains high level information about the stream - sample rate, channel arrangement etc.
 
static int read_restart_header (MLPDecodeContext *m, GetBitContext *gbp, const uint8_t *buf, unsigned int substr)
 Read a restart header from a block in a substream.
 
static int read_filter_params (MLPDecodeContext *m, GetBitContext *gbp, unsigned int substr, unsigned int channel, unsigned int filter)
 Read parameters for one of the prediction filters.
 
static int read_matrix_params (MLPDecodeContext *m, unsigned int substr, GetBitContext *gbp)
 Read parameters for primitive matrices.
 
static int read_channel_params (MLPDecodeContext *m, unsigned int substr, GetBitContext *gbp, unsigned int ch)
 Read channel parameters.
 
static int read_decoding_params (MLPDecodeContext *m, GetBitContext *gbp, unsigned int substr)
 Read decoding parameters that change more often than those in the restart header.
 
static void filter_channel (MLPDecodeContext *m, unsigned int substr, unsigned int channel)
 Generate PCM samples using the prediction filters and residual values read from the data stream, and update the filter state.
 
static int read_block_data (MLPDecodeContext *m, GetBitContext *gbp, unsigned int substr)
 Read a block of PCM residual data (or actual if no filtering active).
 
static void generate_2_noise_channels (MLPDecodeContext *m, unsigned int substr)
 Noise generation functions.
 
static void fill_noise_buffer (MLPDecodeContext *m, unsigned int substr)
 Generate a block of noise, used when restart sync word == 0x31eb.
 
static void rematrix_channels (MLPDecodeContext *m, unsigned int substr)
 Apply the channel matrices in turn to reconstruct the original audio samples.
 
static int output_data (MLPDecodeContext *m, unsigned int substr, AVFrame *frame, int *got_frame_ptr)
 Write the audio data into the output buffer.
 
static int read_access_unit (AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
 Read an access unit from the stream.
 

Variables

static const uint64_t thd_channel_order []
 
static VLC huff_vlc [3]
 
static const int8_t noise_table [256]
 Data table used for TrueHD noise generation function.
 

Detailed Description

MLP decoder.

Definition in file mlpdec.c.

Macro Definition Documentation

#define VLC_BITS   9

number of bits used for VLC lookup - longest Huffman code is 9

Definition at line 47 of file mlpdec.c.

Referenced by init_static(), and read_huff_channels().

#define VLC_STATIC_SIZE   512

Definition at line 48 of file mlpdec.c.

Referenced by init_static().

#define PARAM_BLOCKSIZE   (1 << 7)

Definition at line 86 of file mlpdec.c.

Referenced by read_decoding_params().

#define PARAM_MATRIX   (1 << 6)

Definition at line 87 of file mlpdec.c.

Referenced by read_decoding_params().

#define PARAM_OUTSHIFT   (1 << 5)

Definition at line 88 of file mlpdec.c.

Referenced by read_decoding_params().

#define PARAM_QUANTSTEP   (1 << 4)

Definition at line 89 of file mlpdec.c.

Referenced by read_decoding_params().

#define PARAM_FIR   (1 << 3)

Definition at line 90 of file mlpdec.c.

Referenced by read_channel_params().

#define PARAM_IIR   (1 << 2)

Definition at line 91 of file mlpdec.c.

Referenced by read_channel_params().

#define PARAM_HUFFOFFSET   (1 << 1)

Definition at line 92 of file mlpdec.c.

Referenced by read_channel_params().

#define PARAM_PRESENCE   (1 << 0)

Definition at line 93 of file mlpdec.c.

Referenced by read_decoding_params().

#define MSB_MASK (   bits)    (-1u << (bits))

Definition at line 903 of file mlpdec.c.

Referenced by filter_channel(), and rematrix_channels().

Function Documentation

static uint64_t thd_channel_layout_extract_channel ( uint64_t  channel_layout,
int  index 
)
static

Definition at line 183 of file mlpdec.c.

Referenced by read_restart_header().

static av_cold void init_static ( void  )
static

Initialize static data, constant between all invocations of the codec.

Definition at line 201 of file mlpdec.c.

Referenced by mlp_decode_init().

static int32_t calculate_sign_huff ( MLPDecodeContext m,
unsigned int  substr,
unsigned int  ch 
)
inlinestatic

Definition at line 218 of file mlpdec.c.

Referenced by read_channel_params(), and read_decoding_params().

static int read_huff_channels ( MLPDecodeContext m,
GetBitContext gbp,
unsigned int  substr,
unsigned int  pos 
)
inlinestatic

Read a sample, consisting of either, both or neither of entropy-coded MSBs and plain LSBs.

Definition at line 239 of file mlpdec.c.

Referenced by read_block_data().

static av_cold int mlp_decode_init ( AVCodecContext avctx)
static

Definition at line 275 of file mlpdec.c.

static int read_major_sync ( MLPDecodeContext m,
GetBitContext gb 
)
static

Read a major sync info header - contains high level information about the stream - sample rate, channel arrangement etc.

Most of this information is not actually necessary for decoding, only for playback.

Definition at line 294 of file mlpdec.c.

Referenced by read_access_unit().

static int read_restart_header ( MLPDecodeContext m,
GetBitContext gbp,
const uint8_t buf,
unsigned int  substr 
)
static

Read a restart header from a block in a substream.

This contains parameters required to decode the audio that do not change very often. Generally (always) present only in blocks following a major sync.

Definition at line 468 of file mlpdec.c.

Referenced by read_access_unit().

static int read_filter_params ( MLPDecodeContext m,
GetBitContext gbp,
unsigned int  substr,
unsigned int  channel,
unsigned int  filter 
)
static

Read parameters for one of the prediction filters.

Definition at line 651 of file mlpdec.c.

Referenced by read_channel_params().

static int read_matrix_params ( MLPDecodeContext m,
unsigned int  substr,
GetBitContext gbp 
)
static

Read parameters for primitive matrices.

Definition at line 726 of file mlpdec.c.

Referenced by read_decoding_params().

static int read_channel_params ( MLPDecodeContext m,
unsigned int  substr,
GetBitContext gbp,
unsigned int  ch 
)
static

Read channel parameters.

Definition at line 789 of file mlpdec.c.

Referenced by read_decoding_params().

static int read_decoding_params ( MLPDecodeContext m,
GetBitContext gbp,
unsigned int  substr 
)
static

Read decoding parameters that change more often than those in the restart header.

Definition at line 848 of file mlpdec.c.

Referenced by read_access_unit().

static void filter_channel ( MLPDecodeContext m,
unsigned int  substr,
unsigned int  channel 
)
static

Generate PCM samples using the prediction filters and residual values read from the data stream, and update the filter state.

Definition at line 908 of file mlpdec.c.

Referenced by read_block_data().

static int read_block_data ( MLPDecodeContext m,
GetBitContext gbp,
unsigned int  substr 
)
static

Read a block of PCM residual data (or actual if no filtering active).

Definition at line 935 of file mlpdec.c.

Referenced by read_access_unit().

static void generate_2_noise_channels ( MLPDecodeContext m,
unsigned int  substr 
)
static

Noise generation functions.

I'm not sure what these are for - they seem to be some kind of pseudorandom sequence generators, used to generate noise data which is used when the channels are rematrixed. I'm not sure if they provide a practical benefit to compression, or just obfuscate the decoder. Are they for some kind of dithering? Generate two channels of noise, used in the matrix when restart sync word == 0x31ea.

Definition at line 1006 of file mlpdec.c.

Referenced by rematrix_channels().

static void fill_noise_buffer ( MLPDecodeContext m,
unsigned int  substr 
)
static

Generate a block of noise, used when restart sync word == 0x31eb.

Definition at line 1026 of file mlpdec.c.

Referenced by rematrix_channels().

static void rematrix_channels ( MLPDecodeContext m,
unsigned int  substr 
)
static

Apply the channel matrices in turn to reconstruct the original audio samples.

Definition at line 1045 of file mlpdec.c.

Referenced by read_access_unit().

static int output_data ( MLPDecodeContext m,
unsigned int  substr,
AVFrame frame,
int *  got_frame_ptr 
)
static

Write the audio data into the output buffer.

Definition at line 1077 of file mlpdec.c.

Referenced by read_access_unit().

static int read_access_unit ( AVCodecContext avctx,
void data,
int *  got_frame_ptr,
AVPacket avpkt 
)
static

Read an access unit from the stream.

Returns
negative on error, 0 if not enough data is present in the input stream, otherwise the number of bytes consumed.

Definition at line 1121 of file mlpdec.c.

Variable Documentation

const uint64_t thd_channel_order[]
static
VLC huff_vlc[3]
static

Definition at line 197 of file mlpdec.c.

const int8_t noise_table[256]
static
Initial value:
= {
30, 51, 22, 54, 3, 7, -4, 38, 14, 55, 46, 81, 22, 58, -3, 2,
52, 31, -7, 51, 15, 44, 74, 30, 85, -17, 10, 33, 18, 80, 28, 62,
10, 32, 23, 69, 72, 26, 35, 17, 73, 60, 8, 56, 2, 6, -2, -5,
51, 4, 11, 50, 66, 76, 21, 44, 33, 47, 1, 26, 64, 48, 57, 40,
38, 16, -10, -28, 92, 22, -18, 29, -10, 5, -13, 49, 19, 24, 70, 34,
61, 48, 30, 14, -6, 25, 58, 33, 42, 60, 67, 17, 54, 17, 22, 30,
67, 44, -9, 50, -11, 43, 40, 32, 59, 82, 13, 49, -14, 55, 60, 36,
48, 49, 31, 47, 15, 12, 4, 65, 1, 23, 29, 39, 45, -2, 84, 69,
0, 72, 37, 57, 27, 41, -15, -16, 35, 31, 14, 61, 24, 0, 27, 24,
16, 41, 55, 34, 53, 9, 56, 12, 25, 29, 53, 5, 20, -20, -8, 20,
13, 28, -3, 78, 38, 16, 11, 62, 46, 29, 21, 24, 46, 65, 43, -23,
89, 18, 74, 21, 38, -12, 19, 12, -19, 8, 15, 33, 4, 57, 9, -8,
36, 35, 26, 28, 7, 83, 63, 79, 75, 11, 3, 87, 37, 47, 34, 40,
39, 19, 20, 42, 27, 34, 39, 77, 13, 42, 59, 64, 45, -1, 32, 37,
45, -5, 53, -6, 7, 36, 50, 23, 6, 32, 9, -21, 18, 71, 27, 52,
-25, 31, 35, 42, -1, 68, 63, 52, 26, 43, 66, 37, 41, 25, 40, 70,
}

Data table used for TrueHD noise generation function.

Definition at line 977 of file mlpdec.c.

Referenced by fill_noise_buffer(), and main().