1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_debug.h" 2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_parser_ops.h" 3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_workload.h" 5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_pm.h" 6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264.h" 8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264parse.h" 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_h264_parse.h" 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264parse_dpb.h" 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Init function which can be called to intialized local context on open and flush and preserve*/ 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_h264_init(void *ctxt, uint32_t *persist_mem, uint32_t preserve) 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_h264_init(void *ctxt, uint32_t *persist_mem, uint32_t preserve) 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct h264_viddec_parser* parser = ctxt; 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Info * pInfo = &(parser->info); 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!preserve) 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* we don't initialize this data if we want to preserve 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sequence and gop information */ 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_init_sps_pps(parser,persist_mem); 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* picture level info which will always be initialized */ 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_init_Info_under_sps_pps_level(pInfo); 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t viddec_h264_parse(void *parent, void *ctxt) 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic uint32_t viddec_h264_parse(void *parent, void *ctxt) 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct h264_viddec_parser* parser = ctxt; 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Info * pInfo = &(parser->info); 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Status status = H264_STATUS_ERROR; 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t nal_ref_idc = 0; 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// Parse NAL Unit header 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.g_new_frame = 0; 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->push_to_cur = 1; 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->is_current_workload_done =0; 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->nal_unit_type = 0; 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_NAL_Unit(parent, pInfo, &nal_ref_idc); 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// Check frame bounday for non-vcl elimitter 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_check_previous_frame_end(pInfo); 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //OS_INFO("========================nal_type: %d=================\n", pInfo->nal_unit_type); 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //DEBUG_WRITE(pInfo->nal_unit_type, pInfo->got_start, pInfo->wl_err_flag, pInfo->is_current_workload_done, 0, 0); 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee devh_SVEN_WriteModuleEvent( NULL, 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SVEN_MODULE_EVENT_GV_FW_PARSER_DEBUG_P0, 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->got_start,pInfo->nal_unit_type, pInfo->wl_err_curr, pInfo->is_current_workload_done, 0, pInfo->img.frame_num); 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //////// Parse valid NAL unit 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch ( pInfo->nal_unit_type ) 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_IDR: 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->got_start) { 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.recovery_point_found |= 1; 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_rp_received = 0; 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_SLICE: 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //////////////////////////////////////////////////////////////////////////// 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Step 1: Check start point 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //////////////////////////////////////////////////////////////////////////// 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Slice parsing must start from the valid start point( SPS, PPS, IDR or recovery point or primary_I) 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 1) No start point reached, append current ES buffer to workload and release it 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 2) else, start parsing 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if(pInfo->got_start && ((pInfo->sei_information.recovery_point) || (pInfo->nal_unit_type == h264_NAL_UNIT_TYPE_IDR))) 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //{ 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //pInfo->img.recovery_point_found = 1; 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //} 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Slice_Header_t next_SliceHeader; 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Reset next slice header 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_memset(&next_SliceHeader, 0x0, sizeof(h264_Slice_Header_t)); 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee next_SliceHeader.nal_ref_idc = nal_ref_idc; 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( (1==pInfo->primary_pic_type_plus_one)&&(pInfo->got_start)) 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.recovery_point_found |=4; 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->primary_pic_type_plus_one = 0; 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.recovery_point_found == 0) { 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.structure = FRAME; 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE; 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr |= (FRAME << FIELD_ERR_OFFSET); 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //////////////////////////////////////////////////////////////////////////// 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Step 2: Parsing slice header 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //////////////////////////////////////////////////////////////////////////// 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// PWT 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->h264_pwt_start_byte_offset=0; 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->h264_pwt_start_bit_offset=0; 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->h264_pwt_end_byte_offset=0; 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->h264_pwt_end_bit_offset=0; 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->h264_pwt_enabled =0; 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// IDR flag 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee next_SliceHeader.idr_flag = (pInfo->nal_unit_type == h264_NAL_UNIT_TYPE_IDR); 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Pass slice header 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = h264_Parse_Slice_Layer_Without_Partitioning_RBSP(parent, pInfo, &next_SliceHeader); 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_information.recovery_point = 0; 135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(next_SliceHeader.sh_error & 3) { 137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE; 138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Error type definition, refer to viddec_fw_common_defs.h 140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // if error in top field, VIDDEC_FW_WORKLOAD_ERR_TOPFIELD = (1 << 17) 141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // if error in bottom field, VIDDEC_FW_WORKLOAD_ERR_BOTTOMFIELD = (1 << 18) 142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // if this is frame based, both 2 bits should be set 143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr |= (FRAME << FIELD_ERR_OFFSET); 144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.current_slice_num++; 148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef DUMP_HEADER_INFO 151bd8388b4555645b3d29abc6a94c303638064d69awonjong.leedump_slice_header(pInfo, &next_SliceHeader); 152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////h264_print_decoder_values(pInfo); 153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //////////////////////////////////////////////////////////////////////////// 157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Step 3: Processing if new picture coming 158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1) if it's the second field 159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 2) if it's a new frame 160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //////////////////////////////////////////////////////////////////////////// 161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //AssignQuantParam(pInfo); 162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(h264_is_new_picture_start(pInfo, next_SliceHeader, pInfo->SliceHeader)) 163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///----------------- New Picture.boundary detected-------------------- 166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.g_new_pic++; 168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Complete previous picture 171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_store_previous_picture_in_dpb(pInfo, 0, 0); //curr old 172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_hdr_post_poc(0, 0, use_old); 173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Update slice structures: 176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_update_old_slice(pInfo, next_SliceHeader); //cur->old; next->cur; 177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1) if resolution change: reset dpb 180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 2) else: init frame store 181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_update_img_info(pInfo); //img, dpb 182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///----------------- New frame.boundary detected-------------------- 185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.second_field = h264_is_second_field(pInfo); 187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.second_field == 0) 188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.g_new_frame = 1; 190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_update_queue_dangling_field(pInfo); 191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// DPB management 194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 1) check the gaps 195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 2) assign fs for non-exist frames 196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 3) fill the gaps 197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 4) store frame into DPB if ... 198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if(pInfo->SliceHeader.redundant_pic_cnt) 200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_gaps_in_frame_num_mem_management(pInfo); 202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef DUMP_HEADER_INFO 205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dump_new_picture_attr(pInfo, pInfo->SliceHeader.frame_num); 206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Decoding POC 210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_hdr_decoding_poc (pInfo, 0, 0); 211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Init Frame Store for next frame 214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_init_frame_store (pInfo); 215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.current_slice_num = 1; 216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.first_mb_in_slice != 0) 218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////Come here means we have slice lost at the beginning, since no FMO support 220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.sh_error |= (pInfo->SliceHeader.structure << 17); 221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Emit out the New Frame 225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.g_new_frame) 226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_parse_emit_start_new_frame(parent, pInfo); 228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_parse_emit_current_pic(parent, pInfo); 231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else ///////////////////////////////////////////////////// If Not a picture start 233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Update slice structures: cur->old; next->cur; 236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_update_old_slice(pInfo, next_SliceHeader); 237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 1) if resolution change: reset dpb 240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 2) else: update img info 241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_update_img_info(pInfo); 242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////////////////////////////////////////////////////////////// 246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Step 4: DPB reference list init and reordering 247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////////////////////////////////////////////////////////////// 248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //////////////////////////////////////////////// Update frame Type--- IDR/I/P/B for frame or field 250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_update_frame_type(pInfo); 251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_update_ref_lists( pInfo); 254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef DUMP_HEADER_INFO 256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dump_ref_list(pInfo); 257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Emit out the current "good" slice 259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_parse_emit_current_slice(parent, pInfo); 260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// * Main profile doesn't support Data Partition, skipped.... *//// 265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_DPA: 266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_DPB: 267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_DPC: 268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //OS_INFO("***********************DP feature, not supported currently*******************\n"); 269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE; 270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = H264_STATUS_NOTSUPPORT; 271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// * Parsing SEI info *//// 274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_SEI: 275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = H264_STATUS_OK; 276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //OS_INFO("*****************************SEI**************************************\n"); 278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->sps_valid){ 279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_user_data_t user_data; /// Replace with tmp buffer while porting to FW 280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->number_of_first_au_info_nal_before_first_slice++; 281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// parsing the SEI info 282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = h264_Parse_Supplemental_Enhancement_Information_Message(parent, pInfo); 283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_rbsp_trailing_bits(pInfo); 286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_SPS: 288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //OS_INFO("*****************************SPS**************************************\n"); 290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Can not define local SPS since the Current local stack size limitation! 292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Could be changed after the limitation gone 293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t old_sps_id=0; 295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee vui_seq_parameters_t_not_used vui_seq_not_used; 296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee old_sps_id = pInfo->active_SPS.seq_parameter_set_id; 298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_memset(&(pInfo->active_SPS), 0x0, sizeof(seq_param_set_used)); 299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = h264_Parse_SeqParameterSet(parent, pInfo, &(pInfo->active_SPS), &vui_seq_not_used, (int32_t *)pInfo->TMP_OFFSET_REFFRM_PADDR_GL); 302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(status == H264_STATUS_OK) { 303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Copy_Sps_To_DDR(pInfo, &(pInfo->active_SPS), pInfo->active_SPS.seq_parameter_set_id); 304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sps_valid = 1; 305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(1==pInfo->active_SPS.pic_order_cnt_type) { 307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Copy_Offset_Ref_Frames_To_DDR(pInfo,(int32_t *)pInfo->TMP_OFFSET_REFFRM_PADDR_GL,pInfo->active_SPS.seq_parameter_set_id); 308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef DUMP_HEADER_INFO 311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dump_sps(&(pInfo->active_SPS)); 312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// Restore the active SPS if new arrival's id changed 316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(old_sps_id>=MAX_NUM_SPS) { 317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_memset(&(pInfo->active_SPS), 0x0, sizeof(seq_param_set_used)); 318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->active_SPS.seq_parameter_set_id = 0xff; 319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(old_sps_id!=pInfo->active_SPS.seq_parameter_set_id) { 322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Copy_Sps_From_DDR(pInfo, &(pInfo->active_SPS), old_sps_id); 323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_memset(&(pInfo->active_SPS), 0x0, sizeof(seq_param_set)); 326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->active_SPS.seq_parameter_set_id = 0xff; 327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->number_of_first_au_info_nal_before_first_slice++; 331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_PPS: 334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //OS_INFO("*****************************PPS**************************************\n"); 336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t old_sps_id = pInfo->active_SPS.seq_parameter_set_id; 338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t old_pps_id = pInfo->active_PPS.pic_parameter_set_id; 339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_memset(&pInfo->active_PPS, 0x0, sizeof(pic_param_set)); 341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->number_of_first_au_info_nal_before_first_slice++; 342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (h264_Parse_PicParameterSet(parent, pInfo, &pInfo->active_PPS)== H264_STATUS_OK) 344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Copy_Sps_From_DDR(pInfo, &(pInfo->active_SPS), pInfo->active_PPS.seq_parameter_set_id); 346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(old_sps_id != pInfo->active_SPS.seq_parameter_set_id) 347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->Is_SPS_updated = 1; 349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->active_SPS.seq_parameter_set_id != 0xff) { 351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Copy_Pps_To_DDR(pInfo, &pInfo->active_PPS, pInfo->active_PPS.pic_parameter_set_id); 352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->got_start = 1; 353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->sei_information.recovery_point) 354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.recovery_point_found |= 2; 356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// Enable the RP recovery if no IDR ---Cisco 358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((pInfo->img.recovery_point_found & 1)==0) 359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_rp_received = 1; 360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Copy_Sps_From_DDR(pInfo, &(pInfo->active_SPS), old_sps_id); 365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee #ifdef DUMP_HEADER_INFO 367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dump_pps(&(pInfo->active_PPS)); 368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee #endif 369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(old_sps_id<MAX_NUM_SPS) 371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Copy_Sps_From_DDR(pInfo, &(pInfo->active_SPS), old_sps_id); 372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(old_pps_id<MAX_NUM_PPS) 373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Copy_Pps_From_DDR(pInfo, &(pInfo->active_PPS), old_pps_id); 374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } //// End of PPS parsing 377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_EOSeq: 381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_EOstream: 382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_parse_emit_eos(parent, pInfo); 384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_init_dpb(&(pInfo->dpb)); 385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* picture level info which will always be initialized */ 387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_init_Info_under_sps_pps_level(pInfo); 388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////reset the pInfo here 390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //viddec_h264_init(ctxt, (uint32_t *)parser->sps_pps_ddr_paddr, false); 391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = H264_STATUS_OK; 394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->number_of_first_au_info_nal_before_first_slice++; 395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Acc_unit_delimiter: 398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1 399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// primary_pic_type 400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t code = 0xff; 402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ret = 0; 403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = viddec_pm_get_bits(parent, (uint32_t *)&(code), 3); 404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(ret != -1) { 406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if(pInfo->got_start && (code == 0)) 407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //{ 408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //pInfo->img.recovery_point_found |= 4; 409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //} 410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->primary_pic_type_plus_one = (uint8_t)(code)+1; 411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = H264_STATUS_OK; 412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->number_of_first_au_info_nal_before_first_slice++; 414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved1: 419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved2: 420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved3: 421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved4: 422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved5: 423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = H264_STATUS_OK; 424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->number_of_first_au_info_nal_before_first_slice++; 425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_filler_data: 428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = H264_STATUS_OK; 429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_ACP: 431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_SPS_extension: 433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_unspecified: 434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_unspecified2: 435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = H264_STATUS_OK; 436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //nothing 437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: 439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee status = H264_STATUS_OK; 440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //pInfo->old_nal_unit_type = pInfo->nal_unit_type; 444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch ( pInfo->nal_unit_type ) 445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_IDR: 447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_SLICE: 448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Acc_unit_delimiter: 449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_SPS: 450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_PPS: 451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_SEI: 452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_EOSeq: 453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_EOstream: 454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved1: 455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved2: 456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved3: 457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved4: 458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_NAL_UNIT_TYPE_Reserved5: 459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->old_nal_unit_type = pInfo->nal_unit_type; 461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: 464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return status; 468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 477bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic uint32_t viddec_h264_is_frame_start(void *ctxt) 478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct h264_viddec_parser* parser = ctxt; 480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t ret = 0; 481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Info * pInfo = &(parser->info); 483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.g_new_frame) { 485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = 1; 486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP 492bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t viddec_h264_wkld_done(void *parent, void *ctxt, unsigned int next_sc, 493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t *codec_specific_errors) 494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 495bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic uint32_t viddec_h264_wkld_done(void *parent, void *ctxt, unsigned int next_sc, uint32_t *codec_specific_errors) 496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct h264_viddec_parser* parser = ctxt; 499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t ret = VIDDEC_PARSE_SUCESS; 500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Info * pInfo = &(parser->info); 501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t is_stream_forced_to_complete=false; 502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee is_stream_forced_to_complete = (VIDDEC_PARSE_EOS == next_sc) || (VIDDEC_PARSE_DISCONTINUITY == next_sc); 504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(is_stream_forced_to_complete || (pInfo->is_current_workload_done)) 506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_workload_t *wl; 508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_frame_attributes_t *attrs; 509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee wl = viddec_pm_get_header( parent ); 511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee attrs = &wl->attrs; 512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((attrs->cont_size.width < 32) || (attrs->cont_size.width > 2048) || (attrs->cont_size.height < 32) || (attrs->cont_size.height>2048)) 514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee attrs->cont_size.width = 32; 516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee attrs->cont_size.height = 32; 517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE; 518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr |= (FRAME << FIELD_ERR_OFFSET); 519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *codec_specific_errors = pInfo->wl_err_curr; 522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr = pInfo->wl_err_next; 523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_next = 0; 524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(is_stream_forced_to_complete) 526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_parse_emit_eos(parent, pInfo); 528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = VIDDEC_PARSE_FRMDONE; 530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP 536bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_h264_get_context_size(viddec_parser_memory_sizes_t *size) 537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 538bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_h264_get_context_size(viddec_parser_memory_sizes_t *size) 539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Should return size of my structure */ 542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee size->context_size = sizeof(struct h264_viddec_parser); 543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee size->persist_size = MAX_NUM_SPS * sizeof(seq_param_set_all) 544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee + MAX_NUM_PPS * sizeof(pic_param_set) 545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee + MAX_NUM_SPS * sizeof(int32_t) * MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE 546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee + sizeof(int32_t) * MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE; 547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 549bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_h264_get_ops(viddec_parser_ops_t *ops) 550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ops->init = viddec_h264_init; 552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ops->parse_syntax = viddec_h264_parse; 554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ops->get_cxt_size = viddec_h264_get_context_size; 555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ops->is_wkld_done = viddec_h264_wkld_done; 556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ops->is_frame_start = viddec_h264_is_frame_start; 557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 560