2016-09-23 11:43:00 +02:00
/*
* 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 cuviddec . h
* NvCuvid API provides Video Decoding interface to NVIDIA GPU devices .
* \ date 2015 - 2016
* This file contains constants , structure definitions and function prototypes used for decoding .
*/
# if !defined(__CUDA_VIDEO_H__)
# define __CUDA_VIDEO_H__
# ifndef __cuda_cuda_h__
# include <cuda.h>
# endif // __cuda_cuda_h__
# if defined(__x86_64) || defined(AMD64) || defined(_M_AMD64)
# if (CUDA_VERSION >= 3020) && (!defined(CUDA_FORCE_API_VERSION) || (CUDA_FORCE_API_VERSION >= 3020))
# define __CUVID_DEVPTR64
# endif
# endif
# if defined(__cplusplus)
extern " C " {
# endif /* __cplusplus */
typedef void * CUvideodecoder ;
typedef struct _CUcontextlock_st * CUvideoctxlock ;
/**
* \ addtogroup VIDEO_DECODER Video Decoder
* @ {
*/
/*!
* \ enum cudaVideoCodec
* Video Codec Enums
*/
typedef enum cudaVideoCodec_enum {
cudaVideoCodec_MPEG1 = 0 , /**< MPEG1 */
cudaVideoCodec_MPEG2 , /**< MPEG2 */
cudaVideoCodec_MPEG4 , /**< MPEG4 */
cudaVideoCodec_VC1 , /**< VC1 */
cudaVideoCodec_H264 , /**< H264 */
cudaVideoCodec_JPEG , /**< JPEG */
cudaVideoCodec_H264_SVC , /**< H264-SVC */
cudaVideoCodec_H264_MVC , /**< H264-MVC */
cudaVideoCodec_HEVC , /**< HEVC */
cudaVideoCodec_VP8 , /**< VP8 */
cudaVideoCodec_VP9 , /**< VP9 */
cudaVideoCodec_NumCodecs , /**< Max COdecs */
// Uncompressed YUV
cudaVideoCodec_YUV420 = ( ( ' I ' < < 24 ) | ( ' Y ' < < 16 ) | ( ' U ' < < 8 ) | ( ' V ' ) ) , /**< Y,U,V (4:2:0) */
cudaVideoCodec_YV12 = ( ( ' Y ' < < 24 ) | ( ' V ' < < 16 ) | ( ' 1 ' < < 8 ) | ( ' 2 ' ) ) , /**< Y,V,U (4:2:0) */
cudaVideoCodec_NV12 = ( ( ' N ' < < 24 ) | ( ' V ' < < 16 ) | ( ' 1 ' < < 8 ) | ( ' 2 ' ) ) , /**< Y,UV (4:2:0) */
cudaVideoCodec_YUYV = ( ( ' Y ' < < 24 ) | ( ' U ' < < 16 ) | ( ' Y ' < < 8 ) | ( ' V ' ) ) , /**< YUYV/YUY2 (4:2:2) */
cudaVideoCodec_UYVY = ( ( ' U ' < < 24 ) | ( ' Y ' < < 16 ) | ( ' V ' < < 8 ) | ( ' Y ' ) ) /**< UYVY (4:2:2) */
} cudaVideoCodec ;
/*!
* \ enum cudaVideoSurfaceFormat
* Video Surface Formats Enums
*/
typedef enum cudaVideoSurfaceFormat_enum {
cudaVideoSurfaceFormat_NV12 = 0 /**< NV12 (currently the only supported output format) */
} cudaVideoSurfaceFormat ;
/*!
* \ enum cudaVideoDeinterlaceMode
* Deinterlacing Modes Enums
*/
typedef enum cudaVideoDeinterlaceMode_enum {
cudaVideoDeinterlaceMode_Weave = 0 , /**< Weave both fields (no deinterlacing) */
cudaVideoDeinterlaceMode_Bob , /**< Drop one field */
cudaVideoDeinterlaceMode_Adaptive /**< Adaptive deinterlacing */
} cudaVideoDeinterlaceMode ;
/*!
* \ enum cudaVideoChromaFormat
* Chroma Formats Enums
*/
typedef enum cudaVideoChromaFormat_enum {
cudaVideoChromaFormat_Monochrome = 0 , /**< MonoChrome */
cudaVideoChromaFormat_420 , /**< 4:2:0 */
cudaVideoChromaFormat_422 , /**< 4:2:2 */
cudaVideoChromaFormat_444 /**< 4:4:4 */
} cudaVideoChromaFormat ;
/*!
* \ enum cudaVideoCreateFlags
* Decoder Flags Enums
*/
typedef enum cudaVideoCreateFlags_enum {
cudaVideoCreate_Default = 0x00 , /**< Default operation mode: use dedicated video engines */
cudaVideoCreate_PreferCUDA = 0x01 , /**< Use a CUDA-based decoder if faster than dedicated engines (requires a valid vidLock object for multi-threading) */
cudaVideoCreate_PreferDXVA = 0x02 , /**< Go through DXVA internally if possible (requires D3D9 interop) */
cudaVideoCreate_PreferCUVID = 0x04 /**< Use dedicated video engines directly */
} cudaVideoCreateFlags ;
/*!
* \ struct CUVIDDECODECREATEINFO
* Struct used in create decoder
*/
typedef struct _CUVIDDECODECREATEINFO
{
unsigned long ulWidth ; /**< Coded Sequence Width */
unsigned long ulHeight ; /**< Coded Sequence Height */
unsigned long ulNumDecodeSurfaces ; /**< Maximum number of internal decode surfaces */
cudaVideoCodec CodecType ; /**< cudaVideoCodec_XXX */
cudaVideoChromaFormat ChromaFormat ; /**< cudaVideoChromaFormat_XXX (only 4:2:0 is currently supported) */
unsigned long ulCreationFlags ; /**< Decoder creation flags (cudaVideoCreateFlags_XXX) */
unsigned long bitDepthMinus8 ;
unsigned long Reserved1 [ 4 ] ; /**< Reserved for future use - set to zero */
/**
* area of the frame that should be displayed
*/
struct {
short left ;
short top ;
short right ;
short bottom ;
} display_area ;
cudaVideoSurfaceFormat OutputFormat ; /**< cudaVideoSurfaceFormat_XXX */
cudaVideoDeinterlaceMode DeinterlaceMode ; /**< cudaVideoDeinterlaceMode_XXX */
unsigned long ulTargetWidth ; /**< Post-processed Output Width (Should be aligned to 2) */
unsigned long ulTargetHeight ; /**< Post-processed Output Height (Should be aligbed to 2) */
unsigned long ulNumOutputSurfaces ; /**< Maximum number of output surfaces simultaneously mapped */
CUvideoctxlock vidLock ; /**< If non-NULL, context lock used for synchronizing ownership of the cuda context */
/**
* target rectangle in the output frame ( for aspect ratio conversion )
* if a null rectangle is specified , { 0 , 0 , ulTargetWidth , ulTargetHeight } will be used
*/
struct {
short left ;
short top ;
short right ;
short bottom ;
} target_rect ;
unsigned long Reserved2 [ 5 ] ; /**< Reserved for future use - set to zero */
} CUVIDDECODECREATEINFO ;
/*!
* \ struct CUVIDH264DPBENTRY
* H .264 DPB Entry
*/
typedef struct _CUVIDH264DPBENTRY
{
int PicIdx ; /**< picture index of reference frame */
int FrameIdx ; /**< frame_num(short-term) or LongTermFrameIdx(long-term) */
int is_long_term ; /**< 0=short term reference, 1=long term reference */
int not_existing ; /**< non-existing reference frame (corresponding PicIdx should be set to -1) */
int used_for_reference ; /**< 0=unused, 1=top_field, 2=bottom_field, 3=both_fields */
int FieldOrderCnt [ 2 ] ; /**< field order count of top and bottom fields */
} CUVIDH264DPBENTRY ;
/*!
* \ struct CUVIDH264MVCEXT
* H .264 MVC Picture Parameters Ext
*/
typedef struct _CUVIDH264MVCEXT
{
int num_views_minus1 ;
int view_id ;
unsigned char inter_view_flag ;
unsigned char num_inter_view_refs_l0 ;
unsigned char num_inter_view_refs_l1 ;
unsigned char MVCReserved8Bits ;
int InterViewRefsL0 [ 16 ] ;
int InterViewRefsL1 [ 16 ] ;
} CUVIDH264MVCEXT ;
/*!
* \ struct CUVIDH264SVCEXT
* H .264 SVC Picture Parameters Ext
*/
typedef struct _CUVIDH264SVCEXT
{
unsigned char profile_idc ;
unsigned char level_idc ;
unsigned char DQId ;
unsigned char DQIdMax ;
unsigned char disable_inter_layer_deblocking_filter_idc ;
unsigned char ref_layer_chroma_phase_y_plus1 ;
signed char inter_layer_slice_alpha_c0_offset_div2 ;
signed char inter_layer_slice_beta_offset_div2 ;
unsigned short DPBEntryValidFlag ;
unsigned char inter_layer_deblocking_filter_control_present_flag ;
unsigned char extended_spatial_scalability_idc ;
unsigned char adaptive_tcoeff_level_prediction_flag ;
unsigned char slice_header_restriction_flag ;
unsigned char chroma_phase_x_plus1_flag ;
unsigned char chroma_phase_y_plus1 ;
unsigned char tcoeff_level_prediction_flag ;
unsigned char constrained_intra_resampling_flag ;
unsigned char ref_layer_chroma_phase_x_plus1_flag ;
unsigned char store_ref_base_pic_flag ;
unsigned char Reserved8BitsA ;
unsigned char Reserved8BitsB ;
// For the 4 scaled_ref_layer_XX fields below,
// if (extended_spatial_scalability_idc == 1), SPS field, G.7.3.2.1.4, add prefix "seq_"
// if (extended_spatial_scalability_idc == 2), SLH field, G.7.3.3.4,
short scaled_ref_layer_left_offset ;
short scaled_ref_layer_top_offset ;
short scaled_ref_layer_right_offset ;
short scaled_ref_layer_bottom_offset ;
unsigned short Reserved16Bits ;
struct _CUVIDPICPARAMS * pNextLayer ; /**< Points to the picparams for the next layer to be decoded. Linked list ends at the target layer. */
int bRefBaseLayer ; /**< whether to store ref base pic */
} CUVIDH264SVCEXT ;
/*!
* \ struct CUVIDH264PICPARAMS
* H .264 Picture Parameters
*/
typedef struct _CUVIDH264PICPARAMS
{
// SPS
int log2_max_frame_num_minus4 ;
int pic_order_cnt_type ;
int log2_max_pic_order_cnt_lsb_minus4 ;
int delta_pic_order_always_zero_flag ;
int frame_mbs_only_flag ;
int direct_8x8_inference_flag ;
int num_ref_frames ; // NOTE: shall meet level 4.1 restrictions
unsigned char residual_colour_transform_flag ;
unsigned char bit_depth_luma_minus8 ; // Must be 0 (only 8-bit supported)
unsigned char bit_depth_chroma_minus8 ; // Must be 0 (only 8-bit supported)
unsigned char qpprime_y_zero_transform_bypass_flag ;
// PPS
int entropy_coding_mode_flag ;
int pic_order_present_flag ;
int num_ref_idx_l0_active_minus1 ;
int num_ref_idx_l1_active_minus1 ;
int weighted_pred_flag ;
int weighted_bipred_idc ;
int pic_init_qp_minus26 ;
int deblocking_filter_control_present_flag ;
int redundant_pic_cnt_present_flag ;
int transform_8x8_mode_flag ;
int MbaffFrameFlag ;
int constrained_intra_pred_flag ;
int chroma_qp_index_offset ;
int second_chroma_qp_index_offset ;
int ref_pic_flag ;
int frame_num ;
int CurrFieldOrderCnt [ 2 ] ;
// DPB
CUVIDH264DPBENTRY dpb [ 16 ] ; // List of reference frames within the DPB
// Quantization Matrices (raster-order)
unsigned char WeightScale4x4 [ 6 ] [ 16 ] ;
unsigned char WeightScale8x8 [ 2 ] [ 64 ] ;
// FMO/ASO
unsigned char fmo_aso_enable ;
unsigned char num_slice_groups_minus1 ;
unsigned char slice_group_map_type ;
signed char pic_init_qs_minus26 ;
unsigned int slice_group_change_rate_minus1 ;
union
{
unsigned long long slice_group_map_addr ;
const unsigned char * pMb2SliceGroupMap ;
} fmo ;
unsigned int Reserved [ 12 ] ;
// SVC/MVC
union
{
CUVIDH264MVCEXT mvcext ;
CUVIDH264SVCEXT svcext ;
} ;
} CUVIDH264PICPARAMS ;
/*!
* \ struct CUVIDMPEG2PICPARAMS
* MPEG - 2 Picture Parameters
*/
typedef struct _CUVIDMPEG2PICPARAMS
{
int ForwardRefIdx ; // Picture index of forward reference (P/B-frames)
int BackwardRefIdx ; // Picture index of backward reference (B-frames)
int picture_coding_type ;
int full_pel_forward_vector ;
int full_pel_backward_vector ;
int f_code [ 2 ] [ 2 ] ;
int intra_dc_precision ;
int frame_pred_frame_dct ;
int concealment_motion_vectors ;
int q_scale_type ;
int intra_vlc_format ;
int alternate_scan ;
int top_field_first ;
// Quantization matrices (raster order)
unsigned char QuantMatrixIntra [ 64 ] ;
unsigned char QuantMatrixInter [ 64 ] ;
} CUVIDMPEG2PICPARAMS ;
////////////////////////////////////////////////////////////////////////////////////////////////
//
// MPEG-4 Picture Parameters
//
// MPEG-4 has VOP types instead of Picture types
# define I_VOP 0
# define P_VOP 1
# define B_VOP 2
# define S_VOP 3
/*!
* \ struct CUVIDMPEG4PICPARAMS
* MPEG - 4 Picture Parameters
*/
typedef struct _CUVIDMPEG4PICPARAMS
{
int ForwardRefIdx ; // Picture index of forward reference (P/B-frames)
int BackwardRefIdx ; // Picture index of backward reference (B-frames)
// VOL
int video_object_layer_width ;
int video_object_layer_height ;
int vop_time_increment_bitcount ;
int top_field_first ;
int resync_marker_disable ;
int quant_type ;
int quarter_sample ;
int short_video_header ;
int divx_flags ;
// VOP
int vop_coding_type ;
int vop_coded ;
int vop_rounding_type ;
int alternate_vertical_scan_flag ;
int interlaced ;
int vop_fcode_forward ;
int vop_fcode_backward ;
int trd [ 2 ] ;
int trb [ 2 ] ;
// Quantization matrices (raster order)
unsigned char QuantMatrixIntra [ 64 ] ;
unsigned char QuantMatrixInter [ 64 ] ;
int gmc_enabled ;
} CUVIDMPEG4PICPARAMS ;
/*!
* \ struct CUVIDVC1PICPARAMS
* VC1 Picture Parameters
*/
typedef struct _CUVIDVC1PICPARAMS
{
int ForwardRefIdx ; /**< Picture index of forward reference (P/B-frames) */
int BackwardRefIdx ; /**< Picture index of backward reference (B-frames) */
int FrameWidth ; /**< Actual frame width */
int FrameHeight ; /**< Actual frame height */
// PICTURE
int intra_pic_flag ; /**< Set to 1 for I,BI frames */
int ref_pic_flag ; /**< Set to 1 for I,P frames */
int progressive_fcm ; /**< Progressive frame */
// SEQUENCE
int profile ;
int postprocflag ;
int pulldown ;
int interlace ;
int tfcntrflag ;
int finterpflag ;
int psf ;
int multires ;
int syncmarker ;
int rangered ;
int maxbframes ;
// ENTRYPOINT
int panscan_flag ;
int refdist_flag ;
int extended_mv ;
int dquant ;
int vstransform ;
int loopfilter ;
int fastuvmc ;
int overlap ;
int quantizer ;
int extended_dmv ;
int range_mapy_flag ;
int range_mapy ;
int range_mapuv_flag ;
int range_mapuv ;
int rangeredfrm ; // range reduction state
} CUVIDVC1PICPARAMS ;
/*!
* \ struct CUVIDJPEGPICPARAMS
* JPEG Picture Parameters
*/
typedef struct _CUVIDJPEGPICPARAMS
{
int Reserved ;
} CUVIDJPEGPICPARAMS ;
/*!
* \ struct CUVIDHEVCPICPARAMS
* HEVC Picture Parameters
*/
typedef struct _CUVIDHEVCPICPARAMS
{
// sps
int pic_width_in_luma_samples ;
int pic_height_in_luma_samples ;
unsigned char log2_min_luma_coding_block_size_minus3 ;
unsigned char log2_diff_max_min_luma_coding_block_size ;
unsigned char log2_min_transform_block_size_minus2 ;
unsigned char log2_diff_max_min_transform_block_size ;
unsigned char pcm_enabled_flag ;
unsigned char log2_min_pcm_luma_coding_block_size_minus3 ;
unsigned char log2_diff_max_min_pcm_luma_coding_block_size ;
unsigned char pcm_sample_bit_depth_luma_minus1 ;
unsigned char pcm_sample_bit_depth_chroma_minus1 ;
unsigned char pcm_loop_filter_disabled_flag ;
unsigned char strong_intra_smoothing_enabled_flag ;
unsigned char max_transform_hierarchy_depth_intra ;
unsigned char max_transform_hierarchy_depth_inter ;
unsigned char amp_enabled_flag ;
unsigned char separate_colour_plane_flag ;
unsigned char log2_max_pic_order_cnt_lsb_minus4 ;
unsigned char num_short_term_ref_pic_sets ;
unsigned char long_term_ref_pics_present_flag ;
unsigned char num_long_term_ref_pics_sps ;
unsigned char sps_temporal_mvp_enabled_flag ;
unsigned char sample_adaptive_offset_enabled_flag ;
unsigned char scaling_list_enable_flag ;
unsigned char IrapPicFlag ;
unsigned char IdrPicFlag ;
unsigned char bit_depth_luma_minus8 ;
unsigned char bit_depth_chroma_minus8 ;
unsigned char reserved1 [ 14 ] ;
// pps
unsigned char dependent_slice_segments_enabled_flag ;
unsigned char slice_segment_header_extension_present_flag ;
unsigned char sign_data_hiding_enabled_flag ;
unsigned char cu_qp_delta_enabled_flag ;
unsigned char diff_cu_qp_delta_depth ;
signed char init_qp_minus26 ;
signed char pps_cb_qp_offset ;
signed char pps_cr_qp_offset ;
unsigned char constrained_intra_pred_flag ;
unsigned char weighted_pred_flag ;
unsigned char weighted_bipred_flag ;
unsigned char transform_skip_enabled_flag ;
unsigned char transquant_bypass_enabled_flag ;
unsigned char entropy_coding_sync_enabled_flag ;
unsigned char log2_parallel_merge_level_minus2 ;
unsigned char num_extra_slice_header_bits ;
unsigned char loop_filter_across_tiles_enabled_flag ;
unsigned char loop_filter_across_slices_enabled_flag ;
unsigned char output_flag_present_flag ;
unsigned char num_ref_idx_l0_default_active_minus1 ;
unsigned char num_ref_idx_l1_default_active_minus1 ;
unsigned char lists_modification_present_flag ;
unsigned char cabac_init_present_flag ;
unsigned char pps_slice_chroma_qp_offsets_present_flag ;
unsigned char deblocking_filter_override_enabled_flag ;
unsigned char pps_deblocking_filter_disabled_flag ;
signed char pps_beta_offset_div2 ;
signed char pps_tc_offset_div2 ;
unsigned char tiles_enabled_flag ;
unsigned char uniform_spacing_flag ;
unsigned char num_tile_columns_minus1 ;
unsigned char num_tile_rows_minus1 ;
unsigned short column_width_minus1 [ 21 ] ;
unsigned short row_height_minus1 [ 21 ] ;
unsigned int reserved3 [ 15 ] ;
// RefPicSets
int NumBitsForShortTermRPSInSlice ;
int NumDeltaPocsOfRefRpsIdx ;
int NumPocTotalCurr ;
int NumPocStCurrBefore ;
int NumPocStCurrAfter ;
int NumPocLtCurr ;
int CurrPicOrderCntVal ;
int RefPicIdx [ 16 ] ; // [refpic] Indices of valid reference pictures (-1 if unused for reference)
int PicOrderCntVal [ 16 ] ; // [refpic]
unsigned char IsLongTerm [ 16 ] ; // [refpic] 0=not a long-term reference, 1=long-term reference
unsigned char RefPicSetStCurrBefore [ 8 ] ; // [0..NumPocStCurrBefore-1] -> refpic (0..15)
unsigned char RefPicSetStCurrAfter [ 8 ] ; // [0..NumPocStCurrAfter-1] -> refpic (0..15)
unsigned char RefPicSetLtCurr [ 8 ] ; // [0..NumPocLtCurr-1] -> refpic (0..15)
unsigned char RefPicSetInterLayer0 [ 8 ] ;
unsigned char RefPicSetInterLayer1 [ 8 ] ;
unsigned int reserved4 [ 12 ] ;
// scaling lists (diag order)
unsigned char ScalingList4x4 [ 6 ] [ 16 ] ; // [matrixId][i]
unsigned char ScalingList8x8 [ 6 ] [ 64 ] ; // [matrixId][i]
unsigned char ScalingList16x16 [ 6 ] [ 64 ] ; // [matrixId][i]
unsigned char ScalingList32x32 [ 2 ] [ 64 ] ; // [matrixId][i]
unsigned char ScalingListDCCoeff16x16 [ 6 ] ; // [matrixId]
unsigned char ScalingListDCCoeff32x32 [ 2 ] ; // [matrixId]
} CUVIDHEVCPICPARAMS ;
/*!
* \ struct CUVIDVP8PICPARAMS
* VP8 Picture Parameters
*/
typedef struct _CUVIDVP8PICPARAMS
{
int width ;
int height ;
unsigned int first_partition_size ;
//Frame Indexes
unsigned char LastRefIdx ;
unsigned char GoldenRefIdx ;
unsigned char AltRefIdx ;
union {
struct {
unsigned char frame_type : 1 ; /**< 0 = KEYFRAME, 1 = INTERFRAME */
unsigned char version : 3 ;
unsigned char show_frame : 1 ;
unsigned char update_mb_segmentation_data : 1 ; /**< Must be 0 if segmentation is not enabled */
unsigned char Reserved2Bits : 2 ;
} ;
unsigned char wFrameTagFlags ;
} ;
unsigned char Reserved1 [ 4 ] ;
unsigned int Reserved2 [ 3 ] ;
} CUVIDVP8PICPARAMS ;
/*!
* \ struct CUVIDVP9PICPARAMS
* VP9 Picture Parameters
*/
typedef struct _CUVIDVP9PICPARAMS
{
unsigned int width ;
unsigned int height ;
//Frame Indices
unsigned char LastRefIdx ;
unsigned char GoldenRefIdx ;
unsigned char AltRefIdx ;
unsigned char colorSpace ;
unsigned short profile : 3 ;
unsigned short frameContextIdx : 2 ;
unsigned short frameType : 1 ;
unsigned short showFrame : 1 ;
unsigned short errorResilient : 1 ;
unsigned short frameParallelDecoding : 1 ;
unsigned short subSamplingX : 1 ;
unsigned short subSamplingY : 1 ;
unsigned short intraOnly : 1 ;
unsigned short allow_high_precision_mv : 1 ;
unsigned short refreshEntropyProbs : 1 ;
unsigned short reserved2Bits : 2 ;
unsigned short reserved16Bits ;
unsigned char refFrameSignBias [ 4 ] ;
unsigned char bitDepthMinus8Luma ;
unsigned char bitDepthMinus8Chroma ;
unsigned char loopFilterLevel ;
unsigned char loopFilterSharpness ;
unsigned char modeRefLfEnabled ;
unsigned char log2_tile_columns ;
unsigned char log2_tile_rows ;
unsigned char segmentEnabled : 1 ;
unsigned char segmentMapUpdate : 1 ;
unsigned char segmentMapTemporalUpdate : 1 ;
unsigned char segmentFeatureMode : 1 ;
unsigned char reserved4Bits : 4 ;
unsigned char segmentFeatureEnable [ 8 ] [ 4 ] ;
short segmentFeatureData [ 8 ] [ 4 ] ;
unsigned char mb_segment_tree_probs [ 7 ] ;
unsigned char segment_pred_probs [ 3 ] ;
unsigned char reservedSegment16Bits [ 2 ] ;
int qpYAc ;
int qpYDc ;
int qpChDc ;
int qpChAc ;
unsigned int activeRefIdx [ 3 ] ;
unsigned int resetFrameContext ;
unsigned int mcomp_filter_type ;
unsigned int mbRefLfDelta [ 4 ] ;
unsigned int mbModeLfDelta [ 2 ] ;
unsigned int frameTagSize ;
unsigned int offsetToDctParts ;
unsigned int reserved128Bits [ 4 ] ;
} CUVIDVP9PICPARAMS ;
/*!
* \ struct CUVIDPICPARAMS
* Picture Parameters for Decoding
*/
typedef struct _CUVIDPICPARAMS
{
int PicWidthInMbs ; /**< Coded Frame Size */
int FrameHeightInMbs ; /**< Coded Frame Height */
int CurrPicIdx ; /**< Output index of the current picture */
int field_pic_flag ; /**< 0=frame picture, 1=field picture */
int bottom_field_flag ; /**< 0=top field, 1=bottom field (ignored if field_pic_flag=0) */
int second_field ; /**< Second field of a complementary field pair */
// Bitstream data
unsigned int nBitstreamDataLen ; /**< Number of bytes in bitstream data buffer */
const unsigned char * pBitstreamData ; /**< Ptr to bitstream data for this picture (slice-layer) */
unsigned int nNumSlices ; /**< Number of slices in this picture */
const unsigned int * pSliceDataOffsets ; /**< nNumSlices entries, contains offset of each slice within the bitstream data buffer */
int ref_pic_flag ; /**< This picture is a reference picture */
int intra_pic_flag ; /**< This picture is entirely intra coded */
unsigned int Reserved [ 30 ] ; /**< Reserved for future use */
// Codec-specific data
union {
CUVIDMPEG2PICPARAMS mpeg2 ; /**< Also used for MPEG-1 */
CUVIDH264PICPARAMS h264 ;
CUVIDVC1PICPARAMS vc1 ;
CUVIDMPEG4PICPARAMS mpeg4 ;
CUVIDJPEGPICPARAMS jpeg ;
CUVIDHEVCPICPARAMS hevc ;
CUVIDVP8PICPARAMS vp8 ;
CUVIDVP9PICPARAMS vp9 ;
unsigned int CodecReserved [ 1024 ] ;
} CodecSpecific ;
} CUVIDPICPARAMS ;
/*!
* \ struct CUVIDPROCPARAMS
* Picture Parameters for Postprocessing
*/
typedef struct _CUVIDPROCPARAMS
{
int progressive_frame ; /**< Input is progressive (deinterlace_mode will be ignored) */
int second_field ; /**< Output the second field (ignored if deinterlace mode is Weave) */
int top_field_first ; /**< Input frame is top field first (1st field is top, 2nd field is bottom) */
int unpaired_field ; /**< Input only contains one field (2nd field is invalid) */
// The fields below are used for raw YUV input
unsigned int reserved_flags ; /**< Reserved for future use (set to zero) */
unsigned int reserved_zero ; /**< Reserved (set to zero) */
unsigned long long raw_input_dptr ; /**< Input CUdeviceptr for raw YUV extensions */
unsigned int raw_input_pitch ; /**< pitch in bytes of raw YUV input (should be aligned appropriately) */
unsigned int raw_input_format ; /**< Reserved for future use (set to zero) */
unsigned long long raw_output_dptr ; /**< Reserved for future use (set to zero) */
unsigned int raw_output_pitch ; /**< Reserved for future use (set to zero) */
unsigned int Reserved [ 48 ] ;
void * Reserved3 [ 3 ] ;
} CUVIDPROCPARAMS ;
/**
*
* In order to minimize decode latencies , there should be always at least 2 pictures in the decode
* queue at any time , in order to make sure that all decode engines are always busy .
*
* Overall data flow :
* - cuvidCreateDecoder ( . . . )
* For each picture :
* - cuvidDecodePicture ( N )
* - cuvidMapVideoFrame ( N - 4 )
* - do some processing in cuda
* - cuvidUnmapVideoFrame ( N - 4 )
* - cuvidDecodePicture ( N + 1 )
* - cuvidMapVideoFrame ( N - 3 )
* . . .
* - cuvidDestroyDecoder ( . . . )
*
* NOTE :
* - When the cuda context is created from a D3D device , the D3D device must also be created
* with the D3DCREATE_MULTITHREADED flag .
* - There is a limit to how many pictures can be mapped simultaneously ( ulNumOutputSurfaces )
* - cuVidDecodePicture may block the calling thread if there are too many pictures pending
* in the decode queue
*/
/**
* \ fn CUresult CUDAAPI cuvidCreateDecoder ( CUvideodecoder * phDecoder , CUVIDDECODECREATEINFO * pdci )
* Create the decoder object
*/
CUresult CUDAAPI cuvidCreateDecoder ( CUvideodecoder * phDecoder , CUVIDDECODECREATEINFO * pdci ) ;
/**
* \ fn CUresult CUDAAPI cuvidDestroyDecoder ( CUvideodecoder hDecoder )
* Destroy the decoder object
*/
CUresult CUDAAPI cuvidDestroyDecoder ( CUvideodecoder hDecoder ) ;
/**
* \ fn CUresult CUDAAPI cuvidDecodePicture ( CUvideodecoder hDecoder , CUVIDPICPARAMS * pPicParams )
* Decode a single picture ( field or frame )
*/
CUresult CUDAAPI cuvidDecodePicture ( CUvideodecoder hDecoder , CUVIDPICPARAMS * pPicParams ) ;
# if !defined(__CUVID_DEVPTR64) || defined(__CUVID_INTERNAL)
/**
* \ fn CUresult CUDAAPI cuvidMapVideoFrame ( CUvideodecoder hDecoder , int nPicIdx , unsigned int * pDevPtr , unsigned int * pPitch , CUVIDPROCPARAMS * pVPP ) ;
* Post - process and map a video frame for use in cuda
*/
CUresult CUDAAPI cuvidMapVideoFrame ( CUvideodecoder hDecoder , int nPicIdx ,
unsigned int * pDevPtr , unsigned int * pPitch ,
CUVIDPROCPARAMS * pVPP ) ;
/**
* \ fn CUresult CUDAAPI cuvidUnmapVideoFrame ( CUvideodecoder hDecoder , unsigned int DevPtr )
* Unmap a previously mapped video frame
*/
CUresult CUDAAPI cuvidUnmapVideoFrame ( CUvideodecoder hDecoder , unsigned int DevPtr ) ;
# endif
# if defined(WIN64) || defined(_WIN64) || defined(__x86_64) || defined(AMD64) || defined(_M_AMD64)
/**
* \ fn CUresult CUDAAPI cuvidMapVideoFrame64 ( CUvideodecoder hDecoder , int nPicIdx , unsigned long long * pDevPtr , unsigned int * pPitch , CUVIDPROCPARAMS * pVPP ) ;
* map a video frame
*/
CUresult CUDAAPI cuvidMapVideoFrame64 ( CUvideodecoder hDecoder , int nPicIdx , unsigned long long * pDevPtr ,
unsigned int * pPitch , CUVIDPROCPARAMS * pVPP ) ;
/**
* \ fn CUresult CUDAAPI cuvidUnmapVideoFrame64 ( CUvideodecoder hDecoder , unsigned long long DevPtr ) ;
* Unmap a previously mapped video frame
*/
CUresult CUDAAPI cuvidUnmapVideoFrame64 ( CUvideodecoder hDecoder , unsigned long long DevPtr ) ;
# if defined(__CUVID_DEVPTR64) && !defined(__CUVID_INTERNAL)
# define cuvidMapVideoFrame cuvidMapVideoFrame64
# define cuvidUnmapVideoFrame cuvidUnmapVideoFrame64
# endif
# endif
/**
*
* Context - locking : to facilitate multi - threaded implementations , the following 4 functions
* provide a simple mutex - style host synchronization . If a non - NULL context is specified
* in CUVIDDECODECREATEINFO , the codec library will acquire the mutex associated with the given
* context before making any cuda calls .
* A multi - threaded application could create a lock associated with a context handle so that
* multiple threads can safely share the same cuda context :
* - use cuCtxPopCurrent immediately after context creation in order to create a ' floating ' context
* that can be passed to cuvidCtxLockCreate .
* - When using a floating context , all cuda calls should only be made within a cuvidCtxLock / cuvidCtxUnlock section .
*
* NOTE : This is a safer alternative to cuCtxPushCurrent and cuCtxPopCurrent , and is not related to video
* decoder in any way ( implemented as a critical section associated with cuCtx { Push | Pop } Current calls ) .
*/
/**
* \ fn CUresult CUDAAPI cuvidCtxLockCreate ( CUvideoctxlock * pLock , CUcontext ctx )
*/
CUresult CUDAAPI cuvidCtxLockCreate ( CUvideoctxlock * pLock , CUcontext ctx ) ;
/**
* \ fn CUresult CUDAAPI cuvidCtxLockDestroy ( CUvideoctxlock lck )
*/
CUresult CUDAAPI cuvidCtxLockDestroy ( CUvideoctxlock lck ) ;
/**
* \ fn CUresult CUDAAPI cuvidCtxLock ( CUvideoctxlock lck , unsigned int reserved_flags )
*/
CUresult CUDAAPI cuvidCtxLock ( CUvideoctxlock lck , unsigned int reserved_flags ) ;
/**
* \ fn CUresult CUDAAPI cuvidCtxUnlock ( CUvideoctxlock lck , unsigned int reserved_flags )
*/
CUresult CUDAAPI cuvidCtxUnlock ( CUvideoctxlock lck , unsigned int reserved_flags ) ;
/** @} */ /* End VIDEO_DECODER */
////////////////////////////////////////////////////////////////////////////////////////////////
# if defined(__cplusplus)
// Auto-lock helper for C++ applications
class CCtxAutoLock
{
private :
CUvideoctxlock m_ctx ;
public :
CCtxAutoLock ( CUvideoctxlock ctx ) ;
~ CCtxAutoLock ( ) ;
} ;
}
# endif /* __cplusplus */
# endif // __CUDA_VIDEO_H__