/*
|
*
|
* Copyright 2015 Rockchip Electronics Co. LTD
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
#ifndef __HAL_ENC_TASK__
|
#define __HAL_ENC_TASK__
|
|
#include "mpp_time.h"
|
|
#include "hal_task.h"
|
#include "mpp_rc_defs.h"
|
#include "mpp_enc_refs.h"
|
|
#define HAL_ENC_TASK_ERR_INIT 0x00000001
|
#define HAL_ENC_TASK_ERR_ALLOC 0x00000010
|
#define HAL_ENC_TASK_ERR_EXTRAINFO 0x00000100
|
#define HAL_ENC_TASK_ERR_GENREG 0x00001000
|
#define HAL_ENC_TASK_ERR_START 0x00010000
|
#define HAL_ENC_TASK_ERR_WAIT 0x00100000
|
|
typedef struct HalEncTaskFlag_t {
|
RK_U32 err;
|
RK_S32 drop_by_fps;
|
RK_S32 reg_idx;
|
/* hal buf index */
|
RK_S32 curr_idx;
|
RK_S32 refr_idx;
|
} HalEncTaskFlag;
|
|
typedef struct MppSyntax_t {
|
RK_U32 number;
|
void *data;
|
} MppSyntax;
|
|
typedef struct HalEncTask_t {
|
RK_U32 valid;
|
|
// rate control data channel
|
EncRcTask *rc_task;
|
|
// cpb reference force config
|
MppEncRefFrmUsrCfg *frm_cfg;
|
|
// current tesk protocol syntax information
|
MppSyntax syntax;
|
MppSyntax hal_ret;
|
|
/*
|
* Current tesk output stream buffer
|
*
|
* Usage and flow of changing task length and packet length
|
*
|
* 1. length is runtime updated for each stage.
|
* header_length / sei_length / hw_length are for recording.
|
*
|
* 2. When writing vps/sps/pps encoder should update length.
|
* Then length will be kept before next stage is done.
|
* For example when vps/sps/pps were inserted and slice data need
|
* reencoding the hal should update length at the final loop.
|
*
|
* 3. length in task and length in packet should be updated at the same
|
* time. Encoder flow need to check these two length between stages.
|
*/
|
MppPacket packet;
|
MppBuffer output;
|
RK_S32 header_length;
|
RK_S32 sei_length;
|
RK_S32 hw_length;
|
RK_U32 length;
|
|
// current tesk input slot buffer
|
MppFrame frame;
|
MppBuffer input;
|
|
// task stopwatch for timing
|
MppStopwatch stopwatch;
|
|
// current md info output buffer
|
MppBuffer md_info;
|
|
// low delay mode part output information
|
RK_U32 part_first;
|
RK_U32 part_last;
|
RK_U32 part_count;
|
RK_U8 *part_pos;
|
size_t part_length;
|
|
HalEncTaskFlag flags;
|
} HalEncTask;
|
|
/* encoder internal work flow */
|
typedef union EncAsyncStatus_u {
|
RK_U32 val;
|
struct {
|
RK_U32 task_hnd_rdy : 1;
|
RK_U32 task_in_rdy : 1;
|
RK_U32 task_out_rdy : 1;
|
|
RK_U32 frm_pkt_rdy : 1;
|
|
RK_U32 hal_task_reset_rdy : 1; // reset hal task to start
|
RK_U32 rc_check_frm_drop : 1; // rc stage
|
RK_U32 pkt_buf_rdy : 1; // prepare pkt buf
|
|
RK_U32 enc_start : 1; // enc stage
|
RK_U32 refs_force_update : 1; // enc stage
|
RK_U32 low_delay_again : 1; // enc stage low delay output again
|
|
RK_U32 enc_backup : 1; // enc stage
|
RK_U32 enc_restore : 1; // reenc flow start point
|
RK_U32 enc_proc_dpb : 1; // enc stage
|
RK_U32 rc_frm_start : 1; // rc stage
|
RK_U32 check_type_reenc : 1; // flow checkpoint if reenc -> enc_restore
|
RK_U32 enc_proc_hal : 1; // enc stage
|
RK_U32 hal_get_task : 1; // hal stage
|
RK_U32 rc_hal_start : 1; // rc stage
|
RK_U32 hal_gen_reg : 1; // hal stage
|
RK_U32 hal_start : 1; // hal stage
|
RK_U32 hal_wait : 1; // hal stage NOTE: special in low delay mode
|
RK_U32 rc_hal_end : 1; // rc stage
|
RK_U32 hal_ret_task : 1; // hal stage
|
RK_U32 enc_update_hal : 1; // enc stage
|
RK_U32 rc_frm_end : 1; // rc stage
|
RK_U32 check_rc_reenc : 1; // flow checkpoint if reenc -> enc_restore
|
RK_U32 enc_done : 1; // done stage
|
RK_U32 slice_out_done : 1;
|
};
|
} EncAsyncStatus;
|
|
typedef struct EncAsyncTaskInfo_t {
|
RK_S32 seq_idx;
|
EncAsyncStatus status;
|
RK_S64 pts;
|
|
HalEncTask task;
|
EncRcTask rc;
|
MppEncRefFrmUsrCfg usr;
|
} EncAsyncTaskInfo;
|
|
#endif /* __HAL_ENC_TASK__ */
|