aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/moviemaker.h
blob: 056e68327b174c109818a75880adfae0539ce53b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/** 
 * @file moviemaker.h
 * @brief MovieMaker class definition
 *
 * Copyright (c) 2003-2007, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlife.com/developers/opensource/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at http://secondlife.com/developers/opensource/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 */

#ifndef _MOVIEMAKER_H
#define _MOVIEMAKER_H

#if LL_DARWIN
#import <QuickTime/QuickTime.h>
#endif

//
// *TODO: Refactor this implementation such that we provide an abstact
// interface in this file, and provide platform specific
// implementation in the cpp file. This is just crazy to have nearly
// the same class re-defined for different platforms, because then
// usage of the class is platform dependent.
//

#if LL_WINDOWS

#include <vfw.h>

#define TEXT_HEIGHT	20
#define AVIIF_KEYFRAME	0x00000010L // this frame is a key frame.
#define BUFSIZE 260

class MovieMaker {
private:
    //CString FName;
    char fname[64];
    int width;
    int height;

  	AVISTREAMINFO strhdr;
	PAVIFILE pfile;
	PAVISTREAM ps;
	PAVISTREAM psCompressed;
	PAVISTREAM psText;
	AVICOMPRESSOPTIONS opts;
	AVICOMPRESSOPTIONS FAR * aopts[1];
	DWORD dwTextFormat;
	COMPVARS cvars;
	char szText[BUFSIZE];
	int nFrames;
	bool bOK;


public:
    MovieMaker();
    ~MovieMaker();

    inline bool IsOK() const { return bOK; };
    void StartCapture( char *name , int x, int y);
    void EndCapture();
    bool Snap();
};

#elif LL_DARWIN

class MovieMaker {
private:
    char fname[64];		/*Flawfinder: ignore*/

	Movie	movie;
	short	movieResRef;
	Track	track;
	Media	media;
	int		width;
	int		height;
	long	bufferSize;
	long	rowBytes;
	char	*buffer;
	char	*invertedBuffer;

	GWorldPtr	gworld;
	Rect		rect;

	ComponentInstance ci;
	
	ImageDescriptionHandle idh;
	SCTemporalSettings ts;
	SCDataRateSettings ds;

	UnsignedWide	lastFrameTime;
	
	OSStatus setupMovie();
	OSStatus grabFrame();
	OSStatus addFrame();

public:
    MovieMaker();
    ~MovieMaker();

    inline bool IsOK() const { return true; };
    void StartCapture( char *name , int x, int y);
    void EndCapture();
    bool Snap();
};
	
#elif LL_LINUX
// *FIX: we need a working implementation on linux.
class MovieMaker {
public:
    MovieMaker() {}
    ~MovieMaker() {}

    inline bool IsOK() const { return false; };
    void StartCapture( char *name , int x, int y) {}
    void EndCapture() {}
    bool Snap() { return false; }
};

#endif

#endif