57 void hb_fir_filter_mips(
float *out,
const float fir_coef[
HB_FIR_SIZE + 1],
63 memcpy(data,
mem, HB_FIR_SIZE *
sizeof(
float));
68 float * p_data = (data+
i);
75 "mtc1 $zero, %[output] \n\t" 76 "lwc1 $f0, 0(%[p_data]) \n\t" 77 "lwc1 $f1, 0(%[fir_coef]) \n\t" 78 "lwc1 $f2, 4(%[p_data]) \n\t" 79 "madd.s %[output], %[output], $f0, $f1 \n\t" 80 "lwc1 $f3, 4(%[fir_coef]) \n\t" 81 "lwc1 $f4, 8(%[p_data]) \n\t" 82 "madd.s %[output], %[output], $f2, $f3 \n\t" 83 "lwc1 $f5, 8(%[fir_coef]) \n\t" 85 "lwc1 $f0, 12(%[p_data]) \n\t" 86 "lwc1 $f1, 12(%[fir_coef]) \n\t" 87 "madd.s %[output], %[output], $f4, $f5 \n\t" 88 "lwc1 $f2, 16(%[p_data]) \n\t" 89 "madd.s %[output], %[output], $f0, $f1 \n\t" 90 "lwc1 $f3, 16(%[fir_coef]) \n\t" 91 "lwc1 $f4, 20(%[p_data]) \n\t" 92 "lwc1 $f5, 20(%[fir_coef]) \n\t" 93 "madd.s %[output], %[output], $f2, $f3 \n\t" 95 "lwc1 $f0, 24(%[p_data]) \n\t" 96 "lwc1 $f1, 24(%[fir_coef]) \n\t" 97 "lwc1 $f2, 28(%[p_data]) \n\t" 98 "madd.s %[output], %[output], $f4, $f5 \n\t" 99 "lwc1 $f3, 28(%[fir_coef]) \n\t" 100 "madd.s %[output], %[output], $f0, $f1 \n\t" 101 "lwc1 $f4, 32(%[p_data]) \n\t" 102 "madd.s %[output], %[output], $f2, $f3 \n\t" 103 "lwc1 $f5, 32(%[fir_coef]) \n\t" 104 "madd.s %[output], %[output], $f4, $f5 \n\t" 106 "lwc1 $f0, 36(%[p_data]) \n\t" 107 "lwc1 $f1, 36(%[fir_coef]) \n\t" 108 "lwc1 $f2, 40(%[p_data]) \n\t" 109 "lwc1 $f3, 40(%[fir_coef]) \n\t" 110 "madd.s %[output], %[output], $f0, $f1 \n\t" 111 "lwc1 $f4, 44(%[p_data]) \n\t" 112 "lwc1 $f5, 44(%[fir_coef]) \n\t" 113 "madd.s %[output], %[output], $f2, $f3 \n\t" 115 "lwc1 $f0, 48(%[p_data]) \n\t" 116 "lwc1 $f1, 48(%[fir_coef]) \n\t" 117 "lwc1 $f2, 52(%[p_data]) \n\t" 118 "madd.s %[output], %[output], $f4, $f5 \n\t" 119 "lwc1 $f3, 52(%[fir_coef]) \n\t" 120 "lwc1 $f4, 56(%[p_data]) \n\t" 121 "madd.s %[output], %[output], $f0, $f1 \n\t" 122 "lwc1 $f5, 56(%[fir_coef]) \n\t" 123 "madd.s %[output], %[output], $f2, $f3 \n\t" 125 "lwc1 $f0, 60(%[p_data]) \n\t" 126 "lwc1 $f1, 60(%[fir_coef]) \n\t" 127 "lwc1 $f2, 64(%[p_data]) \n\t" 128 "madd.s %[output], %[output], $f4, $f5 \n\t" 129 "lwc1 $f3, 64(%[fir_coef]) \n\t" 130 "madd.s %[output], %[output], $f0, $f1 \n\t" 131 "lwc1 $f4, 68(%[p_data]) \n\t" 132 "madd.s %[output], %[output], $f2, $f3 \n\t" 133 "lwc1 $f5, 68(%[fir_coef]) \n\t" 134 "madd.s %[output], %[output], $f4, $f5 \n\t" 136 "lwc1 $f0, 72(%[p_data]) \n\t" 137 "lwc1 $f1, 72(%[fir_coef]) \n\t" 138 "lwc1 $f2, 76(%[p_data]) \n\t" 139 "lwc1 $f3, 76(%[fir_coef]) \n\t" 140 "madd.s %[output], %[output], $f0, $f1 \n\t" 141 "lwc1 $f4, 80(%[p_data]) \n\t" 142 "lwc1 $f5, 80(%[fir_coef]) \n\t" 143 "madd.s %[output], %[output], $f2, $f3 \n\t" 145 "lwc1 $f0, 84(%[p_data]) \n\t" 146 "lwc1 $f1, 84(%[fir_coef]) \n\t" 147 "lwc1 $f2, 88(%[p_data]) \n\t" 148 "madd.s %[output], %[output], $f4, $f5 \n\t" 149 "lwc1 $f3, 88(%[fir_coef]) \n\t" 150 "lwc1 $f4, 92(%[p_data]) \n\t" 151 "madd.s %[output], %[output], $f0, $f1 \n\t" 152 "lwc1 $f5, 92(%[fir_coef]) \n\t" 153 "madd.s %[output], %[output], $f2, $f3 \n\t" 155 "lwc1 $f0, 96(%[p_data]) \n\t" 156 "lwc1 $f1, 96(%[fir_coef]) \n\t" 157 "lwc1 $f2, 100(%[p_data]) \n\t" 158 "madd.s %[output], %[output], $f4, $f5 \n\t" 159 "lwc1 $f3, 100(%[fir_coef]) \n\t" 160 "lwc1 $f4, 104(%[p_data]) \n\t" 161 "madd.s %[output], %[output], $f0, $f1 \n\t" 162 "lwc1 $f5, 104(%[fir_coef]) \n\t" 163 "madd.s %[output], %[output], $f2, $f3 \n\t" 165 "lwc1 $f0, 108(%[p_data]) \n\t" 166 "lwc1 $f1, 108(%[fir_coef]) \n\t" 167 "madd.s %[output], %[output], $f4, $f5 \n\t" 168 "lwc1 $f2, 112(%[p_data]) \n\t" 169 "lwc1 $f3, 112(%[fir_coef]) \n\t" 170 "madd.s %[output], %[output], $f0, $f1 \n\t" 171 "lwc1 $f4, 116(%[p_data]) \n\t" 172 "lwc1 $f5, 116(%[fir_coef]) \n\t" 173 "lwc1 $f0, 120(%[p_data]) \n\t" 174 "madd.s %[output], %[output], $f2, $f3 \n\t" 175 "lwc1 $f1, 120(%[fir_coef]) \n\t" 176 "madd.s %[output], %[output], $f4, $f5 \n\t" 177 "madd.s %[output], %[output], $f0, $f1 \n\t" 180 : [fir_coef]
"r"(fir_coef), [p_data]
"r"(p_data)
181 :
"$f0",
"$f1",
"$f2",
"$f3",
"$f4",
"$f5",
"memory" 185 memcpy(
mem, data + AMRWB_SFR_SIZE_16k, HB_FIR_SIZE *
sizeof(
float));
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Reference: libavcodec/amrwbdec.c.
synthesis window for stochastic i
#define AMRWB_SFR_SIZE_16k
samples per subframe at 16 kHz
#define HB_FIR_SIZE
amount of past data needed by HB filters
these buffered frames must be flushed immediately if a new input produces new output(Example:frame rate-doubling filter:filter_frame must(1) flush the second copy of the previous frame, if it is still there,(2) push the first copy of the incoming frame,(3) keep the second copy for later.) If the input frame is not enough to produce output
AMR wideband data and definitions.