Home | History | Annotate | Download | only in vda
      1 // Copyright 2016 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 // Note: ported from Chromium commit head: f06caa0
      5 
      6 #include "vp9_uncompressed_header_parser.h"
      7 
      8 #include "base/logging.h"
      9 
     10 namespace media {
     11 
     12 namespace {
     13 
     14 // 10.5 Default probability tables
     15 Vp9FrameContext kVp9DefaultFrameContext = {
     16     // tx_probs_8x8
     17     {{100}, {66}},
     18     // tx_probs_16x16
     19     {{20, 152}, {15, 101}},
     20     // tx_probs_32x32
     21     {{3, 136, 37}, {5, 52, 13}},
     22     // coef_probs
     23     {// 4x4
     24      {{{{{195, 29, 183}, {84, 49, 136}, {8, 42, 71}},
     25         {{31, 107, 169},
     26          {35, 99, 159},
     27          {17, 82, 140},
     28          {8, 66, 114},
     29          {2, 44, 76},
     30          {1, 19, 32}},
     31         {{40, 132, 201},
     32          {29, 114, 187},
     33          {13, 91, 157},
     34          {7, 75, 127},
     35          {3, 58, 95},
     36          {1, 28, 47}},
     37         {{69, 142, 221},
     38          {42, 122, 201},
     39          {15, 91, 159},
     40          {6, 67, 121},
     41          {1, 42, 77},
     42          {1, 17, 31}},
     43         {{102, 148, 228},
     44          {67, 117, 204},
     45          {17, 82, 154},
     46          {6, 59, 114},
     47          {2, 39, 75},
     48          {1, 15, 29}},
     49         {{156, 57, 233},
     50          {119, 57, 212},
     51          {58, 48, 163},
     52          {29, 40, 124},
     53          {12, 30, 81},
     54          {3, 12, 31}}},
     55        {{{191, 107, 226}, {124, 117, 204}, {25, 99, 155}},
     56         {{29, 148, 210},
     57          {37, 126, 194},
     58          {8, 93, 157},
     59          {2, 68, 118},
     60          {1, 39, 69},
     61          {1, 17, 33}},
     62         {{41, 151, 213},
     63          {27, 123, 193},
     64          {3, 82, 144},
     65          {1, 58, 105},
     66          {1, 32, 60},
     67          {1, 13, 26}},
     68         {{59, 159, 220},
     69          {23, 126, 198},
     70          {4, 88, 151},
     71          {1, 66, 114},
     72          {1, 38, 71},
     73          {1, 18, 34}},
     74         {{114, 136, 232},
     75          {51, 114, 207},
     76          {11, 83, 155},
     77          {3, 56, 105},
     78          {1, 33, 65},
     79          {1, 17, 34}},
     80         {{149, 65, 234},
     81          {121, 57, 215},
     82          {61, 49, 166},
     83          {28, 36, 114},
     84          {12, 25, 76},
     85          {3, 16, 42}}}},
     86       {{{{214, 49, 220}, {132, 63, 188}, {42, 65, 137}},
     87         {{85, 137, 221},
     88          {104, 131, 216},
     89          {49, 111, 192},
     90          {21, 87, 155},
     91          {2, 49, 87},
     92          {1, 16, 28}},
     93         {{89, 163, 230},
     94          {90, 137, 220},
     95          {29, 100, 183},
     96          {10, 70, 135},
     97          {2, 42, 81},
     98          {1, 17, 33}},
     99         {{108, 167, 237},
    100          {55, 133, 222},
    101          {15, 97, 179},
    102          {4, 72, 135},
    103          {1, 45, 85},
    104          {1, 19, 38}},
    105         {{124, 146, 240},
    106          {66, 124, 224},
    107          {17, 88, 175},
    108          {4, 58, 122},
    109          {1, 36, 75},
    110          {1, 18, 37}},
    111         {{141, 79, 241},
    112          {126, 70, 227},
    113          {66, 58, 182},
    114          {30, 44, 136},
    115          {12, 34, 96},
    116          {2, 20, 47}}},
    117        {{{229, 99, 249}, {143, 111, 235}, {46, 109, 192}},
    118         {{82, 158, 236},
    119          {94, 146, 224},
    120          {25, 117, 191},
    121          {9, 87, 149},
    122          {3, 56, 99},
    123          {1, 33, 57}},
    124         {{83, 167, 237},
    125          {68, 145, 222},
    126          {10, 103, 177},
    127          {2, 72, 131},
    128          {1, 41, 79},
    129          {1, 20, 39}},
    130         {{99, 167, 239},
    131          {47, 141, 224},
    132          {10, 104, 178},
    133          {2, 73, 133},
    134          {1, 44, 85},
    135          {1, 22, 47}},
    136         {{127, 145, 243},
    137          {71, 129, 228},
    138          {17, 93, 177},
    139          {3, 61, 124},
    140          {1, 41, 84},
    141          {1, 21, 52}},
    142         {{157, 78, 244},
    143          {140, 72, 231},
    144          {69, 58, 184},
    145          {31, 44, 137},
    146          {14, 38, 105},
    147          {8, 23, 61}}}}},
    148      // 8x8
    149      {{{{{125, 34, 187}, {52, 41, 133}, {6, 31, 56}},
    150         {{37, 109, 153},
    151          {51, 102, 147},
    152          {23, 87, 128},
    153          {8, 67, 101},
    154          {1, 41, 63},
    155          {1, 19, 29}},
    156         {{31, 154, 185},
    157          {17, 127, 175},
    158          {6, 96, 145},
    159          {2, 73, 114},
    160          {1, 51, 82},
    161          {1, 28, 45}},
    162         {{23, 163, 200},
    163          {10, 131, 185},
    164          {2, 93, 148},
    165          {1, 67, 111},
    166          {1, 41, 69},
    167          {1, 14, 24}},
    168         {{29, 176, 217},
    169          {12, 145, 201},
    170          {3, 101, 156},
    171          {1, 69, 111},
    172          {1, 39, 63},
    173          {1, 14, 23}},
    174         {{57, 192, 233},
    175          {25, 154, 215},
    176          {6, 109, 167},
    177          {3, 78, 118},
    178          {1, 48, 69},
    179          {1, 21, 29}}},
    180        {{{202, 105, 245}, {108, 106, 216}, {18, 90, 144}},
    181         {{33, 172, 219},
    182          {64, 149, 206},
    183          {14, 117, 177},
    184          {5, 90, 141},
    185          {2, 61, 95},
    186          {1, 37, 57}},
    187         {{33, 179, 220},
    188          {11, 140, 198},
    189          {1, 89, 148},
    190          {1, 60, 104},
    191          {1, 33, 57},
    192          {1, 12, 21}},
    193         {{30, 181, 221},
    194          {8, 141, 198},
    195          {1, 87, 145},
    196          {1, 58, 100},
    197          {1, 31, 55},
    198          {1, 12, 20}},
    199         {{32, 186, 224},
    200          {7, 142, 198},
    201          {1, 86, 143},
    202          {1, 58, 100},
    203          {1, 31, 55},
    204          {1, 12, 22}},
    205         {{57, 192, 227},
    206          {20, 143, 204},
    207          {3, 96, 154},
    208          {1, 68, 112},
    209          {1, 42, 69},
    210          {1, 19, 32}}}},
    211       {{{{212, 35, 215}, {113, 47, 169}, {29, 48, 105}},
    212         {{74, 129, 203},
    213          {106, 120, 203},
    214          {49, 107, 178},
    215          {19, 84, 144},
    216          {4, 50, 84},
    217          {1, 15, 25}},
    218         {{71, 172, 217},
    219          {44, 141, 209},
    220          {15, 102, 173},
    221          {6, 76, 133},
    222          {2, 51, 89},
    223          {1, 24, 42}},
    224         {{64, 185, 231},
    225          {31, 148, 216},
    226          {8, 103, 175},
    227          {3, 74, 131},
    228          {1, 46, 81},
    229          {1, 18, 30}},
    230         {{65, 196, 235},
    231          {25, 157, 221},
    232          {5, 105, 174},
    233          {1, 67, 120},
    234          {1, 38, 69},
    235          {1, 15, 30}},
    236         {{65, 204, 238},
    237          {30, 156, 224},
    238          {7, 107, 177},
    239          {2, 70, 124},
    240          {1, 42, 73},
    241          {1, 18, 34}}},
    242        {{{225, 86, 251}, {144, 104, 235}, {42, 99, 181}},
    243         {{85, 175, 239},
    244          {112, 165, 229},
    245          {29, 136, 200},
    246          {12, 103, 162},
    247          {6, 77, 123},
    248          {2, 53, 84}},
    249         {{75, 183, 239},
    250          {30, 155, 221},
    251          {3, 106, 171},
    252          {1, 74, 128},
    253          {1, 44, 76},
    254          {1, 17, 28}},
    255         {{73, 185, 240},
    256          {27, 159, 222},
    257          {2, 107, 172},
    258          {1, 75, 127},
    259          {1, 42, 73},
    260          {1, 17, 29}},
    261         {{62, 190, 238},
    262          {21, 159, 222},
    263          {2, 107, 172},
    264          {1, 72, 122},
    265          {1, 40, 71},
    266          {1, 18, 32}},
    267         {{61, 199, 240},
    268          {27, 161, 226},
    269          {4, 113, 180},
    270          {1, 76, 129},
    271          {1, 46, 80},
    272          {1, 23, 41}}}}},
    273      // 16x16
    274      {{{{{7, 27, 153}, {5, 30, 95}, {1, 16, 30}},
    275         {{50, 75, 127},
    276          {57, 75, 124},
    277          {27, 67, 108},
    278          {10, 54, 86},
    279          {1, 33, 52},
    280          {1, 12, 18}},
    281         {{43, 125, 151},
    282          {26, 108, 148},
    283          {7, 83, 122},
    284          {2, 59, 89},
    285          {1, 38, 60},
    286          {1, 17, 27}},
    287         {{23, 144, 163},
    288          {13, 112, 154},
    289          {2, 75, 117},
    290          {1, 50, 81},
    291          {1, 31, 51},
    292          {1, 14, 23}},
    293         {{18, 162, 185},
    294          {6, 123, 171},
    295          {1, 78, 125},
    296          {1, 51, 86},
    297          {1, 31, 54},
    298          {1, 14, 23}},
    299         {{15, 199, 227},
    300          {3, 150, 204},
    301          {1, 91, 146},
    302          {1, 55, 95},
    303          {1, 30, 53},
    304          {1, 11, 20}}},
    305        {{{19, 55, 240}, {19, 59, 196}, {3, 52, 105}},
    306         {{41, 166, 207},
    307          {104, 153, 199},
    308          {31, 123, 181},
    309          {14, 101, 152},
    310          {5, 72, 106},
    311          {1, 36, 52}},
    312         {{35, 176, 211},
    313          {12, 131, 190},
    314          {2, 88, 144},
    315          {1, 60, 101},
    316          {1, 36, 60},
    317          {1, 16, 28}},
    318         {{28, 183, 213},
    319          {8, 134, 191},
    320          {1, 86, 142},
    321          {1, 56, 96},
    322          {1, 30, 53},
    323          {1, 12, 20}},
    324         {{20, 190, 215},
    325          {4, 135, 192},
    326          {1, 84, 139},
    327          {1, 53, 91},
    328          {1, 28, 49},
    329          {1, 11, 20}},
    330         {{13, 196, 216},
    331          {2, 137, 192},
    332          {1, 86, 143},
    333          {1, 57, 99},
    334          {1, 32, 56},
    335          {1, 13, 24}}}},
    336       {{{{211, 29, 217}, {96, 47, 156}, {22, 43, 87}},
    337         {{78, 120, 193},
    338          {111, 116, 186},
    339          {46, 102, 164},
    340          {15, 80, 128},
    341          {2, 49, 76},
    342          {1, 18, 28}},
    343         {{71, 161, 203},
    344          {42, 132, 192},
    345          {10, 98, 150},
    346          {3, 69, 109},
    347          {1, 44, 70},
    348          {1, 18, 29}},
    349         {{57, 186, 211},
    350          {30, 140, 196},
    351          {4, 93, 146},
    352          {1, 62, 102},
    353          {1, 38, 65},
    354          {1, 16, 27}},
    355         {{47, 199, 217},
    356          {14, 145, 196},
    357          {1, 88, 142},
    358          {1, 57, 98},
    359          {1, 36, 62},
    360          {1, 15, 26}},
    361         {{26, 219, 229},
    362          {5, 155, 207},
    363          {1, 94, 151},
    364          {1, 60, 104},
    365          {1, 36, 62},
    366          {1, 16, 28}}},
    367        {{{233, 29, 248}, {146, 47, 220}, {43, 52, 140}},
    368         {{100, 163, 232},
    369          {179, 161, 222},
    370          {63, 142, 204},
    371          {37, 113, 174},
    372          {26, 89, 137},
    373          {18, 68, 97}},
    374         {{85, 181, 230},
    375          {32, 146, 209},
    376          {7, 100, 164},
    377          {3, 71, 121},
    378          {1, 45, 77},
    379          {1, 18, 30}},
    380         {{65, 187, 230},
    381          {20, 148, 207},
    382          {2, 97, 159},
    383          {1, 68, 116},
    384          {1, 40, 70},
    385          {1, 14, 29}},
    386         {{40, 194, 227},
    387          {8, 147, 204},
    388          {1, 94, 155},
    389          {1, 65, 112},
    390          {1, 39, 66},
    391          {1, 14, 26}},
    392         {{16, 208, 228},
    393          {3, 151, 207},
    394          {1, 98, 160},
    395          {1, 67, 117},
    396          {1, 41, 74},
    397          {1, 17, 31}}}}},
    398      // 32x32
    399      {{{{{17, 38, 140}, {7, 34, 80}, {1, 17, 29}},
    400         {{37, 75, 128},
    401          {41, 76, 128},
    402          {26, 66, 116},
    403          {12, 52, 94},
    404          {2, 32, 55},
    405          {1, 10, 16}},
    406         {{50, 127, 154},
    407          {37, 109, 152},
    408          {16, 82, 121},
    409          {5, 59, 85},
    410          {1, 35, 54},
    411          {1, 13, 20}},
    412         {{40, 142, 167},
    413          {17, 110, 157},
    414          {2, 71, 112},
    415          {1, 44, 72},
    416          {1, 27, 45},
    417          {1, 11, 17}},
    418         {{30, 175, 188},
    419          {9, 124, 169},
    420          {1, 74, 116},
    421          {1, 48, 78},
    422          {1, 30, 49},
    423          {1, 11, 18}},
    424         {{10, 222, 223},
    425          {2, 150, 194},
    426          {1, 83, 128},
    427          {1, 48, 79},
    428          {1, 27, 45},
    429          {1, 11, 17}}},
    430        {{{36, 41, 235}, {29, 36, 193}, {10, 27, 111}},
    431         {{85, 165, 222},
    432          {177, 162, 215},
    433          {110, 135, 195},
    434          {57, 113, 168},
    435          {23, 83, 120},
    436          {10, 49, 61}},
    437         {{85, 190, 223},
    438          {36, 139, 200},
    439          {5, 90, 146},
    440          {1, 60, 103},
    441          {1, 38, 65},
    442          {1, 18, 30}},
    443         {{72, 202, 223},
    444          {23, 141, 199},
    445          {2, 86, 140},
    446          {1, 56, 97},
    447          {1, 36, 61},
    448          {1, 16, 27}},
    449         {{55, 218, 225},
    450          {13, 145, 200},
    451          {1, 86, 141},
    452          {1, 57, 99},
    453          {1, 35, 61},
    454          {1, 13, 22}},
    455         {{15, 235, 212},
    456          {1, 132, 184},
    457          {1, 84, 139},
    458          {1, 57, 97},
    459          {1, 34, 56},
    460          {1, 14, 23}}}},
    461       {{{{181, 21, 201}, {61, 37, 123}, {10, 38, 71}},
    462         {{47, 106, 172},
    463          {95, 104, 173},
    464          {42, 93, 159},
    465          {18, 77, 131},
    466          {4, 50, 81},
    467          {1, 17, 23}},
    468         {{62, 147, 199},
    469          {44, 130, 189},
    470          {28, 102, 154},
    471          {18, 75, 115},
    472          {2, 44, 65},
    473          {1, 12, 19}},
    474         {{55, 153, 210},
    475          {24, 130, 194},
    476          {3, 93, 146},
    477          {1, 61, 97},
    478          {1, 31, 50},
    479          {1, 10, 16}},
    480         {{49, 186, 223},
    481          {17, 148, 204},
    482          {1, 96, 142},
    483          {1, 53, 83},
    484          {1, 26, 44},
    485          {1, 11, 17}},
    486         {{13, 217, 212},
    487          {2, 136, 180},
    488          {1, 78, 124},
    489          {1, 50, 83},
    490          {1, 29, 49},
    491          {1, 14, 23}}},
    492        {{{197, 13, 247}, {82, 17, 222}, {25, 17, 162}},
    493         {{126, 186, 247},
    494          {234, 191, 243},
    495          {176, 177, 234},
    496          {104, 158, 220},
    497          {66, 128, 186},
    498          {55, 90, 137}},
    499         {{111, 197, 242},
    500          {46, 158, 219},
    501          {9, 104, 171},
    502          {2, 65, 125},
    503          {1, 44, 80},
    504          {1, 17, 91}},
    505         {{104, 208, 245},
    506          {39, 168, 224},
    507          {3, 109, 162},
    508          {1, 79, 124},
    509          {1, 50, 102},
    510          {1, 43, 102}},
    511         {{84, 220, 246},
    512          {31, 177, 231},
    513          {2, 115, 180},
    514          {1, 79, 134},
    515          {1, 55, 77},
    516          {1, 60, 79}},
    517         {{43, 243, 240},
    518          {8, 180, 217},
    519          {1, 115, 166},
    520          {1, 84, 121},
    521          {1, 51, 67},
    522          {1, 16, 6}}}}}},
    523     // skip_prob
    524     {192, 128, 64},
    525     // inter_mode_probs
    526     {{2, 173, 34},
    527      {7, 145, 85},
    528      {7, 166, 63},
    529      {7, 94, 66},
    530      {8, 64, 46},
    531      {17, 81, 31},
    532      {25, 29, 30}},
    533     // interp_filter_probs
    534     {{235, 162}, {36, 255}, {34, 3}, {149, 144}},
    535     // is_inter_prob
    536     {9, 102, 187, 225},
    537     // comp_mode_prob
    538     {239, 183, 119, 96, 41},
    539     // single_ref_prob
    540     {{33, 16}, {77, 74}, {142, 142}, {172, 170}, {238, 247}},
    541     // comp_ref_prob
    542     {50, 126, 123, 221, 226},
    543     // y_mode_probs
    544     {{65, 32, 18, 144, 162, 194, 41, 51, 98},
    545      {132, 68, 18, 165, 217, 196, 45, 40, 78},
    546      {173, 80, 19, 176, 240, 193, 64, 35, 46},
    547      {221, 135, 38, 194, 248, 121, 96, 85, 29}},
    548     // uv_mode_probs
    549     {{120, 7, 76, 176, 208, 126, 28, 54, 103},
    550      {48, 12, 154, 155, 139, 90, 34, 117, 119},
    551      {67, 6, 25, 204, 243, 158, 13, 21, 96},
    552      {97, 5, 44, 131, 176, 139, 48, 68, 97},
    553      {83, 5, 42, 156, 111, 152, 26, 49, 152},
    554      {80, 5, 58, 178, 74, 83, 33, 62, 145},
    555      {86, 5, 32, 154, 192, 168, 14, 22, 163},
    556      {85, 5, 32, 156, 216, 148, 19, 29, 73},
    557      {77, 7, 64, 116, 132, 122, 37, 126, 120},
    558      {101, 21, 107, 181, 192, 103, 19, 67, 125}},
    559     // partition_probs
    560     {{199, 122, 141},
    561      {147, 63, 159},
    562      {148, 133, 118},
    563      {121, 104, 114},
    564      {174, 73, 87},
    565      {92, 41, 83},
    566      {82, 99, 50},
    567      {53, 39, 39},
    568      {177, 58, 59},
    569      {68, 26, 63},
    570      {52, 79, 25},
    571      {17, 14, 12},
    572      {222, 34, 30},
    573      {72, 16, 44},
    574      {58, 32, 12},
    575      {10, 7, 6}},
    576     // mv_joint_probs
    577     {32, 64, 96},
    578     // mv_sign_prob
    579     {128, 128},
    580     // mv_class_probs
    581     {{224, 144, 192, 168, 192, 176, 192, 198, 198, 245},
    582      {216, 128, 176, 160, 176, 176, 192, 198, 198, 208}},
    583     // mv_class0_bit_prob
    584     {216, 208},
    585     // mv_bits_prob
    586     {{136, 140, 148, 160, 176, 192, 224, 234, 234, 240},
    587      {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}},
    588     // mv_class0_fr_probs
    589     {{{128, 128, 64}, {96, 112, 64}}, {{128, 128, 64}, {96, 112, 64}}},
    590     // mv_fr_probs
    591     {{64, 96, 64}, {64, 96, 64}},
    592     // mv_class0_hp_prob
    593     {160, 160},
    594     // mv_hp_prob
    595     {128, 128},
    596 };
    597 
    598 // Helper function for Vp9Parser::ReadTileInfo. Defined as
    599 // calc_min_log2_tile_cols in spec 6.2.14 Tile size calculation.
    600 int GetMinLog2TileCols(int sb64_cols) {
    601   const int kMaxTileWidthB64 = 64;
    602   int min_log2 = 0;
    603   while ((kMaxTileWidthB64 << min_log2) < sb64_cols)
    604     min_log2++;
    605   return min_log2;
    606 }
    607 
    608 // Helper function for Vp9Parser::ReadTileInfo. Defined as
    609 // calc_max_log2_tile_cols in spec 6.2.14 Tile size calculation.
    610 int GetMaxLog2TileCols(int sb64_cols) {
    611   const int kMinTileWidthB64 = 4;
    612   int max_log2 = 1;
    613   while ((sb64_cols >> max_log2) >= kMinTileWidthB64)
    614     max_log2++;
    615   return max_log2 - 1;
    616 }
    617 
    618 }  // namespace
    619 
    620 Vp9UncompressedHeaderParser::Vp9UncompressedHeaderParser(
    621     Vp9Parser::Context* context)
    622     : context_(context) {}
    623 
    624 uint8_t Vp9UncompressedHeaderParser::ReadProfile() {
    625   uint8_t profile = 0;
    626 
    627   // LSB first.
    628   if (reader_.ReadBool())
    629     profile |= 1;
    630   if (reader_.ReadBool())
    631     profile |= 2;
    632   if (profile > 2 && reader_.ReadBool())
    633     profile += 1;
    634   return profile;
    635 }
    636 
    637 // 6.2.1 Frame sync syntax
    638 bool Vp9UncompressedHeaderParser::VerifySyncCode() {
    639   const int kSyncCode = 0x498342;
    640   if (reader_.ReadLiteral(8 * 3) != kSyncCode) {
    641     DVLOG(1) << "Invalid frame sync code";
    642     return false;
    643   }
    644   return true;
    645 }
    646 
    647 // 6.2.2 Color config syntax
    648 bool Vp9UncompressedHeaderParser::ReadColorConfig(Vp9FrameHeader* fhdr) {
    649   if (fhdr->profile == 2 || fhdr->profile == 3) {
    650     fhdr->bit_depth = reader_.ReadBool() ? 12 : 10;
    651   } else {
    652     fhdr->bit_depth = 8;
    653   }
    654 
    655   fhdr->color_space = static_cast<Vp9ColorSpace>(reader_.ReadLiteral(3));
    656   if (fhdr->color_space != Vp9ColorSpace::SRGB) {
    657     fhdr->color_range = reader_.ReadBool();
    658     if (fhdr->profile == 1 || fhdr->profile == 3) {
    659       fhdr->subsampling_x = reader_.ReadBool() ? 1 : 0;
    660       fhdr->subsampling_y = reader_.ReadBool() ? 1 : 0;
    661       if (fhdr->subsampling_x == 1 && fhdr->subsampling_y == 1) {
    662         DVLOG(1) << "4:2:0 color not supported in profile 1 or 3";
    663         return false;
    664       }
    665       bool reserved = reader_.ReadBool();
    666       if (reserved) {
    667         DVLOG(1) << "reserved bit set";
    668         return false;
    669       }
    670     } else {
    671       fhdr->subsampling_x = fhdr->subsampling_y = 1;
    672     }
    673   } else {
    674     fhdr->color_range = true;
    675     if (fhdr->profile == 1 || fhdr->profile == 3) {
    676       fhdr->subsampling_x = fhdr->subsampling_y = 0;
    677 
    678       bool reserved = reader_.ReadBool();
    679       if (reserved) {
    680         DVLOG(1) << "reserved bit set";
    681         return false;
    682       }
    683     } else {
    684       DVLOG(1) << "4:4:4 color not supported in profile 0 or 2";
    685       return false;
    686     }
    687   }
    688 
    689   return true;
    690 }
    691 
    692 // 6.2.3 Frame size syntax
    693 void Vp9UncompressedHeaderParser::ReadFrameSize(Vp9FrameHeader* fhdr) {
    694   fhdr->frame_width = reader_.ReadLiteral(16) + 1;
    695   fhdr->frame_height = reader_.ReadLiteral(16) + 1;
    696 }
    697 
    698 // 6.2.4 Render size syntax
    699 void Vp9UncompressedHeaderParser::ReadRenderSize(Vp9FrameHeader* fhdr) {
    700   if (reader_.ReadBool()) {
    701     fhdr->render_width = reader_.ReadLiteral(16) + 1;
    702     fhdr->render_height = reader_.ReadLiteral(16) + 1;
    703   } else {
    704     fhdr->render_width = fhdr->frame_width;
    705     fhdr->render_height = fhdr->frame_height;
    706   }
    707 }
    708 
    709 // 6.2.5 Frame size with refs syntax
    710 bool Vp9UncompressedHeaderParser::ReadFrameSizeFromRefs(Vp9FrameHeader* fhdr) {
    711   bool found_ref = false;
    712   for (const auto& idx : fhdr->ref_frame_idx) {
    713     found_ref = reader_.ReadBool();
    714     if (found_ref) {
    715       const Vp9Parser::ReferenceSlot& ref = context_->GetRefSlot(idx);
    716       DCHECK(ref.initialized);
    717       fhdr->frame_width = ref.frame_width;
    718       fhdr->frame_height = ref.frame_height;
    719 
    720       const unsigned kMaxDimension = 1u << 16;
    721       DCHECK_LE(fhdr->frame_width, kMaxDimension);
    722       DCHECK_LE(fhdr->frame_height, kMaxDimension);
    723       break;
    724     }
    725   }
    726 
    727   if (!found_ref)
    728     ReadFrameSize(fhdr);
    729 
    730   // 7.2.5 Frame size with refs semantics
    731   bool has_valid_ref_frame = false;
    732   for (const auto& idx : fhdr->ref_frame_idx) {
    733     const Vp9Parser::ReferenceSlot& ref = context_->GetRefSlot(idx);
    734     if (2 * fhdr->frame_width >= ref.frame_width &&
    735         2 * fhdr->frame_height >= ref.frame_height &&
    736         fhdr->frame_width <= 16 * ref.frame_width &&
    737         fhdr->frame_height <= 16 * ref.frame_height) {
    738       has_valid_ref_frame = true;
    739       break;
    740     }
    741   }
    742   if (!has_valid_ref_frame) {
    743     DVLOG(1) << "There should be at least one reference frame meeting "
    744              << "size conditions.";
    745     return false;
    746   }
    747 
    748   ReadRenderSize(fhdr);
    749   return true;
    750 }
    751 
    752 // 6.2.7 Interpolation filter syntax
    753 Vp9InterpolationFilter Vp9UncompressedHeaderParser::ReadInterpolationFilter() {
    754   if (reader_.ReadBool())
    755     return Vp9InterpolationFilter::SWITCHABLE;
    756 
    757   // The mapping table for next two bits.
    758   const Vp9InterpolationFilter table[] = {
    759       Vp9InterpolationFilter::EIGHTTAP_SMOOTH, Vp9InterpolationFilter::EIGHTTAP,
    760       Vp9InterpolationFilter::EIGHTTAP_SHARP, Vp9InterpolationFilter::BILINEAR,
    761   };
    762   return table[reader_.ReadLiteral(2)];
    763 }
    764 
    765 void Vp9UncompressedHeaderParser::SetupPastIndependence(Vp9FrameHeader* fhdr) {
    766   memset(&context_->segmentation_, 0, sizeof(context_->segmentation_));
    767   ResetLoopfilter();
    768   fhdr->frame_context = kVp9DefaultFrameContext;
    769   DCHECK(fhdr->frame_context.IsValid());
    770 }
    771 
    772 // 6.2.8 Loop filter params syntax
    773 void Vp9UncompressedHeaderParser::ReadLoopFilterParams() {
    774   Vp9LoopFilterParams& loop_filter = context_->loop_filter_;
    775 
    776   loop_filter.level = reader_.ReadLiteral(6);
    777   loop_filter.sharpness = reader_.ReadLiteral(3);
    778   loop_filter.delta_update = false;
    779 
    780   loop_filter.delta_enabled = reader_.ReadBool();
    781   if (loop_filter.delta_enabled) {
    782     loop_filter.delta_update = reader_.ReadBool();
    783     if (loop_filter.delta_update) {
    784       for (size_t i = 0; i < Vp9RefType::VP9_FRAME_MAX; i++) {
    785         loop_filter.update_ref_deltas[i] = reader_.ReadBool();
    786         if (loop_filter.update_ref_deltas[i])
    787           loop_filter.ref_deltas[i] = reader_.ReadSignedLiteral(6);
    788       }
    789 
    790       for (size_t i = 0; i < Vp9LoopFilterParams::kNumModeDeltas; i++) {
    791         loop_filter.update_mode_deltas[i] = reader_.ReadBool();
    792         if (loop_filter.update_mode_deltas[i])
    793           loop_filter.mode_deltas[i] = reader_.ReadSignedLiteral(6);
    794       }
    795     }
    796   }
    797 }
    798 
    799 // 6.2.9 Quantization params syntax
    800 void Vp9UncompressedHeaderParser::ReadQuantizationParams(
    801     Vp9QuantizationParams* quants) {
    802   quants->base_q_idx = reader_.ReadLiteral(8);
    803 
    804   quants->delta_q_y_dc = ReadDeltaQ();
    805   quants->delta_q_uv_dc = ReadDeltaQ();
    806   quants->delta_q_uv_ac = ReadDeltaQ();
    807 }
    808 
    809 // 6.2.10 Delta quantizer syntax
    810 int8_t Vp9UncompressedHeaderParser::ReadDeltaQ() {
    811   if (reader_.ReadBool())
    812     return reader_.ReadSignedLiteral(4);
    813   return 0;
    814 }
    815 
    816 // 6.2.11 Segmentation params syntax
    817 bool Vp9UncompressedHeaderParser::ReadSegmentationParams() {
    818   Vp9SegmentationParams& segmentation = context_->segmentation_;
    819   segmentation.update_map = false;
    820   segmentation.update_data = false;
    821 
    822   segmentation.enabled = reader_.ReadBool();
    823   if (!segmentation.enabled)
    824     return true;
    825 
    826   segmentation.update_map = reader_.ReadBool();
    827   if (segmentation.update_map) {
    828     for (auto& tree_prob : segmentation.tree_probs) {
    829       tree_prob = ReadProb();
    830     }
    831 
    832     segmentation.temporal_update = reader_.ReadBool();
    833     for (auto& pred_prob : segmentation.pred_probs) {
    834       pred_prob = segmentation.temporal_update ? ReadProb() : kVp9MaxProb;
    835     }
    836   }
    837 
    838   segmentation.update_data = reader_.ReadBool();
    839   if (segmentation.update_data) {
    840     segmentation.abs_or_delta_update = reader_.ReadBool();
    841 
    842     const int kFeatureDataBits[] = {8, 6, 2, 0};
    843     const bool kFeatureDataSigned[] = {true, true, false, false};
    844 
    845     for (size_t i = 0; i < Vp9SegmentationParams::kNumSegments; i++) {
    846       for (size_t j = 0; j < Vp9SegmentationParams::SEG_LVL_MAX; j++) {
    847         int16_t data = 0;
    848         segmentation.feature_enabled[i][j] = reader_.ReadBool();
    849         if (segmentation.feature_enabled[i][j]) {
    850           data = reader_.ReadLiteral(kFeatureDataBits[j]);
    851           if (kFeatureDataSigned[j])
    852             if (reader_.ReadBool()) {
    853               // 7.2.9
    854               if (segmentation.abs_or_delta_update) {
    855                 DVLOG(1) << "feature_sign should be 0"
    856                          << " if abs_or_delta_update is 1";
    857                 return false;
    858               }
    859               data = -data;
    860             }
    861         }
    862         segmentation.feature_data[i][j] = data;
    863       }
    864     }
    865   }
    866   return true;
    867 }
    868 
    869 // 6.2.12 Probability syntax
    870 uint8_t Vp9UncompressedHeaderParser::ReadProb() {
    871   return reader_.ReadBool() ? reader_.ReadLiteral(8) : kVp9MaxProb;
    872 }
    873 
    874 // 6.2.13 Tile info syntax
    875 bool Vp9UncompressedHeaderParser::ReadTileInfo(Vp9FrameHeader* fhdr) {
    876   int sb64_cols = (fhdr->frame_width + 63) / 64;
    877 
    878   int min_log2_tile_cols = GetMinLog2TileCols(sb64_cols);
    879   int max_log2_tile_cols = GetMaxLog2TileCols(sb64_cols);
    880 
    881   int max_ones = max_log2_tile_cols - min_log2_tile_cols;
    882   fhdr->tile_cols_log2 = min_log2_tile_cols;
    883   while (max_ones-- && reader_.ReadBool())
    884     fhdr->tile_cols_log2++;
    885 
    886   fhdr->tile_rows_log2 = reader_.ReadBool() ? 1 : 0;
    887   if (fhdr->tile_rows_log2 > 0 && reader_.ReadBool())
    888     fhdr->tile_rows_log2++;
    889 
    890   // 7.2.11 Tile info semantics
    891   if (fhdr->tile_cols_log2 > 6) {
    892     DVLOG(1) << "tile_cols_log2 should be <= 6";
    893     return false;
    894   }
    895 
    896   return true;
    897 }
    898 
    899 void Vp9UncompressedHeaderParser::ResetLoopfilter() {
    900   Vp9LoopFilterParams& loop_filter = context_->loop_filter_;
    901 
    902   loop_filter.delta_enabled = true;
    903   loop_filter.delta_update = true;
    904 
    905   loop_filter.ref_deltas[VP9_FRAME_INTRA] = 1;
    906   loop_filter.ref_deltas[VP9_FRAME_LAST] = 0;
    907   loop_filter.ref_deltas[VP9_FRAME_GOLDEN] = -1;
    908   loop_filter.ref_deltas[VP9_FRAME_ALTREF] = -1;
    909 
    910   memset(loop_filter.mode_deltas, 0, sizeof(loop_filter.mode_deltas));
    911 }
    912 
    913 // 6.2 Uncompressed header syntax
    914 bool Vp9UncompressedHeaderParser::Parse(const uint8_t* stream,
    915                                         off_t frame_size,
    916                                         Vp9FrameHeader* fhdr) {
    917   DVLOG(2) << "Vp9UncompressedHeaderParser::Parse";
    918   reader_.Initialize(stream, frame_size);
    919 
    920   fhdr->data = stream;
    921   fhdr->frame_size = frame_size;
    922 
    923   // frame marker
    924   if (reader_.ReadLiteral(2) != 0x2) {
    925     DVLOG(1) << "frame marker shall be equal to 2";
    926     return false;
    927   }
    928 
    929   fhdr->profile = ReadProfile();
    930   if (fhdr->profile >= kVp9MaxProfile) {
    931     DVLOG(1) << "Unsupported bitstream profile";
    932     return false;
    933   }
    934 
    935   fhdr->show_existing_frame = reader_.ReadBool();
    936   if (fhdr->show_existing_frame) {
    937     fhdr->frame_to_show_map_idx = reader_.ReadLiteral(3);
    938     fhdr->show_frame = true;
    939 
    940     if (!reader_.ConsumeTrailingBits()) {
    941       DVLOG(1) << "trailing bits are not zero";
    942       return false;
    943     }
    944     if (!reader_.IsValid()) {
    945       DVLOG(1) << "parser reads beyond the end of buffer";
    946       return false;
    947     }
    948     fhdr->uncompressed_header_size = reader_.GetBytesRead();
    949     fhdr->header_size_in_bytes = 0;
    950     return true;
    951   }
    952 
    953   fhdr->frame_type = static_cast<Vp9FrameHeader::FrameType>(reader_.ReadBool());
    954   fhdr->show_frame = reader_.ReadBool();
    955   fhdr->error_resilient_mode = reader_.ReadBool();
    956 
    957   if (fhdr->IsKeyframe()) {
    958     if (!VerifySyncCode())
    959       return false;
    960 
    961     if (!ReadColorConfig(fhdr))
    962       return false;
    963 
    964     ReadFrameSize(fhdr);
    965     ReadRenderSize(fhdr);
    966     fhdr->refresh_frame_flags = 0xff;
    967   } else {
    968     if (!fhdr->show_frame)
    969       fhdr->intra_only = reader_.ReadBool();
    970 
    971     if (!fhdr->error_resilient_mode)
    972       fhdr->reset_frame_context = reader_.ReadLiteral(2);
    973 
    974     if (fhdr->intra_only) {
    975       if (!VerifySyncCode())
    976         return false;
    977 
    978       if (fhdr->profile > 0) {
    979         if (!ReadColorConfig(fhdr))
    980           return false;
    981       } else {
    982         fhdr->bit_depth = 8;
    983         fhdr->color_space = Vp9ColorSpace::BT_601;
    984         fhdr->subsampling_x = fhdr->subsampling_y = 1;
    985       }
    986 
    987       fhdr->refresh_frame_flags = reader_.ReadLiteral(8);
    988 
    989       ReadFrameSize(fhdr);
    990       ReadRenderSize(fhdr);
    991     } else {
    992       fhdr->refresh_frame_flags = reader_.ReadLiteral(8);
    993 
    994       static_assert(arraysize(fhdr->ref_frame_sign_bias) >=
    995                         Vp9RefType::VP9_FRAME_LAST + kVp9NumRefsPerFrame,
    996                     "ref_frame_sign_bias is not big enough");
    997       for (size_t i = 0; i < kVp9NumRefsPerFrame; i++) {
    998         fhdr->ref_frame_idx[i] = reader_.ReadLiteral(kVp9NumRefFramesLog2);
    999         fhdr->ref_frame_sign_bias[Vp9RefType::VP9_FRAME_LAST + i] =
   1000             reader_.ReadBool();
   1001 
   1002         // 8.2 Frame order constraints
   1003         // ref_frame_idx[i] refers to an earlier decoded frame.
   1004         const Vp9Parser::ReferenceSlot& ref =
   1005             context_->GetRefSlot(fhdr->ref_frame_idx[i]);
   1006         if (!ref.initialized) {
   1007           DVLOG(1) << "ref_frame_idx[" << i
   1008                    << "]=" << static_cast<int>(fhdr->ref_frame_idx[i])
   1009                    << " refers to unused frame";
   1010           return false;
   1011         }
   1012 
   1013         // 7.2 Uncompressed header semantics
   1014         // the selected reference frames match the current frame in bit depth,
   1015         // profile, chroma subsampling, and color space.
   1016         if (ref.profile != fhdr->profile) {
   1017           DVLOG(1) << "profile of referenced frame mismatch";
   1018           return false;
   1019         }
   1020         if (i == 0) {
   1021           // Below fields are not specified for inter-frame in header, so copy
   1022           // them from referenced frame.
   1023           fhdr->bit_depth = ref.bit_depth;
   1024           fhdr->color_space = ref.color_space;
   1025           fhdr->subsampling_x = ref.subsampling_x;
   1026           fhdr->subsampling_y = ref.subsampling_y;
   1027         } else {
   1028           if (fhdr->bit_depth != ref.bit_depth) {
   1029             DVLOG(1) << "bit_depth of referenced frame mismatch";
   1030             return false;
   1031           }
   1032           if (fhdr->color_space != ref.color_space) {
   1033             DVLOG(1) << "color_space of referenced frame mismatch";
   1034             return false;
   1035           }
   1036           if (fhdr->subsampling_x != ref.subsampling_x ||
   1037               fhdr->subsampling_y != ref.subsampling_y) {
   1038             DVLOG(1) << "chroma subsampling of referenced frame mismatch";
   1039             return false;
   1040           }
   1041         }
   1042       }
   1043 
   1044       if (!ReadFrameSizeFromRefs(fhdr))
   1045         return false;
   1046 
   1047       fhdr->allow_high_precision_mv = reader_.ReadBool();
   1048       fhdr->interpolation_filter = ReadInterpolationFilter();
   1049     }
   1050   }
   1051 
   1052   if (fhdr->error_resilient_mode) {
   1053     fhdr->refresh_frame_context = false;
   1054     fhdr->frame_parallel_decoding_mode = true;
   1055   } else {
   1056     fhdr->refresh_frame_context = reader_.ReadBool();
   1057     fhdr->frame_parallel_decoding_mode = reader_.ReadBool();
   1058   }
   1059 
   1060   fhdr->frame_context_idx_to_save_probs = fhdr->frame_context_idx =
   1061       reader_.ReadLiteral(kVp9NumFrameContextsLog2);
   1062 
   1063   if (fhdr->IsIntra()) {
   1064     SetupPastIndependence(fhdr);
   1065     if (fhdr->IsKeyframe() || fhdr->error_resilient_mode ||
   1066         fhdr->reset_frame_context == 3) {
   1067       for (size_t i = 0; i < kVp9NumFrameContexts; ++i)
   1068         context_->UpdateFrameContext(i, fhdr->frame_context);
   1069     } else if (fhdr->reset_frame_context == 2) {
   1070       context_->UpdateFrameContext(fhdr->frame_context_idx,
   1071                                    fhdr->frame_context);
   1072     }
   1073     fhdr->frame_context_idx = 0;
   1074   }
   1075 
   1076   ReadLoopFilterParams();
   1077   ReadQuantizationParams(&fhdr->quant_params);
   1078   if (!ReadSegmentationParams())
   1079     return false;
   1080 
   1081   if (!ReadTileInfo(fhdr))
   1082     return false;
   1083 
   1084   fhdr->header_size_in_bytes = reader_.ReadLiteral(16);
   1085   if (fhdr->header_size_in_bytes == 0) {
   1086     DVLOG(1) << "invalid header size";
   1087     return false;
   1088   }
   1089 
   1090   if (!reader_.ConsumeTrailingBits()) {
   1091     DVLOG(1) << "trailing bits are not zero";
   1092     return false;
   1093   }
   1094   if (!reader_.IsValid()) {
   1095     DVLOG(1) << "parser reads beyond the end of buffer";
   1096     return false;
   1097   }
   1098   fhdr->uncompressed_header_size = reader_.GetBytesRead();
   1099 
   1100   return true;
   1101 }
   1102 
   1103 }  // namespace media
   1104