blob: 291ef20aa5971114e07f43d7ce157c72faacbd0c
1 | /* |
2 | * =================================================================== |
3 | * TS 26.104 |
4 | * R99 V3.5.0 2003-03 |
5 | * REL-4 V4.4.0 2003-03 |
6 | * REL-5 V5.1.0 2003-03 |
7 | * 3GPP AMR Floating-point Speech Codec |
8 | * =================================================================== |
9 | * |
10 | */ |
11 | |
12 | /* |
13 | * interf_dec.c |
14 | * |
15 | * |
16 | * Project: |
17 | * AMR Floating-Point Codec |
18 | * |
19 | * Contains: |
20 | * This module provides means to conversion from 3GPP or ETSI |
21 | * bitstream to AMR parameters |
22 | */ |
23 | |
24 | /* |
25 | * include files |
26 | */ |
27 | #include <stdlib.h> |
28 | #include <stdio.h> |
29 | #include <memory.h> |
30 | #include "typedef.h" |
31 | #include "sp_dec.h" |
32 | #include "interf_rom.h" |
33 | #include "rom_dec.h" |
34 | |
35 | /* |
36 | * definition of constants |
37 | */ |
38 | #define EHF_MASK 0x0008 /* encoder homing frame pattern */ |
39 | typedef |
40 | |
41 | struct { |
42 | int reset_flag_old; /* previous was homing frame */ |
43 | |
44 | |
45 | enum RXFrameType prev_ft; /* previous frame type */ |
46 | enum Mode prev_mode; /* previous mode */ |
47 | void *decoder_State; /* Points decoder state */ |
48 | |
49 | |
50 | } dec_interface_State; |
51 | |
52 | #ifdef ETSI |
53 | |
54 | |
55 | /* |
56 | * Bin2Int |
57 | * |
58 | * |
59 | * Parameters: |
60 | * no_of_bits I: number of bits associated with value |
61 | * bits O: address where bits are written |
62 | * |
63 | * Function: |
64 | * Read nuber of bits from the array and convert to integer. |
65 | * |
66 | * Returns: |
67 | * value |
68 | */ |
69 | static Word16 Bin2Int(Word16 no_of_bits, Word16 *bitstream) |
70 | { |
71 | Word32 value, i, bit; |
72 | |
73 | |
74 | value = 0; |
75 | |
76 | for (i = 0; i < no_of_bits; i++) { |
77 | value = value << 1; |
78 | bit = *bitstream++; |
79 | |
80 | if (bit == 0x1) { |
81 | value = value + 1; |
82 | } |
83 | } |
84 | return(Word16)(value); |
85 | } |
86 | |
87 | |
88 | /* |
89 | * Bits2Prm |
90 | * |
91 | * |
92 | * Parameters: |
93 | * mode I: AMR mode |
94 | * bits I: serial bits |
95 | * param O: AMR parameters |
96 | * |
97 | * Function: |
98 | * Retrieves the vector of encoder parameters from |
99 | * the received serial bits in a frame. |
100 | * |
101 | * Returns: |
102 | * void |
103 | */ |
104 | static void Bits2Prm(enum Mode mode, Word16 bits[], Word16 prm[]) |
105 | { |
106 | Word32 i; |
107 | |
108 | |
109 | switch (mode) { |
110 | case MR122: |
111 | for (i = 0; i < PRMNO_MR122; i++) { |
112 | prm[i] = Bin2Int(bitno_MR122[i], bits); |
113 | bits += bitno_MR122[i]; |
114 | } |
115 | break; |
116 | |
117 | case MR102: |
118 | for (i = 0; i < PRMNO_MR102; i++) { |
119 | prm[i] = Bin2Int(bitno_MR102[i], bits); |
120 | bits += bitno_MR102[i]; |
121 | } |
122 | break; |
123 | |
124 | case MR795: |
125 | for (i = 0; i < PRMNO_MR795; i++) { |
126 | prm[i] = Bin2Int(bitno_MR795[i], bits); |
127 | bits += bitno_MR795[i]; |
128 | } |
129 | break; |
130 | |
131 | case MR74: |
132 | for (i = 0; i < PRMNO_MR74; i++) { |
133 | prm[i] = Bin2Int(bitno_MR74[i], bits); |
134 | bits += bitno_MR74[i]; |
135 | } |
136 | break; |
137 | |
138 | case MR67: |
139 | for (i = 0; i < PRMNO_MR67; i++) { |
140 | prm[i] = Bin2Int(bitno_MR67[i], bits); |
141 | bits += bitno_MR67[i]; |
142 | } |
143 | break; |
144 | |
145 | case MR59: |
146 | for (i = 0; i < PRMNO_MR59; i++) { |
147 | prm[i] = Bin2Int(bitno_MR59[i], bits); |
148 | bits += bitno_MR59[i]; |
149 | } |
150 | break; |
151 | |
152 | case MR515: |
153 | for (i = 0; i < PRMNO_MR515; i++) { |
154 | prm[i] = Bin2Int(bitno_MR515[i], bits); |
155 | bits += bitno_MR515[i]; |
156 | } |
157 | break; |
158 | |
159 | case MR475: |
160 | for (i = 0; i < PRMNO_MR475; i++) { |
161 | prm[i] = Bin2Int(bitno_MR475[i], bits); |
162 | bits += bitno_MR475[i]; |
163 | } |
164 | break; |
165 | |
166 | case MRDTX: |
167 | for (i = 0; i < PRMNO_MRDTX; i++) { |
168 | prm[i] = Bin2Int(bitno_MRDTX[i], bits); |
169 | bits += bitno_MRDTX[i]; |
170 | } |
171 | break; |
172 | } |
173 | return; |
174 | } |
175 | |
176 | #else |
177 | |
178 | #ifndef IF2 |
179 | |
180 | /* |
181 | * DecoderMMS |
182 | * |
183 | * |
184 | * Parameters: |
185 | * param O: AMR parameters |
186 | * stream I: input bitstream |
187 | * frame_type O: frame type |
188 | * speech_mode O: speech mode in DTX |
189 | * |
190 | * Function: |
191 | * AMR file storage format frame to decoder parameters |
192 | * |
193 | * Returns: |
194 | * mode used mode |
195 | */ |
196 | enum Mode DecoderMMS(Word16 *param, UWord8 *stream, enum RXFrameType |
197 | *frame_type, enum Mode *speech_mode, Word16 *q_bit) |
198 | { |
199 | enum Mode mode; |
200 | Word32 j; |
201 | Word16 *mask; |
202 | |
203 | |
204 | memset(param, 0, PRMNO_MR122 << 1); |
205 | *q_bit = 0x01 & (*stream >> 2); |
206 | mode = 0x0F & (*stream >> 3); |
207 | stream++; |
208 | |
209 | if (mode == MRDTX) { |
210 | mask = order_MRDTX; |
211 | |
212 | for (j = 1; j < 36; j++) { |
213 | if (*stream & 0x80) { |
214 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
215 | } |
216 | mask += 2; |
217 | |
218 | if (j % 8) { |
219 | *stream <<= 1; |
220 | } else { |
221 | stream++; |
222 | } |
223 | } |
224 | |
225 | /* get SID type bit */ |
226 | |
227 | *frame_type = RX_SID_FIRST; |
228 | if (*stream & 0x80) { |
229 | *frame_type = RX_SID_UPDATE; |
230 | } |
231 | |
232 | /* since there is update, use it */ |
233 | /* *frame_type = RX_SID_UPDATE; */ |
234 | |
235 | /* speech mode indicator */ |
236 | *speech_mode = (*stream >> 4) && 0x07; |
237 | |
238 | } else if (mode == 15) { |
239 | *frame_type = RX_NO_DATA; |
240 | } else if (mode == MR475) { |
241 | mask = order_MR475; |
242 | |
243 | for (j = 1; j < 96; j++) { |
244 | if (*stream & 0x80) { |
245 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
246 | } |
247 | mask += 2; |
248 | |
249 | if (j % 8) { |
250 | *stream <<= 1; |
251 | } else { |
252 | stream++; |
253 | } |
254 | } |
255 | *frame_type = RX_SPEECH_GOOD; |
256 | } else if (mode == MR515) { |
257 | mask = order_MR515; |
258 | |
259 | for (j = 1; j < 104; j++) { |
260 | if (*stream & 0x80) { |
261 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
262 | } |
263 | mask += 2; |
264 | |
265 | if (j % 8) { |
266 | *stream <<= 1; |
267 | } else { |
268 | stream++; |
269 | } |
270 | } |
271 | *frame_type = RX_SPEECH_GOOD; |
272 | } else if (mode == MR59) { |
273 | mask = order_MR59; |
274 | |
275 | for (j = 1; j < 119; j++) { |
276 | if (*stream & 0x80) { |
277 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
278 | } |
279 | mask += 2; |
280 | |
281 | if (j % 8) { |
282 | *stream <<= 1; |
283 | } else { |
284 | stream++; |
285 | } |
286 | } |
287 | *frame_type = RX_SPEECH_GOOD; |
288 | } else if (mode == MR67) { |
289 | mask = order_MR67; |
290 | |
291 | for (j = 1; j < 135; j++) { |
292 | if (*stream & 0x80) { |
293 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
294 | } |
295 | mask += 2; |
296 | |
297 | if (j % 8) { |
298 | *stream <<= 1; |
299 | } else { |
300 | stream++; |
301 | } |
302 | } |
303 | *frame_type = RX_SPEECH_GOOD; |
304 | } else if (mode == MR74) { |
305 | mask = order_MR74; |
306 | |
307 | for (j = 1; j < 149; j++) { |
308 | if (*stream & 0x80) { |
309 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
310 | } |
311 | mask += 2; |
312 | |
313 | if (j % 8) { |
314 | *stream <<= 1; |
315 | } else { |
316 | stream++; |
317 | } |
318 | } |
319 | *frame_type = RX_SPEECH_GOOD; |
320 | } else if (mode == MR795) { |
321 | mask = order_MR795; |
322 | |
323 | for (j = 1; j < 160; j++) { |
324 | if (*stream & 0x80) { |
325 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
326 | } |
327 | mask += 2; |
328 | |
329 | if (j % 8) { |
330 | *stream <<= 1; |
331 | } else { |
332 | stream++; |
333 | } |
334 | } |
335 | *frame_type = RX_SPEECH_GOOD; |
336 | } else if (mode == MR102) { |
337 | mask = order_MR102; |
338 | |
339 | for (j = 1; j < 205; j++) { |
340 | if (*stream & 0x80) { |
341 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
342 | } |
343 | mask += 2; |
344 | |
345 | if (j % 8) { |
346 | *stream <<= 1; |
347 | } else { |
348 | stream++; |
349 | } |
350 | } |
351 | *frame_type = RX_SPEECH_GOOD; |
352 | } else if (mode == MR122) { |
353 | mask = order_MR122; |
354 | |
355 | for (j = 1; j < 245; j++) { |
356 | if (*stream & 0x80) { |
357 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
358 | } |
359 | mask += 2; |
360 | |
361 | if (j % 8) { |
362 | *stream <<= 1; |
363 | } else { |
364 | stream++; |
365 | } |
366 | } |
367 | *frame_type = RX_SPEECH_GOOD; |
368 | } else { |
369 | *frame_type = RX_SPEECH_BAD; |
370 | } |
371 | return mode; |
372 | } |
373 | |
374 | #else |
375 | |
376 | /* |
377 | * Decoder3GPP |
378 | * |
379 | * |
380 | * Parameters: |
381 | * param O: AMR parameters |
382 | * stream I: input bitstream |
383 | * frame_type O: frame type |
384 | * speech_mode O: speech mode in DTX |
385 | * |
386 | * Function: |
387 | * Resets state memory |
388 | * |
389 | * Returns: |
390 | * mode used mode |
391 | */ |
392 | enum Mode Decoder3GPP(Word16 *param, UWord8 *stream, enum RXFrameType |
393 | *frame_type, enum Mode *speech_mode) |
394 | { |
395 | enum Mode mode; |
396 | Word32 j; |
397 | Word16 *mask; |
398 | |
399 | |
400 | memset(param, 0, PRMNO_MR122 << 1); |
401 | mode = 0xF & *stream; |
402 | *stream >>= 4; |
403 | |
404 | if (mode == MRDTX) { |
405 | mask = order_MRDTX; |
406 | |
407 | for (j = 5; j < 40; j++) { |
408 | if (*stream & 0x1) { |
409 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
410 | } |
411 | mask += 2; |
412 | |
413 | if (j % 8) { |
414 | *stream >>= 1; |
415 | } else { |
416 | stream++; |
417 | } |
418 | } |
419 | |
420 | /* get SID type bit */ |
421 | |
422 | *frame_type = RX_SID_FIRST; |
423 | if (*stream) { |
424 | *frame_type = RX_SID_UPDATE; |
425 | } |
426 | |
427 | /* since there is update, use it */ |
428 | /* *frame_type = RX_SID_UPDATE; */ |
429 | stream++; |
430 | |
431 | /* speech mode indicator */ |
432 | *speech_mode = *stream; |
433 | } else if (mode == 15) { |
434 | *frame_type = RX_NO_DATA; |
435 | } else if (mode == MR475) { |
436 | mask = order_MR475; |
437 | |
438 | for (j = 5; j < 100; j++) { |
439 | if (*stream & 0x1) { |
440 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
441 | } |
442 | mask += 2; |
443 | |
444 | if (j % 8) { |
445 | *stream >>= 1; |
446 | } else { |
447 | stream++; |
448 | } |
449 | } |
450 | *frame_type = RX_SPEECH_GOOD; |
451 | } else if (mode == MR515) { |
452 | mask = order_MR515; |
453 | |
454 | for (j = 5; j < 108; j++) { |
455 | if (*stream & 0x1) { |
456 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
457 | } |
458 | mask += 2; |
459 | |
460 | if (j % 8) { |
461 | *stream >>= 1; |
462 | } else { |
463 | stream++; |
464 | } |
465 | } |
466 | *frame_type = RX_SPEECH_GOOD; |
467 | } else if (mode == MR59) { |
468 | mask = order_MR59; |
469 | |
470 | for (j = 5; j < 123; j++) { |
471 | if (*stream & 0x1) { |
472 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
473 | } |
474 | mask += 2; |
475 | |
476 | if (j % 8) { |
477 | *stream >>= 1; |
478 | } else { |
479 | stream++; |
480 | } |
481 | } |
482 | *frame_type = RX_SPEECH_GOOD; |
483 | } else if (mode == MR67) { |
484 | mask = order_MR67; |
485 | |
486 | for (j = 5; j < 139; j++) { |
487 | if (*stream & 0x1) { |
488 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
489 | } |
490 | mask += 2; |
491 | |
492 | if (j % 8) { |
493 | *stream >>= 1; |
494 | } else { |
495 | stream++; |
496 | } |
497 | } |
498 | *frame_type = RX_SPEECH_GOOD; |
499 | } else if (mode == MR74) { |
500 | mask = order_MR74; |
501 | |
502 | for (j = 5; j < 153; j++) { |
503 | if (*stream & 0x1) { |
504 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
505 | } |
506 | mask += 2; |
507 | |
508 | if (j % 8) { |
509 | *stream >>= 1; |
510 | } else { |
511 | stream++; |
512 | } |
513 | } |
514 | *frame_type = RX_SPEECH_GOOD; |
515 | } else if (mode == MR795) { |
516 | mask = order_MR795; |
517 | |
518 | for (j = 5; j < 164; j++) { |
519 | if (*stream & 0x1) { |
520 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
521 | } |
522 | mask += 2; |
523 | |
524 | if (j % 8) { |
525 | *stream >>= 1; |
526 | } else { |
527 | stream++; |
528 | } |
529 | } |
530 | *frame_type = RX_SPEECH_GOOD; |
531 | } else if (mode == MR102) { |
532 | mask = order_MR102; |
533 | |
534 | for (j = 5; j < 209; j++) { |
535 | if (*stream & 0x1) { |
536 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
537 | } |
538 | mask += 2; |
539 | |
540 | if (j % 8) { |
541 | *stream >>= 1; |
542 | } else { |
543 | stream++; |
544 | } |
545 | } |
546 | *frame_type = RX_SPEECH_GOOD; |
547 | } else if (mode == MR122) { |
548 | mask = order_MR122; |
549 | |
550 | for (j = 5; j < 249; j++) { |
551 | if (*stream & 0x1) { |
552 | param[ * mask] = (short)(param[ * mask] + * (mask + 1)); |
553 | } |
554 | mask += 2; |
555 | |
556 | if (j % 8) { |
557 | *stream >>= 1; |
558 | } else { |
559 | stream++; |
560 | } |
561 | } |
562 | *frame_type = RX_SPEECH_GOOD; |
563 | } else { |
564 | *frame_type = RX_SPEECH_BAD; |
565 | } |
566 | return mode; |
567 | } |
568 | #endif |
569 | #endif |
570 | |
571 | /* |
572 | * Decoder_Interface_reset |
573 | * |
574 | * |
575 | * Parameters: |
576 | * st O: state struct |
577 | * |
578 | * Function: |
579 | * Reset homing frame counter |
580 | * |
581 | * Returns: |
582 | * void |
583 | */ |
584 | void Decoder_Interface_reset(dec_interface_State *st) |
585 | { |
586 | st->reset_flag_old = 1; |
587 | st->prev_ft = RX_SPEECH_GOOD; |
588 | st->prev_mode = MR475; /* minimum bitrate */ |
589 | } |
590 | |
591 | |
592 | /* |
593 | * Decoder_Interface_init |
594 | * |
595 | * |
596 | * Parameters: |
597 | * void |
598 | * |
599 | * Function: |
600 | * Allocates state memory and initializes state memory |
601 | * |
602 | * Returns: |
603 | * success : pointer to structure |
604 | * failure : NULL |
605 | */ |
606 | static dec_interface_State g_dec_interface_State; |
607 | void * Decoder_Interface_init(void) |
608 | { |
609 | dec_interface_State * s; |
610 | |
611 | /* allocate memory */ |
612 | /*if ( ( s = ( dec_interface_State * ) tlsf_malloc( sizeof( dec_interface_State ) ) ) == |
613 | NULL ) { |
614 | fprintf( stderr, "Decoder_Interface_init: " |
615 | "can not malloc state structure\n" ); |
616 | return NULL; |
617 | }*/ |
618 | s = &g_dec_interface_State; |
619 | |
620 | s->decoder_State = Speech_Decode_Frame_init(); |
621 | |
622 | if (s->decoder_State == NULL) { |
623 | // tlsf_free( s ); |
624 | return NULL; |
625 | } |
626 | Decoder_Interface_reset(s); |
627 | return (void *)s; |
628 | } |
629 | |
630 | |
631 | /* |
632 | * Decoder_Interface_exit |
633 | * |
634 | * |
635 | * Parameters: |
636 | * state I: state structure |
637 | * |
638 | * Function: |
639 | * The memory used for state memory is freed |
640 | * |
641 | * Returns: |
642 | * Void |
643 | */ |
644 | void Decoder_Interface_exit(void *state) |
645 | { |
646 | dec_interface_State * s; |
647 | s = (dec_interface_State *)state; |
648 | |
649 | /* free memory */ |
650 | Speech_Decode_Frame_exit(s->decoder_State); |
651 | // tlsf_free( s ); |
652 | s = NULL; |
653 | state = NULL; |
654 | } |
655 | |
656 | |
657 | /* |
658 | * Decoder_Interface_Decode |
659 | * |
660 | * |
661 | * Parameters: |
662 | * st B: state structure |
663 | * bits I: bit stream |
664 | * synth O: synthesized speech |
665 | * bfi I: bad frame indicator |
666 | * |
667 | * Function: |
668 | * Decode bit stream to synthesized speech |
669 | * |
670 | * Returns: |
671 | * Void |
672 | */ |
673 | void Decoder_Interface_Decode(void *st, |
674 | |
675 | #ifndef ETSI |
676 | UWord8 *bits, |
677 | |
678 | #else |
679 | Word16 *bits, |
680 | #endif |
681 | |
682 | Word16 *synth, int bfi) |
683 | { |
684 | enum Mode mode; /* AMR mode */ |
685 | |
686 | #ifndef ETSI |
687 | enum Mode speech_mode = MR475; /* speech mode */ |
688 | #endif |
689 | |
690 | Word16 prm[PRMNO_MR122]; /* AMR parameters */ |
691 | |
692 | enum RXFrameType frame_type; /* frame type */ |
693 | dec_interface_State * s; /* pointer to structure */ |
694 | |
695 | const Word16 *homing; /* pointer to homing frame */ |
696 | Word16 homingSize; /* frame size for homing frame */ |
697 | Word32 i; /* counter */ |
698 | Word32 resetFlag = 1; /* homing frame */ |
699 | |
700 | #ifndef ETSI |
701 | #ifndef IF2 |
702 | Word16 q_bit; |
703 | #endif |
704 | #endif |
705 | |
706 | s = (dec_interface_State *)st; |
707 | |
708 | #ifndef ETSI |
709 | |
710 | /* |
711 | * extract mode information and frametype, |
712 | * octets to parameters |
713 | */ |
714 | #ifdef IF2 |
715 | mode = Decoder3GPP(prm, bits, &frame_type, &speech_mode); |
716 | #else |
717 | mode = DecoderMMS(prm, bits, &frame_type, &speech_mode, &q_bit); |
718 | if (!bfi) { |
719 | bfi = 1 - q_bit; |
720 | } |
721 | #endif |
722 | |
723 | /* |
724 | * if no mode information |
725 | * guess one from the previous frame |
726 | */ |
727 | if (frame_type == RX_SPEECH_BAD) { |
728 | if (s->prev_ft > 3) { |
729 | frame_type = RX_SID_BAD; |
730 | mode = MRDTX; |
731 | } else { |
732 | mode = s->prev_mode; |
733 | } |
734 | } else if (frame_type == RX_NO_DATA) { |
735 | mode = s->prev_mode; |
736 | } |
737 | |
738 | if (bfi == 1) { |
739 | if (mode < 8) { |
740 | frame_type = RX_SPEECH_BAD; |
741 | } else if (mode != 15) { |
742 | frame_type = RX_SID_BAD; |
743 | } |
744 | } |
745 | |
746 | #else |
747 | bfi = 0; |
748 | frame_type = bits[0]; |
749 | |
750 | switch (frame_type) { |
751 | case 0: |
752 | frame_type = RX_SPEECH_GOOD; |
753 | mode = bits[245]; |
754 | Bits2Prm(mode, &bits[1], prm); |
755 | break; |
756 | |
757 | case 1: |
758 | frame_type = RX_SID_FIRST; |
759 | mode = s->prev_mode; |
760 | break; |
761 | |
762 | case 2: |
763 | frame_type = RX_SID_UPDATE; |
764 | mode = s->prev_mode; |
765 | Bits2Prm(MRDTX, &bits[1], prm); |
766 | break; |
767 | |
768 | case 3: |
769 | frame_type = RX_NO_DATA; |
770 | mode = s->prev_mode; |
771 | break; |
772 | } |
773 | |
774 | #endif |
775 | |
776 | /* test for homing frame */ |
777 | if (s->reset_flag_old == 1) { |
778 | switch (mode) { |
779 | case MR122: |
780 | homing = dhf_MR122; |
781 | homingSize = 18; |
782 | break; |
783 | |
784 | case MR102: |
785 | homing = dhf_MR102; |
786 | homingSize = 12; |
787 | break; |
788 | |
789 | case MR795: |
790 | homing = dhf_MR795; |
791 | homingSize = 8; |
792 | break; |
793 | |
794 | case MR74: |
795 | homing = dhf_MR74; |
796 | homingSize = 7; |
797 | break; |
798 | |
799 | case MR67: |
800 | homing = dhf_MR67; |
801 | homingSize = 7; |
802 | break; |
803 | |
804 | case MR59: |
805 | homing = dhf_MR59; |
806 | homingSize = 7; |
807 | break; |
808 | |
809 | case MR515: |
810 | homing = dhf_MR515; |
811 | homingSize = 7; |
812 | break; |
813 | |
814 | case MR475: |
815 | homing = dhf_MR475; |
816 | homingSize = 7; |
817 | break; |
818 | |
819 | default: |
820 | homing = NULL; |
821 | homingSize = 0; |
822 | break; |
823 | } |
824 | |
825 | for (i = 0; i < homingSize; i++) { |
826 | resetFlag = prm[i] ^ homing[i]; |
827 | |
828 | if (resetFlag) { |
829 | break; |
830 | } |
831 | } |
832 | } |
833 | |
834 | if ((resetFlag == 0) && (s->reset_flag_old != 0)) { |
835 | for (i = 0; i < 160; i++) { |
836 | synth[i] = EHF_MASK; |
837 | } |
838 | } else { |
839 | Speech_Decode_Frame(s->decoder_State, mode, prm, frame_type, synth); |
840 | } |
841 | |
842 | if (s->reset_flag_old == 0) { |
843 | /* check whole frame */ |
844 | switch (mode) { |
845 | case MR122: |
846 | homing = dhf_MR122; |
847 | homingSize = PRMNO_MR122; |
848 | break; |
849 | |
850 | case MR102: |
851 | homing = dhf_MR102; |
852 | homingSize = PRMNO_MR102; |
853 | break; |
854 | |
855 | case MR795: |
856 | homing = dhf_MR795; |
857 | homingSize = PRMNO_MR795; |
858 | break; |
859 | |
860 | case MR74: |
861 | homing = dhf_MR74; |
862 | homingSize = PRMNO_MR74; |
863 | break; |
864 | |
865 | case MR67: |
866 | homing = dhf_MR67; |
867 | homingSize = PRMNO_MR67; |
868 | break; |
869 | |
870 | case MR59: |
871 | homing = dhf_MR59; |
872 | homingSize = PRMNO_MR59; |
873 | break; |
874 | |
875 | case MR515: |
876 | homing = dhf_MR515; |
877 | homingSize = PRMNO_MR515; |
878 | break; |
879 | |
880 | case MR475: |
881 | homing = dhf_MR475; |
882 | homingSize = PRMNO_MR475; |
883 | break; |
884 | |
885 | default: |
886 | homing = NULL; |
887 | homingSize = 0; |
888 | } |
889 | |
890 | for (i = 0; i < homingSize; i++) { |
891 | resetFlag = prm[i] ^ homing[i]; |
892 | |
893 | if (resetFlag) { |
894 | break; |
895 | } |
896 | } |
897 | } |
898 | |
899 | /* reset decoder if current frame is a homing frame */ |
900 | if (resetFlag == 0) { |
901 | Speech_Decode_Frame_reset(s->decoder_State); |
902 | } |
903 | s->reset_flag_old = !resetFlag; |
904 | s->prev_ft = frame_type; |
905 | s->prev_mode = mode; |
906 | } |
907 |