3 * Copyright (c) 2005 Jeff Muizelaar
5 * This file is part of FFmpeg.
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.
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.
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
25 * @author Jeff Muizelaar
31 #include "bytestream.h"
36 #define MAX_CHANNELS 8
37 #define MAX_BLOCKSIZE 65535
39 #define OUT_BUFFER_SIZE 16384
43 #define WAVE_FORMAT_PCM 0x0001
45 #define DEFAULT_BLOCK_SIZE 256
51 #define BITSHIFTSIZE 2
64 #define V2LPCQOFFSET (1 << LPCQUANT)
72 #define FN_BLOCKSIZE 5
78 /** indicates if the FN_* command is audio or non-audio */
79 static const uint8_t is_audio_command
[10] = { 1, 1, 1, 1, 0, 0, 0, 1, 1, 0 };
81 #define VERBATIM_CKSIZE_SIZE 5
82 #define VERBATIM_BYTE_SIZE 8
83 #define CANONICAL_HEADER_SIZE 44
85 typedef struct ShortenContext
{
86 AVCodecContext
*avctx
;
89 int min_framesize
, max_framesize
;
92 int32_t *decoded
[MAX_CHANNELS
];
93 int32_t *decoded_base
[MAX_CHANNELS
];
94 int32_t *offset
[MAX_CHANNELS
];
99 unsigned int allocated_bitstream_size
;
101 uint8_t header
[OUT_BUFFER_SIZE
];
112 int got_quit_command
;
115 static av_cold
int shorten_decode_init(AVCodecContext
*avctx
)
117 ShortenContext
*s
= avctx
->priv_data
;
123 static int allocate_buffers(ShortenContext
*s
)
127 for (chan
= 0; chan
< s
->channels
; chan
++) {
128 if (FFMAX(1, s
->nmean
) >= UINT_MAX
/ sizeof(int32_t)) {
129 av_log(s
->avctx
, AV_LOG_ERROR
, "nmean too large\n");
130 return AVERROR_INVALIDDATA
;
132 if (s
->blocksize
+ s
->nwrap
>= UINT_MAX
/ sizeof(int32_t) ||
133 s
->blocksize
+ s
->nwrap
<= (unsigned)s
->nwrap
) {
134 av_log(s
->avctx
, AV_LOG_ERROR
,
135 "s->blocksize + s->nwrap too large\n");
136 return AVERROR_INVALIDDATA
;
139 if ((err
= av_reallocp(&s
->offset
[chan
],
141 FFMAX(1, s
->nmean
))) < 0)
144 if ((err
= av_reallocp(&s
->decoded_base
[chan
], (s
->blocksize
+ s
->nwrap
) *
145 sizeof(s
->decoded_base
[0][0]))) < 0)
147 for (i
= 0; i
< s
->nwrap
; i
++)
148 s
->decoded_base
[chan
][i
] = 0;
149 s
->decoded
[chan
] = s
->decoded_base
[chan
] + s
->nwrap
;
152 if ((err
= av_reallocp(&s
->coeffs
, s
->nwrap
* sizeof(*s
->coeffs
))) < 0)
158 static inline unsigned int get_uint(ShortenContext
*s
, int k
)
161 k
= get_ur_golomb_shorten(&s
->gb
, ULONGSIZE
);
162 return get_ur_golomb_shorten(&s
->gb
, k
);
165 static void fix_bitshift(ShortenContext
*s
, int32_t *buffer
)
169 if (s
->bitshift
!= 0)
170 for (i
= 0; i
< s
->blocksize
; i
++)
171 buffer
[i
] <<= s
->bitshift
;
174 static int init_offset(ShortenContext
*s
)
178 int nblock
= FFMAX(1, s
->nmean
);
179 /* initialise offset */
180 switch (s
->internal_ftype
) {
182 s
->avctx
->sample_fmt
= AV_SAMPLE_FMT_U8P
;
187 s
->avctx
->sample_fmt
= AV_SAMPLE_FMT_S16P
;
190 av_log(s
->avctx
, AV_LOG_ERROR
, "unknown audio type\n");
191 return AVERROR_PATCHWELCOME
;
194 for (chan
= 0; chan
< s
->channels
; chan
++)
195 for (i
= 0; i
< nblock
; i
++)
196 s
->offset
[chan
][i
] = mean
;
200 static int decode_wave_header(AVCodecContext
*avctx
, const uint8_t *header
,
207 bytestream2_init(&gb
, header
, header_size
);
209 if (bytestream2_get_le32(&gb
) != MKTAG('R', 'I', 'F', 'F')) {
210 av_log(avctx
, AV_LOG_ERROR
, "missing RIFF tag\n");
211 return AVERROR_INVALIDDATA
;
214 bytestream2_skip(&gb
, 4); /* chunk size */
216 if (bytestream2_get_le32(&gb
) != MKTAG('W', 'A', 'V', 'E')) {
217 av_log(avctx
, AV_LOG_ERROR
, "missing WAVE tag\n");
218 return AVERROR_INVALIDDATA
;
221 while (bytestream2_get_le32(&gb
) != MKTAG('f', 'm', 't', ' ')) {
222 len
= bytestream2_get_le32(&gb
);
223 bytestream2_skip(&gb
, len
);
224 if (len
< 0 || bytestream2_get_bytes_left(&gb
) < 16) {
225 av_log(avctx
, AV_LOG_ERROR
, "no fmt chunk found\n");
226 return AVERROR_INVALIDDATA
;
229 len
= bytestream2_get_le32(&gb
);
232 av_log(avctx
, AV_LOG_ERROR
, "fmt chunk was too short\n");
233 return AVERROR_INVALIDDATA
;
236 wave_format
= bytestream2_get_le16(&gb
);
238 switch (wave_format
) {
239 case WAVE_FORMAT_PCM
:
242 av_log(avctx
, AV_LOG_ERROR
, "unsupported wave format\n");
243 return AVERROR(ENOSYS
);
246 bytestream2_skip(&gb
, 2); // skip channels (already got from shorten header)
247 avctx
->sample_rate
= bytestream2_get_le32(&gb
);
248 bytestream2_skip(&gb
, 4); // skip bit rate (represents original uncompressed bit rate)
249 bytestream2_skip(&gb
, 2); // skip block align (not needed)
250 bps
= bytestream2_get_le16(&gb
);
251 avctx
->bits_per_coded_sample
= bps
;
253 if (bps
!= 16 && bps
!= 8) {
254 av_log(avctx
, AV_LOG_ERROR
, "unsupported number of bits per sample: %d\n", bps
);
255 return AVERROR(ENOSYS
);
260 av_log(avctx
, AV_LOG_INFO
, "%d header bytes unparsed\n", len
);
265 static const int fixed_coeffs
[][3] = {
272 static int decode_subframe_lpc(ShortenContext
*s
, int command
, int channel
,
273 int residual_size
, int32_t coffset
)
275 int pred_order
, sum
, qshift
, init_sum
, i
, j
;
278 if (command
== FN_QLPC
) {
279 /* read/validate prediction order */
280 pred_order
= get_ur_golomb_shorten(&s
->gb
, LPCQSIZE
);
281 if (pred_order
> s
->nwrap
) {
282 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid pred_order %d\n",
284 return AVERROR(EINVAL
);
286 /* read LPC coefficients */
287 for (i
= 0; i
< pred_order
; i
++)
288 s
->coeffs
[i
] = get_sr_golomb_shorten(&s
->gb
, LPCQUANT
);
293 /* fixed LPC coeffs */
294 pred_order
= command
;
295 if (pred_order
>= FF_ARRAY_ELEMS(fixed_coeffs
)) {
296 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid pred_order %d\n",
298 return AVERROR_INVALIDDATA
;
300 coeffs
= fixed_coeffs
[pred_order
];
304 /* subtract offset from previous samples to use in prediction */
305 if (command
== FN_QLPC
&& coffset
)
306 for (i
= -pred_order
; i
< 0; i
++)
307 s
->decoded
[channel
][i
] -= coffset
;
309 /* decode residual and do LPC prediction */
310 init_sum
= pred_order
? (command
== FN_QLPC
? s
->lpcqoffset
: 0) : coffset
;
311 for (i
= 0; i
< s
->blocksize
; i
++) {
313 for (j
= 0; j
< pred_order
; j
++)
314 sum
+= coeffs
[j
] * s
->decoded
[channel
][i
- j
- 1];
315 s
->decoded
[channel
][i
] = get_sr_golomb_shorten(&s
->gb
, residual_size
) +
319 /* add offset to current samples */
320 if (command
== FN_QLPC
&& coffset
)
321 for (i
= 0; i
< s
->blocksize
; i
++)
322 s
->decoded
[channel
][i
] += coffset
;
327 static int read_header(ShortenContext
*s
)
331 /* shorten signature */
332 if (get_bits_long(&s
->gb
, 32) != AV_RB32("ajkg")) {
333 av_log(s
->avctx
, AV_LOG_ERROR
, "missing shorten magic 'ajkg'\n");
334 return AVERROR_INVALIDDATA
;
338 s
->blocksize
= DEFAULT_BLOCK_SIZE
;
340 s
->version
= get_bits(&s
->gb
, 8);
341 s
->internal_ftype
= get_uint(s
, TYPESIZE
);
343 s
->channels
= get_uint(s
, CHANSIZE
);
345 av_log(s
->avctx
, AV_LOG_ERROR
, "No channels reported\n");
346 return AVERROR_INVALIDDATA
;
348 if (s
->channels
> MAX_CHANNELS
) {
349 av_log(s
->avctx
, AV_LOG_ERROR
, "too many channels: %d\n", s
->channels
);
351 return AVERROR_INVALIDDATA
;
353 s
->avctx
->channels
= s
->channels
;
355 /* get blocksize if version > 0 */
356 if (s
->version
> 0) {
360 blocksize
= get_uint(s
, av_log2(DEFAULT_BLOCK_SIZE
));
361 if (!blocksize
|| blocksize
> MAX_BLOCKSIZE
) {
362 av_log(s
->avctx
, AV_LOG_ERROR
,
363 "invalid or unsupported block size: %d\n",
365 return AVERROR(EINVAL
);
367 s
->blocksize
= blocksize
;
369 maxnlpc
= get_uint(s
, LPCQSIZE
);
370 s
->nmean
= get_uint(s
, 0);
372 skip_bytes
= get_uint(s
, NSKIPSIZE
);
373 for (i
= 0; i
< skip_bytes
; i
++)
374 skip_bits(&s
->gb
, 8);
376 s
->nwrap
= FFMAX(NWRAP
, maxnlpc
);
378 if ((ret
= allocate_buffers(s
)) < 0)
381 if ((ret
= init_offset(s
)) < 0)
385 s
->lpcqoffset
= V2LPCQOFFSET
;
387 if (get_ur_golomb_shorten(&s
->gb
, FNSIZE
) != FN_VERBATIM
) {
388 av_log(s
->avctx
, AV_LOG_ERROR
,
389 "missing verbatim section at beginning of stream\n");
390 return AVERROR_INVALIDDATA
;
393 s
->header_size
= get_ur_golomb_shorten(&s
->gb
, VERBATIM_CKSIZE_SIZE
);
394 if (s
->header_size
>= OUT_BUFFER_SIZE
||
395 s
->header_size
< CANONICAL_HEADER_SIZE
) {
396 av_log(s
->avctx
, AV_LOG_ERROR
, "header is wrong size: %d\n",
398 return AVERROR_INVALIDDATA
;
401 for (i
= 0; i
< s
->header_size
; i
++)
402 s
->header
[i
] = (char)get_ur_golomb_shorten(&s
->gb
, VERBATIM_BYTE_SIZE
);
404 if ((ret
= decode_wave_header(s
->avctx
, s
->header
, s
->header_size
)) < 0)
415 static int shorten_decode_frame(AVCodecContext
*avctx
, void *data
,
416 int *got_frame_ptr
, AVPacket
*avpkt
)
418 AVFrame
*frame
= data
;
419 const uint8_t *buf
= avpkt
->data
;
420 int buf_size
= avpkt
->size
;
421 ShortenContext
*s
= avctx
->priv_data
;
422 int i
, input_buf_size
= 0;
425 /* allocate internal bitstream buffer */
426 if (s
->max_framesize
== 0) {
428 s
->max_framesize
= 8192; // should hopefully be enough for the first header
429 tmp_ptr
= av_fast_realloc(s
->bitstream
, &s
->allocated_bitstream_size
,
430 s
->max_framesize
+ FF_INPUT_BUFFER_PADDING_SIZE
);
432 av_log(avctx
, AV_LOG_ERROR
, "error allocating bitstream buffer\n");
433 return AVERROR(ENOMEM
);
435 memset(tmp_ptr
, 0, s
->allocated_bitstream_size
);
436 s
->bitstream
= tmp_ptr
;
439 /* append current packet data to bitstream buffer */
440 if (1 && s
->max_framesize
) { //FIXME truncated
441 buf_size
= FFMIN(buf_size
, s
->max_framesize
- s
->bitstream_size
);
442 input_buf_size
= buf_size
;
444 if (s
->bitstream_index
+ s
->bitstream_size
+ buf_size
+ FF_INPUT_BUFFER_PADDING_SIZE
>
445 s
->allocated_bitstream_size
) {
446 memmove(s
->bitstream
, &s
->bitstream
[s
->bitstream_index
],
448 s
->bitstream_index
= 0;
451 memcpy(&s
->bitstream
[s
->bitstream_index
+ s
->bitstream_size
], buf
,
453 buf
= &s
->bitstream
[s
->bitstream_index
];
454 buf_size
+= s
->bitstream_size
;
455 s
->bitstream_size
= buf_size
;
457 /* do not decode until buffer has at least max_framesize bytes or
458 * the end of the file has been reached */
459 if (buf_size
< s
->max_framesize
&& avpkt
->data
) {
461 return input_buf_size
;
464 /* init and position bitstream reader */
465 init_get_bits(&s
->gb
, buf
, buf_size
* 8);
466 skip_bits(&s
->gb
, s
->bitindex
);
468 /* process header or next subblock */
469 if (!s
->got_header
) {
470 if ((ret
= read_header(s
)) < 0)
476 /* if quit command was read previously, don't decode anything */
477 if (s
->got_quit_command
) {
483 while (s
->cur_chan
< s
->channels
) {
487 if (get_bits_left(&s
->gb
) < 3 + FNSIZE
) {
492 cmd
= get_ur_golomb_shorten(&s
->gb
, FNSIZE
);
494 if (cmd
> FN_VERBATIM
) {
495 av_log(avctx
, AV_LOG_ERROR
, "unknown shorten function %d\n", cmd
);
500 if (!is_audio_command
[cmd
]) {
501 /* process non-audio command */
504 len
= get_ur_golomb_shorten(&s
->gb
, VERBATIM_CKSIZE_SIZE
);
506 get_ur_golomb_shorten(&s
->gb
, VERBATIM_BYTE_SIZE
);
509 unsigned bitshift
= get_ur_golomb_shorten(&s
->gb
, BITSHIFTSIZE
);
511 av_log(avctx
, AV_LOG_ERROR
, "bitshift %d is invalid\n",
513 return AVERROR_PATCHWELCOME
;
515 s
->bitshift
= bitshift
;
519 unsigned blocksize
= get_uint(s
, av_log2(s
->blocksize
));
520 if (blocksize
> s
->blocksize
) {
521 av_log(avctx
, AV_LOG_ERROR
,
522 "Increasing block size is not supported\n");
523 return AVERROR_PATCHWELCOME
;
525 if (!blocksize
|| blocksize
> MAX_BLOCKSIZE
) {
526 av_log(avctx
, AV_LOG_ERROR
, "invalid or unsupported "
527 "block size: %d\n", blocksize
);
528 return AVERROR(EINVAL
);
530 s
->blocksize
= blocksize
;
534 s
->got_quit_command
= 1;
537 if (cmd
== FN_BLOCKSIZE
|| cmd
== FN_QUIT
) {
542 /* process audio command */
543 int residual_size
= 0;
544 int channel
= s
->cur_chan
;
547 /* get Rice code for residual decoding */
548 if (cmd
!= FN_ZERO
) {
549 residual_size
= get_ur_golomb_shorten(&s
->gb
, ENERGYSIZE
);
550 /* This is a hack as version 0 differed in the definition
551 * of get_sr_golomb_shorten(). */
556 /* calculate sample offset using means from previous blocks */
558 coffset
= s
->offset
[channel
][0];
560 int32_t sum
= (s
->version
< 2) ? 0 : s
->nmean
/ 2;
561 for (i
= 0; i
< s
->nmean
; i
++)
562 sum
+= s
->offset
[channel
][i
];
563 coffset
= sum
/ s
->nmean
;
565 coffset
= s
->bitshift
== 0 ? coffset
: coffset
>> s
->bitshift
- 1 >> 1;
568 /* decode samples for this channel */
569 if (cmd
== FN_ZERO
) {
570 for (i
= 0; i
< s
->blocksize
; i
++)
571 s
->decoded
[channel
][i
] = 0;
573 if ((ret
= decode_subframe_lpc(s
, cmd
, channel
,
574 residual_size
, coffset
)) < 0)
578 /* update means with info from the current block */
580 int32_t sum
= (s
->version
< 2) ? 0 : s
->blocksize
/ 2;
581 for (i
= 0; i
< s
->blocksize
; i
++)
582 sum
+= s
->decoded
[channel
][i
];
584 for (i
= 1; i
< s
->nmean
; i
++)
585 s
->offset
[channel
][i
- 1] = s
->offset
[channel
][i
];
588 s
->offset
[channel
][s
->nmean
- 1] = sum
/ s
->blocksize
;
590 s
->offset
[channel
][s
->nmean
- 1] = (sum
/ s
->blocksize
) << s
->bitshift
;
593 /* copy wrap samples for use with next block */
594 for (i
= -s
->nwrap
; i
< 0; i
++)
595 s
->decoded
[channel
][i
] = s
->decoded
[channel
][i
+ s
->blocksize
];
597 /* shift samples to add in unused zero bits which were removed
599 fix_bitshift(s
, s
->decoded
[channel
]);
601 /* if this is the last channel in the block, output the samples */
603 if (s
->cur_chan
== s
->channels
) {
605 int16_t *samples_s16
;
608 /* get output buffer */
609 frame
->nb_samples
= s
->blocksize
;
610 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0)
613 for (chan
= 0; chan
< s
->channels
; chan
++) {
614 samples_u8
= ((uint8_t **)frame
->extended_data
)[chan
];
615 samples_s16
= ((int16_t **)frame
->extended_data
)[chan
];
616 for (i
= 0; i
< s
->blocksize
; i
++) {
617 switch (s
->internal_ftype
) {
619 *samples_u8
++ = av_clip_uint8(s
->decoded
[chan
][i
]);
623 *samples_s16
++ = av_clip_int16(s
->decoded
[chan
][i
]);
633 if (s
->cur_chan
< s
->channels
)
637 s
->bitindex
= get_bits_count(&s
->gb
) - 8 * (get_bits_count(&s
->gb
) / 8);
638 i
= get_bits_count(&s
->gb
) / 8;
640 av_log(s
->avctx
, AV_LOG_ERROR
, "overread: %d\n", i
- buf_size
);
641 s
->bitstream_size
= 0;
642 s
->bitstream_index
= 0;
643 return AVERROR_INVALIDDATA
;
645 if (s
->bitstream_size
) {
646 s
->bitstream_index
+= i
;
647 s
->bitstream_size
-= i
;
648 return input_buf_size
;
653 static av_cold
int shorten_decode_close(AVCodecContext
*avctx
)
655 ShortenContext
*s
= avctx
->priv_data
;
658 for (i
= 0; i
< s
->channels
; i
++) {
659 s
->decoded
[i
] = NULL
;
660 av_freep(&s
->decoded_base
[i
]);
661 av_freep(&s
->offset
[i
]);
663 av_freep(&s
->bitstream
);
664 av_freep(&s
->coeffs
);
669 AVCodec ff_shorten_decoder
= {
671 .long_name
= NULL_IF_CONFIG_SMALL("Shorten"),
672 .type
= AVMEDIA_TYPE_AUDIO
,
673 .id
= AV_CODEC_ID_SHORTEN
,
674 .priv_data_size
= sizeof(ShortenContext
),
675 .init
= shorten_decode_init
,
676 .close
= shorten_decode_close
,
677 .decode
= shorten_decode_frame
,
678 .capabilities
= CODEC_CAP_DELAY
| CODEC_CAP_DR1
,
679 .sample_fmts
= (const enum AVSampleFormat
[]) { AV_SAMPLE_FMT_S16P
,
681 AV_SAMPLE_FMT_NONE
},