32 #define HWND_MESSAGE ((HWND)-3)
50 switch(biCompression) {
51 case MKTAG(
'U',
'Y',
'V',
'Y'):
53 case MKTAG(
'Y',
'U',
'Y',
'2'):
55 case MKTAG(
'I',
'4',
'2',
'0'):
78 switch(biCompression) {
79 case MKTAG(
'd',
'v',
's',
'd'):
81 case MKTAG(
'M',
'J',
'P',
'G'):
82 case MKTAG(
'm',
'j',
'p',
'g'):
88 #define dstruct(pctx, sname, var, type) \
89 av_log(pctx, AV_LOG_DEBUG, #var":\t%"type"\n", sname->var)
94 dstruct(s, cparms, dwRequestMicroSecPerFrame,
"lu");
95 dstruct(s, cparms, fMakeUserHitOKToCapture,
"d");
96 dstruct(s, cparms, wPercentDropForError,
"u");
97 dstruct(s, cparms, fYield,
"d");
98 dstruct(s, cparms, dwIndexSize,
"lu");
99 dstruct(s, cparms, wChunkGranularity,
"u");
100 dstruct(s, cparms, fUsingDOSMemory,
"d");
101 dstruct(s, cparms, wNumVideoRequested,
"u");
102 dstruct(s, cparms, fCaptureAudio,
"d");
103 dstruct(s, cparms, wNumAudioRequested,
"u");
104 dstruct(s, cparms, vKeyAbort,
"u");
105 dstruct(s, cparms, fAbortLeftMouse,
"d");
106 dstruct(s, cparms, fAbortRightMouse,
"d");
107 dstruct(s, cparms, fLimitEnabled,
"d");
108 dstruct(s, cparms, wTimeLimit,
"u");
109 dstruct(s, cparms, fMCIControl,
"d");
110 dstruct(s, cparms, fStepMCIDevice,
"d");
111 dstruct(s, cparms, dwMCIStartTime,
"lu");
112 dstruct(s, cparms, dwMCIStopTime,
"lu");
113 dstruct(s, cparms, fStepCaptureAt2x,
"d");
114 dstruct(s, cparms, wStepCaptureAverageFrames,
"u");
115 dstruct(s, cparms, dwAudioBufferSize,
"lu");
116 dstruct(s, cparms, fDisableWriteCache,
"d");
117 dstruct(s, cparms, AVStreamMaster,
"u");
125 dstruct(s, vhdr, dwBufferLength,
"lu");
126 dstruct(s, vhdr, dwBytesUsed,
"lu");
127 dstruct(s, vhdr, dwTimeCaptured,
"lu");
128 dstruct(s, vhdr, dwUser,
"lu");
129 dstruct(s, vhdr, dwFlags,
"lu");
130 dstruct(s, vhdr, dwReserved[0],
"lu");
131 dstruct(s, vhdr, dwReserved[1],
"lu");
132 dstruct(s, vhdr, dwReserved[2],
"lu");
133 dstruct(s, vhdr, dwReserved[3],
"lu");
141 dstruct(s, bih, biWidth,
"ld");
142 dstruct(s, bih, biHeight,
"ld");
143 dstruct(s, bih, biPlanes,
"d");
144 dstruct(s, bih, biBitCount,
"d");
145 dstruct(s, bih, biCompression,
"lu");
147 (
char*) &bih->biCompression);
148 dstruct(s, bih, biSizeImage,
"lu");
149 dstruct(s, bih, biXPelsPerMeter,
"lu");
150 dstruct(s, bih, biYPelsPerMeter,
"lu");
151 dstruct(s, bih, biClrUsed,
"lu");
152 dstruct(s, bih, biClrImportant,
"lu");
158 const uint8_t dropscore[] = {62, 75, 87, 100};
162 if(dropscore[++ctx->
frame_num%ndropscores] <= buffer_fullness) {
164 "real-time buffer %d%% full! frame dropped!\n", buffer_fullness);
185 WaitForSingleObject(ctx->
mutex, INFINITE);
196 pktl_next->
pkt.
pts = vdhdr->dwTimeCaptured;
197 memcpy(pktl_next->
pkt.
data, vdhdr->lpData, vdhdr->dwBytesUsed);
199 for(ppktl = &ctx->
pktl ; *ppktl ; ppktl = &(*ppktl)->
next);
204 SetEvent(ctx->
event);
205 ReleaseMutex(ctx->
mutex);
209 ReleaseMutex(ctx->
mutex);
219 SendMessage(ctx->
hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
220 SendMessage(ctx->
hwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0);
221 DestroyWindow(ctx->
hwnd);
224 CloseHandle(ctx->
mutex);
226 CloseHandle(ctx->
event);
231 av_destruct_packet(&pktl->
pkt);
246 BITMAPINFO *bi = NULL;
254 for (devnum = 0; devnum <= 9; devnum++) {
255 char driver_name[256];
256 char driver_ver[256];
257 ret = capGetDriverDescription(devnum,
258 driver_name,
sizeof(driver_name),
259 driver_ver,
sizeof(driver_ver));
278 ret = SendMessage(ctx->
hwnd, WM_CAP_DRIVER_CONNECT, devnum, 0);
281 DestroyWindow(ctx->
hwnd);
285 SendMessage(ctx->
hwnd, WM_CAP_SET_OVERLAY, 0, 0);
286 SendMessage(ctx->
hwnd, WM_CAP_SET_PREVIEW, 0, 0);
288 ret = SendMessage(ctx->
hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0,
295 SetWindowLongPtr(ctx->
hwnd, GWLP_USERDATA, (
LONG_PTR) s);
304 bisize = SendMessage(ctx->
hwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0);
312 ret = SendMessage(ctx->
hwnd, WM_CAP_GET_VIDEOFORMAT, bisize, (LPARAM) bi);
335 bi->bmiHeader.biWidth = 320;
336 bi->bmiHeader.biHeight = 240;
337 bi->bmiHeader.biPlanes = 1;
338 bi->bmiHeader.biBitCount = 12;
339 bi->bmiHeader.biCompression =
MKTAG(
'I',
'4',
'2',
'0');
340 bi->bmiHeader.biSizeImage = 115200;
344 ret = SendMessage(ctx->
hwnd, WM_CAP_SET_VIDEOFORMAT, bisize, (LPARAM) bi);
350 biCompression = bi->bmiHeader.biCompression;
351 biBitCount = bi->bmiHeader.biBitCount;
354 ret = SendMessage(ctx->
hwnd, WM_CAP_GET_SEQUENCE_SETUP,
sizeof(cparms),
362 cparms.dwRequestMicroSecPerFrame =
363 (framerate_q.
den*1000000) / framerate_q.
num;
364 cparms.fAbortLeftMouse = 0;
365 cparms.fAbortRightMouse = 0;
366 cparms.fCaptureAudio = 0;
367 cparms.vKeyAbort = 0;
369 ret = SendMessage(ctx->
hwnd, WM_CAP_SET_SEQUENCE_SETUP,
sizeof(cparms),
377 codec->
width = bi->bmiHeader.biWidth;
378 codec->
height = bi->bmiHeader.biHeight;
384 "Please report verbose (-v 9) debug information.\n");
391 if(biCompression == BI_RGB) {
405 ctx->
mutex = CreateMutex(NULL, 0, NULL);
410 ctx->
event = CreateEvent(NULL, 1, 0, NULL);
416 ret = SendMessage(ctx->
hwnd, WM_CAP_SEQUENCE_NOFILE, 0, 0);
436 WaitForSingleObject(ctx->
mutex, INFINITE);
443 ResetEvent(ctx->
event);
444 ReleaseMutex(ctx->
mutex);
449 WaitForSingleObject(ctx->
event, INFINITE);
459 #define OFFSET(x) offsetof(struct vfw_ctx, x)
460 #define DEC AV_OPT_FLAG_DECODING_PARAM
477 .priv_data_size =
sizeof(
struct vfw_ctx),