39 #define HWND_MESSAGE ((HWND) -3) 
   56     switch(biCompression) {
 
   57     case MKTAG(
'U', 
'Y', 
'V', 
'Y'):
 
   59     case MKTAG(
'Y', 
'U', 
'Y', 
'2'):
 
   61     case MKTAG(
'I', 
'4', 
'2', 
'0'):
 
   84     switch(biCompression) {
 
   85     case MKTAG(
'd', 
'v', 
's', 
'd'):
 
   87     case MKTAG(
'M', 
'J', 
'P', 
'G'):
 
   88     case MKTAG(
'm', 
'j', 
'p', 
'g'):
 
   94 #define dstruct(pctx, sname, var, type) \ 
   95     av_log(pctx, AV_LOG_DEBUG, #var":\t%"type"\n", sname->var) 
  100     dstruct(s, cparms, dwRequestMicroSecPerFrame, 
"lu");
 
  101     dstruct(s, cparms, fMakeUserHitOKToCapture, 
"d");
 
  102     dstruct(s, cparms, wPercentDropForError, 
"u");
 
  103     dstruct(s, cparms, fYield, 
"d");
 
  104     dstruct(s, cparms, dwIndexSize, 
"lu");
 
  105     dstruct(s, cparms, wChunkGranularity, 
"u");
 
  106     dstruct(s, cparms, fUsingDOSMemory, 
"d");
 
  107     dstruct(s, cparms, wNumVideoRequested, 
"u");
 
  108     dstruct(s, cparms, fCaptureAudio, 
"d");
 
  109     dstruct(s, cparms, wNumAudioRequested, 
"u");
 
  110     dstruct(s, cparms, vKeyAbort, 
"u");
 
  111     dstruct(s, cparms, fAbortLeftMouse, 
"d");
 
  112     dstruct(s, cparms, fAbortRightMouse, 
"d");
 
  113     dstruct(s, cparms, fLimitEnabled, 
"d");
 
  114     dstruct(s, cparms, wTimeLimit, 
"u");
 
  115     dstruct(s, cparms, fMCIControl, 
"d");
 
  116     dstruct(s, cparms, fStepMCIDevice, 
"d");
 
  117     dstruct(s, cparms, dwMCIStartTime, 
"lu");
 
  118     dstruct(s, cparms, dwMCIStopTime, 
"lu");
 
  119     dstruct(s, cparms, fStepCaptureAt2x, 
"d");
 
  120     dstruct(s, cparms, wStepCaptureAverageFrames, 
"u");
 
  121     dstruct(s, cparms, dwAudioBufferSize, 
"lu");
 
  122     dstruct(s, cparms, fDisableWriteCache, 
"d");
 
  123     dstruct(s, cparms, AVStreamMaster, 
"u");
 
  131     dstruct(s, vhdr, dwBufferLength, 
"lu");
 
  132     dstruct(s, vhdr, dwBytesUsed, 
"lu");
 
  133     dstruct(s, vhdr, dwTimeCaptured, 
"lu");
 
  134     dstruct(s, vhdr, dwUser, 
"lu");
 
  135     dstruct(s, vhdr, dwFlags, 
"lu");
 
  136     dstruct(s, vhdr, dwReserved[0], 
"lu");
 
  137     dstruct(s, vhdr, dwReserved[1], 
"lu");
 
  138     dstruct(s, vhdr, dwReserved[2], 
"lu");
 
  139     dstruct(s, vhdr, dwReserved[3], 
"lu");
 
  147     dstruct(s, bih, biWidth, 
"ld");
 
  148     dstruct(s, bih, biHeight, 
"ld");
 
  149     dstruct(s, bih, biPlanes, 
"d");
 
  150     dstruct(s, bih, biBitCount, 
"d");
 
  151     dstruct(s, bih, biCompression, 
"lu");
 
  153                    (
char*) &bih->biCompression);
 
  154     dstruct(s, bih, biSizeImage, 
"lu");
 
  155     dstruct(s, bih, biXPelsPerMeter, 
"lu");
 
  156     dstruct(s, bih, biYPelsPerMeter, 
"lu");
 
  157     dstruct(s, bih, biClrUsed, 
"lu");
 
  158     dstruct(s, bih, biClrImportant, 
"lu");
 
  164     static const uint8_t dropscore[] = {62, 75, 87, 100};
 
  168     if(dropscore[++ctx->
frame_num%ndropscores] <= buffer_fullness) {
 
  170               "real-time buffer %d%% full! frame dropped!\n", buffer_fullness);
 
  191     WaitForSingleObject(ctx->
mutex, INFINITE);
 
  202     pktl_next->
pkt.
pts = vdhdr->dwTimeCaptured;
 
  203     memcpy(pktl_next->
pkt.
data, vdhdr->lpData, vdhdr->dwBytesUsed);
 
  205     for(ppktl = &ctx->
pktl ; *ppktl ; ppktl = &(*ppktl)->
next);
 
  210     SetEvent(ctx->
event);
 
  211     ReleaseMutex(ctx->
mutex);
 
  215     ReleaseMutex(ctx->
mutex);
 
  225         SendMessage(ctx->
hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
 
  226         SendMessage(ctx->
hwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0);
 
  227         DestroyWindow(ctx->
hwnd);
 
  230         CloseHandle(ctx->
mutex);
 
  232         CloseHandle(ctx->
event);
 
  252     BITMAPINFO *bi = 
NULL;
 
  260         for (devnum = 0; devnum <= 9; devnum++) {
 
  261             char driver_name[256];
 
  262             char driver_ver[256];
 
  263             ret = capGetDriverDescription(devnum,
 
  264                                           driver_name, 
sizeof(driver_name),
 
  265                                           driver_ver, 
sizeof(driver_ver));
 
  284     ret = SendMessage(ctx->
hwnd, WM_CAP_DRIVER_CONNECT, devnum, 0);
 
  287         DestroyWindow(ctx->
hwnd);
 
  291     SendMessage(ctx->
hwnd, WM_CAP_SET_OVERLAY, 0, 0);
 
  292     SendMessage(ctx->
hwnd, WM_CAP_SET_PREVIEW, 0, 0);
 
  294     ret = SendMessage(ctx->
hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0,
 
  301     SetWindowLongPtr(ctx->
hwnd, GWLP_USERDATA, (
LONG_PTR) s);
 
  310     bisize = SendMessage(ctx->
hwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0);
 
  318     ret = SendMessage(ctx->
hwnd, WM_CAP_GET_VIDEOFORMAT, bisize, (LPARAM) bi);
 
  341         bi->bmiHeader.biWidth       = 320;
 
  342         bi->bmiHeader.biHeight      = 240;
 
  343         bi->bmiHeader.biPlanes      = 1;
 
  344         bi->bmiHeader.biBitCount    = 12;
 
  345         bi->bmiHeader.biCompression = 
MKTAG(
'I',
'4',
'2',
'0');
 
  346         bi->bmiHeader.biSizeImage   = 115200;
 
  350     ret = SendMessage(ctx->
hwnd, WM_CAP_SET_VIDEOFORMAT, bisize, (LPARAM) bi);
 
  356     biCompression = bi->bmiHeader.biCompression;
 
  357     biBitCount = bi->bmiHeader.biBitCount;
 
  360     ret = SendMessage(ctx->
hwnd, WM_CAP_GET_SEQUENCE_SETUP, 
sizeof(cparms),
 
  368     cparms.dwRequestMicroSecPerFrame =
 
  369                                (framerate_q.
den*1000000) / framerate_q.
num;
 
  370     cparms.fAbortLeftMouse = 0;
 
  371     cparms.fAbortRightMouse = 0;
 
  372     cparms.fCaptureAudio = 0;
 
  373     cparms.vKeyAbort = 0;
 
  375     ret = SendMessage(ctx->
hwnd, WM_CAP_SET_SEQUENCE_SETUP, 
sizeof(cparms),
 
  383     codec->
width  = bi->bmiHeader.biWidth;
 
  384     codec->
height = bi->bmiHeader.biHeight;
 
  390                              "Please report verbose (-v 9) debug information.\n");
 
  397         if(biCompression == BI_RGB) {
 
  422     ret = SendMessage(ctx->
hwnd, WM_CAP_SEQUENCE_NOFILE, 0, 0);
 
  442         WaitForSingleObject(ctx->
mutex, INFINITE);
 
  449         ResetEvent(ctx->
event);
 
  450         ReleaseMutex(ctx->
mutex);
 
  455                 WaitForSingleObject(ctx->
event, INFINITE);
 
  465 #define OFFSET(x) offsetof(struct vfw_ctx, x) 
  466 #define DEC AV_OPT_FLAG_DECODING_PARAM 
  484     .priv_data_size = 
sizeof(
struct vfw_ctx),
 
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 
void av_free_packet(AVPacket *pkt)
Free a packet. 
int av_parse_video_rate(AVRational *rate, const char *arg)
Parse str and store the detected values in *rate. 
int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str)
Parse str and put in width_ptr and height_ptr the detected values. 
#define LIBAVUTIL_VERSION_INT
static enum AVPixelFormat vfw_pixfmt(DWORD biCompression, WORD biBitCount)
unsigned int max_picture_buffer
Maximum amount of memory in bytes to use for buffering frames obtained from realtime capture devices...
static void dump_captureparms(AVFormatContext *s, CAPTUREPARMS *cparms)
static int vfw_read_close(AVFormatContext *s)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx. 
#define FF_ARRAY_ELEMS(a)
static const AVClass vfw_class
packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in ...
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static void dump_videohdr(AVFormatContext *s, VIDEOHDR *vhdr)
uint8_t * extradata
some codecs need / can use extradata like Huffman tables. 
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file. 
int flags
Flags modifying the (de)muxer behaviour. 
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv). 
Main libavdevice API header. 
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values. 
static void dump_bih(AVFormatContext *s, BITMAPINFOHEADER *bih)
AVCodecID
Identify the syntax and semantics of the bitstream. 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered. 
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers. 
AVCodecContext * codec
Codec context associated with this stream. 
#define dstruct(pctx, sname, var, type)
common internal API header 
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
char filename[1024]
input or output filename 
int width
picture width / height. 
static enum AVCodecID vfw_codecid(DWORD biCompression)
packed RGB 8:8:8, 24bpp, BGRBGR... 
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome. 
#define AV_LOG_INFO
Standard information. 
enum AVMediaType codec_type
main external API structure. 
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr 
Describe the class of an AVClass context structure. 
rational number numerator/denominator 
static int vfw_read_header(AVFormatContext *s)
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational. 
AVInputFormat ff_vfwcap_demuxer
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) 
struct AVPacketList * next
Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb...
char * framerate
Set by a private option. 
static const AVOption options[]
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) 
#define AV_PIX_FMT_RGB555
static int vfw_read_packet(AVFormatContext *s, AVPacket *pkt)
char * video_size
A string describing video size, set by a private option. 
static int shall_we_drop(AVFormatContext *s)
void * priv_data
Format private data. 
static LRESULT CALLBACK videostream_cb(HWND hwnd, LPVIDEOHDR vdhdr)
#define MKTAG(a, b, c, d)
AVPixelFormat
Pixel format. 
This structure stores compressed data. 
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...