diff options
Diffstat (limited to 'rotord/ofxMovieExporter.h')
| -rw-r--r-- | rotord/ofxMovieExporter.h | 209 |
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; |
