diff options
author | Mohamed Tarek <mt@rockbox.org> | 2009-07-18 00:29:19 +0000 |
---|---|---|
committer | Mohamed Tarek <mt@rockbox.org> | 2009-07-18 00:29:19 +0000 |
commit | 6f4294219e2ec8f0190a84020aa67dfe969ebb66 (patch) | |
tree | edf778074a46caa7eaf27a36b0eb2b706855c967 | |
parent | 6539b535ad08a13d654db3185d78a8f86a75f6a6 (diff) | |
download | rockbox-6f4294219e2ec8f0190a84020aa67dfe969ebb66.tar.gz rockbox-6f4294219e2ec8f0190a84020aa67dfe969ebb66.zip |
Generic codec-extradata parsing, in preparation for addition of AAC/RM.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21941 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/codecs/cook.c | 2 | ||||
-rw-r--r-- | apps/codecs/libcook/cook.c | 25 | ||||
-rw-r--r-- | apps/codecs/libcook/main.c | 6 | ||||
-rw-r--r-- | apps/codecs/librm/rm.c | 31 | ||||
-rw-r--r-- | apps/codecs/librm/rm.h | 16 | ||||
-rw-r--r-- | apps/metadata/rm.c | 33 |
6 files changed, 45 insertions, 68 deletions
diff --git a/apps/codecs/cook.c b/apps/codecs/cook.c index fe818be905..ec30b3e6bc 100644 --- a/apps/codecs/cook.c +++ b/apps/codecs/cook.c | |||
@@ -156,7 +156,7 @@ seek_start : | |||
156 | return CODEC_ERROR; | 156 | return CODEC_ERROR; |
157 | } | 157 | } |
158 | 158 | ||
159 | ci->pcmbuf_insert(outbuf, NULL, rmctx.samples_pf_pc / rmctx.nb_channels); | 159 | ci->pcmbuf_insert(outbuf, NULL, q.samples_per_frame / rmctx.nb_channels); |
160 | ci->set_elapsed(rmctx.audiotimestamp+(1000*8*sps/rmctx.bit_rate)*i); | 160 | ci->set_elapsed(rmctx.audiotimestamp+(1000*8*sps/rmctx.bit_rate)*i); |
161 | } | 161 | } |
162 | packet_count -= rmctx.audio_pkt_cnt; | 162 | packet_count -= rmctx.audio_pkt_cnt; |
diff --git a/apps/codecs/libcook/cook.c b/apps/codecs/libcook/cook.c index ba5fbab6a1..315fe0aaff 100644 --- a/apps/codecs/libcook/cook.c +++ b/apps/codecs/libcook/cook.c | |||
@@ -708,16 +708,27 @@ static void dump_cook_context(COOKContext *q) | |||
708 | * Cook initialization | 708 | * Cook initialization |
709 | */ | 709 | */ |
710 | 710 | ||
711 | int cook_decode_init(RMContext *rmctx, COOKContext *q) | 711 | static inline uint16_t get_uint16be(uint8_t *buf) |
712 | { | 712 | { |
713 | return (uint16_t)((buf[0] << 8)|buf[1]); | ||
714 | } | ||
715 | |||
716 | static inline uint32_t get_uint32be(uint8_t *buf) | ||
717 | { | ||
718 | return (uint32_t)((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]); | ||
719 | } | ||
720 | |||
721 | int cook_decode_init(RMContext *rmctx, COOKContext *q) | ||
722 | { | ||
723 | |||
713 | /* cook extradata */ | 724 | /* cook extradata */ |
714 | q->cookversion = rmctx->cook_version; | 725 | q->cookversion = get_uint32be(rmctx->codec_extradata); |
715 | q->samples_per_frame = rmctx->samples_pf_pc; | 726 | q->samples_per_frame = get_uint16be(&rmctx->codec_extradata[4]); |
716 | q->subbands = rmctx->nb_subbands; | 727 | q->subbands = get_uint16be(&rmctx->codec_extradata[6]); |
717 | q->extradata_size = rmctx->extradata_size; | 728 | q->extradata_size = rmctx->extradata_size; |
718 | if (q->extradata_size >= 16){ | 729 | if (q->extradata_size >= 16){ |
719 | q->js_subband_start = rmctx->js_subband_start; | 730 | q->js_subband_start = get_uint16be(&rmctx->codec_extradata[12]); |
720 | q->js_vlc_bits = rmctx->js_vlc_bits; | 731 | q->js_vlc_bits = get_uint16be(&rmctx->codec_extradata[14]); |
721 | } | 732 | } |
722 | 733 | ||
723 | /* Take data from the RMContext (RM container). */ | 734 | /* Take data from the RMContext (RM container). */ |
diff --git a/apps/codecs/libcook/main.c b/apps/codecs/libcook/main.c index fd20f98871..3f5d3e8528 100644 --- a/apps/codecs/libcook/main.c +++ b/apps/codecs/libcook/main.c | |||
@@ -58,11 +58,11 @@ int open_wav(char* filename) { | |||
58 | return(fd); | 58 | return(fd); |
59 | } | 59 | } |
60 | 60 | ||
61 | void close_wav(int fd, RMContext *rmctx) { | 61 | void close_wav(int fd, RMContext *rmctx, COOKContext *q) { |
62 | int x,res; | 62 | int x,res; |
63 | int filesize; | 63 | int filesize; |
64 | int bytes_per_sample = 2; | 64 | int bytes_per_sample = 2; |
65 | int samples_per_frame = rmctx->samples_pf_pc; | 65 | int samples_per_frame = q->samples_per_frame; |
66 | int nb_channels = rmctx->nb_channels; | 66 | int nb_channels = rmctx->nb_channels; |
67 | int sample_rate = rmctx->sample_rate; | 67 | int sample_rate = rmctx->sample_rate; |
68 | int nb_frames = rmctx->audio_framesize/rmctx->block_align * rmctx->nb_packets - 2; // first 2 frames have no valid audio; skipped in output | 68 | int nb_frames = rmctx->audio_framesize/rmctx->block_align * rmctx->nb_packets - 2; // first 2 frames have no valid audio; skipped in output |
@@ -182,7 +182,7 @@ int main(int argc, char *argv[]) | |||
182 | packet_count -= rmctx.audio_pkt_cnt; | 182 | packet_count -= rmctx.audio_pkt_cnt; |
183 | rmctx.audio_pkt_cnt = 0; | 183 | rmctx.audio_pkt_cnt = 0; |
184 | } | 184 | } |
185 | close_wav(fd_dec,&rmctx); | 185 | close_wav(fd_dec, &rmctx, &q); |
186 | close(fd); | 186 | close(fd); |
187 | 187 | ||
188 | 188 | ||
diff --git a/apps/codecs/librm/rm.c b/apps/codecs/librm/rm.c index bfad7e8b36..c9c40986ba 100644 --- a/apps/codecs/librm/rm.c +++ b/apps/codecs/librm/rm.c | |||
@@ -95,27 +95,14 @@ static int read_uint32be(int fd, uint32_t* buf) | |||
95 | } | 95 | } |
96 | 96 | ||
97 | 97 | ||
98 | |||
99 | static int read_cook_extradata(int fd, RMContext *rmctx) { | ||
100 | read_uint32be(fd, &rmctx->cook_version); | ||
101 | read_uint16be(fd, &rmctx->samples_pf_pc); | ||
102 | read_uint16be(fd, &rmctx->nb_subbands); | ||
103 | if(rmctx->extradata_size == 16) { | ||
104 | read_uint32be(fd, &rmctx->unused); | ||
105 | read_uint16be(fd, &rmctx->js_subband_start); | ||
106 | read_uint16be(fd, &rmctx->js_vlc_bits); | ||
107 | } | ||
108 | return rmctx->extradata_size; /* for 'skipped' */ | ||
109 | } | ||
110 | |||
111 | static void print_cook_extradata(RMContext *rmctx) { | 98 | static void print_cook_extradata(RMContext *rmctx) { |
112 | 99 | ||
113 | DEBUGF(" cook_version = 0x%08x\n", rmctx->cook_version); | 100 | DEBUGF(" cook_version = 0x%08x\n", get_uint32be(rmctx->codec_extradata)); |
114 | DEBUGF(" samples_per_frame_per_channel = %d\n", rmctx->samples_pf_pc); | 101 | DEBUGF(" samples_per_frame_per_channel = %d\n", get_uint16be(&rmctx->codec_extradata[4])); |
115 | DEBUGF(" number_of_subbands_in_freq_domain = %d\n", rmctx->nb_subbands); | 102 | DEBUGF(" number_of_subbands_in_freq_domain = %d\n", get_uint16be(&rmctx->codec_extradata[6])); |
116 | if(rmctx->extradata_size == 16) { | 103 | if(rmctx->extradata_size == 16) { |
117 | DEBUGF(" joint_stereo_subband_start = %d\n",rmctx->js_subband_start); | 104 | DEBUGF(" joint_stereo_subband_start = %d\n",get_uint16be(&rmctx->codec_extradata[12])); |
118 | DEBUGF(" joint_stereo_vlc_bits = %d\n", rmctx->js_vlc_bits); | 105 | DEBUGF(" joint_stereo_vlc_bits = %d\n", get_uint16be(&rmctx->codec_extradata[14])); |
119 | } | 106 | } |
120 | } | 107 | } |
121 | 108 | ||
@@ -250,10 +237,8 @@ static int real_read_audio_stream_info(int fd, RMContext *rmctx) | |||
250 | 237 | ||
251 | read_uint32be(fd, &rmctx->extradata_size); | 238 | read_uint32be(fd, &rmctx->extradata_size); |
252 | skipped += 4; | 239 | skipped += 4; |
253 | if(!strncmp(fourcc2str(fourcc),"cook",4)){ | 240 | read(fd, rmctx->codec_extradata, rmctx->extradata_size); |
254 | skipped += read_cook_extradata(fd, rmctx); | 241 | skipped += rmctx->extradata_size; |
255 | rmctx->codec_type = cook; | ||
256 | } | ||
257 | 242 | ||
258 | 243 | ||
259 | DEBUGF(" flavor = %d\n",flavor); | 244 | DEBUGF(" flavor = %d\n",flavor); |
diff --git a/apps/codecs/librm/rm.h b/apps/codecs/librm/rm.h index a0c386e824..ee72c1fc04 100644 --- a/apps/codecs/librm/rm.h +++ b/apps/codecs/librm/rm.h | |||
@@ -24,7 +24,9 @@ | |||
24 | #include <stdio.h> | 24 | #include <stdio.h> |
25 | #include <inttypes.h> | 25 | #include <inttypes.h> |
26 | 26 | ||
27 | enum codecs{cook}; | 27 | #define MAX_EXTRADATA_SIZE 16 |
28 | |||
29 | enum codecs{cook, aac}; | ||
28 | typedef struct rm_packet | 30 | typedef struct rm_packet |
29 | { | 31 | { |
30 | uint8_t *frames[100]; /* Pointers to ordered audio frames in buffer */ | 32 | uint8_t *frames[100]; /* Pointers to ordered audio frames in buffer */ |
@@ -62,20 +64,14 @@ typedef struct rm_context | |||
62 | uint16_t block_align; | 64 | uint16_t block_align; |
63 | uint32_t nb_packets; | 65 | uint32_t nb_packets; |
64 | int frame_number; | 66 | int frame_number; |
65 | uint32_t extradata_size; | ||
66 | uint16_t sample_rate; | 67 | uint16_t sample_rate; |
67 | uint16_t nb_channels; | 68 | uint16_t nb_channels; |
68 | uint32_t bit_rate; | 69 | uint32_t bit_rate; |
69 | uint16_t flags; | 70 | uint16_t flags; |
70 | 71 | ||
71 | /*cook extradata*/ | 72 | /*codec extradata*/ |
72 | uint32_t cook_version; | 73 | uint32_t extradata_size; |
73 | uint16_t samples_pf_pc; /* samples per frame per channel */ | 74 | uint8_t codec_extradata[MAX_EXTRADATA_SIZE]; |
74 | uint16_t nb_subbands; /* number of subbands in the frequency domain */ | ||
75 | /* extra 8 bytes for joint-stereo data */ | ||
76 | uint32_t unused; | ||
77 | uint16_t js_subband_start; /* joint stereo subband start */ | ||
78 | uint16_t js_vlc_bits; | ||
79 | 75 | ||
80 | } RMContext; | 76 | } RMContext; |
81 | 77 | ||
diff --git a/apps/metadata/rm.c b/apps/metadata/rm.c index 7866bb7c55..bfaa803be7 100644 --- a/apps/metadata/rm.c +++ b/apps/metadata/rm.c | |||
@@ -38,26 +38,14 @@ | |||
38 | #define DEBUGF(...) | 38 | #define DEBUGF(...) |
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | static inline int read_cook_extradata(int fd, RMContext *rmctx) { | ||
42 | read_uint32be(fd, &rmctx->cook_version); | ||
43 | read_uint16be(fd, &rmctx->samples_pf_pc); | ||
44 | read_uint16be(fd, &rmctx->nb_subbands); | ||
45 | if(rmctx->extradata_size == 16) { | ||
46 | lseek(fd, sizeof(uint32_t), SEEK_CUR); /* reserved */ | ||
47 | read_uint16be(fd, &rmctx->js_subband_start); | ||
48 | read_uint16be(fd, &rmctx->js_vlc_bits); | ||
49 | } | ||
50 | return rmctx->extradata_size; /* for 'skipped' */ | ||
51 | } | ||
52 | |||
53 | static inline void print_cook_extradata(RMContext *rmctx) { | 41 | static inline void print_cook_extradata(RMContext *rmctx) { |
54 | 42 | ||
55 | DEBUGF(" cook_version = 0x%08lx\n", rmctx->cook_version); | 43 | DEBUGF(" cook_version = 0x%08x\n", get_uint32be(rmctx->codec_extradata)); |
56 | DEBUGF(" samples_per_frame_per_channel = %d\n", rmctx->samples_pf_pc); | 44 | DEBUGF(" samples_per_frame_per_channel = %d\n", get_uint16be(&rmctx->codec_extradata[4])); |
57 | DEBUGF(" number_of_subbands_in_freq_domain = %d\n", rmctx->nb_subbands); | 45 | DEBUGF(" number_of_subbands_in_freq_domain = %d\n", get_uint16be(&rmctx->codec_extradata[6])); |
58 | if(rmctx->extradata_size == 16) { | 46 | if(rmctx->extradata_size == 16) { |
59 | DEBUGF(" joint_stereo_subband_start = %d\n",rmctx->js_subband_start); | 47 | DEBUGF(" joint_stereo_subband_start = %d\n",get_uint16be(&rmctx->codec_extradata[12])); |
60 | DEBUGF(" joint_stereo_vlc_bits = %d\n", rmctx->js_vlc_bits); | 48 | DEBUGF(" joint_stereo_vlc_bits = %d\n", get_uint16be(&rmctx->codec_extradata[14])); |
61 | } | 49 | } |
62 | } | 50 | } |
63 | 51 | ||
@@ -174,13 +162,10 @@ static inline int real_read_audio_stream_info(int fd, RMContext *rmctx) | |||
174 | 162 | ||
175 | read_uint32be(fd, &rmctx->extradata_size); | 163 | read_uint32be(fd, &rmctx->extradata_size); |
176 | skipped += 4; | 164 | skipped += 4; |
177 | /*if(!strncmp(fourcc2str(fourcc),"cook",4)){ | 165 | read(fd, rmctx->codec_extradata, rmctx->extradata_size); |
178 | skipped += read_cook_extradata(fd, rmctx); | 166 | skipped += rmctx->extradata_size; |
179 | rmctx->codec_type = cook; | ||
180 | }*/ | ||
181 | switch(fourcc) { | 167 | switch(fourcc) { |
182 | case FOURCC('c','o','o','k'): | 168 | case FOURCC('c','o','o','k'): |
183 | skipped += read_cook_extradata(fd, rmctx); | ||
184 | rmctx->codec_type = cook; | 169 | rmctx->codec_type = cook; |
185 | break; | 170 | break; |
186 | 171 | ||