mpc7.c
Go to the documentation of this file.
1 /*
2  * Musepack SV7 decoder
3  * Copyright (c) 2006 Konstantin Shishkov
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 /**
23  * @file
24  * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
25  * divided into 32 subbands.
26  */
27 
29 #include "libavutil/internal.h"
30 #include "libavutil/lfg.h"
31 #include "avcodec.h"
32 #include "get_bits.h"
33 #include "dsputil.h"
34 #include "internal.h"
35 #include "mpegaudiodsp.h"
36 
37 #include "mpc.h"
38 #include "mpc7data.h"
39 
41 
42 static const uint16_t quant_offsets[MPC7_QUANT_VLC_TABLES*2 + 1] =
43 {
44  0, 512, 1024, 1536, 2052, 2564, 3076, 3588, 4100, 4612, 5124,
45  5636, 6164, 6676, 7224
46 };
47 
48 
50 {
51  int i, j;
52  MPCContext *c = avctx->priv_data;
53  GetBitContext gb;
55  static int vlc_initialized = 0;
56 
57  static VLC_TYPE scfi_table[1 << MPC7_SCFI_BITS][2];
58  static VLC_TYPE dscf_table[1 << MPC7_DSCF_BITS][2];
59  static VLC_TYPE hdr_table[1 << MPC7_HDR_BITS][2];
60  static VLC_TYPE quant_tables[7224][2];
61 
62  /* Musepack SV7 is always stereo */
63  if (avctx->channels != 2) {
64  avpriv_request_sample(avctx, "%d channels", avctx->channels);
65  return AVERROR_PATCHWELCOME;
66  }
67 
68  if(avctx->extradata_size < 16){
69  av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size);
70  return -1;
71  }
72  memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
73  av_lfg_init(&c->rnd, 0xDEADBEEF);
74  ff_dsputil_init(&c->dsp, avctx);
76  c->dsp.bswap_buf((uint32_t*)buf, (const uint32_t*)avctx->extradata, 4);
77  ff_mpc_init();
78  init_get_bits(&gb, buf, 128);
79 
80  c->IS = get_bits1(&gb);
81  c->MSS = get_bits1(&gb);
82  c->maxbands = get_bits(&gb, 6);
83  if(c->maxbands >= BANDS){
84  av_log(avctx, AV_LOG_ERROR, "Too many bands: %i\n", c->maxbands);
85  return -1;
86  }
87  skip_bits_long(&gb, 88);
88  c->gapless = get_bits1(&gb);
89  c->lastframelen = get_bits(&gb, 11);
90  av_log(avctx, AV_LOG_DEBUG, "IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d\n",
91  c->IS, c->MSS, c->gapless, c->lastframelen, c->maxbands);
92  c->frames_to_skip = 0;
93 
96 
97  if(vlc_initialized) return 0;
98  av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n");
99  scfi_vlc.table = scfi_table;
100  scfi_vlc.table_allocated = 1 << MPC7_SCFI_BITS;
101  if(init_vlc(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE,
102  &mpc7_scfi[1], 2, 1,
103  &mpc7_scfi[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){
104  av_log(avctx, AV_LOG_ERROR, "Cannot init SCFI VLC\n");
105  return -1;
106  }
107  dscf_vlc.table = dscf_table;
108  dscf_vlc.table_allocated = 1 << MPC7_DSCF_BITS;
109  if(init_vlc(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE,
110  &mpc7_dscf[1], 2, 1,
111  &mpc7_dscf[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){
112  av_log(avctx, AV_LOG_ERROR, "Cannot init DSCF VLC\n");
113  return -1;
114  }
115  hdr_vlc.table = hdr_table;
116  hdr_vlc.table_allocated = 1 << MPC7_HDR_BITS;
117  if(init_vlc(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE,
118  &mpc7_hdr[1], 2, 1,
119  &mpc7_hdr[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){
120  av_log(avctx, AV_LOG_ERROR, "Cannot init HDR VLC\n");
121  return -1;
122  }
123  for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){
124  for(j = 0; j < 2; j++){
125  quant_vlc[i][j].table = &quant_tables[quant_offsets[i*2 + j]];
126  quant_vlc[i][j].table_allocated = quant_offsets[i*2 + j + 1] - quant_offsets[i*2 + j];
127  if(init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i],
128  &mpc7_quant_vlc[i][j][1], 4, 2,
129  &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_NEW_STATIC)){
130  av_log(avctx, AV_LOG_ERROR, "Cannot init QUANT VLC %i,%i\n",i,j);
131  return -1;
132  }
133  }
134  }
135  vlc_initialized = 1;
136 
137  return 0;
138 }
139 
140 /**
141  * Fill samples for given subband
142  */
143 static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst)
144 {
145  int i, i1, t;
146  switch(idx){
147  case -1:
148  for(i = 0; i < SAMPLES_PER_BAND; i++){
149  *dst++ = (av_lfg_get(&c->rnd) & 0x3FC) - 510;
150  }
151  break;
152  case 1:
153  i1 = get_bits1(gb);
154  for(i = 0; i < SAMPLES_PER_BAND/3; i++){
155  t = get_vlc2(gb, quant_vlc[0][i1].table, 9, 2);
156  *dst++ = mpc7_idx30[t];
157  *dst++ = mpc7_idx31[t];
158  *dst++ = mpc7_idx32[t];
159  }
160  break;
161  case 2:
162  i1 = get_bits1(gb);
163  for(i = 0; i < SAMPLES_PER_BAND/2; i++){
164  t = get_vlc2(gb, quant_vlc[1][i1].table, 9, 2);
165  *dst++ = mpc7_idx50[t];
166  *dst++ = mpc7_idx51[t];
167  }
168  break;
169  case 3: case 4: case 5: case 6: case 7:
170  i1 = get_bits1(gb);
171  for(i = 0; i < SAMPLES_PER_BAND; i++)
172  *dst++ = get_vlc2(gb, quant_vlc[idx-1][i1].table, 9, 2) - mpc7_quant_vlc_off[idx-1];
173  break;
174  case 8: case 9: case 10: case 11: case 12:
175  case 13: case 14: case 15: case 16: case 17:
176  t = (1 << (idx - 2)) - 1;
177  for(i = 0; i < SAMPLES_PER_BAND; i++)
178  *dst++ = get_bits(gb, idx - 1) - t;
179  break;
180  default: // case 0 and -2..-17
181  return;
182  }
183 }
184 
185 static int get_scale_idx(GetBitContext *gb, int ref)
186 {
187  int t = get_vlc2(gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7;
188  if (t == 8)
189  return get_bits(gb, 6);
190  return ref + t;
191 }
192 
193 static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
194  int *got_frame_ptr, AVPacket *avpkt)
195 {
196  AVFrame *frame = data;
197  const uint8_t *buf = avpkt->data;
198  int buf_size;
199  MPCContext *c = avctx->priv_data;
200  GetBitContext gb;
201  int i, ch;
202  int mb = -1;
203  Band *bands = c->bands;
204  int off, ret, last_frame, skip;
205  int bits_used, bits_avail;
206 
207  memset(bands, 0, sizeof(*bands) * (c->maxbands + 1));
208 
209  buf_size = avpkt->size & ~3;
210  if (buf_size <= 0) {
211  av_log(avctx, AV_LOG_ERROR, "packet size is too small (%i bytes)\n",
212  avpkt->size);
213  return AVERROR_INVALIDDATA;
214  }
215  if (buf_size != avpkt->size) {
216  av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. "
217  "extra bytes at the end will be skipped.\n");
218  }
219 
220  skip = buf[0];
221  last_frame = buf[1];
222  buf += 4;
223  buf_size -= 4;
224 
225  /* get output buffer */
226  frame->nb_samples = MPC_FRAME_SIZE;
227  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
228  return ret;
229 
230  av_fast_padded_malloc(&c->bits, &c->buf_size, buf_size);
231  if (!c->bits)
232  return AVERROR(ENOMEM);
233  c->dsp.bswap_buf((uint32_t *)c->bits, (const uint32_t *)buf, buf_size >> 2);
234  init_get_bits(&gb, c->bits, buf_size * 8);
235  skip_bits_long(&gb, skip);
236 
237  /* read subband indexes */
238  for(i = 0; i <= c->maxbands; i++){
239  for(ch = 0; ch < 2; ch++){
240  int t = 4;
241  if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5;
242  if(t == 4) bands[i].res[ch] = get_bits(&gb, 4);
243  else bands[i].res[ch] = bands[i-1].res[ch] + t;
244  if (bands[i].res[ch] < -1 || bands[i].res[ch] > 17) {
245  av_log(avctx, AV_LOG_ERROR, "subband index invalid\n");
246  return AVERROR_INVALIDDATA;
247  }
248  }
249 
250  if(bands[i].res[0] || bands[i].res[1]){
251  mb = i;
252  if(c->MSS) bands[i].msf = get_bits1(&gb);
253  }
254  }
255  /* get scale indexes coding method */
256  for(i = 0; i <= mb; i++)
257  for(ch = 0; ch < 2; ch++)
258  if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1);
259  /* get scale indexes */
260  for(i = 0; i <= mb; i++){
261  for(ch = 0; ch < 2; ch++){
262  if(bands[i].res[ch]){
263  bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i];
264  bands[i].scf_idx[ch][0] = get_scale_idx(&gb, bands[i].scf_idx[ch][2]);
265  switch(bands[i].scfi[ch]){
266  case 0:
267  bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);
268  bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);
269  break;
270  case 1:
271  bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);
272  bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1];
273  break;
274  case 2:
275  bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
276  bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);
277  break;
278  case 3:
279  bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
280  break;
281  }
282  c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2];
283  }
284  }
285  }
286  /* get quantizers */
287  memset(c->Q, 0, sizeof(c->Q));
288  off = 0;
289  for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND)
290  for(ch = 0; ch < 2; ch++)
291  idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);
292 
293  ff_mpc_dequantize_and_synth(c, mb, (int16_t **)frame->extended_data, 2);
294  if(last_frame)
295  frame->nb_samples = c->lastframelen;
296 
297  bits_used = get_bits_count(&gb);
298  bits_avail = buf_size * 8;
299  if (!last_frame && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))) {
300  av_log(avctx, AV_LOG_ERROR, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail);
301  return -1;
302  }
303  if(c->frames_to_skip){
304  c->frames_to_skip--;
305  *got_frame_ptr = 0;
306  return avpkt->size;
307  }
308 
309  *got_frame_ptr = 1;
310 
311  return avpkt->size;
312 }
313 
315 {
316  MPCContext *c = avctx->priv_data;
317 
318  memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
319  c->frames_to_skip = 32;
320 }
321 
323 {
324  MPCContext *c = avctx->priv_data;
325  av_freep(&c->bits);
326  c->buf_size = 0;
327  return 0;
328 }
329 
331  .name = "mpc7",
332  .type = AVMEDIA_TYPE_AUDIO,
333  .id = AV_CODEC_ID_MUSEPACK7,
334  .priv_data_size = sizeof(MPCContext),
339  .capabilities = CODEC_CAP_DR1,
340  .long_name = NULL_IF_CONFIG_SMALL("Musepack SV7"),
341  .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
343 };
void ff_mpc_dequantize_and_synth(MPCContext *c, int maxband, int16_t **out, int channels)
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
Definition: dsputil.c:2675
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
static const int8_t mpc7_idx32[]
Definition: mpc7data.h:29
FIXME Range Coding of cr are ref
Definition: snow.txt:367
MPADSPContext mpadsp
Definition: mpc.h:54
static const uint16_t mpc7_quant_vlc[MPC7_QUANT_VLC_TABLES][2][64 *2]
Definition: mpc7data.h:62
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
static void skip_bits_long(GetBitContext *s, int n)
Definition: get_bits.h:198
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
int msf
mid-stereo flag
Definition: mpc.h:45
int Q[2][MPC_FRAME_SIZE]
Definition: mpc.h:62
int res[2]
Definition: mpc.h:46
AVLFG rnd
Definition: mpc.h:66
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional FF_INPUT_BUFFER_PADDING_SIZE at the end w...
#define VLC_TYPE
Definition: get_bits.h:61
#define AV_CH_LAYOUT_STEREO
static VLC dscf_vlc
Definition: mpc7.c:40
static const uint8_t mpc7_quant_vlc_sizes[MPC7_QUANT_VLC_TABLES *2]
Definition: mpc7data.h:54
int buf_size
Definition: mpc.h:65
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
int lastframelen
Definition: mpc.h:57
static int mpc7_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: mpc7.c:193
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
int gapless
Definition: mpc.h:56
enum AVSampleFormat sample_fmt
audio sample format
uint8_t
#define av_cold
Definition: attributes.h:78
#define mb
#define MPC7_DSCF_BITS
Definition: mpc7data.h:40
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
int scf_idx[2][3]
Definition: mpc.h:48
uint8_t * data
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:193
bitstream reader API header.
static const int8_t mpc7_idx50[]
Definition: mpc7data.h:30
frame
Definition: stft.m:14
static const int8_t mpc7_idx31[]
Definition: mpc7data.h:28
#define MPC7_HDR_SIZE
Definition: mpc7data.h:46
int IS
Definition: mpc.h:56
static const uint8_t mpc7_hdr[MPC7_HDR_SIZE *2]
Definition: mpc7data.h:48
#define MPC7_QUANT_VLC_TABLES
Definition: mpc7data.h:53
static const struct endianess table[]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
static const uint8_t mpc7_quant_vlc_off[MPC7_QUANT_VLC_TABLES]
Definition: mpc7data.h:58
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static const uint8_t mpc7_scfi[MPC7_SCFI_SIZE *2]
Definition: mpc7data.h:35
int maxbands
Definition: mpc.h:58
#define SAMPLES_PER_BAND
Definition: mpc.h:40
external API header
Definition: get_bits.h:63
uint64_t channel_layout
Audio channel layout.
void ff_mpadsp_init(MPADSPContext *s)
Definition: mpegaudiodsp.c:26
static av_cold int mpc7_decode_init(AVCodecContext *avctx)
Definition: mpc7.c:49
common internal API header
audio channel layout utility functions
uint8_t * bits
Definition: mpc.h:64
#define MPC_FRAME_SIZE
Definition: mpc.h:41
ret
Definition: avfilter.c:821
t
Definition: genspecsines3.m:6
static void mpc7_decode_flush(AVCodecContext *avctx)
Definition: mpc7.c:314
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:524
#define MPC7_SCFI_BITS
Definition: mpc7data.h:34
#define INIT_VLC_USE_NEW_STATIC
Definition: get_bits.h:443
static void flush(AVCodecContext *avctx)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
int table_allocated
Definition: get_bits.h:66
Musepack decoder MPEG Audio Layer 1/2 -like codec with frames of 1152 samples divided into 32 subband...
static const int8_t mpc7_idx51[]
Definition: mpc7data.h:31
int scfi[2]
Definition: mpc.h:47
main external API structure.
DSPContext dsp
Definition: mpc.h:53
static VLC hdr_vlc
Definition: mpc7.c:40
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
AVCodec ff_mpc7_decoder
Definition: mpc7.c:330
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
static void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst)
Fill samples for given subband.
Definition: mpc7.c:143
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
Definition: get_bits.h:426
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
Definition: lfg.h:38
void * buf
Definition: avisynth_c.h:594
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
int oldDSCF[2][BANDS]
Definition: mpc.h:60
#define MPC7_HDR_BITS
Definition: mpc7data.h:47
synthesis window for stochastic i
void(* bswap_buf)(uint32_t *dst, const uint32_t *src, int w)
Definition: dsputil.h:208
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
Definition: lfg.c:30
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
#define BANDS
Definition: imc.c:53
static av_cold int mpc7_decode_close(AVCodecContext *avctx)
Definition: mpc7.c:322
#define MPC7_SCFI_SIZE
Definition: mpc7data.h:33
Band bands[BANDS]
Definition: mpc.h:61
common internal api header.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
static double c[64]
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
static const uint16_t quant_offsets[MPC7_QUANT_VLC_TABLES *2+1]
Definition: mpc7.c:42
int MSS
Definition: mpc.h:56
DSP utils.
void ff_mpc_init(void)
static const int8_t mpc7_idx30[]
Definition: mpc7data.h:27
static VLC scfi_vlc
Definition: mpc7.c:40
int channels
number of audio channels
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
VLC_TYPE(* table)[2]
code, bits
Definition: get_bits.h:65
signed 16 bits, planar
Definition: samplefmt.h:58
#define LOCAL_ALIGNED_16(t, v,...)
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
struct MPCContext MPCContext
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:117
static const uint8_t mpc7_dscf[MPC7_DSCF_SIZE *2]
Definition: mpc7data.h:41
static int get_scale_idx(GetBitContext *gb, int ref)
Definition: mpc7.c:185
Subband structure - hold all variables for each subband.
Definition: mpc.h:44
This structure stores compressed data.
#define MPC7_DSCF_SIZE
Definition: mpc7data.h:39
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
static VLC quant_vlc[MPC7_QUANT_VLC_TABLES][2]
Definition: mpc7.c:40
Definition: mpc.h:52
int frames_to_skip
Definition: mpc.h:67