-
Notifications
You must be signed in to change notification settings - Fork 2
/
vfwtest.c
144 lines (112 loc) · 3.09 KB
/
vfwtest.c
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
141
142
143
/* simple test application which invokes the vfw system
this lacks sufficient originality to be eligible for copyright;
therefore, public domain */
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <vfw.h>
AVISTREAMINFO m_header;
PAVIFILE m_file;
BITMAPINFOHEADER m_bitmap;
PAVISTREAM m_stream;
PAVISTREAM m_stream_c;
AVICOMPRESSOPTIONS m_options;
AVICOMPRESSOPTIONS *m_options_p;
void addframes (void)
{
unsigned char *framedata = malloc (256 * 256 * 3);
int j = 0;
for (int f = 0; f < 600; f++)
{
for (int y = 0; y < 256; y++)
{
for (int x = 0; x < 256; x++)
{
framedata[y * 768 + x * 3 + 0] = j++;
framedata[y * 768 + x * 3 + 1] = j++;
j += 2;
framedata[y * 768 + x * 3 + 2] = j++;
j += 3;
}
}
// what does writing AVIIF_KEYFRAME mean exactly?
if (0 != AVIStreamWrite (m_stream_c, f, 1, (void *) framedata, m_bitmap.biSizeImage, AVIIF_KEYFRAME, NULL, NULL))
{
printf ("AVIStreamWrite!!\n");
exit (0);
}
j += 11;
}
free (framedata);
}
int main (int argc, char *argv[])
{
int ret;
if (!argv[1])
{
printf ("give filename\n");
return 0;
}
FILE *f = fopen (argv[1], "wb");
if (!f)
{
printf ("couldn't do file\n");
return 0;
}
fclose (f);
AVIFileInit ();
ret = AVIFileOpen (&m_file, argv[1], OF_WRITE | OF_CREATE, NULL);
if (ret != 0)
{
printf ("AVIFileOpen!! %i\n", ret);
return 0;
}
// set up the still image information
// is there some sort of pitch limitation on DIBs?
m_bitmap.biSize = sizeof (BITMAPINFOHEADER);
m_bitmap.biWidth = 256;
m_bitmap.biHeight = 256; // negative would be for top-down arangement
m_bitmap.biPlanes = 1;
m_bitmap.biBitCount = 24; // BGR24
m_bitmap.biCompression = BI_RGB; // uncompressed
m_bitmap.biSizeImage = 256 * 256 * 3; // size, can be zero for BI_RGB
//m_bitmap.biXPelsPerMeter = 1000; // pixels per meter? not likely used
//m_bitmap.biYPelsPerMeter = 1000; // pixels per meter? not likely used
//m_bitmap.biClrUsed = 0;
//m_bitmap.biClrImportant = 0;
// set up video stream information
m_header.fccType = streamtypeVIDEO;
m_header.dwScale = 1; // fpsden
m_header.dwRate = 60; // fpsnum
m_header.dwSuggestedBufferSize = m_bitmap.biSizeImage;
if (0 != AVIFileCreateStream (m_file, &m_stream, &m_header))
{
printf ("AVIFileCreateStream!!\n");
return 0;
}
// use VCM to select codec
m_options_p = &m_options;
if (1 != AVISaveOptions (0, 0, 1, &m_stream, &m_options_p))
{
printf ("AVISaveOptions!!\n");
return 0;
}
// create compressed stream
if (0 != AVIMakeCompressedStream (&m_stream_c, m_stream, &m_options, NULL))
{
printf ("AVIMakeCompressedStream!!\n");
return 0;
}
if (0 != AVIStreamSetFormat (m_stream_c, 0, &m_bitmap, m_bitmap.biSize + m_bitmap.biClrUsed * sizeof (RGBQUAD)))
{
printf ("AVIStreamSetFormat!!\n");
return 0;
}
// add frames
addframes ();
AVIStreamClose (m_stream_c);
AVIStreamClose (m_stream);
AVIFileClose (m_file);
AVIFileExit ();
return 0;
}