|
@@ -75,13 +75,13 @@ static bool get_local_video_frame(video_frame** frame, int itype, Clibvideoqueue
|
|
|
videoq_frame frm;
|
|
|
frm.data = tmp_frame_preview->data[0];
|
|
|
|
|
|
- //static bool blog = true;
|
|
|
- //if (blog) {
|
|
|
- // int ivideo_width = 0;
|
|
|
- // int ivideo_height = 0;
|
|
|
- // int isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
|
|
|
- // blog = false;
|
|
|
- //}
|
|
|
+ static bool blog = true;
|
|
|
+ if (blog) {
|
|
|
+ int ivideo_width = 0;
|
|
|
+ int ivideo_height = 0;
|
|
|
+ int isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
|
|
|
+ blog = false;
|
|
|
+ }
|
|
|
|
|
|
result = local_video_queue->GetVideo(&frm, VIDEOQUEUE_FLAG_HORIZONTAL_FLIP);
|
|
|
if (result){
|
|
@@ -201,36 +201,6 @@ static int rvc_getrxkimage(IplImage** personimage, IplImage** personmask)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static int rvc_setrender_property(IVideoRender* pRender, rvc_video_render_params_t* param, bool blocal)
|
|
|
-{
|
|
|
- int iret = -1;
|
|
|
- if (NULL == pRender || NULL == param) {
|
|
|
- return iret;
|
|
|
- }
|
|
|
-
|
|
|
- videorender_param_t tparam = { 0 };
|
|
|
- if (blocal) {
|
|
|
- tparam.icx = param->ilocal_view_x;
|
|
|
- tparam.icy = param->ilocal_view_y;
|
|
|
- tparam.uwidth = param->ilocal_view_cx;
|
|
|
- tparam.uheight = param->ilocal_view_cy;
|
|
|
- }
|
|
|
- else {
|
|
|
- tparam.icx = param->iremote_view_x;
|
|
|
- tparam.icy = param->iremote_view_y;
|
|
|
- tparam.uwidth = param->iremote_view_cx;
|
|
|
- tparam.uheight = param->iremote_view_cy;
|
|
|
- }
|
|
|
-
|
|
|
- tparam.ivideoformat = VIDEO_FORMAT_RGB24;
|
|
|
- if (0 == pRender->VideoRenderSetParam(&tparam)) {
|
|
|
- pRender->HideVideoWindow();
|
|
|
- iret = 0;
|
|
|
- }
|
|
|
-
|
|
|
- return iret;
|
|
|
-}
|
|
|
-
|
|
|
#ifdef RVC_OS_WIN
|
|
|
static unsigned int __stdcall rvc_videorender_func(void* arg)
|
|
|
#else
|
|
@@ -239,6 +209,7 @@ static void* rvc_videorender_func(void* arg)
|
|
|
{
|
|
|
rvc_video_render_t* param = (rvc_video_render_t*)arg;
|
|
|
int ilocal_video_fresh_time = param->render_param.ilocal_fresh_time;
|
|
|
+ bool bremote_video = false;
|
|
|
|
|
|
Clibvideoqueue* local_video_queue = NULL;
|
|
|
RVC_RendererFlip renderflip = RVC_FLIP_VERTICAL;
|
|
@@ -260,49 +231,98 @@ static void* rvc_videorender_func(void* arg)
|
|
|
IplImage* personmask = NULL;
|
|
|
rvc_getrxkimage(&personimage, &personmask);
|
|
|
|
|
|
- //ivideo_width = 0;
|
|
|
- //ivideo_height = 0;
|
|
|
- //isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
|
|
|
-
|
|
|
- param->plocal_render->ShowVideoWindow();
|
|
|
+ if (NULL != param->plocal_render) {
|
|
|
+ videorender_param_t tparam = { 0 };
|
|
|
+ tparam.icx = param->render_param.ilocal_view_x;
|
|
|
+ tparam.icy = param->render_param.ilocal_view_y;
|
|
|
+ tparam.uwidth = param->render_param.ilocal_view_cx;
|
|
|
+ tparam.uheight = param->render_param.ilocal_view_cy;
|
|
|
+ tparam.ivideoformat = VIDEO_FORMAT_RGB24;
|
|
|
+ if (0 == param->plocal_render->VideoRenderSetParam(&tparam)) {
|
|
|
+ param->plocal_render->HideVideoWindow();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- for (; ; ) {
|
|
|
+ if (0 != param->render_param.iremote_view_cx && 0 != param->render_param.iremote_view_cy) {
|
|
|
+ if (NULL != param->premote_render) {
|
|
|
+ videorender_param_t tparam_remote = { 0 };
|
|
|
+ tparam_remote.icx = param->render_param.iremote_view_x;
|
|
|
+ tparam_remote.icy = param->render_param.iremote_view_y;
|
|
|
+ tparam_remote.uwidth = param->render_param.iremote_view_cx;
|
|
|
+ tparam_remote.uheight = param->render_param.iremote_view_cy;
|
|
|
+ tparam_remote.ivideoformat = VIDEO_FORMAT_RGB24;
|
|
|
+ if (0 != param->premote_render->VideoRenderSetParam(&tparam_remote)) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("video render set param failed.");
|
|
|
+ }
|
|
|
+ bremote_video = true;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("remote video render is null.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (NULL != param->plocal_render) {
|
|
|
+ bool bshow_local = false;
|
|
|
+ bool bset = true;
|
|
|
+
|
|
|
+ param->plocal_render->StartVideoRender();
|
|
|
+ ivideo_width = 0;
|
|
|
+ ivideo_height = 0;
|
|
|
+ isize = local_video_queue->GetFrameSize(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) {
|
|
|
+ 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)){
|
|
|
+ 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)){
|
|
|
#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);
|
|
|
-
|
|
|
- if (NULL != local_video_frame) {
|
|
|
- video_frame* localframe = NULL;
|
|
|
- if (0 == translate_image_resolution(&localframe, param->render_param.ilocal_view_cx, param->render_param.ilocal_view_cy, local_video_frame)) {
|
|
|
- param->plocal_render->RenderVideoFrame(localframe, renderflip);
|
|
|
- video_frame_delete(localframe);
|
|
|
- localframe = NULL;
|
|
|
- }
|
|
|
- else {
|
|
|
- param->plocal_render->RenderVideoFrame(local_video_frame, renderflip);
|
|
|
+ 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);
|
|
|
+
|
|
|
+ if (NULL != local_video_frame) {
|
|
|
+ video_frame* localframe = NULL;
|
|
|
+ if (0 == translate_image_resolution(&localframe, param->render_param.ilocal_view_cx, param->render_param.ilocal_view_cy, local_video_frame)) {
|
|
|
+ param->plocal_render->RenderVideoFrame(localframe, renderflip);
|
|
|
+ video_frame_delete(localframe);
|
|
|
+ localframe = NULL;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ param->plocal_render->RenderVideoFrame(local_video_frame, renderflip);
|
|
|
+ }
|
|
|
+
|
|
|
+ bshow_local = true;
|
|
|
+ video_frame_delete(local_video_frame);
|
|
|
+ local_video_frame = NULL;
|
|
|
}
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ param->plocal_render->HideVideoWindow();
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- video_frame_delete(local_video_frame);
|
|
|
- local_video_frame = NULL;
|
|
|
+ if (bset) {
|
|
|
+ if (bshow_local) {
|
|
|
+ param->plocal_render->ShowVideoWindow();
|
|
|
+ if (bremote_video) {
|
|
|
+ param->premote_render->ShowVideoWindow();
|
|
|
+ }
|
|
|
+ bset = false;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- else {
|
|
|
- param->plocal_render->HideVideoWindow();
|
|
|
- break;
|
|
|
- }
|
|
|
+ param->plocal_render->StopVideoRender();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (NULL != personimage) {
|
|
|
cvReleaseImage(&personimage);
|
|
|
}
|
|
@@ -315,7 +335,7 @@ static void* rvc_videorender_func(void* arg)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static int rvc_get_agent_videoframe(video_frame** remote_frame)
|
|
|
+static int rvc_get_remote_videoframe(video_frame** remote_frame)
|
|
|
{
|
|
|
int iret = -1;
|
|
|
|
|
@@ -379,7 +399,7 @@ static void* rvc_remote_videorender_func(void* arg)
|
|
|
Clibvideoqueue* video_shm_q_remote = new Clibvideoqueue(REC_COMMON_VIDEO_REMOTE_SHM_RTP_QUEUE);
|
|
|
|
|
|
video_frame* remote_frame = NULL;
|
|
|
- rvc_get_agent_videoframe(&remote_frame);
|
|
|
+ rvc_get_remote_videoframe(&remote_frame);
|
|
|
|
|
|
video_frame* showframe = NULL;
|
|
|
if (-1 == translate_image_resolution(&showframe, param->render_param.iremote_view_cx, param->render_param.iremote_view_cy, remote_frame)) {
|
|
@@ -393,8 +413,6 @@ static void* rvc_remote_videorender_func(void* arg)
|
|
|
if (rc != Error_Succeed) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("insert agent picture to remote video queue failed.");
|
|
|
}
|
|
|
-
|
|
|
- param->premote_render->ShowVideoWindow();
|
|
|
|
|
|
for (; ; ) {
|
|
|
#ifdef RVC_OS_WIN
|
|
@@ -436,10 +454,10 @@ 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;
|
|
@@ -450,8 +468,6 @@ static void* rvc_optcam_videorender_func(void* arg)
|
|
|
renderflip = RVC_FLIP_HORIZONTAL;
|
|
|
#endif
|
|
|
|
|
|
- param->premote_render->ShowVideoWindow();
|
|
|
-
|
|
|
for (; ; ) {
|
|
|
#ifdef RVC_OS_WIN
|
|
|
DWORD dwRet = WaitForSingleObject(param->remote_render_stop_event, iremote_video_fresh_time);
|
|
@@ -536,19 +552,11 @@ int rvc_start_video_render(rvc_video_render_t* prender, eVideoRenderMode eMode,
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
|
|
|
- if (0 != rvc_setrender_property(prender->plocal_render, &prender->render_param, true)) {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set local video render property failed.");
|
|
|
- return Error_Resource;
|
|
|
- }
|
|
|
-
|
|
|
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;
|
|
|
}
|
|
|
- else {
|
|
|
- prender->plocal_render->StartVideoRender();
|
|
|
- }
|
|
|
|
|
|
if (eRender_LocalRemote == eMode || eRender_Local_Both == eMode) {
|
|
|
if (0 != sem_init(&prender->remote_render_stop_sem, 0, 0)) {
|
|
@@ -556,11 +564,6 @@ int rvc_start_video_render(rvc_video_render_t* prender, eVideoRenderMode eMode,
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
|
|
|
- if (0 != rvc_setrender_property(prender->premote_render, &prender->render_param, false)) {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set remote video render property failed.");
|
|
|
- return Error_Resource;
|
|
|
- }
|
|
|
-
|
|
|
if (eRender_LocalRemote == eMode) {
|
|
|
errcode = pthread_create(&prender->remote_render_threadid, NULL, rvc_remote_videorender_func, prender);
|
|
|
}
|
|
@@ -572,9 +575,6 @@ int rvc_start_video_render(rvc_video_render_t* prender, eVideoRenderMode eMode,
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote video render thread failed.");
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
- else {
|
|
|
- prender->premote_render->StartVideoRender();
|
|
|
- }
|
|
|
}
|
|
|
#endif // RVC_OS_WIN
|
|
|
|
|
@@ -604,7 +604,6 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
|
|
|
prender->local_render_stop_event = NULL;
|
|
|
}
|
|
|
#else
|
|
|
- prender->plocal_render->StopVideoRender();
|
|
|
sem_post(&prender->local_render_stop_sem);
|
|
|
rvc_stop_remote_video_render(prender);
|
|
|
if (prender->local_render_threadid > 0) {
|
|
@@ -628,7 +627,6 @@ int rvc_stop_remote_video_render(rvc_video_render_t* prender)
|
|
|
{
|
|
|
#ifdef RVC_OS_WIN
|
|
|
if (NULL != prender->remote_render_thread) {
|
|
|
- prender->premote_render->StopVideoRender();
|
|
|
SetEvent(prender->remote_render_stop_event);
|
|
|
WaitForSingleObject(prender->remote_render_thread, INFINITE);
|
|
|
CloseHandle(prender->remote_render_thread);
|
|
@@ -640,7 +638,6 @@ int rvc_stop_remote_video_render(rvc_video_render_t* prender)
|
|
|
}
|
|
|
#else
|
|
|
if (prender->remote_render_threadid > 0) {
|
|
|
- prender->premote_render->StopVideoRender();
|
|
|
sem_post(&prender->remote_render_stop_sem);
|
|
|
if (0 == pthread_join(prender->remote_render_threadid, NULL)) {
|
|
|
prender->remote_render_threadid = 0;
|