2 * This copyright notice applies to this header file only:
4 * Copyright (c) 2010-2016 NVIDIA Corporation
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation
8 * files (the "Software"), to deal in the Software without
9 * restriction, including without limitation the rights to use,
10 * copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the software, and to permit persons to whom the
12 * software is furnished to do so, subject to the following
15 * The above copyright notice and this permission notice shall be
16 * included in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 * OTHER DEALINGS IN THE SOFTWARE.
30 * NvCuvid API provides Video Decoding interface to NVIDIA GPU devices.
32 * This file contains the interface constants, structure definitions and function prototypes.
35 #if !defined(__NVCUVID_H__)
38 #include "compat/cuda/cuviddec.h"
40 #if defined(__cplusplus)
42 #endif /* __cplusplus */
44 /*********************************
46 *********************************/
47 CUresult CUDAAPI cuvidInit(unsigned int Flags);
49 ////////////////////////////////////////////////////////////////////////////////////////////////
51 // High-level helper APIs for video sources
54 typedef void *CUvideosource;
55 typedef void *CUvideoparser;
56 typedef long long CUvideotimestamp;
59 * \addtogroup VIDEO_PARSER Video Parser
64 * \enum cudaVideoState
68 cudaVideoState_Error = -1, /**< Error state (invalid source) */
69 cudaVideoState_Stopped = 0, /**< Source is stopped (or reached end-of-stream) */
70 cudaVideoState_Started = 1 /**< Source is running and delivering data */
74 * \enum cudaAudioCodec
78 cudaAudioCodec_MPEG1=0, /**< MPEG-1 Audio */
79 cudaAudioCodec_MPEG2, /**< MPEG-2 Audio */
80 cudaAudioCodec_MP3, /**< MPEG-1 Layer III Audio */
81 cudaAudioCodec_AC3, /**< Dolby Digital (AC3) Audio */
82 cudaAudioCodec_LPCM /**< PCM Audio */
86 * \struct CUVIDEOFORMAT
91 cudaVideoCodec codec; /**< Compression format */
93 * frame rate = numerator / denominator (for example: 30000/1001)
96 unsigned int numerator; /**< frame rate numerator (0 = unspecified or variable frame rate) */
97 unsigned int denominator; /**< frame rate denominator (0 = unspecified or variable frame rate) */
99 unsigned char progressive_sequence; /**< 0=interlaced, 1=progressive */
100 unsigned char bit_depth_luma_minus8; /**< high bit depth Luma */
101 unsigned char bit_depth_chroma_minus8; /**< high bit depth Chroma */
102 unsigned char reserved1; /**< Reserved for future use */
103 unsigned int coded_width; /**< coded frame width */
104 unsigned int coded_height; /**< coded frame height */
106 * area of the frame that should be displayed
108 * coded_width = 1920, coded_height = 1088
109 * display_area = { 0,0,1920,1080 }
112 int left; /**< left position of display rect */
113 int top; /**< top position of display rect */
114 int right; /**< right position of display rect */
115 int bottom; /**< bottom position of display rect */
117 cudaVideoChromaFormat chroma_format; /**< Chroma format */
118 unsigned int bitrate; /**< video bitrate (bps, 0=unknown) */
120 * Display Aspect Ratio = x:y (4:3, 16:9, etc)
125 } display_aspect_ratio;
127 * Video Signal Description
130 unsigned char video_format : 3;
131 unsigned char video_full_range_flag : 1;
132 unsigned char reserved_zero_bits : 4;
133 unsigned char color_primaries;
134 unsigned char transfer_characteristics;
135 unsigned char matrix_coefficients;
136 } video_signal_description;
137 unsigned int seqhdr_data_length; /**< Additional bytes following (CUVIDEOFORMATEX) */
141 * \struct CUVIDEOFORMATEX
142 * Video format including raw sequence header information
146 CUVIDEOFORMAT format;
147 unsigned char raw_seqhdr_data[1024];
151 * \struct CUAUDIOFORMAT
156 cudaAudioCodec codec; /**< Compression format */
157 unsigned int channels; /**< number of audio channels */
158 unsigned int samplespersec; /**< sampling frequency */
159 unsigned int bitrate; /**< For uncompressed, can also be used to determine bits per sample */
160 unsigned int reserved1; /**< Reserved for future use */
161 unsigned int reserved2; /**< Reserved for future use */
166 * \enum CUvideopacketflags
170 CUVID_PKT_ENDOFSTREAM = 0x01, /**< Set when this is the last packet for this stream */
171 CUVID_PKT_TIMESTAMP = 0x02, /**< Timestamp is valid */
172 CUVID_PKT_DISCONTINUITY = 0x04 /**< Set when a discontinuity has to be signalled */
173 } CUvideopacketflags;
176 * \struct CUVIDSOURCEDATAPACKET
179 typedef struct _CUVIDSOURCEDATAPACKET
181 unsigned long flags; /**< Combination of CUVID_PKT_XXX flags */
182 unsigned long payload_size; /**< number of bytes in the payload (may be zero if EOS flag is set) */
183 const unsigned char *payload; /**< Pointer to packet payload data (may be NULL if EOS flag is set) */
184 CUvideotimestamp timestamp; /**< Presentation timestamp (10MHz clock), only valid if CUVID_PKT_TIMESTAMP flag is set */
185 } CUVIDSOURCEDATAPACKET;
187 // Callback for packet delivery
188 typedef int (CUDAAPI *PFNVIDSOURCECALLBACK)(void *, CUVIDSOURCEDATAPACKET *);
191 * \struct CUVIDSOURCEPARAMS
194 typedef struct _CUVIDSOURCEPARAMS
196 unsigned int ulClockRate; /**< Timestamp units in Hz (0=default=10000000Hz) */
197 unsigned int uReserved1[7]; /**< Reserved for future use - set to zero */
198 void *pUserData; /**< Parameter passed in to the data handlers */
199 PFNVIDSOURCECALLBACK pfnVideoDataHandler; /**< Called to deliver audio packets */
200 PFNVIDSOURCECALLBACK pfnAudioDataHandler; /**< Called to deliver video packets */
201 void *pvReserved2[8]; /**< Reserved for future use - set to NULL */
205 * \enum CUvideosourceformat_flags
206 * CUvideosourceformat_flags
209 CUVID_FMT_EXTFORMATINFO = 0x100 /**< Return extended format structure (CUVIDEOFORMATEX) */
210 } CUvideosourceformat_flags;
212 #if !defined(__APPLE__)
214 * \fn CUresult CUDAAPI cuvidCreateVideoSource(CUvideosource *pObj, const char *pszFileName, CUVIDSOURCEPARAMS *pParams)
215 * Create Video Source
217 CUresult CUDAAPI cuvidCreateVideoSource(CUvideosource *pObj, const char *pszFileName, CUVIDSOURCEPARAMS *pParams);
220 * \fn CUresult CUDAAPI cuvidCreateVideoSourceW(CUvideosource *pObj, const wchar_t *pwszFileName, CUVIDSOURCEPARAMS *pParams)
221 * Create Video Source
223 CUresult CUDAAPI cuvidCreateVideoSourceW(CUvideosource *pObj, const wchar_t *pwszFileName, CUVIDSOURCEPARAMS *pParams);
226 * \fn CUresult CUDAAPI cuvidDestroyVideoSource(CUvideosource obj)
227 * Destroy Video Source
229 CUresult CUDAAPI cuvidDestroyVideoSource(CUvideosource obj);
232 * \fn CUresult CUDAAPI cuvidSetVideoSourceState(CUvideosource obj, cudaVideoState state)
233 * Set Video Source state
235 CUresult CUDAAPI cuvidSetVideoSourceState(CUvideosource obj, cudaVideoState state);
238 * \fn cudaVideoState CUDAAPI cuvidGetVideoSourceState(CUvideosource obj)
239 * Get Video Source state
241 cudaVideoState CUDAAPI cuvidGetVideoSourceState(CUvideosource obj);
244 * \fn CUresult CUDAAPI cuvidGetSourceVideoFormat(CUvideosource obj, CUVIDEOFORMAT *pvidfmt, unsigned int flags)
245 * Get Video Source Format
247 CUresult CUDAAPI cuvidGetSourceVideoFormat(CUvideosource obj, CUVIDEOFORMAT *pvidfmt, unsigned int flags);
250 * \fn CUresult CUDAAPI cuvidGetSourceAudioFormat(CUvideosource obj, CUAUDIOFORMAT *paudfmt, unsigned int flags)
251 * Set Video Source state
253 CUresult CUDAAPI cuvidGetSourceAudioFormat(CUvideosource obj, CUAUDIOFORMAT *paudfmt, unsigned int flags);
258 * \struct CUVIDPARSERDISPINFO
260 typedef struct _CUVIDPARSERDISPINFO
262 int picture_index; /**< */
263 int progressive_frame; /**< */
264 int top_field_first; /**< */
265 int repeat_first_field; /**< Number of additional fields (1=ivtc, 2=frame doubling, 4=frame tripling, -1=unpaired field) */
266 CUvideotimestamp timestamp; /**< */
267 } CUVIDPARSERDISPINFO;
271 // The parser will call these synchronously from within cuvidParseVideoData(), whenever a picture is ready to
272 // be decoded and/or displayed.
274 typedef int (CUDAAPI *PFNVIDSEQUENCECALLBACK)(void *, CUVIDEOFORMAT *);
275 typedef int (CUDAAPI *PFNVIDDECODECALLBACK)(void *, CUVIDPICPARAMS *);
276 typedef int (CUDAAPI *PFNVIDDISPLAYCALLBACK)(void *, CUVIDPARSERDISPINFO *);
279 * \struct CUVIDPARSERPARAMS
281 typedef struct _CUVIDPARSERPARAMS
283 cudaVideoCodec CodecType; /**< cudaVideoCodec_XXX */
284 unsigned int ulMaxNumDecodeSurfaces; /**< Max # of decode surfaces (parser will cycle through these) */
285 unsigned int ulClockRate; /**< Timestamp units in Hz (0=default=10000000Hz) */
286 unsigned int ulErrorThreshold; /**< % Error threshold (0-100) for calling pfnDecodePicture (100=always call pfnDecodePicture even if picture bitstream is fully corrupted) */
287 unsigned int ulMaxDisplayDelay; /**< Max display queue delay (improves pipelining of decode with display) - 0=no delay (recommended values: 2..4) */
288 unsigned int uReserved1[5]; /**< Reserved for future use - set to 0 */
289 void *pUserData; /**< User data for callbacks */
290 PFNVIDSEQUENCECALLBACK pfnSequenceCallback; /**< Called before decoding frames and/or whenever there is a format change */
291 PFNVIDDECODECALLBACK pfnDecodePicture; /**< Called when a picture is ready to be decoded (decode order) */
292 PFNVIDDISPLAYCALLBACK pfnDisplayPicture; /**< Called whenever a picture is ready to be displayed (display order) */
293 void *pvReserved2[7]; /**< Reserved for future use - set to NULL */
294 CUVIDEOFORMATEX *pExtVideoInfo; /**< [Optional] sequence header data from system layer */
298 * \fn CUresult CUDAAPI cuvidCreateVideoParser(CUvideoparser *pObj, CUVIDPARSERPARAMS *pParams)
300 CUresult CUDAAPI cuvidCreateVideoParser(CUvideoparser *pObj, CUVIDPARSERPARAMS *pParams);
303 * \fn CUresult CUDAAPI cuvidParseVideoData(CUvideoparser obj, CUVIDSOURCEDATAPACKET *pPacket)
305 CUresult CUDAAPI cuvidParseVideoData(CUvideoparser obj, CUVIDSOURCEDATAPACKET *pPacket);
308 * \fn CUresult CUDAAPI cuvidDestroyVideoParser(CUvideoparser obj)
310 CUresult CUDAAPI cuvidDestroyVideoParser(CUvideoparser obj);
312 /** @} */ /* END VIDEO_PARSER */
313 ////////////////////////////////////////////////////////////////////////////////////////////////
315 #if defined(__cplusplus)
317 #endif /* __cplusplus */
319 #endif // __NVCUVID_H__