diff --git a/source/webcam.cpp b/source/webcam.cpp index f1445f1..2ce430e 100644 --- a/source/webcam.cpp +++ b/source/webcam.cpp @@ -9,6 +9,8 @@ #include "opencv2\opencv.hpp" #include #include +#include + using namespace GS; using namespace GS::Script; @@ -36,10 +38,12 @@ void ProcessWebcamThread::Execute() { bool temp_not_finish = true; bool temp_pause = true; bool temp_record_frame = false; - + current_frame_clock = 0.0; //construction LUT pour synchro avec la clock squirrel std::ofstream lutFile(outputVideoName+"_lut.bin", std::ios::binary); __LOG_CAM__ << "NEW RECORDING THREAD "<release(); lutFile.close(); + Platform::Get().Sleep(50); // Laisser le fichier se finaliser + delete im; } //********************************************************* @@ -278,8 +284,7 @@ void Webcam::ResetVideo() { std::stringstream video_name; video_name << "./webcam_record_" << index_save_video << ".avi"; // set the codec fourcc - unsigned int ex = outputVideo->fourcc('X', 'V', 'I', 'D'); - outputVideo->set(VIDEOWRITER_PROP_QUALITY, 70); + unsigned int ex = outputVideo->fourcc('M', 'J', 'P', 'G'); outputVideo->open(video_name.str(), ex, webcam_fps, Size(width, height), true); if (!outputVideo->isOpened()) @@ -315,10 +320,14 @@ void Webcam::setPause(bool pause) { bool thread_pause = thread_process->pause; thread_process->mutex_pause.Unlock(); + thread_process->mutex_pause.Lock(); + thread_process->pause = pause; + thread_process->mutex_pause.Unlock(); if (!thread_pause && pause) { __LOG_CAM__ <<"B\n"; Close(); + Platform::Get().Sleep(50); // Laisser le fichier se finaliser __LOG_CAM__ << "REPLAY INPUT RELEASE ./webcam_record_" << index_replay_video << ".avi\n "; ReplayInputVideo->release(); index_replay_video = index_save_video - 1; @@ -359,11 +368,14 @@ void Webcam::Close() { thread_process = nullptr; } - ReplayInputVideo->release(); + if(ReplayInputVideo) + ReplayInputVideo->release(); } uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index) { //create buffer from lut + bool is_the_last_record = record_index == index_save_video - 1 ; + if(video_times.size() == 0){ //charger lut dans video_times __LOG_CAM__ << "Chargement LUT: "<(sizeof(float))); lutFile.read(reinterpret_cast(&end_time), sizeof(float)); + __LOG_CAM__ <<"end: "<<(float)end_time<<" asked clock: "<(&start_time), sizeof(float)); - + if(clock < start_time){ __LOG_CAM__ << "clock < start_time\n"; lutFile.close(); return NULL; } - else if(clock > end_time){ + else if(clock > end_time && !is_the_last_record){ __LOG_CAM__ << "clock > end_time\n"; lutFile.close(); return SetFrame(clock,record_name,record_index+1); //recursive search forward } if (record_index != index_replay_video) { - __LOG_H__ << "Changing video\n"; + __LOG_CAM__ << "Changing video\n"; index_replay_video = record_index; std::stringstream video_name; video_name << record_name << "_" << index_replay_video << ".avi"; - __LOG_H__ << record_name << "_" << index_replay_video << ".avi"; + __LOG_CAM__ << record_name << "_" << index_replay_video << ".avi\n"; ReplayInputVideo->release(); ReplayInputVideo->open(video_name.str()); } @@ -430,7 +442,8 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index) return NULL; //force reset if clock not in range - if(clock < video_times[0] || clock > video_times[video_times.size() -1]){ + if(clock < video_times[0] || (clock > video_times[video_times.size() -1] && !is_the_last_record)){ + __LOG_CAM__ << "CLEAR \n"; video_times.clear(); return SetFrame(clock, record_name , 0); } @@ -439,26 +452,26 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index) if (it == video_times.begin()) { - // clock before first frame __LOG_CAM__ << "clock before first frame\n"; - //SetFrame(clock,record_name-1) return nullptr; } size_t index = std::distance(video_times.begin(), it) - 1; - + if (!ReplayInputVideo || !ReplayInputVideo->isOpened()) { __LOG_CAM__ << "ReplayInputVideo not opened\n"; return NULL; } - __LOG_CAM__ << "Index found "<get(cv::CAP_PROP_FRAME_COUNT) - 1; ReplayInputVideo->set(cv::CAP_PROP_POS_FRAMES, index); + if (!ReplayInputVideo->read(*ReplayImframe)) - { - __LOG_CAM__ << "Failed to read frame at index " << index << "\n"; - return NULL; + { + __LOG_CAM__ << "Failed to read frame at index " << index << "\n"; + return NULL; } cv::cvtColor(*ReplayImframe, *ReplayIm, CV_BGR2RGBA, 4); diff --git a/source/webcam.h b/source/webcam.h index a38b8a5..ac617ed 100644 --- a/source/webcam.h +++ b/source/webcam.h @@ -71,6 +71,7 @@ private: int index_save_video; int index_replay_video; + std::vector video_times; cv::VideoCapture *ReplayInputVideo; cv::Mat* ReplayIm;