| | |
| | | |
| | | #include <thread> |
| | | #include <unistd.h> |
| | | #include <chrono> |
| | | |
| | | extern "C"{ |
| | | #include <libavcodec/avcodec.h> |
| | |
| | | ,file_frame_index_(-1) |
| | | ,file_path_("") |
| | | ,func_rec_info_(nullptr) |
| | | ,thrd_(nullptr) |
| | | ,error_occured_(false) |
| | | { |
| | | // logIt("RECODER ID: %s", id_.c_str()); |
| | | } |
| | | |
| | | Recorder::~Recorder(){ |
| | | if (out_ && !stop_recorder_.load()){ |
| | | stop_recorder_.store(true); |
| | | cv_.notify_one(); |
| | | while(stop_recorder_.load()){ |
| | | logIt("REC WAIT TO QUIT ID %s", id_.c_str()); |
| | | sleep(1); |
| | | } |
| | | }else if (stop_recorder_.load()){ |
| | | logIt("REC NORMAL QUIT"); |
| | | |
| | | try |
| | | { |
| | | if (thrd_){ |
| | | { |
| | | std::unique_lock<std::mutex> locker(mutex_pkt_); |
| | | stop_recorder_.store(true); |
| | | cv_.notify_one(); |
| | | } |
| | | thrd_->join(); |
| | | logIt("REC THREAD JOINED, QUIT!!!"); |
| | | } |
| | | } |
| | | catch(const std::exception& e) |
| | | { |
| | | logIt("RECODER DESTRUCTOR EXCEPTION: ", e.what()); |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | //callback to frame index and path |
| | | if(func_rec_info_){ |
| | | func_rec_info_(id_,file_frame_index_, file_path_); |
| | | func_rec_info_(id_, file_frame_index_, file_path_); |
| | | } |
| | | } |
| | | |
| | |
| | | std::list<avpacket> pkts; |
| | | { |
| | | std::unique_lock<std::mutex> locker(mutex_pkt_); |
| | | cv_.wait(locker,[&]{ |
| | | auto status = cv_.wait_for(locker, std::chrono::seconds(10), [&]{ |
| | | return !list_pkt_.empty() || stop_recorder_.load(); |
| | | }); |
| | | |
| | | if (!status){ |
| | | end_writer(); |
| | | error_occured_ = true; |
| | | break; |
| | | } |
| | | if(stop_recorder_.load()){ |
| | | end_writer(); |
| | | break; |
| | |
| | | |
| | | logIt("minduration %d maxduration %d curduration %d", minduration, maxduration, end_frame); |
| | | |
| | | std::thread([&]{ |
| | | thrd_.reset(new std::thread([&]{ |
| | | run_thread(); |
| | | }).detach(); |
| | | })); |
| | | //.detach(); |
| | | |
| | | return 0; |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |