Home | History | Annotate | Download | only in omx
      1 /**************************************************************************
      2  *
      3  * Copyright 2016 Advanced Micro Devices, Inc.
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 #include "pipe/p_video_codec.h"
     29 #include "util/u_memory.h"
     30 #include "util/u_video.h"
     31 #include "vl/vl_rbsp.h"
     32 
     33 #include "entrypoint.h"
     34 #include "vid_dec.h"
     35 
     36 #define DPB_MAX_SIZE 32
     37 #define MAX_NUM_REF_PICS 16
     38 
     39 enum {
     40    NAL_UNIT_TYPE_TRAIL_N = 0,
     41    NAL_UNIT_TYPE_TRAIL_R = 1,
     42    NAL_UNIT_TYPE_TSA_N = 2,
     43    NAL_UNIT_TYPE_TSA_R = 3,
     44    NAL_UNIT_TYPE_STSA_N = 4,
     45    NAL_UNIT_TYPE_STSA_R = 5,
     46    NAL_UNIT_TYPE_RADL_N = 6,
     47    NAL_UNIT_TYPE_RADL_R = 7,
     48    NAL_UNIT_TYPE_RASL_N = 8,
     49    NAL_UNIT_TYPE_RASL_R = 9,
     50    NAL_UNIT_TYPE_BLA_W_LP = 16,
     51    NAL_UNIT_TYPE_BLA_W_RADL = 17,
     52    NAL_UNIT_TYPE_BLA_N_LP =  18,
     53    NAL_UNIT_TYPE_IDR_W_RADL = 19,
     54    NAL_UNIT_TYPE_IDR_N_LP = 20,
     55    NAL_UNIT_TYPE_CRA = 21,
     56    NAL_UNIT_TYPE_SPS = 33,
     57    NAL_UNIT_TYPE_PPS = 34,
     58 };
     59 
     60 static const uint8_t Default_8x8_Intra[64] = {
     61    16, 16, 16, 16, 17, 18, 21, 24,
     62    16, 16, 16, 16, 17, 19, 22, 25,
     63    16, 16, 17, 18, 20, 22, 25, 29,
     64    16, 16, 18, 21, 24, 27, 31, 36,
     65    17, 17, 20, 24, 30, 35, 41, 47,
     66    18, 19, 22, 27, 35, 44, 54, 65,
     67    21, 22, 25, 31, 41, 54, 70, 88,
     68    24, 25, 29, 36, 47, 65, 88, 115
     69 };
     70 
     71 static const uint8_t Default_8x8_Inter[64] = {
     72    16, 16, 16, 16, 17, 18, 20, 24,
     73    16, 16, 16, 17, 18, 20, 24, 25,
     74    16, 16, 17, 18, 20, 24, 25, 28,
     75    16, 17, 18, 20, 24, 25, 28, 33,
     76    17, 18, 20, 24, 25, 28, 33, 41,
     77    18, 20, 24, 25, 28, 33, 41, 54,
     78    20, 24, 25, 28, 33, 41, 54, 71,
     79    24, 25, 28, 33, 41, 54, 71, 91
     80 };
     81 
     82 struct dpb_list {
     83    struct list_head list;
     84    struct pipe_video_buffer *buffer;
     85    OMX_TICKS timestamp;
     86    unsigned poc;
     87 };
     88 
     89 struct ref_pic_set {
     90   unsigned  num_pics;
     91   unsigned  num_neg_pics;
     92   unsigned  num_pos_pics;
     93   unsigned  num_delta_poc;
     94   int  delta_poc[MAX_NUM_REF_PICS];
     95   bool used[MAX_NUM_REF_PICS];
     96 };
     97 
     98 static bool is_idr_picture(unsigned nal_unit_type)
     99 {
    100    return (nal_unit_type == NAL_UNIT_TYPE_IDR_W_RADL ||
    101            nal_unit_type == NAL_UNIT_TYPE_IDR_N_LP);
    102 }
    103 
    104 /* broken link access picture */
    105 static bool is_bla_picture(unsigned nal_unit_type)
    106 {
    107    return (nal_unit_type == NAL_UNIT_TYPE_BLA_W_LP ||
    108            nal_unit_type == NAL_UNIT_TYPE_BLA_W_RADL ||
    109            nal_unit_type == NAL_UNIT_TYPE_BLA_N_LP);
    110 }
    111 
    112 /* random access point picture */
    113 static bool is_rap_picture(unsigned nal_unit_type)
    114 {
    115    return (nal_unit_type >= NAL_UNIT_TYPE_BLA_W_LP &&
    116            nal_unit_type <= NAL_UNIT_TYPE_CRA);
    117 }
    118 
    119 static bool is_slice_picture(unsigned nal_unit_type)
    120 {
    121    return (nal_unit_type <= NAL_UNIT_TYPE_RASL_R ||
    122            is_rap_picture(nal_unit_type));
    123 }
    124 
    125 static void set_poc(vid_dec_PrivateType *priv,
    126                     unsigned nal_unit_type, int i)
    127 {
    128    priv->picture.h265.CurrPicOrderCntVal = i;
    129 
    130    if (priv->codec_data.h265.temporal_id == 0 &&
    131        (nal_unit_type == NAL_UNIT_TYPE_TRAIL_R ||
    132         nal_unit_type == NAL_UNIT_TYPE_TSA_R ||
    133         nal_unit_type == NAL_UNIT_TYPE_STSA_R ||
    134         is_rap_picture(nal_unit_type)))
    135       priv->codec_data.h265.slice_prev_poc = i;
    136 }
    137 
    138 static unsigned get_poc(vid_dec_PrivateType *priv)
    139 {
    140    return priv->picture.h265.CurrPicOrderCntVal;
    141 }
    142 
    143 static void profile_tier(struct vl_rbsp *rbsp)
    144 {
    145    int i;
    146 
    147    /* general_profile_space */
    148    vl_rbsp_u(rbsp, 2);
    149 
    150    /* general_tier_flag */
    151    vl_rbsp_u(rbsp, 1);
    152 
    153    /* general_profile_idc */
    154    vl_rbsp_u(rbsp, 5);
    155 
    156    /* general_profile_compatibility_flag */
    157    for(i = 0; i < 32; ++i)
    158       vl_rbsp_u(rbsp, 1);
    159 
    160    /* general_progressive_source_flag */
    161    vl_rbsp_u(rbsp, 1);
    162 
    163    /* general_interlaced_source_flag */
    164    vl_rbsp_u(rbsp, 1);
    165 
    166    /* general_non_packed_constraint_flag */
    167    vl_rbsp_u(rbsp, 1);
    168 
    169    /* general_frame_only_constraint_flag */
    170    vl_rbsp_u(rbsp, 1);
    171 
    172    /* general_reserved_zero_44bits */
    173    vl_rbsp_u(rbsp, 16);
    174    vl_rbsp_u(rbsp, 16);
    175    vl_rbsp_u(rbsp, 12);
    176 }
    177 
    178 static unsigned profile_tier_level(struct vl_rbsp *rbsp,
    179                                    int max_sublayers_minus1)
    180 {
    181    bool sub_layer_profile_present_flag[6];
    182    bool sub_layer_level_present_flag[6];
    183    unsigned level_idc;
    184    int i;
    185 
    186    profile_tier(rbsp);
    187 
    188    /* general_level_idc */
    189    level_idc = vl_rbsp_u(rbsp, 8);
    190 
    191    for (i = 0; i < max_sublayers_minus1; ++i) {
    192       sub_layer_profile_present_flag[i] = vl_rbsp_u(rbsp, 1);
    193       sub_layer_level_present_flag[i] = vl_rbsp_u(rbsp, 1);
    194    }
    195 
    196    if (max_sublayers_minus1 > 0)
    197       for (i = max_sublayers_minus1; i < 8; ++i)
    198          /* reserved_zero_2bits */
    199          vl_rbsp_u(rbsp, 2);
    200 
    201    for (i = 0; i < max_sublayers_minus1; ++i) {
    202       if (sub_layer_profile_present_flag[i])
    203          profile_tier(rbsp);
    204 
    205       if (sub_layer_level_present_flag[i])
    206          /* sub_layer_level_idc */
    207          vl_rbsp_u(rbsp, 8);
    208    }
    209 
    210    return level_idc;
    211 }
    212 
    213 static void scaling_list_data(vid_dec_PrivateType *priv,
    214                               struct vl_rbsp *rbsp, struct pipe_h265_sps *sps)
    215 {
    216    unsigned size_id, matrix_id;
    217    unsigned scaling_list_len[4] = { 16, 64, 64, 64 };
    218    uint8_t scaling_list4x4[6][64] = {  };
    219    int i;
    220 
    221    uint8_t (*scaling_list_data[4])[6][64] = {
    222         (uint8_t (*)[6][64])scaling_list4x4,
    223         (uint8_t (*)[6][64])sps->ScalingList8x8,
    224         (uint8_t (*)[6][64])sps->ScalingList16x16,
    225         (uint8_t (*)[6][64])sps->ScalingList32x32
    226    };
    227    uint8_t (*scaling_list_dc_coeff[2])[6] = {
    228       (uint8_t (*)[6])sps->ScalingListDCCoeff16x16,
    229       (uint8_t (*)[6])sps->ScalingListDCCoeff32x32
    230    };
    231 
    232    for (size_id = 0; size_id < 4; ++size_id) {
    233 
    234       for (matrix_id = 0; matrix_id < ((size_id == 3) ? 2 : 6); ++matrix_id) {
    235          bool scaling_list_pred_mode_flag = vl_rbsp_u(rbsp, 1);
    236 
    237          if (!scaling_list_pred_mode_flag) {
    238             /* scaling_list_pred_matrix_id_delta */;
    239             unsigned matrix_id_with_delta = matrix_id - vl_rbsp_ue(rbsp);
    240 
    241             if (matrix_id != matrix_id_with_delta) {
    242                memcpy((*scaling_list_data[size_id])[matrix_id],
    243                       (*scaling_list_data[size_id])[matrix_id_with_delta],
    244                       scaling_list_len[size_id]);
    245                if (size_id > 1)
    246                   (*scaling_list_dc_coeff[size_id - 2])[matrix_id] =
    247                      (*scaling_list_dc_coeff[size_id - 2])[matrix_id_with_delta];
    248             } else {
    249                const uint8_t *d;
    250 
    251                if (size_id == 0)
    252                   memset((*scaling_list_data[0])[matrix_id], 16, 16);
    253                else {
    254                   if (size_id < 3)
    255                      d = (matrix_id < 3) ? Default_8x8_Intra : Default_8x8_Inter;
    256                   else
    257                      d = (matrix_id < 1) ? Default_8x8_Intra : Default_8x8_Inter;
    258                   memcpy((*scaling_list_data[size_id])[matrix_id], d,
    259                          scaling_list_len[size_id]);
    260                }
    261                if (size_id > 1)
    262                   (*scaling_list_dc_coeff[size_id - 2])[matrix_id] = 16;
    263             }
    264          } else {
    265             int next_coef = 8;
    266             int coef_num = MIN2(64, (1 << (4 + (size_id << 1))));
    267 
    268             if (size_id > 1) {
    269                /* scaling_list_dc_coef_minus8 */
    270                next_coef = vl_rbsp_se(rbsp) + 8;
    271                (*scaling_list_dc_coeff[size_id - 2])[matrix_id] = next_coef;
    272             }
    273 
    274             for (i = 0; i < coef_num; ++i) {
    275                /* scaling_list_delta_coef */
    276                next_coef = (next_coef + vl_rbsp_se(rbsp) + 256) % 256;
    277                (*scaling_list_data[size_id])[matrix_id][i] = next_coef;
    278             }
    279          }
    280       }
    281    }
    282 
    283    for (i = 0; i < 6; ++i)
    284       memcpy(sps->ScalingList4x4[i], scaling_list4x4[i], 16);
    285 
    286    return;
    287 }
    288 
    289 static void st_ref_pic_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
    290                            struct ref_pic_set *rps, struct pipe_h265_sps *sps,
    291                            unsigned idx)
    292 {
    293    bool inter_rps_pred_flag;
    294    unsigned delta_idx_minus1;
    295    int delta_poc;
    296    int i;
    297 
    298    inter_rps_pred_flag = (idx != 0) ? (vl_rbsp_u(rbsp, 1)) : false;
    299 
    300    if (inter_rps_pred_flag) {
    301       struct ref_pic_set *ref_rps;
    302       unsigned sign, abs;
    303       int delta_rps;
    304       bool used;
    305       int j;
    306 
    307       if (idx == sps->num_short_term_ref_pic_sets)
    308          delta_idx_minus1 = vl_rbsp_ue(rbsp);
    309       else
    310          delta_idx_minus1 = 0;
    311 
    312       ref_rps = (struct ref_pic_set *)
    313          priv->codec_data.h265.ref_pic_set_list + idx - (delta_idx_minus1 + 1);
    314 
    315       /* delta_rps_sign */
    316       sign = vl_rbsp_u(rbsp, 1);
    317       /* abs_delta_rps_minus1 */
    318       abs = vl_rbsp_ue(rbsp);
    319       delta_rps = (1 - 2 * sign) * (abs + 1);
    320 
    321       rps->num_neg_pics = 0;
    322       rps->num_pos_pics = 0;
    323       rps->num_pics = 0;
    324 
    325       for(i = 0 ; i <= ref_rps->num_pics; ++i) {
    326          /* used_by_curr_pic_flag */
    327          if (!vl_rbsp_u(rbsp, 1))
    328             /* use_delta_flag */
    329             vl_rbsp_u(rbsp, 1);
    330          else {
    331             delta_poc = delta_rps +
    332                ((i < ref_rps->num_pics)? ref_rps->delta_poc[i] : 0);
    333             rps->delta_poc[rps->num_pics] = delta_poc;
    334             rps->used[rps->num_pics] = true;
    335             if (delta_poc < 0)
    336                rps->num_neg_pics++;
    337             else
    338                rps->num_pos_pics++;
    339             rps->num_pics++;
    340          }
    341       }
    342 
    343       rps->num_delta_poc = ref_rps->num_pics;
    344 
    345       /* sort delta poc */
    346       for (i = 1; i < rps->num_pics; ++i) {
    347          delta_poc = rps->delta_poc[i];
    348          used = rps->used[i];
    349          for (j = i - 1; j >= 0; j--) {
    350             if (delta_poc < rps->delta_poc[j]) {
    351                rps->delta_poc[j + 1] = rps->delta_poc[j];
    352                rps->used[j + 1] = rps->used[j];
    353                rps->delta_poc[j] = delta_poc;
    354                rps->used[j] = used;
    355             }
    356          }
    357       }
    358 
    359       for (i = 0 , j = rps->num_neg_pics - 1;
    360            i < rps->num_neg_pics >> 1; i++, j--) {
    361          delta_poc = rps->delta_poc[i];
    362          used = rps->used[i];
    363          rps->delta_poc[i] = rps->delta_poc[j];
    364          rps->used[i] = rps->used[j];
    365          rps->delta_poc[j] = delta_poc;
    366          rps->used[j] = used;
    367       }
    368    } else {
    369       /* num_negative_pics */
    370       rps->num_neg_pics = vl_rbsp_ue(rbsp);
    371       /* num_positive_pics */
    372       rps->num_pos_pics = vl_rbsp_ue(rbsp);
    373       rps->num_pics = rps->num_neg_pics + rps->num_pos_pics;
    374 
    375       delta_poc = 0;
    376       for(i = 0 ; i < rps->num_neg_pics; ++i) {
    377          /* delta_poc_s0_minus1 */
    378          delta_poc -= (vl_rbsp_ue(rbsp) + 1);
    379          rps->delta_poc[i] = delta_poc;
    380          /* used_by_curr_pic_s0_flag */
    381          rps->used[i] = vl_rbsp_u(rbsp, 1);
    382       }
    383 
    384       delta_poc = 0;
    385       for(i = rps->num_neg_pics; i < rps->num_pics; ++i) {
    386          /* delta_poc_s1_minus1 */
    387          delta_poc += (vl_rbsp_ue(rbsp) + 1);
    388          rps->delta_poc[i] = delta_poc;
    389          /* used_by_curr_pic_s1_flag */
    390          rps->used[i] = vl_rbsp_u(rbsp, 1);
    391       }
    392    }
    393 }
    394 
    395 static struct pipe_h265_sps *seq_parameter_set_id(vid_dec_PrivateType *priv,
    396                                                   struct vl_rbsp *rbsp)
    397 {
    398    unsigned id = vl_rbsp_ue(rbsp);
    399 
    400    if (id >= ARRAY_SIZE(priv->codec_data.h265.sps))
    401       return NULL;
    402 
    403    return &priv->codec_data.h265.sps[id];
    404 }
    405 
    406 static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
    407 {
    408    struct pipe_h265_sps *sps;
    409    int sps_max_sub_layers_minus1;
    410    unsigned i;
    411 
    412    /* sps_video_parameter_set_id */
    413    vl_rbsp_u(rbsp, 4);
    414 
    415    /* sps_max_sub_layers_minus1 */
    416    sps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3);
    417 
    418    assert(sps_max_sub_layers_minus1 <= 6);
    419 
    420    /* sps_temporal_id_nesting_flag */
    421    vl_rbsp_u(rbsp, 1);
    422 
    423    priv->codec_data.h265.level_idc =
    424       profile_tier_level(rbsp, sps_max_sub_layers_minus1);
    425 
    426    sps = seq_parameter_set_id(priv, rbsp);
    427    if (!sps)
    428       return;
    429 
    430    memset(sps, 0, sizeof(*sps));
    431 
    432    sps->chroma_format_idc = vl_rbsp_ue(rbsp);
    433 
    434    if (sps->chroma_format_idc == 3)
    435       sps->separate_colour_plane_flag = vl_rbsp_u(rbsp, 1);
    436 
    437    priv->codec_data.h265.pic_width_in_luma_samples =
    438       sps->pic_width_in_luma_samples = vl_rbsp_ue(rbsp);
    439 
    440    priv->codec_data.h265.pic_height_in_luma_samples =
    441       sps->pic_height_in_luma_samples = vl_rbsp_ue(rbsp);
    442 
    443    /* conformance_window_flag */
    444    if (vl_rbsp_u(rbsp, 1)) {
    445       /* conf_win_left_offset */
    446       vl_rbsp_ue(rbsp);
    447       /* conf_win_right_offset */
    448       vl_rbsp_ue(rbsp);
    449       /* conf_win_top_offset */
    450       vl_rbsp_ue(rbsp);
    451       /* conf_win_bottom_offset */
    452       vl_rbsp_ue(rbsp);
    453    }
    454 
    455    sps->bit_depth_luma_minus8 = vl_rbsp_ue(rbsp);
    456    sps->bit_depth_chroma_minus8 = vl_rbsp_ue(rbsp);
    457    sps->log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp);
    458 
    459    /* sps_sub_layer_ordering_info_present_flag */
    460    i  = vl_rbsp_u(rbsp, 1) ? 0 : sps_max_sub_layers_minus1;
    461    for (; i <= sps_max_sub_layers_minus1; ++i) {
    462       sps->sps_max_dec_pic_buffering_minus1 = vl_rbsp_ue(rbsp);
    463       /* sps_max_num_reorder_pics */
    464       vl_rbsp_ue(rbsp);
    465       /* sps_max_latency_increase_plus */
    466       vl_rbsp_ue(rbsp);
    467    }
    468 
    469    sps->log2_min_luma_coding_block_size_minus3 = vl_rbsp_ue(rbsp);
    470    sps->log2_diff_max_min_luma_coding_block_size = vl_rbsp_ue(rbsp);
    471    sps->log2_min_transform_block_size_minus2 = vl_rbsp_ue(rbsp);
    472    sps->log2_diff_max_min_transform_block_size = vl_rbsp_ue(rbsp);
    473    sps->max_transform_hierarchy_depth_inter = vl_rbsp_ue(rbsp);
    474    sps->max_transform_hierarchy_depth_intra = vl_rbsp_ue(rbsp);
    475 
    476    sps->scaling_list_enabled_flag = vl_rbsp_u(rbsp, 1);
    477    if (sps->scaling_list_enabled_flag)
    478       /* sps_scaling_list_data_present_flag */
    479       if (vl_rbsp_u(rbsp, 1))
    480          scaling_list_data(priv, rbsp, sps);
    481 
    482    sps->amp_enabled_flag = vl_rbsp_u(rbsp, 1);
    483    sps->sample_adaptive_offset_enabled_flag = vl_rbsp_u(rbsp, 1);
    484    sps->pcm_enabled_flag = vl_rbsp_u(rbsp, 1);
    485    if (sps->pcm_enabled_flag) {
    486       sps->pcm_sample_bit_depth_luma_minus1 = vl_rbsp_u(rbsp, 4);
    487       sps->pcm_sample_bit_depth_chroma_minus1 = vl_rbsp_u(rbsp, 4);
    488       sps->log2_min_pcm_luma_coding_block_size_minus3 = vl_rbsp_ue(rbsp);
    489       sps->log2_diff_max_min_pcm_luma_coding_block_size = vl_rbsp_ue(rbsp);
    490       sps->pcm_loop_filter_disabled_flag = vl_rbsp_u(rbsp, 1);
    491    }
    492 
    493    sps->num_short_term_ref_pic_sets = vl_rbsp_ue(rbsp);
    494 
    495    for (i = 0; i < sps->num_short_term_ref_pic_sets; ++i) {
    496       struct ref_pic_set *rps;
    497 
    498       rps = (struct ref_pic_set *)
    499          priv->codec_data.h265.ref_pic_set_list + i;
    500       st_ref_pic_set(priv, rbsp, rps, sps, i);
    501    }
    502 
    503    sps->long_term_ref_pics_present_flag = vl_rbsp_u(rbsp, 1);
    504    if (sps->long_term_ref_pics_present_flag) {
    505       sps->num_long_term_ref_pics_sps = vl_rbsp_ue(rbsp);
    506       for (i = 0; i < sps->num_long_term_ref_pics_sps; ++i) {
    507          /* lt_ref_pic_poc_lsb_sps */
    508          vl_rbsp_u(rbsp, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
    509          /* used_by_curr_pic_lt_sps_flag */
    510          vl_rbsp_u(rbsp, 1);
    511       }
    512    }
    513 
    514    sps->sps_temporal_mvp_enabled_flag = vl_rbsp_u(rbsp, 1);
    515    sps->strong_intra_smoothing_enabled_flag = vl_rbsp_u(rbsp, 1);
    516 }
    517 
    518 static struct pipe_h265_pps *pic_parameter_set_id(vid_dec_PrivateType *priv,
    519                                                   struct vl_rbsp *rbsp)
    520 {
    521    unsigned id = vl_rbsp_ue(rbsp);
    522 
    523    if (id >= ARRAY_SIZE(priv->codec_data.h265.pps))
    524       return NULL;
    525 
    526    return &priv->codec_data.h265.pps[id];
    527 }
    528 
    529 static void picture_parameter_set(vid_dec_PrivateType *priv,
    530                                   struct vl_rbsp *rbsp)
    531 {
    532    struct pipe_h265_sps *sps;
    533    struct pipe_h265_pps *pps;
    534    int i;
    535 
    536    pps = pic_parameter_set_id(priv, rbsp);
    537    if (!pps)
    538       return;
    539 
    540    memset(pps, 0, sizeof(*pps));
    541    sps = pps->sps = seq_parameter_set_id(priv, rbsp);
    542    if (!sps)
    543       return;
    544 
    545    pps->dependent_slice_segments_enabled_flag = vl_rbsp_u(rbsp, 1);
    546    pps->output_flag_present_flag = vl_rbsp_u(rbsp, 1);
    547    pps->num_extra_slice_header_bits = vl_rbsp_u(rbsp, 3);
    548    pps->sign_data_hiding_enabled_flag = vl_rbsp_u(rbsp, 1);
    549    pps->cabac_init_present_flag = vl_rbsp_u(rbsp, 1);
    550 
    551    pps->num_ref_idx_l0_default_active_minus1 = vl_rbsp_ue(rbsp);
    552    pps->num_ref_idx_l1_default_active_minus1 = vl_rbsp_ue(rbsp);
    553    pps->init_qp_minus26 = vl_rbsp_se(rbsp);
    554    pps->constrained_intra_pred_flag = vl_rbsp_u(rbsp, 1);
    555    pps->transform_skip_enabled_flag = vl_rbsp_u(rbsp, 1);
    556 
    557    pps->cu_qp_delta_enabled_flag = vl_rbsp_u(rbsp, 1);
    558    if (pps->cu_qp_delta_enabled_flag)
    559       pps->diff_cu_qp_delta_depth = vl_rbsp_ue(rbsp);
    560 
    561    pps->pps_cb_qp_offset = vl_rbsp_se(rbsp);
    562    pps->pps_cr_qp_offset = vl_rbsp_se(rbsp);
    563    pps->pps_slice_chroma_qp_offsets_present_flag = vl_rbsp_u(rbsp, 1);
    564 
    565    pps->weighted_pred_flag = vl_rbsp_u(rbsp, 1);
    566    pps->weighted_bipred_flag = vl_rbsp_u(rbsp, 1);
    567 
    568    pps->transquant_bypass_enabled_flag = vl_rbsp_u(rbsp, 1);
    569    pps->tiles_enabled_flag = vl_rbsp_u(rbsp, 1);
    570    pps->entropy_coding_sync_enabled_flag = vl_rbsp_u(rbsp, 1);
    571 
    572    if (pps->tiles_enabled_flag) {
    573       pps->num_tile_columns_minus1 = vl_rbsp_ue(rbsp);
    574       pps->num_tile_rows_minus1 = vl_rbsp_ue(rbsp);
    575 
    576       pps->uniform_spacing_flag = vl_rbsp_u(rbsp, 1);
    577       if (!pps->uniform_spacing_flag) {
    578          for (i = 0; i < pps->num_tile_columns_minus1; ++i)
    579             pps->column_width_minus1[i] = vl_rbsp_ue(rbsp);
    580 
    581          for (i = 0; i < pps->num_tile_rows_minus1; ++i)
    582             pps->row_height_minus1[i] = vl_rbsp_ue(rbsp);
    583       }
    584 
    585       if (!pps->num_tile_columns_minus1 || !pps->num_tile_rows_minus1)
    586          pps->loop_filter_across_tiles_enabled_flag = vl_rbsp_u(rbsp, 1);
    587    }
    588 
    589    pps->pps_loop_filter_across_slices_enabled_flag = vl_rbsp_u(rbsp, 1);
    590 
    591    pps->deblocking_filter_control_present_flag = vl_rbsp_u(rbsp, 1);
    592    if (pps->deblocking_filter_control_present_flag) {
    593       pps->deblocking_filter_override_enabled_flag = vl_rbsp_u(rbsp, 1);
    594       pps->pps_deblocking_filter_disabled_flag = vl_rbsp_u(rbsp, 1);
    595       if (!pps->pps_deblocking_filter_disabled_flag) {
    596          pps->pps_beta_offset_div2 = vl_rbsp_se(rbsp);
    597          pps->pps_tc_offset_div2 = vl_rbsp_se(rbsp);
    598       }
    599    }
    600 
    601    /* pps_scaling_list_data_present_flag */
    602    if (vl_rbsp_u(rbsp, 1))
    603       scaling_list_data(priv, rbsp, sps);
    604 
    605    pps->lists_modification_present_flag = vl_rbsp_u(rbsp, 1);
    606    pps->log2_parallel_merge_level_minus2 = vl_rbsp_ue(rbsp);
    607    pps->slice_segment_header_extension_present_flag = vl_rbsp_u(rbsp, 1);
    608 }
    609 
    610 static void vid_dec_h265_BeginFrame(vid_dec_PrivateType *priv)
    611 {
    612    if (priv->frame_started)
    613       return;
    614 
    615    if (!priv->codec) {
    616       struct pipe_video_codec templat = {};
    617       omx_base_video_PortType *port = (omx_base_video_PortType *)
    618          priv->ports[OMX_BASE_FILTER_INPUTPORT_INDEX];
    619 
    620       templat.profile = priv->profile;
    621       templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
    622       templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
    623       templat.expect_chunked_decode = true;
    624       templat.width = priv->codec_data.h265.pic_width_in_luma_samples;
    625       templat.height = priv->codec_data.h265.pic_height_in_luma_samples;
    626       templat.level =  priv->codec_data.h265.level_idc;
    627       priv->codec = priv->pipe->create_video_codec(priv->pipe, &templat);
    628 
    629       /* disable transcode tunnel if video size is different from coded size */
    630       if (priv->codec_data.h265.pic_width_in_luma_samples !=
    631           port->sPortParam.format.video.nFrameWidth ||
    632           priv->codec_data.h265.pic_height_in_luma_samples !=
    633           port->sPortParam.format.video.nFrameHeight)
    634          priv->disable_tunnel = true;
    635    }
    636 
    637    vid_dec_NeedTarget(priv);
    638 
    639    if (priv->first_buf_in_frame)
    640       priv->timestamp = priv->timestamps[0];
    641    priv->first_buf_in_frame = false;
    642 
    643    priv->codec->begin_frame(priv->codec, priv->target, &priv->picture.base);
    644    priv->frame_started = true;
    645 }
    646 
    647 static struct pipe_video_buffer *vid_dec_h265_Flush(vid_dec_PrivateType *priv,
    648                                                     OMX_TICKS *timestamp)
    649 {
    650    struct dpb_list *entry, *result = NULL;
    651    struct pipe_video_buffer *buf;
    652 
    653    /* search for the lowest poc and break on zeros */
    654    LIST_FOR_EACH_ENTRY(entry, &priv->codec_data.h265.dpb_list, list) {
    655 
    656       if (result && entry->poc == 0)
    657          break;
    658 
    659       if (!result || entry->poc < result->poc)
    660          result = entry;
    661    }
    662 
    663    if (!result)
    664       return NULL;
    665 
    666    buf = result->buffer;
    667    if (timestamp)
    668       *timestamp = result->timestamp;
    669 
    670    --priv->codec_data.h265.dpb_num;
    671    LIST_DEL(&result->list);
    672    FREE(result);
    673 
    674    return buf;
    675 }
    676 
    677 static void vid_dec_h265_EndFrame(vid_dec_PrivateType *priv)
    678 {
    679    struct dpb_list *entry = NULL;
    680    struct pipe_video_buffer *tmp;
    681    struct ref_pic_set *rps;
    682    int i;
    683    OMX_TICKS timestamp;
    684 
    685    if (!priv->frame_started)
    686       return;
    687 
    688    priv->picture.h265.NumPocStCurrBefore = 0;
    689    priv->picture.h265.NumPocStCurrAfter = 0;
    690    memset(priv->picture.h265.RefPicSetStCurrBefore, 0, 8);
    691    memset(priv->picture.h265.RefPicSetStCurrAfter, 0, 8);
    692    for (i = 0; i < MAX_NUM_REF_PICS; ++i) {
    693       priv->picture.h265.ref[i] = NULL;
    694       priv->picture.h265.PicOrderCntVal[i] = 0;
    695    }
    696 
    697    rps = priv->codec_data.h265.rps;
    698 
    699    if (rps) {
    700       unsigned bf = 0, af = 0;
    701 
    702       priv->picture.h265.NumDeltaPocsOfRefRpsIdx = rps->num_delta_poc;
    703       for (i = 0; i < rps->num_pics; ++i) {
    704          priv->picture.h265.PicOrderCntVal[i] =
    705             rps->delta_poc[i] + get_poc(priv);
    706 
    707          LIST_FOR_EACH_ENTRY(entry, &priv->codec_data.h265.dpb_list, list) {
    708             if (entry->poc == priv->picture.h265.PicOrderCntVal[i]) {
    709                priv->picture.h265.ref[i] = entry->buffer;
    710                break;
    711             }
    712          }
    713 
    714          if (rps->used[i]) {
    715             if (i < rps->num_neg_pics) {
    716                priv->picture.h265.NumPocStCurrBefore++;
    717                priv->picture.h265.RefPicSetStCurrBefore[bf++] = i;
    718             } else {
    719                priv->picture.h265.NumPocStCurrAfter++;
    720                priv->picture.h265.RefPicSetStCurrAfter[af++] = i;
    721             }
    722          }
    723       }
    724    }
    725 
    726    priv->codec->end_frame(priv->codec, priv->target, &priv->picture.base);
    727    priv->frame_started = false;
    728 
    729    /* add the decoded picture to the dpb list */
    730    entry = CALLOC_STRUCT(dpb_list);
    731    if (!entry)
    732       return;
    733 
    734    priv->first_buf_in_frame = true;
    735    entry->buffer = priv->target;
    736    entry->timestamp = priv->timestamp;
    737    entry->poc = get_poc(priv);
    738 
    739    LIST_ADDTAIL(&entry->list, &priv->codec_data.h265.dpb_list);
    740    ++priv->codec_data.h265.dpb_num;
    741    priv->target = NULL;
    742 
    743    if (priv->codec_data.h265.dpb_num <= DPB_MAX_SIZE)
    744       return;
    745 
    746    tmp = priv->in_buffers[0]->pInputPortPrivate;
    747    priv->in_buffers[0]->pInputPortPrivate = vid_dec_h265_Flush(priv, &timestamp);
    748    priv->in_buffers[0]->nTimeStamp = timestamp;
    749    priv->target = tmp;
    750    priv->frame_finished = priv->in_buffers[0]->pInputPortPrivate != NULL;
    751    if (priv->frame_finished &&
    752        (priv->in_buffers[0]->nFlags & OMX_BUFFERFLAG_EOS))
    753       FREE(priv->codec_data.h265.ref_pic_set_list);
    754 }
    755 
    756 static void slice_header(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
    757                          unsigned nal_unit_type)
    758 {
    759    struct pipe_h265_pps *pps;
    760    struct pipe_h265_sps *sps;
    761    bool first_slice_segment_in_pic_flag;
    762    bool dependent_slice_segment_flag = false;
    763    struct ref_pic_set *rps;
    764    unsigned poc_lsb, poc_msb, slice_prev_poc;
    765    unsigned max_poc_lsb, prev_poc_lsb, prev_poc_msb;
    766    unsigned num_st_rps;
    767    int i;
    768 
    769    if (priv->picture.h265.IDRPicFlag != is_idr_picture(nal_unit_type))
    770       vid_dec_h265_EndFrame(priv);
    771 
    772    priv->picture.h265.IDRPicFlag = is_idr_picture(nal_unit_type);
    773 
    774    first_slice_segment_in_pic_flag = vl_rbsp_u(rbsp, 1);
    775 
    776    if (is_rap_picture(nal_unit_type))
    777       /* no_output_of_prior_pics_flag */
    778       vl_rbsp_u(rbsp, 1);
    779 
    780    pps = pic_parameter_set_id(priv, rbsp);
    781    if (!pps)
    782       return;
    783 
    784    sps = pps->sps;
    785    if (!sps)
    786       return;
    787 
    788    if (pps != priv->picture.h265.pps)
    789       vid_dec_h265_EndFrame(priv);
    790 
    791    priv->picture.h265.pps = pps;
    792 
    793    if (priv->picture.h265.RAPPicFlag != is_rap_picture(nal_unit_type))
    794       vid_dec_h265_EndFrame(priv);
    795    priv->picture.h265.RAPPicFlag = is_rap_picture(nal_unit_type);
    796 
    797    num_st_rps = sps->num_short_term_ref_pic_sets;
    798 
    799    if (priv->picture.h265.CurrRpsIdx != num_st_rps)
    800       vid_dec_h265_EndFrame(priv);
    801    priv->picture.h265.CurrRpsIdx = num_st_rps;
    802 
    803    if (!first_slice_segment_in_pic_flag) {
    804       int size, num;
    805       int bits_slice_segment_address = 0;
    806 
    807       if (pps->dependent_slice_segments_enabled_flag)
    808          dependent_slice_segment_flag = vl_rbsp_u(rbsp, 1);
    809 
    810       size = 1 << (sps->log2_min_luma_coding_block_size_minus3 + 3 +
    811                    sps->log2_diff_max_min_luma_coding_block_size);
    812 
    813       num = ((sps->pic_width_in_luma_samples + size - 1) / size) *
    814             ((sps->pic_height_in_luma_samples + size - 1) / size);
    815 
    816       while (num > (1 << bits_slice_segment_address))
    817          bits_slice_segment_address++;
    818 
    819       /* slice_segment_address */
    820       vl_rbsp_u(rbsp, bits_slice_segment_address);
    821    }
    822 
    823    if (dependent_slice_segment_flag)
    824       return;
    825 
    826    for (i = 0; i < pps->num_extra_slice_header_bits; ++i)
    827       /* slice_reserved_flag */
    828       vl_rbsp_u(rbsp, 1);
    829 
    830    /* slice_type */
    831    vl_rbsp_ue(rbsp);
    832 
    833    if (pps->output_flag_present_flag)
    834       /* pic output flag */
    835       vl_rbsp_u(rbsp, 1);
    836 
    837    if (sps->separate_colour_plane_flag)
    838       /* colour_plane_id */
    839       vl_rbsp_u(rbsp, 2);
    840 
    841    if (is_idr_picture(nal_unit_type)) {
    842       set_poc(priv, nal_unit_type, 0);
    843       return;
    844    }
    845 
    846    /* slice_pic_order_cnt_lsb */
    847    poc_lsb =
    848       vl_rbsp_u(rbsp, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
    849 
    850    slice_prev_poc = (int)priv->codec_data.h265.slice_prev_poc;
    851    max_poc_lsb = 1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
    852 
    853    prev_poc_lsb = slice_prev_poc & (max_poc_lsb - 1);
    854    prev_poc_msb = slice_prev_poc - prev_poc_lsb;
    855 
    856    if ((poc_lsb < prev_poc_lsb) &&
    857        ((prev_poc_lsb - poc_lsb ) >= (max_poc_lsb / 2)))
    858       poc_msb = prev_poc_msb + max_poc_lsb;
    859 
    860    else if ((poc_lsb > prev_poc_lsb ) &&
    861             ((poc_lsb - prev_poc_lsb) > (max_poc_lsb / 2)))
    862       poc_msb = prev_poc_msb - max_poc_lsb;
    863 
    864    else
    865       poc_msb = prev_poc_msb;
    866 
    867    if (is_bla_picture(nal_unit_type))
    868       poc_msb = 0;
    869 
    870    if (get_poc(priv) != poc_msb + poc_lsb)
    871       vid_dec_h265_EndFrame(priv);
    872 
    873    set_poc(priv, nal_unit_type, (poc_msb + poc_lsb));
    874 
    875    /* short_term_ref_pic_set_sps_flag */
    876    if (!vl_rbsp_u(rbsp, 1)) {
    877       rps = (struct ref_pic_set *)
    878          priv->codec_data.h265.ref_pic_set_list + num_st_rps;
    879       st_ref_pic_set(priv, rbsp, rps, sps, num_st_rps);
    880 
    881    } else if (num_st_rps > 1) {
    882       int num_bits = 0;
    883       unsigned idx;
    884 
    885       while ((1 << num_bits) < num_st_rps)
    886          num_bits++;
    887 
    888       if (num_bits > 0)
    889          /* short_term_ref_pic_set_idx */
    890          idx = vl_rbsp_u(rbsp, num_bits);
    891       else
    892          idx = 0;
    893 
    894       rps = (struct ref_pic_set *)
    895          priv->codec_data.h265.ref_pic_set_list + idx;
    896    } else
    897       rps = (struct ref_pic_set *)
    898          priv->codec_data.h265.ref_pic_set_list;
    899 
    900    if (is_bla_picture(nal_unit_type)) {
    901       rps->num_neg_pics = 0;
    902       rps->num_pos_pics = 0;
    903       rps->num_pics = 0;
    904    }
    905 
    906    priv->codec_data.h265.rps = rps;
    907 
    908    return;
    909 }
    910 
    911 static void vid_dec_h265_Decode(vid_dec_PrivateType *priv,
    912                                 struct vl_vlc *vlc,
    913                                 unsigned min_bits_left)
    914 {
    915    unsigned nal_unit_type;
    916    unsigned nuh_layer_id;
    917    unsigned nuh_temporal_id_plus1;
    918 
    919    if (!vl_vlc_search_byte(vlc, vl_vlc_bits_left(vlc) - min_bits_left, 0x00))
    920       return;
    921 
    922    if (vl_vlc_peekbits(vlc, 24) != 0x000001) {
    923       vl_vlc_eatbits(vlc, 8);
    924       return;
    925    }
    926 
    927    if (priv->slice) {
    928       unsigned bytes = priv->bytes_left - (vl_vlc_bits_left(vlc) / 8);
    929 
    930       priv->codec->decode_bitstream(priv->codec, priv->target,
    931                                     &priv->picture.base, 1,
    932                                     &priv->slice, &bytes);
    933       priv->slice = NULL;
    934    }
    935 
    936    vl_vlc_eatbits(vlc, 24);
    937 
    938    /* forbidden_zero_bit */
    939    vl_vlc_eatbits(vlc, 1);
    940 
    941    if (vl_vlc_valid_bits(vlc) < 15)
    942       vl_vlc_fillbits(vlc);
    943 
    944    nal_unit_type = vl_vlc_get_uimsbf(vlc, 6);
    945 
    946    /* nuh_layer_id */
    947    nuh_layer_id = vl_vlc_get_uimsbf(vlc, 6);
    948 
    949    /* nuh_temporal_id_plus1 */
    950    nuh_temporal_id_plus1 = vl_vlc_get_uimsbf(vlc, 3);
    951    priv->codec_data.h265.temporal_id = nuh_temporal_id_plus1 - 1;
    952 
    953    if (!is_slice_picture(nal_unit_type))
    954       vid_dec_h265_EndFrame(priv);
    955 
    956    if (nal_unit_type == NAL_UNIT_TYPE_SPS) {
    957       struct vl_rbsp rbsp;
    958 
    959       vl_rbsp_init(&rbsp, vlc, ~0);
    960       seq_parameter_set(priv, &rbsp);
    961 
    962    } else if (nal_unit_type == NAL_UNIT_TYPE_PPS) {
    963       struct vl_rbsp rbsp;
    964 
    965       vl_rbsp_init(&rbsp, vlc, ~0);
    966       picture_parameter_set(priv, &rbsp);
    967 
    968    } else if (is_slice_picture(nal_unit_type)) {
    969       unsigned bits = vl_vlc_valid_bits(vlc);
    970       unsigned bytes = bits / 8 + 5;
    971       struct vl_rbsp rbsp;
    972       uint8_t buf[9];
    973       const void *ptr = buf;
    974       unsigned i;
    975 
    976       buf[0] = 0x0;
    977       buf[1] = 0x0;
    978       buf[2] = 0x1;
    979       buf[3] = nal_unit_type << 1 | nuh_layer_id >> 5;
    980       buf[4] = nuh_layer_id << 3 | nuh_temporal_id_plus1;
    981       for (i = 5; i < bytes; ++i)
    982          buf[i] = vl_vlc_peekbits(vlc, bits) >> ((bytes - i - 1) * 8);
    983 
    984       priv->bytes_left = (vl_vlc_bits_left(vlc) - bits) / 8;
    985       priv->slice = vlc->data;
    986 
    987       vl_rbsp_init(&rbsp, vlc, 128);
    988       slice_header(priv, &rbsp, nal_unit_type);
    989 
    990       vid_dec_h265_BeginFrame(priv);
    991 
    992       priv->codec->decode_bitstream(priv->codec, priv->target,
    993                                     &priv->picture.base, 1,
    994                                     &ptr, &bytes);
    995    }
    996 
    997    /* resync to byte boundary */
    998    vl_vlc_eatbits(vlc, vl_vlc_valid_bits(vlc) % 8);
    999 }
   1000 
   1001 void vid_dec_h265_Init(vid_dec_PrivateType *priv)
   1002 {
   1003    priv->picture.base.profile = PIPE_VIDEO_PROFILE_HEVC_MAIN;
   1004 
   1005    LIST_INITHEAD(&priv->codec_data.h265.dpb_list);
   1006    priv->codec_data.h265.ref_pic_set_list = (struct ref_pic_set *)
   1007       CALLOC(MAX_NUM_REF_PICS, sizeof(struct ref_pic_set));
   1008 
   1009    priv->Decode = vid_dec_h265_Decode;
   1010    priv->EndFrame = vid_dec_h265_EndFrame;
   1011    priv->Flush = vid_dec_h265_Flush;
   1012    priv->first_buf_in_frame = true;
   1013 }
   1014