xref: /rockchip-linux_mpp/mpp/hal/inc/hal_enc_task.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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