From 278634c0d2eeba9e3fcc3b4cd56ddfb3323277d7 Mon Sep 17 00:00:00 2001
From: 554325746@qq.com <554325746@qq.com>
Date: 星期二, 10 三月 2020 10:08:20 +0800
Subject: [PATCH] compatible to local files
---
csrc/wrapper.cpp | 41 +++++++---
godec.go | 34 ++++++-
csrc/worker/decoder.cpp | 2
csrc/wrapper.hpp | 10 +-
goffmpeg.go | 24 ++++--
cffmpeg.h | 7 +
libcffmpeg.c | 17 +++-
csrc/cffmpeg.cpp | 22 +++--
gorec.go | 10 -
libcffmpeg.h | 15 ++-
10 files changed, 120 insertions(+), 62 deletions(-)
diff --git a/cffmpeg.h b/cffmpeg.h
index 4d7d65e..bb3d0be 100644
--- a/cffmpeg.h
+++ b/cffmpeg.h
@@ -23,13 +23,14 @@
void c_ffmpeg_open_recorder(const cffmpeg h);
void c_ffmpeg_set_record_duration(const cffmpeg h, const int min, const int max);
void c_ffmpeg_build_recorder(const cffmpeg h, const char*id, const char *dir, const int64_t fid, int mind, int maxd, int audio);
-void c_ffmpeg_fire_recorder(const cffmpeg h, const char*sid, const int64_t id);
-void c_ffmpeg_get_info_recorder(const cffmpeg h, int *index, char** recid, int *recidLen, char **fpath, int *pathLen);
+int c_ffmpeg_fire_recorder(const cffmpeg h, const char*sid, const int64_t id);
+int c_ffmpeg_get_info_recorder(const cffmpeg h, int *index, char** recid, int *recidLen, char **fpath, int *pathLen);
void c_ffmpeg_build_decoder(const cffmpeg h);
-void* c_ffmpeg_get_pic_decoder(const cffmpeg h, int *wid, int *hei, int *format, int *length, int64_t *id);
+int c_ffmpeg_get_pic_decoder(const cffmpeg h, unsigned char **data, int *wid, int *hei, int *format, int *length, int64_t *id);
void c_ffmpeg_close_stream(const cffmpeg h);
void* c_ffmpeg_get_avpacket(const cffmpeg h, int *size, int *key);
+int c_ffmpeg_get_avpacket2(const cffmpeg h, unsigned char **data, int *size, int *key);
// pic encoder
void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi);
diff --git a/csrc/cffmpeg.cpp b/csrc/cffmpeg.cpp
index fc92229..8d872c4 100644
--- a/csrc/cffmpeg.cpp
+++ b/csrc/cffmpeg.cpp
@@ -68,7 +68,7 @@
}
void c_ffmpeg_set_record_duration(const cffmpeg h, const int min, const int max){
Wrapper *s = (Wrapper*)h;
- s->SetRecMinCacheTime(min);
+ s->SetRecMinCacheTime(min, max);
}
void c_ffmpeg_build_recorder(const cffmpeg h, const char* id, const char *dir, const int64_t fid, int mind, int maxd, int audio){
@@ -78,16 +78,16 @@
s->BuildRecorder(id, dir, fid, mind, maxd, a);
}
-void c_ffmpeg_fire_recorder(const cffmpeg h, const char* sid, const int64_t id){
+int c_ffmpeg_fire_recorder(const cffmpeg h, const char* sid, const int64_t id){
Wrapper *s = (Wrapper*)h;
- s->FireRecorder(sid, id);
+ return s->FireRecorder(sid, id);
}
-void c_ffmpeg_get_info_recorder(const cffmpeg h, int *index, char** recid, int *recidLen, char **fpath, int *pathLen){
+int c_ffmpeg_get_info_recorder(const cffmpeg h, int *index, char** recid, int *recidLen, char **fpath, int *pathLen){
Wrapper *s = (Wrapper*)h;
int i;
std::string p(""), id("");
- s->GetInfoRecorder(id, i, p);
+ int ret = s->GetInfoRecorder(id, i, p);
// printf("cffmpeg get info : index : %d, file : %s, recid: %s\n", i, p.c_str(), id.c_str());
@@ -104,6 +104,7 @@
memcpy(rid, id.c_str(), *recidLen);
rid[*recidLen] = '\0';
*recid = rid;
+ return ret;
}
void c_ffmpeg_build_decoder(const cffmpeg h){
@@ -111,11 +112,9 @@
s->OpenDecoder();
}
-void* c_ffmpeg_get_pic_decoder(const cffmpeg h, int *wid, int *hei, int *format, int *length, int64_t *id){
+int c_ffmpeg_get_pic_decoder(const cffmpeg h, unsigned char **data, int *wid, int *hei, int *format, int *length, int64_t *id){
Wrapper *s = (Wrapper*)h;
- unsigned char *data = NULL;
- s->GetPicDecoder(&data, wid, hei, format, length, id);
- return data;
+ return s->GetPicDecoder(data, wid, hei, format, length, id);
}
void c_ffmpeg_close_stream(const cffmpeg h){
@@ -130,6 +129,11 @@
return data;
}
+int c_ffmpeg_get_avpacket2(const cffmpeg h, unsigned char **data, int *size, int *key){
+ Wrapper *s = (Wrapper*)h;
+ return s->GetPacket(data, size, key);
+}
+
// pic encoder
void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi){
return CreateEncoder(w, h, fps, br, pix_fmt, scale_flag, gi);
diff --git a/csrc/worker/decoder.cpp b/csrc/worker/decoder.cpp
index ce369af..5e8a7c9 100644
--- a/csrc/worker/decoder.cpp
+++ b/csrc/worker/decoder.cpp
@@ -65,6 +65,8 @@
}
void decoder::GetFrame(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){
+ *data = NULL;
+ *length = 0;
AVFrame *frame = NULL;
diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index 5e50469..7ad32f1 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -56,6 +56,7 @@
,logit_(false)
,fps_(25)
,file_finished_(false)
+ ,min_duration_(60)
{
makeTheWorld();
}
@@ -76,6 +77,7 @@
,logit_(true)
,fps_(25)
,file_finished_(false)
+ ,min_duration_(60)
{
makeTheWorld();
logif::CreateLogger(logfile, true);
@@ -191,6 +193,8 @@
void Wrapper::run_stream_thread(){
+ int64_t rebootime = -1;
+
while(!stop_stream_.load()){
auto in = init_reader(input_url_.c_str());
@@ -199,6 +203,8 @@
sleep(2);
continue;
}
+
+ rebootime++;
fps_ = in->getFPS();
@@ -219,6 +225,7 @@
if (exist){
wTime <<= 1;
}
+ int64_t file_frame = 0;
logIt("WAIT TIME PER FRAME: %d", wTime);
@@ -232,6 +239,7 @@
if (in->notVideoAudio(&data->getAVPacket())){
continue;
}
+
// 闈炲浗鏍囪烦杩囩涓�甯�,娴嬭瘯绗竴甯ф湁闂
if (!gb_ && id < 0){
id++; v_id++; a_id++;
@@ -254,21 +262,30 @@
//鏈湴鏂囦欢澶揩sleep涓�涓�
if (exist){
usleep(wTime);
+ // 璁板綍瑙g爜鐨勬枃浠舵湁澶氬皯甯�
+ file_frame++;
}
}
deinit_worker();
if (exist) {
- logIt("local file exist");
+ if (file_frame == 0 && rebootime > 3){
+ file_finished_ = true;
+ break;
+ }
+ if (file_frame < min_duration_ * fps_){
+ continue;
+ }
+ logIt("libcffmpeg.so-> local file %s run %lld time, all frames %lld", input_url_.c_str(), rebootime, file_frame);
file_finished_ = true;
break;
}
}
}
- void Wrapper::SetRecMinCacheTime(const int mind){
- rec_->SetRecMinCacheTime(mind);
+ void Wrapper::SetRecMinCacheTime(const int mind, const int maxd){
+ min_duration_ = mind;
}
void Wrapper::OpenRecorder(){
@@ -291,41 +308,39 @@
if (rec_->Loaded()){
rec_->FireRecSignal(sid, id);
}
+ return 0;
}
- void Wrapper::GetInfoRecorder(std::string &recID, int &index, std::string &path){
+ int Wrapper::GetInfoRecorder(std::string &recID, int &index, std::string &path){
if (rec_){
rec_->GetRecInfo(recID, index, path);
}
+ return 0;
}
////////decoder
void Wrapper::OpenDecoder(){
run_dec_ = true;
}
- void Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){
+ int Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){
if (file_finished_){
- *data = (unsigned char*)this;
- *w = 1080;
- *h = 720;
- *format = 23;
- *length = 12;
- *id = -10802020;
- return;
+ return -1;
}
if (decoder_){
decoder_->GetFrame(data, w, h, format, length, id);
}
+ return 0;
}
void Wrapper::CloseStream(){
run_stream_ = false;
}
- void Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){
+ int Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){
if (stream_){
stream_->GetPacket(pktData, size, key);
}
+ return 0;
}
} // end class wrapper
diff --git a/csrc/wrapper.hpp b/csrc/wrapper.hpp
index 575197d..4802e8e 100644
--- a/csrc/wrapper.hpp
+++ b/csrc/wrapper.hpp
@@ -43,21 +43,21 @@
public: //recorder
void BuildRecorder(const char* id, const char *dir, const int64_t &fid, const int mind, const int maxd, const bool audio);
int FireRecorder(const char* sid,const int64_t &id);
- void GetInfoRecorder(std::string &recID, int &index, std::string &path);
+ int GetInfoRecorder(std::string &recID, int &index, std::string &path);
public:
void GB28181(){gb_ = 1;}
void CPUDec(){cpu_ = 1;}
void AudioSwitch(const bool a);
- void SetRecMinCacheTime(const int mind);
+ void SetRecMinCacheTime(const int mind, const int maxd);
int GetFPS(){return fps_;}
public: //decoder
void OpenDecoder();
- void GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id);
+ int GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id);
public: // push stream
void CloseStream();
- void GetPacket(unsigned char **pktData, int *size, int *key);
+ int GetPacket(unsigned char **pktData, int *size, int *key);
public: // recorder
void OpenRecorder();
private:
@@ -82,7 +82,9 @@
std::function<void()> fn_rec_lazy_;
bool logit_;
int fps_;
+ // 涓哄吋瀹规枃浠惰В鐮佸仛鐨勮ˉ涓�
bool file_finished_;
+ int min_duration_;
};
void *CreateEncoder(const int w, const int h, const int fps, const int br,
diff --git a/godec.go b/godec.go
index 25baa88..90f3803 100644
--- a/godec.go
+++ b/godec.go
@@ -18,13 +18,20 @@
var length C.int
var srcW, srcH, srcF C.int
- p := C.wrap_fn_decoder_pic(unsafe.Pointer(libcffmpeg), h.ffmpeg, &srcW, &srcH, &srcF, &length, &fid)
- if p == nil || length == 0 || srcW == 0 || srcH == 0 {
+ var yuv *C.uchar
+ r := C.wrap_fn_decoder_pic(unsafe.Pointer(libcffmpeg), h.ffmpeg, &yuv, &srcW, &srcH, &srcF, &length, &fid)
+
+ if r < 0 {
+ return nil, int(r), int(r), int64(r)
+ }
+
+ if yuv == nil || length == 0 || srcW == 0 || srcH == 0 {
return nil, 0, 0, 0
}
- defer C.free(unsafe.Pointer(p))
- return C.GoBytes(p, length), int(srcW), int(srcH), int64(fid)
+ defer C.free(unsafe.Pointer(yuv))
+
+ return C.GoBytes(yuv, length), int(srcW), int(srcH), int64(fid)
}
// GetYUV2 get yuv data
@@ -33,13 +40,26 @@
var length C.int
var srcW, srcH, srcF C.int
- p := C.wrap_fn_decoder_pic(unsafe.Pointer(libcffmpeg), h.ffmpeg, &srcW, &srcH, &srcF, &length, &fid)
- if p == nil || length == 0 || srcW == 0 || srcH == 0 {
- return nil, nil, 0, 0, 0
+ var yuv *C.uchar
+ r := C.wrap_fn_decoder_pic(unsafe.Pointer(libcffmpeg), h.ffmpeg, &yuv, &srcW, &srcH, &srcF, &length, &fid)
+
+ if r < 0 {
+ return nil, int(r), int(r), int64(r)
}
+
+ if yuv == nil || length == 0 || srcW == 0 || srcH == 0 {
+ return nil, 0, 0, 0
+ }
+
const maxLen = 0x7fffffff
size := int(length)
data := (*[maxLen]byte)(unsafe.Pointer(p))[:size:size]
return unsafe.Pointer(p), data, int(srcW), int(srcH), int64(fid)
}
+
+// SetDecMinDuration min duration
+// 涓昏鏄鏋滆В鐮佹枃浠舵椂闀垮お鐭紝鍙兘鍦╯dk鏀跺埌瑙g爜鏁版嵁鍓嶈В鐮佽繘绋嬭繍琛岀粨鏉燂紝鎵�浠ヨ瀹氫竴涓渶鐭殑duration
+func (h *GoFFMPEG) SetDecMinDuration(min, max int) {
+ C.wrap_fn_rec_duration(unsafe.Pointer(libcffmpeg), h.ffmpeg, C.int(min), C.int(max))
+}
diff --git a/goffmpeg.go b/goffmpeg.go
index 1844a22..bca75d2 100644
--- a/goffmpeg.go
+++ b/goffmpeg.go
@@ -128,6 +128,14 @@
C.wrap_fn_run(unsafe.Pointer(libcffmpeg), h.ffmpeg, in)
}
+// Run2 ffmpeg
+func (h *GoFFMPEG) Run2(input string, minDuration int) {
+ in := C.CString(input)
+ defer C.free(unsafe.Pointer(in))
+
+ C.wrap_fn_run(unsafe.Pointer(libcffmpeg), h.ffmpeg, in)
+}
+
// FPS fps
func (h *GoFFMPEG) FPS() int {
return int(C.wrap_fn_fps(unsafe.Pointer(libcffmpeg), h.ffmpeg))
@@ -143,13 +151,13 @@
// GetGBJpg Get GB28181 Jpg
func GetGBJpg(rtspUrl string) []byte {
- rtsp := C.CString(rtspUrl)
- defer C.free(unsafe.Pointer(rtsp))
- var jpgLen C.int
+ rtsp := C.CString(rtspUrl)
+ defer C.free(unsafe.Pointer(rtsp))
+ var jpgLen C.int
- pic := C.wrap_fn_get_gb28181_pic(unsafe.Pointer(libcffmpeg), rtsp, &jpgLen)
- defer C.free(unsafe.Pointer(pic))
+ pic := C.wrap_fn_get_gb28181_pic(unsafe.Pointer(libcffmpeg), rtsp, &jpgLen)
+ defer C.free(unsafe.Pointer(pic))
- retJpg := C.GoBytes(unsafe.Pointer(pic), jpgLen)
- return retJpg
-}
\ No newline at end of file
+ retJpg := C.GoBytes(unsafe.Pointer(pic), jpgLen)
+ return retJpg
+}
diff --git a/gorec.go b/gorec.go
index 2f17b20..2ed0aa1 100644
--- a/gorec.go
+++ b/gorec.go
@@ -14,10 +14,11 @@
}
// FireRecorder fire recorder
-func (h *GoFFMPEG) FireRecorder(sid string, id int64) {
+func (h *GoFFMPEG) FireRecorder(sid string, id int64) int {
csid := C.CString(sid)
defer C.free(unsafe.Pointer(csid))
- C.wrap_fn_fire_recorder(unsafe.Pointer(libcffmpeg), h.ffmpeg, csid, C.long(id))
+ ret := C.wrap_fn_fire_recorder(unsafe.Pointer(libcffmpeg), h.ffmpeg, csid, C.long(id))
+ return int(ret)
}
// BuildRecorder build recorder
@@ -56,9 +57,4 @@
// fmt.Println("Go get info : ", path, " len: ", l)
return gID, int(i), path
-}
-
-// SetRecDurationForCache cache
-func (h *GoFFMPEG) SetRecDurationForCache(min, max int) {
- C.wrap_fn_rec_duration(unsafe.Pointer(libcffmpeg), h.ffmpeg, C.int(min), C.int(max))
}
diff --git a/libcffmpeg.c b/libcffmpeg.c
index cbdc727..626b83c 100644
--- a/libcffmpeg.c
+++ b/libcffmpeg.c
@@ -122,15 +122,15 @@
fn_rec_duration(h, min, max);
}
-void wrap_fn_fire_recorder(void *lib, const cffmpeg h, const char* sid, const int64_t id){
+int wrap_fn_fire_recorder(void *lib, const cffmpeg h, const char* sid, const int64_t id){
if (!fn_fire_recorder){
fn_fire_recorder = (lib_cffmpeg_fire_recorder)dlsym(lib, "c_ffmpeg_fire_recorder");
if (!fn_fire_recorder) return;
}
- fn_fire_recorder(h, sid, id);
+ return fn_fire_recorder(h, sid, id);
}
-void wrap_fn_info_recorder(void *lib, const cffmpeg h, int* index, char** recid, int* recidLen, char** fpath, int* pathLen){
+int wrap_fn_info_recorder(void *lib, const cffmpeg h, int* index, char** recid, int* recidLen, char** fpath, int* pathLen){
if (!fn_info_recorder){
fn_info_recorder = (lib_cffmpeg_info_recorder)dlsym(lib, "c_ffmpeg_get_info_recorder");
if (!fn_info_recorder) return;
@@ -146,12 +146,12 @@
fn_decoder(h);
}
-void* wrap_fn_decoder_pic(void *lib, const cffmpeg h, int *wid, int *hei, int *format, int *length, int64_t *id){
+int wrap_fn_decoder_pic(void *lib, const cffmpeg h, unsigned char** data, int *wid, int *hei, int *format, int *length, int64_t *id){
if (!fn_decoder_pic){
fn_decoder_pic = (lib_cffmpeg_pic)dlsym(lib, "c_ffmpeg_get_pic_decoder");
release_if_err(fn_decoder_pic, lib);
}
- return fn_decoder_pic(h, wid, hei, format, length, id);
+ return fn_decoder_pic(h, data, wid, hei, format, length, id);
}
void wrap_fn_close_stream(void *lib, const cffmpeg h){
@@ -170,6 +170,13 @@
return fn_get_avpacket(h, size, key);
}
+int wrap_fn_get_avpacket2(void *lib, const cffmpeg h, unsigned char **data, int* size, int* key){
+ if(!fn_get_avpacket2){
+ fn_get_avpacket2 = (lib_cffmpeg_avpacket2)dlsym(lib, "c_ffmpeg_get_avpacket2");
+ release_if_err(fn_get_avpacket2, lib);
+ }
+ return fn_get_avpacket2(h, data, size, key);
+}
// for encoder
cencoder wrap_fn_create_encoder(void *lib, const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi){
if (!fn_create_encoder){
diff --git a/libcffmpeg.h b/libcffmpeg.h
index 4ab0cea..d15ed21 100644
--- a/libcffmpeg.h
+++ b/libcffmpeg.h
@@ -21,12 +21,13 @@
typedef void (*lib_cffmpeg_open_recorder)(const cffmpeg);
typedef void (*lib_cffmpeg_rec_duration)(const cffmpeg, const int, const int);
typedef void (*lib_cffmpeg_recorder)(const cffmpeg, const char*, const char*, const int64_t, int, int, int);
-typedef void (*lib_cffmpeg_fire_recorder)(const cffmpeg, const char*, const int64_t);
-typedef void (*lib_cffmpeg_info_recorder)(const cffmpeg, int*, char**, int*, char**, int*);
+typedef int (*lib_cffmpeg_fire_recorder)(const cffmpeg, const char*, const int64_t);
+typedef int (*lib_cffmpeg_info_recorder)(const cffmpeg, int*, char**, int*, char**, int*);
typedef void (*lib_cffmpeg_decoder)(const cffmpeg);
-typedef void*(*lib_cffmpeg_pic)(const cffmpeg, int*, int*, int*, int*, int64_t*);
+typedef int (*lib_cffmpeg_pic)(const cffmpeg, unsigned char**, int*, int*, int*, int*, int64_t*);
typedef void (*lib_cffmpeg_close_stream)(const cffmpeg);
typedef void*(*lib_cffmpeg_avpacket)(const cffmpeg, int*, int*);
+typedef int (*lib_cffmpeg_avpacket2)(const cffmpeg, unsigned char**, int*, int*);
static lib_cffmpeg_create fn_create = NULL;
static lib_cffmpeg_create2 fn_create2 = NULL;
@@ -45,6 +46,7 @@
static lib_cffmpeg_pic fn_decoder_pic = NULL;
static lib_cffmpeg_close_stream fn_close_stream = NULL;
static lib_cffmpeg_avpacket fn_get_avpacket = NULL;
+static lib_cffmpeg_avpacket2 fn_get_avpacket2 = NULL;
typedef void* libcffmpeg;
libcffmpeg init_libcffmpeg(const char *so_file);
@@ -61,12 +63,13 @@
void wrap_fn_open_rec(void *lib, const cffmpeg h);
void wrap_fn_rec_duration(void *lib, const cffmpeg h, const int min, const int max);
void wrap_fn_recorder(void *lib, const cffmpeg h, const char* id, const char* dir, const int64_t fid, int mind, int maxd, int audio);
-void wrap_fn_fire_recorder(void *lib, const cffmpeg h, const char *sid, const int64_t id);
-void wrap_fn_info_recorder(void *lib, const cffmpeg, int* index, char** recid, int* recidLen, char** fpath, int* pathLen);
+int wrap_fn_fire_recorder(void *lib, const cffmpeg h, const char *sid, const int64_t id);
+int wrap_fn_info_recorder(void *lib, const cffmpeg, int* index, char** recid, int* recidLen, char** fpath, int* pathLen);
void wrap_fn_decoder(void *lib, const cffmpeg h);
-void* wrap_fn_decoder_pic(void *lib, const cffmpeg h, int *wid, int *hei, int *format, int *length, int64_t *id);
+int wrap_fn_decoder_pic(void *lib, const cffmpeg h, unsigned char** data, int *wid, int *hei, int *format, int *length, int64_t *id);
void wrap_fn_close_stream(void *lib, const cffmpeg h);
void* wrap_fn_get_avpacket(void *lib, const cffmpeg h, int* size, int* key);
+int wrap_fn_get_avpacket2(void *lib, const cffmpeg h, unsigned char **data, int* size, int* key);
// for encoder
typedef void* cencoder;
typedef cencoder (*lib_cffmpeg_create_encoder)(const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi);
--
Gitblit v1.8.0