[FFmpeg-devel] [PATCH] VFW capture support

Ramiro Polla ramiro
Wed Mar 5 20:21:35 CET 2008


Hello,

M?ns Rullg?rd wrote:
> Ramiro Polla <ramiro at lisha.ufsc.br> writes:
> 
>>>>>> struct vfw_ctx {
>>>>>>     HWND hwnd;
>>>>>>     int grabbed;
>>>>>>     AVPacket *pkt;
>>>>>> };
>>>>>>
>>>>>> static int vfw_pixfmt( DWORD biCompression )
>>>>> Do we really have to use those dreadful windows typedefs and naming
>>>>> conventions?
>>>> I find it best when writing an interface to an API that has
>>>> documentation, the same way you follow variable names from specs.
>>> This function isn't part of any API.
>> DWORD biCompression is part of the documentation.
> 
> As part of the BITMAPINFOHEADER struct, yes.  That function of yours
> is certainly not in any MS API.

So, what do you suggest?
DWORD -> uint32_t which is possibly incorrect
biCompression -> someothername

>>>>     ctx->hwnd = capCreateCaptureWindow( NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0 );
>>>>     if( !ctx->hwnd ) {
>>>>         av_log( s, AV_LOG_ERROR, "Could not create capture window.\n" );
>>>>         return AVERROR_IO;
>>>>     }
>> I don't know how this can fail. Left as is.
> 
> I can imagine it might run out of memory or whatever other limited
> resources it needs.  I'm sure there's some upper limit for the number
> of windows.
> 
>>>>     /* If atoi fails, devnum==0 and the default device is used */
>>>>     devnum = atoi( s->filename );
>>>>
>>>>     ret = SendMessage( ctx->hwnd, WM_CAP_DRIVER_CONNECT, devnum, 0 );
>>>>     if( !ret ) {
>>>>         av_log( s, AV_LOG_ERROR, "Could not connect to device.\n" );
>>>>         return AVERROR_IO;
>>>>     }
>>> I'm not sure AVERROR_IO is the proper error code for those failures.
>> Other grab devices mostly return EIO.
> 
> EIO is appropriate when an attempt to perform I/O failed.  IMHO,
> device setup doesn't quite fit that label.

Well, that's what x11grab uses. Can you suggest any other error?

>> /*
>>  * VFW capture interface
>>  * Copyright (c) 2006-2008 Ramiro Polla.
>>  *
>>  * This file is part of FFmpeg.
>>  *
>>  * FFmpeg is free software; you can redistribute it and/or
>>  * modify it under the terms of the GNU Lesser General Public
>>  * License as published by the Free Software Foundation; either
>>  * version 2.1 of the License, or (at your option) any later version.
>>  *
>>  * FFmpeg is distributed in the hope that it will be useful,
>>  * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>>  * Lesser General Public License for more details.
>>  *
>>  * You should have received a copy of the GNU Lesser General Public
>>  * License along with FFmpeg; if not, write to the Free Software
>>  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>>  */
>>
>> #include "avformat.h"
>> #include <vfw.h>
>> #include <windows.h>
>>
>> /* Defines for VFW missing from MinGW.
>>  * Remove this when MinGW incorporates them. */
>> #define WM_CAP_START                (0x0400)
>> #define WM_CAP_SET_CALLBACK_FRAME   (WM_CAP_START + 5)
>> #define WM_CAP_GET_USER_DATA        (WM_CAP_START + 8)
>> #define WM_CAP_SET_USER_DATA        (WM_CAP_START + 9)
>> #define WM_CAP_DRIVER_CONNECT       (WM_CAP_START + 10)
>> #define WM_CAP_DRIVER_DISCONNECT    (WM_CAP_START + 11)
>> #define WM_CAP_GRAB_FRAME           (WM_CAP_START + 60)
>> #define WM_CAP_GET_VIDEOFORMAT      (WM_CAP_START + 44)
>> #define WM_CAP_SET_PREVIEW          (WM_CAP_START + 50)
>> #define WM_CAP_SET_OVERLAY          (WM_CAP_START + 51)
>>
>> #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;
>> /* End of missing MinGW defines */
>>
>> struct vfw_ctx {
>>     HWND hwnd;
>>     int grabbed;
>>     AVPacket *pkt;
>> };
>>
>> static int vfw_pixfmt( AVFormatContext *s, DWORD biCompression )
> 
> This function could return enum PixelFormat.

Done.

>> {
>>     switch( biCompression ) {
>>     case MKTAG( 'Y', 'U', 'Y', '2' ):
>>         return PIX_FMT_YUYV422;
>>     case BI_RGB:
>>         return PIX_FMT_BGR24;
>>     }
>>     av_log( s, AV_LOG_ERROR, "Unknown compression type."
>>                              "Please report debug information.\n" );
> 
> Printing the value of the unknown format could be useful.

It is printed if you use verbose. Now the error msg (moved out of this 
function) prints:
"Please report verbose (-v 99) debug information."

Ramiro Polla
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vfwcap.c
Type: text/x-csrc
Size: 6567 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080305/f287f956/attachment.c>



More information about the ffmpeg-devel mailing list