mirror of https://git.ffmpeg.org/ffmpeg.git
317 lines
12 KiB
C
317 lines
12 KiB
C
/*
|
|
* This copyright notice applies to this header file only:
|
|
*
|
|
* Copyright (c) 2010-2016 NVIDIA Corporation
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
/**
|
|
* \file nvcuvid.h
|
|
* NvCuvid API provides Video Decoding interface to NVIDIA GPU devices.
|
|
* \date 2015-2015
|
|
* This file contains the interface constants, structure definitions and function prototypes.
|
|
*/
|
|
|
|
#if !defined(__NVCUVID_H__)
|
|
#define __NVCUVID_H__
|
|
|
|
#include "compat/cuda/dynlink_cuviddec.h"
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// High-level helper APIs for video sources
|
|
//
|
|
|
|
typedef void *CUvideosource;
|
|
typedef void *CUvideoparser;
|
|
typedef long long CUvideotimestamp;
|
|
|
|
/**
|
|
* \addtogroup VIDEO_PARSER Video Parser
|
|
* @{
|
|
*/
|
|
|
|
/*!
|
|
* \enum cudaVideoState
|
|
* Video Source State
|
|
*/
|
|
typedef enum {
|
|
cudaVideoState_Error = -1, /**< Error state (invalid source) */
|
|
cudaVideoState_Stopped = 0, /**< Source is stopped (or reached end-of-stream) */
|
|
cudaVideoState_Started = 1 /**< Source is running and delivering data */
|
|
} cudaVideoState;
|
|
|
|
/*!
|
|
* \enum cudaAudioCodec
|
|
* Audio compression
|
|
*/
|
|
typedef enum {
|
|
cudaAudioCodec_MPEG1=0, /**< MPEG-1 Audio */
|
|
cudaAudioCodec_MPEG2, /**< MPEG-2 Audio */
|
|
cudaAudioCodec_MP3, /**< MPEG-1 Layer III Audio */
|
|
cudaAudioCodec_AC3, /**< Dolby Digital (AC3) Audio */
|
|
cudaAudioCodec_LPCM /**< PCM Audio */
|
|
} cudaAudioCodec;
|
|
|
|
/*!
|
|
* \struct CUVIDEOFORMAT
|
|
* Video format
|
|
*/
|
|
typedef struct
|
|
{
|
|
cudaVideoCodec codec; /**< Compression format */
|
|
/**
|
|
* frame rate = numerator / denominator (for example: 30000/1001)
|
|
*/
|
|
struct {
|
|
unsigned int numerator; /**< frame rate numerator (0 = unspecified or variable frame rate) */
|
|
unsigned int denominator; /**< frame rate denominator (0 = unspecified or variable frame rate) */
|
|
} frame_rate;
|
|
unsigned char progressive_sequence; /**< 0=interlaced, 1=progressive */
|
|
unsigned char bit_depth_luma_minus8; /**< high bit depth Luma */
|
|
unsigned char bit_depth_chroma_minus8; /**< high bit depth Chroma */
|
|
unsigned char reserved1; /**< Reserved for future use */
|
|
unsigned int coded_width; /**< coded frame width */
|
|
unsigned int coded_height; /**< coded frame height */
|
|
/**
|
|
* area of the frame that should be displayed
|
|
* typical example:
|
|
* coded_width = 1920, coded_height = 1088
|
|
* display_area = { 0,0,1920,1080 }
|
|
*/
|
|
struct {
|
|
int left; /**< left position of display rect */
|
|
int top; /**< top position of display rect */
|
|
int right; /**< right position of display rect */
|
|
int bottom; /**< bottom position of display rect */
|
|
} display_area;
|
|
cudaVideoChromaFormat chroma_format; /**< Chroma format */
|
|
unsigned int bitrate; /**< video bitrate (bps, 0=unknown) */
|
|
/**
|
|
* Display Aspect Ratio = x:y (4:3, 16:9, etc)
|
|
*/
|
|
struct {
|
|
int x;
|
|
int y;
|
|
} display_aspect_ratio;
|
|
/**
|
|
* Video Signal Description
|
|
*/
|
|
struct {
|
|
unsigned char video_format : 3;
|
|
unsigned char video_full_range_flag : 1;
|
|
unsigned char reserved_zero_bits : 4;
|
|
unsigned char color_primaries;
|
|
unsigned char transfer_characteristics;
|
|
unsigned char matrix_coefficients;
|
|
} video_signal_description;
|
|
unsigned int seqhdr_data_length; /**< Additional bytes following (CUVIDEOFORMATEX) */
|
|
} CUVIDEOFORMAT;
|
|
|
|
/*!
|
|
* \struct CUVIDEOFORMATEX
|
|
* Video format including raw sequence header information
|
|
*/
|
|
typedef struct
|
|
{
|
|
CUVIDEOFORMAT format;
|
|
unsigned char raw_seqhdr_data[1024];
|
|
} CUVIDEOFORMATEX;
|
|
|
|
/*!
|
|
* \struct CUAUDIOFORMAT
|
|
* Audio Formats
|
|
*/
|
|
typedef struct
|
|
{
|
|
cudaAudioCodec codec; /**< Compression format */
|
|
unsigned int channels; /**< number of audio channels */
|
|
unsigned int samplespersec; /**< sampling frequency */
|
|
unsigned int bitrate; /**< For uncompressed, can also be used to determine bits per sample */
|
|
unsigned int reserved1; /**< Reserved for future use */
|
|
unsigned int reserved2; /**< Reserved for future use */
|
|
} CUAUDIOFORMAT;
|
|
|
|
|
|
/*!
|
|
* \enum CUvideopacketflags
|
|
* Data packet flags
|
|
*/
|
|
typedef enum {
|
|
CUVID_PKT_ENDOFSTREAM = 0x01, /**< Set when this is the last packet for this stream */
|
|
CUVID_PKT_TIMESTAMP = 0x02, /**< Timestamp is valid */
|
|
CUVID_PKT_DISCONTINUITY = 0x04 /**< Set when a discontinuity has to be signalled */
|
|
} CUvideopacketflags;
|
|
|
|
/*!
|
|
* \struct CUVIDSOURCEDATAPACKET
|
|
* Data Packet
|
|
*/
|
|
typedef struct _CUVIDSOURCEDATAPACKET
|
|
{
|
|
tcu_ulong flags; /**< Combination of CUVID_PKT_XXX flags */
|
|
tcu_ulong payload_size; /**< number of bytes in the payload (may be zero if EOS flag is set) */
|
|
const unsigned char *payload; /**< Pointer to packet payload data (may be NULL if EOS flag is set) */
|
|
CUvideotimestamp timestamp; /**< Presentation timestamp (10MHz clock), only valid if CUVID_PKT_TIMESTAMP flag is set */
|
|
} CUVIDSOURCEDATAPACKET;
|
|
|
|
// Callback for packet delivery
|
|
typedef int (CUDAAPI *PFNVIDSOURCECALLBACK)(void *, CUVIDSOURCEDATAPACKET *);
|
|
|
|
/*!
|
|
* \struct CUVIDSOURCEPARAMS
|
|
* Source Params
|
|
*/
|
|
typedef struct _CUVIDSOURCEPARAMS
|
|
{
|
|
unsigned int ulClockRate; /**< Timestamp units in Hz (0=default=10000000Hz) */
|
|
unsigned int uReserved1[7]; /**< Reserved for future use - set to zero */
|
|
void *pUserData; /**< Parameter passed in to the data handlers */
|
|
PFNVIDSOURCECALLBACK pfnVideoDataHandler; /**< Called to deliver audio packets */
|
|
PFNVIDSOURCECALLBACK pfnAudioDataHandler; /**< Called to deliver video packets */
|
|
void *pvReserved2[8]; /**< Reserved for future use - set to NULL */
|
|
} CUVIDSOURCEPARAMS;
|
|
|
|
/*!
|
|
* \enum CUvideosourceformat_flags
|
|
* CUvideosourceformat_flags
|
|
*/
|
|
typedef enum {
|
|
CUVID_FMT_EXTFORMATINFO = 0x100 /**< Return extended format structure (CUVIDEOFORMATEX) */
|
|
} CUvideosourceformat_flags;
|
|
|
|
#if !defined(__APPLE__)
|
|
/**
|
|
* \fn CUresult CUDAAPI cuvidCreateVideoSource(CUvideosource *pObj, const char *pszFileName, CUVIDSOURCEPARAMS *pParams)
|
|
* Create Video Source
|
|
*/
|
|
typedef CUresult CUDAAPI tcuvidCreateVideoSource(CUvideosource *pObj, const char *pszFileName, CUVIDSOURCEPARAMS *pParams);
|
|
|
|
/**
|
|
* \fn CUresult CUDAAPI cuvidCreateVideoSourceW(CUvideosource *pObj, const wchar_t *pwszFileName, CUVIDSOURCEPARAMS *pParams)
|
|
* Create Video Source
|
|
*/
|
|
typedef CUresult CUDAAPI tcuvidCreateVideoSourceW(CUvideosource *pObj, const wchar_t *pwszFileName, CUVIDSOURCEPARAMS *pParams);
|
|
|
|
/**
|
|
* \fn CUresult CUDAAPI cuvidDestroyVideoSource(CUvideosource obj)
|
|
* Destroy Video Source
|
|
*/
|
|
typedef CUresult CUDAAPI tcuvidDestroyVideoSource(CUvideosource obj);
|
|
|
|
/**
|
|
* \fn CUresult CUDAAPI cuvidSetVideoSourceState(CUvideosource obj, cudaVideoState state)
|
|
* Set Video Source state
|
|
*/
|
|
typedef CUresult CUDAAPI tcuvidSetVideoSourceState(CUvideosource obj, cudaVideoState state);
|
|
|
|
/**
|
|
* \fn cudaVideoState CUDAAPI cuvidGetVideoSourceState(CUvideosource obj)
|
|
* Get Video Source state
|
|
*/
|
|
typedef cudaVideoState CUDAAPI tcuvidGetVideoSourceState(CUvideosource obj);
|
|
|
|
/**
|
|
* \fn CUresult CUDAAPI cuvidGetSourceVideoFormat(CUvideosource obj, CUVIDEOFORMAT *pvidfmt, unsigned int flags)
|
|
* Get Video Source Format
|
|
*/
|
|
typedef CUresult CUDAAPI tcuvidGetSourceVideoFormat(CUvideosource obj, CUVIDEOFORMAT *pvidfmt, unsigned int flags);
|
|
|
|
/**
|
|
* \fn CUresult CUDAAPI cuvidGetSourceAudioFormat(CUvideosource obj, CUAUDIOFORMAT *paudfmt, unsigned int flags)
|
|
* Set Video Source state
|
|
*/
|
|
typedef CUresult CUDAAPI tcuvidGetSourceAudioFormat(CUvideosource obj, CUAUDIOFORMAT *paudfmt, unsigned int flags);
|
|
|
|
#endif
|
|
|
|
/**
|
|
* \struct CUVIDPARSERDISPINFO
|
|
*/
|
|
typedef struct _CUVIDPARSERDISPINFO
|
|
{
|
|
int picture_index; /**< */
|
|
int progressive_frame; /**< */
|
|
int top_field_first; /**< */
|
|
int repeat_first_field; /**< Number of additional fields (1=ivtc, 2=frame doubling, 4=frame tripling, -1=unpaired field) */
|
|
CUvideotimestamp timestamp; /**< */
|
|
} CUVIDPARSERDISPINFO;
|
|
|
|
//
|
|
// Parser callbacks
|
|
// The parser will call these synchronously from within cuvidParseVideoData(), whenever a picture is ready to
|
|
// be decoded and/or displayed.
|
|
//
|
|
typedef int (CUDAAPI *PFNVIDSEQUENCECALLBACK)(void *, CUVIDEOFORMAT *);
|
|
typedef int (CUDAAPI *PFNVIDDECODECALLBACK)(void *, CUVIDPICPARAMS *);
|
|
typedef int (CUDAAPI *PFNVIDDISPLAYCALLBACK)(void *, CUVIDPARSERDISPINFO *);
|
|
|
|
/**
|
|
* \struct CUVIDPARSERPARAMS
|
|
*/
|
|
typedef struct _CUVIDPARSERPARAMS
|
|
{
|
|
cudaVideoCodec CodecType; /**< cudaVideoCodec_XXX */
|
|
unsigned int ulMaxNumDecodeSurfaces; /**< Max # of decode surfaces (parser will cycle through these) */
|
|
unsigned int ulClockRate; /**< Timestamp units in Hz (0=default=10000000Hz) */
|
|
unsigned int ulErrorThreshold; /**< % Error threshold (0-100) for calling pfnDecodePicture (100=always call pfnDecodePicture even if picture bitstream is fully corrupted) */
|
|
unsigned int ulMaxDisplayDelay; /**< Max display queue delay (improves pipelining of decode with display) - 0=no delay (recommended values: 2..4) */
|
|
unsigned int uReserved1[5]; /**< Reserved for future use - set to 0 */
|
|
void *pUserData; /**< User data for callbacks */
|
|
PFNVIDSEQUENCECALLBACK pfnSequenceCallback; /**< Called before decoding frames and/or whenever there is a format change */
|
|
PFNVIDDECODECALLBACK pfnDecodePicture; /**< Called when a picture is ready to be decoded (decode order) */
|
|
PFNVIDDISPLAYCALLBACK pfnDisplayPicture; /**< Called whenever a picture is ready to be displayed (display order) */
|
|
void *pvReserved2[7]; /**< Reserved for future use - set to NULL */
|
|
CUVIDEOFORMATEX *pExtVideoInfo; /**< [Optional] sequence header data from system layer */
|
|
} CUVIDPARSERPARAMS;
|
|
|
|
/**
|
|
* \fn CUresult CUDAAPI cuvidCreateVideoParser(CUvideoparser *pObj, CUVIDPARSERPARAMS *pParams)
|
|
*/
|
|
typedef CUresult CUDAAPI tcuvidCreateVideoParser(CUvideoparser *pObj, CUVIDPARSERPARAMS *pParams);
|
|
|
|
/**
|
|
* \fn CUresult CUDAAPI cuvidParseVideoData(CUvideoparser obj, CUVIDSOURCEDATAPACKET *pPacket)
|
|
*/
|
|
typedef CUresult CUDAAPI tcuvidParseVideoData(CUvideoparser obj, CUVIDSOURCEDATAPACKET *pPacket);
|
|
|
|
/**
|
|
* \fn CUresult CUDAAPI cuvidDestroyVideoParser(CUvideoparser obj)
|
|
*/
|
|
typedef CUresult CUDAAPI tcuvidDestroyVideoParser(CUvideoparser obj);
|
|
|
|
/** @} */ /* END VIDEO_PARSER */
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif // __NVCUVID_H__
|
|
|
|
|