1 /*
2 * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3 *
4 */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <stdint.h>
9 #include <string.h>
10 #include <signal.h>
11
12 #include "uvoice_os.h"
13 #include "uvoice_types.h"
14 #include "uvoice_player.h"
15
16 #include "uvoice_common.h"
17 #include "uvoice_play.h"
18
19 #include "opensource/amr/sp_dec.h"
20
21
22 #define AMR_MAGIC_NUMBER "#!AMR\n"
23
24 typedef struct {
25 int frame_type; /* 0: IF1, 1: IF2 */
26 void *amrdec;
27 } amr_decoder_t;
28
amr_decoder_reset(void * priv)29 static int amr_decoder_reset(void *priv)
30 {
31 media_decoder_t *mdecoder = (media_decoder_t *)priv;
32 amr_decoder_t *amr;
33
34 if (!mdecoder) {
35 M_LOGE("mdecoder null !\n");
36 return -1;
37 }
38
39 amr = mdecoder->decoder;
40 if (!amr) {
41 M_LOGE("amr decoder null !\n");
42 return -1;
43 }
44
45 Decoder_Interface_reset(amr->amrdec);
46 M_LOGD("amr decoder reset\n");
47 return 0;
48 }
49
amr_decoder_process(void * priv,const uint8_t * buffer,int nbytes)50 static int amr_decoder_process(void *priv, const uint8_t *buffer, int nbytes)
51 {
52 media_decoder_t *mdecoder = (media_decoder_t *)priv;
53 amr_decoder_t *amr;
54 const uint8_t *readptr = buffer;
55 uint8_t frame_header;
56 int rem_size = nbytes;
57 int frame_size;
58 short *out_buffer;
59 int ret;
60
61 enum Mode dec_mode;
62 short block_size[16] = {
63 12, 13, 15, 17, 19, 20, 26, 31,
64 5, 0, 0, 0, 0, 0, 0, 0
65 };
66
67 if (!mdecoder) {
68 M_LOGE("mdecoder null !\n");
69 return -1;
70 }
71
72 amr = mdecoder->decoder;
73 if (!amr) {
74 M_LOGE("amr decoder null !\n");
75 return -1;
76 }
77
78 out_buffer = mdecoder->buffer_out;
79
80 if (!mdecoder->running) {
81 if (memcmp(buffer, AMR_MAGIC_NUMBER, strlen(AMR_MAGIC_NUMBER))) {
82 M_LOGE("amr magic number not found !\n");
83 return -1;
84 }
85 readptr += strlen(AMR_MAGIC_NUMBER);
86 rem_size -= strlen(AMR_MAGIC_NUMBER);
87
88 media_pcminfo_t pcm_info;
89 memset(&pcm_info, 0, sizeof(pcm_info));
90 pcm_info.rate = 8000;
91 pcm_info.frames = 160;
92 pcm_info.channels = 1;
93 pcm_info.bits = 16;
94 mdecoder->message(mdecoder->priv,
95 PLAYER_MSG_PCM_INFO, &pcm_info);
96
97 media_info_t media_info;
98 memset(&media_info, 0, sizeof(media_info_t));
99 media_info.bitrate = 12000;
100 mdecoder->message(mdecoder->priv,
101 PLAYER_MSG_MEDIA_INFO, &media_info);
102 mdecoder->running = 1;
103 }
104
105 while (1) {
106 frame_header = readptr[0];
107 dec_mode = (frame_header >> 3) & 0xf;
108 rem_size--;
109 frame_size = block_size[dec_mode];
110 if (rem_size < frame_size) {
111 mdecoder->unproc_size = rem_size + 1;
112 break;
113 }
114
115 if (frame_header & 0x04) {
116 //M_LOGD("frame_size %d rem_size %d\n", frame_size, rem_size);
117 Decoder_Interface_Decode(amr->amrdec, readptr, out_buffer, 0);
118
119 if (mdecoder->output(mdecoder->priv,
120 out_buffer, mdecoder->buffer_out_size)) {
121 M_LOGE("output failed !\n");
122 return -1;
123 }
124 } else {
125 M_LOGW("bad frame\n");
126 }
127
128 readptr += frame_size + 1;
129 rem_size -= frame_size;
130 if (rem_size <= 0) {
131 mdecoder->unproc_size = 0;
132 break;
133 }
134 }
135
136 return 0;
137 }
138
amr_decoder_action(void * priv,player_action_t action,void * arg)139 static int amr_decoder_action(void *priv, player_action_t action, void *arg)
140 {
141 return 0;
142 }
143
amr_decoder_create(media_decoder_t * mdecoder)144 int amr_decoder_create(media_decoder_t *mdecoder)
145 {
146 amr_decoder_t *amr;
147
148 if (!mdecoder) {
149 M_LOGE("mdecoder null !\n");
150 return -1;
151 }
152
153 amr = snd_zalloc(sizeof(amr_decoder_t), AFM_MAIN);
154 if (!amr) {
155 M_LOGE("alloc amr decoder failed !\n");
156 return -1;
157 }
158
159 amr->amrdec = Decoder_Interface_init();
160 if (!amr->amrdec) {
161 M_LOGE("init amrdec failed !\n");
162 snd_free(amr);
163 return -1;
164 }
165
166 mdecoder->buffer_out_size = sizeof(short) * 160;
167 mdecoder->buffer_out = snd_zalloc(mdecoder->buffer_out_size, AFM_MAIN);
168 if (!mdecoder->buffer_out) {
169 M_LOGE("alloc out buffer failed !\n");
170 snd_free(amr);
171 return -1;
172 }
173
174 mdecoder->input_size = 128;
175
176 mdecoder->decode = amr_decoder_process;
177 mdecoder->action = amr_decoder_action;
178 mdecoder->reset = amr_decoder_reset;
179 mdecoder->decoder = amr;
180
181 M_LOGD("amr decoder create\n");
182 return 0;
183 }
184
amr_decoder_release(media_decoder_t * mdecoder)185 int amr_decoder_release(media_decoder_t *mdecoder)
186 {
187 amr_decoder_t *amr;
188
189 if (!mdecoder) {
190 M_LOGE("mdecoder null !\n");
191 return -1;
192 }
193
194 if (mdecoder->buffer_out) {
195 snd_free(mdecoder->buffer_out);
196 mdecoder->buffer_out = NULL;
197 mdecoder->buffer_out_size = 0;
198 }
199
200 amr = mdecoder->decoder;
201 if (!amr) {
202 M_LOGE("amr null !\n");
203 return -1;
204 }
205
206 Decoder_Interface_exit(amr->amrdec);
207
208 snd_free(amr);
209
210 M_LOGD("amr decoder release\n");
211 return 0;
212 }
213
214