X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavdevice%2Fvfwcap.c;h=60ab169e7663341f5745892031f82ae96d3f750f;hb=3bfbbef64df9c69c6d1ccbc40a16daac55f8652a;hp=5963e6242ea2d2dc32e3c03491e59ada17a6a1ce;hpb=245976da2a7f9a4a03dfb6903e9437b7cf2967f4;p=ffmpeg diff --git a/libavdevice/vfwcap.c b/libavdevice/vfwcap.c index 5963e6242ea..60ab169e766 100644 --- a/libavdevice/vfwcap.c +++ b/libavdevice/vfwcap.c @@ -1,6 +1,6 @@ /* * VFW capture interface - * Copyright (c) 2006-2008 Ramiro Polla. + * Copyright (c) 2006-2008 Ramiro Polla * * This file is part of FFmpeg. * @@ -27,58 +27,10 @@ /* Defines for VFW missing from MinGW. * Remove this when MinGW incorporates them. */ -#define WM_CAP_START (0x0400) -#define WM_CAP_SET_CALLBACK_VIDEOSTREAM (WM_CAP_START + 6) -#define WM_CAP_DRIVER_CONNECT (WM_CAP_START + 10) -#define WM_CAP_DRIVER_DISCONNECT (WM_CAP_START + 11) -#define WM_CAP_GET_VIDEOFORMAT (WM_CAP_START + 44) -#define WM_CAP_SET_VIDEOFORMAT (WM_CAP_START + 45) -#define WM_CAP_SET_PREVIEW (WM_CAP_START + 50) -#define WM_CAP_SET_OVERLAY (WM_CAP_START + 51) -#define WM_CAP_SEQUENCE_NOFILE (WM_CAP_START + 63) -#define WM_CAP_SET_SEQUENCE_SETUP (WM_CAP_START + 64) -#define WM_CAP_GET_SEQUENCE_SETUP (WM_CAP_START + 65) - #define HWND_MESSAGE ((HWND)-3) #define BI_RGB 0 -typedef struct videohdr_tag { - LPBYTE lpData; - DWORD dwBufferLength; - DWORD dwBytesUsed; - DWORD dwTimeCaptured; - DWORD dwUser; - DWORD dwFlags; - DWORD_PTR dwReserved[4]; -} VIDEOHDR, NEAR *PVIDEOHDR, FAR * LPVIDEOHDR; - -typedef struct { - DWORD dwRequestMicroSecPerFrame; - BOOL fMakeUserHitOKToCapture; - UINT wPercentDropForError; - BOOL fYield; - DWORD dwIndexSize; - UINT wChunkGranularity; - BOOL fUsingDOSMemory; - UINT wNumVideoRequested; - BOOL fCaptureAudio; - UINT wNumAudioRequested; - UINT vKeyAbort; - BOOL fAbortLeftMouse; - BOOL fAbortRightMouse; - BOOL fLimitEnabled; - UINT wTimeLimit; - BOOL fMCIControl; - BOOL fStepMCIDevice; - DWORD dwMCIStartTime; - DWORD dwMCIStopTime; - BOOL fStepCaptureAt2x; - UINT wStepCaptureAverageFrames; - DWORD dwAudioBufferSize; - BOOL fDisableWriteCache; - UINT AVStreamMaster; -} CAPTUREPARMS; /* End of missing MinGW defines */ struct vfw_ctx { @@ -114,7 +66,16 @@ static enum PixelFormat vfw_pixfmt(DWORD biCompression, WORD biBitCount) return PIX_FMT_RGB32; } } - return -1; + return PIX_FMT_NONE; +} + +static enum CodecID vfw_codecid(DWORD biCompression) +{ + switch(biCompression) { + case MKTAG('d', 'v', 's', 'd'): + return CODEC_ID_DVVIDEO; + } + return CODEC_ID_NONE; } #define dstruct(pctx, sname, var, type) \ @@ -188,7 +149,7 @@ static int shall_we_drop(struct vfw_ctx *ctx) { AVFormatContext *s = ctx->s; const uint8_t dropscore[] = {62, 75, 87, 100}; - const int ndropscores = sizeof(dropscore)/sizeof(dropscore[0]); + const int ndropscores = FF_ARRAY_ELEMS(dropscore); unsigned int buffer_fullness = (ctx->curbufsize*100)/s->max_picture_buffer; if(dropscore[++ctx->frame_num%ndropscores] <= buffer_fullness) { @@ -240,7 +201,22 @@ fail: return FALSE; } -static int vfw_read_close(AVFormatContext *s); +static int vfw_read_close(AVFormatContext *s) +{ + struct vfw_ctx *ctx = s->priv_data; + + if(ctx->hwnd) { + SendMessage(ctx->hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); + SendMessage(ctx->hwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0); + DestroyWindow(ctx->hwnd); + } + if(ctx->mutex) + CloseHandle(ctx->mutex); + if(ctx->event) + CloseHandle(ctx->event); + + return 0; +} static int vfw_read_header(AVFormatContext *s, AVFormatParameters *ap) { @@ -318,17 +294,17 @@ static int vfw_read_header(AVFormatContext *s, AVFormatParameters *ap) bi->bmiHeader.biWidth = width ; bi->bmiHeader.biHeight = height; -#if 0 - /* For testing yet unsupported compressions - * Copy these values from user-supplied verbose information */ - bi->bmiHeader.biWidth = 320; - bi->bmiHeader.biHeight = 240; - bi->bmiHeader.biPlanes = 1; - bi->bmiHeader.biBitCount = 12; - bi->bmiHeader.biCompression = MKTAG('I','4','2','0'); - bi->bmiHeader.biSizeImage = 115200; - dump_bih(s, &bi->bmiHeader); -#endif + if (0) { + /* For testing yet unsupported compressions + * Copy these values from user-supplied verbose information */ + bi->bmiHeader.biWidth = 320; + bi->bmiHeader.biHeight = 240; + bi->bmiHeader.biPlanes = 1; + bi->bmiHeader.biBitCount = 12; + bi->bmiHeader.biCompression = MKTAG('I','4','2','0'); + bi->bmiHeader.biSizeImage = 115200; + dump_bih(s, &bi->bmiHeader); + } ret = SendMessage(ctx->hwnd, WM_CAP_SET_VIDEOFORMAT, bisize, (LPARAM) bi); if(!ret) { @@ -367,20 +343,24 @@ static int vfw_read_header(AVFormatContext *s, AVFormatParameters *ap) codec->codec_type = CODEC_TYPE_VIDEO; codec->width = width; codec->height = height; - codec->codec_id = CODEC_ID_RAWVIDEO; codec->pix_fmt = vfw_pixfmt(biCompression, biBitCount); - if(biCompression == BI_RGB) - codec->bits_per_sample = biBitCount; + if(codec->pix_fmt == PIX_FMT_NONE) { + codec->codec_id = vfw_codecid(biCompression); + if(codec->codec_id == CODEC_ID_NONE) { + av_log(s, AV_LOG_ERROR, "Unknown compression type. " + "Please report verbose (-v 9) debug information.\n"); + vfw_read_close(s); + return AVERROR_PATCHWELCOME; + } + codec->bits_per_coded_sample = biBitCount; + } else { + codec->codec_id = CODEC_ID_RAWVIDEO; + if(biCompression == BI_RGB) + codec->bits_per_coded_sample = biBitCount; + } av_set_pts_info(st, 32, 1, 1000); - if(codec->pix_fmt == -1) { - av_log(s, AV_LOG_ERROR, "Unknown compression type." - "Please report verbose (-v 99) debug information.\n"); - vfw_read_close(s); - return AVERROR_PATCHWELCOME; - } - ctx->mutex = CreateMutex(NULL, 0, NULL); if(!ctx->mutex) { av_log(s, AV_LOG_ERROR, "Could not create Mutex.\n" ); @@ -437,26 +417,9 @@ static int vfw_read_packet(AVFormatContext *s, AVPacket *pkt) return pkt->size; } -static int vfw_read_close(AVFormatContext *s) -{ - struct vfw_ctx *ctx = s->priv_data; - - if(ctx->hwnd) { - SendMessage(ctx->hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); - SendMessage(ctx->hwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0); - DestroyWindow(ctx->hwnd); - } - if(ctx->mutex) - CloseHandle(ctx->mutex); - if(ctx->event) - CloseHandle(ctx->event); - - return 0; -} - AVInputFormat vfwcap_demuxer = { "vfwcap", - "VFW video capture", + NULL_IF_CONFIG_SMALL("VFW video capture"), sizeof(struct vfw_ctx), NULL, vfw_read_header,