FFmpeg
Loading...
Searching...
No Matches
mlpdec.c File Reference

MLP decoder. More...

#include "config_components.h"
#include <stdint.h>
#include "avcodec.h"
#include "libavutil/attributes.h"
#include "libavutil/internal.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/channel_layout.h"
#include "libavutil/mem_internal.h"
#include "libavutil/thread.h"
#include "libavutil/opt.h"
#include "codec_internal.h"
#include "decode.h"
#include "get_bits.h"
#include "mlp_parse.h"
#include "mlpdsp.h"
#include "mlp.h"
#include "config.h"
#include "profiles.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)
 
#define OFFSET(x)
 
#define FLAGS   (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM)
 

Functions

static int mlp_channel_layout_subset (AVChannelLayout *layout, uint64_t mask)
 
static enum AVChannel 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 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, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
 Read an access unit from the stream.
 
static av_cold void mlp_decode_flush (AVCodecContext *avctx)
 

Variables

static enum AVChannel thd_channel_order []
 
static VLC huff_vlc [3]
 
static const int8_t noise_table [256]
 Data table used for TrueHD noise generation function.
 
static const AVOption options []
 
static const AVClass mlp_decoder_class
 
static const AVClass truehd_decoder_class
 

Detailed Description

MLP decoder.

Definition in file mlpdec.c.

Macro Definition Documentation

◆ VLC_BITS

#define VLC_BITS   9

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

Definition at line 53 of file mlpdec.c.

◆ VLC_STATIC_SIZE

#define VLC_STATIC_SIZE   512

Definition at line 54 of file mlpdec.c.

Referenced by init_static().

◆ MSB_MASK

#define MSB_MASK ( bits)
Value:
(-(1 << (bits)))
static const uint8_t bits[8]
Definition fastaudio.c:100

Definition at line 967 of file mlpdec.c.

Referenced by filter_channel(), and output_data().

◆ OFFSET

#define OFFSET ( x)
Value:

Definition at line 1428 of file mlpdec.c.

◆ FLAGS

Definition at line 1429 of file mlpdec.c.

Function Documentation

◆ mlp_channel_layout_subset()

static int mlp_channel_layout_subset ( AVChannelLayout * layout,
uint64_t mask )
static

Definition at line 203 of file mlpdec.c.

Referenced by read_restart_header().

◆ thd_channel_layout_extract_channel()

static enum AVChannel thd_channel_layout_extract_channel ( uint64_t channel_layout,
int index )
static

Definition at line 210 of file mlpdec.c.

Referenced by read_restart_header().

◆ init_static()

static av_cold void init_static ( void )
static

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

Definition at line 228 of file mlpdec.c.

Referenced by mlp_decode_init().

◆ calculate_sign_huff()

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

Definition at line 242 of file mlpdec.c.

Referenced by read_decoding_params().

◆ read_huff_channels()

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 263 of file mlpdec.c.

Referenced by read_block_data().

◆ mlp_decode_init()

static av_cold int mlp_decode_init ( AVCodecContext * avctx)
static

Definition at line 299 of file mlpdec.c.

◆ read_major_sync()

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 338 of file mlpdec.c.

Referenced by read_access_unit().

◆ read_restart_header()

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 525 of file mlpdec.c.

Referenced by read_access_unit().

◆ read_filter_params()

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 689 of file mlpdec.c.

Referenced by read_channel_params().

◆ read_matrix_params()

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

Read parameters for primitive matrices.

Definition at line 764 of file mlpdec.c.

Referenced by read_decoding_params().

◆ read_channel_params()

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

Read channel parameters.

Definition at line 832 of file mlpdec.c.

Referenced by read_decoding_params().

◆ 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 889 of file mlpdec.c.

Referenced by read_access_unit().

◆ filter_channel()

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 972 of file mlpdec.c.

Referenced by config_output(), filter_frame(), filter_frame(), filter_frame(), filter_frame(), filter_frame(), filter_frame(), output_frame(), and read_block_data().

◆ 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 999 of file mlpdec.c.

Referenced by read_access_unit().

◆ generate_2_noise_channels()

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 1070 of file mlpdec.c.

Referenced by output_data().

◆ fill_noise_buffer()

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 1090 of file mlpdec.c.

Referenced by output_data().

◆ output_data()

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 1107 of file mlpdec.c.

Referenced by apng_do_inverse_blend(), dnn_detect_parse_yolo_output(), free_data_planes(), infer_completion_callback(), read_access_unit(), and test_function().

◆ read_access_unit()

static int read_access_unit ( AVCodecContext * avctx,
AVFrame * frame,
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 1182 of file mlpdec.c.

◆ mlp_decode_flush()

static av_cold void mlp_decode_flush ( AVCodecContext * avctx)
static

Definition at line 1415 of file mlpdec.c.

Variable Documentation

◆ thd_channel_order

enum AVChannel thd_channel_order[]
static
Initial value:
= {
}
@ AV_CHAN_LOW_FREQUENCY
@ AV_CHAN_BACK_RIGHT
@ AV_CHAN_FRONT_RIGHT_OF_CENTER
@ AV_CHAN_FRONT_LEFT
@ AV_CHAN_TOP_FRONT_RIGHT
@ AV_CHAN_FRONT_RIGHT
@ AV_CHAN_BACK_CENTER
@ AV_CHAN_FRONT_CENTER
@ AV_CHAN_SIDE_RIGHT
@ AV_CHAN_WIDE_LEFT
@ AV_CHAN_FRONT_LEFT_OF_CENTER
@ AV_CHAN_LOW_FREQUENCY_2
@ AV_CHAN_BACK_LEFT
@ AV_CHAN_SIDE_LEFT
@ AV_CHAN_SURROUND_DIRECT_RIGHT
@ AV_CHAN_TOP_FRONT_LEFT
@ AV_CHAN_WIDE_RIGHT
@ AV_CHAN_SURROUND_DIRECT_LEFT
@ AV_CHAN_TOP_CENTER
@ AV_CHAN_TOP_FRONT_CENTER

Definition at line 187 of file mlpdec.c.

Referenced by thd_channel_layout_extract_channel().

◆ huff_vlc

VLC huff_vlc[3]
static

Definition at line 224 of file mlpdec.c.

Referenced by init_static(), and read_huff_channels().

◆ noise_table

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 1041 of file mlpdec.c.

Referenced by fill_noise_buffer(), main(), and rnd_table_init().

◆ options

const AVOption options[]
static
Initial value:
= {
{ "downmix", "Request a specific channel layout from the decoder", OFFSET(downmix_layout),
AV_OPT_TYPE_CHLAYOUT, {.str = NULL}, .flags = FLAGS },
{ NULL },
}
#define FLAGS
Definition cmdutils.c:598
#define NULL
Definition coverity.c:32
#define OFFSET(x)
@ AV_OPT_TYPE_CHLAYOUT
Underlying C type is AVChannelLayout.
Definition opt.h:330

Definition at line 1430 of file mlpdec.c.

◆ mlp_decoder_class

const AVClass mlp_decoder_class
static
Initial value:
= {
.class_name = "MLP decoder",
.item_name = av_default_item_name,
.option = options,
}
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
#define LIBAVUTIL_VERSION_INT
Definition version.h:85

Definition at line 1436 of file mlpdec.c.

◆ truehd_decoder_class

const AVClass truehd_decoder_class
static
Initial value:
= {
.class_name = "TrueHD decoder",
.item_name = av_default_item_name,
.option = options,
}

Definition at line 1443 of file mlpdec.c.