Path: blob/21.2-virgl/src/gallium/frontends/omx/bellagio/vid_dec_h265.c
4565 views
/**************************************************************************1*2* Copyright 2016 Advanced Micro Devices, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS18* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.20* IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR21* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/2627#include "pipe/p_video_codec.h"28#include "util/u_memory.h"29#include "util/u_video.h"30#include "vl/vl_rbsp.h"3132#include "entrypoint.h"33#include "vid_dec.h"3435#define DPB_MAX_SIZE 3236#define MAX_NUM_REF_PICS 163738enum {39NAL_UNIT_TYPE_TRAIL_N = 0,40NAL_UNIT_TYPE_TRAIL_R = 1,41NAL_UNIT_TYPE_TSA_N = 2,42NAL_UNIT_TYPE_TSA_R = 3,43NAL_UNIT_TYPE_STSA_N = 4,44NAL_UNIT_TYPE_STSA_R = 5,45NAL_UNIT_TYPE_RADL_N = 6,46NAL_UNIT_TYPE_RADL_R = 7,47NAL_UNIT_TYPE_RASL_N = 8,48NAL_UNIT_TYPE_RASL_R = 9,49NAL_UNIT_TYPE_BLA_W_LP = 16,50NAL_UNIT_TYPE_BLA_W_RADL = 17,51NAL_UNIT_TYPE_BLA_N_LP = 18,52NAL_UNIT_TYPE_IDR_W_RADL = 19,53NAL_UNIT_TYPE_IDR_N_LP = 20,54NAL_UNIT_TYPE_CRA = 21,55NAL_UNIT_TYPE_SPS = 33,56NAL_UNIT_TYPE_PPS = 34,57};5859static const uint8_t Default_8x8_Intra[64] = {6016, 16, 16, 16, 17, 18, 21, 24,6116, 16, 16, 16, 17, 19, 22, 25,6216, 16, 17, 18, 20, 22, 25, 29,6316, 16, 18, 21, 24, 27, 31, 36,6417, 17, 20, 24, 30, 35, 41, 47,6518, 19, 22, 27, 35, 44, 54, 65,6621, 22, 25, 31, 41, 54, 70, 88,6724, 25, 29, 36, 47, 65, 88, 11568};6970static const uint8_t Default_8x8_Inter[64] = {7116, 16, 16, 16, 17, 18, 20, 24,7216, 16, 16, 17, 18, 20, 24, 25,7316, 16, 17, 18, 20, 24, 25, 28,7416, 17, 18, 20, 24, 25, 28, 33,7517, 18, 20, 24, 25, 28, 33, 41,7618, 20, 24, 25, 28, 33, 41, 54,7720, 24, 25, 28, 33, 41, 54, 71,7824, 25, 28, 33, 41, 54, 71, 9179};8081struct dpb_list {82struct list_head list;83struct pipe_video_buffer *buffer;84OMX_TICKS timestamp;85unsigned poc;86};8788struct ref_pic_set {89unsigned num_pics;90unsigned num_neg_pics;91unsigned num_pos_pics;92unsigned num_delta_poc;93int delta_poc[MAX_NUM_REF_PICS];94bool used[MAX_NUM_REF_PICS];95};9697static bool is_idr_picture(unsigned nal_unit_type)98{99return (nal_unit_type == NAL_UNIT_TYPE_IDR_W_RADL ||100nal_unit_type == NAL_UNIT_TYPE_IDR_N_LP);101}102103/* broken link access picture */104static bool is_bla_picture(unsigned nal_unit_type)105{106return (nal_unit_type == NAL_UNIT_TYPE_BLA_W_LP ||107nal_unit_type == NAL_UNIT_TYPE_BLA_W_RADL ||108nal_unit_type == NAL_UNIT_TYPE_BLA_N_LP);109}110111/* random access point picture */112static bool is_rap_picture(unsigned nal_unit_type)113{114return (nal_unit_type >= NAL_UNIT_TYPE_BLA_W_LP &&115nal_unit_type <= NAL_UNIT_TYPE_CRA);116}117118static bool is_slice_picture(unsigned nal_unit_type)119{120return (nal_unit_type <= NAL_UNIT_TYPE_RASL_R ||121is_rap_picture(nal_unit_type));122}123124static void set_poc(vid_dec_PrivateType *priv,125unsigned nal_unit_type, int i)126{127priv->picture.h265.CurrPicOrderCntVal = i;128129if (priv->codec_data.h265.temporal_id == 0 &&130(nal_unit_type == NAL_UNIT_TYPE_TRAIL_R ||131nal_unit_type == NAL_UNIT_TYPE_TSA_R ||132nal_unit_type == NAL_UNIT_TYPE_STSA_R ||133is_rap_picture(nal_unit_type)))134priv->codec_data.h265.slice_prev_poc = i;135}136137static unsigned get_poc(vid_dec_PrivateType *priv)138{139return priv->picture.h265.CurrPicOrderCntVal;140}141142static void profile_tier(struct vl_rbsp *rbsp)143{144int i;145146/* general_profile_space */147vl_rbsp_u(rbsp, 2);148149/* general_tier_flag */150vl_rbsp_u(rbsp, 1);151152/* general_profile_idc */153vl_rbsp_u(rbsp, 5);154155/* general_profile_compatibility_flag */156for(i = 0; i < 32; ++i)157vl_rbsp_u(rbsp, 1);158159/* general_progressive_source_flag */160vl_rbsp_u(rbsp, 1);161162/* general_interlaced_source_flag */163vl_rbsp_u(rbsp, 1);164165/* general_non_packed_constraint_flag */166vl_rbsp_u(rbsp, 1);167168/* general_frame_only_constraint_flag */169vl_rbsp_u(rbsp, 1);170171/* general_reserved_zero_44bits */172vl_rbsp_u(rbsp, 16);173vl_rbsp_u(rbsp, 16);174vl_rbsp_u(rbsp, 12);175}176177static unsigned profile_tier_level(struct vl_rbsp *rbsp,178int max_sublayers_minus1)179{180bool sub_layer_profile_present_flag[6];181bool sub_layer_level_present_flag[6];182unsigned level_idc;183int i;184185profile_tier(rbsp);186187/* general_level_idc */188level_idc = vl_rbsp_u(rbsp, 8);189190for (i = 0; i < max_sublayers_minus1; ++i) {191sub_layer_profile_present_flag[i] = vl_rbsp_u(rbsp, 1);192sub_layer_level_present_flag[i] = vl_rbsp_u(rbsp, 1);193}194195if (max_sublayers_minus1 > 0)196for (i = max_sublayers_minus1; i < 8; ++i)197/* reserved_zero_2bits */198vl_rbsp_u(rbsp, 2);199200for (i = 0; i < max_sublayers_minus1; ++i) {201if (sub_layer_profile_present_flag[i])202profile_tier(rbsp);203204if (sub_layer_level_present_flag[i])205/* sub_layer_level_idc */206vl_rbsp_u(rbsp, 8);207}208209return level_idc;210}211212static void scaling_list_data(vid_dec_PrivateType *priv,213struct vl_rbsp *rbsp, struct pipe_h265_sps *sps)214{215unsigned size_id, matrix_id;216unsigned scaling_list_len[4] = { 16, 64, 64, 64 };217uint8_t scaling_list4x4[6][64] = { };218int i;219220uint8_t (*scaling_list_data[4])[6][64] = {221(uint8_t (*)[6][64])scaling_list4x4,222(uint8_t (*)[6][64])sps->ScalingList8x8,223(uint8_t (*)[6][64])sps->ScalingList16x16,224(uint8_t (*)[6][64])sps->ScalingList32x32225};226uint8_t (*scaling_list_dc_coeff[2])[6] = {227(uint8_t (*)[6])sps->ScalingListDCCoeff16x16,228(uint8_t (*)[6])sps->ScalingListDCCoeff32x32229};230231for (size_id = 0; size_id < 4; ++size_id) {232233for (matrix_id = 0; matrix_id < ((size_id == 3) ? 2 : 6); ++matrix_id) {234bool scaling_list_pred_mode_flag = vl_rbsp_u(rbsp, 1);235236if (!scaling_list_pred_mode_flag) {237/* scaling_list_pred_matrix_id_delta */;238unsigned matrix_id_with_delta = matrix_id - vl_rbsp_ue(rbsp);239240if (matrix_id != matrix_id_with_delta) {241memcpy((*scaling_list_data[size_id])[matrix_id],242(*scaling_list_data[size_id])[matrix_id_with_delta],243scaling_list_len[size_id]);244if (size_id > 1)245(*scaling_list_dc_coeff[size_id - 2])[matrix_id] =246(*scaling_list_dc_coeff[size_id - 2])[matrix_id_with_delta];247} else {248const uint8_t *d;249250if (size_id == 0)251memset((*scaling_list_data[0])[matrix_id], 16, 16);252else {253if (size_id < 3)254d = (matrix_id < 3) ? Default_8x8_Intra : Default_8x8_Inter;255else256d = (matrix_id < 1) ? Default_8x8_Intra : Default_8x8_Inter;257memcpy((*scaling_list_data[size_id])[matrix_id], d,258scaling_list_len[size_id]);259}260if (size_id > 1)261(*scaling_list_dc_coeff[size_id - 2])[matrix_id] = 16;262}263} else {264int next_coef = 8;265int coef_num = MIN2(64, (1 << (4 + (size_id << 1))));266267if (size_id > 1) {268/* scaling_list_dc_coef_minus8 */269next_coef = vl_rbsp_se(rbsp) + 8;270(*scaling_list_dc_coeff[size_id - 2])[matrix_id] = next_coef;271}272273for (i = 0; i < coef_num; ++i) {274/* scaling_list_delta_coef */275next_coef = (next_coef + vl_rbsp_se(rbsp) + 256) % 256;276(*scaling_list_data[size_id])[matrix_id][i] = next_coef;277}278}279}280}281282for (i = 0; i < 6; ++i)283memcpy(sps->ScalingList4x4[i], scaling_list4x4[i], 16);284285return;286}287288static void st_ref_pic_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,289struct ref_pic_set *rps, struct pipe_h265_sps *sps,290unsigned idx)291{292bool inter_rps_pred_flag;293unsigned delta_idx_minus1;294int delta_poc;295int i;296297inter_rps_pred_flag = (idx != 0) ? (vl_rbsp_u(rbsp, 1)) : false;298299if (inter_rps_pred_flag) {300struct ref_pic_set *ref_rps;301unsigned sign, abs;302int delta_rps;303bool used;304int j;305306if (idx == sps->num_short_term_ref_pic_sets)307delta_idx_minus1 = vl_rbsp_ue(rbsp);308else309delta_idx_minus1 = 0;310311ref_rps = (struct ref_pic_set *)312priv->codec_data.h265.ref_pic_set_list + idx - (delta_idx_minus1 + 1);313314/* delta_rps_sign */315sign = vl_rbsp_u(rbsp, 1);316/* abs_delta_rps_minus1 */317abs = vl_rbsp_ue(rbsp);318delta_rps = (1 - 2 * sign) * (abs + 1);319320rps->num_neg_pics = 0;321rps->num_pos_pics = 0;322rps->num_pics = 0;323324for(i = 0 ; i <= ref_rps->num_pics; ++i) {325/* used_by_curr_pic_flag */326if (!vl_rbsp_u(rbsp, 1))327/* use_delta_flag */328vl_rbsp_u(rbsp, 1);329else {330delta_poc = delta_rps +331((i < ref_rps->num_pics)? ref_rps->delta_poc[i] : 0);332rps->delta_poc[rps->num_pics] = delta_poc;333rps->used[rps->num_pics] = true;334if (delta_poc < 0)335rps->num_neg_pics++;336else337rps->num_pos_pics++;338rps->num_pics++;339}340}341342rps->num_delta_poc = ref_rps->num_pics;343344/* sort delta poc */345for (i = 1; i < rps->num_pics; ++i) {346delta_poc = rps->delta_poc[i];347used = rps->used[i];348for (j = i - 1; j >= 0; j--) {349if (delta_poc < rps->delta_poc[j]) {350rps->delta_poc[j + 1] = rps->delta_poc[j];351rps->used[j + 1] = rps->used[j];352rps->delta_poc[j] = delta_poc;353rps->used[j] = used;354}355}356}357358for (i = 0 , j = rps->num_neg_pics - 1;359i < rps->num_neg_pics >> 1; i++, j--) {360delta_poc = rps->delta_poc[i];361used = rps->used[i];362rps->delta_poc[i] = rps->delta_poc[j];363rps->used[i] = rps->used[j];364rps->delta_poc[j] = delta_poc;365rps->used[j] = used;366}367} else {368/* num_negative_pics */369rps->num_neg_pics = vl_rbsp_ue(rbsp);370/* num_positive_pics */371rps->num_pos_pics = vl_rbsp_ue(rbsp);372rps->num_pics = rps->num_neg_pics + rps->num_pos_pics;373374delta_poc = 0;375for(i = 0 ; i < rps->num_neg_pics; ++i) {376/* delta_poc_s0_minus1 */377delta_poc -= (vl_rbsp_ue(rbsp) + 1);378rps->delta_poc[i] = delta_poc;379/* used_by_curr_pic_s0_flag */380rps->used[i] = vl_rbsp_u(rbsp, 1);381}382383delta_poc = 0;384for(i = rps->num_neg_pics; i < rps->num_pics; ++i) {385/* delta_poc_s1_minus1 */386delta_poc += (vl_rbsp_ue(rbsp) + 1);387rps->delta_poc[i] = delta_poc;388/* used_by_curr_pic_s1_flag */389rps->used[i] = vl_rbsp_u(rbsp, 1);390}391}392}393394static struct pipe_h265_sps *seq_parameter_set_id(vid_dec_PrivateType *priv,395struct vl_rbsp *rbsp)396{397unsigned id = vl_rbsp_ue(rbsp);398399if (id >= ARRAY_SIZE(priv->codec_data.h265.sps))400return NULL;401402return &priv->codec_data.h265.sps[id];403}404405static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)406{407struct pipe_h265_sps *sps;408int sps_max_sub_layers_minus1;409unsigned i;410411/* sps_video_parameter_set_id */412vl_rbsp_u(rbsp, 4);413414/* sps_max_sub_layers_minus1 */415sps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3);416417assert(sps_max_sub_layers_minus1 <= 6);418419/* sps_temporal_id_nesting_flag */420vl_rbsp_u(rbsp, 1);421422priv->codec_data.h265.level_idc =423profile_tier_level(rbsp, sps_max_sub_layers_minus1);424425sps = seq_parameter_set_id(priv, rbsp);426if (!sps)427return;428429memset(sps, 0, sizeof(*sps));430431sps->chroma_format_idc = vl_rbsp_ue(rbsp);432433if (sps->chroma_format_idc == 3)434sps->separate_colour_plane_flag = vl_rbsp_u(rbsp, 1);435436priv->codec_data.h265.pic_width_in_luma_samples =437sps->pic_width_in_luma_samples = vl_rbsp_ue(rbsp);438439priv->codec_data.h265.pic_height_in_luma_samples =440sps->pic_height_in_luma_samples = vl_rbsp_ue(rbsp);441442/* conformance_window_flag */443if (vl_rbsp_u(rbsp, 1)) {444/* conf_win_left_offset */445vl_rbsp_ue(rbsp);446/* conf_win_right_offset */447vl_rbsp_ue(rbsp);448/* conf_win_top_offset */449vl_rbsp_ue(rbsp);450/* conf_win_bottom_offset */451vl_rbsp_ue(rbsp);452}453454sps->bit_depth_luma_minus8 = vl_rbsp_ue(rbsp);455sps->bit_depth_chroma_minus8 = vl_rbsp_ue(rbsp);456sps->log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp);457458/* sps_sub_layer_ordering_info_present_flag */459i = vl_rbsp_u(rbsp, 1) ? 0 : sps_max_sub_layers_minus1;460for (; i <= sps_max_sub_layers_minus1; ++i) {461sps->sps_max_dec_pic_buffering_minus1 = vl_rbsp_ue(rbsp);462/* sps_max_num_reorder_pics */463vl_rbsp_ue(rbsp);464/* sps_max_latency_increase_plus */465vl_rbsp_ue(rbsp);466}467468sps->log2_min_luma_coding_block_size_minus3 = vl_rbsp_ue(rbsp);469sps->log2_diff_max_min_luma_coding_block_size = vl_rbsp_ue(rbsp);470sps->log2_min_transform_block_size_minus2 = vl_rbsp_ue(rbsp);471sps->log2_diff_max_min_transform_block_size = vl_rbsp_ue(rbsp);472sps->max_transform_hierarchy_depth_inter = vl_rbsp_ue(rbsp);473sps->max_transform_hierarchy_depth_intra = vl_rbsp_ue(rbsp);474475sps->scaling_list_enabled_flag = vl_rbsp_u(rbsp, 1);476if (sps->scaling_list_enabled_flag)477/* sps_scaling_list_data_present_flag */478if (vl_rbsp_u(rbsp, 1))479scaling_list_data(priv, rbsp, sps);480481sps->amp_enabled_flag = vl_rbsp_u(rbsp, 1);482sps->sample_adaptive_offset_enabled_flag = vl_rbsp_u(rbsp, 1);483sps->pcm_enabled_flag = vl_rbsp_u(rbsp, 1);484if (sps->pcm_enabled_flag) {485sps->pcm_sample_bit_depth_luma_minus1 = vl_rbsp_u(rbsp, 4);486sps->pcm_sample_bit_depth_chroma_minus1 = vl_rbsp_u(rbsp, 4);487sps->log2_min_pcm_luma_coding_block_size_minus3 = vl_rbsp_ue(rbsp);488sps->log2_diff_max_min_pcm_luma_coding_block_size = vl_rbsp_ue(rbsp);489sps->pcm_loop_filter_disabled_flag = vl_rbsp_u(rbsp, 1);490}491492sps->num_short_term_ref_pic_sets = vl_rbsp_ue(rbsp);493494for (i = 0; i < sps->num_short_term_ref_pic_sets; ++i) {495struct ref_pic_set *rps;496497rps = (struct ref_pic_set *)498priv->codec_data.h265.ref_pic_set_list + i;499st_ref_pic_set(priv, rbsp, rps, sps, i);500}501502sps->long_term_ref_pics_present_flag = vl_rbsp_u(rbsp, 1);503if (sps->long_term_ref_pics_present_flag) {504sps->num_long_term_ref_pics_sps = vl_rbsp_ue(rbsp);505for (i = 0; i < sps->num_long_term_ref_pics_sps; ++i) {506/* lt_ref_pic_poc_lsb_sps */507vl_rbsp_u(rbsp, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);508/* used_by_curr_pic_lt_sps_flag */509vl_rbsp_u(rbsp, 1);510}511}512513sps->sps_temporal_mvp_enabled_flag = vl_rbsp_u(rbsp, 1);514sps->strong_intra_smoothing_enabled_flag = vl_rbsp_u(rbsp, 1);515}516517static struct pipe_h265_pps *pic_parameter_set_id(vid_dec_PrivateType *priv,518struct vl_rbsp *rbsp)519{520unsigned id = vl_rbsp_ue(rbsp);521522if (id >= ARRAY_SIZE(priv->codec_data.h265.pps))523return NULL;524525return &priv->codec_data.h265.pps[id];526}527528static void picture_parameter_set(vid_dec_PrivateType *priv,529struct vl_rbsp *rbsp)530{531struct pipe_h265_sps *sps;532struct pipe_h265_pps *pps;533int i;534535pps = pic_parameter_set_id(priv, rbsp);536if (!pps)537return;538539memset(pps, 0, sizeof(*pps));540sps = pps->sps = seq_parameter_set_id(priv, rbsp);541if (!sps)542return;543544pps->dependent_slice_segments_enabled_flag = vl_rbsp_u(rbsp, 1);545pps->output_flag_present_flag = vl_rbsp_u(rbsp, 1);546pps->num_extra_slice_header_bits = vl_rbsp_u(rbsp, 3);547pps->sign_data_hiding_enabled_flag = vl_rbsp_u(rbsp, 1);548pps->cabac_init_present_flag = vl_rbsp_u(rbsp, 1);549550pps->num_ref_idx_l0_default_active_minus1 = vl_rbsp_ue(rbsp);551pps->num_ref_idx_l1_default_active_minus1 = vl_rbsp_ue(rbsp);552pps->init_qp_minus26 = vl_rbsp_se(rbsp);553pps->constrained_intra_pred_flag = vl_rbsp_u(rbsp, 1);554pps->transform_skip_enabled_flag = vl_rbsp_u(rbsp, 1);555556pps->cu_qp_delta_enabled_flag = vl_rbsp_u(rbsp, 1);557if (pps->cu_qp_delta_enabled_flag)558pps->diff_cu_qp_delta_depth = vl_rbsp_ue(rbsp);559560pps->pps_cb_qp_offset = vl_rbsp_se(rbsp);561pps->pps_cr_qp_offset = vl_rbsp_se(rbsp);562pps->pps_slice_chroma_qp_offsets_present_flag = vl_rbsp_u(rbsp, 1);563564pps->weighted_pred_flag = vl_rbsp_u(rbsp, 1);565pps->weighted_bipred_flag = vl_rbsp_u(rbsp, 1);566567pps->transquant_bypass_enabled_flag = vl_rbsp_u(rbsp, 1);568pps->tiles_enabled_flag = vl_rbsp_u(rbsp, 1);569pps->entropy_coding_sync_enabled_flag = vl_rbsp_u(rbsp, 1);570571if (pps->tiles_enabled_flag) {572pps->num_tile_columns_minus1 = vl_rbsp_ue(rbsp);573pps->num_tile_rows_minus1 = vl_rbsp_ue(rbsp);574575pps->uniform_spacing_flag = vl_rbsp_u(rbsp, 1);576if (!pps->uniform_spacing_flag) {577for (i = 0; i < pps->num_tile_columns_minus1; ++i)578pps->column_width_minus1[i] = vl_rbsp_ue(rbsp);579580for (i = 0; i < pps->num_tile_rows_minus1; ++i)581pps->row_height_minus1[i] = vl_rbsp_ue(rbsp);582}583584if (!pps->num_tile_columns_minus1 || !pps->num_tile_rows_minus1)585pps->loop_filter_across_tiles_enabled_flag = vl_rbsp_u(rbsp, 1);586}587588pps->pps_loop_filter_across_slices_enabled_flag = vl_rbsp_u(rbsp, 1);589590pps->deblocking_filter_control_present_flag = vl_rbsp_u(rbsp, 1);591if (pps->deblocking_filter_control_present_flag) {592pps->deblocking_filter_override_enabled_flag = vl_rbsp_u(rbsp, 1);593pps->pps_deblocking_filter_disabled_flag = vl_rbsp_u(rbsp, 1);594if (!pps->pps_deblocking_filter_disabled_flag) {595pps->pps_beta_offset_div2 = vl_rbsp_se(rbsp);596pps->pps_tc_offset_div2 = vl_rbsp_se(rbsp);597}598}599600if (vl_vlc_bits_left(&rbsp->nal) == 0)601return;602603/* pps_scaling_list_data_present_flag */604if (vl_rbsp_u(rbsp, 1))605scaling_list_data(priv, rbsp, sps);606607pps->lists_modification_present_flag = vl_rbsp_u(rbsp, 1);608pps->log2_parallel_merge_level_minus2 = vl_rbsp_ue(rbsp);609pps->slice_segment_header_extension_present_flag = vl_rbsp_u(rbsp, 1);610}611612static void vid_dec_h265_BeginFrame(vid_dec_PrivateType *priv)613{614if (priv->frame_started)615return;616617if (!priv->codec) {618struct pipe_video_codec templat = {};619omx_base_video_PortType *port = (omx_base_video_PortType *)620priv->ports[OMX_BASE_FILTER_INPUTPORT_INDEX];621622templat.profile = priv->profile;623templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;624templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;625templat.expect_chunked_decode = true;626templat.width = priv->codec_data.h265.pic_width_in_luma_samples;627templat.height = priv->codec_data.h265.pic_height_in_luma_samples;628templat.level = priv->codec_data.h265.level_idc;629priv->codec = priv->pipe->create_video_codec(priv->pipe, &templat);630631/* disable transcode tunnel if video size is different from coded size */632if (priv->codec_data.h265.pic_width_in_luma_samples !=633port->sPortParam.format.video.nFrameWidth ||634priv->codec_data.h265.pic_height_in_luma_samples !=635port->sPortParam.format.video.nFrameHeight)636priv->disable_tunnel = true;637}638639vid_dec_NeedTarget(priv);640641if (priv->first_buf_in_frame)642priv->timestamp = priv->timestamps[0];643priv->first_buf_in_frame = false;644645priv->codec->begin_frame(priv->codec, priv->target, &priv->picture.base);646priv->frame_started = true;647}648649static struct pipe_video_buffer *vid_dec_h265_Flush(vid_dec_PrivateType *priv,650OMX_TICKS *timestamp)651{652struct dpb_list *entry, *result = NULL;653struct pipe_video_buffer *buf;654655/* search for the lowest poc and break on zeros */656LIST_FOR_EACH_ENTRY(entry, &priv->codec_data.h265.dpb_list, list) {657658if (result && entry->poc == 0)659break;660661if (!result || entry->poc < result->poc)662result = entry;663}664665if (!result)666return NULL;667668buf = result->buffer;669if (timestamp)670*timestamp = result->timestamp;671672--priv->codec_data.h265.dpb_num;673list_del(&result->list);674FREE(result);675676return buf;677}678679static void vid_dec_h265_EndFrame(vid_dec_PrivateType *priv)680{681struct dpb_list *entry = NULL;682struct pipe_video_buffer *tmp;683struct ref_pic_set *rps;684int i;685OMX_TICKS timestamp;686687if (!priv->frame_started)688return;689690priv->picture.h265.NumPocStCurrBefore = 0;691priv->picture.h265.NumPocStCurrAfter = 0;692memset(priv->picture.h265.RefPicSetStCurrBefore, 0, 8);693memset(priv->picture.h265.RefPicSetStCurrAfter, 0, 8);694for (i = 0; i < MAX_NUM_REF_PICS; ++i) {695priv->picture.h265.ref[i] = NULL;696priv->picture.h265.PicOrderCntVal[i] = 0;697}698699rps = priv->codec_data.h265.rps;700701if (rps) {702unsigned bf = 0, af = 0;703704priv->picture.h265.NumDeltaPocsOfRefRpsIdx = rps->num_delta_poc;705for (i = 0; i < rps->num_pics; ++i) {706priv->picture.h265.PicOrderCntVal[i] =707rps->delta_poc[i] + get_poc(priv);708709LIST_FOR_EACH_ENTRY(entry, &priv->codec_data.h265.dpb_list, list) {710if (entry->poc == priv->picture.h265.PicOrderCntVal[i]) {711priv->picture.h265.ref[i] = entry->buffer;712}713}714715if (rps->used[i]) {716if (i < rps->num_neg_pics) {717priv->picture.h265.NumPocStCurrBefore++;718priv->picture.h265.RefPicSetStCurrBefore[bf++] = i;719} else {720priv->picture.h265.NumPocStCurrAfter++;721priv->picture.h265.RefPicSetStCurrAfter[af++] = i;722}723}724}725}726727priv->codec->end_frame(priv->codec, priv->target, &priv->picture.base);728priv->frame_started = false;729730/* add the decoded picture to the dpb list */731entry = CALLOC_STRUCT(dpb_list);732if (!entry)733return;734735priv->first_buf_in_frame = true;736entry->buffer = priv->target;737entry->timestamp = priv->timestamp;738entry->poc = get_poc(priv);739740list_addtail(&entry->list, &priv->codec_data.h265.dpb_list);741++priv->codec_data.h265.dpb_num;742priv->target = NULL;743744if (priv->codec_data.h265.dpb_num <= DPB_MAX_SIZE)745return;746747tmp = priv->in_buffers[0]->pInputPortPrivate;748priv->in_buffers[0]->pInputPortPrivate = vid_dec_h265_Flush(priv, ×tamp);749priv->in_buffers[0]->nTimeStamp = timestamp;750priv->target = tmp;751priv->frame_finished = priv->in_buffers[0]->pInputPortPrivate != NULL;752if (priv->frame_finished &&753(priv->in_buffers[0]->nFlags & OMX_BUFFERFLAG_EOS))754FREE(priv->codec_data.h265.ref_pic_set_list);755}756757static void slice_header(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,758unsigned nal_unit_type)759{760struct pipe_h265_pps *pps;761struct pipe_h265_sps *sps;762bool first_slice_segment_in_pic_flag;763bool dependent_slice_segment_flag = false;764struct ref_pic_set *rps;765unsigned poc_lsb, poc_msb, slice_prev_poc;766unsigned max_poc_lsb, prev_poc_lsb, prev_poc_msb;767unsigned num_st_rps;768int i;769770if (priv->picture.h265.IDRPicFlag != is_idr_picture(nal_unit_type))771vid_dec_h265_EndFrame(priv);772773priv->picture.h265.IDRPicFlag = is_idr_picture(nal_unit_type);774775first_slice_segment_in_pic_flag = vl_rbsp_u(rbsp, 1);776777if (is_rap_picture(nal_unit_type))778/* no_output_of_prior_pics_flag */779vl_rbsp_u(rbsp, 1);780781pps = pic_parameter_set_id(priv, rbsp);782if (!pps)783return;784785sps = pps->sps;786if (!sps)787return;788789if (pps != priv->picture.h265.pps)790vid_dec_h265_EndFrame(priv);791792priv->picture.h265.pps = pps;793794if (priv->picture.h265.RAPPicFlag != is_rap_picture(nal_unit_type))795vid_dec_h265_EndFrame(priv);796priv->picture.h265.RAPPicFlag = is_rap_picture(nal_unit_type);797798num_st_rps = sps->num_short_term_ref_pic_sets;799800if (priv->picture.h265.CurrRpsIdx != num_st_rps)801vid_dec_h265_EndFrame(priv);802priv->picture.h265.CurrRpsIdx = num_st_rps;803804if (!first_slice_segment_in_pic_flag) {805int size, num;806int bits_slice_segment_address = 0;807808if (pps->dependent_slice_segments_enabled_flag)809dependent_slice_segment_flag = vl_rbsp_u(rbsp, 1);810811size = 1 << (sps->log2_min_luma_coding_block_size_minus3 + 3 +812sps->log2_diff_max_min_luma_coding_block_size);813814num = ((sps->pic_width_in_luma_samples + size - 1) / size) *815((sps->pic_height_in_luma_samples + size - 1) / size);816817while (num > (1 << bits_slice_segment_address))818bits_slice_segment_address++;819820/* slice_segment_address */821vl_rbsp_u(rbsp, bits_slice_segment_address);822}823824if (dependent_slice_segment_flag)825return;826827for (i = 0; i < pps->num_extra_slice_header_bits; ++i)828/* slice_reserved_flag */829vl_rbsp_u(rbsp, 1);830831/* slice_type */832vl_rbsp_ue(rbsp);833834if (pps->output_flag_present_flag)835/* pic output flag */836vl_rbsp_u(rbsp, 1);837838if (sps->separate_colour_plane_flag)839/* colour_plane_id */840vl_rbsp_u(rbsp, 2);841842if (is_idr_picture(nal_unit_type)) {843set_poc(priv, nal_unit_type, 0);844return;845}846847/* slice_pic_order_cnt_lsb */848poc_lsb =849vl_rbsp_u(rbsp, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);850851slice_prev_poc = (int)priv->codec_data.h265.slice_prev_poc;852max_poc_lsb = 1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4);853854prev_poc_lsb = slice_prev_poc & (max_poc_lsb - 1);855prev_poc_msb = slice_prev_poc - prev_poc_lsb;856857if ((poc_lsb < prev_poc_lsb) &&858((prev_poc_lsb - poc_lsb ) >= (max_poc_lsb / 2)))859poc_msb = prev_poc_msb + max_poc_lsb;860861else if ((poc_lsb > prev_poc_lsb ) &&862((poc_lsb - prev_poc_lsb) > (max_poc_lsb / 2)))863poc_msb = prev_poc_msb - max_poc_lsb;864865else866poc_msb = prev_poc_msb;867868if (is_bla_picture(nal_unit_type))869poc_msb = 0;870871if (get_poc(priv) != poc_msb + poc_lsb)872vid_dec_h265_EndFrame(priv);873874set_poc(priv, nal_unit_type, (poc_msb + poc_lsb));875876/* short_term_ref_pic_set_sps_flag */877if (!vl_rbsp_u(rbsp, 1)) {878rps = (struct ref_pic_set *)879priv->codec_data.h265.ref_pic_set_list + num_st_rps;880st_ref_pic_set(priv, rbsp, rps, sps, num_st_rps);881882} else if (num_st_rps > 1) {883int num_bits = 0;884unsigned idx;885886while ((1 << num_bits) < num_st_rps)887num_bits++;888889if (num_bits > 0)890/* short_term_ref_pic_set_idx */891idx = vl_rbsp_u(rbsp, num_bits);892else893idx = 0;894895rps = (struct ref_pic_set *)896priv->codec_data.h265.ref_pic_set_list + idx;897} else898rps = (struct ref_pic_set *)899priv->codec_data.h265.ref_pic_set_list;900901if (is_bla_picture(nal_unit_type)) {902rps->num_neg_pics = 0;903rps->num_pos_pics = 0;904rps->num_pics = 0;905}906907priv->codec_data.h265.rps = rps;908909return;910}911912static void vid_dec_h265_Decode(vid_dec_PrivateType *priv,913struct vl_vlc *vlc,914unsigned min_bits_left)915{916unsigned nal_unit_type;917unsigned nuh_layer_id;918unsigned nuh_temporal_id_plus1;919920if (!vl_vlc_search_byte(vlc, vl_vlc_bits_left(vlc) - min_bits_left, 0x00))921return;922923if (vl_vlc_peekbits(vlc, 24) != 0x000001) {924vl_vlc_eatbits(vlc, 8);925return;926}927928if (priv->slice) {929unsigned bytes = priv->bytes_left - (vl_vlc_bits_left(vlc) / 8);930931priv->codec->decode_bitstream(priv->codec, priv->target,932&priv->picture.base, 1,933&priv->slice, &bytes);934priv->slice = NULL;935}936937vl_vlc_eatbits(vlc, 24);938939/* forbidden_zero_bit */940vl_vlc_eatbits(vlc, 1);941942if (vl_vlc_valid_bits(vlc) < 15)943vl_vlc_fillbits(vlc);944945nal_unit_type = vl_vlc_get_uimsbf(vlc, 6);946947/* nuh_layer_id */948nuh_layer_id = vl_vlc_get_uimsbf(vlc, 6);949950/* nuh_temporal_id_plus1 */951nuh_temporal_id_plus1 = vl_vlc_get_uimsbf(vlc, 3);952priv->codec_data.h265.temporal_id = nuh_temporal_id_plus1 - 1;953954if (!is_slice_picture(nal_unit_type))955vid_dec_h265_EndFrame(priv);956957if (nal_unit_type == NAL_UNIT_TYPE_SPS) {958struct vl_rbsp rbsp;959960vl_rbsp_init(&rbsp, vlc, ~0);961seq_parameter_set(priv, &rbsp);962963} else if (nal_unit_type == NAL_UNIT_TYPE_PPS) {964struct vl_rbsp rbsp;965966vl_rbsp_init(&rbsp, vlc, ~0);967picture_parameter_set(priv, &rbsp);968969} else if (is_slice_picture(nal_unit_type)) {970unsigned bits = vl_vlc_valid_bits(vlc);971unsigned bytes = bits / 8 + 5;972struct vl_rbsp rbsp;973uint8_t buf[9];974const void *ptr = buf;975unsigned i;976977buf[0] = 0x0;978buf[1] = 0x0;979buf[2] = 0x1;980buf[3] = nal_unit_type << 1 | nuh_layer_id >> 5;981buf[4] = nuh_layer_id << 3 | nuh_temporal_id_plus1;982for (i = 5; i < bytes; ++i)983buf[i] = vl_vlc_peekbits(vlc, bits) >> ((bytes - i - 1) * 8);984985priv->bytes_left = (vl_vlc_bits_left(vlc) - bits) / 8;986priv->slice = vlc->data;987988vl_rbsp_init(&rbsp, vlc, 128);989slice_header(priv, &rbsp, nal_unit_type);990991vid_dec_h265_BeginFrame(priv);992993priv->codec->decode_bitstream(priv->codec, priv->target,994&priv->picture.base, 1,995&ptr, &bytes);996}997998/* resync to byte boundary */999vl_vlc_eatbits(vlc, vl_vlc_valid_bits(vlc) % 8);1000}10011002void vid_dec_h265_Init(vid_dec_PrivateType *priv)1003{1004priv->picture.base.profile = PIPE_VIDEO_PROFILE_HEVC_MAIN;10051006list_inithead(&priv->codec_data.h265.dpb_list);1007priv->codec_data.h265.ref_pic_set_list = (struct ref_pic_set *)1008CALLOC(MAX_NUM_REF_PICS, sizeof(struct ref_pic_set));10091010priv->Decode = vid_dec_h265_Decode;1011priv->EndFrame = vid_dec_h265_EndFrame;1012priv->Flush = vid_dec_h265_Flush;1013priv->first_buf_in_frame = true;1014}101510161017