diff options
| author | Mohamed Tarek <mt@rockbox.org> | 2009-08-10 14:46:31 +0000 |
|---|---|---|
| committer | Mohamed Tarek <mt@rockbox.org> | 2009-08-10 14:46:31 +0000 |
| commit | 519adfbaae5933ec18d2e3cb77e690e36cd49916 (patch) | |
| tree | 8303456ddf72f2ff5da2b9a99802c73e1409fc28 /apps/codecs/librm | |
| parent | 1c0aeb18ca264e1f64e31f219189afab442676eb (diff) | |
| download | rockbox-519adfbaae5933ec18d2e3cb77e690e36cd49916.zip rockbox-519adfbaae5933ec18d2e3cb77e690e36cd49916.tar.gz rockbox-519adfbaae5933ec18d2e3cb77e690e36cd49916.tar.bz2 rockbox-519adfbaae5933ec18d2e3cb77e690e36cd49916.tar.xz | |
Import libatrac from ffmpeg and modify librm to support ATRAC3.
The decoder is still in floating point.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22235 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/librm')
| -rw-r--r-- | apps/codecs/librm/rm.c | 48 | ||||
| -rw-r--r-- | apps/codecs/librm/rm.h | 3 |
2 files changed, 42 insertions, 9 deletions
diff --git a/apps/codecs/librm/rm.c b/apps/codecs/librm/rm.c index 00ee37a..7053e7d 100644 --- a/apps/codecs/librm/rm.c +++ b/apps/codecs/librm/rm.c @@ -29,7 +29,7 @@ #define SWAP(a, b) do{uint8_t SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) -static void advance_buffer(uint8_t **buf, int val) +void advance_buffer(uint8_t **buf, int val) { *buf += val; } @@ -237,10 +237,40 @@ static int real_read_audio_stream_info(int fd, RMContext *rmctx) skipped += 1; } - read_uint32be(fd, &rmctx->extradata_size); - skipped += 4; - read(fd, rmctx->codec_extradata, rmctx->extradata_size); - skipped += rmctx->extradata_size; + switch(fourcc) { + case FOURCC('c','o','o','k'): + rmctx->codec_type = CODEC_COOK; + read_uint32be(fd, &rmctx->extradata_size); + skipped += 4; + read(fd, rmctx->codec_extradata, rmctx->extradata_size); + skipped += rmctx->extradata_size; + break; + + case FOURCC('a','t','r','c'): +DEBUGF("WERE HERE\n"); + rmctx->codec_type = CODEC_ATRAC; + read_uint32be(fd, &rmctx->extradata_size); + skipped += 4; + read(fd, rmctx->codec_extradata, rmctx->extradata_size); + skipped += rmctx->extradata_size; + break; + + case FOURCC('r','a','a','c'): + case FOURCC('r','a','c','p'): + rmctx->codec_type = CODEC_AAC; + read_uint32be(fd, &rmctx->extradata_size); + skipped += 4; + read(fd, rmctx->codec_extradata, rmctx->extradata_size); + skipped += rmctx->extradata_size; + break; + + case FOURCC('d','n','e','t'): + rmctx->codec_type = CODEC_AC3; + break; + + default: /* Not a supported codec */ + return -1; + } DEBUGF(" flavor = %d\n",flavor); @@ -252,8 +282,10 @@ static int real_read_audio_stream_info(int fd, RMContext *rmctx) DEBUGF(" channels= %d\n",rmctx->nb_channels); DEBUGF(" fourcc = %s\n",fourcc2str(fourcc)); DEBUGF(" codec_extra_data_length = %d\n",rmctx->extradata_size); - DEBUGF(" codec_extradata :\n"); - print_cook_extradata(rmctx); + if(rmctx->codec_type == CODEC_COOK) { + DEBUGF(" cook_extradata :\n"); + print_cook_extradata(rmctx); + } } @@ -530,7 +562,7 @@ int rm_get_packet(uint8_t **src,RMContext *rmctx, RMPacket *pkt) advance_buffer(src,12); consumed += 12; - if (rmctx->codec_type == CODEC_COOK) { + if (rmctx->codec_type == CODEC_COOK || rmctx->codec_type == CODEC_ATRAC) { for(x = 0 ; x < w/sps; x++) { place = sps*(h*x+((h+1)/2)*(y&1)+(y>>1)); diff --git a/apps/codecs/librm/rm.h b/apps/codecs/librm/rm.h index 86fe5e7..be88701 100644 --- a/apps/codecs/librm/rm.h +++ b/apps/codecs/librm/rm.h @@ -31,7 +31,8 @@ enum codecs { CODEC_COOK, CODEC_AAC, - CODEC_AC3 + CODEC_AC3, + CODEC_ATRAC }; typedef struct rm_packet |