1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * 3*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD 4*437bfbebSnyanmisaka * 5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License"); 6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License. 7*437bfbebSnyanmisaka * You may obtain a copy of the License at 8*437bfbebSnyanmisaka * 9*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0 10*437bfbebSnyanmisaka * 11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software 12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS, 13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and 15*437bfbebSnyanmisaka * limitations under the License. 16*437bfbebSnyanmisaka */ 17*437bfbebSnyanmisaka 18*437bfbebSnyanmisaka #ifndef __HAL_ENC_TASK__ 19*437bfbebSnyanmisaka #define __HAL_ENC_TASK__ 20*437bfbebSnyanmisaka 21*437bfbebSnyanmisaka #include "mpp_time.h" 22*437bfbebSnyanmisaka 23*437bfbebSnyanmisaka #include "hal_task.h" 24*437bfbebSnyanmisaka #include "mpp_rc_defs.h" 25*437bfbebSnyanmisaka #include "mpp_enc_refs.h" 26*437bfbebSnyanmisaka 27*437bfbebSnyanmisaka #define HAL_ENC_TASK_ERR_INIT 0x00000001 28*437bfbebSnyanmisaka #define HAL_ENC_TASK_ERR_ALLOC 0x00000010 29*437bfbebSnyanmisaka #define HAL_ENC_TASK_ERR_EXTRAINFO 0x00000100 30*437bfbebSnyanmisaka #define HAL_ENC_TASK_ERR_GENREG 0x00001000 31*437bfbebSnyanmisaka #define HAL_ENC_TASK_ERR_START 0x00010000 32*437bfbebSnyanmisaka #define HAL_ENC_TASK_ERR_WAIT 0x00100000 33*437bfbebSnyanmisaka 34*437bfbebSnyanmisaka typedef struct HalEncTaskFlag_t { 35*437bfbebSnyanmisaka RK_U32 err; 36*437bfbebSnyanmisaka RK_S32 drop_by_fps; 37*437bfbebSnyanmisaka RK_S32 reg_idx; 38*437bfbebSnyanmisaka /* hal buf index */ 39*437bfbebSnyanmisaka RK_S32 curr_idx; 40*437bfbebSnyanmisaka RK_S32 refr_idx; 41*437bfbebSnyanmisaka } HalEncTaskFlag; 42*437bfbebSnyanmisaka 43*437bfbebSnyanmisaka typedef struct MppSyntax_t { 44*437bfbebSnyanmisaka RK_U32 number; 45*437bfbebSnyanmisaka void *data; 46*437bfbebSnyanmisaka } MppSyntax; 47*437bfbebSnyanmisaka 48*437bfbebSnyanmisaka typedef struct HalEncTask_t { 49*437bfbebSnyanmisaka RK_U32 valid; 50*437bfbebSnyanmisaka 51*437bfbebSnyanmisaka // rate control data channel 52*437bfbebSnyanmisaka EncRcTask *rc_task; 53*437bfbebSnyanmisaka 54*437bfbebSnyanmisaka // cpb reference force config 55*437bfbebSnyanmisaka MppEncRefFrmUsrCfg *frm_cfg; 56*437bfbebSnyanmisaka 57*437bfbebSnyanmisaka // current tesk protocol syntax information 58*437bfbebSnyanmisaka MppSyntax syntax; 59*437bfbebSnyanmisaka MppSyntax hal_ret; 60*437bfbebSnyanmisaka 61*437bfbebSnyanmisaka /* 62*437bfbebSnyanmisaka * Current tesk output stream buffer 63*437bfbebSnyanmisaka * 64*437bfbebSnyanmisaka * Usage and flow of changing task length and packet length 65*437bfbebSnyanmisaka * 66*437bfbebSnyanmisaka * 1. length is runtime updated for each stage. 67*437bfbebSnyanmisaka * header_length / sei_length / hw_length are for recording. 68*437bfbebSnyanmisaka * 69*437bfbebSnyanmisaka * 2. When writing vps/sps/pps encoder should update length. 70*437bfbebSnyanmisaka * Then length will be kept before next stage is done. 71*437bfbebSnyanmisaka * For example when vps/sps/pps were inserted and slice data need 72*437bfbebSnyanmisaka * reencoding the hal should update length at the final loop. 73*437bfbebSnyanmisaka * 74*437bfbebSnyanmisaka * 3. length in task and length in packet should be updated at the same 75*437bfbebSnyanmisaka * time. Encoder flow need to check these two length between stages. 76*437bfbebSnyanmisaka */ 77*437bfbebSnyanmisaka MppPacket packet; 78*437bfbebSnyanmisaka MppBuffer output; 79*437bfbebSnyanmisaka RK_S32 header_length; 80*437bfbebSnyanmisaka RK_S32 sei_length; 81*437bfbebSnyanmisaka RK_S32 hw_length; 82*437bfbebSnyanmisaka RK_U32 length; 83*437bfbebSnyanmisaka /* For reenc process and record segment number before hardware encoding */ 84*437bfbebSnyanmisaka RK_U32 segment_nb; 85*437bfbebSnyanmisaka 86*437bfbebSnyanmisaka // current tesk input slot buffer 87*437bfbebSnyanmisaka MppFrame frame; 88*437bfbebSnyanmisaka MppBuffer input; 89*437bfbebSnyanmisaka 90*437bfbebSnyanmisaka // task stopwatch for timing 91*437bfbebSnyanmisaka MppStopwatch stopwatch; 92*437bfbebSnyanmisaka 93*437bfbebSnyanmisaka // current md info output buffer 94*437bfbebSnyanmisaka MppBuffer md_info; 95*437bfbebSnyanmisaka 96*437bfbebSnyanmisaka // low delay mode part output information 97*437bfbebSnyanmisaka RK_U32 part_first; 98*437bfbebSnyanmisaka RK_U32 part_last; 99*437bfbebSnyanmisaka RK_U32 part_count; 100*437bfbebSnyanmisaka RK_U8 *part_pos; 101*437bfbebSnyanmisaka size_t part_length; 102*437bfbebSnyanmisaka 103*437bfbebSnyanmisaka HalEncTaskFlag flags; 104*437bfbebSnyanmisaka } HalEncTask; 105*437bfbebSnyanmisaka 106*437bfbebSnyanmisaka /* encoder internal work flow */ 107*437bfbebSnyanmisaka typedef union EncAsyncStatus_u { 108*437bfbebSnyanmisaka RK_U32 val; 109*437bfbebSnyanmisaka struct { 110*437bfbebSnyanmisaka RK_U32 task_hnd_rdy : 1; 111*437bfbebSnyanmisaka RK_U32 task_in_rdy : 1; 112*437bfbebSnyanmisaka RK_U32 task_out_rdy : 1; 113*437bfbebSnyanmisaka 114*437bfbebSnyanmisaka RK_U32 frm_pkt_rdy : 1; 115*437bfbebSnyanmisaka 116*437bfbebSnyanmisaka RK_U32 hal_task_reset_rdy : 1; // reset hal task to start 117*437bfbebSnyanmisaka RK_U32 rc_check_frm_drop : 1; // rc stage 118*437bfbebSnyanmisaka RK_U32 check_frm_pskip : 1; // pskip frame check 119*437bfbebSnyanmisaka RK_U32 pkt_buf_rdy : 1; // prepare pkt buf 120*437bfbebSnyanmisaka 121*437bfbebSnyanmisaka RK_U32 enc_start : 1; // enc stage 122*437bfbebSnyanmisaka RK_U32 refs_force_update : 1; // enc stage 123*437bfbebSnyanmisaka RK_U32 low_delay_again : 1; // enc stage low delay output again 124*437bfbebSnyanmisaka 125*437bfbebSnyanmisaka RK_U32 enc_backup : 1; // enc stage 126*437bfbebSnyanmisaka RK_U32 enc_restore : 1; // reenc flow start point 127*437bfbebSnyanmisaka RK_U32 enc_proc_dpb : 1; // enc stage 128*437bfbebSnyanmisaka RK_U32 rc_frm_start : 1; // rc stage 129*437bfbebSnyanmisaka RK_U32 check_type_reenc : 1; // flow checkpoint if reenc -> enc_restore 130*437bfbebSnyanmisaka RK_U32 enc_proc_hal : 1; // enc stage 131*437bfbebSnyanmisaka RK_U32 hal_get_task : 1; // hal stage 132*437bfbebSnyanmisaka RK_U32 rc_hal_start : 1; // rc stage 133*437bfbebSnyanmisaka RK_U32 hal_gen_reg : 1; // hal stage 134*437bfbebSnyanmisaka RK_U32 hal_start : 1; // hal stage 135*437bfbebSnyanmisaka RK_U32 hal_wait : 1; // hal stage NOTE: special in low delay mode 136*437bfbebSnyanmisaka RK_U32 rc_hal_end : 1; // rc stage 137*437bfbebSnyanmisaka RK_U32 hal_ret_task : 1; // hal stage 138*437bfbebSnyanmisaka RK_U32 enc_update_hal : 1; // enc stage 139*437bfbebSnyanmisaka RK_U32 rc_frm_end : 1; // rc stage 140*437bfbebSnyanmisaka RK_U32 check_rc_reenc : 1; // flow checkpoint if reenc -> enc_restore 141*437bfbebSnyanmisaka RK_U32 enc_done : 1; // done stage 142*437bfbebSnyanmisaka RK_U32 slice_out_done : 1; 143*437bfbebSnyanmisaka }; 144*437bfbebSnyanmisaka } EncAsyncStatus; 145*437bfbebSnyanmisaka 146*437bfbebSnyanmisaka typedef struct EncAsyncTaskInfo_t { 147*437bfbebSnyanmisaka RK_S32 seq_idx; 148*437bfbebSnyanmisaka EncAsyncStatus status; 149*437bfbebSnyanmisaka RK_S64 pts; 150*437bfbebSnyanmisaka 151*437bfbebSnyanmisaka HalEncTask task; 152*437bfbebSnyanmisaka EncRcTask rc; 153*437bfbebSnyanmisaka MppEncRefFrmUsrCfg usr; 154*437bfbebSnyanmisaka } EncAsyncTaskInfo; 155*437bfbebSnyanmisaka 156*437bfbebSnyanmisaka #endif /* __HAL_ENC_TASK__ */ 157