windows-nt/Source/XPSP1/NT/drivers/wdm/capture/codec/tsbyuv/vcuser.h
2020-09-26 16:20:57 +08:00

382 lines
12 KiB
C

/*
* Copyright Microsoft Corporation, 1993 - 1995. All Rights Reserved.
*/
/*
* vcuser.h
*
* 32-bit Video Capture driver
* User-mode support library
*
* define functions providing access to video capture hardware. On NT,
* these functions will interface to the kernel-mode driver.
*
* include vcstruct.h before this.
*
* Geraint Davies, Feb 93
*/
#ifndef _VCUSER_H_
#define _VCUSER_H_
/*
* capture device handle. This structure is opaque to the caller
*/
typedef struct _VCUSER_HANDLE * VCUSER_HANDLE;
/*
* these are the parameters we need to issue a DriverCallback. A
* pointer to one of these structs is passed on StreamInit
* If the pointer is null, we don't need callbacks.
*/
typedef struct _VCCALLBACK {
DWORD dwCallback;
DWORD dwFlags;
HDRVR hDevice;
DWORD dwUser;
} VCCALLBACK, * PVCCALLBACK;
/*
* open the device and return a capture device handle that can be used
* in future calls.
* The device index is 0 for the first capture device up to N for the
* Nth installed capture device.
*
* If pDriverName is non-null, then we will open the Nth device handled
* by this driver. (Current implementation supports only one device per
* drivername.)
*
* This function returns NULL if it is not able to open the device.
*/
VCUSER_HANDLE VC_OpenDevice(PTCHAR pDriverName, int DeviceIndex);
/*
* close a capture device. This will abort any operation in progress and
* render the device handle invalid.
*/
VOID VC_CloseDevice(VCUSER_HANDLE vh);
/*
* Configuration.
*
* These functions perform device-dependent setup affecting the
* target format, the source acquisition or the display (overlay).
*
* The structures passed are not interpreted by the vcuser and vckernel
* libraries except that the first ulong of the struct must contain the
* size in bytes of the entire structure (see vcstruct.h). It is assumed
* that the structures are defined and agreed between the user-mode
* hardware-specific code and the kernel-mode hardware specific code
*/
BOOL VC_ConfigFormat(VCUSER_HANDLE, PCONFIG_INFO);
BOOL VC_ConfigSource(VCUSER_HANDLE, PCONFIG_INFO);
BOOL VC_ConfigDisplay(VCUSER_HANDLE, PCONFIG_INFO);
/*
* overlay and keying
*
* Several different methods are used by devices to locate the overlay
* area on the screen: colour (either rgb or palette index) and/or
* either a single rectangle, or a series of rectangles defining a complex
* region. Call GetOverlayMode first to find out which type of overlay
* keying is available. If this returns 0, this hardware is not capable
* of overlay.
*/
/*
* find out the overlay keying method
*/
ULONG VC_GetOverlayMode(VCUSER_HANDLE);
/*
* set the key colour to a specified RGB colour. This function will only
* succeed if GetOverlayMode returned VCO_KEYCOLOUR and VCO_KEYCOLOUR_RGB
* and not VCO_KEYCOLOUR_FIXED
*/
BOOL VC_SetKeyColourRGB(VCUSER_HANDLE, PRGBQUAD);
/*
* set the key colour to a specified palette index. This function will only
* succeed if GetOverlayMode returned VCO_KEYCOLOUR and not either
* VCO_KEYCOLOUR_RGB or VCO_KEYCOLOUR_FIXED
*/
BOOL VC_SetKeyColourPalIdx(VCUSER_HANDLE, WORD);
/*
* get the current key colour. This 32-bit value should be interpreted
* as either a palette index or an RGB value according to the
* VCO_KEYCOLOUR_RGB flag returned from VC_GetOverlayMode.
*/
DWORD VC_GetKeyColour(VCUSER_HANDLE vh);
/*
* set the overlay rectangle(s). This rectangle marks the area in device
* co-ordinates where the overlay video will appear. The video will be
* panned so that pixel (0,0) will appear at the top-left of this rectangle,
* and the video will be cropped at the bottom and right. The video
* stream will not normally be scaled to fit this window: scaling is normally
* determined by the destination format set by VC_ConfigFormat.
*
* If VCO_KEYCOLOUR was returned, the video
* will only be shown at those pixels within the rectangle for which the
* vga display has the key colour (VC_GetKeyColour() for this).
*
* Some devices may support complex regions (VCO_COMPLEX_RECT). In that case,
* the first rectangle in the area must be the bounding rectangle for
* the overlay area, followed by one rectangle for each region within it in
* which the overlay should appear.
*/
BOOL VC_SetOverlayRect(VCUSER_HANDLE, POVERLAY_RECTS);
/*
* set the offset of the overlay. This changes the panning - ie which
* source co-ordinate appears as the top left pixel in the overlay rectangle.
* Initially after a call to VC_SetOverlayRect, the source image will be panned
* so that the top-left of the source image is aligned with the top-left of the
* overlay rectangle. This call aligns the top-left of the source image
* with the top-left of this offset rectangle.
*/
BOOL VC_SetOverlayOffset(VCUSER_HANDLE, PRECT);
/* enable or disable overlay. if the BOOL bOverlay is TRUE, and the overlay
* key colour and rectangle have been set, overlay will be enabled.
*/
BOOL VC_Overlay(VCUSER_HANDLE, BOOL);
/*
* enable or disable acquisition.
* If acquisition is disabled, the overlay image will be frozen.
*
* this function will have no effect during capture since the acquisition
* flag is toggled at each frame capture.
*/
BOOL VC_Capture(VCUSER_HANDLE, BOOL);
/*
* capture a single frame, synchronously. the video header must point
* to a data buffer large enough to hold one frame of the format set by
* VC_ConfigFormat.
*/
// BOOL VC_Frame(VCUSER_HANDLE, LPVIDEOHDR);
/*
* data streaming.
*
* Call VC_StreamInit to prepare for streaming.
* Call VC_StreamStart to initiate capture.
* Call VC_AddBuffer to add a capture buffer to the list. As each
* frame capture completes, the callback function specified in
* VC_StreamInit will be called with the buffer that has completed.
*
* If there is no buffer ready when it is time to capture a frame,
* a callback will occur. In addition, VC_StreamGetError will return
* a count of the frames missed this session. VC_StreamGetPos will return
* the position (in millisecs) reached so far.
*
* Call VC_StreamStop to terminate streaming. Any buffer currently in
* progress may still complete. Uncompleted buffers will remain in the
* queue. Call VC_Reset to release all buffers from the queue.
*
* Finally call VC_StreamFini to tidy up.
*/
/*
* prepare to start capturing frames
*/
BOOL VC_StreamInit(VCUSER_HANDLE,
PVCCALLBACK, // pointer to callback function
ULONG // desired capture rate: microseconds per frame
);
/*
* clean up after capturing. You must have stopped capturing first.
*/
BOOL VC_StreamFini(VCUSER_HANDLE);
/*
* initiate capturing of frames. Must have called VC_StreamInit first.
*/
BOOL VC_StreamStart(VCUSER_HANDLE);
/*
* stop capturing frames. Current frame may still complete. All other buffers
* will remain in the queue until capture is re-started, or they are released
* by VC_StreamReset.
*/
BOOL VC_StreamStop(VCUSER_HANDLE);
/*
* cancel all buffers that have been 'add-buffered' but have not
* completed. This will also force VC_StreamStop if it hasn't already been
* called.
*/
BOOL VC_StreamReset(VCUSER_HANDLE);
/*
* get the count of frames that have been skipped since the last call
* to VC_StreamInit.
*/
ULONG VC_GetStreamError(VCUSER_HANDLE);
/*
* get the current position within the capture stream (ie time
* in millisecs since capture began)
*/
BOOL VC_GetStreamPos(VCUSER_HANDLE, LPMMTIME);
/*
* add a buffer to the queue. The buffer should be large enough
* to hold one frame of the format specified by VC_ConfigFormat.
*/
// BOOL VC_StreamAddBuffer(VCUSER_HANDLE, LPVIDEOHDR);
/*
* playback
*
* Call VC_DrawFrame to draw a frame into the frame buffer. You should
* call VC_Overlay functions to arrange for the frame buffer to appear
* on screen.
*/
BOOL VC_DrawFrame(VCUSER_HANDLE, PDRAWBUFFER);
/*
* installation/configuration
*
* on NT, the following functions will start and stop the
* kernel driver. The callback function can write profile information
* to the registry between stopping the driver (if already running) and
* re-starting the driver. The kernel driver DriverEntry routine is responsible
* for reading these values from the registry before calling VC_Init().
*
* The win-16 implementation will (?) call the callback to write
* values to the profile, and then call the HW_Startup function. This function
* is responsible for calling VC_Init, initialising the callback table and
* initialising the hardware.
*/
/*
* opaque pointer to the information we need to access the registry/profile.
*/
typedef struct _VC_PROFILE_INFO * PVC_PROFILE_INFO;
/*
* open a handle to whatever functions are needed to access the registry,
* service controller or profile. Must call this function before
* calls to the other VC_ configuration routines.
*
* The argument is the name of the driver. This should be the name of
* the kernel driver file (without path or extension). It will also be used
* as the registry key name or profile section name.
*/
PVC_PROFILE_INFO VC_OpenProfileAccess(PTCHAR DriverName);
/*
* close a profile access handle
*/
VOID VC_CloseProfileAccess(PVC_PROFILE_INFO);
/*
* takes a PVC_PROFILE_INFO returned from VC_OpenProfileAccess, and
* returns TRUE if we currently have sufficient privilege to perform
* driver configuration operations.
*/
BOOL VC_ConfigAccess(PVC_PROFILE_INFO);
/*
* This function is called once the driver has definitely been unloaded, and
* the profile entry created, but before the driver is re-loaded. It can write
* any configuration information to the registry. It should return TRUE if
* it is ok to load and start the kernel-mode driver, or false if some
* error has occured.
*/
typedef BOOL (*PPROFILE_CALLBACK)(PVOID);
/*
* start the hardware-access portion of the driver. Call the callback
* function at a moment when it is possible to write configuration information
* to the profile using VC_WriteProfile.
* Returns DRVCNF_OK if all is ok, DRVCNF_CANCEL for failure, or DRVCNF_RESTART if
* all is ok but a system-restart is needed before the driver will load correctly.
*/
LRESULT VC_InstallDriver(
PVC_PROFILE_INFO pProfile, // access info returned by OpenProfileAccess
PPROFILE_CALLBACK pCallback, // callback function
PVOID pContext // context info for callback
);
/*
* Write a single string keyword and DWORD value to the registry or profile
* for this driver.
* This can be re-read from the h/w driver using VC_ReadProfile (in either
* the kernel-mode vckernel.lib version or user mode in the vcuser version).
*
* return TRUE for success or FALSE for failure.
*/
BOOL VC_WriteProfile(PVC_PROFILE_INFO pProfile, PTCHAR ValueName, DWORD Value);
/*
* Write a single string keyword and DWORD value to the registry or profile
* for this driver.
* This writes to HKEY_CURRENT_USER and is typically used to store user defaults.
*
* return TRUE for success or FALSE for failure.
*/
BOOL VC_WriteProfileUser(PVC_PROFILE_INFO pProfile, PTCHAR ValueName, DWORD Value);
/*
* read back a driver-specific DWORD profile parameter that was written with
* VC_WriteProfile. If the valuename cannot be found, the default is returned.
*/
DWORD VC_ReadProfile(PVC_PROFILE_INFO pProfile, PTCHAR ValueName, DWORD dwDefault);
/*
* read back a driver-specific DWORD profile parameter that was written with
* VC_WriteProfileUser. If the valuename cannot be found, the default is returned.
* This reads from HKEY_CURRENT_USER and is typically used to store user defaults.
*/
DWORD VC_ReadProfileUser(PVC_PROFILE_INFO pProfile, PTCHAR ValueName, DWORD dwDefault);
/*
* read a string parameter from the device's profile. returns FALSE
* if it fails to read the string.
*/
BOOL VC_ReadProfileString(
PVC_PROFILE_INFO pProfile, // access info from OpenProfile
PTCHAR ValueName, // name of value to read
PTCHAR ValueString, // put value here
DWORD ValueLength // size of ValueString in bytes
);
/*
* unload a driver. On NT, this stops and removes the kernel-mode driver.
* On win-16, this calls the Cleanup callback.
*
* return DRVCNF_OK if the unload was successful, DRVCNF_CANCEL if it failed, and
* DRVCNF_RESTART if a system-restart is needed before the removal takes effect.
*
* note that after this operation, the PVC_PROFILE_INFO information is still held
* open. A call to VC_CloseProfileAccess is still needed before exiting.
*/
LRESULT VC_RemoveDriver(PVC_PROFILE_INFO pProfile);
#endif //_VCUSER_H_