1/* 2 * MLP codec common header file 3 * Copyright (c) 2007-2008 Ian Caulfield 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#ifndef AVCODEC_MLP_H 23#define AVCODEC_MLP_H 24 25#include <stdint.h> 26 27#include "avcodec.h" 28 29/** Maximum number of channels that can be decoded. */ 30#define MAX_CHANNELS 16 31 32/** Maximum number of matrices used in decoding; most streams have one matrix 33 * per output channel, but some rematrix a channel (usually 0) more than once. 34 */ 35#define MAX_MATRICES 15 36 37/** Maximum number of substreams that can be decoded. This could also be set 38 * higher, but I haven't seen any examples with more than two. 39 */ 40#define MAX_SUBSTREAMS 2 41 42/** maximum sample frequency seen in files */ 43#define MAX_SAMPLERATE 192000 44 45/** maximum number of audio samples within one access unit */ 46#define MAX_BLOCKSIZE (40 * (MAX_SAMPLERATE / 48000)) 47/** next power of two greater than MAX_BLOCKSIZE */ 48#define MAX_BLOCKSIZE_POW2 (64 * (MAX_SAMPLERATE / 48000)) 49 50/** number of allowed filters */ 51#define NUM_FILTERS 2 52 53/** The maximum number of taps in either the IIR or FIR filter; 54 * I believe MLP actually specifies the maximum order for IIR filters as four, 55 * and that the sum of the orders of both filters must be <= 8. 56*/ 57#define MAX_FILTER_ORDER 8 58 59/** Code that signals end of a stream. */ 60#define END_OF_STREAM 0xd234d234 61 62#define FIR 0 63#define IIR 1 64 65/** filter data */ 66typedef struct { 67 uint8_t order; ///< number of taps in filter 68 uint8_t shift; ///< Right shift to apply to output of filter. 69 70 int32_t coeff[MAX_FILTER_ORDER]; 71 int32_t state[MAX_FILTER_ORDER]; 72} FilterParams; 73 74/** sample data coding information */ 75typedef struct { 76 FilterParams filter_params[NUM_FILTERS]; 77 78 int16_t huff_offset; ///< Offset to apply to residual values. 79 int32_t sign_huff_offset; ///< sign/rounding-corrected version of huff_offset 80 uint8_t codebook; ///< Which VLC codebook to use to read residuals. 81 uint8_t huff_lsbs; ///< Size of residual suffix not encoded using VLC. 82} ChannelParams; 83 84/** Tables defining the Huffman codes. 85 * There are three entropy coding methods used in MLP (four if you count 86 * "none" as a method). These use the same sequences for codes starting with 87 * 00 or 01, but have different codes starting with 1. 88 */ 89extern const uint8_t ff_mlp_huffman_tables[3][18][2]; 90 91/** MLP uses checksums that seem to be based on the standard CRC algorithm, but 92 * are not (in implementation terms, the table lookup and XOR are reversed). 93 * We can implement this behavior using a standard av_crc on all but the 94 * last element, then XOR that with the last element. 95 */ 96uint8_t ff_mlp_checksum8 (const uint8_t *buf, unsigned int buf_size); 97uint16_t ff_mlp_checksum16(const uint8_t *buf, unsigned int buf_size); 98 99/** Calculate an 8-bit checksum over a restart header -- a non-multiple-of-8 100 * number of bits, starting two bits into the first byte of buf. 101 */ 102uint8_t ff_mlp_restart_checksum(const uint8_t *buf, unsigned int bit_size); 103 104/** XOR together all the bytes of a buffer. 105 * Does this belong in dspcontext? 106 */ 107uint8_t ff_mlp_calculate_parity(const uint8_t *buf, unsigned int buf_size); 108 109void ff_mlp_init_crc(void); 110 111/** XOR four bytes into one. */ 112static inline uint8_t xor_32_to_8(uint32_t value) 113{ 114 value ^= value >> 16; 115 value ^= value >> 8; 116 return value; 117} 118 119#endif /* AVCODEC_MLP_H */ 120