diff --git a/CMakeLists.txt b/CMakeLists.txt index 8eae8014b3..a0af40e035 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,6 +237,7 @@ if(HIP_FOUND AND Libva_FOUND AND Libdrm_amdgpu_FOUND) install(FILES samples/videoDecodePerf/CMakeLists.txt samples/videoDecodePerf/README.md samples/videoDecodePerf/videodecodeperf.cpp DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/samples/videoDecodePerf COMPONENT dev) install(FILES samples/videoDecodeRGB/CMakeLists.txt samples/videoDecodeRGB/README.md samples/videoDecodeRGB/videodecrgb.cpp DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/samples/videoDecodeRGB COMPONENT dev) install(FILES samples/videoDecodeBatch/CMakeLists.txt samples/videoDecodeBatch/README.md samples/videoDecodeBatch/videodecodebatch.cpp DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/samples/videoDecodeBatch COMPONENT dev) + install(FILES samples/rocdecDecode/CMakeLists.txt samples/rocdecDecode/README.md samples/rocdecDecode/rocdecdecode.cpp DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/samples/rocdecDecode COMPONENT dev) install(FILES samples/common.h DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/samples COMPONENT dev) install(FILES utils/md5.h DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/utils COMPONENT dev) install(FILES utils/video_demuxer.h DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/utils COMPONENT dev) @@ -246,6 +247,7 @@ if(HIP_FOUND AND Libva_FOUND AND Libdrm_amdgpu_FOUND) install(FILES utils/resize_kernels.h DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/utils COMPONENT dev) install(FILES utils/video_post_process.h DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/utils COMPONENT dev) install(FILES data/videos/AMD_driving_virtual_20-H265.mp4 data/videos/AMD_driving_virtual_20-H265.265 data/videos/AMD_driving_virtual_20-H264.mp4 data/videos/AMD_driving_virtual_20-H264.264 data/videos/AMD_driving_virtual_20-AV1.mp4 data/videos/AMD_driving_virtual_20-AV1.ivf data/videos/AMD_driving_virtual_20-VP9.ivf DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/video COMPONENT dev) + install(DIRECTORY data/frames/ DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/frames COMPONENT dev) # install license information - {ROCM_PATH}/share/doc/rocdecode set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") install(FILES ${CPACK_RESOURCE_FILE_LICENSE} DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT runtime) diff --git a/samples/rocdecDecode/CMakeLists.txt b/samples/rocdecDecode/CMakeLists.txt index 10401c563b..08f4f4cb71 100644 --- a/samples/rocdecDecode/CMakeLists.txt +++ b/samples/rocdecDecode/CMakeLists.txt @@ -67,25 +67,36 @@ find_package(FFmpeg QUIET) find_package(rocdecode QUIET) find_package(rocdecode-host 1.0.0 QUIET) -if(HIP_FOUND AND FFMPEG_FOUND AND rocdecode_FOUND AND rocdecode-host_FOUND) +if(HIP_FOUND AND rocdecode_FOUND) # HIP set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} hip::host) - # FFMPEG - include_directories(${AVUTIL_INCLUDE_DIR} ${AVCODEC_INCLUDE_DIR} - ${AVFORMAT_INCLUDE_DIR}) - set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${FFMPEG_LIBRARIES}) + + if(FFMPEG_FOUND) + # FFMPEG + include_directories(${AVUTIL_INCLUDE_DIR} ${AVCODEC_INCLUDE_DIR} + ${AVFORMAT_INCLUDE_DIR}) + set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${FFMPEG_LIBRARIES}) + endif() + if(rocdecode-host_FOUND) + # rocdecode-host + include_directories(${rocdecode-host_INCLUDE_DIR}) + set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocdecode::rocdecode-host) + endif() + # rocdecode and utils include_directories(${rocdecode_INCLUDE_DIR} ${ROCM_PATH}/lib) set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocdecode::rocdecode) - # rocdecode-host - include_directories(${rocdecode-host_INCLUDE_DIR}) - set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} rocdecode::rocdecode-host) # rocdecode # sample app exe list(APPEND SOURCES ${PROJECT_SOURCE_DIR} rocdecdecode.cpp) add_executable(${PROJECT_NAME} ${SOURCES}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++17") + if(FFMPEG_FOUND AND rocdecode-host_FOUND) + target_compile_definitions(${PROJECT_NAME} PUBLIC ENABLE_HOST_DECODE=1) + else() + target_compile_definitions(${PROJECT_NAME} PUBLIC ENABLE_HOST_DECODE=0) + endif() target_link_libraries(${PROJECT_NAME} ${LINK_LIBRARY_LIST}) else() message("-- ERROR!: ${PROJECT_NAME} excluded! please install all the dependencies and try again!") diff --git a/samples/rocdecDecode/rocdecdecode.cpp b/samples/rocdecDecode/rocdecdecode.cpp index 2bf624a369..99927537b9 100644 --- a/samples/rocdecDecode/rocdecdecode.cpp +++ b/samples/rocdecDecode/rocdecdecode.cpp @@ -28,7 +28,10 @@ THE SOFTWARE. #include #include #include -#include +#include +#if ENABLE_HOST_DECODE + #include +#endif namespace fs = std::filesystem; @@ -364,6 +367,7 @@ void create_decoder(DecoderInfo& dec_info) { CHECK(rocDecCreateDecoder(&dec_info.decoder, &create_info)); } +#if ENABLE_HOST_DECODE int ROCDECAPI handle_video_sequence_host(void* user_data, RocdecVideoFormatHost* format_host) { DecoderInfo *p_dec_info = static_cast(user_data); RocdecVideoFormat *format = &format_host->video_format; @@ -451,6 +455,7 @@ void create_decoder_host(DecoderInfo& dec_info) { CHECK(rocDecCreateDecoderHost(&dec_info.decoder, &create_info)); dec_info.backend = DECODER_BACKEND_HOST; } +#endif int ROCDECAPI handle_video_sequence(void* user_data, RocdecVideoFormat* format) { DecoderInfo *p_dec_info = static_cast(user_data); @@ -551,7 +556,9 @@ void decode_frames(DecoderInfo& dec_info, const std::vector } CHECK(rocDecParseVideoData(dec_info.parser, &packet)); } - } else if (dec_info.backend == DECODER_BACKEND_HOST) { + } +#if ENABLE_HOST_DECODE + else if (dec_info.backend == DECODER_BACKEND_HOST) { for (int i=0; i < static_cast(frames.size()); ++i) { RocdecPicParamsHost pic_params = {}; pic_params.bitstream_data_len = frames[i].size(); @@ -562,14 +569,18 @@ void decode_frames(DecoderInfo& dec_info, const std::vector CHECK(rocDecDecodeFrameHost(dec_info.decoder, &pic_params)); } } +#endif } void destroy_decoder(DecoderInfo& dec_info) { - if (dec_info.backend == DECODER_BACKEND_DEVICE) + if (dec_info.backend == DECODER_BACKEND_DEVICE) { CHECK(rocDecDestroyDecoder(dec_info.decoder)); + } +#if ENABLE_HOST_DECODE else if (dec_info.backend == DECODER_BACKEND_HOST) { CHECK(rocDecDestroyDecoderHost(dec_info.decoder)); } +#endif } void destroy_parser(DecoderInfo& dec_info) { @@ -582,7 +593,11 @@ void ShowHelpAndExit(const char *option = NULL) { << "-i Input File Path - required" << std::endl << "-o Output File Path - dumps output if requested; optional" << std::endl << "-d GPU device ID (0 for the first device, 1 for the second, etc.); optional; default: 0" << std::endl +#if ENABLE_HOST_DECODE << "-b backend (0 for GPU, 1 CPU-FFMpeg); optional; default: 0" << std::endl +#else + << "-b backend (0 for GPU); optional; default: 0" << std::endl +#endif << "-c codec (0 : HEVC, 1 : H264, 2: AV1, 4: VP9, 5: VP8 ); optional; default: 0" << std::endl << "-n Number of iteration - specify the number of iterations for performance evaluation; optional; default: 1" << std::endl << "-m output_surface_memory_type - decoded surface memory; optional; default - 0" @@ -725,9 +740,12 @@ int main(int argc, char** argv) { if (backend == DECODER_BACKEND_DEVICE) { create_parser(dec_info); create_decoder(dec_info); - } else { + } +#if ENABLE_HOST_DECODE + else { create_decoder_host(dec_info); } +#endif dec_info.dump_decoded_frames = dump_output_frames; auto input_frames = read_frames(input_file_names); auto start = std::chrono::high_resolution_clock::now(); diff --git a/src/rocdecode-host/CMakeLists.txt b/src/rocdecode-host/CMakeLists.txt index cbfa763029..332c35185c 100644 --- a/src/rocdecode-host/CMakeLists.txt +++ b/src/rocdecode-host/CMakeLists.txt @@ -30,6 +30,11 @@ elseif(ROCM_PATH) else() set(ROCM_PATH /opt/rocm CACHE PATH "Default ROCm installation path") endif() +# Check if lib/rocm_sysdeps/lib exists in the ROCm path which indicates ROCm installation via TheRock +set(USING_THE_ROCK OFF) +if(EXISTS "${ROCM_PATH}/lib/rocm_sysdeps/lib") + set(USING_THE_ROCK ON) +endif() # Set AMD Clang as default compiler set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED On) @@ -88,6 +93,10 @@ if(HIP_FOUND AND Threads_FOUND AND FFMPEG_FOUND) endif() #FFMpeg version >= 7.1 set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) + if(USING_THE_ROCK) + set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "$ORIGIN;$ORIGIN/rocm_sysdeps/lib" BUILD_WITH_INSTALL_RPATH TRUE) + endif() + message("-- ${White}AMD ROCm ${PROJECT_NAME} -- CMAKE_CXX_FLAGS:${CMAKE_CXX_FLAGS}${ColourReset}") message("-- ${White}AMD ROCm ${PROJECT_NAME} -- Link Libraries: ${LINK_LIBRARY_LIST}${ColourReset}") diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index efa11aa5a3..5b0daca45a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -163,7 +163,23 @@ if(USING_THE_ROCK) set_property(TEST video_decodeRaw-VP9 PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") endif() -# 5 - rocDecodeNegativeApiTests +# 5 - rocdecDecode +add_test( + NAME + rocdec_Decode-HEVC + COMMAND + "${CMAKE_CTEST_COMMAND}" + --build-and-test "${ROCM_PATH}/share/rocdecode/samples/rocdecDecode" + "${CMAKE_CURRENT_BINARY_DIR}/rocdecDecode" + --build-generator "${CMAKE_GENERATOR}" + --test-command "rocdecdecode" + -i ${ROCM_PATH}/share/rocdecode/frames +) +if(USING_THE_ROCK) + set_property(TEST rocdec_Decode-HEVC PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") +endif() + +# 6 - rocDecodeNegativeApiTests add_test( NAME rocDecode_Negative_API_Tests @@ -180,7 +196,7 @@ endif() if(FFMPEG_FOUND) message("-- ${Green}${PROJECT_NAME} FFmpeg found - rocdecode tests requiring FFmpeg added") - # 6 - videoDecode HEVC + # 7 - videoDecode HEVC add_test( NAME video_decode-HEVC @@ -196,7 +212,7 @@ if(FFMPEG_FOUND) set_property(TEST video_decode-HEVC PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") endif() - # 7 - videoDecode AVC + # 8 - videoDecode AVC add_test( NAME video_decode-AVC @@ -212,7 +228,7 @@ if(FFMPEG_FOUND) set_property(TEST video_decode-AVC PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") endif() - # 8 - videoDecode AV1 + # 9 - videoDecode AV1 add_test( NAME video_decode-AV1 @@ -228,7 +244,7 @@ if(FFMPEG_FOUND) set_property(TEST video_decode-AV1 PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") endif() - # 9 - videoDecode VP9 + # 10 - videoDecode VP9 add_test( NAME video_decode-VP9 @@ -244,7 +260,7 @@ if(FFMPEG_FOUND) set_property(TEST video_decode-VP9 PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") endif() - # 10 - videoDecodePerf + # 11 - videoDecodePerf add_test( NAME video_decodePerf-HEVC @@ -260,7 +276,7 @@ if(FFMPEG_FOUND) set_property(TEST video_decodePerf-HEVC PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") endif() - # 11 - videoDecodeBatch + # 12 - videoDecodeBatch add_test( NAME video_decodeBatch @@ -276,7 +292,7 @@ if(FFMPEG_FOUND) set_property(TEST video_decodeBatch PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") endif() - # 12 - videoDecodeRGB + # 13 - videoDecodeRGB add_test( NAME video_decodeRGB-HEVC @@ -292,7 +308,7 @@ if(FFMPEG_FOUND) set_property(TEST video_decodeRGB-HEVC PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") endif() - # 13 - videoDecodeMem + # 14 - videoDecodeMem add_test( NAME video_decodeMem-HEVC @@ -308,7 +324,7 @@ if(FFMPEG_FOUND) set_property(TEST video_decodeMem-HEVC PROPERTY ENVIRONMENT "LIBVA_DRIVERS_PATH=${ROCM_PATH}/lib/rocm_sysdeps/lib") endif() - # 14 - videoDecodeRGBResize + # 15 - videoDecodeRGBResize add_test( NAME video_decodeRGB-Resize @@ -325,7 +341,7 @@ if(FFMPEG_FOUND) endif() if(rocdecode-host_FOUND) - # 15 - videoDecode Host backend + # 16 - videoDecode Host backend add_test( NAME video_decode-Host-Backend