MediaStream.hpp
1 //
2 // Created by xiong on 2021/8/6.
3 //
4 
5 #ifndef EMX_MediaStream_HPP
6 #define EMX_MediaStream_HPP
7 
8 #include <functional>
9 #include "core/EmxMsg.hpp"
10 #include "media/common/MediaRingBuffer.hpp"
11 #include "media/common/MediaTypedef.hpp"
12 
13 namespace Emx {
19  class MediaStream {
20  public:
22 
23  virtual ~MediaStream() {}
24 
30  using OnGetFrameCallback = std::function<void(Emx::ErrCodeE e, MediaFrame &frame)>;
31 
36  using OnGetFrameInfoCallback = std::function<void(MediaFrame &)>;
37 
39  class Channel {
40  public:
41 
47  void Add(MediaFrame::TypeE type, int32_t chn) {
48  array.emplace_back(type, chn);
49  }
50 
52  struct Item {
53  Item(MediaFrame::TypeE t, int32_t c) : type(t), chn(c), inited(false) {}
54 
56  int32_t chn;
57  uint32_t waitSeq;
58  bool inited;
59  };
60 
67  for (auto &e : array) {
68  if (e.type == t && e.chn == c)
69  return &e;
70  }
71  return nullptr;
72  }
73 
74  std::vector<Item> array;
75  };
76 
83 
84  protected:
85  void OnMsgRecv(uint32_t topic, const char *data, int32_t size);
86 
88 
89  protected:
93  std::string m_data;
95  };
96 
97 // //!@brief MediaFrame异步数据接收
98 // class MediaStreamAsync : public MediaStream {
99 // public:
100 // MediaStreamAsync(EuvLoop &loop) : MediaStream(), m_loop(loop) {}
101 //
102 // virtual ~MediaStreamAsync() {}
103 //
104 // /**
105 // * @brief 开始接收
106 // * @param chn [in] 需要接收的通道
107 // * @param cb [in] 接收到MediaFrame帧数据的回调函数
108 // * @param cbInfo [in] 仅接收到MediaFrame帧信息的回调函数(未去接收实际帧数据),可选参数
109 // * @return ErrCodeE
110 // */
111 // ErrCodeE Start(Channel &chn, OnGetFrameCallback cb, OnGetFrameInfoCallback cbInfo = nullptr);
112 //
113 // //!@brief 停止MediaFrame异步数据接收
114 // void Stop();
115 //
116 // //!@brief 暂停接收消息数据
117 // void RecvFramePause() { m_sub.PauseRecv(); }
118 //
119 // //!@brief 恢复接收消息数据
120 // void RecvFrameResume() { m_sub.ResumeRecv(); }
121 //
122 // //!@brief 是否正在接收消息数据
123 // bool IsReceivingFrame() { return m_sub.IsReceiving(); }
124 //
125 // private:
126 // EuvLoop &m_loop;
127 // MsgTopicSubscriberAsync m_sub;
128 // char m_buffer[256];
129 // };
130 
132  class MediaStreamAsync : public MediaStream {
133  public:
135 
136  virtual ~MediaStreamAsync() {}
137 
148  ErrCodeE Start(EuvLoop &loop, char *buffer, int size,
149  Channel &chn, OnGetFrameCallback cb, OnGetFrameInfoCallback cbInfo = nullptr);
150 
152  void Stop();
153 
155  void RecvFramePause() { m_sub.PauseRecv(); }
156 
158  void RecvFrameResume() { m_sub.ResumeRecv(); }
159 
161  bool IsReceivingFrame() { return m_sub.IsReceiving(); }
162 
163  private:
165  };
166 
168  class MediaStreamSync : public MediaStream {
169  public:
171 
178  ErrCodeE Open(Channel &chn, int32_t timeoutMs);
179 
181  void Close();
182 
189  ErrCodeE GetFrame(MediaFrame &frame, int32_t timeoutMs);
190 
197  ErrCodeE GetFrameInfo(MediaFrame &frame, int32_t timeoutMs);
198 
199  private:
201  };
203 }
204 
205 #endif //EMX_MediaStream_HPP
实现多路复用循环的主体,所有基于EuvLoop的事件都应绑定到一个EuvLoop上
Definition: EuvLoop.hpp:18
ErrCodeE ResumeRecv()
开始接收数据/重新开始接收数据
bool IsReceiving()
获取当前客户端是否正在监听接收
Definition: EuvStmClientBase.hpp:69
void PauseRecv()
停止接收,调用后将不会收到数据
媒体环形共享缓冲区读类(注意:所有操作都是非线程安全的)
Definition: MediaRingBuffer.hpp:60
MediaFrame异步数据接收
Definition: MediaStream.hpp:132
void RecvFramePause()
暂停接收消息数据
Definition: MediaStream.hpp:155
MediaStreamAsync()
Definition: MediaStream.hpp:134
void Stop()
停止MediaFrame异步数据接收
virtual ~MediaStreamAsync()
Definition: MediaStream.hpp:136
bool IsReceivingFrame()
是否正在接收消息数据
Definition: MediaStream.hpp:161
ErrCodeE Start(EuvLoop &loop, char *buffer, int size, Channel &chn, OnGetFrameCallback cb, OnGetFrameInfoCallback cbInfo=nullptr)
开始接收
void RecvFrameResume()
恢复接收消息数据
Definition: MediaStream.hpp:158
MediaFrame同步数据接收
Definition: MediaStream.hpp:168
MediaStreamSync()
Definition: MediaStream.hpp:170
ErrCodeE GetFrameInfo(MediaFrame &frame, int32_t timeoutMs)
获取消息头信息
ErrCodeE GetFrame(MediaFrame &frame, int32_t timeoutMs)
获取数据
void Close()
关闭接收端口
ErrCodeE Open(Channel &chn, int32_t timeoutMs)
打开接收端口
媒体通道定义
Definition: MediaStream.hpp:39
std::vector< Item > array
通道数组
Definition: MediaStream.hpp:74
void Add(MediaFrame::TypeE type, int32_t chn)
增加一个通道
Definition: MediaStream.hpp:47
Item * GetChnItem(MediaFrame::TypeE t, int32_t c)
获取通道内某个实体
Definition: MediaStream.hpp:66
MediaFrame数据接收基类
Definition: MediaStream.hpp:19
MediaRingBufferReader m_ring
Definition: MediaStream.hpp:92
OnGetFrameCallback m_cbFrame
Definition: MediaStream.hpp:90
std::string m_data
Definition: MediaStream.hpp:93
ErrCodeE CheckFrame(ErrCodeE errPop, MediaFrame &frame)
OnGetFrameInfoCallback m_cbFrameInfo
Definition: MediaStream.hpp:91
std::function< void(MediaFrame &)> OnGetFrameInfoCallback
仅接收到MediaFrame帧信息的回调函数(未去接收实际帧数据,里面的data数据无效)
Definition: MediaStream.hpp:36
std::function< void(Emx::ErrCodeE e, MediaFrame &frame)> OnGetFrameCallback
接收到MediaFrame帧数据的回调函数
Definition: MediaStream.hpp:30
Channel m_chn
Definition: MediaStream.hpp:94
virtual ~MediaStream()
Definition: MediaStream.hpp:23
ErrCodeE GetFrameByInfo(MediaFrame &frame)
根据帧信息获取帧数据
MediaStream()
Definition: MediaStream.hpp:21
void OnMsgRecv(uint32_t topic, const char *data, int32_t size)
用于Topic的异步订阅
Definition: MsgTopic.hpp:175
同步阻塞订阅
Definition: MsgTopic.hpp:248
ErrCodeE
错误码定义
Definition: EmxTypeDef.hpp:29
Definition: EmxGpio.hpp:10
媒体帧结构体定义,用于stream发送接收
Definition: MediaTypedef.hpp:36
TypeE
媒体帧类型
Definition: MediaTypedef.hpp:38
媒体通道内容实体
Definition: MediaStream.hpp:52
uint32_t waitSeq
期望的序号(仅venc需要)
Definition: MediaStream.hpp:57
MediaFrame::TypeE type
帧类型
Definition: MediaStream.hpp:55
int32_t chn
通道号
Definition: MediaStream.hpp:56
Item(MediaFrame::TypeE t, int32_t c)
Definition: MediaStream.hpp:53
bool inited
是否已经初始化(仅venc需要,控制出错后等待I帧)
Definition: MediaStream.hpp:58