Compare commits

...

2 Commits

2 changed files with 40 additions and 20 deletions

View File

@ -9,6 +9,8 @@
#include "opencv2\opencv.hpp"
#include <iostream>
#include <fstream>
#include <filesystem>
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 "<<videoIndex<<" LAUNCHED \n";
int frame_index = 0;
while (temp_not_finish) {
mutex_not_finish.Lock();
@ -57,17 +61,25 @@ void ProcessWebcamThread::Execute() {
if (temp_pause || !temp_record_frame)
Platform::Get().Sleep(10);
else{
InputVideo->read(*im);
outputVideo->write(*im);
InputVideo->read(*im);
mutex_pause.Lock();
temp_pause = pause;
mutex_pause.Unlock();
if(!temp_pause){
outputVideo->write(*im);
frame_index++;
lutFile.write(reinterpret_cast<const char*>(&current_frame_clock),sizeof(float));
}
}
}
__LOG_CAM__ << "THREAD STOPPED "<<videoIndex<<"\n";
outputVideo->release();
im->release();
lutFile.close();
Platform::Get().Sleep(50); // Laisser le fichier se finaliser
delete im;
}
//*********************************************************
@ -231,8 +243,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())
@ -268,10 +279,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;
@ -312,11 +327,14 @@ void Webcam::Close() {
thread_process = nullptr;
}
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: "<<record_name<<"_"<<record_index<<"_lut.bin\n";
@ -327,7 +345,6 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index)
if (!lutFile.is_open())
{
__LOG_CAM__ << "Cannot open LUT file: " << record_name<<"_lut.bin\n";
return NULL;
}
video_times.clear();
@ -340,6 +357,7 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index)
lutFile.seekg(size - static_cast<std::streamoff>(sizeof(float)));
lutFile.read(reinterpret_cast<char*>(&end_time), sizeof(float));
__LOG_CAM__ <<"end: "<<(float)end_time<<" asked clock: "<<clock<<"\n";
//read la derniere et premiere clock
lutFile.seekg(0);
@ -352,18 +370,18 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index)
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());
}
@ -383,7 +401,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);
}
@ -392,9 +411,7 @@ 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;
}
@ -405,9 +422,11 @@ uchar *Webcam::SetFrame(float clock, GS::String record_name , int record_index)
__LOG_CAM__ << "ReplayInputVideo not opened\n";
return NULL;
}
__LOG_CAM__ << "Index found "<<index<<"for clock "<<clock<<"\n";
int frameCount = (int)ReplayInputVideo->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";

View File

@ -71,6 +71,7 @@ private:
int index_save_video;
int index_replay_video;
std::vector<float> video_times;
cv::VideoCapture *ReplayInputVideo;
cv::Mat* ReplayIm;