0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011
0012 #include <media/v4l2-vp9.h>
0013
0014 const u8 v4l2_vp9_kf_y_mode_prob[10][10][9] = {
0015 {
0016
0017 { 137, 30, 42, 148, 151, 207, 70, 52, 91 },
0018 { 92, 45, 102, 136, 116, 180, 74, 90, 100 },
0019 { 73, 32, 19, 187, 222, 215, 46, 34, 100 },
0020 { 91, 30, 32, 116, 121, 186, 93, 86, 94 },
0021 { 72, 35, 36, 149, 68, 206, 68, 63, 105 },
0022 { 73, 31, 28, 138, 57, 124, 55, 122, 151 },
0023 { 67, 23, 21, 140, 126, 197, 40, 37, 171 },
0024 { 86, 27, 28, 128, 154, 212, 45, 43, 53 },
0025 { 74, 32, 27, 107, 86, 160, 63, 134, 102 },
0026 { 59, 67, 44, 140, 161, 202, 78, 67, 119 },
0027 }, {
0028 { 63, 36, 126, 146, 123, 158, 60, 90, 96 },
0029 { 43, 46, 168, 134, 107, 128, 69, 142, 92 },
0030 { 44, 29, 68, 159, 201, 177, 50, 57, 77 },
0031 { 58, 38, 76, 114, 97, 172, 78, 133, 92 },
0032 { 46, 41, 76, 140, 63, 184, 69, 112, 57 },
0033 { 38, 32, 85, 140, 46, 112, 54, 151, 133 },
0034 { 39, 27, 61, 131, 110, 175, 44, 75, 136 },
0035 { 52, 30, 74, 113, 130, 175, 51, 64, 58 },
0036 { 47, 35, 80, 100, 74, 143, 64, 163, 74 },
0037 { 36, 61, 116, 114, 128, 162, 80, 125, 82 },
0038 }, {
0039 { 82, 26, 26, 171, 208, 204, 44, 32, 105 },
0040 { 55, 44, 68, 166, 179, 192, 57, 57, 108 },
0041 { 42, 26, 11, 199, 241, 228, 23, 15, 85 },
0042 { 68, 42, 19, 131, 160, 199, 55, 52, 83 },
0043 { 58, 50, 25, 139, 115, 232, 39, 52, 118 },
0044 { 50, 35, 33, 153, 104, 162, 64, 59, 131 },
0045 { 44, 24, 16, 150, 177, 202, 33, 19, 156 },
0046 { 55, 27, 12, 153, 203, 218, 26, 27, 49 },
0047 { 53, 49, 21, 110, 116, 168, 59, 80, 76 },
0048 { 38, 72, 19, 168, 203, 212, 50, 50, 107 },
0049 }, {
0050 { 103, 26, 36, 129, 132, 201, 83, 80, 93 },
0051 { 59, 38, 83, 112, 103, 162, 98, 136, 90 },
0052 { 62, 30, 23, 158, 200, 207, 59, 57, 50 },
0053 { 67, 30, 29, 84, 86, 191, 102, 91, 59 },
0054 { 60, 32, 33, 112, 71, 220, 64, 89, 104 },
0055 { 53, 26, 34, 130, 56, 149, 84, 120, 103 },
0056 { 53, 21, 23, 133, 109, 210, 56, 77, 172 },
0057 { 77, 19, 29, 112, 142, 228, 55, 66, 36 },
0058 { 61, 29, 29, 93, 97, 165, 83, 175, 162 },
0059 { 47, 47, 43, 114, 137, 181, 100, 99, 95 },
0060 }, {
0061 { 69, 23, 29, 128, 83, 199, 46, 44, 101 },
0062 { 53, 40, 55, 139, 69, 183, 61, 80, 110 },
0063 { 40, 29, 19, 161, 180, 207, 43, 24, 91 },
0064 { 60, 34, 19, 105, 61, 198, 53, 64, 89 },
0065 { 52, 31, 22, 158, 40, 209, 58, 62, 89 },
0066 { 44, 31, 29, 147, 46, 158, 56, 102, 198 },
0067 { 35, 19, 12, 135, 87, 209, 41, 45, 167 },
0068 { 55, 25, 21, 118, 95, 215, 38, 39, 66 },
0069 { 51, 38, 25, 113, 58, 164, 70, 93, 97 },
0070 { 47, 54, 34, 146, 108, 203, 72, 103, 151 },
0071 }, {
0072 { 64, 19, 37, 156, 66, 138, 49, 95, 133 },
0073 { 46, 27, 80, 150, 55, 124, 55, 121, 135 },
0074 { 36, 23, 27, 165, 149, 166, 54, 64, 118 },
0075 { 53, 21, 36, 131, 63, 163, 60, 109, 81 },
0076 { 40, 26, 35, 154, 40, 185, 51, 97, 123 },
0077 { 35, 19, 34, 179, 19, 97, 48, 129, 124 },
0078 { 36, 20, 26, 136, 62, 164, 33, 77, 154 },
0079 { 45, 18, 32, 130, 90, 157, 40, 79, 91 },
0080 { 45, 26, 28, 129, 45, 129, 49, 147, 123 },
0081 { 38, 44, 51, 136, 74, 162, 57, 97, 121 },
0082 }, {
0083 { 75, 17, 22, 136, 138, 185, 32, 34, 166 },
0084 { 56, 39, 58, 133, 117, 173, 48, 53, 187 },
0085 { 35, 21, 12, 161, 212, 207, 20, 23, 145 },
0086 { 56, 29, 19, 117, 109, 181, 55, 68, 112 },
0087 { 47, 29, 17, 153, 64, 220, 59, 51, 114 },
0088 { 46, 16, 24, 136, 76, 147, 41, 64, 172 },
0089 { 34, 17, 11, 108, 152, 187, 13, 15, 209 },
0090 { 51, 24, 14, 115, 133, 209, 32, 26, 104 },
0091 { 55, 30, 18, 122, 79, 179, 44, 88, 116 },
0092 { 37, 49, 25, 129, 168, 164, 41, 54, 148 },
0093 }, {
0094 { 82, 22, 32, 127, 143, 213, 39, 41, 70 },
0095 { 62, 44, 61, 123, 105, 189, 48, 57, 64 },
0096 { 47, 25, 17, 175, 222, 220, 24, 30, 86 },
0097 { 68, 36, 17, 106, 102, 206, 59, 74, 74 },
0098 { 57, 39, 23, 151, 68, 216, 55, 63, 58 },
0099 { 49, 30, 35, 141, 70, 168, 82, 40, 115 },
0100 { 51, 25, 15, 136, 129, 202, 38, 35, 139 },
0101 { 68, 26, 16, 111, 141, 215, 29, 28, 28 },
0102 { 59, 39, 19, 114, 75, 180, 77, 104, 42 },
0103 { 40, 61, 26, 126, 152, 206, 61, 59, 93 },
0104 }, {
0105 { 78, 23, 39, 111, 117, 170, 74, 124, 94 },
0106 { 48, 34, 86, 101, 92, 146, 78, 179, 134 },
0107 { 47, 22, 24, 138, 187, 178, 68, 69, 59 },
0108 { 56, 25, 33, 105, 112, 187, 95, 177, 129 },
0109 { 48, 31, 27, 114, 63, 183, 82, 116, 56 },
0110 { 43, 28, 37, 121, 63, 123, 61, 192, 169 },
0111 { 42, 17, 24, 109, 97, 177, 56, 76, 122 },
0112 { 58, 18, 28, 105, 139, 182, 70, 92, 63 },
0113 { 46, 23, 32, 74, 86, 150, 67, 183, 88 },
0114 { 36, 38, 48, 92, 122, 165, 88, 137, 91 },
0115 }, {
0116 { 65, 70, 60, 155, 159, 199, 61, 60, 81 },
0117 { 44, 78, 115, 132, 119, 173, 71, 112, 93 },
0118 { 39, 38, 21, 184, 227, 206, 42, 32, 64 },
0119 { 58, 47, 36, 124, 137, 193, 80, 82, 78 },
0120 { 49, 50, 35, 144, 95, 205, 63, 78, 59 },
0121 { 41, 53, 52, 148, 71, 142, 65, 128, 51 },
0122 { 40, 36, 28, 143, 143, 202, 40, 55, 137 },
0123 { 52, 34, 29, 129, 183, 227, 42, 35, 43 },
0124 { 42, 44, 44, 104, 105, 164, 64, 130, 80 },
0125 { 43, 81, 53, 140, 169, 204, 68, 84, 72 },
0126 }
0127 };
0128 EXPORT_SYMBOL_GPL(v4l2_vp9_kf_y_mode_prob);
0129
0130 const u8 v4l2_vp9_kf_partition_probs[16][3] = {
0131
0132 { 158, 97, 94 },
0133 { 93, 24, 99 },
0134 { 85, 119, 44 },
0135 { 62, 59, 67 },
0136
0137 { 149, 53, 53 },
0138 { 94, 20, 48 },
0139 { 83, 53, 24 },
0140 { 52, 18, 18 },
0141
0142 { 150, 40, 39 },
0143 { 78, 12, 26 },
0144 { 67, 33, 11 },
0145 { 24, 7, 5 },
0146
0147 { 174, 35, 49 },
0148 { 68, 11, 27 },
0149 { 57, 15, 9 },
0150 { 12, 3, 3 },
0151 };
0152 EXPORT_SYMBOL_GPL(v4l2_vp9_kf_partition_probs);
0153
0154 const u8 v4l2_vp9_kf_uv_mode_prob[10][9] = {
0155 { 144, 11, 54, 157, 195, 130, 46, 58, 108 },
0156 { 118, 15, 123, 148, 131, 101, 44, 93, 131 },
0157 { 113, 12, 23, 188, 226, 142, 26, 32, 125 },
0158 { 120, 11, 50, 123, 163, 135, 64, 77, 103 },
0159 { 113, 9, 36, 155, 111, 157, 32, 44, 161 },
0160 { 116, 9, 55, 176, 76, 96, 37, 61, 149 },
0161 { 115, 9, 28, 141, 161, 167, 21, 25, 193 },
0162 { 120, 12, 32, 145, 195, 142, 32, 38, 86 },
0163 { 116, 12, 64, 120, 140, 125, 49, 115, 121 },
0164 { 102, 19, 66, 162, 182, 122, 35, 59, 128 }
0165 };
0166 EXPORT_SYMBOL_GPL(v4l2_vp9_kf_uv_mode_prob);
0167
0168 const struct v4l2_vp9_frame_context v4l2_vp9_default_probs = {
0169 .tx8 = {
0170 { 100 },
0171 { 66 },
0172 },
0173 .tx16 = {
0174 { 20, 152 },
0175 { 15, 101 },
0176 },
0177 .tx32 = {
0178 { 3, 136, 37 },
0179 { 5, 52, 13 },
0180 },
0181 .coef = {
0182 {
0183 {
0184 {
0185 {
0186 { 195, 29, 183 },
0187 { 84, 49, 136 },
0188 { 8, 42, 71 },
0189 { 0, 0, 0 },
0190 { 0, 0, 0 },
0191 { 0, 0, 0 },
0192 },
0193 {
0194 { 31, 107, 169 },
0195 { 35, 99, 159 },
0196 { 17, 82, 140 },
0197 { 8, 66, 114 },
0198 { 2, 44, 76 },
0199 { 1, 19, 32 },
0200 },
0201 {
0202 { 40, 132, 201 },
0203 { 29, 114, 187 },
0204 { 13, 91, 157 },
0205 { 7, 75, 127 },
0206 { 3, 58, 95 },
0207 { 1, 28, 47 },
0208 },
0209 {
0210 { 69, 142, 221 },
0211 { 42, 122, 201 },
0212 { 15, 91, 159 },
0213 { 6, 67, 121 },
0214 { 1, 42, 77 },
0215 { 1, 17, 31 },
0216 },
0217 {
0218 { 102, 148, 228 },
0219 { 67, 117, 204 },
0220 { 17, 82, 154 },
0221 { 6, 59, 114 },
0222 { 2, 39, 75 },
0223 { 1, 15, 29 },
0224 },
0225 {
0226 { 156, 57, 233 },
0227 { 119, 57, 212 },
0228 { 58, 48, 163 },
0229 { 29, 40, 124 },
0230 { 12, 30, 81 },
0231 { 3, 12, 31 }
0232 },
0233 },
0234 {
0235 {
0236 { 191, 107, 226 },
0237 { 124, 117, 204 },
0238 { 25, 99, 155 },
0239 { 0, 0, 0 },
0240 { 0, 0, 0 },
0241 { 0, 0, 0 },
0242 },
0243 {
0244 { 29, 148, 210 },
0245 { 37, 126, 194 },
0246 { 8, 93, 157 },
0247 { 2, 68, 118 },
0248 { 1, 39, 69 },
0249 { 1, 17, 33 },
0250 },
0251 {
0252 { 41, 151, 213 },
0253 { 27, 123, 193 },
0254 { 3, 82, 144 },
0255 { 1, 58, 105 },
0256 { 1, 32, 60 },
0257 { 1, 13, 26 },
0258 },
0259 {
0260 { 59, 159, 220 },
0261 { 23, 126, 198 },
0262 { 4, 88, 151 },
0263 { 1, 66, 114 },
0264 { 1, 38, 71 },
0265 { 1, 18, 34 },
0266 },
0267 {
0268 { 114, 136, 232 },
0269 { 51, 114, 207 },
0270 { 11, 83, 155 },
0271 { 3, 56, 105 },
0272 { 1, 33, 65 },
0273 { 1, 17, 34 },
0274 },
0275 {
0276 { 149, 65, 234 },
0277 { 121, 57, 215 },
0278 { 61, 49, 166 },
0279 { 28, 36, 114 },
0280 { 12, 25, 76 },
0281 { 3, 16, 42 },
0282 },
0283 },
0284 },
0285 {
0286 {
0287 {
0288 { 214, 49, 220 },
0289 { 132, 63, 188 },
0290 { 42, 65, 137 },
0291 { 0, 0, 0 },
0292 { 0, 0, 0 },
0293 { 0, 0, 0 },
0294 },
0295 {
0296 { 85, 137, 221 },
0297 { 104, 131, 216 },
0298 { 49, 111, 192 },
0299 { 21, 87, 155 },
0300 { 2, 49, 87 },
0301 { 1, 16, 28 },
0302 },
0303 {
0304 { 89, 163, 230 },
0305 { 90, 137, 220 },
0306 { 29, 100, 183 },
0307 { 10, 70, 135 },
0308 { 2, 42, 81 },
0309 { 1, 17, 33 },
0310 },
0311 {
0312 { 108, 167, 237 },
0313 { 55, 133, 222 },
0314 { 15, 97, 179 },
0315 { 4, 72, 135 },
0316 { 1, 45, 85 },
0317 { 1, 19, 38 },
0318 },
0319 {
0320 { 124, 146, 240 },
0321 { 66, 124, 224 },
0322 { 17, 88, 175 },
0323 { 4, 58, 122 },
0324 { 1, 36, 75 },
0325 { 1, 18, 37 },
0326 },
0327 {
0328 { 141, 79, 241 },
0329 { 126, 70, 227 },
0330 { 66, 58, 182 },
0331 { 30, 44, 136 },
0332 { 12, 34, 96 },
0333 { 2, 20, 47 },
0334 },
0335 },
0336 {
0337 {
0338 { 229, 99, 249 },
0339 { 143, 111, 235 },
0340 { 46, 109, 192 },
0341 { 0, 0, 0 },
0342 { 0, 0, 0 },
0343 { 0, 0, 0 },
0344 },
0345 {
0346 { 82, 158, 236 },
0347 { 94, 146, 224 },
0348 { 25, 117, 191 },
0349 { 9, 87, 149 },
0350 { 3, 56, 99 },
0351 { 1, 33, 57 },
0352 },
0353 {
0354 { 83, 167, 237 },
0355 { 68, 145, 222 },
0356 { 10, 103, 177 },
0357 { 2, 72, 131 },
0358 { 1, 41, 79 },
0359 { 1, 20, 39 },
0360 },
0361 {
0362 { 99, 167, 239 },
0363 { 47, 141, 224 },
0364 { 10, 104, 178 },
0365 { 2, 73, 133 },
0366 { 1, 44, 85 },
0367 { 1, 22, 47 },
0368 },
0369 {
0370 { 127, 145, 243 },
0371 { 71, 129, 228 },
0372 { 17, 93, 177 },
0373 { 3, 61, 124 },
0374 { 1, 41, 84 },
0375 { 1, 21, 52 },
0376 },
0377 {
0378 { 157, 78, 244 },
0379 { 140, 72, 231 },
0380 { 69, 58, 184 },
0381 { 31, 44, 137 },
0382 { 14, 38, 105 },
0383 { 8, 23, 61 },
0384 },
0385 },
0386 },
0387 },
0388 {
0389 {
0390 {
0391 {
0392 { 125, 34, 187 },
0393 { 52, 41, 133 },
0394 { 6, 31, 56 },
0395 { 0, 0, 0 },
0396 { 0, 0, 0 },
0397 { 0, 0, 0 },
0398 },
0399 {
0400 { 37, 109, 153 },
0401 { 51, 102, 147 },
0402 { 23, 87, 128 },
0403 { 8, 67, 101 },
0404 { 1, 41, 63 },
0405 { 1, 19, 29 },
0406 },
0407 {
0408 { 31, 154, 185 },
0409 { 17, 127, 175 },
0410 { 6, 96, 145 },
0411 { 2, 73, 114 },
0412 { 1, 51, 82 },
0413 { 1, 28, 45 },
0414 },
0415 {
0416 { 23, 163, 200 },
0417 { 10, 131, 185 },
0418 { 2, 93, 148 },
0419 { 1, 67, 111 },
0420 { 1, 41, 69 },
0421 { 1, 14, 24 },
0422 },
0423 {
0424 { 29, 176, 217 },
0425 { 12, 145, 201 },
0426 { 3, 101, 156 },
0427 { 1, 69, 111 },
0428 { 1, 39, 63 },
0429 { 1, 14, 23 },
0430 },
0431 {
0432 { 57, 192, 233 },
0433 { 25, 154, 215 },
0434 { 6, 109, 167 },
0435 { 3, 78, 118 },
0436 { 1, 48, 69 },
0437 { 1, 21, 29 },
0438 },
0439 },
0440 {
0441 {
0442 { 202, 105, 245 },
0443 { 108, 106, 216 },
0444 { 18, 90, 144 },
0445 { 0, 0, 0 },
0446 { 0, 0, 0 },
0447 { 0, 0, 0 },
0448 },
0449 {
0450 { 33, 172, 219 },
0451 { 64, 149, 206 },
0452 { 14, 117, 177 },
0453 { 5, 90, 141 },
0454 { 2, 61, 95 },
0455 { 1, 37, 57 },
0456 },
0457 {
0458 { 33, 179, 220 },
0459 { 11, 140, 198 },
0460 { 1, 89, 148 },
0461 { 1, 60, 104 },
0462 { 1, 33, 57 },
0463 { 1, 12, 21 },
0464 },
0465 {
0466 { 30, 181, 221 },
0467 { 8, 141, 198 },
0468 { 1, 87, 145 },
0469 { 1, 58, 100 },
0470 { 1, 31, 55 },
0471 { 1, 12, 20 },
0472 },
0473 {
0474 { 32, 186, 224 },
0475 { 7, 142, 198 },
0476 { 1, 86, 143 },
0477 { 1, 58, 100 },
0478 { 1, 31, 55 },
0479 { 1, 12, 22 },
0480 },
0481 {
0482 { 57, 192, 227 },
0483 { 20, 143, 204 },
0484 { 3, 96, 154 },
0485 { 1, 68, 112 },
0486 { 1, 42, 69 },
0487 { 1, 19, 32 },
0488 },
0489 },
0490 },
0491 {
0492 {
0493 {
0494 { 212, 35, 215 },
0495 { 113, 47, 169 },
0496 { 29, 48, 105 },
0497 { 0, 0, 0 },
0498 { 0, 0, 0 },
0499 { 0, 0, 0 },
0500 },
0501 {
0502 { 74, 129, 203 },
0503 { 106, 120, 203 },
0504 { 49, 107, 178 },
0505 { 19, 84, 144 },
0506 { 4, 50, 84 },
0507 { 1, 15, 25 },
0508 },
0509 {
0510 { 71, 172, 217 },
0511 { 44, 141, 209 },
0512 { 15, 102, 173 },
0513 { 6, 76, 133 },
0514 { 2, 51, 89 },
0515 { 1, 24, 42 },
0516 },
0517 {
0518 { 64, 185, 231 },
0519 { 31, 148, 216 },
0520 { 8, 103, 175 },
0521 { 3, 74, 131 },
0522 { 1, 46, 81 },
0523 { 1, 18, 30 },
0524 },
0525 {
0526 { 65, 196, 235 },
0527 { 25, 157, 221 },
0528 { 5, 105, 174 },
0529 { 1, 67, 120 },
0530 { 1, 38, 69 },
0531 { 1, 15, 30 },
0532 },
0533 {
0534 { 65, 204, 238 },
0535 { 30, 156, 224 },
0536 { 7, 107, 177 },
0537 { 2, 70, 124 },
0538 { 1, 42, 73 },
0539 { 1, 18, 34 },
0540 },
0541 },
0542 {
0543 {
0544 { 225, 86, 251 },
0545 { 144, 104, 235 },
0546 { 42, 99, 181 },
0547 { 0, 0, 0 },
0548 { 0, 0, 0 },
0549 { 0, 0, 0 },
0550 },
0551 {
0552 { 85, 175, 239 },
0553 { 112, 165, 229 },
0554 { 29, 136, 200 },
0555 { 12, 103, 162 },
0556 { 6, 77, 123 },
0557 { 2, 53, 84 },
0558 },
0559 {
0560 { 75, 183, 239 },
0561 { 30, 155, 221 },
0562 { 3, 106, 171 },
0563 { 1, 74, 128 },
0564 { 1, 44, 76 },
0565 { 1, 17, 28 },
0566 },
0567 {
0568 { 73, 185, 240 },
0569 { 27, 159, 222 },
0570 { 2, 107, 172 },
0571 { 1, 75, 127 },
0572 { 1, 42, 73 },
0573 { 1, 17, 29 },
0574 },
0575 {
0576 { 62, 190, 238 },
0577 { 21, 159, 222 },
0578 { 2, 107, 172 },
0579 { 1, 72, 122 },
0580 { 1, 40, 71 },
0581 { 1, 18, 32 },
0582 },
0583 {
0584 { 61, 199, 240 },
0585 { 27, 161, 226 },
0586 { 4, 113, 180 },
0587 { 1, 76, 129 },
0588 { 1, 46, 80 },
0589 { 1, 23, 41 },
0590 },
0591 },
0592 },
0593 },
0594 {
0595 {
0596 {
0597 {
0598 { 7, 27, 153 },
0599 { 5, 30, 95 },
0600 { 1, 16, 30 },
0601 { 0, 0, 0 },
0602 { 0, 0, 0 },
0603 { 0, 0, 0 },
0604 },
0605 {
0606 { 50, 75, 127 },
0607 { 57, 75, 124 },
0608 { 27, 67, 108 },
0609 { 10, 54, 86 },
0610 { 1, 33, 52 },
0611 { 1, 12, 18 },
0612 },
0613 {
0614 { 43, 125, 151 },
0615 { 26, 108, 148 },
0616 { 7, 83, 122 },
0617 { 2, 59, 89 },
0618 { 1, 38, 60 },
0619 { 1, 17, 27 },
0620 },
0621 {
0622 { 23, 144, 163 },
0623 { 13, 112, 154 },
0624 { 2, 75, 117 },
0625 { 1, 50, 81 },
0626 { 1, 31, 51 },
0627 { 1, 14, 23 },
0628 },
0629 {
0630 { 18, 162, 185 },
0631 { 6, 123, 171 },
0632 { 1, 78, 125 },
0633 { 1, 51, 86 },
0634 { 1, 31, 54 },
0635 { 1, 14, 23 },
0636 },
0637 {
0638 { 15, 199, 227 },
0639 { 3, 150, 204 },
0640 { 1, 91, 146 },
0641 { 1, 55, 95 },
0642 { 1, 30, 53 },
0643 { 1, 11, 20 },
0644 }
0645 },
0646 {
0647 {
0648 { 19, 55, 240 },
0649 { 19, 59, 196 },
0650 { 3, 52, 105 },
0651 { 0, 0, 0 },
0652 { 0, 0, 0 },
0653 { 0, 0, 0 },
0654 },
0655 {
0656 { 41, 166, 207 },
0657 { 104, 153, 199 },
0658 { 31, 123, 181 },
0659 { 14, 101, 152 },
0660 { 5, 72, 106 },
0661 { 1, 36, 52 },
0662 },
0663 {
0664 { 35, 176, 211 },
0665 { 12, 131, 190 },
0666 { 2, 88, 144 },
0667 { 1, 60, 101 },
0668 { 1, 36, 60 },
0669 { 1, 16, 28 },
0670 },
0671 {
0672 { 28, 183, 213 },
0673 { 8, 134, 191 },
0674 { 1, 86, 142 },
0675 { 1, 56, 96 },
0676 { 1, 30, 53 },
0677 { 1, 12, 20 },
0678 },
0679 {
0680 { 20, 190, 215 },
0681 { 4, 135, 192 },
0682 { 1, 84, 139 },
0683 { 1, 53, 91 },
0684 { 1, 28, 49 },
0685 { 1, 11, 20 },
0686 },
0687 {
0688 { 13, 196, 216 },
0689 { 2, 137, 192 },
0690 { 1, 86, 143 },
0691 { 1, 57, 99 },
0692 { 1, 32, 56 },
0693 { 1, 13, 24 },
0694 },
0695 },
0696 },
0697 {
0698 {
0699 {
0700 { 211, 29, 217 },
0701 { 96, 47, 156 },
0702 { 22, 43, 87 },
0703 { 0, 0, 0 },
0704 { 0, 0, 0 },
0705 { 0, 0, 0 },
0706 },
0707 {
0708 { 78, 120, 193 },
0709 { 111, 116, 186 },
0710 { 46, 102, 164 },
0711 { 15, 80, 128 },
0712 { 2, 49, 76 },
0713 { 1, 18, 28 },
0714 },
0715 {
0716 { 71, 161, 203 },
0717 { 42, 132, 192 },
0718 { 10, 98, 150 },
0719 { 3, 69, 109 },
0720 { 1, 44, 70 },
0721 { 1, 18, 29 },
0722 },
0723 {
0724 { 57, 186, 211 },
0725 { 30, 140, 196 },
0726 { 4, 93, 146 },
0727 { 1, 62, 102 },
0728 { 1, 38, 65 },
0729 { 1, 16, 27 },
0730 },
0731 {
0732 { 47, 199, 217 },
0733 { 14, 145, 196 },
0734 { 1, 88, 142 },
0735 { 1, 57, 98 },
0736 { 1, 36, 62 },
0737 { 1, 15, 26 },
0738 },
0739 {
0740 { 26, 219, 229 },
0741 { 5, 155, 207 },
0742 { 1, 94, 151 },
0743 { 1, 60, 104 },
0744 { 1, 36, 62 },
0745 { 1, 16, 28 },
0746 }
0747 },
0748 {
0749 {
0750 { 233, 29, 248 },
0751 { 146, 47, 220 },
0752 { 43, 52, 140 },
0753 { 0, 0, 0 },
0754 { 0, 0, 0 },
0755 { 0, 0, 0 },
0756 },
0757 {
0758 { 100, 163, 232 },
0759 { 179, 161, 222 },
0760 { 63, 142, 204 },
0761 { 37, 113, 174 },
0762 { 26, 89, 137 },
0763 { 18, 68, 97 },
0764 },
0765 {
0766 { 85, 181, 230 },
0767 { 32, 146, 209 },
0768 { 7, 100, 164 },
0769 { 3, 71, 121 },
0770 { 1, 45, 77 },
0771 { 1, 18, 30 },
0772 },
0773 {
0774 { 65, 187, 230 },
0775 { 20, 148, 207 },
0776 { 2, 97, 159 },
0777 { 1, 68, 116 },
0778 { 1, 40, 70 },
0779 { 1, 14, 29 },
0780 },
0781 {
0782 { 40, 194, 227 },
0783 { 8, 147, 204 },
0784 { 1, 94, 155 },
0785 { 1, 65, 112 },
0786 { 1, 39, 66 },
0787 { 1, 14, 26 },
0788 },
0789 {
0790 { 16, 208, 228 },
0791 { 3, 151, 207 },
0792 { 1, 98, 160 },
0793 { 1, 67, 117 },
0794 { 1, 41, 74 },
0795 { 1, 17, 31 },
0796 },
0797 },
0798 },
0799 },
0800 {
0801 {
0802 {
0803 {
0804 { 17, 38, 140 },
0805 { 7, 34, 80 },
0806 { 1, 17, 29 },
0807 { 0, 0, 0 },
0808 { 0, 0, 0 },
0809 { 0, 0, 0 },
0810 },
0811 {
0812 { 37, 75, 128 },
0813 { 41, 76, 128 },
0814 { 26, 66, 116 },
0815 { 12, 52, 94 },
0816 { 2, 32, 55 },
0817 { 1, 10, 16 },
0818 },
0819 {
0820 { 50, 127, 154 },
0821 { 37, 109, 152 },
0822 { 16, 82, 121 },
0823 { 5, 59, 85 },
0824 { 1, 35, 54 },
0825 { 1, 13, 20 },
0826 },
0827 {
0828 { 40, 142, 167 },
0829 { 17, 110, 157 },
0830 { 2, 71, 112 },
0831 { 1, 44, 72 },
0832 { 1, 27, 45 },
0833 { 1, 11, 17 },
0834 },
0835 {
0836 { 30, 175, 188 },
0837 { 9, 124, 169 },
0838 { 1, 74, 116 },
0839 { 1, 48, 78 },
0840 { 1, 30, 49 },
0841 { 1, 11, 18 },
0842 },
0843 {
0844 { 10, 222, 223 },
0845 { 2, 150, 194 },
0846 { 1, 83, 128 },
0847 { 1, 48, 79 },
0848 { 1, 27, 45 },
0849 { 1, 11, 17 },
0850 },
0851 },
0852 {
0853 {
0854 { 36, 41, 235 },
0855 { 29, 36, 193 },
0856 { 10, 27, 111 },
0857 { 0, 0, 0 },
0858 { 0, 0, 0 },
0859 { 0, 0, 0 },
0860 },
0861 {
0862 { 85, 165, 222 },
0863 { 177, 162, 215 },
0864 { 110, 135, 195 },
0865 { 57, 113, 168 },
0866 { 23, 83, 120 },
0867 { 10, 49, 61 },
0868 },
0869 {
0870 { 85, 190, 223 },
0871 { 36, 139, 200 },
0872 { 5, 90, 146 },
0873 { 1, 60, 103 },
0874 { 1, 38, 65 },
0875 { 1, 18, 30 },
0876 },
0877 {
0878 { 72, 202, 223 },
0879 { 23, 141, 199 },
0880 { 2, 86, 140 },
0881 { 1, 56, 97 },
0882 { 1, 36, 61 },
0883 { 1, 16, 27 },
0884 },
0885 {
0886 { 55, 218, 225 },
0887 { 13, 145, 200 },
0888 { 1, 86, 141 },
0889 { 1, 57, 99 },
0890 { 1, 35, 61 },
0891 { 1, 13, 22 },
0892 },
0893 {
0894 { 15, 235, 212 },
0895 { 1, 132, 184 },
0896 { 1, 84, 139 },
0897 { 1, 57, 97 },
0898 { 1, 34, 56 },
0899 { 1, 14, 23 },
0900 },
0901 },
0902 },
0903 {
0904 {
0905 {
0906 { 181, 21, 201 },
0907 { 61, 37, 123 },
0908 { 10, 38, 71 },
0909 { 0, 0, 0 },
0910 { 0, 0, 0 },
0911 { 0, 0, 0 },
0912 },
0913 {
0914 { 47, 106, 172 },
0915 { 95, 104, 173 },
0916 { 42, 93, 159 },
0917 { 18, 77, 131 },
0918 { 4, 50, 81 },
0919 { 1, 17, 23 },
0920 },
0921 {
0922 { 62, 147, 199 },
0923 { 44, 130, 189 },
0924 { 28, 102, 154 },
0925 { 18, 75, 115 },
0926 { 2, 44, 65 },
0927 { 1, 12, 19 },
0928 },
0929 {
0930 { 55, 153, 210 },
0931 { 24, 130, 194 },
0932 { 3, 93, 146 },
0933 { 1, 61, 97 },
0934 { 1, 31, 50 },
0935 { 1, 10, 16 },
0936 },
0937 {
0938 { 49, 186, 223 },
0939 { 17, 148, 204 },
0940 { 1, 96, 142 },
0941 { 1, 53, 83 },
0942 { 1, 26, 44 },
0943 { 1, 11, 17 },
0944 },
0945 {
0946 { 13, 217, 212 },
0947 { 2, 136, 180 },
0948 { 1, 78, 124 },
0949 { 1, 50, 83 },
0950 { 1, 29, 49 },
0951 { 1, 14, 23 },
0952 },
0953 },
0954 {
0955 {
0956 { 197, 13, 247 },
0957 { 82, 17, 222 },
0958 { 25, 17, 162 },
0959 { 0, 0, 0 },
0960 { 0, 0, 0 },
0961 { 0, 0, 0 },
0962 },
0963 {
0964 { 126, 186, 247 },
0965 { 234, 191, 243 },
0966 { 176, 177, 234 },
0967 { 104, 158, 220 },
0968 { 66, 128, 186 },
0969 { 55, 90, 137 },
0970 },
0971 {
0972 { 111, 197, 242 },
0973 { 46, 158, 219 },
0974 { 9, 104, 171 },
0975 { 2, 65, 125 },
0976 { 1, 44, 80 },
0977 { 1, 17, 91 },
0978 },
0979 {
0980 { 104, 208, 245 },
0981 { 39, 168, 224 },
0982 { 3, 109, 162 },
0983 { 1, 79, 124 },
0984 { 1, 50, 102 },
0985 { 1, 43, 102 },
0986 },
0987 {
0988 { 84, 220, 246 },
0989 { 31, 177, 231 },
0990 { 2, 115, 180 },
0991 { 1, 79, 134 },
0992 { 1, 55, 77 },
0993 { 1, 60, 79 },
0994 },
0995 {
0996 { 43, 243, 240 },
0997 { 8, 180, 217 },
0998 { 1, 115, 166 },
0999 { 1, 84, 121 },
1000 { 1, 51, 67 },
1001 { 1, 16, 6 },
1002 },
1003 },
1004 },
1005 },
1006 },
1007
1008 .skip = { 192, 128, 64 },
1009 .inter_mode = {
1010 { 2, 173, 34 },
1011 { 7, 145, 85 },
1012 { 7, 166, 63 },
1013 { 7, 94, 66 },
1014 { 8, 64, 46 },
1015 { 17, 81, 31 },
1016 { 25, 29, 30 },
1017 },
1018 .interp_filter = {
1019 { 235, 162 },
1020 { 36, 255 },
1021 { 34, 3 },
1022 { 149, 144 },
1023 },
1024 .is_inter = { 9, 102, 187, 225 },
1025 .comp_mode = { 239, 183, 119, 96, 41 },
1026 .single_ref = {
1027 { 33, 16 },
1028 { 77, 74 },
1029 { 142, 142 },
1030 { 172, 170 },
1031 { 238, 247 },
1032 },
1033 .comp_ref = { 50, 126, 123, 221, 226 },
1034 .y_mode = {
1035 { 65, 32, 18, 144, 162, 194, 41, 51, 98 },
1036 { 132, 68, 18, 165, 217, 196, 45, 40, 78 },
1037 { 173, 80, 19, 176, 240, 193, 64, 35, 46 },
1038 { 221, 135, 38, 194, 248, 121, 96, 85, 29 },
1039 },
1040 .uv_mode = {
1041 { 120, 7, 76, 176, 208, 126, 28, 54, 103 } ,
1042 { 48, 12, 154, 155, 139, 90, 34, 117, 119 } ,
1043 { 67, 6, 25, 204, 243, 158, 13, 21, 96 } ,
1044 { 97, 5, 44, 131, 176, 139, 48, 68, 97 } ,
1045 { 83, 5, 42, 156, 111, 152, 26, 49, 152 } ,
1046 { 80, 5, 58, 178, 74, 83, 33, 62, 145 } ,
1047 { 86, 5, 32, 154, 192, 168, 14, 22, 163 } ,
1048 { 85, 5, 32, 156, 216, 148, 19, 29, 73 } ,
1049 { 77, 7, 64, 116, 132, 122, 37, 126, 120 } ,
1050 { 101, 21, 107, 181, 192, 103, 19, 67, 125 }
1051 },
1052 .partition = {
1053
1054 { 199, 122, 141 } ,
1055 { 147, 63, 159 } ,
1056 { 148, 133, 118 } ,
1057 { 121, 104, 114 } ,
1058
1059 { 174, 73, 87 } ,
1060 { 92, 41, 83 } ,
1061 { 82, 99, 50 } ,
1062 { 53, 39, 39 } ,
1063
1064 { 177, 58, 59 } ,
1065 { 68, 26, 63 } ,
1066 { 52, 79, 25 } ,
1067 { 17, 14, 12 } ,
1068
1069 { 222, 34, 30 } ,
1070 { 72, 16, 44 } ,
1071 { 58, 32, 12 } ,
1072 { 10, 7, 6 } ,
1073 },
1074
1075 .mv = {
1076 .joint = { 32, 64, 96 },
1077 .sign = { 128, 128 },
1078 .classes = {
1079 { 224, 144, 192, 168, 192, 176, 192, 198, 198, 245 },
1080 { 216, 128, 176, 160, 176, 176, 192, 198, 198, 208 },
1081 },
1082 .class0_bit = { 216, 208 },
1083 .bits = {
1084 { 136, 140, 148, 160, 176, 192, 224, 234, 234, 240},
1085 { 136, 140, 148, 160, 176, 192, 224, 234, 234, 240},
1086 },
1087 .class0_fr = {
1088 {
1089 { 128, 128, 64 },
1090 { 96, 112, 64 },
1091 },
1092 {
1093 { 128, 128, 64 },
1094 { 96, 112, 64 },
1095 },
1096 },
1097 .fr = {
1098 { 64, 96, 64 },
1099 { 64, 96, 64 },
1100 },
1101 .class0_hp = { 160, 160 },
1102 .hp = { 128, 128 },
1103 },
1104 };
1105 EXPORT_SYMBOL_GPL(v4l2_vp9_default_probs);
1106
1107 static u32 fastdiv(u32 dividend, u16 divisor)
1108 {
1109 #define DIV_INV(d) ((u32)(((1ULL << 32) + ((d) - 1)) / (d)))
1110 #define DIVS_INV(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) \
1111 DIV_INV(d0), DIV_INV(d1), DIV_INV(d2), DIV_INV(d3), \
1112 DIV_INV(d4), DIV_INV(d5), DIV_INV(d6), DIV_INV(d7), \
1113 DIV_INV(d8), DIV_INV(d9)
1114
1115 static const u32 inv[] = {
1116 DIV_INV(2), DIV_INV(3), DIV_INV(4), DIV_INV(5),
1117 DIV_INV(6), DIV_INV(7), DIV_INV(8), DIV_INV(9),
1118 DIVS_INV(10, 11, 12, 13, 14, 15, 16, 17, 18, 19),
1119 DIVS_INV(20, 21, 22, 23, 24, 25, 26, 27, 28, 29),
1120 DIVS_INV(30, 31, 32, 33, 34, 35, 36, 37, 38, 39),
1121 DIVS_INV(40, 41, 42, 43, 44, 45, 46, 47, 48, 49),
1122 DIVS_INV(50, 51, 52, 53, 54, 55, 56, 57, 58, 59),
1123 DIVS_INV(60, 61, 62, 63, 64, 65, 66, 67, 68, 69),
1124 DIVS_INV(70, 71, 72, 73, 74, 75, 76, 77, 78, 79),
1125 DIVS_INV(80, 81, 82, 83, 84, 85, 86, 87, 88, 89),
1126 DIVS_INV(90, 91, 92, 93, 94, 95, 96, 97, 98, 99),
1127 DIVS_INV(100, 101, 102, 103, 104, 105, 106, 107, 108, 109),
1128 DIVS_INV(110, 111, 112, 113, 114, 115, 116, 117, 118, 119),
1129 DIVS_INV(120, 121, 122, 123, 124, 125, 126, 127, 128, 129),
1130 DIVS_INV(130, 131, 132, 133, 134, 135, 136, 137, 138, 139),
1131 DIVS_INV(140, 141, 142, 143, 144, 145, 146, 147, 148, 149),
1132 DIVS_INV(150, 151, 152, 153, 154, 155, 156, 157, 158, 159),
1133 DIVS_INV(160, 161, 162, 163, 164, 165, 166, 167, 168, 169),
1134 DIVS_INV(170, 171, 172, 173, 174, 175, 176, 177, 178, 179),
1135 DIVS_INV(180, 181, 182, 183, 184, 185, 186, 187, 188, 189),
1136 DIVS_INV(190, 191, 192, 193, 194, 195, 196, 197, 198, 199),
1137 DIVS_INV(200, 201, 202, 203, 204, 205, 206, 207, 208, 209),
1138 DIVS_INV(210, 211, 212, 213, 214, 215, 216, 217, 218, 219),
1139 DIVS_INV(220, 221, 222, 223, 224, 225, 226, 227, 228, 229),
1140 DIVS_INV(230, 231, 232, 233, 234, 235, 236, 237, 238, 239),
1141 DIVS_INV(240, 241, 242, 243, 244, 245, 246, 247, 248, 249),
1142 DIV_INV(250), DIV_INV(251), DIV_INV(252), DIV_INV(253),
1143 DIV_INV(254), DIV_INV(255), DIV_INV(256),
1144 };
1145
1146 if (divisor == 0)
1147 return 0;
1148 else if (divisor == 1)
1149 return dividend;
1150
1151 if (WARN_ON(divisor - 2 >= ARRAY_SIZE(inv)))
1152 return dividend;
1153
1154 return ((u64)dividend * inv[divisor - 2]) >> 32;
1155 }
1156
1157
1158 static int inv_recenter_nonneg(int v, int m)
1159 {
1160 if (v > 2 * m)
1161 return v;
1162
1163 if (v & 1)
1164 return m - ((v + 1) >> 1);
1165
1166 return m + (v >> 1);
1167 }
1168
1169
1170
1171
1172
1173 static int update_prob(int delta, int prob)
1174 {
1175 if (!delta)
1176 return prob;
1177
1178 return prob <= 128 ?
1179 1 + inv_recenter_nonneg(delta, prob - 1) :
1180 255 - inv_recenter_nonneg(delta, 255 - prob);
1181 }
1182
1183
1184 static void update_tx_probs(struct v4l2_vp9_frame_context *probs,
1185 const struct v4l2_ctrl_vp9_compressed_hdr *deltas)
1186 {
1187 int i;
1188
1189 for (i = 0; i < ARRAY_SIZE(probs->tx8); i++) {
1190 u8 *p8x8 = probs->tx8[i];
1191 u8 *p16x16 = probs->tx16[i];
1192 u8 *p32x32 = probs->tx32[i];
1193 const u8 *d8x8 = deltas->tx8[i];
1194 const u8 *d16x16 = deltas->tx16[i];
1195 const u8 *d32x32 = deltas->tx32[i];
1196
1197 p8x8[0] = update_prob(d8x8[0], p8x8[0]);
1198 p16x16[0] = update_prob(d16x16[0], p16x16[0]);
1199 p16x16[1] = update_prob(d16x16[1], p16x16[1]);
1200 p32x32[0] = update_prob(d32x32[0], p32x32[0]);
1201 p32x32[1] = update_prob(d32x32[1], p32x32[1]);
1202 p32x32[2] = update_prob(d32x32[2], p32x32[2]);
1203 }
1204 }
1205
1206 #define BAND_6(band) ((band) == 0 ? 3 : 6)
1207
1208 static void update_coeff(const u8 deltas[6][6][3], u8 probs[6][6][3])
1209 {
1210 int l, m, n;
1211
1212 for (l = 0; l < 6; l++)
1213 for (m = 0; m < BAND_6(l); m++) {
1214 u8 *p = probs[l][m];
1215 const u8 *d = deltas[l][m];
1216
1217 for (n = 0; n < 3; n++)
1218 p[n] = update_prob(d[n], p[n]);
1219 }
1220 }
1221
1222
1223 static void update_coef_probs(struct v4l2_vp9_frame_context *probs,
1224 const struct v4l2_ctrl_vp9_compressed_hdr *deltas,
1225 const struct v4l2_ctrl_vp9_frame *dec_params)
1226 {
1227 int i, j, k;
1228
1229 for (i = 0; i < ARRAY_SIZE(probs->coef); i++) {
1230 for (j = 0; j < ARRAY_SIZE(probs->coef[0]); j++)
1231 for (k = 0; k < ARRAY_SIZE(probs->coef[0][0]); k++)
1232 update_coeff(deltas->coef[i][j][k], probs->coef[i][j][k]);
1233
1234 if (deltas->tx_mode == i)
1235 break;
1236 }
1237 }
1238
1239
1240 static void update_skip_probs(struct v4l2_vp9_frame_context *probs,
1241 const struct v4l2_ctrl_vp9_compressed_hdr *deltas)
1242 {
1243 int i;
1244
1245 for (i = 0; i < ARRAY_SIZE(probs->skip); i++)
1246 probs->skip[i] = update_prob(deltas->skip[i], probs->skip[i]);
1247 }
1248
1249
1250 static void update_inter_mode_probs(struct v4l2_vp9_frame_context *probs,
1251 const struct v4l2_ctrl_vp9_compressed_hdr *deltas)
1252 {
1253 int i;
1254
1255 for (i = 0; i < ARRAY_SIZE(probs->inter_mode); i++) {
1256 u8 *p = probs->inter_mode[i];
1257 const u8 *d = deltas->inter_mode[i];
1258
1259 p[0] = update_prob(d[0], p[0]);
1260 p[1] = update_prob(d[1], p[1]);
1261 p[2] = update_prob(d[2], p[2]);
1262 }
1263 }
1264
1265
1266 static void update_interp_filter_probs(struct v4l2_vp9_frame_context *probs,
1267 const struct v4l2_ctrl_vp9_compressed_hdr *deltas)
1268 {
1269 int i;
1270
1271 for (i = 0; i < ARRAY_SIZE(probs->interp_filter); i++) {
1272 u8 *p = probs->interp_filter[i];
1273 const u8 *d = deltas->interp_filter[i];
1274
1275 p[0] = update_prob(d[0], p[0]);
1276 p[1] = update_prob(d[1], p[1]);
1277 }
1278 }
1279
1280
1281 static void update_is_inter_probs(struct v4l2_vp9_frame_context *probs,
1282 const struct v4l2_ctrl_vp9_compressed_hdr *deltas)
1283 {
1284 int i;
1285
1286 for (i = 0; i < ARRAY_SIZE(probs->is_inter); i++)
1287 probs->is_inter[i] = update_prob(deltas->is_inter[i], probs->is_inter[i]);
1288 }
1289
1290
1291
1292
1293 static void
1294 update_frame_reference_mode_probs(unsigned int reference_mode,
1295 struct v4l2_vp9_frame_context *probs,
1296 const struct v4l2_ctrl_vp9_compressed_hdr *deltas)
1297 {
1298 int i;
1299
1300 if (reference_mode == V4L2_VP9_REFERENCE_MODE_SELECT)
1301 for (i = 0; i < ARRAY_SIZE(probs->comp_mode); i++)
1302 probs->comp_mode[i] = update_prob(deltas->comp_mode[i],
1303 probs->comp_mode[i]);
1304
1305 if (reference_mode != V4L2_VP9_REFERENCE_MODE_COMPOUND_REFERENCE)
1306 for (i = 0; i < ARRAY_SIZE(probs->single_ref); i++) {
1307 u8 *p = probs->single_ref[i];
1308 const u8 *d = deltas->single_ref[i];
1309
1310 p[0] = update_prob(d[0], p[0]);
1311 p[1] = update_prob(d[1], p[1]);
1312 }
1313
1314 if (reference_mode != V4L2_VP9_REFERENCE_MODE_SINGLE_REFERENCE)
1315 for (i = 0; i < ARRAY_SIZE(probs->comp_ref); i++)
1316 probs->comp_ref[i] = update_prob(deltas->comp_ref[i], probs->comp_ref[i]);
1317 }
1318
1319
1320 static void update_y_mode_probs(struct v4l2_vp9_frame_context *probs,
1321 const struct v4l2_ctrl_vp9_compressed_hdr *deltas)
1322 {
1323 int i, j;
1324
1325 for (i = 0; i < ARRAY_SIZE(probs->y_mode); i++)
1326 for (j = 0; j < ARRAY_SIZE(probs->y_mode[0]); ++j)
1327 probs->y_mode[i][j] =
1328 update_prob(deltas->y_mode[i][j], probs->y_mode[i][j]);
1329 }
1330
1331
1332 static void update_partition_probs(struct v4l2_vp9_frame_context *probs,
1333 const struct v4l2_ctrl_vp9_compressed_hdr *deltas)
1334 {
1335 int i, j;
1336
1337 for (i = 0; i < 4; i++)
1338 for (j = 0; j < 4; j++) {
1339 u8 *p = probs->partition[i * 4 + j];
1340 const u8 *d = deltas->partition[i * 4 + j];
1341
1342 p[0] = update_prob(d[0], p[0]);
1343 p[1] = update_prob(d[1], p[1]);
1344 p[2] = update_prob(d[2], p[2]);
1345 }
1346 }
1347
1348 static inline int update_mv_prob(int delta, int prob)
1349 {
1350 if (!delta)
1351 return prob;
1352
1353 return delta;
1354 }
1355
1356
1357 static void update_mv_probs(struct v4l2_vp9_frame_context *probs,
1358 const struct v4l2_ctrl_vp9_compressed_hdr *deltas,
1359 const struct v4l2_ctrl_vp9_frame *dec_params)
1360 {
1361 u8 *p = probs->mv.joint;
1362 const u8 *d = deltas->mv.joint;
1363 unsigned int i, j;
1364
1365 p[0] = update_mv_prob(d[0], p[0]);
1366 p[1] = update_mv_prob(d[1], p[1]);
1367 p[2] = update_mv_prob(d[2], p[2]);
1368
1369 for (i = 0; i < ARRAY_SIZE(probs->mv.sign); i++) {
1370 p = probs->mv.sign;
1371 d = deltas->mv.sign;
1372 p[i] = update_mv_prob(d[i], p[i]);
1373
1374 p = probs->mv.classes[i];
1375 d = deltas->mv.classes[i];
1376 for (j = 0; j < ARRAY_SIZE(probs->mv.classes[0]); j++)
1377 p[j] = update_mv_prob(d[j], p[j]);
1378
1379 p = probs->mv.class0_bit;
1380 d = deltas->mv.class0_bit;
1381 p[i] = update_mv_prob(d[i], p[i]);
1382
1383 p = probs->mv.bits[i];
1384 d = deltas->mv.bits[i];
1385 for (j = 0; j < ARRAY_SIZE(probs->mv.bits[0]); j++)
1386 p[j] = update_mv_prob(d[j], p[j]);
1387
1388 for (j = 0; j < ARRAY_SIZE(probs->mv.class0_fr[0]); j++) {
1389 p = probs->mv.class0_fr[i][j];
1390 d = deltas->mv.class0_fr[i][j];
1391
1392 p[0] = update_mv_prob(d[0], p[0]);
1393 p[1] = update_mv_prob(d[1], p[1]);
1394 p[2] = update_mv_prob(d[2], p[2]);
1395 }
1396
1397 p = probs->mv.fr[i];
1398 d = deltas->mv.fr[i];
1399 for (j = 0; j < ARRAY_SIZE(probs->mv.fr[i]); j++)
1400 p[j] = update_mv_prob(d[j], p[j]);
1401
1402 if (dec_params->flags & V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV) {
1403 p = probs->mv.class0_hp;
1404 d = deltas->mv.class0_hp;
1405 p[i] = update_mv_prob(d[i], p[i]);
1406
1407 p = probs->mv.hp;
1408 d = deltas->mv.hp;
1409 p[i] = update_mv_prob(d[i], p[i]);
1410 }
1411 }
1412 }
1413
1414
1415 void v4l2_vp9_fw_update_probs(struct v4l2_vp9_frame_context *probs,
1416 const struct v4l2_ctrl_vp9_compressed_hdr *deltas,
1417 const struct v4l2_ctrl_vp9_frame *dec_params)
1418 {
1419 if (deltas->tx_mode == V4L2_VP9_TX_MODE_SELECT)
1420 update_tx_probs(probs, deltas);
1421
1422 update_coef_probs(probs, deltas, dec_params);
1423
1424 update_skip_probs(probs, deltas);
1425
1426 if (dec_params->flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME ||
1427 dec_params->flags & V4L2_VP9_FRAME_FLAG_INTRA_ONLY)
1428 return;
1429
1430 update_inter_mode_probs(probs, deltas);
1431
1432 if (dec_params->interpolation_filter == V4L2_VP9_INTERP_FILTER_SWITCHABLE)
1433 update_interp_filter_probs(probs, deltas);
1434
1435 update_is_inter_probs(probs, deltas);
1436
1437 update_frame_reference_mode_probs(dec_params->reference_mode, probs, deltas);
1438
1439 update_y_mode_probs(probs, deltas);
1440
1441 update_partition_probs(probs, deltas);
1442
1443 update_mv_probs(probs, deltas, dec_params);
1444 }
1445 EXPORT_SYMBOL_GPL(v4l2_vp9_fw_update_probs);
1446
1447 u8 v4l2_vp9_reset_frame_ctx(const struct v4l2_ctrl_vp9_frame *dec_params,
1448 struct v4l2_vp9_frame_context *frame_context)
1449 {
1450 int i;
1451
1452 u8 fctx_idx = dec_params->frame_context_idx;
1453
1454 if (dec_params->flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME ||
1455 dec_params->flags & V4L2_VP9_FRAME_FLAG_INTRA_ONLY ||
1456 dec_params->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT) {
1457
1458
1459
1460
1461
1462
1463
1464 if (dec_params->flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME ||
1465 dec_params->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT ||
1466 dec_params->reset_frame_context == V4L2_VP9_RESET_FRAME_CTX_ALL)
1467 for (i = 0; i < 4; ++i)
1468
1469 memcpy(&frame_context[i], &v4l2_vp9_default_probs,
1470 sizeof(v4l2_vp9_default_probs));
1471 else if (dec_params->reset_frame_context == V4L2_VP9_RESET_FRAME_CTX_SPEC)
1472
1473 memcpy(&frame_context[fctx_idx], &v4l2_vp9_default_probs,
1474 sizeof(v4l2_vp9_default_probs));
1475 fctx_idx = 0;
1476 }
1477
1478 return fctx_idx;
1479 }
1480 EXPORT_SYMBOL_GPL(v4l2_vp9_reset_frame_ctx);
1481
1482
1483 static u8 merge_prob(u8 pre_prob, u32 ct0, u32 ct1, u16 count_sat, u32 max_update_factor)
1484 {
1485 u32 den, prob, count, factor;
1486
1487 den = ct0 + ct1;
1488 if (!den) {
1489
1490
1491
1492
1493
1494 return pre_prob;
1495 }
1496
1497 prob = clamp(((ct0 << 8) + (den >> 1)) / den, (u32)1, (u32)255);
1498 count = min_t(u32, den, count_sat);
1499 factor = fastdiv(max_update_factor * count, count_sat);
1500
1501
1502
1503
1504
1505
1506 return pre_prob + (((prob - pre_prob) * factor + 128) >> 8);
1507 }
1508
1509 static inline u8 noncoef_merge_prob(u8 pre_prob, u32 ct0, u32 ct1)
1510 {
1511 return merge_prob(pre_prob, ct0, ct1, 20, 128);
1512 }
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585 static inline void merge_probs_variant_a(u8 *p, const u32 *c, u16 count_sat, u32 update_factor)
1586 {
1587 p[1] = merge_prob(p[1], c[0], c[1] + c[2], count_sat, update_factor);
1588 p[2] = merge_prob(p[2], c[1], c[2], count_sat, update_factor);
1589 }
1590
1591 static inline void merge_probs_variant_b(u8 *p, const u32 *c, u16 count_sat, u32 update_factor)
1592 {
1593 p[0] = merge_prob(p[0], c[0], c[1], count_sat, update_factor);
1594 }
1595
1596 static inline void merge_probs_variant_c(u8 *p, const u32 *c)
1597 {
1598 p[0] = noncoef_merge_prob(p[0], c[2], c[1] + c[0] + c[3]);
1599 p[1] = noncoef_merge_prob(p[1], c[0], c[1] + c[3]);
1600 p[2] = noncoef_merge_prob(p[2], c[1], c[3]);
1601 }
1602
1603 static void merge_probs_variant_d(u8 *p, const u32 *c)
1604 {
1605 u32 sum = 0, s2;
1606
1607 sum = c[1] + c[2] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9];
1608
1609 p[0] = noncoef_merge_prob(p[0], c[0], sum);
1610 sum -= c[9];
1611 p[1] = noncoef_merge_prob(p[1], c[9], sum);
1612 sum -= c[1];
1613 p[2] = noncoef_merge_prob(p[2], c[1], sum);
1614 s2 = c[2] + c[4] + c[5];
1615 sum -= s2;
1616 p[3] = noncoef_merge_prob(p[3], s2, sum);
1617 s2 -= c[2];
1618 p[4] = noncoef_merge_prob(p[4], c[2], s2);
1619 p[5] = noncoef_merge_prob(p[5], c[4], c[5]);
1620 sum -= c[3];
1621 p[6] = noncoef_merge_prob(p[6], c[3], sum);
1622 sum -= c[8];
1623 p[7] = noncoef_merge_prob(p[7], c[8], sum);
1624 p[8] = noncoef_merge_prob(p[8], c[6], c[7]);
1625 }
1626
1627 static inline void merge_probs_variant_e(u8 *p, const u32 *c)
1628 {
1629 p[0] = noncoef_merge_prob(p[0], c[0], c[1] + c[2] + c[3]);
1630 p[1] = noncoef_merge_prob(p[1], c[1], c[2] + c[3]);
1631 p[2] = noncoef_merge_prob(p[2], c[2], c[3]);
1632 }
1633
1634 static inline void merge_probs_variant_f(u8 *p, const u32 *c)
1635 {
1636 p[0] = noncoef_merge_prob(p[0], c[0], c[1] + c[2]);
1637 p[1] = noncoef_merge_prob(p[1], c[1], c[2]);
1638 }
1639
1640 static void merge_probs_variant_g(u8 *p, const u32 *c)
1641 {
1642 u32 sum;
1643
1644 sum = c[1] + c[2] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9] + c[10];
1645 p[0] = noncoef_merge_prob(p[0], c[0], sum);
1646 sum -= c[1];
1647 p[1] = noncoef_merge_prob(p[1], c[1], sum);
1648 sum -= c[2] + c[3];
1649 p[2] = noncoef_merge_prob(p[2], c[2] + c[3], sum);
1650 p[3] = noncoef_merge_prob(p[3], c[2], c[3]);
1651 sum -= c[4] + c[5];
1652 p[4] = noncoef_merge_prob(p[4], c[4] + c[5], sum);
1653 p[5] = noncoef_merge_prob(p[5], c[4], c[5]);
1654 sum -= c[6];
1655 p[6] = noncoef_merge_prob(p[6], c[6], sum);
1656 p[7] = noncoef_merge_prob(p[7], c[7] + c[8], c[9] + c[10]);
1657 p[8] = noncoef_merge_prob(p[8], c[7], c[8]);
1658 p[9] = noncoef_merge_prob(p[9], c[9], c[10]);
1659 }
1660
1661
1662 static inline void adapt_probs_variant_a_coef(u8 *p, const u32 *c, u32 update_factor)
1663 {
1664 merge_probs_variant_a(p, c, 24, update_factor);
1665 }
1666
1667 static inline void adapt_probs_variant_b_coef(u8 *p, const u32 *c, u32 update_factor)
1668 {
1669 merge_probs_variant_b(p, c, 24, update_factor);
1670 }
1671
1672 static void _adapt_coeff(unsigned int i, unsigned int j, unsigned int k,
1673 struct v4l2_vp9_frame_context *probs,
1674 const struct v4l2_vp9_frame_symbol_counts *counts,
1675 u32 uf)
1676 {
1677 s32 l, m;
1678
1679 for (l = 0; l < ARRAY_SIZE(probs->coef[0][0][0]); l++) {
1680 for (m = 0; m < BAND_6(l); m++) {
1681 u8 *p = probs->coef[i][j][k][l][m];
1682 const u32 counts_more_coefs[2] = {
1683 *counts->eob[i][j][k][l][m][1],
1684 *counts->eob[i][j][k][l][m][0] - *counts->eob[i][j][k][l][m][1],
1685 };
1686
1687 adapt_probs_variant_a_coef(p, *counts->coeff[i][j][k][l][m], uf);
1688 adapt_probs_variant_b_coef(p, counts_more_coefs, uf);
1689 }
1690 }
1691 }
1692
1693 static void _adapt_coef_probs(struct v4l2_vp9_frame_context *probs,
1694 const struct v4l2_vp9_frame_symbol_counts *counts,
1695 unsigned int uf)
1696 {
1697 unsigned int i, j, k;
1698
1699 for (i = 0; i < ARRAY_SIZE(probs->coef); i++)
1700 for (j = 0; j < ARRAY_SIZE(probs->coef[0]); j++)
1701 for (k = 0; k < ARRAY_SIZE(probs->coef[0][0]); k++)
1702 _adapt_coeff(i, j, k, probs, counts, uf);
1703 }
1704
1705 void v4l2_vp9_adapt_coef_probs(struct v4l2_vp9_frame_context *probs,
1706 struct v4l2_vp9_frame_symbol_counts *counts,
1707 bool use_128,
1708 bool frame_is_intra)
1709 {
1710 if (frame_is_intra) {
1711 _adapt_coef_probs(probs, counts, 112);
1712 } else {
1713 if (use_128)
1714 _adapt_coef_probs(probs, counts, 128);
1715 else
1716 _adapt_coef_probs(probs, counts, 112);
1717 }
1718 }
1719 EXPORT_SYMBOL_GPL(v4l2_vp9_adapt_coef_probs);
1720
1721
1722 static inline void adapt_probs_variant_b(u8 *p, const u32 *c)
1723 {
1724 merge_probs_variant_b(p, c, 20, 128);
1725 }
1726
1727 static inline void adapt_probs_variant_c(u8 *p, const u32 *c)
1728 {
1729 merge_probs_variant_c(p, c);
1730 }
1731
1732 static inline void adapt_probs_variant_d(u8 *p, const u32 *c)
1733 {
1734 merge_probs_variant_d(p, c);
1735 }
1736
1737 static inline void adapt_probs_variant_e(u8 *p, const u32 *c)
1738 {
1739 merge_probs_variant_e(p, c);
1740 }
1741
1742 static inline void adapt_probs_variant_f(u8 *p, const u32 *c)
1743 {
1744 merge_probs_variant_f(p, c);
1745 }
1746
1747 static inline void adapt_probs_variant_g(u8 *p, const u32 *c)
1748 {
1749 merge_probs_variant_g(p, c);
1750 }
1751
1752
1753 static inline u8 adapt_prob(u8 prob, const u32 counts[2])
1754 {
1755 return noncoef_merge_prob(prob, counts[0], counts[1]);
1756 }
1757
1758
1759 void v4l2_vp9_adapt_noncoef_probs(struct v4l2_vp9_frame_context *probs,
1760 struct v4l2_vp9_frame_symbol_counts *counts,
1761 u8 reference_mode, u8 interpolation_filter, u8 tx_mode,
1762 u32 flags)
1763 {
1764 unsigned int i, j;
1765
1766 for (i = 0; i < ARRAY_SIZE(probs->is_inter); i++)
1767 probs->is_inter[i] = adapt_prob(probs->is_inter[i], (*counts->intra_inter)[i]);
1768
1769 for (i = 0; i < ARRAY_SIZE(probs->comp_mode); i++)
1770 probs->comp_mode[i] = adapt_prob(probs->comp_mode[i], (*counts->comp)[i]);
1771
1772 for (i = 0; i < ARRAY_SIZE(probs->comp_ref); i++)
1773 probs->comp_ref[i] = adapt_prob(probs->comp_ref[i], (*counts->comp_ref)[i]);
1774
1775 if (reference_mode != V4L2_VP9_REFERENCE_MODE_COMPOUND_REFERENCE)
1776 for (i = 0; i < ARRAY_SIZE(probs->single_ref); i++)
1777 for (j = 0; j < ARRAY_SIZE(probs->single_ref[0]); j++)
1778 probs->single_ref[i][j] = adapt_prob(probs->single_ref[i][j],
1779 (*counts->single_ref)[i][j]);
1780
1781 for (i = 0; i < ARRAY_SIZE(probs->inter_mode); i++)
1782 adapt_probs_variant_c(probs->inter_mode[i], (*counts->mv_mode)[i]);
1783
1784 for (i = 0; i < ARRAY_SIZE(probs->y_mode); i++)
1785 adapt_probs_variant_d(probs->y_mode[i], (*counts->y_mode)[i]);
1786
1787 for (i = 0; i < ARRAY_SIZE(probs->uv_mode); i++)
1788 adapt_probs_variant_d(probs->uv_mode[i], (*counts->uv_mode)[i]);
1789
1790 for (i = 0; i < ARRAY_SIZE(probs->partition); i++)
1791 adapt_probs_variant_e(probs->partition[i], (*counts->partition)[i]);
1792
1793 for (i = 0; i < ARRAY_SIZE(probs->skip); i++)
1794 probs->skip[i] = adapt_prob(probs->skip[i], (*counts->skip)[i]);
1795
1796 if (interpolation_filter == V4L2_VP9_INTERP_FILTER_SWITCHABLE)
1797 for (i = 0; i < ARRAY_SIZE(probs->interp_filter); i++)
1798 adapt_probs_variant_f(probs->interp_filter[i], (*counts->filter)[i]);
1799
1800 if (tx_mode == V4L2_VP9_TX_MODE_SELECT)
1801 for (i = 0; i < ARRAY_SIZE(probs->tx8); i++) {
1802 adapt_probs_variant_b(probs->tx8[i], (*counts->tx8p)[i]);
1803 adapt_probs_variant_f(probs->tx16[i], (*counts->tx16p)[i]);
1804 adapt_probs_variant_e(probs->tx32[i], (*counts->tx32p)[i]);
1805 }
1806
1807 adapt_probs_variant_e(probs->mv.joint, *counts->mv_joint);
1808
1809 for (i = 0; i < ARRAY_SIZE(probs->mv.sign); i++) {
1810 probs->mv.sign[i] = adapt_prob(probs->mv.sign[i], (*counts->sign)[i]);
1811
1812 adapt_probs_variant_g(probs->mv.classes[i], (*counts->classes)[i]);
1813
1814 probs->mv.class0_bit[i] = adapt_prob(probs->mv.class0_bit[i], (*counts->class0)[i]);
1815
1816 for (j = 0; j < ARRAY_SIZE(probs->mv.bits[0]); j++)
1817 probs->mv.bits[i][j] = adapt_prob(probs->mv.bits[i][j],
1818 (*counts->bits)[i][j]);
1819
1820 for (j = 0; j < ARRAY_SIZE(probs->mv.class0_fr[0]); j++)
1821 adapt_probs_variant_e(probs->mv.class0_fr[i][j],
1822 (*counts->class0_fp)[i][j]);
1823
1824 adapt_probs_variant_e(probs->mv.fr[i], (*counts->fp)[i]);
1825
1826 if (!(flags & V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV))
1827 continue;
1828
1829 probs->mv.class0_hp[i] = adapt_prob(probs->mv.class0_hp[i],
1830 (*counts->class0_hp)[i]);
1831
1832 probs->mv.hp[i] = adapt_prob(probs->mv.hp[i], (*counts->hp)[i]);
1833 }
1834 }
1835 EXPORT_SYMBOL_GPL(v4l2_vp9_adapt_noncoef_probs);
1836
1837 bool
1838 v4l2_vp9_seg_feat_enabled(const u8 *feature_enabled,
1839 unsigned int feature,
1840 unsigned int segid)
1841 {
1842 u8 mask = V4L2_VP9_SEGMENT_FEATURE_ENABLED(feature);
1843
1844 return !!(feature_enabled[segid] & mask);
1845 }
1846 EXPORT_SYMBOL_GPL(v4l2_vp9_seg_feat_enabled);
1847
1848 MODULE_LICENSE("GPL");
1849 MODULE_DESCRIPTION("V4L2 VP9 Helpers");
1850 MODULE_AUTHOR("Andrzej Pietrasiewicz <andrzej.p@collabora.com>");