1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2010 Yoshihisa Uchida
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include "pcm_common.h"
23 #include "ima_adpcm_common.h"
26 * Apple QuickTime IMA ADPCM
29 * [1] Multimedia Wiki, Apple QuickTime IMA ADPCM
30 * URL:http://wiki.multimedia.cx/index.php?title=Apple_QuickTime_IMA_ADPCM
31 * [2] Apple Inc., Technical Note TN1081 Understanding the Differences Between
32 * Apple and Windows IMA-ADPCM Compressed Sound Files, 1996
33 * [3] ffmpeg source code, libavcodec/adpcm.c
36 static struct pcm_format
*fmt
;
38 static bool set_format(struct pcm_format
*format
)
42 if (fmt
->bitspersample
!= 4)
44 DEBUGF("CODEC_ERROR: quicktime ima adpcm must be 4 bitspersample: %d\n",
49 fmt
->blockalign
= 34 * fmt
->channels
;
50 fmt
->samplesperblock
= 64;
52 /* chunksize = about 1/50[s] data */
53 fmt
->chunksize
= (ci
->id3
->frequency
/ (50 * fmt
->samplesperblock
))
56 init_ima_adpcm_decoder(4, NULL
);
60 static struct pcm_pos
*get_seek_pos(long seek_time
,
61 uint8_t *(*read_buffer
)(size_t *realsize
))
63 static struct pcm_pos newpos
;
64 uint32_t newblock
= ((uint64_t)seek_time
* ci
->id3
->frequency
)
65 / (1000LL * fmt
->samplesperblock
);
68 newpos
.pos
= newblock
* fmt
->blockalign
;
69 newpos
.samples
= newblock
* fmt
->samplesperblock
;
73 static int decode(const uint8_t *inbuf
, size_t inbufsize
,
74 int32_t *outbuf
, int *outbufcount
)
85 for (ch
= 0; ch
< fmt
->channels
; ch
++)
87 /* read block header */
88 init_pcmdata
= (inbuf
[0] << 8)|(inbuf
[1] & 0x80);
89 if (init_pcmdata
> 32767)
90 init_pcmdata
-= 65536;
92 init_index
= inbuf
[1] & 0x7f;
95 DEBUGF("CODEC_ERROR: quicktime ima adpcm illegal step index=%d > 88\n",
103 set_decode_parameters(1, &init_pcmdata
, &init_index
);
105 /* read block data */
106 pcmbuf
= outbuf
+ ch
;
107 for (block_size
= 32; block_size
> 0 && inbufsize
> 0; block_size
--, inbufsize
--)
109 *pcmbuf
= create_pcmdata_size4(ch
, *inbuf
) << 13;
110 pcmbuf
+= fmt
->channels
;
111 *pcmbuf
= create_pcmdata_size4(ch
, *inbuf
>> 4) << 13;
112 pcmbuf
+= fmt
->channels
;
117 outbuf
+= 64 * fmt
->channels
;
120 if (fmt
->channels
== 2)
122 *outbufcount
= nsamples
;
127 static const struct pcm_codec codec
= {
133 const struct pcm_codec
*get_qt_ima_adpcm_codec(void)