|
@@ -6,11 +6,6 @@
|
|
|
#include "rvc_media_common.h"
|
|
|
#include "fileutil.h"
|
|
|
|
|
|
-extern "C"{
|
|
|
- #include <libavutil/avutil.h>
|
|
|
- #include <libavcodec/avcodec.h>
|
|
|
- #include <libswscale/swscale.h>
|
|
|
-}
|
|
|
#include "video_common/ffmpeg_api_cpp_adapter.h"
|
|
|
|
|
|
#include "cv.h"
|
|
@@ -135,7 +130,11 @@ int rvc_remote_video_render(rvc_video_render_t* prender, void* videoframe)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void* rvc_videorender_func(void* arg)
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+static unsigned int __stdcall rvc_videorender_func(void* arg)
|
|
|
+#else
|
|
|
+static void* rvc_videorender_func(void* arg)
|
|
|
+#endif
|
|
|
{
|
|
|
rvc_video_render_t* param = (rvc_video_render_t*)arg;
|
|
|
int ilocal_video_fresh_time = param->render_param.ilocal_fresh_time;
|
|
@@ -180,7 +179,7 @@ void* rvc_videorender_func(void* arg)
|
|
|
}
|
|
|
|
|
|
char strPersonPath[MAX_PATH] = { 0 };
|
|
|
- snprintf(strPersonPath, MAX_PATH, "./bin/rxk.jpg");
|
|
|
+ rvc_snprintf(strPersonPath, MAX_PATH, "./bin/rxk.jpg");
|
|
|
IplImage* personimage = NULL;
|
|
|
IplImage* personmask = NULL;
|
|
|
|
|
@@ -233,13 +232,17 @@ void* rvc_videorender_func(void* arg)
|
|
|
DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d isize = %d, ivideo_width = %d, ivideo_height = %d.", __FUNCTION__, __LINE__, isize, ivideo_width, ivideo_height);
|
|
|
|
|
|
for (; ; ) {
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+ DWORD dwRet = WaitForSingleObject(param->local_render_stop_event, ilocal_video_fresh_time);
|
|
|
+ if (WAIT_TIMEOUT == dwRet) {
|
|
|
+#else
|
|
|
struct timespec ts;
|
|
|
clock_gettime(CLOCK_REALTIME, &ts);
|
|
|
long unsec = ts.tv_nsec + (1000 * 1000 * ilocal_video_fresh_time);
|
|
|
ts.tv_sec += (unsec / 1000000000);
|
|
|
ts.tv_nsec = (unsec % 1000000000);
|
|
|
- if (0 != sem_timedwait(¶m->local_render_stop_sem, &ts) && (ETIMEDOUT == errno))
|
|
|
- {
|
|
|
+ if (0 != sem_timedwait(¶m->local_render_stop_sem, &ts) && (ETIMEDOUT == errno)){
|
|
|
+#endif
|
|
|
video_frame* local_video_frame = NULL;
|
|
|
int iwindowstate = param->cb.on_window_type(param->cb.user_data);
|
|
|
get_local_video_frame(&local_video_frame, iwindowstate, local_video_queue, iwidth, iheight, personimage, personmask);
|
|
@@ -289,8 +292,11 @@ void* rvc_videorender_func(void* arg)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-void* rvc_remote_videorender_func(void* arg)
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+static unsigned int __stdcall rvc_remote_videorender_func(void* arg)
|
|
|
+#else
|
|
|
+static void* rvc_remote_videorender_func(void* arg)
|
|
|
+#endif
|
|
|
{
|
|
|
rvc_video_render_t* param = (rvc_video_render_t*)arg;
|
|
|
int iremote_video_fresh_time = param->render_param.iremote_fresh_time;
|
|
@@ -300,7 +306,7 @@ void* rvc_remote_videorender_func(void* arg)
|
|
|
|
|
|
Clibvideoqueue* video_shm_q_remote = new Clibvideoqueue(REC_COMMON_VIDEO_REMOTE_SHM_RTP_QUEUE);
|
|
|
|
|
|
- snprintf(strImgPath, MAX_PATH, "%s", "./bin/agent.jpg");
|
|
|
+ rvc_snprintf(strImgPath, MAX_PATH, "%s", "./bin/agent.jpg");
|
|
|
|
|
|
video_frame* remote_frame = video_frame_new(irecord_video_frame_width, irecord_video_frame_heigt, VIDEO_FORMAT_RGB24);
|
|
|
video_frame_fill_black(remote_frame);
|
|
@@ -353,12 +359,17 @@ void* rvc_remote_videorender_func(void* arg)
|
|
|
}
|
|
|
|
|
|
for (; ; ) {
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+ DWORD dwRet = WaitForSingleObject(param->remote_render_stop_event, iremote_video_fresh_time);
|
|
|
+ if (WAIT_TIMEOUT == dwRet){
|
|
|
+#else
|
|
|
struct timespec ts;
|
|
|
clock_gettime(CLOCK_REALTIME, &ts);
|
|
|
long unsec = ts.tv_nsec + (1000 * 1000 * iremote_video_fresh_time);
|
|
|
ts.tv_sec += (unsec / 1000000000);
|
|
|
ts.tv_nsec = (unsec % 1000000000);
|
|
|
if (0 != sem_timedwait(¶m->remote_render_stop_sem, &ts) && (ETIMEDOUT == errno)){
|
|
|
+#endif // RVC_OS_WIN
|
|
|
rvc_remote_video_render(param, showframe);
|
|
|
if (NULL != video_shm_q_remote){
|
|
|
rc = rvc_video_shm_enqueue(video_shm_q_remote, remote_frame, VIDEOQUEUE_FLAG_VERTICAL_FLIP, iframeid++);
|
|
@@ -384,13 +395,24 @@ void* rvc_remote_videorender_func(void* arg)
|
|
|
|
|
|
int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_box_move_callback_t* cb)
|
|
|
{
|
|
|
+ int errcode = -1;
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+ prender->local_render_stop_event = CreateEventA(NULL, false, false, NULL);
|
|
|
+ prender->local_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_videorender_func, prender, 0, NULL);
|
|
|
+
|
|
|
+ if (bremote) {
|
|
|
+ prender->remote_render_stop_event = CreateEventA(NULL, false, false, NULL);
|
|
|
+ prender->remote_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_remote_videorender_func, prender, 0, NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+#else
|
|
|
if (0 != sem_init(&prender->local_render_stop_sem, 0, 0)) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create local stop sem failed!");
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
|
|
|
- int err = pthread_create(&prender->local_render_threadid, NULL, rvc_videorender_func, prender);
|
|
|
- if (Error_Succeed != err) {
|
|
|
+ errcode = pthread_create(&prender->local_render_threadid, NULL, rvc_videorender_func, prender);
|
|
|
+ if (Error_Succeed != errcode) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create local video render thread failed.");
|
|
|
return Error_Resource;
|
|
|
}
|
|
@@ -401,14 +423,15 @@ int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
|
|
|
- err = pthread_create(&prender->remote_render_threadid, NULL, rvc_remote_videorender_func, prender);
|
|
|
- if (Error_Succeed != err) {
|
|
|
+ errcode = pthread_create(&prender->remote_render_threadid, NULL, rvc_remote_videorender_func, prender);
|
|
|
+ if (Error_Succeed != errcode) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote video render thread failed.");
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
}
|
|
|
+#endif // RVC_OS_WIN
|
|
|
|
|
|
- return err;
|
|
|
+ return errcode;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -418,6 +441,14 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
|
|
|
return Error_Param;
|
|
|
}
|
|
|
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+ SetEvent(prender->local_render_stop_event);
|
|
|
+ rvc_stop_remote_video_render(prender);
|
|
|
+ if (NULL != prender->local_render_thread) {
|
|
|
+ WaitForSingleObject(prender->local_render_thread, INFINITE);
|
|
|
+ prender->local_render_thread = NULL;
|
|
|
+ }
|
|
|
+#else
|
|
|
sem_post(&prender->local_render_stop_sem);
|
|
|
rvc_stop_remote_video_render(prender);
|
|
|
if (prender->local_render_threadid > 0) {
|
|
@@ -428,11 +459,20 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("video render thread pthread join error for %s.", strerror(errno));
|
|
|
}
|
|
|
}
|
|
|
+#endif // RVC_OS_WIN
|
|
|
+
|
|
|
return Error_Succeed;
|
|
|
}
|
|
|
|
|
|
int rvc_stop_remote_video_render(rvc_video_render_t* prender)
|
|
|
{
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+ SetEvent(prender->remote_render_stop_event);
|
|
|
+ if (NULL != prender->remote_render_thread) {
|
|
|
+ WaitForSingleObject(prender->remote_render_thread, INFINITE);
|
|
|
+ prender->remote_render_thread = NULL;
|
|
|
+ }
|
|
|
+#else
|
|
|
if (prender->remote_render_threadid > 0) {
|
|
|
sem_post(&prender->remote_render_stop_sem);
|
|
|
if (0 == pthread_join(prender->remote_render_threadid, NULL)) {
|
|
@@ -442,6 +482,7 @@ int rvc_stop_remote_video_render(rvc_video_render_t* prender)
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("remote video render thread pthread join error for %s.", strerror(errno));
|
|
|
}
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
return Error_Succeed;
|
|
|
}
|