From cb7b2c7f2feb8d2b6573eccf80762d50744d6292 Mon Sep 17 00:00:00 2001 From: Lakshmi Kumar Date: Wed, 6 Nov 2024 11:45:34 -0800 Subject: [PATCH] set disp_delay to 1 for all samples (#446) --- samples/videoDecodeBatch/videodecodebatch.cpp | 37 ++++++++++++------- samples/videoDecodeMem/videodecodemem.cpp | 13 ++++++- .../videodecodemultifiles.cpp | 9 ++++- samples/videoDecodeRGB/videodecrgb.cpp | 14 ++++++- samples/videoToSequence/videotosequence.cpp | 20 +++++++--- 5 files changed, 69 insertions(+), 24 deletions(-) diff --git a/samples/videoDecodeBatch/videodecodebatch.cpp b/samples/videoDecodeBatch/videodecodebatch.cpp index 630a2b117c..115994f92d 100644 --- a/samples/videoDecodeBatch/videodecodebatch.cpp +++ b/samples/videoDecodeBatch/videodecodebatch.cpp @@ -160,11 +160,13 @@ void ShowHelpAndExit(const char *option = NULL) { << "-t Number of threads ( 1 >= n_thread <= 64) - optional; default: 4" << std::endl << "-d Device ID (>= 0) - optional; default: 0" << std::endl << "-o Directory for output YUV files - optional" << std::endl - << "-m output_surface_memory_type - decoded surface memory; optional; default - 3" << std::endl; + << "-m output_surface_memory_type - decoded surface memory; optional; default - 3" + << " [0 : OUT_SURFACE_MEM_DEV_INTERNAL/ 1 : OUT_SURFACE_MEM_DEV_COPIED/ 2 : OUT_SURFACE_MEM_HOST_COPIED/ 3 : OUT_SURFACE_MEM_NOT_MAPPED]" << std::endl + << "-disp_delay -specify the number of frames to be delayed for display; optional; default: 1" << std::endl; exit(0); } -void ParseCommandLine(std::string &input_folder_path, std::string &output_folder_path, int &device_id, int &n_thread, bool &b_dump_output_frames, OutputSurfaceMemoryType &mem_type, int argc, char *argv[]) { +void ParseCommandLine(std::string &input_folder_path, std::string &output_folder_path, int &device_id, int &n_thread, bool &b_dump_output_frames, OutputSurfaceMemoryType &mem_type, int &disp_delay, int argc, char *argv[]) { // Parse command-line arguments if(argc <= 1) { ShowHelpAndExit(); @@ -226,6 +228,13 @@ void ParseCommandLine(std::string &input_folder_path, std::string &output_folder mem_type = static_cast(atoi(argv[i])); continue; } + if (!strcmp(argv[i], "-disp_delay")) { + if (++i == argc) { + ShowHelpAndExit("-disp_delay"); + } + disp_delay = atoi(argv[i]); + continue; + } ShowHelpAndExit(argv[i]); } } @@ -235,11 +244,13 @@ int main(int argc, char **argv) { std::string input_folder_path, output_folder_path; int device_id = 0, num_files = 0; int n_thread = 4; + int disp_delay = 1; Rect *p_crop_rect = nullptr; + bool b_extract_sei_messages = false; OutputSurfaceMemoryType mem_type = OUT_SURFACE_MEM_DEV_INTERNAL; // set to decode only for performance bool b_force_zero_latency = false, b_dump_output_frames = false; std::vector input_file_names; - ParseCommandLine(input_folder_path, output_folder_path, device_id, n_thread, b_dump_output_frames, mem_type, argc, argv); + ParseCommandLine(input_folder_path, output_folder_path, device_id, n_thread, b_dump_output_frames, mem_type, disp_delay, argc, argv); try { #if __cplusplus >= 201703L && __has_include() @@ -340,21 +351,21 @@ int main(int argc, char **argv) { v_dec_info[i]->bit_depth = v_demuxer[i]->GetBitDepth(); if (v_dec_info[i]->bit_depth == 8) { if (v_dec_info[i]->rocdec_codec_id == rocDecVideoCodec_AVC) { - std::unique_ptr dec_8bit_avc(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_8bit_avc(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[i]->viddec = std::move(dec_8bit_avc); } else if (v_dec_info[i]->rocdec_codec_id == rocDecVideoCodec_HEVC) { - std::unique_ptr dec_8bit_hevc(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_8bit_hevc(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[i]->viddec = std::move(dec_8bit_hevc); } else if (v_dec_info[i]->rocdec_codec_id == rocDecVideoCodec_AV1) { - std::unique_ptr dec_8bit_av1(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_8bit_av1(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[i]->viddec = std::move(dec_8bit_av1); } } else { //bit depth = 10bit if (v_dec_info[i]->rocdec_codec_id == rocDecVideoCodec_HEVC) { - std::unique_ptr dec_10bit_hevc(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_10bit_hevc(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[i]->viddec = std::move(dec_10bit_hevc); } else if (v_dec_info[i]->rocdec_codec_id == rocDecVideoCodec_AV1) { - std::unique_ptr dec_10bit_av1(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_10bit_av1(new RocVideoDecoder(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[i]->viddec = std::move(dec_10bit_av1); } } @@ -380,13 +391,13 @@ int main(int argc, char **argv) { if (v_dec_info[thread_idx]->bit_depth != bit_depth || v_dec_info[thread_idx]->rocdec_codec_id != codec_id) { if (bit_depth == 8) { // can be HEVC or H.264 or AV1 if (dec_8bit_avc == nullptr && codec_id == rocDecVideoCodec_AVC) { - std::unique_ptr dec_8bit_avc(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_8bit_avc(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[thread_idx]->viddec = std::move(dec_8bit_avc); } else if (dec_8bit_hevc == nullptr && codec_id == rocDecVideoCodec_HEVC) { - std::unique_ptr dec_8bit_hevc(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_8bit_hevc(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[thread_idx]->viddec = std::move(dec_8bit_hevc); } else if (dec_8bit_av1 == nullptr && codec_id == rocDecVideoCodec_AV1) { - std::unique_ptr dec_8bit_av1(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_8bit_av1(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[thread_idx]->viddec = std::move(dec_8bit_av1); } else { if (codec_id == rocDecVideoCodec_AVC) { @@ -401,10 +412,10 @@ int main(int argc, char **argv) { v_dec_info[thread_idx]->rocdec_codec_id = codec_id; } else { // bit_depth = 10bit; HEVC or AV1 if (dec_10bit_hevc == nullptr && codec_id == rocDecVideoCodec_HEVC) { - std::unique_ptr dec_10bit_hevc(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_10bit_hevc(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[thread_idx]->viddec = std::move(dec_10bit_hevc); } else if (dec_10bit_av1 == nullptr && codec_id == rocDecVideoCodec_AV1) { - std::unique_ptr dec_10bit_av1(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect)); + std::unique_ptr dec_10bit_av1(new RocVideoDecoder(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay)); v_dec_info[thread_idx]->viddec = std::move(dec_10bit_av1); } else { if (codec_id == rocDecVideoCodec_HEVC) { diff --git a/samples/videoDecodeMem/videodecodemem.cpp b/samples/videoDecodeMem/videodecodemem.cpp index 453680d9f9..8df099b958 100644 --- a/samples/videoDecodeMem/videodecodemem.cpp +++ b/samples/videoDecodeMem/videodecodemem.cpp @@ -77,7 +77,8 @@ void ShowHelpAndExit(const char *option = NULL) { << "-md5_check MD5 File Path - generate MD5 message digest on the decoded YUV image sequence and compare to the reference MD5 string in a file; optional;" << std::endl << "-crop crop rectangle for output (not used when using interopped decoded frame); optional; default: 0" << std::endl << "-m output_surface_memory_type - decoded surface memory; optional; default - 0" - << " [0 : OUT_SURFACE_MEM_DEV_INTERNAL/ 1 : OUT_SURFACE_MEM_DEV_COPIED/ 2 : OUT_SURFACE_MEM_HOST_COPIED/ 3 : OUT_SURFACE_MEM_NOT_MAPPED]" << std::endl; + << " [0 : OUT_SURFACE_MEM_DEV_INTERNAL/ 1 : OUT_SURFACE_MEM_DEV_COPIED/ 2 : OUT_SURFACE_MEM_HOST_COPIED/ 3 : OUT_SURFACE_MEM_NOT_MAPPED]" << std::endl + << "-disp_delay -specify the number of frames to be delayed for display; optional; default: 1" << std::endl; exit(0); } @@ -91,6 +92,7 @@ int main(int argc, char **argv) { bool b_extract_sei_messages = false; bool b_generate_md5 = false; bool b_md5_check = false; + int disp_delay = 1; Rect crop_rect = {}; Rect *p_crop_rect = nullptr; OutputSurfaceMemoryType mem_type = OUT_SURFACE_MEM_DEV_INTERNAL; // set to internal @@ -172,13 +174,20 @@ int main(int argc, char **argv) { mem_type = static_cast(atoi(argv[i])); continue; } + if (!strcmp(argv[i], "-disp_delay")) { + if (++i == argc) { + ShowHelpAndExit("-disp_delay"); + } + disp_delay = atoi(argv[i]); + continue; + } ShowHelpAndExit(argv[i]); } try { FileStreamProvider stream_provider(input_file_path.c_str()); VideoDemuxer demuxer(&stream_provider); rocDecVideoCodec rocdec_codec_id = AVCodec2RocDecVideoCodec(demuxer.GetCodecID()); - RocVideoDecoder viddec(device_id, mem_type, rocdec_codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages); + RocVideoDecoder viddec(device_id, mem_type, rocdec_codec_id, b_force_zero_latency, p_crop_rect, b_extract_sei_messages, disp_delay); if(!viddec.CodecSupported(device_id, rocdec_codec_id, demuxer.GetBitDepth())) { std::cerr << "GPU doesn't support codec!" << std::endl; return 0; diff --git a/samples/videoDecodeMultiFiles/videodecodemultifiles.cpp b/samples/videoDecodeMultiFiles/videodecodemultifiles.cpp index 4d63a6437f..6c9d1587f6 100644 --- a/samples/videoDecodeMultiFiles/videodecodemultifiles.cpp +++ b/samples/videoDecodeMultiFiles/videodecodemultifiles.cpp @@ -50,6 +50,7 @@ typedef struct { Rect *p_crop_rect; int dump_output_frames; OutputSurfaceMemoryType mem_type; // set to internal + int disp_delay; } FileInfo; void ShowHelpAndExit(const char *option = NULL) { @@ -63,6 +64,7 @@ void ShowHelpAndExit(const char *option = NULL) { << "crop l,t,r,b (crop rectangle for output (not used when using interopped decoded frame); default: 0)" << std::endl << "m 0 decoded surface memory; optional; default - 0 [0 : OUT_SURFACE_MEM_DEV_INTERNAL/ 1 : OUT_SURFACE_MEM_DEV_COPIED/ 2 : OUT_SURFACE_MEM_HOST_COPIED/ 3 : OUT_SURFACE_MEM_NOT_MAPPED]" << std::endl << "flush 1 flush last frames during reconfig; optional; default - 1 [1 : Flush last frames during reconfig 0 : Discard last frames during reconfigure ]" << std::endl + << "-disp_delay -specify the number of frames to be delayed for display; optional; default: 1" << std::endl << "infile input2.[mp4/mov...]" << std::endl << "outfile output2.yuv" << std::endl << "...." << std::endl @@ -134,6 +136,7 @@ void ParseCommandLine(std::deque *multi_file_data, int &device_id, boo file_data.crop_rect = {0, 0, 0, 0}; file_data.p_crop_rect = nullptr; file_data.mem_type = OUT_SURFACE_MEM_DEV_INTERNAL; + file_data.disp_delay = 1; } else if (!strcmp(param, "outfile")) { file_data.out_file = value; file_data.dump_output_frames = 1; @@ -152,6 +155,8 @@ void ParseCommandLine(std::deque *multi_file_data, int &device_id, boo file_data.p_crop_rect = &file_data.crop_rect; } else if (!strcmp(param, "m")) { file_data.mem_type = static_cast(atoi(value)); + } else if (!strcmp(param, "disp_delay")) { + file_data.disp_delay = atoi(value); } } if (file_idx > 0) { @@ -186,10 +191,10 @@ int main(int argc, char **argv) { } if (use_reconfigure) { if (!viddec) { - viddec = new RocVideoDecoder(device_id, file_data.mem_type, rocdec_codec_id, file_data.b_force_zero_latency, file_data.p_crop_rect, file_data.b_extract_sei_messages); + viddec = new RocVideoDecoder(device_id, file_data.mem_type, rocdec_codec_id, file_data.b_force_zero_latency, file_data.p_crop_rect, file_data.b_extract_sei_messages, file_data.disp_delay); } } else { - viddec = new RocVideoDecoder(device_id, file_data.mem_type, rocdec_codec_id, file_data.b_force_zero_latency, file_data.p_crop_rect, file_data.b_extract_sei_messages); + viddec = new RocVideoDecoder(device_id, file_data.mem_type, rocdec_codec_id, file_data.b_force_zero_latency, file_data.p_crop_rect, file_data.b_extract_sei_messages, file_data.disp_delay); } if(!viddec->CodecSupported(device_id, rocdec_codec_id, demuxer.GetBitDepth())) { std::cerr << "Codec not supported on GPU, skipping this file!" << std::endl; diff --git a/samples/videoDecodeRGB/videodecrgb.cpp b/samples/videoDecodeRGB/videodecrgb.cpp index 21c207467a..c58137e9c1 100644 --- a/samples/videoDecodeRGB/videodecrgb.cpp +++ b/samples/videoDecodeRGB/videodecrgb.cpp @@ -52,7 +52,8 @@ void ShowHelpAndExit(const char *option = NULL) { << "-d GPU device ID (0 for the first device, 1 for the second, etc.); optional; default: 0" << std::endl << "-of Output Format name - (native, bgr, bgr48, rgb, rgb48, bgra, bgra64, rgba, rgba64; converts native YUV frame to RGB image format; optional; default: 0" << std::endl << "-resize WxH - (where W is resize width and H is resize height) optional; default: no resize " << std::endl - << "-crop crop rectangle for output (not used when using interopped decoded frame); optional; default: 0" << std::endl; + << "-crop crop rectangle for output (not used when using interopped decoded frame); optional; default: 0" << std::endl + << "-disp_delay -specify the number of frames to be delayed for display; optional; default: 1" << std::endl; exit(0); } @@ -155,6 +156,8 @@ int main(int argc, char **argv) { bool dump_output_frames = false; bool convert_to_rgb = false; int device_id = 0; + int disp_delay = 1; + bool b_extract_sei_messages = false; Rect crop_rect = {}; Dim resize_dim = {}; Rect *p_crop_rect = nullptr; @@ -248,13 +251,20 @@ int main(int argc, char **argv) { md5_file_path = argv[i]; continue; } + if (!strcmp(argv[i], "-disp_delay")) { + if (++i == argc) { + ShowHelpAndExit("-disp_delay"); + } + disp_delay = atoi(argv[i]); + continue; + } ShowHelpAndExit(argv[i]); } try { VideoDemuxer demuxer(input_file_path.c_str()); rocDecVideoCodec rocdec_codec_id = AVCodec2RocDecVideoCodec(demuxer.GetCodecID()); - RocVideoDecoder viddec(device_id, mem_type, rocdec_codec_id, false, p_crop_rect); + RocVideoDecoder viddec(device_id, mem_type, rocdec_codec_id, false, p_crop_rect, b_extract_sei_messages, disp_delay); if(!viddec.CodecSupported(device_id, rocdec_codec_id, demuxer.GetBitDepth())) { std::cerr << "GPU doesn't support codec!" << std::endl; return 0; diff --git a/samples/videoToSequence/videotosequence.cpp b/samples/videoToSequence/videotosequence.cpp index 07403b3bab..8ea62530ec 100644 --- a/samples/videoToSequence/videotosequence.cpp +++ b/samples/videoToSequence/videotosequence.cpp @@ -232,12 +232,13 @@ void ShowHelpAndExit(const char *option = NULL) { << "-crop crop rectangle for output (not used when using interopped decoded frame); optional; default: 0" << std::endl << "-seek_mode option for seeking (0: no seek 1: seek to prev key frame); optional; default: 0" << std::endl << "-m output_surface_memory_type - decoded surface memory; optional; default - 0" - << " [0 : OUT_SURFACE_MEM_DEV_INTERNAL/ 1 : OUT_SURFACE_MEM_DEV_COPIED/ 2 : OUT_SURFACE_MEM_HOST_COPIED/ 3 : OUT_SURFACE_MEM_NOT_MAPPED]" << std::endl; + << " [0 : OUT_SURFACE_MEM_DEV_INTERNAL/ 1 : OUT_SURFACE_MEM_DEV_COPIED/ 2 : OUT_SURFACE_MEM_HOST_COPIED/ 3 : OUT_SURFACE_MEM_NOT_MAPPED]" << std::endl + << "-disp_delay -specify the number of frames to be delayed for display; optional; default: 1" << std::endl; exit(0); } // input_folder_path, output_folder_path, device_id, n_threads, seq_info, seek_mode, mem_type, argc, argv void ParseCommandLine(std::string &input_folder_path, std::string &output_folder_path, int &device_id, int &n_thread, SeqInfo &seq_info, int &seek_mode, - bool &b_dump_output_frames, OutputSurfaceMemoryType &mem_type, int argc, char *argv[]) { + bool &b_dump_output_frames, OutputSurfaceMemoryType &mem_type, int &disp_delay, int argc, char *argv[]) { // Parse command-line arguments if(argc <= 1) { ShowHelpAndExit(); @@ -338,6 +339,13 @@ void ParseCommandLine(std::string &input_folder_path, std::string &output_folder ShowHelpAndExit("-seek_mode"); continue; } + if (!strcmp(argv[i], "-disp_delay")) { + if (++i == argc) { + ShowHelpAndExit("-disp_delay"); + } + disp_delay = atoi(argv[i]); + continue; + } ShowHelpAndExit(argv[i]); } } @@ -350,6 +358,8 @@ int main(int argc, char **argv) { int device_id = 0, num_files = 0, seek_mode = 0; SeqInfo seq_info = {4, 1, 1, 4}; //default values int n_threads = 1; + int disp_delay = 1; + bool b_extract_sei_messages = false; bool b_flush_frames_during_reconfig = true, b_dump_output_frames = false; Rect *p_crop_rect = nullptr; // specify crop_rect if output cropping is needed OutputSurfaceMemoryType mem_type = OUT_SURFACE_MEM_DEV_INTERNAL; // set to internal @@ -357,7 +367,7 @@ int main(int argc, char **argv) { uint32_t num_decoded_frames = 0; // default value is 0, meaning decode the entire stream std::vector input_file_names; - ParseCommandLine(input_folder_path, output_folder_path, device_id, n_threads, seq_info, seek_mode, b_dump_output_frames, mem_type, argc, argv); + ParseCommandLine(input_folder_path, output_folder_path, device_id, n_threads, seq_info, seek_mode, b_dump_output_frames, mem_type, disp_delay, argc, argv); try { @@ -440,7 +450,7 @@ int main(int argc, char **argv) { } v_dec_info[i]->rocdec_codec_id = AVCodec2RocDecVideoCodec(v_demuxer[i]->GetCodecID()); v_dec_info[i]->bit_depth = v_demuxer[i]->GetBitDepth(); - v_dec_info[i]->viddec = std::make_unique(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, false, p_crop_rect); + v_dec_info[i]->viddec = std::make_unique(v_dec_info[i]->dec_device_id, mem_type, v_dec_info[i]->rocdec_codec_id, false, p_crop_rect, b_extract_sei_messages, disp_delay); v_dec_info[i]->viddec->GetDeviceinfo(device_name, gcn_arch_name, pci_bus_id, pci_domain_id, pci_device_id); std::cout << "info: decoding " << input_file_names[i] << " using GPU device " << v_dec_info[i]->dec_device_id << " - " << device_name << "[" << gcn_arch_name << "] on PCI bus " << std::setfill('0') << std::setw(2) << std::right << std::hex << pci_bus_id << ":" << std::setfill('0') << std::setw(2) << @@ -461,7 +471,7 @@ int main(int argc, char **argv) { // If the codec_type or bit_depth has changed, recreate the decoder //if (v_dec_info[thread_idx]->bit_depth != bit_depth || v_dec_info[thread_idx]->rocdec_codec_id != codec_id) { (v_dec_info[thread_idx]->viddec).release(); - v_dec_info[thread_idx]->viddec = std::make_unique(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, false, p_crop_rect); + v_dec_info[thread_idx]->viddec = std::make_unique(v_dec_info[thread_idx]->dec_device_id, mem_type, codec_id, false, p_crop_rect, b_extract_sei_messages, disp_delay); //} v_dec_info[thread_idx]->viddec->GetDeviceinfo(device_name, gcn_arch_name, pci_bus_id, pci_domain_id, pci_device_id); std::cout << "info: decoding " << input_file_names[j] << " using GPU device " << v_dec_info[thread_idx]->dec_device_id << " - " << device_name << "[" << gcn_arch_name << "] on PCI bus " <<