3 * Copyright (c) 2005 Jeff Muizelaar
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 * @author Jeff Muizelaar
27 #include "bitstream.h"
34 #define WAVE_FORMAT_PCM 0x0001
40 #define BITSHIFTSIZE 2
42 #define TYPE_S16HL 3 /* signed 16 bit shorts: high-low */
43 #define TYPE_S16LH 5 /* signed 16 bit shorts: low-high */
49 #define V2LPCQOFFSET (1 << LPCQUANT)
53 #define VERBATIM_CKSIZE_SIZE 5
54 #define VERBATIM_BYTE_SIZE 8
55 #define CANONICAL_HEADER_SIZE 44
57 #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))
59 #define get_le16(gb) bswap_16(get_bits_long(gb, 16))
60 #define get_le32(gb) bswap_32(get_bits_long(gb, 32))
62 /* converts fourcc string to int */
63 static unsigned int ff_get_fourcc(const char *s
){
64 //assert( strlen(s)==4 );
65 return (s
[0]) + (s
[1]<<8) + (s
[2]<<16) + (s
[3]<<24);
68 static unsigned int get_uint(ShortenContext
*s
, int k
)
71 k
= get_ur_golomb_shorten(&s
->gb
, ULONGSIZE
);
72 return get_ur_golomb_shorten(&s
->gb
, k
);
75 #if defined(CPU_COLDFIRE)
76 static inline void coldfire_lshift_samples(int n
, int shift
, int32_t *samples
)
79 for (i = 0; i < n; i++)
83 "move.l %[n], %%d0 \n" /* d0 = loop counter */
86 "2:" /* main loop (unroll by 4) */
87 "movem.l (%[x]), %%d4-%%d7 \n"
92 "movem.l %%d4-%%d7, (%[x]) \n"
93 "lea.l (16, %[x]), %[x] \n"
97 "1:" /* any loops left? */
100 "3:" /* remaining loops */
101 "move.l (%[x]), %%d4 \n"
102 "asl.l %[s], %%d4 \n"
103 "move.l %%d4, (%[x])+ \n"
111 : "%d0", "%d4", "%d5", "%d6", "%d7", "cc", "memory"
116 static inline void fix_bitshift(ShortenContext
*s
, int32_t *samples
)
120 /* Wrapped samples don't get bitshifted, so we'll do them during
121 the next iteration. */
122 if (s
->bitshift
!= 0) {
123 #if defined(CPU_COLDFIRE)
124 coldfire_lshift_samples(s
->blocksize
, s
->bitshift
, samples
- s
->nwrap
);
126 for (i
= -s
->nwrap
; i
< (s
->blocksize
- s
->nwrap
); i
++)
127 samples
[i
] <<= s
->bitshift
;
131 /* Also, when we have to remember to fix the wrapped samples when
132 the bitshift changes.*/
133 if (s
->bitshift
!= s
->last_bitshift
) {
134 if (s
->last_bitshift
!= 0)
135 for (i
= -s
->nwrap
; i
< 0; i
++)
136 samples
[i
] <<= s
->last_bitshift
;
138 s
->last_bitshift
= s
->bitshift
;
142 static inline void decode_subframe_lpc(ShortenContext
*s
, int32_t *decoded
,
143 int residual_size
, int pred_order
)
146 int coeffs
[MAX_PRED_ORDER
];
148 for (i
=0; i
<pred_order
; i
++) {
149 coeffs
[i
] = get_sr_golomb_shorten(&s
->gb
, LPCQUANT
);
152 for (i
=0; i
< s
->blocksize
; i
++) {
154 for (j
=0; j
<pred_order
; j
++)
155 sum
+= coeffs
[j
] * decoded
[i
-j
-1];
158 get_sr_golomb_shorten(&s
->gb
, residual_size
) + (sum
>> LPCQUANT
);
162 static inline int shorten_decode_frame(ShortenContext
*s
, int32_t *decoded
,
168 int cmd
= get_ur_golomb_shorten(&s
->gb
, FNSIZE
);
177 int residual_size
= 0;
179 if (cmd
!= FN_ZERO
) {
180 residual_size
= get_ur_golomb_shorten(&s
->gb
, ENERGYSIZE
);
181 /* this is a hack as version 0 differed in defintion of
182 get_sr_golomb_shorten */
190 sum
= (s
->version
< 2) ? 0 : s
->nmean
/ 2;
191 for (i
=0; i
<s
->nmean
; i
++)
194 coffset
= sum
/ s
->nmean
;
196 coffset
>>= FFMIN(1, s
->bitshift
);
201 for (i
=0; i
<s
->blocksize
; i
++)
206 for (i
=0; i
<s
->blocksize
; i
++)
208 get_sr_golomb_shorten(&s
->gb
, residual_size
) +
213 for (i
=0; i
<s
->blocksize
; i
++)
215 get_sr_golomb_shorten(&s
->gb
, residual_size
) +
220 for (i
=0; i
<s
->blocksize
; i
++)
222 get_sr_golomb_shorten(&s
->gb
, residual_size
) +
223 2*decoded
[i
-1] - decoded
[i
-2];
227 for (i
=0; i
<s
->blocksize
; i
++)
229 get_sr_golomb_shorten(&s
->gb
, residual_size
) +
230 3*decoded
[i
-1] - 3*decoded
[i
-2] + decoded
[i
-3];
235 int pred_order
= get_ur_golomb_shorten(&s
->gb
, LPCQSIZE
);
236 for (i
=0; i
<pred_order
; i
++)
237 decoded
[i
- pred_order
] -= coffset
;
238 decode_subframe_lpc(s
, decoded
, residual_size
, pred_order
);
240 for (i
=0; i
< s
->blocksize
; i
++)
241 decoded
[i
] += coffset
;
247 sum
= (s
->version
< 2) ? 0 : s
->blocksize
/ 2;
248 for (i
=0; i
<s
->blocksize
; i
++)
251 for (i
=1; i
<s
->nmean
; i
++)
252 offset
[i
-1] = offset
[i
];
254 if (s
->version
< 2) {
255 offset
[s
->nmean
- 1] = sum
/ s
->blocksize
;
257 offset
[s
->nmean
- 1] =
258 (sum
/ s
->blocksize
) << s
->bitshift
;
262 fix_bitshift(s
, decoded
);
267 i
= get_ur_golomb_shorten(&s
->gb
, VERBATIM_CKSIZE_SIZE
);
269 get_ur_golomb_shorten(&s
->gb
, VERBATIM_BYTE_SIZE
);
273 s
->bitshift
= get_ur_golomb_shorten(&s
->gb
, BITSHIFTSIZE
);
277 s
->blocksize
= get_uint(s
, av_log2(s
->blocksize
));
291 int shorten_decode_frames(ShortenContext
*s
, int *nsamples
,
292 int32_t *decoded0
, int32_t *decoded1
,
293 int32_t *offset0
, int32_t *offset1
,
294 uint8_t *buf
, int buf_size
,
297 int32_t *decoded
, *offset
;
302 init_get_bits(&s
->gb
, buf
, buf_size
*8);
303 get_bits(&s
->gb
, s
->bitindex
);
306 while (n
< NUM_DEC_LOOPS
) {
309 decoded
= decoded0
+ s
->nwrap
+ *nsamples
;
312 decoded
= decoded1
+ s
->nwrap
+ *nsamples
;
318 cmd
= shorten_decode_frame(s
, decoded
, offset
);
320 if (cmd
== FN_VERBATIM
|| cmd
== FN_BITSHIFT
|| cmd
== FN_BLOCKSIZE
) {
322 } else if (cmd
== FN_QUIT
|| cmd
== FN_ERROR
) {
326 *nsamples
+= chan
* s
->blocksize
;
331 /* Wrap the samples for the next loop */
333 for (i
= 0; i
< s
->nwrap
; i
++) {
334 decoded0
[i
] = decoded0
[*nsamples
+ i
];
335 decoded1
[i
] = decoded1
[*nsamples
+ i
];
338 /* Scale the samples for the pcmbuf */
339 int scale
= SHN_OUTPUT_DEPTH
- s
->bits_per_sample
;
340 #if defined(CPU_COLDFIRE)
341 coldfire_lshift_samples(*nsamples
, scale
, decoded0
+ s
->nwrap
);
342 coldfire_lshift_samples(*nsamples
, scale
, decoded1
+ s
->nwrap
);
344 for (i
= 0; i
< *nsamples
; i
++) {
345 decoded0
[i
+ s
->nwrap
] <<= scale
;
346 decoded1
[i
+ s
->nwrap
] <<= scale
;
354 static int decode_wave_header(ShortenContext
*s
,
361 init_get_bits(&hb
, header
, header_size
*8);
362 if (get_le32(&hb
) != MKTAG('R','I','F','F')) {
366 int chunk_size
= get_le32(&hb
);
368 if (get_le32(&hb
) != MKTAG('W','A','V','E')) {
372 while (get_le32(&hb
) != MKTAG('f','m','t',' ')) {
374 skip_bits(&hb
, 8*len
);
382 if (get_le16(&hb
) != WAVE_FORMAT_PCM
) {
386 s
->channels
= get_le16(&hb
);
387 if (s
->channels
> MAX_CHANNELS
) {
391 s
->sample_rate
= get_le32(&hb
);
394 //s->bit_rate = 8*get_le32(&hb);
396 int block_align
= get_le16(&hb
);
397 s
->totalsamples
= (chunk_size
- 36) / block_align
;
399 s
->bits_per_sample
= get_le16(&hb
);
400 if (s
->bits_per_sample
!= 16) {
412 int shorten_init(ShortenContext
* s
, uint8_t *buf
, int buf_size
)
416 s
->blocksize
= DEFAULT_BLOCK_SIZE
;
420 init_get_bits(&s
->gb
, buf
, buf_size
*8);
421 get_bits(&s
->gb
, s
->bitindex
);
423 /* shorten signature */
424 if (get_bits_long(&s
->gb
, 32) != bswap_32(ff_get_fourcc("ajkg"))) {
428 s
->version
= get_bits(&s
->gb
, 8);
430 int internal_ftype
= get_uint(s
, TYPESIZE
);
431 if ((internal_ftype
!= TYPE_S16HL
) && (internal_ftype
!= TYPE_S16LH
)) {
435 s
->channels
= get_uint(s
, CHANSIZE
);
436 if (s
->channels
> MAX_CHANNELS
) {
440 /* get blocksize if version > 0 */
442 if (s
->version
> 0) {
443 s
->blocksize
= get_uint(s
, av_log2(DEFAULT_BLOCK_SIZE
));
444 maxnlpc
= get_uint(s
, LPCQSIZE
);
445 s
->nmean
= get_uint(s
, 0);
447 int skip_bytes
= get_uint(s
, NSKIPSIZE
);
448 for (i
=0; i
<skip_bytes
; i
++) {
449 skip_bits(&s
->gb
, 8);
453 if (s
->nmean
> MAX_NMEAN
) {
457 s
->nwrap
= FFMAX(NWRAP
, maxnlpc
);
458 if (s
->nwrap
> MAX_NWRAP
) {
463 s
->lpcqoffset
= V2LPCQOFFSET
;
465 if (get_ur_golomb_shorten(&s
->gb
, FNSIZE
) != FN_VERBATIM
) {
469 uint8_t header
[MAX_HEADER_SIZE
];
470 int header_size
= get_ur_golomb_shorten(&s
->gb
, VERBATIM_CKSIZE_SIZE
);
471 if (header_size
>= MAX_HEADER_SIZE
|| header_size
< CANONICAL_HEADER_SIZE
) {
475 for (i
=0; i
<header_size
; i
++)
476 header
[i
] = (char)get_ur_golomb_shorten(&s
->gb
, VERBATIM_BYTE_SIZE
);
478 s
->header_bits
= s
->gb
.index
;
480 return decode_wave_header(s
, header
, header_size
);