xref: /rockchip-linux_mpp/mpp/base/inc/mpp_enc_refs.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #ifndef __MPP_ENC_REFS_H__
18*437bfbebSnyanmisaka #define __MPP_ENC_REFS_H__
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include "mpp_enc_cfg.h"
21*437bfbebSnyanmisaka #include "mpp_enc_ref.h"
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka /*
24*437bfbebSnyanmisaka  * MppEncRefs has two runtime mode:
25*437bfbebSnyanmisaka  *
26*437bfbebSnyanmisaka  * 1. dryrun mode
27*437bfbebSnyanmisaka  * This mode is for estimating the dpb size and configure check.
28*437bfbebSnyanmisaka  *
29*437bfbebSnyanmisaka  * 2. runtime mode
30*437bfbebSnyanmisaka  * Thie mode is for real dpb loop in real encoder workflow.
31*437bfbebSnyanmisaka  *
32*437bfbebSnyanmisaka  * When encoder is running user can change the frame property by MppEncRefFrmUsrCfg.
33*437bfbebSnyanmisaka  */
34*437bfbebSnyanmisaka #define ENC_FORCE_IDR           (0x00000001)
35*437bfbebSnyanmisaka #define ENC_FORCE_NONREF        (0x00000002)
36*437bfbebSnyanmisaka #define ENC_FORCE_LT_REF_IDX    (0x00000004)
37*437bfbebSnyanmisaka #define ENC_FORCE_TEMPORAL_ID   (0x00000008)
38*437bfbebSnyanmisaka #define ENC_FORCE_REF_MODE      (0x00000010)
39*437bfbebSnyanmisaka #define ENC_FORCE_PSKIP_IS_REF  (0x00000020)
40*437bfbebSnyanmisaka #define ENC_FORCE_PSKIP_NON_REF (0x00000040)
41*437bfbebSnyanmisaka 
42*437bfbebSnyanmisaka typedef struct MppEncRefFrmForceCfg_t {
43*437bfbebSnyanmisaka     RK_U32              force_flag;
44*437bfbebSnyanmisaka     RK_S32              force_idr;
45*437bfbebSnyanmisaka     RK_S32              force_pskip;
46*437bfbebSnyanmisaka     RK_S32              force_nonref;
47*437bfbebSnyanmisaka     RK_S32              force_lt_idx;
48*437bfbebSnyanmisaka     RK_S32              force_temporal_id;
49*437bfbebSnyanmisaka     MppEncRefMode       force_ref_mode;
50*437bfbebSnyanmisaka     RK_S32              force_ref_arg;
51*437bfbebSnyanmisaka } MppEncRefFrmUsrCfg;
52*437bfbebSnyanmisaka 
53*437bfbebSnyanmisaka typedef void* MppEncRefs;
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka #ifdef __cplusplus
56*437bfbebSnyanmisaka extern "C" {
57*437bfbebSnyanmisaka #endif
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_init(MppEncRefs *refs);
60*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_deinit(MppEncRefs *refs);
61*437bfbebSnyanmisaka 
62*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_set_cfg(MppEncRefs refs, MppEncRefCfg ref_cfg);
63*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_set_usr_cfg(MppEncRefs refs, MppEncRefFrmUsrCfg *force);
64*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_set_rc_igop(MppEncRefs refs, RK_S32 igop);
65*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_set_refresh_length(MppEncRefs refs, RK_S32 len);
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka /* return hdr need update or not */
68*437bfbebSnyanmisaka RK_S32  mpp_enc_refs_update_hdr(MppEncRefs refs);
69*437bfbebSnyanmisaka 
70*437bfbebSnyanmisaka /* get dpb size */
71*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_get_cpb_info(MppEncRefs refs, MppEncCpbInfo *info);
72*437bfbebSnyanmisaka /* get status for next frame */
73*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_get_cpb(MppEncRefs refs, EncCpbStatus *status);
74*437bfbebSnyanmisaka /* dryrun and check all configure */
75*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_dryrun(MppEncRefs refs);
76*437bfbebSnyanmisaka 
77*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_stash(MppEncRefs refs);
78*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_rollback(MppEncRefs refs);
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka /* two-pass encoding functions */
81*437bfbebSnyanmisaka /* check next frame is intra or not */
82*437bfbebSnyanmisaka RK_S32  mpp_enc_refs_next_frm_is_intra(MppEncRefs refs);
83*437bfbebSnyanmisaka MPP_RET mpp_enc_refs_get_cpb_pass1(MppEncRefs refs, EncCpbStatus *status);
84*437bfbebSnyanmisaka 
85*437bfbebSnyanmisaka #define dump_frm(frm)   _dump_frm(frm, __FUNCTION__, __LINE__)
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka void _dump_frm(EncFrmStatus *frm, const char *func, RK_S32 line);
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka #ifdef __cplusplus
90*437bfbebSnyanmisaka }
91*437bfbebSnyanmisaka #endif
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka #endif /*__MPP_ENC_REFS_H__*/
94