summaryrefslogtreecommitdiff
path: root/apps/codecs/librm
diff options
context:
space:
mode:
authorMohamed Tarek <mt@rockbox.org>2009-08-10 14:46:31 +0000
committerMohamed Tarek <mt@rockbox.org>2009-08-10 14:46:31 +0000
commit519adfbaae5933ec18d2e3cb77e690e36cd49916 (patch)
tree8303456ddf72f2ff5da2b9a99802c73e1409fc28 /apps/codecs/librm
parent1c0aeb18ca264e1f64e31f219189afab442676eb (diff)
downloadrockbox-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.c48
-rw-r--r--apps/codecs/librm/rm.h3
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