Line data Source code
1 : /*==================================================================================== 2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 3 : ====================================================================================*/ 4 : #include <stdint.h> 5 : #include "options.h" /* Compilation switches */ 6 : #include "prot_fx.h" /* Function prototypes */ 7 : #include "ivas_prot_fx.h" 8 : 9 : /*--------------------------------------------------------------------------* 10 : * hq_classifier_dec() 11 : * 12 : * HQ mode selector (decision_matrix) 13 : *--------------------------------------------------------------------------*/ 14 : 15 7432 : Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits Q0 */ 16 : Decoder_State *st_fx, /* i/o: decoder state structure */ 17 : const Word32 core_brate, /* i : Core bit rate Q0 */ 18 : const Word16 length, /* i : Frame length Q0 */ 19 : Word16 *is_transient, /* o : Transient flag Q0 */ 20 : Word16 *hqswb_clas /* o : HQ class Q0 */ 21 : ) 22 : { 23 : Word16 bits; 24 : Word32 max_brate; 25 : 26 7432 : max_brate = HQ_32k; /* Q0 */ 27 7432 : move32(); 28 7432 : if ( st_fx->element_mode > EVS_MONO ) 29 : { 30 7432 : max_brate = HQ_48k; /* Q0 */ 31 7432 : move32(); 32 : } 33 7432 : test(); 34 7432 : test(); 35 7432 : test(); 36 7432 : IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) && LE_32( core_brate, max_brate ) ) 37 : { 38 6704 : *hqswb_clas = (Word16) get_next_indice_fx( st_fx, 2 ); /* Q0 */ 39 6704 : move16(); 40 6704 : bits = 2; 41 6704 : move16(); 42 : } 43 728 : ELSE IF( EQ_16( length, L_SPEC16k_EXT ) || EQ_16( length, L_SPEC48k_EXT ) ) 44 : { 45 127 : *hqswb_clas = HQ_NORMAL; /* Q0 */ 46 127 : bits = 0; 47 127 : move16(); 48 127 : move16(); 49 : } 50 : ELSE 51 : { 52 601 : *hqswb_clas = get_next_indice_fx( st_fx, 1 ); /* Q0 */ 53 601 : move16(); 54 601 : bits = 1; 55 601 : move16(); 56 : } 57 : 58 7432 : *is_transient = 0; 59 7432 : move16(); 60 7432 : if ( EQ_16( *hqswb_clas, HQ_TRANSIENT ) ) 61 : { 62 488 : *is_transient = 1; /* Q0 */ 63 488 : move16(); 64 : } 65 : 66 7432 : test(); 67 7432 : IF( LE_32( st_fx->core_brate, HQ_32k ) && *hqswb_clas == HQ_NORMAL ) 68 : { 69 3366 : IF( EQ_16( length, L_SPEC32k ) ) 70 : { 71 686 : *hqswb_clas = HQ_GEN_SWB; /* Q0 */ 72 686 : move16(); 73 : } 74 2680 : ELSE IF( EQ_16( length, L_SPEC48k ) ) 75 : { 76 2115 : *hqswb_clas = HQ_GEN_FB; /* Q0 */ 77 2115 : move16(); 78 : } 79 : } 80 : 81 7432 : return bits; 82 : } 83 : 84 406 : Word16 hq_classifier_dec_fx( /* o : Consumed bits Q0 */ 85 : Decoder_State *st_fx, /* i/o: decoder state structure */ 86 : const Word32 core_brate, /* i : Core bit rate Q0 */ 87 : const Word16 length, /* i : Frame length Q0 */ 88 : Word16 *is_transient, /* o : Transient flag Q0 */ 89 : Word16 *hqswb_clas /* o : HQ class Q0 */ 90 : ) 91 : { 92 : Word16 bits; 93 : Word32 max_brate; 94 : 95 406 : max_brate = HQ_32k; /* Q0 */ 96 406 : move32(); 97 406 : if ( st_fx->element_mode > EVS_MONO ) 98 : { 99 0 : max_brate = HQ_48k; /* Q0 */ 100 0 : move32(); 101 : } 102 406 : test(); 103 406 : test(); 104 406 : test(); 105 406 : test(); 106 406 : IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_FRAME48k ) ) && LE_32( core_brate, max_brate ) ) 107 : { 108 75 : *hqswb_clas = get_next_indice_fx( st_fx, 2 ); /* Q0 */ 109 75 : move16(); 110 75 : bits = 2; 111 75 : move16(); 112 : } 113 331 : ELSE IF( EQ_16( length, L_SPEC16k_EXT ) || EQ_16( length, L_SPEC48k_EXT ) ) 114 : { 115 0 : *hqswb_clas = HQ_NORMAL; /* Q0 */ 116 0 : bits = 0; 117 0 : move16(); 118 0 : move16(); 119 : } 120 : ELSE 121 : { 122 331 : *hqswb_clas = get_next_indice_fx( st_fx, 1 ); /* Q0 */ 123 331 : move16(); 124 331 : bits = 1; 125 331 : move16(); 126 : } 127 : 128 406 : *is_transient = 0; 129 406 : move16(); 130 406 : if ( EQ_16( *hqswb_clas, HQ_TRANSIENT ) ) 131 : { 132 35 : *is_transient = 1; /* Q0 */ 133 35 : move16(); 134 : } 135 : 136 406 : test(); 137 406 : IF( LE_32( st_fx->core_brate, HQ_32k ) && *hqswb_clas == HQ_NORMAL ) 138 : { 139 50 : IF( EQ_16( length, L_SPEC32k ) ) 140 : { 141 50 : *hqswb_clas = HQ_GEN_SWB; /* Q0 */ 142 50 : move16(); 143 : } 144 0 : ELSE IF( EQ_16( length, L_FRAME48k ) ) 145 : { 146 0 : *hqswb_clas = HQ_GEN_FB; /* Q0 */ 147 0 : move16(); 148 : } 149 : } 150 : 151 406 : return bits; 152 : }