|
@@ -220,7 +220,7 @@ static void* rvc_videorender_func(void* arg)
|
|
|
int ivideo_width = 0;
|
|
|
int ivideo_height = 0;
|
|
|
int isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d isize = %d, ivideo_width = %d, ivideo_height = %d.",__FUNCTION__, __LINE__, isize, ivideo_width, ivideo_height);
|
|
|
+
|
|
|
if (ivideo_width > 0 && ivideo_height > 0) {
|
|
|
iwidth = ivideo_width;
|
|
|
iheight = ivideo_height;
|
|
@@ -449,7 +449,59 @@ static 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)
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+static unsigned int __stdcall rvc_optcam_videorender_func(void* arg)
|
|
|
+#else
|
|
|
+static void* rvc_optcam_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;
|
|
|
+
|
|
|
+ Clibvideoqueue* local_optvideo_queue = new Clibvideoqueue(REC_COMMON_VIDEO_OPT_SHM_SNAPSHOT_QUEUE);
|
|
|
+ int iwidth = REC_COMMON_VIDEO_SNAPSHOT_HEIGHT;
|
|
|
+ int iheight = REC_COMMON_VIDEO_SNAPSHOT_WIDTH;
|
|
|
+ RVC_RendererFlip renderflip = RVC_FLIP_NONE;
|
|
|
+
|
|
|
+ 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
|
|
|
+ video_frame* local_video_frame = NULL;
|
|
|
+ get_local_video_frame(&local_video_frame, 0, local_optvideo_queue, iwidth, iheight, NULL, NULL);
|
|
|
+
|
|
|
+ if (NULL != local_video_frame) {
|
|
|
+ video_frame* localframe = NULL;
|
|
|
+ if (0 == translate_image_resolution(&localframe, param->render_param.iremote_view_cx, param->render_param.iremote_view_cy, local_video_frame)) {
|
|
|
+ param->premote_render->RenderVideoFrame(localframe, renderflip);
|
|
|
+ video_frame_delete(localframe);
|
|
|
+ localframe = NULL;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ param->premote_render->RenderVideoFrame(local_video_frame, renderflip);
|
|
|
+ }
|
|
|
+
|
|
|
+ video_frame_delete(local_video_frame);
|
|
|
+ local_video_frame = NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int rvc_start_video_render(rvc_video_render_t* prender, eVideoRenderMode eMode, rvc_video_box_move_callback_t* cb)
|
|
|
{
|
|
|
int errcode = -1;
|
|
|
if (NULL == prender) {
|
|
@@ -469,14 +521,20 @@ int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
|
|
|
- if (bremote) {
|
|
|
+ if (eRender_LocalRemote == eMode || eRender_Local_Both == eMode) {
|
|
|
prender->remote_render_stop_event = CreateEventA(NULL, false, false, NULL);
|
|
|
- if (NULL == prender->local_render_stop_event) {
|
|
|
+ if (NULL == prender->remote_render_stop_event) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote stop event failed!");
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
|
|
|
- prender->remote_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_remote_videorender_func, prender, 0, NULL);
|
|
|
+ if (eRender_LocalRemote == eMode) {
|
|
|
+ prender->remote_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_remote_videorender_func, prender, 0, NULL);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ prender->remote_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_optcam_videorender_func, prender, 0, NULL);
|
|
|
+ }
|
|
|
+
|
|
|
if (NULL == prender->remote_render_thread) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote video render thread failed.");
|
|
|
return Error_Resource;
|
|
@@ -495,13 +553,19 @@ int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
|
|
|
- if (bremote) {
|
|
|
+ if (eRender_LocalRemote == eMode || eRender_Local_Both == eMode) {
|
|
|
if (0 != sem_init(&prender->remote_render_stop_sem, 0, 0)) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote stop sem failed!");
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
|
|
|
- errcode = pthread_create(&prender->remote_render_threadid, NULL, rvc_remote_videorender_func, prender);
|
|
|
+ if (eRender_LocalRemote == eMode) {
|
|
|
+ errcode = pthread_create(&prender->remote_render_threadid, NULL, rvc_remote_videorender_func, prender);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ errcode = pthread_create(&prender->remote_render_threadid, NULL, rvc_videorender_func, prender);
|
|
|
+ }
|
|
|
+
|
|
|
if (Error_Succeed != errcode) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote video render thread failed.");
|
|
|
return Error_Resource;
|
|
@@ -529,6 +593,11 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
|
|
|
CloseHandle(prender->local_render_thread);
|
|
|
prender->local_render_thread = NULL;
|
|
|
}
|
|
|
+
|
|
|
+ if (NULL != prender->local_render_stop_event) {
|
|
|
+ CloseHandle(prender->local_render_stop_event);
|
|
|
+ prender->local_render_stop_event = NULL;
|
|
|
+ }
|
|
|
#else
|
|
|
sem_post(&prender->local_render_stop_sem);
|
|
|
rvc_stop_remote_video_render(prender);
|
|
@@ -540,6 +609,10 @@ 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));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if (NULL != &prender->local_render_stop_sem) {
|
|
|
+ sem_destroy(&prender->local_render_stop_sem);
|
|
|
+ }
|
|
|
#endif // RVC_OS_WIN
|
|
|
|
|
|
return Error_Succeed;
|
|
@@ -554,6 +627,10 @@ int rvc_stop_remote_video_render(rvc_video_render_t* prender)
|
|
|
CloseHandle(prender->remote_render_thread);
|
|
|
prender->remote_render_thread = NULL;
|
|
|
}
|
|
|
+ if (NULL != prender->remote_render_stop_event) {
|
|
|
+ CloseHandle(prender->remote_render_stop_event);
|
|
|
+ prender->remote_render_stop_event = NULL;
|
|
|
+ }
|
|
|
#else
|
|
|
if (prender->remote_render_threadid > 0) {
|
|
|
sem_post(&prender->remote_render_stop_sem);
|
|
@@ -564,7 +641,11 @@ 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
|
|
|
|
|
|
+ if (NULL != &prender->remote_render_stop_sem) {
|
|
|
+ sem_destroy(&prender->remote_render_stop_sem);
|
|
|
+ }
|
|
|
+
|
|
|
+#endif
|
|
|
return Error_Succeed;
|
|
|
}
|