0023428: Extend OpenGl_Context to use Geometry Shaders extension
[occt.git] / src / OpenGl / OpenGl_AVIWriter.hxx
CommitLineData
b311480e 1// Created on: 2007-04-15
2// Created by: Alexey MORENOV & Alexander GRIGORIEV
3// Copyright (c) 2007-2012 OPEN CASCADE SAS
4//
5// The content of this file is subject to the Open CASCADE Technology Public
6// License Version 6.5 (the "License"). You may not use the content of this file
7// except in compliance with the License. Please obtain a copy of the License
8// at http://www.opencascade.org and read it completely before using this file.
9//
10// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12//
13// The Original Code and all software distributed under the License is
14// distributed on an "AS IS" basis, without warranty of any kind, and the
15// Initial Developer hereby disclaims all such warranties, including without
16// limitation, any warranties of merchantability, fitness for a particular
17// purpose or non-infringement. Please see the License for the specific terms
18// and conditions governing the rights and limitations under the License.
19
7fd59977 20
21#ifndef __OPENGL_AVIWRITER_H
22#define __OPENGL_AVIWRITER_H
23
24#ifdef WNT
25#define THIS void
26
27#include <InterfaceGraphic_WNT.hxx>
28#include <stdlib.h>
29#include <vfw.h>
30#include <TCollection_AsciiString.hxx>
31
32/**
33 * Class providing the API to record AVI files using a codec installed in the
34 * system -- Only on Windows NT/2k/XP/Vista platform under MS Visual Studio.
35 * The following tasks are supported:
36 * <ol>
37 *
38 * <li> Creation of AVI data stream: launched by the constructor.<br>
39 * The constructor accepts the filename, FOURCC video code and the frame rate
40 * setting as parameters.<br>
41 * The default codec name used here is MPG4. To use a different codec, pass
42 * its FOURCC value as the input parameter for dwCodec.
43 * For example,
44 * <ul>
45 * <li>pass mmioFOURCC('D','I','V','X') to use DIVX codec, or</li>
46 * <li>pass mmioFOURCC('I','V','5','0') to use IV50 codec etc...</li>
47 * </ul>
48 * Also, you can pass just 0 to avoid the codecs altogether. In that case,
49 * the frames would be saved as they are without any compression; However,
50 * the output movie file size would be very huge in that case.
51 * <br>
52 * Finally, make sure you have the codec installed on the machine before
53 * passing its Fourcc here.
54 * </li>
55 * <li>
56 * Start the recording: call the method StartRecording(). This method should be
57 * called at least once; execution of the constructor does not begin the
58 * process.
59 * </li>
60 * <li>
61 * Stop the recording: call the method StopRecording(). Can be omitted if the
62 * next to execute would be the destructor.
63 * </li>
64 * <li>
65 * Close the AVI file and exit the process of recording. This is done
66 * automatically by the destructor.
67 * </li>
68 * </ol>
69 */
70class OpenGl_AVIWriter
71{
72public:
73
74 /**
75 * Constructor. Initializes the internal data structures, prepares for the
76 * creation of an AVI stream when the first frame is ready to be captured.
77 * @param theFileName
78 * Name of the output movie file to create.
79 * @param theCodec
80 * FourCC of the Video Codec to be used for compression
81 * @param theFrameRate
82 * The Frames Per Second (FPS) setting to be used for the movie
83 */
84 Standard_EXPORT OpenGl_AVIWriter(const char * theFileName,
85 DWORD theCodec = mmioFOURCC('M','P','G','4'),
86 Standard_Integer theFrameRate = 25);
87
88 /**
89 * Destructor: closes the movie file and flushes all the frames
90 */
91 Standard_EXPORT ~OpenGl_AVIWriter ();
92
93 /**
94 * Begin the recording.
95 */
96 Standard_EXPORT void StartRecording(const HANDLE hWin = NULL);
97
98 /**
99 * Stop the recording (can be restarted using StartRecording()).
100 */
101 Standard_EXPORT void StopRecording ();
102
103 /**
104 * Query the state of recording.
105 */
106 inline Standard_Boolean IsRecording () const { return myIsAllowRecord; }
107
108 /**
109 * Returns the last error message, if any.
110 */
111 inline Standard_EXPORT const TCollection_AsciiString&
112 GetLastErrorMessage() const
113 { return myErrMsg; }
114
115 /**
116 * Get the instance of AVI Writer class.
117 */
118 static Standard_EXPORT OpenGl_AVIWriter *
119 GetInstance ();
120
121 /**
122 * Get the Window handle that contains the actual OpenGl context.
123 */
124 inline HANDLE HWindow () const
125 { return myhWindow; }
126
127 /// Inserts the given HBitmap into the movie as a new Frame at the end.
128 HRESULT AppendNewFrame(HBITMAP hBitmap);
129
130 /// Inserts the given bitmap bits into the movie as a new Frame at the end.
131 /// The width, height and nBitsPerPixel are the width, height and bits per pixel
132 /// of the bitmap pointed to by the input pBits.
133 HRESULT AppendNewFrame(int nWidth,
134 int nHeight,
135 LPVOID pBits,
136 int nBitsPerPixel);
137
138private:
139
140 void call_avi();
141
142private:
143 static OpenGl_AVIWriter * MyAVIWriterInstance;
144 Standard_Boolean myIsAllowRecord;
145
146 BYTE * mypBits;
147 UINT myWidth;
148 UINT myHeight;
149
150 HDC myhAviDC;
151 HANDLE myhHeap;
152 HANDLE myhWindow; // window containing the OGL context
153 LPVOID mylpBits; // Useful to hold the bitmap content if any
154 LONG mylSample; // Keeps track of the current Frame Index
155 PAVIFILE mypAviFile;
156 PAVISTREAM mypAviStream;
157 PAVISTREAM mypAviCompressedStream;
158 AVISTREAMINFO myAviStreamInfo;
159 AVICOMPRESSOPTIONS myAviCompressOptions;
160 char * myFileName; // Holds the Output Movie File Name
161 TCollection_AsciiString myErrMsg; // Holds the Last Error Message, if any
162
163 int myAppendFuncSelector; //0=Dummy 1=FirstTime 2=Usual
164
165 HRESULT AppendFrameFirstTime(HBITMAP );
166 HRESULT AppendFrameUsual(HBITMAP);
167 HRESULT AppendDummy(HBITMAP);
168 HRESULT (OpenGl_AVIWriter::*pAppendFrame[3])(HBITMAP hBitmap);
169
170 HRESULT AppendFrameBitsFirstTime(int, int, LPVOID,int );
171 HRESULT AppendFrameBitsUsual(int, int, LPVOID,int );
172 HRESULT AppendDummyBits(int, int, LPVOID,int );
173 HRESULT (OpenGl_AVIWriter::*pAppendFrameBits[3])(int, int, LPVOID, int);
174
175 /// Takes care of creating the memory, streams, compression options etc.
176 /// required for the movie
177 HRESULT InitMovieCreation(int nFrameWidth,int nFrameHeight,int nBitsPerPixel);
178
179 /// Takes care of releasing the memory and movie related handles
180 void ReleaseMemory();
181
182 /// Sets the Error Message
183 void SetErrorMessage(const char * theErrMsg);
184};
185
186Standard_EXPORT void OpenGl_AVIWriter_AVIWriter(void * pp,
187 int nWidth,
188 int nHeight,
189 int nBitsPerPixel);
190
191Standard_EXPORT Standard_Boolean OpenGl_AVIWriter_AllowWriting(void * hWin);
192
193#endif // WNT
194#endif