diff --git a/Makefile.am b/Makefile.am index 8e6892f..17c30ed 100644 --- a/Makefile.am +++ b/Makefile.am @@ -27,4 +27,7 @@ prpa_SOURCES = src/main.cc prpa_LDFLAGS = \ $(BOOST_LDFLAGS) \ - $(BOOST_PROGRAM_OPTIONS_LIB) + $(BOOST_PROGRAM_OPTIONS_LIB) \ + -ltbb \ + $(DEPS_CFLAGS) \ + $(DEPS_LIBS) diff --git a/configure.ac b/configure.ac index 46d3dbb..41b3279 100644 --- a/configure.ac +++ b/configure.ac @@ -42,6 +42,11 @@ m4_include([m4/ax_boost_program_options.m4]) AX_BOOST_BASE([1.33.1]) AX_BOOST_PROGRAM_OPTIONS +# +# Check for OpenCV +# +PKG_CHECK_MODULES([DEPS], [opencv]) + # # Check for TBB # diff --git a/src/encoder/Makefile.am b/src/encoder/Makefile.am index d338361..4967ce8 100644 --- a/src/encoder/Makefile.am +++ b/src/encoder/Makefile.am @@ -6,4 +6,4 @@ AM_CXXFLAGS = \ $(BOOST_CPPFLAGS) \ $(DEBUG_CXXFLAGS) -______lib_libencoder_a_SOURCES = +______lib_libencoder_a_SOURCES = video.cc video_writer.cc video_reader.cc diff --git a/src/encoder/video.cc b/src/encoder/video.cc new file mode 100644 index 0000000..fcef7b6 --- /dev/null +++ b/src/encoder/video.cc @@ -0,0 +1,7 @@ +#include "video.hh" + +void Video::copy(Video& v) +{ + for (auto it = v.images_.begin(); it != v.images_.end(); ++it) + this->images_.push_back(new cv::Mat(**it)); +} diff --git a/src/encoder/video.hh b/src/encoder/video.hh new file mode 100644 index 0000000..38fe645 --- /dev/null +++ b/src/encoder/video.hh @@ -0,0 +1,17 @@ +#ifndef VIDEO_HH_ +# define VIDEO_HH_ + +# include +# include "tbb/concurrent_vector.h" +# include "opencv2/opencv.hpp" + +class Video +{ + public: + void close(); + void copy(Video& v); + protected: + tbb::concurrent_vector images_; +}; + +#endif /* !VIDEO_HH_ */ diff --git a/src/encoder/video_reader.cc b/src/encoder/video_reader.cc new file mode 100644 index 0000000..c7840bf --- /dev/null +++ b/src/encoder/video_reader.cc @@ -0,0 +1,42 @@ +#include "video_reader.hh" + +VideoReader::VideoReader(std::string filename) + : capture_(filename) +{ + if (this->capture_.isOpened()) + { + while (this->capture_.grab()) + { + cv::Mat retrieved; + cv::Mat* mat = new cv::Mat(); + this->capture_.retrieve(retrieved); + *mat = retrieved.clone(); + this->images_.push_back(mat); + } + } +} + +int VideoReader::fps_get() +{ + if (this->capture_.isOpened()) + return (int)this->capture_.get(CV_CAP_PROP_FPS); + else + return -1; +} + +int VideoReader::width_get() +{ + if (this->capture_.isOpened()) + return (int)this->capture_.get(CV_CAP_PROP_FRAME_WIDTH); + else + return -1; +} + +int VideoReader::height_get() +{ + if (this->capture_.isOpened()) + return (int)this->capture_.get(CV_CAP_PROP_FRAME_HEIGHT); + else + return -1; +} + diff --git a/src/encoder/video_reader.hh b/src/encoder/video_reader.hh new file mode 100644 index 0000000..6513c25 --- /dev/null +++ b/src/encoder/video_reader.hh @@ -0,0 +1,18 @@ +#ifndef VIDEO_READER_HH_ +# define VIDEO_READER_HH_ + +# include +# include "video.hh" + +class VideoReader: public Video +{ + public: + VideoReader(std::string filename); + int fps_get(); + int width_get(); + int height_get(); + private: + cv::VideoCapture capture_; +}; + +#endif /* !VIDEO_READER_HH_ */ diff --git a/src/encoder/video_writer.cc b/src/encoder/video_writer.cc new file mode 100644 index 0000000..4f82e08 --- /dev/null +++ b/src/encoder/video_writer.cc @@ -0,0 +1,20 @@ +#include "video_writer.hh" + +bool VideoWriter::open(std::string filename, std::string enc, + int fps, int width, int height) +{ + if (enc.length() != 4) + return false; + + return this->writer_.open(filename, + CV_FOURCC(enc[0], enc[1], enc[2], enc[3]), fps, { width, height } ); +} + +void VideoWriter::write() +{ + if (this->writer_.isOpened()) + { + for (auto it = this->images_.begin(); it != this->images_.end(); ++it) + this->writer_.write(**it); + } +} diff --git a/src/encoder/video_writer.hh b/src/encoder/video_writer.hh new file mode 100644 index 0000000..0692d6f --- /dev/null +++ b/src/encoder/video_writer.hh @@ -0,0 +1,17 @@ +#ifndef VIDEO_WRITER_HH_ +# define VIDEO_WRITER_HH_ + +# include +# include "video.hh" + +class VideoWriter: public Video +{ + public: + void write(); + bool open(std::string filename, std::string enc, + int fps, int width, int height); + private: + cv::VideoWriter writer_; +}; + +#endif /* !VIDEO_WRITER_HH_ */ diff --git a/src/main.cc b/src/main.cc index ee5dbe9..d6c979f 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,6 +1,10 @@ #include #include +#include "encoder/video.hh" +#include "encoder/video_reader.hh" +#include "encoder/video_writer.hh" + int main (int argc, char** argv) { @@ -12,6 +16,8 @@ main (int argc, char** argv) ("help,h", "produce help message") ("filter,f", po::value > (), "apply a filter") ("input-file,i", po::value > (), "file to treat") + ("output,o", po::value > (), "output file") + ("codec,c", po::value > (), "output codec") ; // Handle ./prpa file.avi instead of ./prpa --input-file=file.avi @@ -54,5 +60,13 @@ main (int argc, char** argv) else std::cout << 0 << std::endl; + VideoReader vr(vm["input-file"].as >()[0]); + VideoWriter vw = VideoWriter(); + vw.open(vm["output"].as >()[0], + vm["codec"].as >()[0], + vr.fps_get(), vr.width_get(), vr.height_get()); + vw.copy(vr); + vw.write(); + return 0; }