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