hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
/*
 * Copyright 2020 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 SRC_RT_TASK_TASK_NODE_FILTER_RTNODEVFILTER_VIDEO_OUTPUT_H_
#define SRC_RT_TASK_TASK_NODE_FILTER_RTNODEVFILTER_VIDEO_OUTPUT_H_
 
#include "RTTaskNode.h"
#include "RTMediaRockx.h"
#include "RTAIDetectResults.h"
 
#include "rk_debug.h"
#include "rk_mpi_sys.h"
#include "rk_mpi_vo.h"
#include "rk_mpi_vdec.h"
#include "rk_mpi_mb.h"
#include "rk_common.h"
 
#define MAX_FRAME_QUEUE              8
#define MAX_TIME_OUT_MS              20
 
#ifndef VDEC_INT64_MIN
#define VDEC_INT64_MIN               (-0x7fffffffffffffffLL-1)
#endif
 
#ifndef VDEC_INT64_MAX
#define VDEC_INT64_MAX               INT64_C(9223372036854775807)
#endif
 
#ifndef rk_safe_free
#define rk_safe_free(p)              { if (p) {free(p); (p)=RK_NULL;} }
#endif
 
#ifndef rk_safe_delete
#define rk_safe_delete(p)            { if (p) {delete(p); (p)=RK_NULL;} }
#endif
 
#define VDEC_ARRAY_ELEMS(a)          (sizeof(a) / sizeof((a)[0]))
 
typedef struct _rkWbcCfg {
    VO_WBC_SOURCE_S stWbcSource;
    VO_WBC_ATTR_S stWbcAttr;
    RK_S32 s32ChnId;
    RK_S32 s32VdecChnId;
} WBC_CFG;
 
typedef struct _rkVdecCfg {
    RK_U32 u32FrameBufferCnt;
    COMPRESS_MODE_E enCompressMode;
} VDEC_CFG;
 
typedef struct _rkVOCfg {
    RK_U32 u32Screen0VoLayer;
    RK_U32 u32Screen1VoLayer;
 
    RK_U32 u32Screen0Rows;
    RK_U32 u32Screen1Rows;
    RK_BOOL bDoubleScreen;
} VO_CFG;
 
typedef struct _rkParserCfg {
    char *srcFileUri[VDEC_MAX_CHN_NUM];
    RK_CODEC_ID_E enCodecId;
    RK_U32 u32SrcWidth;
    RK_U32 u32SrcHeight;
    RK_U32 u32StreamIndex;
   //  AVFormatContext *pstAvfc;
} PARSER_CFG;
 
typedef struct _rkBorderCfg {
    RK_U32 u32LeftWidth;
    RK_U32 u32RightWidth;
    RK_U32 u32TopWidth;
    RK_U32 u32BottomWidth;
} Border_CFG;
 
#define RK356X_VOP_LAYER_CLUSTER_0      0
#define RK356X_VOP_LAYER_CLUSTER_1      2
#define RK356X_VOP_LAYER_ESMART_0       4
#define RK356X_VOP_LAYER_ESMART_1       5
#define RK356X_VOP_LAYER_SMART_0        6
#define RK356X_VOP_LAYER_SMART_1        7
 
#define RK356X_VO_DEV_HD0               0
#define RK356X_VO_DEV_HD1               1
 
#define DISPLAY_TYPE_HDMI                0
#define DISPLAY_TYPE_EDP                 1
#define DISPLAY_TYPE_VGA                 2
 
#define MAX_VO_FORMAT_RGB_NUM            4
#define TEST_VO_FORMAT_ARGB8888          0
#define TEST_VO_FORMAT_ABGR8888          1
#define TEST_VO_FORMAT_RGB888            2
#define TEST_VO_FORMAT_BGR888            3
#define TEST_VO_FORMAT_ARGB1555          4
#define TEST_VO_FORMAT_ABGR1555          5
#define TEST_VO_FORMAT_NV12              6
#define TEST_VO_FORMAT_NV21              7
 
#define VO_CHANNEL_PLAY_NORMAL           0
#define VO_CHANNEL_PLAY_PAUSE            1
#define VO_CHANNEL_PLAY_STEP             2
#define VO_CHANNEL_PLAY_SPEED            3
 
#define WBC_SOURCE_DEV                0
#define WBC_SOURCE_VIDEO              1
#define WBC_SOURCE_GRAPHIC            2
 
#define MAX_WINDOWS_NUM               64
#define MAX_STEP_FRAME_NUM            50
 
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
 
typedef struct _VO_MODE {
    RK_U32 mode;
    VO_INTF_SYNC_E enIntfSync;
} ROCKIT_VO_MODE_S;
 
static VO_DEV VoLayer = RK356X_VOP_LAYER_CLUSTER_0;
static VO_DEV VoLayer_second = RK356X_VOP_LAYER_CLUSTER_1;
 
ROCKIT_VO_MODE_S test_mode_table[] = {
    {0,     VO_OUTPUT_640x480_60},
    {1,     VO_OUTPUT_NTSC},
    {2,     VO_OUTPUT_PAL},
    {3,     VO_OUTPUT_480P60},
    {4,     VO_OUTPUT_576P50},
    {5,     VO_OUTPUT_800x600_60},
    {6,     VO_OUTPUT_1024x768_60},
    {7,     VO_OUTPUT_720P50},
    {8,     VO_OUTPUT_720P60},
    {9,     VO_OUTPUT_1280x800_60},
    {10,    VO_OUTPUT_1280x1024_60},
    {11,    VO_OUTPUT_1366x768_60},
    {12,    VO_OUTPUT_1440x900_60},
    {13,    VO_OUTPUT_1600x1200_60},
    {14,    VO_OUTPUT_1680x1050_60},
    {15,    VO_OUTPUT_1080I50},
    {16,    VO_OUTPUT_1080I60},
    {17,    VO_OUTPUT_1080P50},
    {18,    VO_OUTPUT_1080P60},
    {19,    VO_OUTPUT_1920x1200_60},
    {20,    VO_OUTPUT_3840x2160_24},
    {21,    VO_OUTPUT_3840x2160_25},
    {22,    VO_OUTPUT_3840x2160_30},
    {23,    VO_OUTPUT_3840x2160_50},
    {24,    VO_OUTPUT_3840x2160_60},
};
 
typedef struct _rkMpiVOCtx {
    RK_S32  VoDev;
    RK_S32  VoLayer;
    RK_S32  VoLayerMode;
 
    RK_S32  u32Windows;
    RK_U32  enIntfType; /* 0 HDMI 1 edp */
    RK_U32  enIntfSync; /* VO_OUTPUT_1080P50 */
    RK_U32  s32X;
    RK_U32  s32Y;
    RK_U32  u32DispWidth;
    RK_U32  u32DispHeight;
    RK_U32  u32ImgeWidth;
    RK_U32  u32ImageHeight;
    RK_S32  s32PixFormat;
    RK_U32  u32DispFrmRt;
    RK_U32  u32DispFrmRtRatio;
    RK_U32  uEnMode;
 
    RK_U32  wbc_enable;
    RK_BOOL wbc_auto;
    RK_U32  ui;
    RK_U32  ui_alpha;
    RK_U32  u32WbcWidth;
    RK_S32  u32WbcHeight;
    COMPRESS_MODE_E  u32WbcCompressMode;
    RK_S32  u32WbcPixFormat;
    RK_U32  u32WbcSourceType;
    RK_U32  u32WbcSourceId;
 
    VO_LAYER   VoVideoLayer;
    RK_U32     u32VideoWindows;
    RK_U32     u32GFXLayers;
    VO_LAYER   VOGfxLayer;
    RK_BOOL    threadExit;
 
    RK_BOOL     bVoPlay;
    const char *cfgFileUri;
    RK_S32      s32LoopCount;
    RK_U32      u32ChnIndex;
    RK_U32      u32Screen0Chn;
    RK_U32      u32ChnDismode;
    RK_U32      u32Screen1Chn;
    RK_BOOL     bThreadExit;
 
    RK_BOOL     bEnWbc;
    RK_BOOL     bEnWbcToVO;
    RK_BOOL     bChnPriority;
 
    PARSER_CFG  stParserCfg;
    VDEC_CFG    stVdecCfg;
    VO_CFG      stVoCfg;
    WBC_CFG     stWbcCfg;
    Border_CFG  stBorderCfg;
} ROCKIT_VO_CTX_S;
 
typedef struct _VO_Send_Thread_Param {
    RK_U32 u32VideoWindows;
    VO_LAYER VoVideoLayer;
    RK_U32 u32GFXLayers;
    VO_LAYER VOGfxLayer;
    RK_U32 u32Exit;
} VoThreadParam;
 
#define HDMI_RKVO_DEBUG_FPS "/tmp/hdmi_rkvo_fps"
 
class RTNodeVFilterVideoOutput : public RTTaskNode {
 public:
    RTNodeVFilterVideoOutput();
    virtual ~RTNodeVFilterVideoOutput();
 
    virtual RT_RET open(RTTaskNodeContext *context);
    virtual RT_RET process(RTTaskNodeContext *context);
    virtual RT_RET close(RTTaskNodeContext *context);
 protected:
    virtual RT_RET invokeInternal(RtMetaData *meta);
 
 private:
    RtMutex        *mLock;
    INT32           mSrcWidth;
    INT32           mSrcHeight;
    float           mClipRatio;
    INT32           mClipWidth;
    INT32           mClipHeight;
    ROCKIT_VO_CTX_S mCtx;
    INT64           frameCount;
    timeval         beginTime;
    INT32           drmInitSuccess;
    VIDEO_FRAME_INFO_S      *pstVFrame;
};
 
#endif  // SRC_RT_TASK_TASK_NODE_FILTER_RTNODEVFILTER_VIDEO_OUTPUT