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