2 * Real Audio 1.0 (14.4K)
3 * Copyright (c) 2003 the ffmpeg project
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 #define DATABLOCK1 20 /* size of 14.4 input block in bytes */
24 #define DATACHUNK1 1440 /* size of 14.4 input chunk in bytes */
25 #define AUDIOBLOCK 160 /* size of output block in 16-bit words (320 bytes) */
26 #define AUDIOBUFFER 12288 /* size of output buffer in 16-bit words (24576 bytes) */
28 #define NBLOCKS 4 /* number of segments within a block */
29 #define BLOCKSIZE 40 /* (quarter) block size in 16-bit words (80 bytes) */
30 #define HALFBLOCK 20 /* BLOCKSIZE/2 */
31 #define BUFFERSIZE 146 /* for do_output */
34 /* internal globals */
36 unsigned int resetflag
, val
, oldval
;
37 unsigned int unpacked
[28]; /* buffer for unpacked input */
38 unsigned int *iptr
; /* pointer to current input (from unpacked) */
41 unsigned int gbuf1
[8];
42 unsigned short gbuf2
[120];
43 signed short output_buffer
[40];
44 unsigned int *decptr
; /* decoder ptr */
47 /* the swapped buffers */
48 unsigned int swapb1a
[10];
49 unsigned int swapb2a
[10];
50 unsigned int swapb1b
[10];
51 unsigned int swapb2b
[10];
52 unsigned int *swapbuf1
;
53 unsigned int *swapbuf2
;
54 unsigned int *swapbuf1alt
;
55 unsigned int *swapbuf2alt
;
57 unsigned int buffer
[5];
58 unsigned short int buffer_2
[148];
59 unsigned short int buffer_a
[40];
60 unsigned short int buffer_b
[40];
61 unsigned short int buffer_c
[40];
62 unsigned short int buffer_d
[40];
64 unsigned short int work
[50];
70 signed short wavtable1
[2304];
71 unsigned short wavtable2
[2304];
74 static int ra144_decode_init(AVCodecContext
* avctx
)
76 Real144_internal
*glob
=avctx
->priv_data
;
78 memset(glob
,0,sizeof(Real144_internal
));
80 glob
->swapbuf1
=glob
->swapb1a
;
81 glob
->swapbuf2
=glob
->swapb2a
;
82 glob
->swapbuf1alt
=glob
->swapb1b
;
83 glob
->swapbuf2alt
=glob
->swapb2b
;
85 memcpy(glob
->wavtable1
,wavtable1
,sizeof(wavtable1
));
86 memcpy(glob
->wavtable2
,wavtable2
,sizeof(wavtable2
));
91 static void final(Real144_internal
*glob
, short *i1
, short *i2
, void *out
, int *statbuf
, int len
);
92 static void add_wav(Real144_internal
*glob
, int n
, int f
, int m1
, int m2
, int m3
, short *s1
, short *s2
, short *s3
, short *dest
);
93 static int irms(short *data
, int factor
);
94 static void rotate_block(short *source
, short *target
, int offset
);
95 /* lookup square roots in table */
96 static int t_sqrt(unsigned int x
)
99 while (x
>0xfff) { s
++; x
=x
>>2; }
100 return (sqrt_table
[x
]<<s
)<<2;
104 static void do_voice(int *a1
, int *a2
)
120 b1
[y
]=(((*a1
)*(*(--ptr
)))>>12)+b2
[y
];
128 while (ptr
>a2
) (*a2
++)>>=4;
132 /* do quarter-block output */
133 static void do_output_subblock(Real144_internal
*glob
, unsigned int x
)
137 if (x
==1) memset(glob
->buffer
,0,20);
138 if ((*glob
->iptr
)==0) a
=0;
139 else a
=(*glob
->iptr
)+HALFBLOCK
-1;
144 if (a
) rotate_block(glob
->buffer_2
,glob
->buffer_a
,a
);
145 memcpy(glob
->buffer_b
,etable1
+b
*BLOCKSIZE
,BLOCKSIZE
*2);
146 e
=((ftable1
[b
]>>4)*glob
->gval
)>>8;
147 memcpy(glob
->buffer_c
,etable2
+c
*BLOCKSIZE
,BLOCKSIZE
*2);
148 f
=((ftable2
[c
]>>4)*glob
->gval
)>>8;
149 if (a
) g
=irms(glob
->buffer_a
,glob
->gval
)>>12;
151 add_wav(glob
,d
,a
,g
,e
,f
,glob
->buffer_a
,glob
->buffer_b
,glob
->buffer_c
,glob
->buffer_d
);
152 memmove(glob
->buffer_2
,glob
->buffer_2
+BLOCKSIZE
,(BUFFERSIZE
-BLOCKSIZE
)*2);
153 memcpy(glob
->buffer_2
+BUFFERSIZE
-BLOCKSIZE
,glob
->buffer_d
,BLOCKSIZE
*2);
154 final(glob
,glob
->gsp
,glob
->buffer_d
,glob
->output_buffer
,glob
->buffer
,BLOCKSIZE
);
158 static void rotate_block(short *source
, short *target
, int offset
)
164 ptr2
=source
+BUFFERSIZE
;
165 ptr3
=ptr1
=ptr2
-offset
;
166 end
=target
+BLOCKSIZE
;
168 *(target
++)=*(ptr3
++);
169 if (ptr3
==ptr2
) ptr3
=ptr1
;
173 /* inverse root mean square */
174 static int irms(short *data
, int factor
)
178 p2
=(p1
=data
)+BLOCKSIZE
;
179 for (sum
=0;p2
>p1
;p1
++) sum
+=(*p1
)*(*p1
);
180 if (sum
==0) return 0; /* OOPS - division by zero */
181 return (0x20000000/(t_sqrt(sum
)>>8))*factor
;
184 /* multiply/add wavetable */
185 static void add_wav(Real144_internal
*glob
, int n
, int f
, int m1
, int m2
, int m3
, short *s1
, short *s2
, short *s3
, short *dest
)
190 ptr
=glob
->wavtable1
+n
*9;
191 ptr2
=glob
->wavtable2
+n
*9;
193 a
=((*ptr
)*m1
)>>((*ptr2
)+1);
198 b
=((*ptr
)*m2
)>>((*ptr2
)+1);
200 c
=((*ptr
)*m3
)>>((*ptr2
)+1);
201 ptr2
=(ptr
=dest
)+BLOCKSIZE
;
204 *(ptr
++)=((*(s1
++))*a
+(*(s2
++))*b
+(*(s3
++))*c
)>>12;
207 *(ptr
++)=((*(s2
++))*b
+(*(s3
++))*c
)>>12;
211 static void final(Real144_internal
*glob
, short *i1
, short *i2
, void *out
, int *statbuf
, int len
)
218 memcpy(glob
->work
,statbuf
,20);
219 memcpy(glob
->work
+10,i2
,len
*2);
232 ptr2
=(ptr
=glob
->work
)+len
;
234 for(sum
=0,x
=0;x
<=9;x
++)
235 sum
+=buffer
[x
]*(ptr
[x
]);
238 if (x
<-32768 || x
>32767)
241 memset(statbuf
,0,20);
247 memcpy(out
,ptr
+10-len
,len
*2);
248 memcpy(statbuf
,ptr
,20);
251 /* Decode 20-byte input */
252 static void unpack_input(unsigned char *input
, unsigned int *output
)
254 unsigned int outbuffer
[28];
255 unsigned short inbuffer
[10];
261 inbuffer
[x
/2]=(input
[x
]<<8)+input
[x
+1];
266 *(ptr
++)=(inbuffer
[0]>>10)&0x3f;
267 *(ptr
++)=(inbuffer
[0]>>5)&0x1f;
268 *(ptr
++)=inbuffer
[0]&0x1f;
269 *(ptr
++)=(inbuffer
[1]>>12)&0xf;
270 *(ptr
++)=(inbuffer
[1]>>8)&0xf;
271 *(ptr
++)=(inbuffer
[1]>>5)&7;
272 *(ptr
++)=(inbuffer
[1]>>2)&7;
273 *(ptr
++)=((inbuffer
[1]<<1)&6)|((inbuffer
[2]>>15)&1);
274 *(ptr
++)=(inbuffer
[2]>>12)&7;
275 *(ptr
++)=(inbuffer
[2]>>10)&3;
276 *(ptr
++)=(inbuffer
[2]>>5)&0x1f;
277 *(ptr
++)=((inbuffer
[2]<<2)&0x7c)|((inbuffer
[3]>>14)&3);
278 *(ptr
++)=(inbuffer
[3]>>6)&0xff;
279 *(ptr
++)=((inbuffer
[3]<<1)&0x7e)|((inbuffer
[4]>>15)&1);
280 *(ptr
++)=(inbuffer
[4]>>8)&0x7f;
281 *(ptr
++)=(inbuffer
[4]>>1)&0x7f;
282 *(ptr
++)=((inbuffer
[4]<<7)&0x80)|((inbuffer
[5]>>9)&0x7f);
283 *(ptr
++)=(inbuffer
[5]>>2)&0x7f;
284 *(ptr
++)=((inbuffer
[5]<<5)&0x60)|((inbuffer
[6]>>11)&0x1f);
285 *(ptr
++)=(inbuffer
[6]>>4)&0x7f;
286 *(ptr
++)=((inbuffer
[6]<<4)&0xf0)|((inbuffer
[7]>>12)&0xf);
287 *(ptr
++)=(inbuffer
[7]>>5)&0x7f;
288 *(ptr
++)=((inbuffer
[7]<<2)&0x7c)|((inbuffer
[8]>>14)&3);
289 *(ptr
++)=(inbuffer
[8]>>7)&0x7f;
290 *(ptr
++)=((inbuffer
[8]<<1)&0xfe)|((inbuffer
[9]>>15)&1);
291 *(ptr
++)=(inbuffer
[9]>>8)&0x7f;
292 *(ptr
++)=(inbuffer
[9]>>1)&0x7f;
294 *(output
++)=outbuffer
[11];
295 for (x
=1;x
<11;*(output
++)=outbuffer
[x
++]);
300 *(output
++)=ptr
[x
+2];
301 *(output
++)=ptr
[x
+3];
302 *(output
++)=ptr
[x
+1];
306 static unsigned int rms(int *data
, int f
)
318 res
=(((0x1000000-(*c
)*(*c
))>>12)*res
)>>12;
319 if (res
==0) return 0;
329 return 0; /* We're screwed, might as well go out with a bang. :P */
333 if (res
>0) res
=t_sqrt(res
);
340 static void dec1(Real144_internal
*glob
, int *data
, int *inp
, int n
, int f
)
344 *(glob
->decptr
++)=rms(data
,f
);
346 end
=(ptr
=glob
->decsp
)+(n
*10);
347 while (ptr
<end
) *(ptr
++)=*(inp
++);
350 static int eq(Real144_internal
*glob
, short *in
, int *target
)
358 int *ptr1
,*ptr2
,*ptr3
;
364 ptr2
=(ptr3
=glob
->buffer2
)+9;
373 return 0; /* We're screwed, might as well go out with a bang. :P */
378 if (u
==0xfffff000) u
--;
379 b
=0x1000-((u
*u
)>>12);
384 *(ptr2
++)=((*(ptr3
++)-(((*target
)*(*(ptr1
--)))>>12))*(0x1000000/b
))>>12;
385 *(--target
)=u
=bp1
[(c
--)];
386 if ((u
+0x1000)>0x1fff) retval
=1;
394 static void dec2(Real144_internal
*glob
, int *data
, int *inp
, int n
, int f
, int *inp2
, int l
)
396 unsigned int *ptr1
,*ptr2
;
402 if(l
+1<NBLOCKS
/2) a
=NBLOCKS
-(l
+1);
407 glob
->decsp
=glob
->sptr
=glob
->gbuf2
;
408 glob
->decptr
=glob
->gbuf1
;
413 *(glob
->sptr
++)=(a
*(*ptr1
++)+b
*(*ptr2
++))>>2;
414 result
=eq(glob
,glob
->decsp
,work
);
417 dec1(glob
,data
,inp
,n
,f
);
419 *(glob
->decptr
++)=rms(work
,f
);
425 /* Uncompress one block (20 bytes -> 160*2 bytes) */
426 static int ra144_decode_frame(AVCodecContext
* avctx
,
427 void *vdata
, int *data_size
,
428 uint8_t * buf
, int buf_size
)
433 unsigned int *lptr
,*temp
;
436 int16_t *data
= vdata
;
437 Real144_internal
*glob
=avctx
->priv_data
;
443 unpack_input(buf
,glob
->unpacked
);
445 glob
->iptr
=glob
->unpacked
;
446 glob
->val
=decodetable
[0][(*(glob
->iptr
++))<<1];
450 while (lptr
<glob
->swapbuf1
+10)
451 *(lptr
++)=(*(dptr
++))[(*(glob
->iptr
++))<<1];
453 do_voice(glob
->swapbuf1
,glob
->swapbuf2
);
455 a
=t_sqrt(glob
->val
*glob
->oldval
)>>12;
457 for (c
=0;c
<NBLOCKS
;c
++) {
458 if (c
==(NBLOCKS
-1)) {
459 dec1(glob
,glob
->swapbuf1
,glob
->swapbuf2
,3,glob
->val
);
461 if (c
*2==(NBLOCKS
-2)) {
462 if (glob
->oldval
<glob
->val
) {
463 dec2(glob
,glob
->swapbuf1
,glob
->swapbuf2
,3,a
,glob
->swapbuf2alt
,c
);
465 dec2(glob
,glob
->swapbuf1alt
,glob
->swapbuf2alt
,3,a
,glob
->swapbuf2
,c
);
468 if (c
*2<(NBLOCKS
-2)) {
469 dec2(glob
,glob
->swapbuf1alt
,glob
->swapbuf2alt
,3,glob
->oldval
,glob
->swapbuf2
,c
);
471 dec2(glob
,glob
->swapbuf1
,glob
->swapbuf2
,3,glob
->val
,glob
->swapbuf2alt
,c
);
478 for (b
=0,c
=0;c
<4;c
++) {
479 glob
->gval
=glob
->gbuf1
[c
*2];
480 glob
->gsp
=glob
->gbuf2
+b
;
481 do_output_subblock(glob
,glob
->resetflag
);
484 shptr
=glob
->output_buffer
;
485 while (shptr
<glob
->output_buffer
+BLOCKSIZE
) {
488 if (s
>32767) *data
=32767;
489 if (s
<-32767) *data
=-32768;
495 glob
->oldval
=glob
->val
;
496 temp
=glob
->swapbuf1alt
;
497 glob
->swapbuf1alt
=glob
->swapbuf1
;
499 temp
=glob
->swapbuf2alt
;
500 glob
->swapbuf2alt
=glob
->swapbuf2
;
502 *data_size
=(data
-datao
)*sizeof(*data
);
507 AVCodec ra_144_decoder
=
512 sizeof(Real144_internal
),