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"
33 #define WAVE_FORMAT_PCM 0x0001
39 #define BITSHIFTSIZE 2
41 #define TYPE_S16HL 3 /* signed 16 bit shorts: high-low */
42 #define TYPE_S16LH 5 /* signed 16 bit shorts: low-high */
48 #define V2LPCQOFFSET (1 << LPCQUANT)
52 #define VERBATIM_CKSIZE_SIZE 5
53 #define VERBATIM_BYTE_SIZE 8
54 #define CANONICAL_HEADER_SIZE 44
56 #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
57 #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
58 #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))
60 #define get_le16(gb) bswap_16(get_bits_long(gb, 16))
61 #define get_le32(gb) bswap_32(get_bits_long(gb, 32))
63 static uint32_t bswap_32(uint32_t x
){
64 x
= ((x
<<8)&0xFF00FF00) | ((x
>>8)&0x00FF00FF);
65 return (x
>>16) | (x
<<16);
68 static uint16_t bswap_16(uint16_t x
){
69 return (x
>>8) | (x
<<8);
72 /* converts fourcc string to int */
73 static int ff_get_fourcc(const char *s
){
74 //assert( strlen(s)==4 );
75 return (s
[0]) + (s
[1]<<8) + (s
[2]<<16) + (s
[3]<<24);
78 static unsigned int get_uint(ShortenContext
*s
, int k
)
81 k
= get_ur_golomb_shorten(&s
->gb
, ULONGSIZE
);
82 return get_ur_golomb_shorten(&s
->gb
, k
);
85 #if defined(CPU_COLDFIRE)
86 static void coldfire_lshift_samples(int n
, int shift
, int32_t *samples
) ICODE_ATTR_FLAC
;
87 static void coldfire_lshift_samples(int n
, int shift
, int32_t *samples
)
90 for (i = 0; i < n; i++)
94 "move.l %[n], %%d0 \n" /* d0 = loop counter */
97 "l2_shift:" /* main loop (unroll by 4) */
98 "movem.l (%[x]), %%d4-%%d7 \n"
100 "asl.l %[s], %%d5 \n"
101 "asl.l %[s], %%d6 \n"
102 "asl.l %[s], %%d7 \n"
103 "movem.l %%d4-%%d7, (%[x]) \n"
108 "l1_shift:" /* any loops left? */
111 "l3_shift:" /* remaining loops */
112 "move.l (%[x]), %%d4 \n"
113 "asl.l %[s], %%d4 \n"
114 "move.l %%d4, (%[x])+ \n"
118 "l4_shift:" /* exit */
119 : [n
] "+d" (n
), /* d1 */
120 [s
] "+d" (shift
), /* d2 */
121 [x
] "+a" (samples
) /* a0 */
123 : "%d0", "%d4", "%d5", "%d6", "%d7"
128 static inline void fix_bitshift(ShortenContext
*s
, int32_t *samples
)
132 /* Wrapped samples don't get bitshifted, so we'll do them during
133 the next iteration. */
134 if (s
->bitshift
!= 0) {
135 #if defined(CPU_COLDFIRE)
136 coldfire_lshift_samples(s
->blocksize
, s
->bitshift
, samples
- s
->nwrap
);
138 for (i
= -s
->nwrap
; i
< (s
->blocksize
- s
->nwrap
); i
++)
139 samples
[i
] <<= s
->bitshift
;
143 /* Also, when we have to remember to fix the wrapped samples when
144 the bitshift changes.*/
145 if (s
->bitshift
!= s
->last_bitshift
) {
146 if (s
->last_bitshift
!= 0)
147 for (i
= -s
->nwrap
; i
< 0; i
++)
148 samples
[i
] <<= s
->last_bitshift
;
150 s
->last_bitshift
= s
->bitshift
;
154 static inline void decode_subframe_lpc(ShortenContext
*s
, int32_t *decoded
,
155 int residual_size
, int pred_order
)
158 int coeffs
[MAX_PRED_ORDER
];
160 for (i
=0; i
<pred_order
; i
++) {
161 coeffs
[i
] = get_sr_golomb_shorten(&s
->gb
, LPCQUANT
);
164 for (i
=0; i
< s
->blocksize
; i
++) {
166 for (j
=0; j
<pred_order
; j
++)
167 sum
+= coeffs
[j
] * decoded
[i
-j
-1];
170 get_sr_golomb_shorten(&s
->gb
, residual_size
) + (sum
>> LPCQUANT
);
174 static inline int shorten_decode_frame(ShortenContext
*s
, int32_t *decoded
,
180 int cmd
= get_ur_golomb_shorten(&s
->gb
, FNSIZE
);
189 int residual_size
= 0;
191 if (cmd
!= FN_ZERO
) {
192 residual_size
= get_ur_golomb_shorten(&s
->gb
, ENERGYSIZE
);
193 /* this is a hack as version 0 differed in defintion of
194 get_sr_golomb_shorten */
202 sum
= (s
->version
< 2) ? 0 : s
->nmean
/ 2;
203 for (i
=0; i
<s
->nmean
; i
++)
206 coffset
= sum
/ s
->nmean
;
208 coffset
>>= FFMIN(1, s
->bitshift
);
213 for (i
=0; i
<s
->blocksize
; i
++)
218 for (i
=0; i
<s
->blocksize
; i
++)
220 get_sr_golomb_shorten(&s
->gb
, residual_size
) +
225 for (i
=0; i
<s
->blocksize
; i
++)
227 get_sr_golomb_shorten(&s
->gb
, residual_size
) +
232 for (i
=0; i
<s
->blocksize
; i
++)
234 get_sr_golomb_shorten(&s
->gb
, residual_size
) +
235 2*decoded
[i
-1] - decoded
[i
-2];
239 for (i
=0; i
<s
->blocksize
; i
++)
241 get_sr_golomb_shorten(&s
->gb
, residual_size
) +
242 3*decoded
[i
-1] - 3*decoded
[i
-2] + decoded
[i
-3];
247 int pred_order
= get_ur_golomb_shorten(&s
->gb
, LPCQSIZE
);
248 for (i
=0; i
<pred_order
; i
++)
249 decoded
[i
- pred_order
] -= coffset
;
250 decode_subframe_lpc(s
, decoded
, residual_size
, pred_order
);
252 for (i
=0; i
< s
->blocksize
; i
++)
253 decoded
[i
] += coffset
;
259 sum
= (s
->version
< 2) ? 0 : s
->blocksize
/ 2;
260 for (i
=0; i
<s
->blocksize
; i
++)
263 for (i
=1; i
<s
->nmean
; i
++)
264 offset
[i
-1] = offset
[i
];
266 if (s
->version
< 2) {
267 offset
[s
->nmean
- 1] = sum
/ s
->blocksize
;
269 offset
[s
->nmean
- 1] =
270 (sum
/ s
->blocksize
) << s
->bitshift
;
274 fix_bitshift(s
, decoded
);
279 i
= get_ur_golomb_shorten(&s
->gb
, VERBATIM_CKSIZE_SIZE
);
281 get_ur_golomb_shorten(&s
->gb
, VERBATIM_BYTE_SIZE
);
285 s
->bitshift
= get_ur_golomb_shorten(&s
->gb
, BITSHIFTSIZE
);
289 s
->blocksize
= get_uint(s
, av_log2(s
->blocksize
));
303 int shorten_decode_frames(ShortenContext
*s
, int *nsamples
,
304 int32_t *decoded0
, int32_t *decoded1
,
305 int32_t *offset0
, int32_t *offset1
,
306 uint8_t *buf
, int buf_size
,
309 int32_t *decoded
, *offset
;
314 init_get_bits(&s
->gb
, buf
, buf_size
*8);
315 get_bits(&s
->gb
, s
->bitindex
);
318 while (n
< NUM_DEC_LOOPS
) {
321 decoded
= decoded0
+ s
->nwrap
+ *nsamples
;
324 decoded
= decoded1
+ s
->nwrap
+ *nsamples
;
330 cmd
= shorten_decode_frame(s
, decoded
, offset
);
332 if (cmd
== FN_VERBATIM
|| cmd
== FN_BITSHIFT
|| cmd
== FN_BLOCKSIZE
) {
334 } else if (cmd
== FN_QUIT
|| cmd
== FN_ERROR
) {
338 *nsamples
+= chan
* s
->blocksize
;
343 /* Wrap the samples for the next loop */
345 for (i
= 0; i
< s
->nwrap
; i
++) {
346 decoded0
[i
] = decoded0
[*nsamples
+ i
];
347 decoded1
[i
] = decoded1
[*nsamples
+ i
];
350 /* Scale the samples for the pcmbuf */
351 int scale
= SHN_OUTPUT_DEPTH
- s
->bits_per_sample
;
352 #if defined(CPU_COLDFIRE)
353 coldfire_lshift_samples(*nsamples
, scale
, decoded0
+ s
->nwrap
);
354 coldfire_lshift_samples(*nsamples
, scale
, decoded1
+ s
->nwrap
);
356 for (i
= 0; i
< *nsamples
; i
++) {
357 decoded0
[i
+ s
->nwrap
] <<= scale
;
358 decoded1
[i
+ s
->nwrap
] <<= scale
;
366 static int decode_wave_header(ShortenContext
*s
,
373 init_get_bits(&hb
, header
, header_size
*8);
374 if (get_le32(&hb
) != MKTAG('R','I','F','F')) {
378 int chunk_size
= get_le32(&hb
);
380 if (get_le32(&hb
) != MKTAG('W','A','V','E')) {
384 while (get_le32(&hb
) != MKTAG('f','m','t',' ')) {
386 skip_bits(&hb
, 8*len
);
394 if (get_le16(&hb
) != WAVE_FORMAT_PCM
) {
398 s
->channels
= get_le16(&hb
);
399 if (s
->channels
> MAX_CHANNELS
) {
403 s
->sample_rate
= get_le32(&hb
);
406 //s->bit_rate = 8*get_le32(&hb);
408 int block_align
= get_le16(&hb
);
409 s
->totalsamples
= (chunk_size
- 36) / block_align
;
411 s
->bits_per_sample
= get_le16(&hb
);
412 if (s
->bits_per_sample
!= 16) {
424 int shorten_init(ShortenContext
* s
, uint8_t *buf
, int buf_size
)
428 s
->blocksize
= DEFAULT_BLOCK_SIZE
;
432 init_get_bits(&s
->gb
, buf
, buf_size
*8);
433 get_bits(&s
->gb
, s
->bitindex
);
435 /* shorten signature */
436 if (get_bits_long(&s
->gb
, 32) != bswap_32(ff_get_fourcc("ajkg"))) {
440 s
->version
= get_bits(&s
->gb
, 8);
442 int internal_ftype
= get_uint(s
, TYPESIZE
);
443 if ((internal_ftype
!= TYPE_S16HL
) && (internal_ftype
!= TYPE_S16LH
)) {
447 s
->channels
= get_uint(s
, CHANSIZE
);
448 if (s
->channels
> MAX_CHANNELS
) {
452 /* get blocksize if version > 0 */
454 if (s
->version
> 0) {
455 s
->blocksize
= get_uint(s
, av_log2(DEFAULT_BLOCK_SIZE
));
456 maxnlpc
= get_uint(s
, LPCQSIZE
);
457 s
->nmean
= get_uint(s
, 0);
459 int skip_bytes
= get_uint(s
, NSKIPSIZE
);
460 for (i
=0; i
<skip_bytes
; i
++) {
461 skip_bits(&s
->gb
, 8);
465 if (s
->nmean
> MAX_NMEAN
) {
469 s
->nwrap
= FFMAX(NWRAP
, maxnlpc
);
470 if (s
->nwrap
> MAX_NWRAP
) {
475 s
->lpcqoffset
= V2LPCQOFFSET
;
477 if (get_ur_golomb_shorten(&s
->gb
, FNSIZE
) != FN_VERBATIM
) {
481 uint8_t header
[MAX_HEADER_SIZE
];
482 int header_size
= get_ur_golomb_shorten(&s
->gb
, VERBATIM_CKSIZE_SIZE
);
483 if (header_size
>= MAX_HEADER_SIZE
|| header_size
< CANONICAL_HEADER_SIZE
) {
487 for (i
=0; i
<header_size
; i
++)
488 header
[i
] = (char)get_ur_golomb_shorten(&s
->gb
, VERBATIM_BYTE_SIZE
);
490 s
->header_bits
= s
->gb
.index
;
492 return decode_wave_header(s
, header
, header_size
);