15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2010 Google Inc. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// that can be found in the COPYING file in the root of the source 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// tree. An additional intellectual property rights grant can be found 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in the file PATENTS. All contributing project authors may 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// be found in the AUTHORS file in the root of the source tree. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Quantizer initialization 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Skal (pascal.massimino@gmail.com) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./vp8i.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int clip(int v, int M) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v < 0 ? 0 : v > M ? M : v; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Paragraph 14.1 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8_t kDcTable[128] = { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4, 5, 6, 7, 8, 9, 10, 10, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11, 12, 13, 14, 15, 16, 17, 17, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18, 19, 20, 20, 21, 21, 22, 22, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23, 23, 24, 25, 25, 26, 27, 28, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29, 30, 31, 32, 33, 34, 35, 36, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37, 37, 38, 39, 40, 41, 42, 43, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44, 45, 46, 46, 47, 48, 49, 50, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51, 52, 53, 54, 55, 56, 57, 58, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59, 60, 61, 62, 63, 64, 65, 66, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67, 68, 69, 70, 71, 72, 73, 74, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75, 76, 76, 77, 78, 79, 80, 81, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82, 83, 84, 85, 86, 87, 88, 89, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91, 93, 95, 96, 98, 100, 101, 102, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104, 106, 108, 110, 112, 114, 116, 118, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122, 124, 126, 128, 130, 132, 134, 136, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138, 140, 143, 145, 148, 151, 154, 157 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16_t kAcTable[128] = { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4, 5, 6, 7, 8, 9, 10, 11, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12, 13, 14, 15, 16, 17, 18, 19, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20, 21, 22, 23, 24, 25, 26, 27, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28, 29, 30, 31, 32, 33, 34, 35, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36, 37, 38, 39, 40, 41, 42, 43, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44, 45, 46, 47, 48, 49, 50, 51, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52, 53, 54, 55, 56, 57, 58, 60, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62, 64, 66, 68, 70, 72, 74, 76, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78, 80, 82, 84, 86, 88, 90, 92, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94, 96, 98, 100, 102, 104, 106, 108, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110, 112, 114, 116, 119, 122, 125, 128, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131, 134, 137, 140, 143, 146, 149, 152, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155, 158, 161, 164, 167, 170, 173, 177, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 181, 185, 189, 193, 197, 201, 205, 209, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 213, 217, 221, 225, 229, 234, 239, 245, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 249, 254, 259, 264, 269, 274, 279, 284 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Paragraph 9.6 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ParseQuant(VP8Decoder* const dec) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8BitReader* const br = &dec->br_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int base_q0 = VP8GetValue(br, 7); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int dqy1_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int dqy2_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int dqy2_ac = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int dquv_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int dquv_ac = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const VP8SegmentHeader* const hdr = &dec->segment_hdr_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < NUM_MB_SEGMENTS; ++i) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int q; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hdr->use_segment_) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q = hdr->quantizer_[i]; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hdr->absolute_delta_) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q += base_q0; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dec->dqm_[i] = dec->dqm_[0]; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q = base_q0; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8QuantMatrix* const m = &dec->dqm_[i]; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m->y1_mat_[0] = kDcTable[clip(q + dqy1_dc, 127)]; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m->y1_mat_[1] = kAcTable[clip(q + 0, 127)]; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m->y2_mat_[0] = kDcTable[clip(q + dqy2_dc, 127)] * 2; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For all x in [0..284], x*155/100 is bitwise equal to (x*101581) >> 16. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The smallest precision for that is '(x*6349) >> 12' but 16 is a good 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // word size. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m->y2_mat_[1] = (kAcTable[clip(q + dqy2_ac, 127)] * 101581) >> 16; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (m->y2_mat_[1] < 8) m->y2_mat_[1] = 8; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m->uv_mat_[0] = kDcTable[clip(q + dquv_dc, 117)]; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m->uv_mat_[1] = kAcTable[clip(q + dquv_ac, 127)]; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) m->uv_quant_ = q + dquv_ac; // for dithering strength evaluation 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111