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