31fe8858d1
* rocDecode API Tracing support * Test bin file added to rocdecode. Need to add validate python methods * Added option to not make rocDecode tests * Added rocdecode and rocprofv3 tests * Added csv test * Address PR comments. Changed tests to use built-in rocstreambit decoder to remove ffmpeg dependancy. Changed cmake option to disbale tests rather than not build them. Tests work locally, but will fail until rocDecode is built with tracing enabled on CI * Add option to avoid building rocdecode tests * Added option to avoid building rocdecode bin file * Support for rocJPEG API Trace * Added newline to rocjpeg_version.h * json-tool code added, initial test/bin commit * Formatting * Resolved rocjpeg bin test compilation errors * Tests implemented. Perfetto module currently resulting in errors, so need to retest whenever it is fixed * Formatting and compilation errors * Minor fixes * Copyright year update and minor fixes * Doc update fix * Added rocjpeg csv file in data * Addresses review comments: Updated fixed Findroc.. and uses root directory as a hint, fixed documentation error, changed tables to use _CORE, minor style fixes * Added rocdecode and rocjpeg to CI * Removed rocdecode and rocjpeg from CI and added back build tests option * Updated Cmake Files * Added rocDecode and rocJPEG to CI * Remove cmake line added in error * Temporarily modified tests to pass if rocdecode or rocjpeg tracing are not supported for CI, cmake changes * Added find_package for test * Added back use of system rocDecode and rocJPEG, modifies system files to include prefix path * Updated no-link to include INCLUDE_DIR/roc(decode|jpeg), added comments for tests * Resolve merge conflicts and formatting * Added regex find and replace instead of include for CI * VAAPI package causing errors on Vega20 * Removed system rocjpeg and rocdecode use temporarily until cmake issues resolved * Removed workflows regex * Formatting and minor test modification * Modified test for vega20 * Update rocDecode and rocJPEG cmake and tests * Changelog * Fix merge conflict * Added back if-statements around add-tests since cmake-generator-expressions are resulting in errors when the packages are missing * Removed if found statements, replaced with TARGET:EXISTS * Skip json file for rocjpeg and rocdecode tests if not supported * Add os import --------- Co-authored-by: Kandula, Venkateshwar reddy <Venkateshwarreddy.Kandula@amd.com> Co-authored-by: Jonathan R. Madsen <jonathanrmadsen@gmail.com>
340 строки
17 KiB
C
340 строки
17 KiB
C
/*
|
||
Copyright (c) 2024 - 2025 Advanced Micro Devices, Inc. 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.
|
||
*/
|
||
|
||
#pragma once
|
||
|
||
#include <rocprofiler-sdk/rocdecode/details/rocdecode_headers.h>
|
||
|
||
#if ROCPROFILER_SDK_USE_SYSTEM_ROCDECODE > 0
|
||
# include <rocdecode/rocdecode.h>
|
||
#else
|
||
# include <rocprofiler-sdk/rocdecode/details/rocdecode.h>
|
||
#endif
|
||
|
||
/*!
|
||
* \file
|
||
* \brief The AMD rocParser Library.
|
||
*
|
||
* \defgroup group_rocparser rocDecode Parser: AMD ROCm Video Parser API
|
||
* \brief AMD The rocDecode video parser for AMD’s GPUs.
|
||
* \defgroup group_rocdec_struct rocDecode Parser Structs: AMD ROCm Video Parser Structs
|
||
* \brief AMD The rocDecode video parser struct
|
||
*/
|
||
|
||
#if defined(__cplusplus)
|
||
extern "C" {
|
||
#endif /* __cplusplus */
|
||
|
||
/*********************************************************************************/
|
||
//! HANDLE pf rocDecDecoder
|
||
//! Used in subsequent API calls after rocDecCreateDecoder
|
||
/*********************************************************************************/
|
||
|
||
typedef void* RocdecVideoParser;
|
||
typedef uint64_t RocdecTimeStamp;
|
||
|
||
/**
|
||
* @brief ROCDEC_VIDEO_FORMAT struct
|
||
* @ingroup group_rocdec_struct
|
||
* Used in Parser callback API
|
||
*/
|
||
typedef struct
|
||
{
|
||
rocDecVideoCodec codec; /**< OUT: Compression format */
|
||
/**
|
||
* OUT: frame rate = numerator / denominator (for example: 30000/1001)
|
||
*/
|
||
struct
|
||
{
|
||
/**< OUT: frame rate numerator (0 = unspecified or variable frame rate) */
|
||
uint32_t numerator;
|
||
/**< OUT: frame rate denominator (0 = unspecified or variable frame rate) */
|
||
uint32_t denominator;
|
||
} frame_rate;
|
||
uint8_t progressive_sequence; /**< OUT: 0=interlaced, 1=progressive */
|
||
uint8_t bit_depth_luma_minus8; /**< OUT: high bit depth luma. E.g, 2 for 10-bitdepth, 4 for
|
||
12-bitdepth */
|
||
uint8_t bit_depth_chroma_minus8; /**< OUT: high bit depth chroma. E.g, 2 for 10-bitdepth, 4 for
|
||
12-bitdepth */
|
||
uint8_t min_num_decode_surfaces; /**< OUT: Minimum number of decode surfaces to be allocated for
|
||
correct decoding. The client can send this value in
|
||
num_decode_surfaces. This guarantees correct functionality
|
||
and optimal video memory usage but not necessarily the best
|
||
performance, which depends on the design of the overall
|
||
application. The optimal number of decode surfaces (in terms
|
||
of performance and memory utilization) should be decided by
|
||
experimentation for each application, but it cannot go below
|
||
min_num_decode_surfaces. If this value is used for
|
||
num_decode_surfaces then it must be returned to parser
|
||
during sequence callback. */
|
||
uint32_t coded_width; /**< OUT: coded frame width in pixels */
|
||
uint32_t coded_height; /**< OUT: coded frame height in pixels */
|
||
/**
|
||
* 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; /**< OUT: left position of display rect */
|
||
int top; /**< OUT: top position of display rect */
|
||
int right; /**< OUT: right position of display rect */
|
||
int bottom; /**< OUT: bottom position of display rect */
|
||
} display_area;
|
||
|
||
rocDecVideoChromaFormat chroma_format; /**< OUT: Chroma format */
|
||
uint32_t bitrate; /**< OUT: video bitrate (bps, 0=unknown) */
|
||
/**
|
||
* OUT: Display Aspect Ratio = x:y (4:3, 16:9, etc)
|
||
*/
|
||
struct
|
||
{
|
||
int x;
|
||
int y;
|
||
} display_aspect_ratio;
|
||
/**
|
||
* Video Signal Description
|
||
* Refer section E.2.1 (VUI parameters semantics) of H264 spec file
|
||
*/
|
||
struct
|
||
{
|
||
uint8_t video_format : 3; /**< OUT: 0-Component, 1-PAL, 2-NTSC, 3-SECAM, 4-MAC,
|
||
5-Unspecified */
|
||
uint8_t video_full_range_flag : 1; /**< OUT: indicates the black level and luma and chroma
|
||
range */
|
||
uint8_t reserved_zero_bits : 4; /**< Reserved bits */
|
||
uint8_t color_primaries; /**< OUT: chromaticity coordinates of source primaries */
|
||
uint8_t transfer_characteristics; /**< OUT: opto-electronic transfer characteristic of the
|
||
source picture */
|
||
uint8_t matrix_coefficients; /**< OUT: used in deriving luma and chroma signals from RGB
|
||
primaries */
|
||
} video_signal_description;
|
||
uint32_t seqhdr_data_length; /**< OUT: Additional bytes following (RocdecVideoFormatEx) */
|
||
} RocdecVideoFormat;
|
||
|
||
/****************************************************************/
|
||
//! \ingroup group_rocdec_struct
|
||
//! \struct RocdecVideoFormat
|
||
//! Video format including raw sequence header information
|
||
//! Used in rocDecCreateVideoParser API
|
||
/****************************************************************/
|
||
typedef struct
|
||
{
|
||
RocdecVideoFormat format; /**< OUT: RocdecVideoFormat structure */
|
||
uint32_t max_width;
|
||
uint32_t max_height;
|
||
uint8_t raw_seqhdr_data[1024]; /**< OUT: Sequence header data */
|
||
} RocdecVideoFormatEx;
|
||
|
||
/***************************************************************/
|
||
//! \enum RocdecVideoPacketFlags
|
||
//! Data packet flags
|
||
//! Used in RocdecSourceDataPacket structure
|
||
/***************************************************************/
|
||
typedef enum
|
||
{
|
||
ROCDEC_PKT_ENDOFSTREAM = 0x01, /**< Set when this is the last packet for this stream */
|
||
ROCDEC_PKT_TIMESTAMP = 0x02, /**< Timestamp is valid */
|
||
ROCDEC_PKT_DISCONTINUITY = 0x04, /**< Set when a discontinuity has to be signalled */
|
||
ROCDEC_PKT_ENDOFPICTURE =
|
||
0x08, /**< Set when the packet contains exactly one frame or one field */
|
||
ROCDEC_PKT_NOTIFY_EOS =
|
||
0x10, /**< If this flag is set along with ROCDEC_PKT_ENDOFSTREAM, an additional (dummy)
|
||
display callback will be invoked with null value of ROCDECPARSERDISPINFO which
|
||
should be interpreted as end of the stream. */
|
||
} RocdecVideoPacketFlags;
|
||
|
||
/*****************************************************************************/
|
||
//! \ingroup group_rocdec_struct
|
||
//! \struct RocdecSourceDataPacket
|
||
//! Data Packet
|
||
//! Used in rocDecParseVideoData API
|
||
//! IN for rocDecParseVideoData
|
||
/*****************************************************************************/
|
||
typedef struct _RocdecSourceDataPacket
|
||
{
|
||
uint32_t flags; /**< IN: Combination of ROCDEC_PKT_XXX flags */
|
||
uint32_t
|
||
payload_size; /**< IN: number of bytes in the payload (may be zero if EOS flag is set) */
|
||
const uint8_t*
|
||
payload; /**< IN: Pointer to packet payload data (may be NULL if EOS flag is set) */
|
||
RocdecTimeStamp pts; /**< IN: Presentation time stamp (10MHz clock), only valid if
|
||
ROCDEC_PKT_TIMESTAMP flag is set */
|
||
} RocdecSourceDataPacket;
|
||
|
||
/**********************************************************************************/
|
||
/*! \brief Timing Info struct
|
||
* \ingroup group_rocdec_struct
|
||
* \struct RocdecParserDispInfo
|
||
* \Used in rocdecParseVideoData API with PFNVIDDISPLAYCALLBACK pfn_display_picture
|
||
*/
|
||
/**********************************************************************************/
|
||
typedef struct _RocdecParserDispInfo
|
||
{
|
||
int picture_index; /**< OUT: Index of the current picture */
|
||
int progressive_frame; /**< OUT: 1 if progressive frame; 0 otherwise */
|
||
int top_field_first; /**< OUT: 1 if top field is displayed first; 0 otherwise */
|
||
int repeat_first_field; /**< OUT: Number of additional fields (1=ivtc, 2=frame doubling, 4=frame
|
||
tripling, -1=unpaired field) */
|
||
RocdecTimeStamp pts; /**< OUT: Presentation time stamp */
|
||
} RocdecParserDispInfo;
|
||
|
||
/**
|
||
* @brief RocdecOperatingPointInfo struct
|
||
* @ingroup group_rocdec_struct
|
||
* Operating point information of scalable bitstream
|
||
*/
|
||
typedef struct _RocdecOperatingPointInfo
|
||
{
|
||
rocDecVideoCodec codec;
|
||
union
|
||
{
|
||
struct
|
||
{
|
||
uint8_t operating_points_cnt;
|
||
uint8_t reserved24_bits[3];
|
||
uint16_t operating_points_idc[32];
|
||
} av1;
|
||
uint8_t codec_reserved[1024];
|
||
};
|
||
} RocdecOperatingPointInfo;
|
||
|
||
/**********************************************************************************/
|
||
//! \ingroup group_rocdec_struct
|
||
//! \struct RocdecSeiMessage;
|
||
//! Used in RocdecSeiMessageInfo structure
|
||
/**********************************************************************************/
|
||
typedef struct _RocdecSeiMessage
|
||
{
|
||
uint8_t sei_message_type; /**< OUT: SEI Message Type */
|
||
uint8_t reserved[3];
|
||
uint32_t sei_message_size; /**< OUT: SEI Message Size */
|
||
} RocdecSeiMessage;
|
||
|
||
/**********************************************************************************/
|
||
//! \ingroup group_rocdec_struct
|
||
//! \struct RocdecSeiMessageInfo
|
||
//! Used in rocDecParseVideoData API with PFNVIDSEIMSGCALLBACK pfn_get_sei_msg
|
||
/**********************************************************************************/
|
||
typedef struct _RocdecSeiMessageInfo
|
||
{
|
||
void* sei_data; /**< OUT: SEI Message Data */
|
||
RocdecSeiMessage* sei_message; /**< OUT: SEI Message Info */
|
||
uint32_t sei_message_count; /**< OUT: SEI Message Count */
|
||
uint32_t picIdx; /**< OUT: SEI Message Pic Index */
|
||
} RocdecSeiMessageInfo;
|
||
|
||
/**
|
||
* @brief Parser callbacks
|
||
* \ The parser will call these synchronously from within rocDecParseVideoData(), whenever there is
|
||
* sequence change or a picture \ is ready to be decoded and/or displayed. \ Return values from
|
||
* these callbacks are interpreted as below. If the callbacks return failure, it will be propagated
|
||
* by \ rocDecParseVideoData() to the application. \ Parser picks default operating point as 0 and
|
||
* outputAllLayers flag as 0 if PFNVIDOPPOINTCALLBACK is not set or return value is \ -1 or invalid
|
||
* operating point. \ PFNVIDSEQUENCECALLBACK : 0: fail, 1: succeeded, > 1: override dpb size of
|
||
* parser (set by RocdecParserParams::max_num_decode_surfaces \ while creating parser) \
|
||
* PFNVIDDECODECALLBACK : 0: fail, >=1: succeeded \ PFNVIDDISPLAYCALLBACK : 0: fail, >=1:
|
||
* succeeded \ PFNVIDOPPOINTCALLBACK : <0: fail, >=0: succeeded (bit 0-9: OperatingPoint, bit
|
||
* 10-10: outputAllLayers, bit 11-30: reserved) \ PFNVIDSEIMSGCALLBACK : 0: fail, >=1: succeeded
|
||
*/
|
||
typedef int(ROCDECAPI* PFNVIDSEQUENCECALLBACK)(void*, RocdecVideoFormat*);
|
||
typedef int(ROCDECAPI* PFNVIDDECODECALLBACK)(void*, RocdecPicParams*);
|
||
typedef int(ROCDECAPI* PFNVIDDISPLAYCALLBACK)(void*, RocdecParserDispInfo*);
|
||
// typedef int (ROCDECAPI *PFNVIDOPPOINTCALLBACK)(void *, RocdecOperatingPointInfo*); //
|
||
// reserved for future (AV1 specific)
|
||
typedef int(ROCDECAPI* PFNVIDSEIMSGCALLBACK)(void*, RocdecSeiMessageInfo*);
|
||
|
||
/**
|
||
* \brief The AMD rocDecode library.
|
||
* \ingroup group_rocdec_struct
|
||
* \Used in rocDecCreateVideoParser API
|
||
*/
|
||
typedef struct _RocdecParserParams
|
||
{
|
||
rocDecVideoCodec codec_type; /**< IN: rocDecVideoCodec_XXX */
|
||
uint32_t max_num_decode_surfaces; /**< IN: Max # of decode surfaces (parser will cycle through
|
||
these) */
|
||
uint32_t clock_rate; /**< IN: Timestamp units in Hz (0=default=10000000Hz) */
|
||
uint32_t error_threshold; /**< IN: % Error threshold (0-100) for calling pfn_decode_picture
|
||
(100=always IN: call pfn_decode_picture even if picture bitstream
|
||
is fully corrupted) */
|
||
uint32_t max_display_delay; /**< IN: Max display queue delay (improves pipelining of decode with
|
||
display) 0 = no delay (recommended values: 2..4) */
|
||
uint32_t annex_b : 1; /**< IN: AV1 annexB stream */
|
||
uint32_t reserved : 31; /**< Reserved for future use - set to zero */
|
||
uint32_t reserved_1[4]; /**< IN: Reserved for future use - set to 0 */
|
||
void* user_data; /**< IN: User data for callbacks */
|
||
PFNVIDSEQUENCECALLBACK pfn_sequence_callback; /**< IN: Called before decoding frames and/or
|
||
whenever there is a fmt change */
|
||
PFNVIDDECODECALLBACK pfn_decode_picture; /**< IN: Called when a picture is ready to be decoded
|
||
(decode order) */
|
||
PFNVIDDISPLAYCALLBACK pfn_display_picture; /**< IN: Called whenever a picture is ready to be
|
||
displayed (display order) */
|
||
PFNVIDSEIMSGCALLBACK
|
||
pfn_get_sei_msg; /**< IN: Called when all SEI messages are parsed for particular frame */
|
||
void* reserved_2[5]; /**< Reserved for future use - set to NULL */
|
||
RocdecVideoFormatEx*
|
||
ext_video_info; /**< IN: [Optional] sequence header data from system layer */
|
||
} RocdecParserParams;
|
||
|
||
/************************************************************************************************/
|
||
//! \ingroup group_rocparser
|
||
//! \fn rocDecodeStatus ROCDECAPI rocDecCreateVideoParser(RocdecVideoParser *parser_handle,
|
||
//! RocdecParserParams *params) Create video parser object and initialize
|
||
/************************************************************************************************/
|
||
extern rocDecStatus ROCDECAPI
|
||
rocDecCreateVideoParser(RocdecVideoParser* parser_handle, RocdecParserParams* params);
|
||
|
||
/************************************************************************************************/
|
||
//! \ingroup group_rocparser
|
||
//! \fn rocDecodeStatus ROCDECAPI rocDecParseVideoData(RocdecVideoParser parser_handle,
|
||
//! RocdecSourceDataPacket *packet) Parse the video data from source data packet in pPacket Extracts
|
||
//! parameter sets like SPS, PPS, bitstream etc. from pPacket and calls back pfn_decode_picture with
|
||
//! RocdecPicParams data for kicking of HW decoding calls back pfn_sequence_callback with
|
||
//! RocdecVideoFormat data for initial sequence header or when the decoder encounters a video format
|
||
//! change calls back pfn_display_picture with RocdecParserDispInfo data to display a video frame
|
||
/************************************************************************************************/
|
||
extern rocDecStatus ROCDECAPI
|
||
rocDecParseVideoData(RocdecVideoParser parser_handle, RocdecSourceDataPacket* packet);
|
||
|
||
/************************************************************************************************/
|
||
//! \ingroup group_rocparser
|
||
//! \fn rocDecStatus ROCDECAPI rocDecParserMarkFrameForReuse(RocdecVideoParser parser_handle, int
|
||
//! pic_idx) Mark frame with index pic_idx in parser's buffer pool for reuse (means the frame has
|
||
//! been consumed)
|
||
/************************************************************************************************/
|
||
extern rocDecStatus ROCDECAPI
|
||
rocDecParserMarkFrameForReuse(RocdecVideoParser parser_handle, int pic_idx);
|
||
|
||
/************************************************************************************************/
|
||
//! \ingroup group_rocparser
|
||
//! \fn rocDecStatus ROCDECAPI rocDecDestroyVideoParser(RocdecVideoParser parser_handle)
|
||
//! Destroy the video parser object
|
||
/************************************************************************************************/
|
||
extern rocDecStatus ROCDECAPI
|
||
rocDecDestroyVideoParser(RocdecVideoParser parser_handle);
|
||
|
||
#if defined(__cplusplus)
|
||
}
|
||
#endif /* __cplusplus */
|