2010-05-18 17:58:33 +02:00
|
|
|
/*
|
2010-09-09 14:16:39 +02:00
|
|
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
2010-05-18 17:58:33 +02:00
|
|
|
*
|
2010-06-18 18:39:21 +02:00
|
|
|
* Use of this source code is governed by a BSD-style license
|
2010-06-04 22:19:40 +02:00
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
2010-06-18 18:39:21 +02:00
|
|
|
* in the file PATENTS. All contributing project authors may
|
2010-06-04 22:19:40 +02:00
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
2010-05-18 17:58:33 +02:00
|
|
|
*/
|
|
|
|
|
2014-03-05 20:57:57 +01:00
|
|
|
#include <assert.h>
|
2010-05-18 17:58:33 +02:00
|
|
|
#include <math.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2014-03-05 20:57:57 +01:00
|
|
|
|
2010-05-18 17:58:33 +02:00
|
|
|
#include "vpx_mem/vpx_mem.h"
|
|
|
|
|
2014-03-05 20:57:57 +01:00
|
|
|
#include "vp9/common/vp9_entropy.h"
|
2012-11-27 22:59:17 +01:00
|
|
|
#include "vp9/common/vp9_pred_common.h"
|
2015-05-22 20:19:51 +02:00
|
|
|
#include "vp9/common/vp9_scan.h"
|
2012-11-27 22:59:17 +01:00
|
|
|
#include "vp9/common/vp9_seg_common.h"
|
2014-03-05 20:57:57 +01:00
|
|
|
|
|
|
|
#include "vp9/encoder/vp9_cost.h"
|
2014-04-19 03:27:47 +02:00
|
|
|
#include "vp9/encoder/vp9_encoder.h"
|
2014-03-05 20:57:57 +01:00
|
|
|
#include "vp9/encoder/vp9_tokenize.h"
|
2011-10-05 12:26:00 +02:00
|
|
|
|
2014-12-22 17:42:52 +01:00
|
|
|
static const TOKENVALUE dct_cat_lt_10_value_tokens[] = {
|
|
|
|
{9, 63}, {9, 61}, {9, 59}, {9, 57}, {9, 55}, {9, 53}, {9, 51}, {9, 49},
|
|
|
|
{9, 47}, {9, 45}, {9, 43}, {9, 41}, {9, 39}, {9, 37}, {9, 35}, {9, 33},
|
|
|
|
{9, 31}, {9, 29}, {9, 27}, {9, 25}, {9, 23}, {9, 21}, {9, 19}, {9, 17},
|
|
|
|
{9, 15}, {9, 13}, {9, 11}, {9, 9}, {9, 7}, {9, 5}, {9, 3}, {9, 1},
|
|
|
|
{8, 31}, {8, 29}, {8, 27}, {8, 25}, {8, 23}, {8, 21},
|
|
|
|
{8, 19}, {8, 17}, {8, 15}, {8, 13}, {8, 11}, {8, 9},
|
|
|
|
{8, 7}, {8, 5}, {8, 3}, {8, 1},
|
|
|
|
{7, 15}, {7, 13}, {7, 11}, {7, 9}, {7, 7}, {7, 5}, {7, 3}, {7, 1},
|
|
|
|
{6, 7}, {6, 5}, {6, 3}, {6, 1}, {5, 3}, {5, 1},
|
|
|
|
{4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 0},
|
|
|
|
{1, 0}, {2, 0}, {3, 0}, {4, 0},
|
|
|
|
{5, 0}, {5, 2}, {6, 0}, {6, 2}, {6, 4}, {6, 6},
|
|
|
|
{7, 0}, {7, 2}, {7, 4}, {7, 6}, {7, 8}, {7, 10}, {7, 12}, {7, 14},
|
|
|
|
{8, 0}, {8, 2}, {8, 4}, {8, 6}, {8, 8}, {8, 10}, {8, 12},
|
|
|
|
{8, 14}, {8, 16}, {8, 18}, {8, 20}, {8, 22}, {8, 24},
|
|
|
|
{8, 26}, {8, 28}, {8, 30}, {9, 0}, {9, 2},
|
|
|
|
{9, 4}, {9, 6}, {9, 8}, {9, 10}, {9, 12}, {9, 14}, {9, 16},
|
|
|
|
{9, 18}, {9, 20}, {9, 22}, {9, 24}, {9, 26}, {9, 28},
|
|
|
|
{9, 30}, {9, 32}, {9, 34}, {9, 36}, {9, 38}, {9, 40},
|
|
|
|
{9, 42}, {9, 44}, {9, 46}, {9, 48}, {9, 50}, {9, 52},
|
|
|
|
{9, 54}, {9, 56}, {9, 58}, {9, 60}, {9, 62}
|
|
|
|
};
|
|
|
|
const TOKENVALUE *vp9_dct_cat_lt_10_value_tokens = dct_cat_lt_10_value_tokens +
|
|
|
|
(sizeof(dct_cat_lt_10_value_tokens) / sizeof(*dct_cat_lt_10_value_tokens))
|
|
|
|
/ 2;
|
2016-02-26 23:42:25 +01:00
|
|
|
// The corresponding costs of the extrabits for the tokens in the above table
|
|
|
|
// are stored in the table below. The values are obtained from looking up the
|
|
|
|
// entry for the specified extrabits in the table corresponding to the token
|
|
|
|
// (as defined in cost element vp9_extra_bits)
|
|
|
|
// e.g. {9, 63} maps to cat5_cost[63 >> 1], {1, 1} maps to sign_cost[1 >> 1]
|
|
|
|
static const int dct_cat_lt_10_value_cost[] = {
|
|
|
|
3773, 3750, 3704, 3681, 3623, 3600, 3554, 3531,
|
|
|
|
3432, 3409, 3363, 3340, 3282, 3259, 3213, 3190,
|
|
|
|
3136, 3113, 3067, 3044, 2986, 2963, 2917, 2894,
|
|
|
|
2795, 2772, 2726, 2703, 2645, 2622, 2576, 2553,
|
|
|
|
3197, 3116, 3058, 2977, 2881, 2800,
|
|
|
|
2742, 2661, 2615, 2534, 2476, 2395,
|
|
|
|
2299, 2218, 2160, 2079,
|
|
|
|
2566, 2427, 2334, 2195, 2023, 1884, 1791, 1652,
|
|
|
|
1893, 1696, 1453, 1256, 1229, 864,
|
|
|
|
512, 512, 512, 512, 0,
|
|
|
|
512, 512, 512, 512,
|
|
|
|
864, 1229, 1256, 1453, 1696, 1893,
|
|
|
|
1652, 1791, 1884, 2023, 2195, 2334, 2427, 2566,
|
|
|
|
2079, 2160, 2218, 2299, 2395, 2476, 2534, 2615,
|
|
|
|
2661, 2742, 2800, 2881, 2977, 3058, 3116, 3197,
|
|
|
|
2553, 2576, 2622, 2645, 2703, 2726, 2772, 2795,
|
|
|
|
2894, 2917, 2963, 2986, 3044, 3067, 3113, 3136,
|
|
|
|
3190, 3213, 3259, 3282, 3340, 3363, 3409, 3432,
|
|
|
|
3531, 3554, 3600, 3623, 3681, 3704, 3750, 3773,
|
|
|
|
};
|
|
|
|
const int *vp9_dct_cat_lt_10_value_cost = dct_cat_lt_10_value_cost +
|
|
|
|
(sizeof(dct_cat_lt_10_value_cost) / sizeof(*dct_cat_lt_10_value_cost))
|
|
|
|
/ 2;
|
2014-12-22 17:42:52 +01:00
|
|
|
|
2013-11-27 20:27:57 +01:00
|
|
|
// Array indices are identical to previously-existing CONTEXT_NODE indices
|
2015-07-20 23:04:21 +02:00
|
|
|
const vpx_tree_index vp9_coef_tree[TREE_SIZE(ENTROPY_TOKENS)] = {
|
2013-12-04 02:23:03 +01:00
|
|
|
-EOB_TOKEN, 2, // 0 = EOB
|
|
|
|
-ZERO_TOKEN, 4, // 1 = ZERO
|
|
|
|
-ONE_TOKEN, 6, // 2 = ONE
|
|
|
|
8, 12, // 3 = LOW_VAL
|
|
|
|
-TWO_TOKEN, 10, // 4 = TWO
|
|
|
|
-THREE_TOKEN, -FOUR_TOKEN, // 5 = THREE
|
|
|
|
14, 16, // 6 = HIGH_LOW
|
|
|
|
-CATEGORY1_TOKEN, -CATEGORY2_TOKEN, // 7 = CAT_ONE
|
|
|
|
18, 20, // 8 = CAT_THREEFOUR
|
|
|
|
-CATEGORY3_TOKEN, -CATEGORY4_TOKEN, // 9 = CAT_THREE
|
|
|
|
-CATEGORY5_TOKEN, -CATEGORY6_TOKEN // 10 = CAT_FIVE
|
2013-11-27 20:27:57 +01:00
|
|
|
};
|
|
|
|
|
2014-12-24 00:06:17 +01:00
|
|
|
static const int16_t zero_cost[] = {0};
|
2016-01-13 23:21:30 +01:00
|
|
|
static const int16_t sign_cost[1] = {512};
|
|
|
|
static const int16_t cat1_cost[1 << 1] = {864, 1229};
|
|
|
|
static const int16_t cat2_cost[1 << 2] = {1256, 1453, 1696, 1893};
|
|
|
|
static const int16_t cat3_cost[1 << 3] = {1652, 1791, 1884, 2023,
|
|
|
|
2195, 2334, 2427, 2566};
|
|
|
|
static const int16_t cat4_cost[1 << 4] = {2079, 2160, 2218, 2299, 2395, 2476,
|
|
|
|
2534, 2615, 2661, 2742, 2800, 2881,
|
|
|
|
2977, 3058, 3116, 3197};
|
|
|
|
static const int16_t cat5_cost[1 << 5] = {
|
|
|
|
2553, 2576, 2622, 2645, 2703, 2726, 2772, 2795, 2894, 2917, 2963,
|
|
|
|
2986, 3044, 3067, 3113, 3136, 3190, 3213, 3259, 3282, 3340, 3363,
|
|
|
|
3409, 3432, 3531, 3554, 3600, 3623, 3681, 3704, 3750, 3773};
|
2014-12-24 00:06:17 +01:00
|
|
|
const int16_t vp9_cat6_low_cost[256] = {
|
2016-01-13 23:21:30 +01:00
|
|
|
3378, 3390, 3401, 3413, 3435, 3447, 3458, 3470, 3517, 3529, 3540, 3552,
|
|
|
|
3574, 3586, 3597, 3609, 3671, 3683, 3694, 3706, 3728, 3740, 3751, 3763,
|
|
|
|
3810, 3822, 3833, 3845, 3867, 3879, 3890, 3902, 3973, 3985, 3996, 4008,
|
|
|
|
4030, 4042, 4053, 4065, 4112, 4124, 4135, 4147, 4169, 4181, 4192, 4204,
|
|
|
|
4266, 4278, 4289, 4301, 4323, 4335, 4346, 4358, 4405, 4417, 4428, 4440,
|
|
|
|
4462, 4474, 4485, 4497, 4253, 4265, 4276, 4288, 4310, 4322, 4333, 4345,
|
|
|
|
4392, 4404, 4415, 4427, 4449, 4461, 4472, 4484, 4546, 4558, 4569, 4581,
|
|
|
|
4603, 4615, 4626, 4638, 4685, 4697, 4708, 4720, 4742, 4754, 4765, 4777,
|
|
|
|
4848, 4860, 4871, 4883, 4905, 4917, 4928, 4940, 4987, 4999, 5010, 5022,
|
|
|
|
5044, 5056, 5067, 5079, 5141, 5153, 5164, 5176, 5198, 5210, 5221, 5233,
|
|
|
|
5280, 5292, 5303, 5315, 5337, 5349, 5360, 5372, 4988, 5000, 5011, 5023,
|
|
|
|
5045, 5057, 5068, 5080, 5127, 5139, 5150, 5162, 5184, 5196, 5207, 5219,
|
|
|
|
5281, 5293, 5304, 5316, 5338, 5350, 5361, 5373, 5420, 5432, 5443, 5455,
|
|
|
|
5477, 5489, 5500, 5512, 5583, 5595, 5606, 5618, 5640, 5652, 5663, 5675,
|
|
|
|
5722, 5734, 5745, 5757, 5779, 5791, 5802, 5814, 5876, 5888, 5899, 5911,
|
|
|
|
5933, 5945, 5956, 5968, 6015, 6027, 6038, 6050, 6072, 6084, 6095, 6107,
|
|
|
|
5863, 5875, 5886, 5898, 5920, 5932, 5943, 5955, 6002, 6014, 6025, 6037,
|
|
|
|
6059, 6071, 6082, 6094, 6156, 6168, 6179, 6191, 6213, 6225, 6236, 6248,
|
|
|
|
6295, 6307, 6318, 6330, 6352, 6364, 6375, 6387, 6458, 6470, 6481, 6493,
|
|
|
|
6515, 6527, 6538, 6550, 6597, 6609, 6620, 6632, 6654, 6666, 6677, 6689,
|
|
|
|
6751, 6763, 6774, 6786, 6808, 6820, 6831, 6843, 6890, 6902, 6913, 6925,
|
|
|
|
6947, 6959, 6970, 6982};
|
|
|
|
const int vp9_cat6_high_cost[64] = {
|
|
|
|
88, 2251, 2727, 4890, 3148, 5311, 5787, 7950, 3666, 5829, 6305,
|
|
|
|
8468, 6726, 8889, 9365, 11528, 3666, 5829, 6305, 8468, 6726, 8889,
|
|
|
|
9365, 11528, 7244, 9407, 9883, 12046, 10304, 12467, 12943, 15106, 3666,
|
|
|
|
5829, 6305, 8468, 6726, 8889, 9365, 11528, 7244, 9407, 9883, 12046,
|
|
|
|
10304, 12467, 12943, 15106, 7244, 9407, 9883, 12046, 10304, 12467, 12943,
|
|
|
|
15106, 10822, 12985, 13461, 15624, 13882, 16045, 16521, 18684};
|
2014-12-24 00:06:17 +01:00
|
|
|
|
|
|
|
#if CONFIG_VP9_HIGHBITDEPTH
|
2016-01-13 23:21:30 +01:00
|
|
|
const int vp9_cat6_high10_high_cost[256] = {
|
|
|
|
94, 2257, 2733, 4896, 3154, 5317, 5793, 7956, 3672, 5835, 6311,
|
|
|
|
8474, 6732, 8895, 9371, 11534, 3672, 5835, 6311, 8474, 6732, 8895,
|
|
|
|
9371, 11534, 7250, 9413, 9889, 12052, 10310, 12473, 12949, 15112, 3672,
|
|
|
|
5835, 6311, 8474, 6732, 8895, 9371, 11534, 7250, 9413, 9889, 12052,
|
|
|
|
10310, 12473, 12949, 15112, 7250, 9413, 9889, 12052, 10310, 12473, 12949,
|
|
|
|
15112, 10828, 12991, 13467, 15630, 13888, 16051, 16527, 18690, 4187, 6350,
|
|
|
|
6826, 8989, 7247, 9410, 9886, 12049, 7765, 9928, 10404, 12567, 10825,
|
|
|
|
12988, 13464, 15627, 7765, 9928, 10404, 12567, 10825, 12988, 13464, 15627,
|
|
|
|
11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 7765, 9928, 10404,
|
|
|
|
12567, 10825, 12988, 13464, 15627, 11343, 13506, 13982, 16145, 14403, 16566,
|
|
|
|
17042, 19205, 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 14921,
|
|
|
|
17084, 17560, 19723, 17981, 20144, 20620, 22783, 4187, 6350, 6826, 8989,
|
|
|
|
7247, 9410, 9886, 12049, 7765, 9928, 10404, 12567, 10825, 12988, 13464,
|
|
|
|
15627, 7765, 9928, 10404, 12567, 10825, 12988, 13464, 15627, 11343, 13506,
|
|
|
|
13982, 16145, 14403, 16566, 17042, 19205, 7765, 9928, 10404, 12567, 10825,
|
|
|
|
12988, 13464, 15627, 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205,
|
|
|
|
11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 14921, 17084, 17560,
|
|
|
|
19723, 17981, 20144, 20620, 22783, 8280, 10443, 10919, 13082, 11340, 13503,
|
|
|
|
13979, 16142, 11858, 14021, 14497, 16660, 14918, 17081, 17557, 19720, 11858,
|
|
|
|
14021, 14497, 16660, 14918, 17081, 17557, 19720, 15436, 17599, 18075, 20238,
|
|
|
|
18496, 20659, 21135, 23298, 11858, 14021, 14497, 16660, 14918, 17081, 17557,
|
|
|
|
19720, 15436, 17599, 18075, 20238, 18496, 20659, 21135, 23298, 15436, 17599,
|
|
|
|
18075, 20238, 18496, 20659, 21135, 23298, 19014, 21177, 21653, 23816, 22074,
|
|
|
|
24237, 24713, 26876};
|
|
|
|
const int vp9_cat6_high12_high_cost[1024] = {
|
|
|
|
100, 2263, 2739, 4902, 3160, 5323, 5799, 7962, 3678, 5841, 6317,
|
|
|
|
8480, 6738, 8901, 9377, 11540, 3678, 5841, 6317, 8480, 6738, 8901,
|
|
|
|
9377, 11540, 7256, 9419, 9895, 12058, 10316, 12479, 12955, 15118, 3678,
|
|
|
|
5841, 6317, 8480, 6738, 8901, 9377, 11540, 7256, 9419, 9895, 12058,
|
|
|
|
10316, 12479, 12955, 15118, 7256, 9419, 9895, 12058, 10316, 12479, 12955,
|
|
|
|
15118, 10834, 12997, 13473, 15636, 13894, 16057, 16533, 18696, 4193, 6356,
|
|
|
|
6832, 8995, 7253, 9416, 9892, 12055, 7771, 9934, 10410, 12573, 10831,
|
|
|
|
12994, 13470, 15633, 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633,
|
|
|
|
11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 7771, 9934, 10410,
|
|
|
|
12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572,
|
|
|
|
17048, 19211, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927,
|
|
|
|
17090, 17566, 19729, 17987, 20150, 20626, 22789, 4193, 6356, 6832, 8995,
|
|
|
|
7253, 9416, 9892, 12055, 7771, 9934, 10410, 12573, 10831, 12994, 13470,
|
|
|
|
15633, 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, 11349, 13512,
|
|
|
|
13988, 16151, 14409, 16572, 17048, 19211, 7771, 9934, 10410, 12573, 10831,
|
|
|
|
12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211,
|
|
|
|
11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927, 17090, 17566,
|
|
|
|
19729, 17987, 20150, 20626, 22789, 8286, 10449, 10925, 13088, 11346, 13509,
|
|
|
|
13985, 16148, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864,
|
|
|
|
14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244,
|
|
|
|
18502, 20665, 21141, 23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563,
|
|
|
|
19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605,
|
|
|
|
18081, 20244, 18502, 20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080,
|
|
|
|
24243, 24719, 26882, 4193, 6356, 6832, 8995, 7253, 9416, 9892, 12055,
|
|
|
|
7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, 7771, 9934, 10410,
|
|
|
|
12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572,
|
|
|
|
17048, 19211, 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, 11349,
|
|
|
|
13512, 13988, 16151, 14409, 16572, 17048, 19211, 11349, 13512, 13988, 16151,
|
|
|
|
14409, 16572, 17048, 19211, 14927, 17090, 17566, 19729, 17987, 20150, 20626,
|
|
|
|
22789, 8286, 10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027,
|
|
|
|
14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924,
|
|
|
|
17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304,
|
|
|
|
11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081,
|
|
|
|
20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665,
|
|
|
|
21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882, 8286,
|
|
|
|
10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027, 14503, 16666,
|
|
|
|
14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924, 17087, 17563,
|
|
|
|
19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 11864, 14027,
|
|
|
|
14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502,
|
|
|
|
20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304,
|
|
|
|
19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882, 12379, 14542, 15018,
|
|
|
|
17181, 15439, 17602, 18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180,
|
|
|
|
21656, 23819, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535,
|
|
|
|
21698, 22174, 24337, 22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759,
|
|
|
|
19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234,
|
|
|
|
27397, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276,
|
|
|
|
25752, 27915, 26173, 28336, 28812, 30975, 4193, 6356, 6832, 8995, 7253,
|
|
|
|
9416, 9892, 12055, 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633,
|
|
|
|
7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988,
|
|
|
|
16151, 14409, 16572, 17048, 19211, 7771, 9934, 10410, 12573, 10831, 12994,
|
|
|
|
13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 11349,
|
|
|
|
13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927, 17090, 17566, 19729,
|
|
|
|
17987, 20150, 20626, 22789, 8286, 10449, 10925, 13088, 11346, 13509, 13985,
|
|
|
|
16148, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027,
|
|
|
|
14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502,
|
|
|
|
20665, 21141, 23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726,
|
|
|
|
15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081,
|
|
|
|
20244, 18502, 20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243,
|
|
|
|
24719, 26882, 8286, 10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864,
|
|
|
|
14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666,
|
|
|
|
14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141,
|
|
|
|
23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605,
|
|
|
|
18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502,
|
|
|
|
20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882,
|
|
|
|
12379, 14542, 15018, 17181, 15439, 17602, 18078, 20241, 15957, 18120, 18596,
|
|
|
|
20759, 19017, 21180, 21656, 23819, 15957, 18120, 18596, 20759, 19017, 21180,
|
|
|
|
21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 15957,
|
|
|
|
18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337,
|
|
|
|
22595, 24758, 25234, 27397, 19535, 21698, 22174, 24337, 22595, 24758, 25234,
|
|
|
|
27397, 23113, 25276, 25752, 27915, 26173, 28336, 28812, 30975, 8286, 10449,
|
|
|
|
10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027, 14503, 16666, 14924,
|
|
|
|
17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726,
|
|
|
|
15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 11864, 14027, 14503,
|
|
|
|
16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665,
|
|
|
|
21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 19020,
|
|
|
|
21183, 21659, 23822, 22080, 24243, 24719, 26882, 12379, 14542, 15018, 17181,
|
|
|
|
15439, 17602, 18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180, 21656,
|
|
|
|
23819, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698,
|
|
|
|
22174, 24337, 22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759, 19017,
|
|
|
|
21180, 21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397,
|
|
|
|
19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276, 25752,
|
|
|
|
27915, 26173, 28336, 28812, 30975, 12379, 14542, 15018, 17181, 15439, 17602,
|
|
|
|
18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 15957,
|
|
|
|
18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337,
|
|
|
|
22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759, 19017, 21180, 21656,
|
|
|
|
23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 19535, 21698,
|
|
|
|
22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276, 25752, 27915, 26173,
|
|
|
|
28336, 28812, 30975, 16472, 18635, 19111, 21274, 19532, 21695, 22171, 24334,
|
|
|
|
20050, 22213, 22689, 24852, 23110, 25273, 25749, 27912, 20050, 22213, 22689,
|
|
|
|
24852, 23110, 25273, 25749, 27912, 23628, 25791, 26267, 28430, 26688, 28851,
|
|
|
|
29327, 31490, 20050, 22213, 22689, 24852, 23110, 25273, 25749, 27912, 23628,
|
|
|
|
25791, 26267, 28430, 26688, 28851, 29327, 31490, 23628, 25791, 26267, 28430,
|
|
|
|
26688, 28851, 29327, 31490, 27206, 29369, 29845, 32008, 30266, 32429, 32905,
|
|
|
|
35068};
|
2014-12-24 00:06:17 +01:00
|
|
|
#endif
|
|
|
|
|
2013-12-04 02:23:03 +01:00
|
|
|
const vp9_extra_bit vp9_extra_bits[ENTROPY_TOKENS] = {
|
2015-10-06 23:03:34 +02:00
|
|
|
{0, 0, 0, zero_cost}, // ZERO_TOKEN
|
2016-01-15 22:55:29 +01:00
|
|
|
{0, 0, 1, sign_cost}, // ONE_TOKEN
|
|
|
|
{0, 0, 2, sign_cost}, // TWO_TOKEN
|
|
|
|
{0, 0, 3, sign_cost}, // THREE_TOKEN
|
|
|
|
{0, 0, 4, sign_cost}, // FOUR_TOKEN
|
2015-10-06 23:03:34 +02:00
|
|
|
{vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost}, // CATEGORY1_TOKEN
|
|
|
|
{vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost}, // CATEGORY2_TOKEN
|
|
|
|
{vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost}, // CATEGORY3_TOKEN
|
|
|
|
{vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost}, // CATEGORY4_TOKEN
|
|
|
|
{vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost}, // CATEGORY5_TOKEN
|
|
|
|
{vp9_cat6_prob, 14, CAT6_MIN_VAL, 0}, // CATEGORY6_TOKEN
|
|
|
|
{0, 0, 0, zero_cost} // EOB_TOKEN
|
2013-11-27 20:27:57 +01:00
|
|
|
};
|
|
|
|
|
2014-09-19 19:13:47 +02:00
|
|
|
#if CONFIG_VP9_HIGHBITDEPTH
|
|
|
|
const vp9_extra_bit vp9_extra_bits_high10[ENTROPY_TOKENS] = {
|
2015-11-04 00:38:54 +01:00
|
|
|
{0, 0, 0, zero_cost}, // ZERO
|
2016-01-15 22:55:29 +01:00
|
|
|
{0, 0, 1, sign_cost}, // ONE
|
|
|
|
{0, 0, 2, sign_cost}, // TWO
|
|
|
|
{0, 0, 3, sign_cost}, // THREE
|
|
|
|
{0, 0, 4, sign_cost}, // FOUR
|
2015-11-04 00:38:54 +01:00
|
|
|
{vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost}, // CAT1
|
|
|
|
{vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost}, // CAT2
|
|
|
|
{vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost}, // CAT3
|
|
|
|
{vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost}, // CAT4
|
|
|
|
{vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost}, // CAT5
|
|
|
|
{vp9_cat6_prob_high12 + 2, 16, CAT6_MIN_VAL, 0}, // CAT6
|
|
|
|
{0, 0, 0, zero_cost} // EOB
|
2014-09-19 19:13:47 +02:00
|
|
|
};
|
|
|
|
const vp9_extra_bit vp9_extra_bits_high12[ENTROPY_TOKENS] = {
|
2015-11-04 00:38:54 +01:00
|
|
|
{0, 0, 0, zero_cost}, // ZERO
|
2016-01-15 22:55:29 +01:00
|
|
|
{0, 0, 1, sign_cost}, // ONE
|
|
|
|
{0, 0, 2, sign_cost}, // TWO
|
|
|
|
{0, 0, 3, sign_cost}, // THREE
|
|
|
|
{0, 0, 4, sign_cost}, // FOUR
|
2015-11-04 00:38:54 +01:00
|
|
|
{vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost}, // CAT1
|
|
|
|
{vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost}, // CAT2
|
|
|
|
{vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost}, // CAT3
|
|
|
|
{vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost}, // CAT4
|
|
|
|
{vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost}, // CAT5
|
|
|
|
{vp9_cat6_prob_high12, 18, CAT6_MIN_VAL, 0}, // CAT6
|
|
|
|
{0, 0, 0, zero_cost} // EOB
|
2014-09-19 19:13:47 +02:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2014-12-22 22:35:56 +01:00
|
|
|
const struct vp9_token vp9_coef_encodings[ENTROPY_TOKENS] = {
|
|
|
|
{2, 2}, {6, 3}, {28, 5}, {58, 6}, {59, 6}, {60, 6}, {61, 6}, {124, 7},
|
|
|
|
{125, 7}, {126, 7}, {127, 7}, {0, 1}
|
|
|
|
};
|
2013-11-27 20:27:57 +01:00
|
|
|
|
2012-11-28 00:51:06 +01:00
|
|
|
|
2013-04-29 20:57:48 +02:00
|
|
|
struct tokenize_b_args {
|
|
|
|
VP9_COMP *cpi;
|
2014-11-21 20:11:06 +01:00
|
|
|
ThreadData *td;
|
2013-04-29 20:57:48 +02:00
|
|
|
TOKENEXTRA **tp;
|
|
|
|
};
|
2013-06-06 15:07:09 +02:00
|
|
|
|
2013-08-27 20:05:08 +02:00
|
|
|
static void set_entropy_context_b(int plane, int block, BLOCK_SIZE plane_bsize,
|
2013-08-16 02:03:03 +02:00
|
|
|
TX_SIZE tx_size, void *arg) {
|
2013-07-29 23:54:31 +02:00
|
|
|
struct tokenize_b_args* const args = arg;
|
2014-11-21 20:11:06 +01:00
|
|
|
ThreadData *const td = args->td;
|
|
|
|
MACROBLOCK *const x = &td->mb;
|
|
|
|
MACROBLOCKD *const xd = &x->e_mbd;
|
|
|
|
struct macroblock_plane *p = &x->plane[plane];
|
2013-08-20 00:47:24 +02:00
|
|
|
struct macroblockd_plane *pd = &xd->plane[plane];
|
2013-08-21 20:55:04 +02:00
|
|
|
int aoff, loff;
|
|
|
|
txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff);
|
2014-02-01 02:35:53 +01:00
|
|
|
vp9_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0,
|
|
|
|
aoff, loff);
|
2013-07-29 23:54:31 +02:00
|
|
|
}
|
|
|
|
|
2015-07-20 22:49:15 +02:00
|
|
|
static INLINE void add_token(TOKENEXTRA **t, const vpx_prob *context_tree,
|
2016-01-20 23:09:45 +01:00
|
|
|
int16_t token, EXTRABIT extra,
|
2014-01-15 00:05:13 +01:00
|
|
|
unsigned int *counts) {
|
2016-01-20 23:09:45 +01:00
|
|
|
(*t)->context_tree = context_tree;
|
2014-01-15 00:05:13 +01:00
|
|
|
(*t)->token = token;
|
|
|
|
(*t)->extra = extra;
|
|
|
|
(*t)++;
|
|
|
|
++counts[token];
|
|
|
|
}
|
|
|
|
|
2014-02-04 04:49:37 +01:00
|
|
|
static INLINE void add_token_no_extra(TOKENEXTRA **t,
|
2015-07-20 22:49:15 +02:00
|
|
|
const vpx_prob *context_tree,
|
2016-01-20 23:09:45 +01:00
|
|
|
int16_t token,
|
2014-02-04 04:49:37 +01:00
|
|
|
unsigned int *counts) {
|
|
|
|
(*t)->context_tree = context_tree;
|
2016-01-20 23:09:45 +01:00
|
|
|
(*t)->token = token;
|
2014-02-04 04:49:37 +01:00
|
|
|
(*t)++;
|
|
|
|
++counts[token];
|
|
|
|
}
|
|
|
|
|
2014-02-28 03:26:44 +01:00
|
|
|
static INLINE int get_tx_eob(const struct segmentation *seg, int segment_id,
|
|
|
|
TX_SIZE tx_size) {
|
|
|
|
const int eob_max = 16 << (tx_size << 1);
|
2015-06-11 13:20:55 +02:00
|
|
|
return segfeature_active(seg, segment_id, SEG_LVL_SKIP) ? 0 : eob_max;
|
2014-02-28 03:26:44 +01:00
|
|
|
}
|
|
|
|
|
2013-08-27 20:05:08 +02:00
|
|
|
static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize,
|
2013-08-16 02:03:03 +02:00
|
|
|
TX_SIZE tx_size, void *arg) {
|
2013-04-29 20:57:48 +02:00
|
|
|
struct tokenize_b_args* const args = arg;
|
|
|
|
VP9_COMP *cpi = args->cpi;
|
2014-11-21 20:11:06 +01:00
|
|
|
ThreadData *const td = args->td;
|
|
|
|
MACROBLOCK *const x = &td->mb;
|
|
|
|
MACROBLOCKD *const xd = &x->e_mbd;
|
2013-04-29 20:57:48 +02:00
|
|
|
TOKENEXTRA **tp = args->tp;
|
2014-02-28 03:58:32 +01:00
|
|
|
uint8_t token_cache[32 * 32];
|
2014-11-21 20:11:06 +01:00
|
|
|
struct macroblock_plane *p = &x->plane[plane];
|
2013-08-20 00:47:24 +02:00
|
|
|
struct macroblockd_plane *pd = &xd->plane[plane];
|
2016-01-20 01:40:20 +01:00
|
|
|
MODE_INFO *mi = xd->mi[0];
|
2012-08-03 02:03:14 +02:00
|
|
|
int pt; /* near block/prev token context index */
|
2014-02-04 04:49:37 +01:00
|
|
|
int c;
|
2012-08-03 02:03:14 +02:00
|
|
|
TOKENEXTRA *t = *tp; /* store tokens starting here */
|
2014-01-15 00:05:13 +01:00
|
|
|
int eob = p->eobs[block];
|
2015-09-29 19:40:27 +02:00
|
|
|
const PLANE_TYPE type = get_plane_type(plane);
|
2014-09-03 01:34:09 +02:00
|
|
|
const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
|
2016-01-20 01:40:20 +01:00
|
|
|
const int segment_id = mi->segment_id;
|
2013-07-01 20:36:07 +02:00
|
|
|
const int16_t *scan, *nb;
|
2013-11-23 01:20:45 +01:00
|
|
|
const scan_order *so;
|
2016-01-20 01:40:20 +01:00
|
|
|
const int ref = is_inter_block(mi);
|
2014-02-04 04:49:37 +01:00
|
|
|
unsigned int (*const counts)[COEFF_CONTEXTS][ENTROPY_TOKENS] =
|
2014-11-21 20:11:06 +01:00
|
|
|
td->rd_counts.coef_counts[tx_size][type][ref];
|
2015-07-20 22:49:15 +02:00
|
|
|
vpx_prob (*const coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] =
|
2014-10-22 23:37:38 +02:00
|
|
|
cpi->common.fc->coef_probs[tx_size][type][ref];
|
2014-02-04 04:49:37 +01:00
|
|
|
unsigned int (*const eob_branch)[COEFF_CONTEXTS] =
|
2014-11-21 20:11:06 +01:00
|
|
|
td->counts->eob_branch[tx_size][type][ref];
|
2014-01-15 00:05:13 +01:00
|
|
|
const uint8_t *const band = get_band_translate(tx_size);
|
2013-08-27 23:17:53 +02:00
|
|
|
const int seg_eob = get_tx_eob(&cpi->common.seg, segment_id, tx_size);
|
2014-12-22 17:42:52 +01:00
|
|
|
int16_t token;
|
|
|
|
EXTRABIT extra;
|
2013-08-21 20:55:04 +02:00
|
|
|
int aoff, loff;
|
|
|
|
txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff);
|
|
|
|
|
2013-09-19 14:53:48 +02:00
|
|
|
pt = get_entropy_context(tx_size, pd->above_context + aoff,
|
2014-01-15 00:05:13 +01:00
|
|
|
pd->left_context + loff);
|
2013-11-23 01:20:45 +01:00
|
|
|
so = get_scan(xd, tx_size, type, block);
|
|
|
|
scan = so->scan;
|
|
|
|
nb = so->neighbors;
|
2013-03-28 18:42:23 +01:00
|
|
|
c = 0;
|
2014-09-19 19:13:47 +02:00
|
|
|
|
2014-01-15 00:05:13 +01:00
|
|
|
while (c < eob) {
|
2013-02-20 19:16:24 +01:00
|
|
|
int v = 0;
|
2014-02-14 02:40:10 +01:00
|
|
|
v = qcoeff[scan[c]];
|
2016-01-20 23:09:45 +01:00
|
|
|
++eob_branch[band[c]][pt];
|
2014-01-15 00:05:13 +01:00
|
|
|
|
|
|
|
while (!v) {
|
2016-01-20 23:09:45 +01:00
|
|
|
add_token_no_extra(&t, coef_probs[band[c]][pt], ZERO_TOKEN,
|
2014-02-04 04:49:37 +01:00
|
|
|
counts[band[c]][pt]);
|
2013-05-08 19:04:14 +02:00
|
|
|
|
2014-01-15 00:05:13 +01:00
|
|
|
token_cache[scan[c]] = 0;
|
|
|
|
++c;
|
|
|
|
pt = get_coef_context(nb, token_cache, c);
|
2014-02-14 02:40:10 +01:00
|
|
|
v = qcoeff[scan[c]];
|
2014-01-15 00:05:13 +01:00
|
|
|
}
|
2014-02-04 04:49:37 +01:00
|
|
|
|
2014-12-22 17:42:52 +01:00
|
|
|
vp9_get_token_extra(v, &token, &extra);
|
|
|
|
|
2016-01-20 23:09:45 +01:00
|
|
|
add_token(&t, coef_probs[band[c]][pt], token, extra,
|
|
|
|
counts[band[c]][pt]);
|
2013-07-30 02:06:18 +02:00
|
|
|
|
2014-12-22 17:42:52 +01:00
|
|
|
token_cache[scan[c]] = vp9_pt_energy_class[token];
|
2014-01-15 00:05:13 +01:00
|
|
|
++c;
|
|
|
|
pt = get_coef_context(nb, token_cache, c);
|
|
|
|
}
|
|
|
|
if (c < seg_eob) {
|
2014-02-04 04:49:37 +01:00
|
|
|
++eob_branch[band[c]][pt];
|
2016-01-20 23:09:45 +01:00
|
|
|
add_token_no_extra(&t, coef_probs[band[c]][pt], EOB_TOKEN,
|
|
|
|
counts[band[c]][pt]);
|
2014-01-15 00:05:13 +01:00
|
|
|
}
|
2012-10-13 20:46:21 +02:00
|
|
|
|
|
|
|
*tp = t;
|
2013-08-21 20:55:04 +02:00
|
|
|
|
2014-02-01 02:35:53 +01:00
|
|
|
vp9_set_contexts(xd, pd, plane_bsize, tx_size, c > 0, aoff, loff);
|
2010-05-18 17:58:33 +02:00
|
|
|
}
|
|
|
|
|
2013-04-11 20:14:31 +02:00
|
|
|
struct is_skippable_args {
|
2015-07-24 19:35:44 +02:00
|
|
|
uint16_t *eobs;
|
2013-04-11 20:14:31 +02:00
|
|
|
int *skippable;
|
|
|
|
};
|
|
|
|
static void is_skippable(int plane, int block,
|
2013-08-27 20:05:08 +02:00
|
|
|
BLOCK_SIZE plane_bsize, TX_SIZE tx_size,
|
2013-08-20 00:47:24 +02:00
|
|
|
void *argv) {
|
2013-04-11 20:14:31 +02:00
|
|
|
struct is_skippable_args *args = argv;
|
2015-07-24 19:35:44 +02:00
|
|
|
(void)plane;
|
2014-05-13 19:44:40 +02:00
|
|
|
(void)plane_bsize;
|
|
|
|
(void)tx_size;
|
2015-07-24 19:35:44 +02:00
|
|
|
args->skippable[0] &= (!args->eobs[block]);
|
2012-09-12 04:36:28 +02:00
|
|
|
}
|
|
|
|
|
2014-05-16 16:39:55 +02:00
|
|
|
// TODO(yaowu): rewrite and optimize this function to remove the usage of
|
|
|
|
// vp9_foreach_transform_block() and simplify is_skippable().
|
2013-12-04 02:59:32 +01:00
|
|
|
int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
|
2013-04-11 20:14:31 +02:00
|
|
|
int result = 1;
|
2015-07-24 19:35:44 +02:00
|
|
|
struct is_skippable_args args = {x->plane[plane].eobs, &result};
|
2014-02-01 02:35:53 +01:00
|
|
|
vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable,
|
|
|
|
&args);
|
2013-04-11 20:14:31 +02:00
|
|
|
return result;
|
2013-03-04 23:12:17 +01:00
|
|
|
}
|
|
|
|
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
static void has_high_freq_coeff(int plane, int block,
|
|
|
|
BLOCK_SIZE plane_bsize, TX_SIZE tx_size,
|
|
|
|
void *argv) {
|
|
|
|
struct is_skippable_args *args = argv;
|
|
|
|
int eobs = (tx_size == TX_4X4) ? 3 : 10;
|
2015-07-24 19:35:44 +02:00
|
|
|
(void) plane;
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
(void) plane_bsize;
|
|
|
|
|
2015-07-24 19:35:44 +02:00
|
|
|
*(args->skippable) |= (args->eobs[block] > eobs);
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
|
|
|
|
int result = 0;
|
2015-07-24 19:35:44 +02:00
|
|
|
struct is_skippable_args args = {x->plane[plane].eobs, &result};
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane,
|
|
|
|
has_high_freq_coeff, &args);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2014-11-21 20:11:06 +01:00
|
|
|
void vp9_tokenize_sb(VP9_COMP *cpi, ThreadData *td, TOKENEXTRA **t,
|
|
|
|
int dry_run, BLOCK_SIZE bsize) {
|
2013-07-12 03:39:10 +02:00
|
|
|
VP9_COMMON *const cm = &cpi->common;
|
2014-11-21 20:11:06 +01:00
|
|
|
MACROBLOCK *const x = &td->mb;
|
|
|
|
MACROBLOCKD *const xd = &x->e_mbd;
|
2016-01-20 01:40:20 +01:00
|
|
|
MODE_INFO *const mi = xd->mi[0];
|
2013-12-10 23:11:26 +01:00
|
|
|
const int ctx = vp9_get_skip_context(xd);
|
2016-01-20 01:40:20 +01:00
|
|
|
const int skip_inc = !segfeature_active(&cm->seg, mi->segment_id,
|
2015-06-11 13:20:55 +02:00
|
|
|
SEG_LVL_SKIP);
|
2014-11-21 20:11:06 +01:00
|
|
|
struct tokenize_b_args arg = {cpi, td, t};
|
2016-01-20 01:40:20 +01:00
|
|
|
if (mi->skip) {
|
32x32 transform for superblocks.
This adds Debargha's DCT/DWT hybrid and a regular 32x32 DCT, and adds
code all over the place to wrap that in the bitstream/encoder/decoder/RD.
Some implementation notes (these probably need careful review):
- token range is extended by 1 bit, since the value range out of this
transform is [-16384,16383].
- the coefficients coming out of the FDCT are manually scaled back by
1 bit, or else they won't fit in int16_t (they are 17 bits). Because
of this, the RD error scoring does not right-shift the MSE score by
two (unlike for 4x4/8x8/16x16).
- to compensate for this loss in precision, the quantizer is halved
also. This is currently a little hacky.
- FDCT and IDCT is double-only right now. Needs a fixed-point impl.
- There are no default probabilities for the 32x32 transform yet; I'm
simply using the 16x16 luma ones. A future commit will add newly
generated probabilities for all transforms.
- No ADST version. I don't think we'll add one for this level; if an
ADST is desired, transform-size selection can scale back to 16x16
or lower, and use an ADST at that level.
Additional notes specific to Debargha's DWT/DCT hybrid:
- coefficient scale is different for the top/left 16x16 (DCT-over-DWT)
block than for the rest (DWT pixel differences) of the block. Therefore,
RD error scoring isn't easily scalable between coefficient and pixel
domain. Thus, unfortunately, we need to compute the RD distortion in
the pixel domain until we figure out how to scale these appropriately.
Change-Id: I00386f20f35d7fabb19aba94c8162f8aee64ef2b
2012-12-07 23:45:05 +01:00
|
|
|
if (!dry_run)
|
2014-11-21 20:11:06 +01:00
|
|
|
td->counts->skip[ctx][1] += skip_inc;
|
2013-08-12 20:24:24 +02:00
|
|
|
reset_skip_context(xd, bsize);
|
32x32 transform for superblocks.
This adds Debargha's DCT/DWT hybrid and a regular 32x32 DCT, and adds
code all over the place to wrap that in the bitstream/encoder/decoder/RD.
Some implementation notes (these probably need careful review):
- token range is extended by 1 bit, since the value range out of this
transform is [-16384,16383].
- the coefficients coming out of the FDCT are manually scaled back by
1 bit, or else they won't fit in int16_t (they are 17 bits). Because
of this, the RD error scoring does not right-shift the MSE score by
two (unlike for 4x4/8x8/16x16).
- to compensate for this loss in precision, the quantizer is halved
also. This is currently a little hacky.
- FDCT and IDCT is double-only right now. Needs a fixed-point impl.
- There are no default probabilities for the 32x32 transform yet; I'm
simply using the 16x16 luma ones. A future commit will add newly
generated probabilities for all transforms.
- No ADST version. I don't think we'll add one for this level; if an
ADST is desired, transform-size selection can scale back to 16x16
or lower, and use an ADST at that level.
Additional notes specific to Debargha's DWT/DCT hybrid:
- coefficient scale is different for the top/left 16x16 (DCT-over-DWT)
block than for the rest (DWT pixel differences) of the block. Therefore,
RD error scoring isn't easily scalable between coefficient and pixel
domain. Thus, unfortunately, we need to compute the RD distortion in
the pixel domain until we figure out how to scale these appropriately.
Change-Id: I00386f20f35d7fabb19aba94c8162f8aee64ef2b
2012-12-07 23:45:05 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-07-29 23:54:31 +02:00
|
|
|
if (!dry_run) {
|
2014-11-21 20:11:06 +01:00
|
|
|
td->counts->skip[ctx][0] += skip_inc;
|
2014-02-01 02:35:53 +01:00
|
|
|
vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg);
|
2013-07-29 23:54:31 +02:00
|
|
|
} else {
|
2014-02-01 02:35:53 +01:00
|
|
|
vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg);
|
2013-07-29 23:54:31 +02:00
|
|
|
}
|
32x32 transform for superblocks.
This adds Debargha's DCT/DWT hybrid and a regular 32x32 DCT, and adds
code all over the place to wrap that in the bitstream/encoder/decoder/RD.
Some implementation notes (these probably need careful review):
- token range is extended by 1 bit, since the value range out of this
transform is [-16384,16383].
- the coefficients coming out of the FDCT are manually scaled back by
1 bit, or else they won't fit in int16_t (they are 17 bits). Because
of this, the RD error scoring does not right-shift the MSE score by
two (unlike for 4x4/8x8/16x16).
- to compensate for this loss in precision, the quantizer is halved
also. This is currently a little hacky.
- FDCT and IDCT is double-only right now. Needs a fixed-point impl.
- There are no default probabilities for the 32x32 transform yet; I'm
simply using the 16x16 luma ones. A future commit will add newly
generated probabilities for all transforms.
- No ADST version. I don't think we'll add one for this level; if an
ADST is desired, transform-size selection can scale back to 16x16
or lower, and use an ADST at that level.
Additional notes specific to Debargha's DWT/DCT hybrid:
- coefficient scale is different for the top/left 16x16 (DCT-over-DWT)
block than for the rest (DWT pixel differences) of the block. Therefore,
RD error scoring isn't easily scalable between coefficient and pixel
domain. Thus, unfortunately, we need to compute the RD distortion in
the pixel domain until we figure out how to scale these appropriately.
Change-Id: I00386f20f35d7fabb19aba94c8162f8aee64ef2b
2012-12-07 23:45:05 +01:00
|
|
|
}
|