summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/codecs/cook.c2
-rw-r--r--apps/codecs/libcook/cook.c25
-rw-r--r--apps/codecs/libcook/main.c6
-rw-r--r--apps/codecs/librm/rm.c31
-rw-r--r--apps/codecs/librm/rm.h16
-rw-r--r--apps/metadata/rm.c33
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
711int cook_decode_init(RMContext *rmctx, COOKContext *q) 711static inline uint16_t get_uint16be(uint8_t *buf)
712{ 712{
713 return (uint16_t)((buf[0] << 8)|buf[1]);
714}
715
716static 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
61void close_wav(int fd, RMContext *rmctx) { 61void 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
99static 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
111static void print_cook_extradata(RMContext *rmctx) { 98static 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
27enum codecs{cook}; 27#define MAX_EXTRADATA_SIZE 16
28
29enum codecs{cook, aac};
28typedef struct rm_packet 30typedef 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
41static 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
53static inline void print_cook_extradata(RMContext *rmctx) { 41static 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