HVideoPlayer
接口功能
- 設置媒體源HMedia
- 開始start、停止stop、暫停pause、繼續resume
- 視頻幀HFrame的push、pop
定義代碼
#ifndef HVIDEOPLAYER_H
#define HVIDEOPLAYER_H
#include "hmedia.h"
#include "hframe.h"
class HVideoPlayer
{
public:
HVideoPlayer(){}
virtual ~HVideoPlayer() {}
virtual int start() = 0;
virtual int stop() = 0;
virtual int pause() = 0;
virtual int resume() = 0;
void set_media(HMedia& media){
this->media = media;
}
FrameStats get_frame_stats(){
return frame_buf.frame_stats;
}
FrameInfo get_frame_info(){
return frame_buf.frame_info;
}
void set_frame_cache(int cache){
frame_buf.setCache(cache);
}
int push_frame(HFrame* pFrame){
return frame_buf.push(pFrame);
}
int pop_frame(HFrame* pFrame){
return frame_buf.pop(pFrame);
}
protected:
HMedia media;
HFrameBuf frame_buf;
};
#endif // HVIDEOPLAYER_H
HMedia
#ifndef HMEDIA_H
#define HMEDIA_H
#include <string>
enum MEDIA_TYPE{
MEDIA_TYPE_FILE = 0,
MEDIA_TYPE_NETWORK,
MEDIA_TYPE_CAPTURE,
MEDIA_TYPE_NONE
};
#define DEFAULT_MEDIA_TYPE MEDIA_TYPE_CAPTURE
typedef struct media_s{
MEDIA_TYPE type;
int index; // for camera index
std::string src;
std::string descr;
media_s(){
type = DEFAULT_MEDIA_TYPE;
index = 0;
}
}HMedia;
#endif // HMEDIA_H
HFrame
typedef struct hframe_s{
hbuf_t buf;
int w;
int h;
int type;
int bpp;
uint64 ts;
void* userdata;
}HFrame;
HFrameBuf
class HFrameBuf : public HRingBuf{
public:
enum CacheFullPolicy{
SQUEEZE,
DISCARD,
}policy;
HFrameBuf() : HRingBuf() {
cache_num = DEFAULT_FRAME_CACHENUM;
policy = SQUEEZE;
}
void setCache(int num) {cache_num = num;}
void setPolicy(CacheFullPolicy policy) {this->policy = policy;}
int push(HFrame* pFrame);
int pop(HFrame* pFrame);
int cache_num;
FrameStats frame_stats;
FrameInfo frame_info;
std::deque<HFrame> frames;
};
HFrameBuf幀緩存類繼承自環形緩存類HRingBuf,由緩存的幀數決定環形緩存區的大小;
push接口從環形緩存區分配內存,從HFrame拷貝數據,並記錄在雙端隊列std::deque<HFrame> frames;
中;
pop接口從雙端隊列std::deque<HFrame> frames;
中取出一幀,拷貝數據至HFrame;
HBuf、HRingBuf
關於緩存類HBuf和環形緩存類HRingBuf的定義實現請自行研究Github源碼,
你將體會到C內存管理的靈活和高效之處。
交互圖
我們用graphviz簡單畫下HVideoPlayer視頻播放引擎類和HVideoWidget視頻播放控件類的交互過程:
下一節我們給出基於OpenCV中VideoCapture類實現的播放引擎實現類HVideoCapture