docs-6.1.0/utils/rocvideodecode/roc_video_dec.h Source File

docs-6.1.0/utils/rocvideodecode/roc_video_dec.h Source File#

rocDecode: docs-6.1.0/utils/rocvideodecode/roc_video_dec.h Source File
roc_video_dec.h
Go to the documentation of this file.
1 /*
2 Copyright (c) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
3 
4 Permission is hereby granted, free of charge, to any person obtaining a copy
5 of this software and associated documentation files (the "Software"), to deal
6 in the Software without restriction, including without limitation the rights
7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 copies of the Software, and to permit persons to whom the Software is
9 furnished to do so, subject to the following conditions:
10 
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
13 
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 THE SOFTWARE.
21 */
22 
23 #pragma once
24 
25 #include <assert.h>
26 #include <stdint.h>
27 #include <mutex>
28 #include <vector>
29 #include <string>
30 #include <iostream>
31 #include <sstream>
32 #include <string.h>
33 #include <queue>
34 #include <stdexcept>
35 #include <exception>
36 #include <cstring>
37 #include <hip/hip_runtime.h>
38 extern "C" {
39 #include "libavutil/md5.h"
40 #include "libavutil/mem.h"
41 }
42 #include "rocdecode.h"
43 #include "rocparser.h"
44 
53 #define MAX_FRAME_NUM 16
54 typedef int (ROCDECAPI *PFNRECONFIGUEFLUSHCALLBACK)(void *, uint32_t, void *);
55 
56 typedef enum SeiAvcHevcPayloadType_enum {
57  SEI_TYPE_TIME_CODE = 136,
58  SEI_TYPE_USER_DATA_UNREGISTERED = 5
59 } SeiAvcHevcPayloadType;
60 
66 } OutputSurfaceMemoryType;
67 
68 #define TOSTR(X) std::to_string(static_cast<int>(X))
69 #define STR(X) std::string(X)
70 
71 #if DBGINFO
72 #define INFO(X) std::clog << "[INF] " << " {" << __func__ <<"} " << " " << X << std::endl;
73 #else
74 #define INFO(X) ;
75 #endif
76 #define ERR(X) std::cerr << "[ERR] " << " {" << __func__ <<"} " << " " << X << std::endl;
77 
78 
79 class RocVideoDecodeException : public std::exception {
80 public:
81 
82  explicit RocVideoDecodeException(const std::string& message, const int err_code):_message(message), _err_code(err_code) {}
83  explicit RocVideoDecodeException(const std::string& message):_message(message), _err_code(-1) {}
84  virtual const char* what() const throw() override {
85  return _message.c_str();
86  }
87  int Geterror_code() const { return _err_code; }
88 private:
89  std::string _message;
90  int _err_code;
91 };
92 
93 #define ROCDEC_THROW(X, CODE) throw RocVideoDecodeException(" { " + std::string(__func__) + " } " + X , CODE);
94 #define THROW(X) throw RocVideoDecodeException(" { " + std::string(__func__) + " } " + X);
95 
96 #define ROCDEC_API_CALL( rocDecAPI ) \
97  do { \
98  rocDecStatus error_code = rocDecAPI; \
99  if( error_code != ROCDEC_SUCCESS) { \
100  std::ostringstream error_log; \
101  error_log << #rocDecAPI << " returned " << rocDecGetErrorName(error_code) << " at " <<__FILE__ <<":" << __LINE__;\
102  ROCDEC_THROW(error_log.str(), error_code); \
103  } \
104  } while (0)
105 
106 #define HIP_API_CALL( call ) \
107  do { \
108  hipError_t hip_status = call; \
109  if (hip_status != hipSuccess) { \
110  const char *sz_err_name = NULL; \
111  sz_err_name = hipGetErrorName(hip_status); \
112  std::ostringstream error_log; \
113  error_log << "hip API error " << sz_err_name ; \
114  ROCDEC_THROW(error_log.str(), hip_status); \
115  } \
116  } \
117  while (0)
118 
119 
120 struct Rect {
121  int l, t, r, b;
122 };
123 
124 static inline int align(int value, int alignment) {
125  return (value + alignment - 1) & ~(alignment - 1);
126 }
127 
128 typedef struct DecFrameBuffer_ {
129  uint8_t *frame_ptr;
130  int64_t pts;
133 
134 
135 typedef struct OutputSurfaceInfoType {
136  uint32_t output_width;
137  uint32_t output_height;
138  uint32_t output_pitch;
139  uint32_t output_vstride;
140  uint32_t bytes_per_pixel;
141  uint32_t bit_depth;
142  uint32_t num_chroma_planes;
144  rocDecVideoSurfaceFormat surface_format;
145  OutputSurfaceMemoryType mem_type;
147 
148 typedef struct ReconfigParams_t {
149  PFNRECONFIGUEFLUSHCALLBACK p_fn_reconfigure_flush;
150  void *p_reconfig_user_struct;
151  uint32_t reconfig_flush_mode;
153 
154 int GetEnvVar(const char *name, int &dev_count);
155 
157  public:
174  RocVideoDecoder(int device_id, OutputSurfaceMemoryType out_mem_type, rocDecVideoCodec codec, bool force_zero_latency = false,
175  const Rect *p_crop_rect = nullptr, bool extract_user_SEI_Message = false, int max_width = 0, int max_height = 0,
176  uint32_t clk_rate = 1000);
177  ~RocVideoDecoder();
178 
179  rocDecVideoCodec GetCodecId() { return codec_id_; }
180 
181  hipStream_t GetStream() {return hip_stream_;}
182 
186  uint32_t GetWidth() { assert(disp_width_); return disp_width_;}
187 
191  int GetDecodeWidth() { assert(coded_width_); return coded_width_; }
192 
196  uint32_t GetHeight() { assert(disp_height_); return disp_height_; }
197 
201  int GetChromaHeight() { assert(chroma_height_); return chroma_height_; }
202 
206  int GetNumChromaPlanes() { assert(num_chroma_planes_); return num_chroma_planes_; }
207 
211  int GetFrameSize() { assert(disp_width_); return disp_width_ * (disp_height_ + (chroma_height_ * num_chroma_planes_)) * byte_per_pixel_; }
212 
216  int GetFrameSizePitched() { assert(surface_stride_); return surface_stride_ * (disp_height_ + (chroma_height_ * num_chroma_planes_)); }
217 
223  uint32_t GetBitDepth() { assert(bitdepth_minus_8_); return (bitdepth_minus_8_ + 8); }
224  uint32_t GetBytePerPixel() { assert(byte_per_pixel_); return byte_per_pixel_; }
228  size_t GetSurfaceSize() { assert(surface_size_); return surface_size_; }
229  uint32_t GetSurfaceStride() { assert(surface_stride_); return surface_stride_; }
230  //RocDecImageFormat GetSubsampling() { return subsampling_; }
237  const char *GetCodecFmtName(rocDecVideoCodec codec_id);
238 
245  const char *GetSurfaceFmtName(rocDecVideoSurfaceFormat surface_format_id);
246 
255 
263  bool SetReconfigParams(ReconfigParams *p_reconfig_params);
273  int DecodeFrame(const uint8_t *data, size_t size, int pkt_flags, int64_t pts = 0);
278  uint8_t* GetFrame(int64_t *pts);
279 
288  bool ReleaseFrame(int64_t pTimestamp, bool b_flushing = false);
289 
298  //void SaveImage(std::string output_file_name, void* dev_mem, OutputImageInfo* image_info, bool is_output_RGB = 0);
299 
309  void GetDeviceinfo(std::string &device_name, std::string &gcn_arch_name, int &pci_bus_id, int &pci_domain_id, int &pci_device_id);
310 
318  void SaveFrameToFile(std::string output_file_name, void *surf_mem, OutputSurfaceInfo *surf_info);
319 
323  void InitMd5();
324 
331  void UpdateMd5ForFrame(void *surf_mem, OutputSurfaceInfo *surf_info);
332 
338  void FinalizeMd5(uint8_t **digest);
344  int32_t GetNumOfFlushedFrames() { return num_frames_flushed_during_reconfig_;}
345 
346  private:
347  int decoder_session_id_; // Decoder session identifier. Used to gather session level stats.
351  static int ROCDECAPI HandleVideoSequenceProc(void *p_user_data, RocdecVideoFormat *p_video_format) { return ((RocVideoDecoder *)p_user_data)->HandleVideoSequence(p_video_format); }
352 
356  static int ROCDECAPI HandlePictureDecodeProc(void *p_user_data, RocdecPicParams *p_pic_params) { return ((RocVideoDecoder *)p_user_data)->HandlePictureDecode(p_pic_params); }
357 
361  static int ROCDECAPI HandlePictureDisplayProc(void *p_user_data, RocdecParserDispInfo *p_disp_info) { return ((RocVideoDecoder *)p_user_data)->HandlePictureDisplay(p_disp_info); }
362 
366  static int ROCDECAPI HandleSEIMessagesProc(void *p_user_data, RocdecSeiMessageInfo *p_sei_message_info) { return ((RocVideoDecoder *)p_user_data)->GetSEIMessage(p_sei_message_info); }
367 
372  int HandleVideoSequence(RocdecVideoFormat *p_video_format);
373 
378  int HandlePictureDecode(RocdecPicParams *p_pic_params);
379 
384  int HandlePictureDisplay(RocdecParserDispInfo *p_disp_info);
388  int GetSEIMessage(RocdecSeiMessageInfo *p_sei_message_info);
389 
393  int ReconfigureDecoder(RocdecVideoFormat *p_video_format);
394 
401  bool ReleaseInternalFrames();
402 
407  bool InitHIP(int device_id);
408 
409  int num_devices_;
410  int device_id_;
411  RocdecVideoParser rocdec_parser_ = nullptr;
412  rocDecDecoderHandle roc_decoder_ = nullptr;
413  OutputSurfaceMemoryType out_mem_type_ = OUT_SURFACE_MEM_DEV_INTERNAL;
414  bool b_extract_sei_message_ = false;
415  bool b_force_zero_latency_ = false;
416  ReconfigParams *p_reconfig_params_ = nullptr;
417  int32_t num_frames_flushed_during_reconfig_ = 0;
418  hipDeviceProp_t hip_dev_prop_;
419  hipStream_t hip_stream_;
420  rocDecVideoCodec codec_id_ = rocDecVideoCodec_NumCodecs;
421  rocDecVideoChromaFormat video_chroma_format_ = rocDecVideoChromaFormat_420;
422  rocDecVideoSurfaceFormat video_surface_format_ = rocDecVideoSurfaceFormat_NV12;
423  RocdecVideoFormat video_format_ = {};
424  RocdecSeiMessageInfo *curr_sei_message_ptr_ = nullptr;
425  RocdecSeiMessageInfo sei_message_display_q_[MAX_FRAME_NUM];
426  int decoded_frame_cnt_ = 0, decoded_frame_cnt_ret_ = 0;
427  int decode_poc_ = 0, pic_num_in_dec_order_[MAX_FRAME_NUM];
428  int num_alloced_frames_ = 0;
429  std::ostringstream input_video_info_str_;
430  int bitdepth_minus_8_ = 0;
431  uint32_t byte_per_pixel_ = 1;
432  uint32_t coded_width_ = 0;
433  uint32_t disp_width_ = 0;
434  uint32_t coded_height_ = 0;
435  uint32_t disp_height_ = 0;
436  int max_width_ = 0, max_height_ = 0;
437  uint32_t chroma_height_ = 0;
438  uint32_t num_chroma_planes_ = 0;
439  uint32_t num_components_ = 0;
440  uint32_t surface_stride_ = 0;
441  uint32_t surface_vstride_ = 0, chroma_vstride_ = 0; // vertical stride between planes: used when using internal dev memory
442  size_t surface_size_ = 0;
443  OutputSurfaceInfo output_surface_info_ = {};
444  std::mutex mtx_vp_frame_;
445  std::vector<DecFrameBuffer> vp_frames_; // vector of decoded frames
446  std::queue<DecFrameBuffer> vp_frames_q_;
447  Rect disp_rect_ = {};
448  Rect crop_rect_ = {};
449  FILE *fp_sei_ = NULL;
450  FILE *fp_out_ = NULL;
451  struct AVMD5 *md5_ctx_;
452  uint8_t md5_digest_[16];
453  bool is_decoder_reconfigured_ = false;
454  std::string current_output_filename = "";
455  uint32_t extra_output_file_count_ = 0;
456 };
Definition: roc_video_dec.h:79
Definition: roc_video_dec.h:156
int GetFrameSize()
This function is used to get the current frame size based on pixel format.
Definition: roc_video_dec.h:211
uint8_t * GetFrame(int64_t *pts)
This function returns a decoded frame and timestamp. This should be called in a loop fetching all the...
int32_t GetNumOfFlushedFrames()
Get the Num Of Flushed Frames from video decoder object.
Definition: roc_video_dec.h:344
const char * GetCodecFmtName(rocDecVideoCodec codec_id)
Get the name of the output format.
uint32_t GetWidth()
Get the output frame width.
Definition: roc_video_dec.h:186
int GetNumChromaPlanes()
This function is used to get the number of chroma planes.
Definition: roc_video_dec.h:206
void InitMd5()
Helper function to start MD5 calculation.
int GetChromaHeight()
This function is used to get the current chroma height.
Definition: roc_video_dec.h:201
uint32_t GetHeight()
Get the output frame height.
Definition: roc_video_dec.h:196
RocVideoDecoder(int device_id, OutputSurfaceMemoryType out_mem_type, rocDecVideoCodec codec, bool force_zero_latency=false, const Rect *p_crop_rect=nullptr, bool extract_user_SEI_Message=false, int max_width=0, int max_height=0, uint32_t clk_rate=1000)
Construct a new Roc Video Decoder object.
bool SetReconfigParams(ReconfigParams *p_reconfig_params)
Function to set the Reconfig Params object.
uint32_t GetBitDepth()
Get the Bit Depth and BytesPerPixel associated with the pixel format.
Definition: roc_video_dec.h:223
int GetFrameSizePitched()
This function is used to get the current frame size based on pitch.
Definition: roc_video_dec.h:216
bool ReleaseFrame(int64_t pTimestamp, bool b_flushing=false)
function to release frame after use by the application: Only used with "OUT_SURFACE_MEM_DEV_INTERNAL"
void GetDeviceinfo(std::string &device_name, std::string &gcn_arch_name, int &pci_bus_id, int &pci_domain_id, int &pci_device_id)
utility function to save image to a file
const char * GetSurfaceFmtName(rocDecVideoSurfaceFormat surface_format_id)
function to return the name from surface_format_id
void SaveFrameToFile(std::string output_file_name, void *surf_mem, OutputSurfaceInfo *surf_info)
Helper function to dump decoded output surface to file.
bool GetOutputSurfaceInfo(OutputSurfaceInfo **surface_info)
Get the pointer to the Output Image Info.
int DecodeFrame(const uint8_t *data, size_t size, int pkt_flags, int64_t pts=0)
this function decodes a frame and returns the number of frames avalable for display
size_t GetSurfaceSize()
Functions to get the output surface attributes.
Definition: roc_video_dec.h:228
void UpdateMd5ForFrame(void *surf_mem, OutputSurfaceInfo *surf_info)
Helper function to dump decoded output surface to file.
void FinalizeMd5(uint8_t **digest)
Helper function to complete MD5 calculation.
int GetDecodeWidth()
This function is used to get the actual decode width.
Definition: roc_video_dec.h:191
OutputSurfaceMemoryType_enum
Definition: roc_video_dec.h:61
@ OUT_SURFACE_MEM_HOST_COPIED
Definition: roc_video_dec.h:64
@ OUT_SURFACE_MEM_DEV_COPIED
Definition: roc_video_dec.h:63
@ OUT_SURFACE_MEM_DEV_INTERNAL
Definition: roc_video_dec.h:62
@ OUT_SURFACE_MEM_NOT_MAPPED
Definition: roc_video_dec.h:65
The AMD rocDecode Library.
@ rocDecVideoCodec_NumCodecs
Definition: rocdecode.h:88
@ rocDecVideoSurfaceFormat_NV12
Definition: rocdecode.h:104
void * rocDecDecoderHandle
Definition: rocdecode.h:52
@ rocDecVideoChromaFormat_420
Definition: rocdecode.h:120
The AMD rocParser Library.
void * RocdecVideoParser
Definition: rocparser.h:46
Definition: roc_video_dec.h:128
uint8_t * frame_ptr
Definition: roc_video_dec.h:129
int picture_index
Definition: roc_video_dec.h:131
int64_t pts
Definition: roc_video_dec.h:130
Definition: roc_video_dec.h:135
uint32_t output_vstride
Definition: roc_video_dec.h:139
uint32_t output_pitch
Definition: roc_video_dec.h:138
uint32_t output_height
Definition: roc_video_dec.h:137
uint64_t output_surface_size_in_bytes
Definition: roc_video_dec.h:143
uint32_t num_chroma_planes
Definition: roc_video_dec.h:142
uint32_t bit_depth
Definition: roc_video_dec.h:141
uint32_t bytes_per_pixel
Definition: roc_video_dec.h:140
rocDecVideoSurfaceFormat surface_format
Definition: roc_video_dec.h:144
uint32_t output_width
Definition: roc_video_dec.h:136
OutputSurfaceMemoryType mem_type
Definition: roc_video_dec.h:145
Definition: roc_video_dec.h:148
Definition: roc_video_dec.h:120
Timing Info struct\Used in rocdecParseVideoData API with PFNVIDDISPLAYCALLBACK pfn_display_picture.
ROCDEC_VIDEO_FORMAT structUsed in Parser callback API.
Definition: rocparser.h:54
Definition: rocdecode.h:797