2007 lines
67 KiB
C
2007 lines
67 KiB
C
/*!
|
|
* \file
|
|
*
|
|
* This file contains the interface constants, structure definitions and
|
|
* function prototypes defining the NvFBC API for Linux.
|
|
*
|
|
* Copyright (c) 2013-2020, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef _NVFBC_H_
|
|
#define _NVFBC_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
/*!
|
|
* \mainpage NVIDIA Framebuffer Capture (NvFBC) for Linux.
|
|
*
|
|
* NvFBC is a high performance, low latency API to capture the framebuffer of
|
|
* an X server screen.
|
|
*
|
|
* The output from NvFBC captures everything that would be visible if we were
|
|
* directly looking at the monitor. This includes window manager decoration,
|
|
* mouse cursor, overlay, etc.
|
|
*
|
|
* It is ideally suited to desktop or fullscreen application capture and
|
|
* remoting.
|
|
*/
|
|
|
|
/*!
|
|
* \defgroup FBC_REQ Requirements
|
|
*
|
|
* The following requirements are provided by the regular NVIDIA Display Driver
|
|
* package:
|
|
*
|
|
* - OpenGL core >= 4.2:
|
|
* Required. NvFBC relies on OpenGL to perform frame capture and
|
|
* post-processing.
|
|
*
|
|
* - Vulkan 1.1:
|
|
* Required.
|
|
*
|
|
* - libcuda.so.1 >= 5.5:
|
|
* Optional. Used for capture to video memory with CUDA interop.
|
|
*
|
|
* The following requirements must be installed separately depending on the
|
|
* Linux distribution being used:
|
|
*
|
|
* - XRandR extension >= 1.2:
|
|
* Optional. Used for RandR output tracking.
|
|
*
|
|
* - libX11-xcb.so.1 >= 1.2:
|
|
* Required. NvFBC uses a mix of Xlib and XCB. Xlib is needed to use GLX,
|
|
* XCB is needed to make NvFBC more resilient against X server terminations
|
|
* while a capture session is active.
|
|
*
|
|
* - libxcb.so.1 >= 1.3:
|
|
* Required. See above.
|
|
*
|
|
* - xorg-server >= 1.3:
|
|
* Optional. Required for push model to work properly.
|
|
*
|
|
* Note that all optional dependencies are dlopen()'d at runtime. Failure to
|
|
* load an optional library is not fatal.
|
|
*/
|
|
|
|
/*!
|
|
* \defgroup FBC_CHANGES ChangeLog
|
|
*
|
|
* NvFBC Linux API version 0.1
|
|
* - Initial BETA release.
|
|
*
|
|
* NvFBC Linux API version 0.2
|
|
* - Added 'bEnableMSE' field to NVFBC_H264_HW_ENC_CONFIG.
|
|
* - Added 'dwMSE' field to NVFBC_TOH264_GRAB_FRAME_PARAMS.
|
|
* - Added 'bEnableAQ' field to NVFBC_H264_HW_ENC_CONFIG.
|
|
* - Added 'NVFBC_H264_PRESET_LOSSLESS_HP' enum to NVFBC_H264_PRESET.
|
|
* - Added 'NVFBC_BUFFER_FORMAT_YUV444P' enum to NVFBC_BUFFER_FORMAT.
|
|
* - Added 'eInputBufferFormat' field to NVFBC_H264_HW_ENC_CONFIG.
|
|
* - Added '0' and '244' values for NVFBC_H264_HW_ENC_CONFIG::dwProfile.
|
|
*
|
|
* NvFBC Linux API version 0.3
|
|
* - Improved multi-threaded support by implementing an API locking mechanism.
|
|
* - Added 'nvFBCBindContext' API entry point.
|
|
* - Added 'nvFBCReleaseContext' API entry point.
|
|
*
|
|
* NvFBC Linux API version 1.0
|
|
* - Added codec agnostic interface for HW encoding.
|
|
* - Deprecated H.264 interface.
|
|
* - Added support for H.265/HEVC HW encoding.
|
|
*
|
|
* NvFBC Linux API version 1.1
|
|
* - Added 'nvFBCToHwGetCaps' API entry point.
|
|
* - Added 'dwDiffMapScalingFactor' field to NVFBC_TOSYS_SETUP_PARAMS.
|
|
*
|
|
* NvFBC Linux API version 1.2
|
|
* - Deprecated ToHwEnc interface.
|
|
* - Added ToGL interface that captures frames to an OpenGL texture in video
|
|
* memory.
|
|
* - Added 'bDisableAutoModesetRecovery' field to
|
|
* NVFBC_CREATE_CAPTURE_SESSION_PARAMS.
|
|
* - Added 'bExternallyManagedContext' field to NVFBC_CREATE_HANDLE_PARAMS.
|
|
*
|
|
* NvFBC Linux API version 1.3
|
|
* - Added NVFBC_BUFFER_FORMAT_RGBA
|
|
* - Added 'dwTimeoutMs' field to NVFBC_TOSYS_GRAB_FRAME_PARAMS,
|
|
* NVFBC_TOCUDA_GRAB_FRAME_PARAMS, and NVFBC_TOGL_GRAB_FRAME_PARAMS.
|
|
*
|
|
* NvFBC Linux API version 1.4
|
|
* - Clarified that NVFBC_BUFFER_FORMAT_{ARGB,RGB,RGBA} are byte-order formats.
|
|
* - Renamed NVFBC_BUFFER_FORMAT_YUV420P to NVFBC_BUFFER_FORMAT_NV12.
|
|
* - Added new requirements.
|
|
* - Made NvFBC more resilient against the X server terminating during an active
|
|
* capture session. See new comments for ::NVFBC_ERR_X.
|
|
* - Relaxed requirement that 'frameSize' must have a width being a multiple of
|
|
* 4 and a height being a multiple of 2.
|
|
* - Added 'bRoundFrameSize' field to NVFBC_CREATE_CAPTURE_SESSION_PARAMS.
|
|
* - Relaxed requirement that the scaling factor for differential maps must be
|
|
* a multiple of the size of the frame.
|
|
* - Added 'diffMapSize' field to NVFBC_TOSYS_SETUP_PARAMS and
|
|
* NVFBC_TOGL_SETUP_PARAMS.
|
|
*
|
|
* NvFBC Linux API version 1.5
|
|
* - Added NVFBC_BUFFER_FORMAT_BGRA
|
|
*
|
|
* NvFBC Linux API version 1.6
|
|
* - Added the 'NVFBC_TOSYS_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY',
|
|
* 'NVFBC_TOCUDA_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY', and
|
|
* 'NVFBC_TOGL_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY' capture flags.
|
|
* - Exposed debug and performance logs through the NVFBC_LOG_LEVEL environment
|
|
* variable. Setting it to "1" enables performance logs, setting it to "2"
|
|
* enables debugging logs, setting it to "3" enables both.
|
|
* - Logs are printed to stdout or to the file pointed by the NVFBC_LOG_FILE
|
|
* environment variable.
|
|
* - Added 'ulTimestampUs' to NVFBC_FRAME_GRAB_INFO.
|
|
* - Added 'dwSamplingRateMs' to NVFBC_CREATE_CAPTURE_SESSION_PARAMS.
|
|
* - Added 'bPushModel' to NVFBC_CREATE_CAPTURE_SESSION_PARAMS.
|
|
*
|
|
* NvFBC Linux API version 1.7
|
|
* - Retired the NVFBC_CAPTURE_TO_HW_ENCODER interface.
|
|
* This interface has been deprecated since NvFBC 1.2 and has received no
|
|
* updates or new features since. We recommend using the NVIDIA Video Codec
|
|
* SDK to encode NvFBC frames.
|
|
* See: https://developer.nvidia.com/nvidia-video-codec-sdk
|
|
* - Added a 'Capture Modes' section to those headers.
|
|
* - Added a 'Post Processing' section to those headers.
|
|
* - Added an 'Environment Variables' section to those headers.
|
|
* - Added 'bInModeset' to NVFBC_GET_STATUS_PARAMS.
|
|
* - Added 'bAllowDirectCapture' to NVFBC_CREATE_CAPTURE_SESSION_PARAMS.
|
|
* - Added 'bDirectCaptured' to NVFBC_FRAME_GRAB_INFO.
|
|
* - Added 'bRequiredPostProcessing' to NVFBC_FRAME_GRAB_INFO.
|
|
*/
|
|
|
|
/*!
|
|
* \defgroup FBC_MODES Capture Modes
|
|
*
|
|
* When creating a capture session, NvFBC instantiates a capture subsystem
|
|
* living in the NVIDIA X driver.
|
|
*
|
|
* This subsystem listens for damage events coming from applications then
|
|
* generates (composites) frames for NvFBC when new content is available.
|
|
*
|
|
* This capture server can operate on a timer where it periodically checks if
|
|
* there are any pending damage events, or it can generate frames as soon as it
|
|
* receives a new damage event.
|
|
* See NVFBC_CREATE_CAPTURE_SESSION_PARAMS::dwSamplingRateMs,
|
|
* and NVFBC_CREATE_CAPTURE_SESSION_PARAMS::bPushModel.
|
|
*
|
|
* NvFBC can also attach itself to a fullscreen unoccluded application and have
|
|
* it copy its frames directly into a buffer owned by NvFBC upon present. This
|
|
* mode bypasses the X server.
|
|
* See NVFBC_CREATE_CAPTURE_SESSION_PARAMS::bAllowDirectCapture.
|
|
*
|
|
* NvFBC is designed to capture frames with as few copies as possible. The
|
|
* NVIDIA X driver composites frames directly into the NvFBC buffers, and
|
|
* direct capture copies frames directly into these buffers as well.
|
|
*
|
|
* Depending on the configuration of a capture session, an extra copy (rendering
|
|
* pass) may be needed. See the 'Post Processing' section.
|
|
*/
|
|
|
|
/*!
|
|
* \defgroup FBC_PP Post Processing
|
|
*
|
|
* Depending on the configuration of a capture session, NvFBC might require to
|
|
* do post processing on frames.
|
|
*
|
|
* Post processing is required for the following reasons:
|
|
* - NvFBC needs to do a pixel format conversion.
|
|
* - Diffmaps are requested.
|
|
* - Capture to system memory is requested.
|
|
*
|
|
* NvFBC needs to do a conversion if the requested pixel format does not match
|
|
* the native format. The native format is NVFBC_BUFFER_FORMAT_BGRA.
|
|
*
|
|
* Note: post processing is *not* required for frame scaling and frame cropping.
|
|
*
|
|
* Skipping post processing can reduce capture latency. An application can know
|
|
* whether post processing was required by checking
|
|
* NVFBC_FRAME_GRAB_INFO::bRequiredPostProcessing.
|
|
*/
|
|
|
|
/*!
|
|
* \defgroup FBC_ENVVAR Environment Variables
|
|
*
|
|
* Below are the environment variables supported by NvFBC:
|
|
*
|
|
* - NVFBC_LOG_LEVEL
|
|
* Bitfield where the first bit enables debug logs and the second bit enables
|
|
* performance logs. Both can be enabled by setting this envvar to 3.
|
|
*
|
|
* - NVFBC_LOG_FILE
|
|
* Write all NvFBC logs to the given file.
|
|
*
|
|
* - NVFBC_FORCE_ALLOW_DIRECT_CAPTURE
|
|
* Used to override NVFBC_CREATE_CAPTURE_SESSION_PARAMS::bAllowDirectCapture.
|
|
*
|
|
* - NVFBC_FORCE_POST_PROCESSING
|
|
* Used to force the post processing step, even if it could be skipped.
|
|
* See the 'Post Processing' section.
|
|
*/
|
|
|
|
/*!
|
|
* \defgroup FBC_STRUCT Structure Definition
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*!
|
|
* Calling convention.
|
|
*/
|
|
#define NVFBCAPI
|
|
|
|
/*!
|
|
* NvFBC API major version.
|
|
*/
|
|
#define NVFBC_VERSION_MAJOR 1
|
|
|
|
/*!
|
|
* NvFBC API minor version.
|
|
*/
|
|
#define NVFBC_VERSION_MINOR 7
|
|
|
|
/*!
|
|
* NvFBC API version.
|
|
*/
|
|
#define NVFBC_VERSION (uint32_t) (NVFBC_VERSION_MINOR | (NVFBC_VERSION_MAJOR << 8))
|
|
|
|
/*!
|
|
* Creates a version number for structure parameters.
|
|
*/
|
|
#define NVFBC_STRUCT_VERSION(typeName, ver) \
|
|
(uint32_t) (sizeof(typeName) | ((ver) << 16) | (NVFBC_VERSION << 24))
|
|
|
|
/*!
|
|
* Defines error codes.
|
|
*
|
|
* \see NvFBCGetLastErrorStr
|
|
*/
|
|
typedef enum _NVFBCSTATUS
|
|
{
|
|
/*!
|
|
* This indicates that the API call returned with no errors.
|
|
*/
|
|
NVFBC_SUCCESS = 0,
|
|
/*!
|
|
* This indicates that the API version between the client and the library
|
|
* is not compatible.
|
|
*/
|
|
NVFBC_ERR_API_VERSION = 1,
|
|
/*!
|
|
* An internal error occurred.
|
|
*/
|
|
NVFBC_ERR_INTERNAL = 2,
|
|
/*!
|
|
* This indicates that one or more of the parameter passed to the API call
|
|
* is invalid.
|
|
*/
|
|
NVFBC_ERR_INVALID_PARAM = 3,
|
|
/*!
|
|
* This indicates that one or more of the pointers passed to the API call
|
|
* is invalid.
|
|
*/
|
|
NVFBC_ERR_INVALID_PTR = 4,
|
|
/*!
|
|
* This indicates that the handle passed to the API call to identify the
|
|
* client is invalid.
|
|
*/
|
|
NVFBC_ERR_INVALID_HANDLE = 5,
|
|
/*!
|
|
* This indicates that the maximum number of threaded clients of the same
|
|
* process has been reached. The limit is 10 threads per process.
|
|
* There is no limit on the number of process.
|
|
*/
|
|
NVFBC_ERR_MAX_CLIENTS = 6,
|
|
/*!
|
|
* This indicates that the requested feature is not currently supported
|
|
* by the library.
|
|
*/
|
|
NVFBC_ERR_UNSUPPORTED = 7,
|
|
/*!
|
|
* This indicates that the API call failed because it was unable to allocate
|
|
* enough memory to perform the requested operation.
|
|
*/
|
|
NVFBC_ERR_OUT_OF_MEMORY = 8,
|
|
/*!
|
|
* This indicates that the API call was not expected. This happens when
|
|
* API calls are performed in a wrong order, such as trying to capture
|
|
* a frame prior to creating a new capture session; or trying to set up
|
|
* a capture to video memory although a capture session to system memory
|
|
* was created.
|
|
*/
|
|
NVFBC_ERR_BAD_REQUEST = 9,
|
|
/*!
|
|
* This indicates an X error, most likely meaning that the X server has
|
|
* been terminated. When this error is returned, the only resort is to
|
|
* create another FBC handle using NvFBCCreateHandle().
|
|
*
|
|
* The previous handle should still be freed with NvFBCDestroyHandle(), but
|
|
* it might leak resources, in particular X, GLX, and GL resources since
|
|
* it is no longer possible to communicate with an X server to free them
|
|
* through the driver.
|
|
*
|
|
* The best course of action to eliminate this potential leak is to close
|
|
* the OpenGL driver, close the forked process running the capture, or
|
|
* restart the application.
|
|
*/
|
|
NVFBC_ERR_X = 10,
|
|
/*!
|
|
* This indicates a GLX error.
|
|
*/
|
|
NVFBC_ERR_GLX = 11,
|
|
/*!
|
|
* This indicates an OpenGL error.
|
|
*/
|
|
NVFBC_ERR_GL = 12,
|
|
/*!
|
|
* This indicates a CUDA error.
|
|
*/
|
|
NVFBC_ERR_CUDA = 13,
|
|
/*!
|
|
* This indicates a HW encoder error.
|
|
*/
|
|
NVFBC_ERR_ENCODER = 14,
|
|
/*!
|
|
* This indicates an NvFBC context error.
|
|
*/
|
|
NVFBC_ERR_CONTEXT = 15,
|
|
/*!
|
|
* This indicates that the application must recreate the capture session.
|
|
*
|
|
* This error can be returned if a modeset event occurred while capturing
|
|
* frames, and NVFBC_CREATE_HANDLE_PARAMS::bDisableAutoModesetRecovery
|
|
* was set to NVFBC_TRUE.
|
|
*/
|
|
NVFBC_ERR_MUST_RECREATE = 16,
|
|
/*!
|
|
* This indicates a Vulkan error.
|
|
*/
|
|
NVFBC_ERR_VULKAN = 17,
|
|
} NVFBCSTATUS;
|
|
|
|
/*!
|
|
* Defines boolean values.
|
|
*/
|
|
typedef enum _NVFBC_BOOL
|
|
{
|
|
/*!
|
|
* False value.
|
|
*/
|
|
NVFBC_FALSE = 0,
|
|
/*!
|
|
* True value.
|
|
*/
|
|
NVFBC_TRUE,
|
|
} NVFBC_BOOL;
|
|
|
|
/*!
|
|
* Maximum size in bytes of an error string.
|
|
*/
|
|
#define NVFBC_ERR_STR_LEN 512
|
|
|
|
/*!
|
|
* Capture type.
|
|
*/
|
|
typedef enum _NVFBC_CAPTURE_TYPE
|
|
{
|
|
/*!
|
|
* Capture frames to a buffer in system memory.
|
|
*/
|
|
NVFBC_CAPTURE_TO_SYS = 0,
|
|
/*!
|
|
* Capture frames to a CUDA device in video memory.
|
|
*
|
|
* Specifying this will dlopen() libcuda.so.1 and fail if not available.
|
|
*/
|
|
NVFBC_CAPTURE_SHARED_CUDA,
|
|
/*!
|
|
* Retired. Do not use.
|
|
*/
|
|
/* NVFBC_CAPTURE_TO_HW_ENCODER, */
|
|
/*!
|
|
* Capture frames to an OpenGL buffer in video memory.
|
|
*/
|
|
NVFBC_CAPTURE_TO_GL = 3,
|
|
} NVFBC_CAPTURE_TYPE;
|
|
|
|
/*!
|
|
* Tracking type.
|
|
*
|
|
* NvFBC can track a specific region of the framebuffer to capture.
|
|
*
|
|
* An X screen corresponds to the entire framebuffer.
|
|
*
|
|
* An RandR CRTC is a component of the GPU that reads pixels from a region of
|
|
* the X screen and sends them through a pipeline to an RandR output.
|
|
* A physical monitor can be connected to an RandR output. Tracking an RandR
|
|
* output captures the region of the X screen that the RandR CRTC is sending to
|
|
* the RandR output.
|
|
*/
|
|
typedef enum
|
|
{
|
|
/*!
|
|
* By default, NvFBC tries to track a connected primary output. If none is
|
|
* found, then it tries to track the first connected output. If none is
|
|
* found then it tracks the entire X screen.
|
|
*
|
|
* If the XRandR extension is not available, this option has the same effect
|
|
* as ::NVFBC_TRACKING_SCREEN.
|
|
*
|
|
* This default behavior might be subject to changes in the future.
|
|
*/
|
|
NVFBC_TRACKING_DEFAULT = 0,
|
|
/*!
|
|
* Track an RandR output specified by its ID in the appropriate field.
|
|
*
|
|
* The list of connected outputs can be queried via NvFBCGetStatus().
|
|
* This list can also be obtained using e.g., xrandr(1).
|
|
*
|
|
* If the XRandR extension is not available, setting this option returns an
|
|
* error.
|
|
*/
|
|
NVFBC_TRACKING_OUTPUT,
|
|
/*!
|
|
* Track the entire X screen.
|
|
*/
|
|
NVFBC_TRACKING_SCREEN,
|
|
} NVFBC_TRACKING_TYPE;
|
|
|
|
/*!
|
|
* Buffer format.
|
|
*/
|
|
typedef enum _NVFBC_BUFFER_FORMAT
|
|
{
|
|
/*!
|
|
* Data will be converted to ARGB8888 byte-order format. 32 bpp.
|
|
*/
|
|
NVFBC_BUFFER_FORMAT_ARGB = 0,
|
|
/*!
|
|
* Data will be converted to RGB888 byte-order format. 24 bpp.
|
|
*/
|
|
NVFBC_BUFFER_FORMAT_RGB,
|
|
/*!
|
|
* Data will be converted to NV12 format using HDTV weights
|
|
* according to ITU-R BT.709. 12 bpp.
|
|
*/
|
|
NVFBC_BUFFER_FORMAT_NV12,
|
|
/*!
|
|
* Data will be converted to YUV 444 planar format using HDTV weights
|
|
* according to ITU-R BT.709. 24 bpp
|
|
*/
|
|
NVFBC_BUFFER_FORMAT_YUV444P,
|
|
/*!
|
|
* Data will be converted to RGBA8888 byte-order format. 32 bpp.
|
|
*/
|
|
NVFBC_BUFFER_FORMAT_RGBA,
|
|
/*!
|
|
* Native format. No pixel conversion needed.
|
|
* BGRA8888 byte-order format. 32 bpp.
|
|
*/
|
|
NVFBC_BUFFER_FORMAT_BGRA,
|
|
} NVFBC_BUFFER_FORMAT;
|
|
|
|
#define NVFBC_BUFFER_FORMAT_YUV420P NVFBC_BUFFER_FORMAT_NV12
|
|
|
|
/*!
|
|
* Handle used to identify an NvFBC session.
|
|
*/
|
|
typedef uint64_t NVFBC_SESSION_HANDLE;
|
|
|
|
/*!
|
|
* Box used to describe an area of the tracked region to capture.
|
|
*
|
|
* The coordinates are relative to the tracked region.
|
|
*
|
|
* E.g., if the size of the X screen is 3520x1200 and the tracked RandR output
|
|
* scans a region of 1600x1200+1920+0, then setting a capture box of
|
|
* 800x600+100+50 effectively captures a region of 800x600+2020+50 relative to
|
|
* the X screen.
|
|
*/
|
|
typedef struct _NVFBC_BOX
|
|
{
|
|
/*!
|
|
* [in] X offset of the box.
|
|
*/
|
|
uint32_t x;
|
|
/*!
|
|
* [in] Y offset of the box.
|
|
*/
|
|
uint32_t y;
|
|
/*!
|
|
* [in] Width of the box.
|
|
*/
|
|
uint32_t w;
|
|
/*!
|
|
* [in] Height of the box.
|
|
*/
|
|
uint32_t h;
|
|
} NVFBC_BOX;
|
|
|
|
/*!
|
|
* Size used to describe the size of a frame.
|
|
*/
|
|
typedef struct _NVFBC_SIZE
|
|
{
|
|
/*!
|
|
* [in] Width.
|
|
*/
|
|
uint32_t w;
|
|
/*!
|
|
* [in] Height.
|
|
*/
|
|
uint32_t h;
|
|
} NVFBC_SIZE;
|
|
|
|
/*!
|
|
* Describes information about a captured frame.
|
|
*/
|
|
typedef struct _NVFBC_FRAME_GRAB_INFO
|
|
{
|
|
/*!
|
|
* [out] Width of the captured frame.
|
|
*/
|
|
uint32_t dwWidth;
|
|
/*!
|
|
* [out] Height of the captured frame.
|
|
*/
|
|
uint32_t dwHeight;
|
|
/*!
|
|
* [out] Size of the frame in bytes.
|
|
*/
|
|
uint32_t dwByteSize;
|
|
/*!
|
|
* [out] Incremental ID of the current frame.
|
|
*
|
|
* This can be used to identify a frame.
|
|
*/
|
|
uint32_t dwCurrentFrame;
|
|
/*!
|
|
* [out] Whether the captured frame is a new frame.
|
|
*
|
|
* When using non blocking calls it is possible to capture a frame
|
|
* that was already captured before if the display server did not
|
|
* render a new frame in the meantime. In that case, this flag
|
|
* will be set to NVFBC_FALSE.
|
|
*
|
|
* When using blocking calls each captured frame will have
|
|
* this flag set to NVFBC_TRUE since the blocking mechanism waits for
|
|
* the display server to render a new frame.
|
|
*
|
|
* Note that this flag does not guarantee that the content of
|
|
* the frame will be different compared to the previous captured frame.
|
|
*
|
|
* In particular, some compositing managers report the entire
|
|
* framebuffer as damaged when an application refreshes its content.
|
|
*
|
|
* Consider a single X screen spanned across physical displays A and B
|
|
* and an NvFBC application tracking display A. Depending on the
|
|
* compositing manager, it is possible that an application refreshing
|
|
* itself on display B will trigger a frame capture on display A.
|
|
*
|
|
* Workarounds include:
|
|
* - Using separate X screens
|
|
* - Disabling the composite extension
|
|
* - Using a compositing manager that properly reports what regions
|
|
* are damaged
|
|
* - Using NvFBC's diffmaps to find out if the frame changed
|
|
*/
|
|
NVFBC_BOOL bIsNewFrame;
|
|
/*!
|
|
* [out] Frame timestamp
|
|
*
|
|
* Time in micro seconds when the display server started rendering the
|
|
* frame.
|
|
*
|
|
* This does not account for when the frame was captured. If capturing an
|
|
* old frame (e.g., bIsNewFrame is NVFBC_FALSE) the reported timestamp
|
|
* will reflect the time when the old frame was rendered by the display
|
|
* server.
|
|
*/
|
|
uint64_t ulTimestampUs;
|
|
/*
|
|
* [out] Number of frames generated since the last capture.
|
|
*
|
|
* This can help applications tell whether they missed frames or there
|
|
* were no frames generated by the server since the last capture.
|
|
*/
|
|
uint32_t dwMissedFrames;
|
|
/*
|
|
* [out] Whether the captured frame required post processing.
|
|
*
|
|
* See the 'Post Processing' section.
|
|
*/
|
|
NVFBC_BOOL bRequiredPostProcessing;
|
|
/*
|
|
* [out] Whether this frame was obtained via direct capture.
|
|
*
|
|
* See NVFBC_CREATE_CAPTURE_SESSION_PARAMS::bAllowDirectCapture.
|
|
*/
|
|
NVFBC_BOOL bDirectCapture;
|
|
} NVFBC_FRAME_GRAB_INFO;
|
|
|
|
/*!
|
|
* Defines parameters for the CreateHandle() API call.
|
|
*/
|
|
typedef struct _NVFBC_CREATE_HANDLE_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_CREATE_HANDLE_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
/*!
|
|
* [in] Application specific private information passed to the NvFBC
|
|
* session.
|
|
*/
|
|
const void *privateData;
|
|
/*!
|
|
* [in] Size of the application specific private information passed to the
|
|
* NvFBC session.
|
|
*/
|
|
uint32_t privateDataSize;
|
|
/*!
|
|
* [in] Whether NvFBC should not create and manage its own graphics context
|
|
*
|
|
* NvFBC internally uses OpenGL to perfom graphics operations on the
|
|
* captured frames. By default, NvFBC will create and manage (e.g., make
|
|
* current, detect new threads, etc.) its own OpenGL context.
|
|
*
|
|
* If set to NVFBC_TRUE, NvFBC will use the application's context. It will
|
|
* be the application's responsibility to make sure that a context is
|
|
* current on the thread calling into the NvFBC API.
|
|
*/
|
|
NVFBC_BOOL bExternallyManagedContext;
|
|
/*!
|
|
* [in] GLX context
|
|
*
|
|
* GLX context that NvFBC should use internally to create pixmaps and
|
|
* make them current when creating a new capture session.
|
|
*
|
|
* Note: NvFBC expects a context created against a GLX_RGBA_TYPE render
|
|
* type.
|
|
*/
|
|
void *glxCtx;
|
|
/*!
|
|
* [in] GLX framebuffer configuration
|
|
*
|
|
* Framebuffer configuration that was used to create the GLX context, and
|
|
* that will be used to create pixmaps internally.
|
|
*
|
|
* Note: NvFBC expects a configuration having at least the following
|
|
* attributes:
|
|
* GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT
|
|
* GLX_BIND_TO_TEXTURE_RGBA_EXT, 1
|
|
* GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT
|
|
*/
|
|
void *glxFBConfig;
|
|
} NVFBC_CREATE_HANDLE_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_CREATE_HANDLE_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_CREATE_HANDLE_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_CREATE_HANDLE_PARAMS, 2)
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCDestroyHandle() API call.
|
|
*/
|
|
typedef struct _NVFBC_DESTROY_HANDLE_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_DESTROY_HANDLE_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
} NVFBC_DESTROY_HANDLE_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_DESTROY_HANDLE_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_DESTROY_HANDLE_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_DESTROY_HANDLE_PARAMS, 1)
|
|
|
|
/*!
|
|
* Maximum number of connected RandR outputs to an X screen.
|
|
*/
|
|
#define NVFBC_OUTPUT_MAX 5
|
|
|
|
/*!
|
|
* Maximum size in bytes of an RandR output name.
|
|
*/
|
|
#define NVFBC_OUTPUT_NAME_LEN 128
|
|
|
|
/*!
|
|
* Describes an RandR output.
|
|
*
|
|
* Filling this structure relies on the XRandR extension. This feature cannot
|
|
* be used if the extension is missing or its version is below the requirements.
|
|
*
|
|
* \see Requirements
|
|
*/
|
|
typedef struct _NVFBC_OUTPUT
|
|
{
|
|
/*!
|
|
* Identifier of the RandR output.
|
|
*/
|
|
uint32_t dwId;
|
|
/*!
|
|
* Name of the RandR output, as reported by tools such as xrandr(1).
|
|
*
|
|
* Example: "DVI-I-0"
|
|
*/
|
|
char name[NVFBC_OUTPUT_NAME_LEN];
|
|
/*!
|
|
* Region of the X screen tracked by the RandR CRTC driving this RandR
|
|
* output.
|
|
*/
|
|
NVFBC_BOX trackedBox;
|
|
} NVFBC_RANDR_OUTPUT_INFO;
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCGetStatus() API call.
|
|
*/
|
|
typedef struct _NVFBC_GET_STATUS_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_GET_STATUS_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
/*!
|
|
* [out] Whether or not framebuffer capture is supported by the graphics
|
|
* driver.
|
|
*/
|
|
NVFBC_BOOL bIsCapturePossible;
|
|
/*!
|
|
* [out] Whether or not there is already a capture session on this system.
|
|
*/
|
|
NVFBC_BOOL bCurrentlyCapturing;
|
|
/*!
|
|
* [out] Whether or not it is possible to create a capture session on this
|
|
* system.
|
|
*/
|
|
NVFBC_BOOL bCanCreateNow;
|
|
/*!
|
|
* [out] Size of the X screen (framebuffer).
|
|
*/
|
|
NVFBC_SIZE screenSize;
|
|
/*!
|
|
* [out] Whether the XRandR extension is available.
|
|
*
|
|
* If this extension is not available then it is not possible to have
|
|
* information about RandR outputs.
|
|
*/
|
|
NVFBC_BOOL bXRandRAvailable;
|
|
/*!
|
|
* [out] Array of outputs connected to the X screen.
|
|
*
|
|
* An application can track a specific output by specifying its ID when
|
|
* creating a capture session.
|
|
*
|
|
* Only if XRandR is available.
|
|
*/
|
|
NVFBC_RANDR_OUTPUT_INFO outputs[NVFBC_OUTPUT_MAX];
|
|
/*!
|
|
* [out] Number of outputs connected to the X screen.
|
|
*
|
|
* This must be used to parse the array of connected outputs.
|
|
*
|
|
* Only if XRandR is available.
|
|
*/
|
|
uint32_t dwOutputNum;
|
|
/*!
|
|
* [out] Version of the NvFBC library running on this system.
|
|
*/
|
|
uint32_t dwNvFBCVersion;
|
|
/*!
|
|
* [out] Whether the X server is currently in modeset.
|
|
*
|
|
* When the X server is in modeset, it must give up all its video
|
|
* memory allocations. It is not possible to create a capture
|
|
* session until the modeset is over.
|
|
*
|
|
* Note that VT-switches are considered modesets.
|
|
*/
|
|
NVFBC_BOOL bInModeset;
|
|
} NVFBC_GET_STATUS_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_GET_STATUS_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_GET_STATUS_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_GET_STATUS_PARAMS, 2)
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCCreateCaptureSession() API call.
|
|
*/
|
|
typedef struct _NVFBC_CREATE_CAPTURE_SESSION_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_CREATE_CAPTURE_SESSION_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
/*!
|
|
* [in] Desired capture type.
|
|
*
|
|
* Note that when specyfing ::NVFBC_CAPTURE_SHARED_CUDA NvFBC will try to
|
|
* dlopen() the corresponding libraries. This means that NvFBC can run on
|
|
* a system without the CUDA library since it does not link against them.
|
|
*/
|
|
NVFBC_CAPTURE_TYPE eCaptureType;
|
|
/*!
|
|
* [in] What region of the framebuffer should be tracked.
|
|
*/
|
|
NVFBC_TRACKING_TYPE eTrackingType;
|
|
/*!
|
|
* [in] ID of the output to track if eTrackingType is set to
|
|
* ::NVFBC_TRACKING_OUTPUT.
|
|
*/
|
|
uint32_t dwOutputId;
|
|
/*!
|
|
* [in] Crop the tracked region.
|
|
*
|
|
* The coordinates are relative to the tracked region.
|
|
*
|
|
* It can be set to 0 to capture the entire tracked region.
|
|
*/
|
|
NVFBC_BOX captureBox;
|
|
/*!
|
|
* [in] Desired size of the captured frame.
|
|
*
|
|
* This parameter allow to scale the captured frame.
|
|
*
|
|
* It can be set to 0 to disable frame resizing.
|
|
*/
|
|
NVFBC_SIZE frameSize;
|
|
/*!
|
|
* [in] Whether the mouse cursor should be composited to the frame.
|
|
*
|
|
* Disabling the cursor will not generate new frames when only the cursor
|
|
* is moved.
|
|
*/
|
|
NVFBC_BOOL bWithCursor;
|
|
/*!
|
|
* [in] Whether NvFBC should not attempt to recover from modesets.
|
|
*
|
|
* NvFBC is able to detect when a modeset event occured and can automatically
|
|
* re-create a capture session with the same settings as before, then resume
|
|
* its frame capture session transparently.
|
|
*
|
|
* This option allows to disable this behavior. NVFBC_ERR_MUST_RECREATE
|
|
* will be returned in that case.
|
|
*
|
|
* It can be useful in the cases when an application needs to do some work
|
|
* between setting up a capture and grabbing the first frame.
|
|
*
|
|
* For example: an application using the ToGL interface needs to register
|
|
* resources with EncodeAPI prior to encoding frames.
|
|
*
|
|
* Note that during modeset recovery, NvFBC will try to re-create the
|
|
* capture session every second until it succeeds.
|
|
*/
|
|
NVFBC_BOOL bDisableAutoModesetRecovery;
|
|
/*!
|
|
* [in] Whether NvFBC should round the requested frameSize.
|
|
*
|
|
* When disabled, NvFBC will not attempt to round the requested resolution.
|
|
*
|
|
* However, some pixel formats have resolution requirements. E.g., YUV/NV
|
|
* formats must have a width being a multiple of 4, and a height being a
|
|
* multiple of 2. RGB formats don't have such requirements.
|
|
*
|
|
* If the resolution doesn't meet the requirements of the format, then NvFBC
|
|
* will fail at setup time.
|
|
*
|
|
* When enabled, NvFBC will round the requested width to the next multiple
|
|
* of 4 and the requested height to the next multiple of 2.
|
|
*
|
|
* In this case, requesting any resolution will always work with every
|
|
* format. However, an NvFBC client must be prepared to handle the case
|
|
* where the requested resolution is different than the captured resolution.
|
|
*
|
|
* NVFBC_FRAME_GRAB_INFO::dwWidth and NVFBC_FRAME_GRAB_INFO::dwHeight should
|
|
* always be used for getting information about captured frames.
|
|
*/
|
|
NVFBC_BOOL bRoundFrameSize;
|
|
/*!
|
|
* [in] Rate in ms at which the display server generates new frames
|
|
*
|
|
* This controls the frequency at which the display server will generate
|
|
* new frames if new content is available. This effectively controls the
|
|
* capture rate when using blocking calls.
|
|
*
|
|
* Note that lower values will increase the CPU and GPU loads.
|
|
*
|
|
* The default value is 16ms (~ 60 Hz).
|
|
*/
|
|
uint32_t dwSamplingRateMs;
|
|
/*!
|
|
* [in] Enable push model for frame capture
|
|
*
|
|
* When set to NVFBC_TRUE, the display server will generate frames whenever
|
|
* it receives a damage event from applications.
|
|
*
|
|
* Setting this to NVFBC_TRUE will ignore ::dwSamplingRateMs.
|
|
*
|
|
* Using push model with the NVFBC_*_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY
|
|
* capture flag should guarantee the shortest amount of time between an
|
|
* application rendering a frame and an NvFBC client capturing it, provided
|
|
* that the NvFBC client is able to process the frames quickly enough.
|
|
*
|
|
* Note that applications running at high frame rates will increase CPU and
|
|
* GPU loads.
|
|
*/
|
|
NVFBC_BOOL bPushModel;
|
|
/*!
|
|
* [in] Allow direct capture
|
|
*
|
|
* Direct capture allows NvFBC to attach itself to a fullscreen graphics
|
|
* application. Whenever that application presents a frame, it makes a copy
|
|
* of it directly into a buffer owned by NvFBC thus bypassing the X server.
|
|
*
|
|
* When direct capture is *not* enabled, the NVIDIA X driver generates a
|
|
* frame for NvFBC when it receives a damage event from an application if push
|
|
* model is enabled, or periodically checks if there are any pending damage
|
|
* events otherwise (see NVFBC_CREATE_CAPTURE_SESSION_PARAMS::dwSamplingRateMs).
|
|
*
|
|
* Direct capture is possible under the following conditions:
|
|
* - Direct capture is allowed
|
|
* - Push model is enabled (see NVFBC_CREATE_CAPTURE_SESSION_PARAMS::bPushModel)
|
|
* - The mouse cursor is not composited (see NVFBC_CREATE_CAPTURE_SESSION_PARAMS::bWithCursor)
|
|
* - No viewport transformation is required. This happens when the remote
|
|
* desktop is e.g. rotated.
|
|
*
|
|
* When direct capture is possible, NvFBC will automatically attach itself
|
|
* to a fullscreen unoccluded application, if such exists.
|
|
*
|
|
* Notes:
|
|
* - This includes compositing desktops such as GNOME (e.g., gnome-shell
|
|
* is the fullscreen unoccluded application).
|
|
* - There can be only one fullscreen unoccluded application at a time.
|
|
* - The NVIDIA X driver monitors which application qualifies or no
|
|
* longer qualifies.
|
|
*
|
|
* For example, if a fullscreen application is launched in GNOME, NvFBC will
|
|
* detach from gnome-shell and attach to that application.
|
|
*
|
|
* Attaching and detaching happens automatically from the perspective of an
|
|
* NvFBC client. When detaching from an application, the X driver will
|
|
* transparently resume generating frames for NvFBC.
|
|
*
|
|
* An application can know whether a given frame was obtained through
|
|
* direct capture by checking NVFBC_FRAME_GRAB_INFO::bDirectCapture.
|
|
*/
|
|
NVFBC_BOOL bAllowDirectCapture;
|
|
} NVFBC_CREATE_CAPTURE_SESSION_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_CREATE_CAPTURE_SESSION_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_CREATE_CAPTURE_SESSION_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_CREATE_CAPTURE_SESSION_PARAMS, 6)
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCDestroyCaptureSession() API call.
|
|
*/
|
|
typedef struct _NVFBC_DESTROY_CAPTURE_SESSION_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_DESTROY_CAPTURE_SESSION_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
} NVFBC_DESTROY_CAPTURE_SESSION_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_DESTROY_CAPTURE_SESSION_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_DESTROY_CAPTURE_SESSION_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_DESTROY_CAPTURE_SESSION_PARAMS, 1)
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCBindContext() API call.
|
|
*/
|
|
typedef struct _NVFBC_BIND_CONTEXT_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_BIND_CONTEXT_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
} NVFBC_BIND_CONTEXT_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_BIND_CONTEXT_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_BIND_CONTEXT_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_BIND_CONTEXT_PARAMS, 1)
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCReleaseContext() API call.
|
|
*/
|
|
typedef struct _NVFBC_RELEASE_CONTEXT_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_RELEASE_CONTEXT_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
} NVFBC_RELEASE_CONTEXT_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_RELEASE_CONTEXT_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_RELEASE_CONTEXT_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_RELEASE_CONTEXT_PARAMS, 1)
|
|
|
|
/*!
|
|
* Defines flags that can be used when capturing to system memory.
|
|
*/
|
|
typedef enum
|
|
{
|
|
/*!
|
|
* Default, capturing waits for a new frame or mouse move.
|
|
*
|
|
* The default behavior of blocking grabs is to wait for a new frame until
|
|
* after the call was made. But it's possible that there is a frame already
|
|
* ready that the client hasn't seen.
|
|
* \see NVFBC_TOSYS_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY
|
|
*/
|
|
NVFBC_TOSYS_GRAB_FLAGS_NOFLAGS = 0,
|
|
/*!
|
|
* Capturing does not wait for a new frame nor a mouse move.
|
|
*
|
|
* It is therefore possible to capture the same frame multiple times.
|
|
* When this occurs, the dwCurrentFrame parameter of the
|
|
* NVFBC_FRAME_GRAB_INFO structure is not incremented.
|
|
*/
|
|
NVFBC_TOSYS_GRAB_FLAGS_NOWAIT = (1 << 0),
|
|
/*!
|
|
* Forces the destination buffer to be refreshed even if the frame has not
|
|
* changed since previous capture.
|
|
*
|
|
* By default, if the captured frame is identical to the previous one, NvFBC
|
|
* will omit one copy and not update the destination buffer.
|
|
*
|
|
* Setting that flag will prevent this behavior. This can be useful e.g.,
|
|
* if the application has modified the buffer in the meantime.
|
|
*/
|
|
NVFBC_TOSYS_GRAB_FLAGS_FORCE_REFRESH = (1 << 1),
|
|
/*!
|
|
* Similar to NVFBC_TOSYS_GRAB_FLAGS_NOFLAGS, except that the capture will
|
|
* not wait if there is already a frame available that the client has
|
|
* never seen yet.
|
|
*/
|
|
NVFBC_TOSYS_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY = (1 << 2),
|
|
} NVFBC_TOSYS_GRAB_FLAGS;
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCToSysSetUp() API call.
|
|
*/
|
|
typedef struct _NVFBC_TOSYS_SETUP_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_TOSYS_SETUP_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
/*!
|
|
* [in] Desired buffer format.
|
|
*/
|
|
NVFBC_BUFFER_FORMAT eBufferFormat;
|
|
/*!
|
|
* [out] Pointer to a pointer to a buffer in system memory.
|
|
*
|
|
* This buffer contains the pixel value of the requested format. Refer to
|
|
* the description of the buffer formats to understand the memory layout.
|
|
*
|
|
* The application does not need to allocate memory for this buffer. It
|
|
* should not free this buffer either. This buffer is automatically
|
|
* re-allocated when needed (e.g., when the resolution changes).
|
|
*
|
|
* This buffer is allocated by the NvFBC library to the proper size. This
|
|
* size is returned in the dwByteSize field of the
|
|
* ::NVFBC_FRAME_GRAB_INFO structure.
|
|
*/
|
|
void **ppBuffer;
|
|
/*!
|
|
* [in] Whether differential maps should be generated.
|
|
*/
|
|
NVFBC_BOOL bWithDiffMap;
|
|
/*!
|
|
* [out] Pointer to a pointer to a buffer in system memory.
|
|
*
|
|
* This buffer contains the differential map of two frames. It must be read
|
|
* as an array of unsigned char. Each unsigned char is either 0 or
|
|
* non-zero. 0 means that the pixel value at the given location has not
|
|
* changed since the previous captured frame. Non-zero means that the pixel
|
|
* value has changed.
|
|
*
|
|
* The application does not need to allocate memory for this buffer. It
|
|
* should not free this buffer either. This buffer is automatically
|
|
* re-allocated when needed (e.g., when the resolution changes).
|
|
*
|
|
* This buffer is allocated by the NvFBC library to the proper size. The
|
|
* size of the differential map is returned in ::diffMapSize.
|
|
*
|
|
* This option is not compatible with the ::NVFBC_BUFFER_FORMAT_YUV420P and
|
|
* ::NVFBC_BUFFER_FORMAT_YUV444P buffer formats.
|
|
*/
|
|
void **ppDiffMap;
|
|
/*!
|
|
* [in] Scaling factor of the differential maps.
|
|
*
|
|
* For example, a scaling factor of 16 means that one pixel of the diffmap
|
|
* will represent 16x16 pixels of the original frames.
|
|
*
|
|
* If any of these 16x16 pixels is different between the current and the
|
|
* previous frame, then the corresponding pixel in the diffmap will be set
|
|
* to non-zero.
|
|
*
|
|
* The default scaling factor is 1. A dwDiffMapScalingFactor of 0 will be
|
|
* set to 1.
|
|
*/
|
|
uint32_t dwDiffMapScalingFactor;
|
|
/*!
|
|
* [out] Size of the differential map.
|
|
*
|
|
* Only set if bWithDiffMap is set to NVFBC_TRUE.
|
|
*/
|
|
NVFBC_SIZE diffMapSize;
|
|
} NVFBC_TOSYS_SETUP_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_TOSYS_SETUP_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_TOSYS_SETUP_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_TOSYS_SETUP_PARAMS, 3)
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCToSysGrabFrame() API call.
|
|
*/
|
|
typedef struct _NVFBC_TOSYS_GRAB_FRAME_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_TOSYS_GRAB_FRAME_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
/*!
|
|
* [in] Flags defining the behavior of this frame capture.
|
|
*/
|
|
uint32_t dwFlags;
|
|
/*!
|
|
* [out] Information about the captured frame.
|
|
*
|
|
* Can be NULL.
|
|
*/
|
|
NVFBC_FRAME_GRAB_INFO *pFrameGrabInfo;
|
|
/*!
|
|
* [in] Wait timeout in milliseconds.
|
|
*
|
|
* When capturing frames with the NVFBC_TOSYS_GRAB_FLAGS_NOFLAGS or
|
|
* NVFBC_TOSYS_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY flags,
|
|
* NvFBC will wait for a new frame or mouse move until the below timer
|
|
* expires.
|
|
*
|
|
* When timing out, the last captured frame will be returned. Note that as
|
|
* long as the NVFBC_TOSYS_GRAB_FLAGS_FORCE_REFRESH flag is not set,
|
|
* returning an old frame will incur no performance penalty.
|
|
*
|
|
* NvFBC clients can use the return value of the grab frame operation to
|
|
* find out whether a new frame was captured, or the timer expired.
|
|
*
|
|
* Note that the behavior of blocking calls is to wait for a new frame
|
|
* *after* the call has been made. When using timeouts, it is possible
|
|
* that NvFBC will return a new frame (e.g., it has never been captured
|
|
* before) even though no new frame was generated after the grab call.
|
|
*
|
|
* For the precise definition of what constitutes a new frame, see
|
|
* ::bIsNewFrame.
|
|
*
|
|
* Set to 0 to disable timeouts.
|
|
*/
|
|
uint32_t dwTimeoutMs;
|
|
} NVFBC_TOSYS_GRAB_FRAME_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_TOSYS_GRAB_FRAME_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_TOSYS_GRAB_FRAME_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_TOSYS_GRAB_FRAME_PARAMS, 2)
|
|
|
|
/*!
|
|
* Defines flags that can be used when capturing to a CUDA buffer in video memory.
|
|
*/
|
|
typedef enum
|
|
{
|
|
/*!
|
|
* Default, capturing waits for a new frame or mouse move.
|
|
*
|
|
* The default behavior of blocking grabs is to wait for a new frame until
|
|
* after the call was made. But it's possible that there is a frame already
|
|
* ready that the client hasn't seen.
|
|
* \see NVFBC_TOCUDA_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY
|
|
*/
|
|
NVFBC_TOCUDA_GRAB_FLAGS_NOFLAGS = 0,
|
|
/*!
|
|
* Capturing does not wait for a new frame nor a mouse move.
|
|
*
|
|
* It is therefore possible to capture the same frame multiple times.
|
|
* When this occurs, the dwCurrentFrame parameter of the
|
|
* NVFBC_FRAME_GRAB_INFO structure is not incremented.
|
|
*/
|
|
NVFBC_TOCUDA_GRAB_FLAGS_NOWAIT = (1 << 0),
|
|
/*!
|
|
* [in] Forces the destination buffer to be refreshed even if the frame
|
|
* has not changed since previous capture.
|
|
*
|
|
* By default, if the captured frame is identical to the previous one, NvFBC
|
|
* will omit one copy and not update the destination buffer.
|
|
*
|
|
* Setting that flag will prevent this behavior. This can be useful e.g.,
|
|
* if the application has modified the buffer in the meantime.
|
|
*/
|
|
NVFBC_TOCUDA_GRAB_FLAGS_FORCE_REFRESH = (1 << 1),
|
|
/*!
|
|
* Similar to NVFBC_TOCUDA_GRAB_FLAGS_NOFLAGS, except that the capture will
|
|
* not wait if there is already a frame available that the client has
|
|
* never seen yet.
|
|
*/
|
|
NVFBC_TOCUDA_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY = (1 << 2),
|
|
} NVFBC_TOCUDA_FLAGS;
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCToCudaSetUp() API call.
|
|
*/
|
|
typedef struct _NVFBC_TOCUDA_SETUP_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_TOCUDA_SETUP_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
/*!
|
|
* [in] Desired buffer format.
|
|
*/
|
|
NVFBC_BUFFER_FORMAT eBufferFormat;
|
|
} NVFBC_TOCUDA_SETUP_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_TOCUDA_SETUP_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_TOCUDA_SETUP_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_TOCUDA_SETUP_PARAMS, 1)
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCToCudaGrabFrame() API call.
|
|
*/
|
|
typedef struct _NVFBC_TOCUDA_GRAB_FRAME_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_TOCUDA_GRAB_FRAME_PARAMS_VER.
|
|
*/
|
|
uint32_t dwVersion;
|
|
/*!
|
|
* [in] Flags defining the behavior of this frame capture.
|
|
*/
|
|
uint32_t dwFlags;
|
|
/*!
|
|
* [out] Pointer to a ::CUdeviceptr
|
|
*
|
|
* The application does not need to allocate memory for this CUDA device.
|
|
*
|
|
* The application does need to create its own CUDA context to use this
|
|
* CUDA device.
|
|
*
|
|
* This ::CUdeviceptr will be mapped to a segment in video memory containing
|
|
* the frame. It is not possible to process a CUDA device while capturing
|
|
* a new frame. If the application wants to do so, it must copy the CUDA
|
|
* device using ::cuMemcpyDtoD or ::cuMemcpyDtoH beforehand.
|
|
*/
|
|
void *pCUDADeviceBuffer;
|
|
/*!
|
|
* [out] Information about the captured frame.
|
|
*
|
|
* Can be NULL.
|
|
*/
|
|
NVFBC_FRAME_GRAB_INFO *pFrameGrabInfo;
|
|
/*!
|
|
* [in] Wait timeout in milliseconds.
|
|
*
|
|
* When capturing frames with the NVFBC_TOCUDA_GRAB_FLAGS_NOFLAGS or
|
|
* NVFBC_TOCUDA_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY flags,
|
|
* NvFBC will wait for a new frame or mouse move until the below timer
|
|
* expires.
|
|
*
|
|
* When timing out, the last captured frame will be returned. Note that as
|
|
* long as the NVFBC_TOCUDA_GRAB_FLAGS_FORCE_REFRESH flag is not set,
|
|
* returning an old frame will incur no performance penalty.
|
|
*
|
|
* NvFBC clients can use the return value of the grab frame operation to
|
|
* find out whether a new frame was captured, or the timer expired.
|
|
*
|
|
* Note that the behavior of blocking calls is to wait for a new frame
|
|
* *after* the call has been made. When using timeouts, it is possible
|
|
* that NvFBC will return a new frame (e.g., it has never been captured
|
|
* before) even though no new frame was generated after the grab call.
|
|
*
|
|
* For the precise definition of what constitutes a new frame, see
|
|
* ::bIsNewFrame.
|
|
*
|
|
* Set to 0 to disable timeouts.
|
|
*/
|
|
uint32_t dwTimeoutMs;
|
|
} NVFBC_TOCUDA_GRAB_FRAME_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_TOCUDA_GRAB_FRAME_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_TOCUDA_GRAB_FRAME_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_TOCUDA_GRAB_FRAME_PARAMS, 2)
|
|
|
|
/*!
|
|
* Defines flags that can be used when capturing to an OpenGL buffer in video memory.
|
|
*/
|
|
typedef enum
|
|
{
|
|
/*!
|
|
* Default, capturing waits for a new frame or mouse move.
|
|
*
|
|
* The default behavior of blocking grabs is to wait for a new frame until
|
|
* after the call was made. But it's possible that there is a frame already
|
|
* ready that the client hasn't seen.
|
|
* \see NVFBC_TOGL_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY
|
|
*/
|
|
NVFBC_TOGL_GRAB_FLAGS_NOFLAGS = 0,
|
|
/*!
|
|
* Capturing does not wait for a new frame nor a mouse move.
|
|
*
|
|
* It is therefore possible to capture the same frame multiple times.
|
|
* When this occurs, the dwCurrentFrame parameter of the
|
|
* NVFBC_FRAME_GRAB_INFO structure is not incremented.
|
|
*/
|
|
NVFBC_TOGL_GRAB_FLAGS_NOWAIT = (1 << 0),
|
|
/*!
|
|
* [in] Forces the destination buffer to be refreshed even if the frame
|
|
* has not changed since previous capture.
|
|
*
|
|
* By default, if the captured frame is identical to the previous one, NvFBC
|
|
* will omit one copy and not update the destination buffer.
|
|
*
|
|
* Setting that flag will prevent this behavior. This can be useful e.g.,
|
|
* if the application has modified the buffer in the meantime.
|
|
*/
|
|
NVFBC_TOGL_GRAB_FLAGS_FORCE_REFRESH = (1 << 1),
|
|
/*!
|
|
* Similar to NVFBC_TOGL_GRAB_FLAGS_NOFLAGS, except that the capture will
|
|
* not wait if there is already a frame available that the client has
|
|
* never seen yet.
|
|
*/
|
|
NVFBC_TOGL_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY = (1 << 2),
|
|
} NVFBC_TOGL_FLAGS;
|
|
|
|
/*!
|
|
* Maximum number of GL textures that can be used to store frames.
|
|
*/
|
|
#define NVFBC_TOGL_TEXTURES_MAX 2
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCToGLSetUp() API call.
|
|
*/
|
|
typedef struct _NVFBC_TOGL_SETUP_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_TOGL_SETUP_PARAMS_VER
|
|
*/
|
|
uint32_t dwVersion;
|
|
/*!
|
|
* [in] Desired buffer format.
|
|
*/
|
|
NVFBC_BUFFER_FORMAT eBufferFormat;
|
|
/*!
|
|
* [in] Whether differential maps should be generated.
|
|
*/
|
|
NVFBC_BOOL bWithDiffMap;
|
|
/*!
|
|
* [out] Pointer to a pointer to a buffer in system memory.
|
|
*
|
|
* \see NVFBC_TOSYS_SETUP_PARAMS::ppDiffMap
|
|
*/
|
|
void **ppDiffMap;
|
|
/*!
|
|
* [in] Scaling factor of the differential maps.
|
|
*
|
|
* \see NVFBC_TOSYS_SETUP_PARAMS::dwDiffMapScalingFactor
|
|
*/
|
|
uint32_t dwDiffMapScalingFactor;
|
|
/*!
|
|
* [out] List of GL textures that will store the captured frames.
|
|
*
|
|
* This array is 0 terminated. The number of textures varies depending on
|
|
* the capture settings (such as whether diffmaps are enabled).
|
|
*
|
|
* An application wishing to interop with, for example, EncodeAPI will need
|
|
* to register these textures prior to start encoding frames.
|
|
*
|
|
* After each frame capture, the texture holding the current frame will be
|
|
* returned in NVFBC_TOGL_GRAB_FRAME_PARAMS::dwTexture.
|
|
*/
|
|
uint32_t dwTextures[NVFBC_TOGL_TEXTURES_MAX];
|
|
/*!
|
|
* [out] GL target to which the texture should be bound.
|
|
*/
|
|
uint32_t dwTexTarget;
|
|
/*!
|
|
* [out] GL format of the textures.
|
|
*/
|
|
uint32_t dwTexFormat;
|
|
/*!
|
|
* [out] GL type of the textures.
|
|
*/
|
|
uint32_t dwTexType;
|
|
/*!
|
|
* [out] Size of the differential map.
|
|
*
|
|
* Only set if bWithDiffMap is set to NVFBC_TRUE.
|
|
*/
|
|
NVFBC_SIZE diffMapSize;
|
|
} NVFBC_TOGL_SETUP_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_TOGL_SETUP_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_TOGL_SETUP_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_TOGL_SETUP_PARAMS, 2)
|
|
|
|
/*!
|
|
* Defines parameters for the ::NvFBCToGLGrabFrame() API call.
|
|
*/
|
|
typedef struct _NVFBC_TOGL_GRAB_FRAME_PARAMS
|
|
{
|
|
/*!
|
|
* [in] Must be set to NVFBC_TOGL_GRAB_FRAME_PARAMS_VER.
|
|
*/
|
|
uint32_t dwVersion;
|
|
/*!
|
|
* [in] Flags defining the behavior of this frame capture.
|
|
*/
|
|
uint32_t dwFlags;
|
|
/*!
|
|
* [out] Index of the texture storing the current frame.
|
|
*
|
|
* This is an index in the NVFBC_TOGL_SETUP_PARAMS::dwTextures array.
|
|
*/
|
|
uint32_t dwTextureIndex;
|
|
/*!
|
|
* [out] Information about the captured frame.
|
|
*
|
|
* Can be NULL.
|
|
*/
|
|
NVFBC_FRAME_GRAB_INFO *pFrameGrabInfo;
|
|
/*!
|
|
* [in] Wait timeout in milliseconds.
|
|
*
|
|
* When capturing frames with the NVFBC_TOGL_GRAB_FLAGS_NOFLAGS or
|
|
* NVFBC_TOGL_GRAB_FLAGS_NOWAIT_IF_NEW_FRAME_READY flags,
|
|
* NvFBC will wait for a new frame or mouse move until the below timer
|
|
* expires.
|
|
*
|
|
* When timing out, the last captured frame will be returned. Note that as
|
|
* long as the NVFBC_TOGL_GRAB_FLAGS_FORCE_REFRESH flag is not set,
|
|
* returning an old frame will incur no performance penalty.
|
|
*
|
|
* NvFBC clients can use the return value of the grab frame operation to
|
|
* find out whether a new frame was captured, or the timer expired.
|
|
*
|
|
* Note that the behavior of blocking calls is to wait for a new frame
|
|
* *after* the call has been made. When using timeouts, it is possible
|
|
* that NvFBC will return a new frame (e.g., it has never been captured
|
|
* before) even though no new frame was generated after the grab call.
|
|
*
|
|
* For the precise definition of what constitutes a new frame, see
|
|
* ::bIsNewFrame.
|
|
*
|
|
* Set to 0 to disable timeouts.
|
|
*/
|
|
uint32_t dwTimeoutMs;
|
|
} NVFBC_TOGL_GRAB_FRAME_PARAMS;
|
|
|
|
/*!
|
|
* NVFBC_TOGL_GRAB_FRAME_PARAMS structure version.
|
|
*/
|
|
#define NVFBC_TOGL_GRAB_FRAME_PARAMS_VER NVFBC_STRUCT_VERSION(NVFBC_TOGL_GRAB_FRAME_PARAMS, 2)
|
|
|
|
/*! @} FBC_STRUCT */
|
|
|
|
/*!
|
|
* \defgroup FBC_FUNC API Entry Points
|
|
*
|
|
* Entry points are thread-safe and can be called concurrently.
|
|
*
|
|
* The locking model includes a global lock that protects session handle
|
|
* management (\see NvFBCCreateHandle, \see NvFBCDestroyHandle).
|
|
*
|
|
* Each NvFBC session uses a local lock to protect other entry points. Note
|
|
* that in certain cases, a thread can hold the local lock for an undefined
|
|
* amount of time, such as grabbing a frame using a blocking call.
|
|
*
|
|
* Note that a context is associated with each session. NvFBC clients wishing
|
|
* to share a session between different threads are expected to release and
|
|
* bind the context appropriately (\see NvFBCBindContext,
|
|
* \see NvFBCReleaseContext). This is not required when each thread uses its
|
|
* own NvFBC session.
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
/*!
|
|
* Gets the last error message that got recorded for a client.
|
|
*
|
|
* When NvFBC returns an error, it will save an error message that can be
|
|
* queried through this API call. Only the last message is saved.
|
|
* The message and the return code should give enough information about
|
|
* what went wrong.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* Handle to the NvFBC client.
|
|
* \return
|
|
* A NULL terminated error message, or an empty string. Its maximum length
|
|
* is NVFBC_ERROR_STR_LEN.
|
|
*/
|
|
const char* NVFBCAPI NvFBCGetLastErrorStr(const NVFBC_SESSION_HANDLE sessionHandle);
|
|
|
|
/*!
|
|
* \brief Allocates a new handle for an NvFBC client.
|
|
*
|
|
* This function allocates a session handle used to identify an FBC client.
|
|
*
|
|
* This function implicitly calls NvFBCBindContext().
|
|
*
|
|
* \param [out] pSessionHandle
|
|
* Pointer that will hold the allocated session handle.
|
|
* \param [in] pParams
|
|
* ::NVFBC_CREATE_HANDLE_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_PTR \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_OUT_OF_MEMORY \n
|
|
* ::NVFBC_ERR_MAX_CLIENTS \n
|
|
* ::NVFBC_ERR_X \n
|
|
* ::NVFBC_ERR_GLX \n
|
|
* ::NVFBC_ERR_GL
|
|
*
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCCreateHandle(NVFBC_SESSION_HANDLE *pSessionHandle, NVFBC_CREATE_HANDLE_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Destroys the handle of an NvFBC client.
|
|
*
|
|
* This function uninitializes an FBC client.
|
|
*
|
|
* This function implicitly calls NvFBCReleaseContext().
|
|
*
|
|
* After this fucntion returns, it is not possible to use this session handle
|
|
* for any further API call.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
* \param [in] pParams
|
|
* ::NVFBC_DESTROY_HANDLE_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_X
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCDestroyHandle(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_DESTROY_HANDLE_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Gets the current status of the display driver.
|
|
*
|
|
* This function queries the display driver for various information.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
* \param [in] pParams
|
|
* ::NVFBC_GET_STATUS_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_X
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCGetStatus(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_GET_STATUS_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Binds the FBC context to the calling thread.
|
|
*
|
|
* The NvFBC library internally relies on objects that must be bound to a
|
|
* thread. Such objects are OpenGL contexts and CUDA contexts.
|
|
*
|
|
* This function binds these objects to the calling thread.
|
|
*
|
|
* The FBC context must be bound to the calling thread for most NvFBC entry
|
|
* points, otherwise ::NVFBC_ERR_CONTEXT is returned.
|
|
*
|
|
* If the FBC context is already bound to a different thread,
|
|
* ::NVFBC_ERR_CONTEXT is returned. The other thread must release the context
|
|
* first by calling the ReleaseContext() entry point.
|
|
*
|
|
* If the FBC context is already bound to the current thread, this function has
|
|
* no effects.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
* \param [in] pParams
|
|
* ::NVFBC_DESTROY_CAPTURE_SESSION_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_X
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCBindContext(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_BIND_CONTEXT_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Releases the FBC context from the calling thread.
|
|
*
|
|
* If the FBC context is bound to a different thread, ::NVFBC_ERR_CONTEXT is
|
|
* returned.
|
|
*
|
|
* If the FBC context is already released, this functino has no effects.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
* \param [in] pParams
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_X
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCReleaseContext(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_RELEASE_CONTEXT_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Creates a capture session for an FBC client.
|
|
*
|
|
* This function starts a capture session of the desired type (system memory,
|
|
* video memory with CUDA interop, or H.264 compressed frames in system memory).
|
|
*
|
|
* Not all types are supported on all systems. Also, it is possible to use
|
|
* NvFBC without having the CUDA library. In this case, requesting a capture
|
|
* session of the concerned type will return an error.
|
|
*
|
|
* After this function returns, the display driver will start generating frames
|
|
* that can be captured using the corresponding API call.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
* \param [in] pParams
|
|
* ::NVFBC_CREATE_CAPTURE_SESSION_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_INVALID_PARAM \n
|
|
* ::NVFBC_ERR_OUT_OF_MEMORY \n
|
|
* ::NVFBC_ERR_X \n
|
|
* ::NVFBC_ERR_GLX \n
|
|
* ::NVFBC_ERR_GL \n
|
|
* ::NVFBC_ERR_CUDA \n
|
|
* ::NVFBC_ERR_MUST_RECREATE \n
|
|
* ::NVFBC_ERR_INTERNAL
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCCreateCaptureSession(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_CREATE_CAPTURE_SESSION_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Destroys a capture session for an FBC client.
|
|
*
|
|
* This function stops a capture session and frees allocated objects.
|
|
*
|
|
* After this function returns, it is possible to create another capture
|
|
* session using the corresponding API call.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
* \param [in] pParams
|
|
* ::NVFBC_DESTROY_CAPTURE_SESSION_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_X
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCDestroyCaptureSession(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_DESTROY_CAPTURE_SESSION_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Sets up a capture to system memory session.
|
|
*
|
|
* This function configures how the capture to system memory should behave. It
|
|
* can be called anytime and several times after the capture session has been
|
|
* created. However, it must be called at least once prior to start capturing
|
|
* frames.
|
|
*
|
|
* This function allocates the buffer that will contain the captured frame.
|
|
* The application does not need to free this buffer. The size of this buffer
|
|
* is returned in the ::NVFBC_FRAME_GRAB_INFO structure.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
* \param [in] pParams
|
|
* ::NVFBC_TOSYS_SETUP_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_UNSUPPORTED \n
|
|
* ::NVFBC_ERR_INVALID_PTR \n
|
|
* ::NVFBC_ERR_INVALID_PARAM \n
|
|
* ::NVFBC_ERR_OUT_OF_MEMORY \n
|
|
* ::NVFBC_ERR_X
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCToSysSetUp(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOSYS_SETUP_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Captures a frame to a buffer in system memory.
|
|
*
|
|
* This function triggers a frame capture to a buffer in system memory that was
|
|
* registered with the ToSysSetUp() API call.
|
|
*
|
|
* Note that it is possible that the resolution of the desktop changes while
|
|
* capturing frames. This should be transparent for the application.
|
|
*
|
|
* When the resolution changes, the capture session is recreated using the same
|
|
* parameters, and necessary buffers are re-allocated. The frame counter is not
|
|
* reset.
|
|
*
|
|
* An application can detect that the resolution changed by comparing the
|
|
* dwByteSize member of the ::NVFBC_FRAME_GRAB_INFO against a previous
|
|
* frame and/or dwWidth and dwHeight.
|
|
*
|
|
* During a change of resolution the capture is paused even in asynchronous
|
|
* mode.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
* \param [in] pParams
|
|
* ::NVFBC_TOSYS_GRAB_FRAME_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_INVALID_PTR \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_X \n
|
|
* ::NVFBC_ERR_MUST_RECREATE \n
|
|
* \see NvFBCCreateCaptureSession \n
|
|
* \see NvFBCToSysSetUp
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCToSysGrabFrame(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOSYS_GRAB_FRAME_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Sets up a capture to video memory session.
|
|
*
|
|
* This function configures how the capture to video memory with CUDA interop
|
|
* should behave. It can be called anytime and several times after the capture
|
|
* session has been created. However, it must be called at least once prior
|
|
* to start capturing frames.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
*
|
|
* \param [in] pParams
|
|
* ::NVFBC_TOCUDA_SETUP_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_UNSUPPORTED \n
|
|
* ::NVFBC_ERR_GL \n
|
|
* ::NVFBC_ERR_X
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCToCudaSetUp(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOCUDA_SETUP_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Captures a frame to a CUDA device in video memory.
|
|
*
|
|
* This function triggers a frame capture to a CUDA device in video memory.
|
|
*
|
|
* Note about changes of resolution: \see NvFBCToSysGrabFrame
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
*
|
|
* \param [in] pParams
|
|
* ::NVFBC_TOCUDA_GRAB_FRAME_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_INVALID_PTR \n
|
|
* ::NVFBC_ERR_CUDA \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_X \n
|
|
* ::NVFBC_ERR_MUST_RECREATE \n
|
|
* \see NvFBCCreateCaptureSession \n
|
|
* \see NvFBCToCudaSetUp
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCToCudaGrabFrame(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOCUDA_GRAB_FRAME_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Sets up a capture to OpenGL buffer in video memory session.
|
|
*
|
|
* This function configures how the capture to video memory should behave.
|
|
* It can be called anytime and several times after the capture session has been
|
|
* created. However, it must be called at least once prior to start capturing
|
|
* frames.
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
*
|
|
* \param [in] pParams
|
|
* ::NVFBC_TOGL_SETUP_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_UNSUPPORTED \n
|
|
* ::NVFBC_ERR_GL \n
|
|
* ::NVFBC_ERR_X
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCToGLSetUp(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOGL_SETUP_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \brief Captures a frame to an OpenGL buffer in video memory.
|
|
*
|
|
* This function triggers a frame capture to a selected resource in video memory.
|
|
*
|
|
* Note about changes of resolution: \see NvFBCToSysGrabFrame
|
|
*
|
|
* \param [in] sessionHandle
|
|
* FBC session handle.
|
|
*
|
|
* \param [in] pParams
|
|
* ::NVFBC_TOGL_GRAB_FRAME_PARAMS
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_HANDLE \n
|
|
* ::NVFBC_ERR_API_VERSION \n
|
|
* ::NVFBC_ERR_BAD_REQUEST \n
|
|
* ::NVFBC_ERR_CONTEXT \n
|
|
* ::NVFBC_ERR_INVALID_PTR \n
|
|
* ::NVFBC_ERR_INTERNAL \n
|
|
* ::NVFBC_ERR_X \n
|
|
* ::NVFBC_ERR_MUST_RECREATE \n
|
|
* \see NvFBCCreateCaptureSession \n
|
|
* \see NvFBCToCudaSetUp
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCToGLGrabFrame(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOGL_GRAB_FRAME_PARAMS *pParams);
|
|
|
|
/*!
|
|
* \cond FBC_PFN
|
|
*
|
|
* Defines API function pointers
|
|
*/
|
|
typedef const char* (NVFBCAPI* PNVFBCGETLASTERRORSTR)(const NVFBC_SESSION_HANDLE sessionHandle);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCCREATEHANDLE)(NVFBC_SESSION_HANDLE *pSessionHandle, NVFBC_CREATE_HANDLE_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCDESTROYHANDLE)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_DESTROY_HANDLE_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCBINDCONTEXT)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_BIND_CONTEXT_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCRELEASECONTEXT)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_RELEASE_CONTEXT_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCGETSTATUS)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_GET_STATUS_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCCREATECAPTURESESSION)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_CREATE_CAPTURE_SESSION_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCDESTROYCAPTURESESSION)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_DESTROY_CAPTURE_SESSION_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCTOSYSSETUP)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOSYS_SETUP_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCTOSYSGRABFRAME)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOSYS_GRAB_FRAME_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCTOCUDASETUP)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOCUDA_SETUP_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCTOCUDAGRABFRAME)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOCUDA_GRAB_FRAME_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCTOGLSETUP)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOGL_SETUP_PARAMS *pParams);
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCTOGLGRABFRAME)(const NVFBC_SESSION_HANDLE sessionHandle, NVFBC_TOGL_GRAB_FRAME_PARAMS *pParams);
|
|
|
|
/// \endcond
|
|
|
|
/*! @} FBC_FUNC */
|
|
|
|
/*!
|
|
* \ingroup FBC_STRUCT
|
|
*
|
|
* Structure populated with API function pointers.
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint32_t dwVersion; //!< [in] Must be set to NVFBC_VERSION.
|
|
PNVFBCGETLASTERRORSTR nvFBCGetLastErrorStr; //!< [out] Pointer to ::NvFBCGetLastErrorStr().
|
|
PNVFBCCREATEHANDLE nvFBCCreateHandle; //!< [out] Pointer to ::NvFBCCreateHandle().
|
|
PNVFBCDESTROYHANDLE nvFBCDestroyHandle; //!< [out] Pointer to ::NvFBCDestroyHandle().
|
|
PNVFBCGETSTATUS nvFBCGetStatus; //!< [out] Pointer to ::NvFBCGetStatus().
|
|
PNVFBCCREATECAPTURESESSION nvFBCCreateCaptureSession; //!< [out] Pointer to ::NvFBCCreateCaptureSession().
|
|
PNVFBCDESTROYCAPTURESESSION nvFBCDestroyCaptureSession; //!< [out] Pointer to ::NvFBCDestroyCaptureSession().
|
|
PNVFBCTOSYSSETUP nvFBCToSysSetUp; //!< [out] Pointer to ::NvFBCToSysSetUp().
|
|
PNVFBCTOSYSGRABFRAME nvFBCToSysGrabFrame; //!< [out] Pointer to ::NvFBCToSysGrabFrame().
|
|
PNVFBCTOCUDASETUP nvFBCToCudaSetUp; //!< [out] Pointer to ::NvFBCToCudaSetUp().
|
|
PNVFBCTOCUDAGRABFRAME nvFBCToCudaGrabFrame; //!< [out] Pointer to ::NvFBCToCudaGrabFrame().
|
|
void* pad1; //!< [out] Retired. Do not use.
|
|
void* pad2; //!< [out] Retired. Do not use.
|
|
void* pad3; //!< [out] Retired. Do not use.
|
|
PNVFBCBINDCONTEXT nvFBCBindContext; //!< [out] Pointer to ::NvFBCBindContext().
|
|
PNVFBCRELEASECONTEXT nvFBCReleaseContext; //!< [out] Pointer to ::NvFBCReleaseContext().
|
|
void* pad4; //!< [out] Retired. Do not use.
|
|
void* pad5; //!< [out] Retired. Do not use.
|
|
void* pad6; //!< [out] Retired. Do not use.
|
|
void* pad7; //!< [out] Retired. Do not use.
|
|
PNVFBCTOGLSETUP nvFBCToGLSetUp; //!< [out] Pointer to ::nvFBCToGLSetup().
|
|
PNVFBCTOGLGRABFRAME nvFBCToGLGrabFrame; //!< [out] Pointer to ::nvFBCToGLGrabFrame().
|
|
} NVFBC_API_FUNCTION_LIST;
|
|
|
|
/*!
|
|
* \ingroup FBC_FUNC
|
|
*
|
|
* \brief Entry Points to the NvFBC interface.
|
|
*
|
|
* Creates an instance of the NvFBC interface, and populates the
|
|
* pFunctionList with function pointers to the API routines implemented by
|
|
* the NvFBC interface.
|
|
*
|
|
* \param [out] pFunctionList
|
|
*
|
|
* \return
|
|
* ::NVFBC_SUCCESS \n
|
|
* ::NVFBC_ERR_INVALID_PTR \n
|
|
* ::NVFBC_ERR_API_VERSION
|
|
*/
|
|
NVFBCSTATUS NVFBCAPI NvFBCCreateInstance(NVFBC_API_FUNCTION_LIST *pFunctionList);
|
|
/*!
|
|
* \ingroup FBC_FUNC
|
|
*
|
|
* Defines function pointer for the ::NvFBCCreateInstance() API call.
|
|
*/
|
|
typedef NVFBCSTATUS (NVFBCAPI* PNVFBCCREATEINSTANCE)(NVFBC_API_FUNCTION_LIST *pFunctionList);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // _NVFBC_H_
|