summaryrefslogtreecommitdiff
path: root/rotord/ofxMovieExporter.h
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/ofxMovieExporter.h')
-rw-r--r--rotord/ofxMovieExporter.h209
1 files changed, 209 insertions, 0 deletions
diff --git a/rotord/ofxMovieExporter.h b/rotord/ofxMovieExporter.h
new file mode 100644
index 0000000..ae6b306
--- /dev/null
+++ b/rotord/ofxMovieExporter.h
@@ -0,0 +1,209 @@
+/*
+ * ofxMovieExporter.h
+ *
+ * Copyright (c) 2011, Neil Mendoza, http://www.neilmendoza.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of 16b.it nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+//#pragma once
+
+#include <unordered_map>
+#include <deque>
+#include <math.h>
+#include <memory>
+
+#include "Poco/Net/HTTPServer.h"
+#include "Poco/Net/HTTPResponse.h"
+#include "Poco/UUID.h"
+#include "Poco/UUIDGenerator.h"
+#include "Poco/Notification.h"
+#include "Poco/NotificationCenter.h"
+#include "Poco/Observer.h"
+#include "Poco/ThreadPool.h"
+#include "Poco/Thread.h"
+#include "Poco/Task.h"
+#include "Poco/Runnable.h"
+#include "Poco/Mutex.h"
+#include "Poco/Random.h"
+#include "Poco/AutoPtr.h"
+#include "Poco/File.h"
+#include "xmlIO.h"
+//#define _THREAD_CAPTURE
+#include <string>
+#include <iostream>
+/*
+#include "ofMain.h"
+
+// needed for gcc on win
+#ifdef TARGET_WIN32
+ #ifndef INT64_C
+ #define INT64_C(c) (c ## LL)
+ #define UINT64_C(c) (c ## ULL)
+ #endif
+#endif
+*/
+//#define UINT64_C(c) (c ## ULL)
+
+
+extern "C"
+{
+ //needed both
+ #include <libavcodec/avcodec.h>
+ #include <libavformat/avformat.h>
+ #include <libavutil/mathematics.h>
+ //needed ofxMovieExporter
+ #include <libswscale/swscale.h>
+ //rest needed audio loader
+ #include <libavutil/opt.h>
+ #include <libavutil/channel_layout.h>
+ #include <libavutil/common.h>
+ #include <libavutil/imgutils.h>
+
+ #include <libavutil/samplefmt.h>
+
+ #include <libavutil/dict.h>
+ //#include <libavutil/dict.c> stops the compiler error but causes a linker error. does libavcodec need to be statically linked?
+ //#include <libavutil/imgutils.h>
+ //#include <libavutil/samplefmt.h>
+ //#include <libavutil/timestamp.h>
+}
+
+namespace itg
+{
+ class ofxMovieExporter
+//#ifdef _THREAD_CAPTURE
+// : public ofThread
+//#endif
+ {
+ public:
+ static const int ENCODED_FRAME_BUFFER_SIZE = 500000;
+ // defaults
+ static const int BIT_RATE = 4000000;
+ static const int FRAME_RATE = 25;
+ static const int OUT_W = 640;
+ static const int OUT_H = 480;
+ static const int INIT_QUEUE_SIZE = 50;
+ static const AVCodecID CODEC_ID = CODEC_ID_MPEG4;
+ static const std::string FILENAME_PREFIX;
+ static const std::string CONTAINER;
+
+ ofxMovieExporter();
+ ~ofxMovieExporter();
+ // tested so far with...
+ // codecId = CODEC_ID_MPEG4, container = "mp4"
+ // codecId = CODEC_ID_MPEG2VIDEO, container = "mov"
+ void setup(int outW = OUT_W, int outH = OUT_H, int bitRate = BIT_RATE, int frameRate = FRAME_RATE, AVCodecID codecId = CODEC_ID, std::string container = CONTAINER);
+ void record(std::string filePrefix=FILENAME_PREFIX, std::string folderPath="");
+ void stop();
+ bool isRecording() const;
+
+ // set the recording area
+ // x, y is the upper left corner of the recording area, default: 0, 0
+ // w x h is the area size, default: viewport width x height
+ void setRecordingArea(int x, int y, int w, int h);
+ void setRecordingArea(int rect);
+
+ // reset the recording area to the size of the current viewport (screen, FBO, etc)
+ void resetRecordingArea();
+
+ // get the recording area as a rectangle
+ int getRecordingArea();
+
+ // set an external pixel source, assumes 3 Byte RGB
+ // also sets the recording size but does not crop to the recording area
+ void setPixelSource(unsigned char* pixels, int w, int h);
+
+ // reset the pixel source and record from the screen
+ // also resets the recording size to the viewport width
+ void resetPixelSource();
+
+ // get the number files that have been captured so far
+ int getNumCaptures();
+
+ // reset the filename counter back to 0
+ void resetNumCaptures();
+
+ // get the recording size
+ inline int getRecordingWidth() {return outW;}
+ inline int getRecordingHeight() {return outH;}
+
+ private:
+//#ifdef _THREAD_CAPTURE
+// void threadedFunction();
+// deque<unsigned char*> frameQueue;
+// deque<unsigned char*> frameMem;
+// ofMutex frameQueueMutex;
+// ofMutex frameMemMutex;
+//#endif
+ void initEncoder();
+ void allocateMemory();
+ void clearMemory();
+
+ void checkFrame();//ofEventArgs& args);
+ void encodeFrame();
+ void finishRecord();
+
+ std::string container;
+ AVCodecID codecId;
+
+ bool recording;
+ int numCaptures;
+ int frameRate;
+ int bitRate;
+ float frameInterval;
+ float lastFrameTime;
+ int frameNum;
+ std::string outFileName;
+
+ AVOutputFormat* outputFormat;
+ AVFormatContext* formatCtx;
+ AVStream* videoStream;
+
+ AVCodec* codec;
+ AVCodecContext* codecCtx;
+
+ SwsContext* convertCtx;
+
+ unsigned char* inPixels;
+ unsigned char* outPixels;
+ unsigned char* encodedBuf;
+
+ AVFrame* inFrame;
+ AVFrame* outFrame;
+
+ int posX, posY;
+ int inW, inH;
+ int outW, outH;
+
+ bool usePixelSource;
+ unsigned char* pixelSource;
+ };
+
+ inline bool ofxMovieExporter::isRecording() const { return recording; }
+}
+
+namespace Apex = itg;