xref: /OK3568_Linux_fs/external/rockit/tgi/sdk/include/rt_message.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2018 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  * author: Hery.Xu@rock-chips.com
17*4882a593Smuzhiyun  *   date: 20181102
18*4882a593Smuzhiyun  * author: martin.cheng@rock-chips.com
19*4882a593Smuzhiyun  *   date: 20181126
20*4882a593Smuzhiyun  */
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #ifndef SRC_RT_TASK_INCLUDE_RT_MESSAGE_H_
23*4882a593Smuzhiyun #define SRC_RT_TASK_INCLUDE_RT_MESSAGE_H_
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include "rt_header.h" // NOLINT
26*4882a593Smuzhiyun #include "rt_thread.h" // NOLINT
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #ifdef __cplusplus
29*4882a593Smuzhiyun extern "C" {
30*4882a593Smuzhiyun #endif
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun // events from integration(player) layer.
33*4882a593Smuzhiyun enum RTMediaEvent {
34*4882a593Smuzhiyun     // mediaplayer msg
35*4882a593Smuzhiyun     RT_MEDIA_NOP               = 0,  // interface test message
36*4882a593Smuzhiyun     RT_MEDIA_PREPARED          = 1,
37*4882a593Smuzhiyun     RT_MEDIA_PLAYBACK_COMPLETE = 2,
38*4882a593Smuzhiyun     RT_MEDIA_BUFFERING_UPDATE  = 3,
39*4882a593Smuzhiyun     RT_MEDIA_SEEK_COMPLETE     = 4,
40*4882a593Smuzhiyun     RT_MEDIA_SET_VIDEO_SIZE    = 5,
41*4882a593Smuzhiyun     RT_MEDIA_STARTED           = 6,
42*4882a593Smuzhiyun     RT_MEDIA_PAUSED            = 7,
43*4882a593Smuzhiyun     RT_MEDIA_STOPPED           = 8,
44*4882a593Smuzhiyun     RT_MEDIA_SKIPPED           = 9,
45*4882a593Smuzhiyun     RT_MEDIA_TIMED_TEXT        = 99,
46*4882a593Smuzhiyun     RT_MEDIA_ERROR             = 100,
47*4882a593Smuzhiyun     RT_MEDIA_INFO              = 200,
48*4882a593Smuzhiyun     RT_MEDIA_SUBTITLE_DATA     = 201,
49*4882a593Smuzhiyun     RT_MEDIA_SEEK_ASYNC        = 14,
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun // commands used by integration(player) layer.
53*4882a593Smuzhiyun enum RTMediaCmd {
54*4882a593Smuzhiyun     RT_MEDIA_CMD_NOP              = 512,
55*4882a593Smuzhiyun     RT_MEDIA_CMD_SET_DATASOURCE,
56*4882a593Smuzhiyun     RT_MEDIA_CMD_PREPARE,
57*4882a593Smuzhiyun     RT_MEDIA_CMD_SEEKTO,
58*4882a593Smuzhiyun     RT_MEDIA_CMD_START,
59*4882a593Smuzhiyun     RT_MEDIA_CMD_STOP,
60*4882a593Smuzhiyun     RT_MEDIA_CMD_PAUSE,
61*4882a593Smuzhiyun     RT_MEDIA_CMD_RESET,
62*4882a593Smuzhiyun     RT_MEDIA_CMD_INVOKE,
63*4882a593Smuzhiyun     RT_MEDIA_CMD_MAX,
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun // events from node layer.
67*4882a593Smuzhiyun enum RTNodeEvent {
68*4882a593Smuzhiyun     RT_NODE_OK = 1024,
69*4882a593Smuzhiyun     RT_NODE_ERR_CODEC,
70*4882a593Smuzhiyun     RT_NODE_ERR_CODEC_VIDEO,
71*4882a593Smuzhiyun     RT_NODE_ERR_CODEC_AUDIO,
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun     // sub-events start
74*4882a593Smuzhiyun     RT_NODE_ERR_TINY_BASE = 1128,
75*4882a593Smuzhiyun     RT_NODE_ERR_CODEC_NONE,
76*4882a593Smuzhiyun     RT_NODE_ERR_FRAME,
77*4882a593Smuzhiyun     RT_NODE_ERR_SINK,
78*4882a593Smuzhiyun     RT_NODE_ERR_TINY_MAX,
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun     RT_NODE_ERR_FATAL_BASE = 1256,
81*4882a593Smuzhiyun     RT_NODE_ERR_PIXFORMAT,
82*4882a593Smuzhiyun     RT_NODE_ERR_CP_VCODEC,
83*4882a593Smuzhiyun     RT_NODE_ERR_HTTP,
84*4882a593Smuzhiyun     RT_NODE_ERR_INIT,
85*4882a593Smuzhiyun     RT_NODE_ERR_IO,
86*4882a593Smuzhiyun     RT_NODE_ERR_RUNTIME,
87*4882a593Smuzhiyun     RT_NODE_ERR_FATAL_MAX,
88*4882a593Smuzhiyun     RT_NODE_ERR_MAX,
89*4882a593Smuzhiyun     // sub-events end
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun     RT_NODE_INFO_BASE = 2048,
92*4882a593Smuzhiyun     RT_NODE_INFO_CACHE,
93*4882a593Smuzhiyun     RT_NODE_INFO_EOS_VIDEO,
94*4882a593Smuzhiyun     RT_NODE_INFO_EOS_AUDIO,
95*4882a593Smuzhiyun     RT_NODE_INFO_FIRST_FRAME,
96*4882a593Smuzhiyun     RT_NODE_INFO_SYNC,
97*4882a593Smuzhiyun     RT_NODE_INFO_RESTART_VIDEO,
98*4882a593Smuzhiyun     RT_NODE_INFO_RESTART_AUDIO,
99*4882a593Smuzhiyun     RT_NODE_INFO_RESTART_SUBTE,
100*4882a593Smuzhiyun     RT_NODE_INFO_SET_SPEED,
101*4882a593Smuzhiyun     RT_NODE_INFO_MAX,
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun enum RTNodeRequest {
105*4882a593Smuzhiyun     RT_NODE_REQ_BASE = 0,
106*4882a593Smuzhiyun     RT_NODE_REQ_RETRY_ONCE,
107*4882a593Smuzhiyun     RT_NODE_REQ_RETRY_NONE,
108*4882a593Smuzhiyun     RT_NODE_REQ_MAX,
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun typedef struct _rt_media_event {
112*4882a593Smuzhiyun     UINT32      cmd;
113*4882a593Smuzhiyun     const char *name;
114*4882a593Smuzhiyun } rt_media_event;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun static const rt_media_event mMediaEvents[] = {
118*4882a593Smuzhiyun     { RT_MEDIA_NOP,               "EVENT_NOP" },
119*4882a593Smuzhiyun     { RT_MEDIA_PREPARED,          "EVENT_PREPARED" },
120*4882a593Smuzhiyun     { RT_MEDIA_PLAYBACK_COMPLETE, "EVENT_COMPLETE" },
121*4882a593Smuzhiyun     { RT_MEDIA_BUFFERING_UPDATE,  "EVENT_BUFFERING_UPDATE" },
122*4882a593Smuzhiyun     { RT_MEDIA_SEEK_COMPLETE,     "EVENT_SEEK_COMPLETE" },
123*4882a593Smuzhiyun     { RT_MEDIA_SET_VIDEO_SIZE,    "EVENT_SET_VIDEO_SIZE" },
124*4882a593Smuzhiyun     { RT_MEDIA_STARTED,           "EVENT_STARTED" },
125*4882a593Smuzhiyun     { RT_MEDIA_PAUSED,            "EVENT_PAUSED" },
126*4882a593Smuzhiyun     { RT_MEDIA_STOPPED,           "EVENT_STOPPED" },
127*4882a593Smuzhiyun     { RT_MEDIA_SKIPPED,           "EVENT_SKIPPED" },
128*4882a593Smuzhiyun     { RT_MEDIA_TIMED_TEXT,        "EVENT_TIMED_TEXT" },
129*4882a593Smuzhiyun     { RT_MEDIA_ERROR,             "EVENT_ERROR" },
130*4882a593Smuzhiyun     { RT_MEDIA_INFO,              "EVENT_INFO" },
131*4882a593Smuzhiyun     { RT_MEDIA_SUBTITLE_DATA,     "SUBTITLE_DATA" },
132*4882a593Smuzhiyun     { RT_MEDIA_SEEK_ASYNC,        "SEEK_ASYNC" },
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun static const rt_media_event mMediaCmds[] = {
136*4882a593Smuzhiyun     { RT_MEDIA_CMD_NOP,               "NOP" },
137*4882a593Smuzhiyun     { RT_MEDIA_CMD_SET_DATASOURCE,    "SET_DATASOURCE" },
138*4882a593Smuzhiyun     { RT_MEDIA_CMD_PREPARE,           "PREPARE" },
139*4882a593Smuzhiyun     { RT_MEDIA_CMD_SEEKTO,            "SEEKTO" },
140*4882a593Smuzhiyun     { RT_MEDIA_CMD_START,             "START" },
141*4882a593Smuzhiyun     { RT_MEDIA_CMD_STOP,              "STOP" },
142*4882a593Smuzhiyun     { RT_MEDIA_CMD_PAUSE,             "PAUSE" },
143*4882a593Smuzhiyun     { RT_MEDIA_CMD_RESET,             "RESET" },
144*4882a593Smuzhiyun     { RT_MEDIA_CMD_INVOKE,            "INVOKE" },
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun struct RTMsgHandler;
148*4882a593Smuzhiyun struct RTMsgLooper;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun struct RTMessage {
151*4882a593Smuzhiyun     struct RTMsgData {
152*4882a593Smuzhiyun         INT32   mWhat;
153*4882a593Smuzhiyun         UINT64  mWhenUs;
154*4882a593Smuzhiyun         UINT32  mArgU32;
155*4882a593Smuzhiyun         UINT64  mArgU64;
156*4882a593Smuzhiyun         RT_PTR  mArgPtr;
157*4882a593Smuzhiyun         INT32   mResult;
158*4882a593Smuzhiyun     };
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun  public:
161*4882a593Smuzhiyun     RTMessage();
162*4882a593Smuzhiyun     RTMessage(UINT32 what, UINT32 arg32, UINT64 arg64, struct RTMsgHandler* handler = RT_NULL);
163*4882a593Smuzhiyun     RTMessage(UINT32 what, RT_PTR data, struct RTMsgHandler* handler = RT_NULL);
164*4882a593Smuzhiyun     ~RTMessage();
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun     void           setWhat(UINT32 what);
167*4882a593Smuzhiyun     const UINT32   getWhat();
168*4882a593Smuzhiyun     void           setData(RT_PTR data);
169*4882a593Smuzhiyun     const RT_PTR   getData();
170*4882a593Smuzhiyun     void           setWhenUs(UINT64 when);
171*4882a593Smuzhiyun     const UINT64   getWhenUs();
172*4882a593Smuzhiyun     void           setResult(INT32 result);
173*4882a593Smuzhiyun     INT32          getResult();
174*4882a593Smuzhiyun     void           setTarget(struct RTMsgHandler* handler);
getTargetRTMessage175*4882a593Smuzhiyun     struct RTMsgHandler *getTarget() {
176*4882a593Smuzhiyun         return mHandler;
177*4882a593Smuzhiyun     }
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun     RTMessage*     dup();      // performs message deep copy
180*4882a593Smuzhiyun     const char*    toString();
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun     struct RTMsgData mData;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun  private:
185*4882a593Smuzhiyun     void           initialize();
186*4882a593Smuzhiyun     RT_RET         deliver();
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun  private:
189*4882a593Smuzhiyun     friend struct RTMsgLooper;  // deliver()
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun     struct RTMsgHandler *mHandler;
192*4882a593Smuzhiyun     RtCondition         *mMsgCond;
193*4882a593Smuzhiyun     RT_BOOL              mSync;
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun #ifdef __cplusplus
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun #endif
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun #endif  // SRC_RT_TASK_INCLUDE_RT_MESSAGE_H_
201