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 7331 : 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 7331 : max_brate = HQ_32k; /* Q0 */ 27 7331 : move32(); 28 7331 : if ( st_fx->element_mode > EVS_MONO ) 29 : { 30 7331 : max_brate = HQ_48k; /* Q0 */ 31 7331 : move32(); 32 : } 33 7331 : test(); 34 7331 : test(); 35 7331 : test(); 36 7331 : IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) && LE_32( core_brate, max_brate ) ) 37 : { 38 6613 : *hqswb_clas = (Word16) get_next_indice_fx( st_fx, 2 ); /* Q0 */ 39 6613 : move16(); 40 6613 : bits = 2; 41 6613 : move16(); 42 : } 43 718 : ELSE IF( EQ_16( length, L_SPEC16k_EXT ) || EQ_16( length, L_SPEC48k_EXT ) ) 44 : { 45 122 : *hqswb_clas = HQ_NORMAL; /* Q0 */ 46 122 : bits = 0; 47 122 : move16(); 48 122 : move16(); 49 : } 50 : ELSE 51 : { 52 596 : *hqswb_clas = get_next_indice_fx( st_fx, 1 ); /* Q0 */ 53 596 : move16(); 54 596 : bits = 1; 55 596 : move16(); 56 : } 57 : 58 7331 : *is_transient = 0; 59 7331 : move16(); 60 7331 : if ( EQ_16( *hqswb_clas, HQ_TRANSIENT ) ) 61 : { 62 477 : *is_transient = 1; /* Q0 */ 63 477 : move16(); 64 : } 65 : 66 7331 : test(); 67 7331 : IF( LE_32( st_fx->core_brate, HQ_32k ) && *hqswb_clas == HQ_NORMAL ) 68 : { 69 3298 : IF( EQ_16( length, L_SPEC32k ) ) 70 : { 71 673 : *hqswb_clas = HQ_GEN_SWB; /* Q0 */ 72 673 : move16(); 73 : } 74 2625 : ELSE IF( EQ_16( length, L_SPEC48k ) ) 75 : { 76 2070 : *hqswb_clas = HQ_GEN_FB; /* Q0 */ 77 2070 : move16(); 78 : } 79 : } 80 : 81 7331 : return bits; 82 : } 83 : 84 397 : 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 397 : max_brate = HQ_32k; /* Q0 */ 96 397 : move32(); 97 397 : if ( st_fx->element_mode > EVS_MONO ) 98 : { 99 0 : max_brate = HQ_48k; /* Q0 */ 100 0 : move32(); 101 : } 102 397 : test(); 103 397 : test(); 104 397 : test(); 105 397 : test(); 106 397 : IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_FRAME48k ) ) && LE_32( core_brate, max_brate ) ) 107 : { 108 66 : *hqswb_clas = get_next_indice( st_fx, 2 ); /* Q0 */ 109 66 : move16(); 110 66 : bits = 2; 111 66 : 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( st_fx, 1 ); /* Q0 */ 123 331 : move16(); 124 331 : bits = 1; 125 331 : move16(); 126 : } 127 : 128 397 : *is_transient = 0; 129 397 : move16(); 130 397 : if ( EQ_16( *hqswb_clas, HQ_TRANSIENT ) ) 131 : { 132 35 : *is_transient = 1; /* Q0 */ 133 35 : move16(); 134 : } 135 : 136 397 : test(); 137 397 : IF( LE_32( st_fx->core_brate, HQ_32k ) && *hqswb_clas == HQ_NORMAL ) 138 : { 139 46 : IF( EQ_16( length, L_SPEC32k ) ) 140 : { 141 46 : *hqswb_clas = HQ_GEN_SWB; /* Q0 */ 142 46 : 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 397 : return bits; 152 : }