From 7f64bb0b6171220cea52fdbdab4ec42e715c1b04 Mon Sep 17 00:00:00 2001 From: Kiriti Gowda Date: Mon, 6 Nov 2023 08:51:47 -0800 Subject: [PATCH] FFMPEG - Updates (#33) * FFMPEG - Updates * Readme - Updates * Sample - Install * Install Sample Deps * Samples - Updates * Sample - Added missing header [ROCm/rocdecode commit: d34d85027c5a3ed03afcbab20ed55450b5263c7e] --- projects/rocdecode/CMakeLists.txt | 28 +++-------- projects/rocdecode/README.md | 37 ++++++++++++--- .../samples/videoDecode/CMakeLists.txt | 47 +++++++++++++++---- .../rocdecode/samples/videoDecode/README.md | 33 +++++++++++-- .../samples/videoDecode/videodecode.cpp | 1 + 5 files changed, 104 insertions(+), 42 deletions(-) diff --git a/projects/rocdecode/CMakeLists.txt b/projects/rocdecode/CMakeLists.txt index 7322d6f479..1d49a4ede0 100644 --- a/projects/rocdecode/CMakeLists.txt +++ b/projects/rocdecode/CMakeLists.txt @@ -104,9 +104,8 @@ set(AMDGPU_TARGETS "${DEFAULT_AMDGPU_TARGETS}" CACHE STRING "List of specific ma find_package(HIP QUIET) find_package(Libdrm QUIET) find_package(Libva QUIET) -find_package(FFmpeg QUIET) -if(HIP_FOUND AND FFMPEG_FOUND AND Libva_FOUND AND Libdrm_FOUND) +if(HIP_FOUND AND Libva_FOUND AND Libdrm_FOUND) # HIP set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} hip::device) @@ -117,10 +116,6 @@ if(HIP_FOUND AND FFMPEG_FOUND AND Libva_FOUND AND Libdrm_FOUND) include_directories(${LIBVA_INCLUDE_DIR}) set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${LIBVA_LIBRARY}) set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${LIBVA_DRM_LIBRARY}) - # FFMPEG - include_directories(${AVUTIL_INCLUDE_DIR} ${AVCODEC_INCLUDE_DIR} - ${SWSCALE_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR}) - set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${FFMPEG_LIBRARIES}) # local include files include_directories(api src/rocdecode src/parser src/rocdecode/vaapi) @@ -129,22 +124,16 @@ if(HIP_FOUND AND FFMPEG_FOUND AND Libva_FOUND AND Libdrm_FOUND) # rocdecode.so add_library(${PROJECT_NAME} SHARED ${SOURCES}) - if(_FFMPEG_AVCODEC_VERSION VERSION_LESS_EQUAL 58.134.100) - target_compile_definitions(${PROJECT_NAME} PUBLIC USE_AVCODEC_58_134=1) - endif() - - if(_FFMPEG_AVCODEC_VERSION VERSION_LESS_EQUAL 58.54.100) - target_compile_definitions(${PROJECT_NAME} PUBLIC USE_AVCODEC_58_54=0) - else() - target_compile_definitions(${PROJECT_NAME} PUBLIC USE_AVCODEC_58_54=1) - endif() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++17") target_link_libraries(${PROJECT_NAME} ${LINK_LIBRARY_LIST}) install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(FILES api/rocdecode.h api/rocparser.h utils/video_demuxer.hpp utils/rocvideodecode/roc_video_dec.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) + install(DIRECTORY cmake DESTINATION ${CMAKE_INSTALL_DATADIR}/rocdecode) + install(DIRECTORY utils/rocvideodecode DESTINATION ${CMAKE_INSTALL_DATADIR}/rocdecode/utils) + install(DIRECTORY samples/videoDecode DESTINATION ${CMAKE_INSTALL_DATADIR}/rocdecode/samples) + install(FILES data/videos/AMD_driving_virtual_20-H265.mp4 DESTINATION ${CMAKE_INSTALL_DATADIR}/rocdecode/video) message("-- ${White}AMD ROCm rocDecode -- CMAKE_CXX_FLAGS:${CMAKE_CXX_FLAGS}${ColourReset}") message("-- ${White}AMD ROCm rocDecode -- Link Libraries: ${LINK_LIBRARY_LIST}${ColourReset}") @@ -205,9 +194,9 @@ if(HIP_FOUND AND FFMPEG_FOUND AND Libva_FOUND AND Libdrm_FOUND) # Set the dependent packages set(rocDecode_DEBIAN_PACKAGE_LIST - "vainfo, libva-dev, libdrm-dev, ffmpeg, libavcodec-dev, libavformat-dev, libswscale-dev") + "vainfo, libva-dev, libdrm-dev") set(rocDecode_RPM_PACKAGE_LIST - "libva-devel, libdrm-devel, ffmpeg, libavcodec-devel, libavformat-devel, libswscale-devel") + "libva-devel, libdrm-devel") # set dependency to ROCm if set to TRUE, default to OFF set(ROCM_DEP_ROCMCORE OFF CACHE BOOL "Set rocm-core dependency") if(ROCM_DEP_ROCMCORE) @@ -259,9 +248,6 @@ else() if(NOT HIP_FOUND) message(FATAL_ERROR "-- ERROR!: HIP Not Found! - please install ROCm and HIP!") endif() - if(NOT FFMPEG_FOUND) - message(FATAL_ERROR "-- ERROR!: FFMPEG Not Found! - please install FFMPEG!") - endif() if(NOT Libva_FOUND) message(FATAL_ERROR "-- ERROR!: libva-dev Not Found - please install libva-dev!") endif() diff --git a/projects/rocdecode/README.md b/projects/rocdecode/README.md index f7d67864c1..f25e9820f2 100644 --- a/projects/rocdecode/README.md +++ b/projects/rocdecode/README.md @@ -1,6 +1,9 @@ # rocDecode -rocDecode is a high performance video decode SDK for AMD hardware +rocDecode is a high performance video decode SDK for AMD hardware. rocDecode API lets developers access the video decoding features available on the GPU. +## Supported Codecs +* H.264 - 8 bit +* H.265 (HEVC) - 8 bit, 10 bit, and 12 bit ## Prerequisites: @@ -23,11 +26,6 @@ rocDecode is a high performance video decode SDK for AMD hardware sudo apt install libdrm-dev ``` -* [FFMPEG](https://ffmpeg.org/about.html) - ``` - sudo apt install ffmpeg libavcodec-dev libavformat-dev libswscale-dev - ``` - * **Note** [rocDecode-setup.py](rocDecode-setup.py) script can be used for installing all the dependencies ## Build instructions: @@ -41,7 +39,7 @@ Please follow the instructions below to build and install the rocDecode library. sudo make install ``` -* run tests +* run tests - Requires `FFMPEG` install ``` make test ``` @@ -52,9 +50,34 @@ Please follow the instructions below to build and install the rocDecode library. sudo make test package ``` +## Verify Installation + +The installer will copy + +* Libraries into /opt/rocm/lib +* Header files into /opt/rocm/include/rocdecode +* Samples folder into /opt/rocm/share/rocdecode +* Documents folder into /opt/rocm/share/doc/rocdecode + +Build and run sample + +``` +mkdir rocdecode-sample && cd rocdecode-sample +cmake /opt/rocm/share/rocdecode/samples/videoDecode/ +make -j8 +./videodecode -i /opt/rocm/share/rocdecode/video/AMD_driving_virtual_20-H265.mp4 +``` + ## Samples: The tool provides a few samples to decode videos [here](samples/). Please refer to the individual folders to build and run the samples. +### Prerequisites + +* [FFMPEG](https://ffmpeg.org/about.html) - required to run sample applications & make test + ``` + sudo apt install ffmpeg libavcodec-dev libavformat-dev libswscale-dev + ``` + ## Docker: Docker files to build rocDecode containers are available [here](docker/) diff --git a/projects/rocdecode/samples/videoDecode/CMakeLists.txt b/projects/rocdecode/samples/videoDecode/CMakeLists.txt index 3a062efd18..e447bac4d2 100644 --- a/projects/rocdecode/samples/videoDecode/CMakeLists.txt +++ b/projects/rocdecode/samples/videoDecode/CMakeLists.txt @@ -21,34 +21,61 @@ # ################################################################################ -cmake_minimum_required (VERSION 3.0) +cmake_minimum_required (VERSION 3.5) project(videodecode) set(CMAKE_CXX_STANDARD 17) -set(ROCM_PATH /opt/rocm CACHE PATH "default ROCm installation path") + +# ROCM Path +if(DEFINED ENV{ROCM_PATH}) + set(ROCM_PATH $ENV{ROCM_PATH} CACHE PATH "Default ROCm installation path") +elseif(ROCM_PATH) + message("-- INFO:ROCM_PATH Set -- ${ROCM_PATH}") +else() + set(ROCM_PATH /opt/rocm CACHE PATH "Default ROCm installation path") +endif() + list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../cmake) list(APPEND CMAKE_PREFIX_PATH ${ROCM_PATH}/hip ${ROCM_PATH}) set(CMAKE_CXX_COMPILER ${ROCM_PATH}/llvm/bin/clang++) set(DEFAULT_AMDGPU_TARGETS "gfx803;gfx900;gfx906;gfx908;gfx90a;gfx940;gfx1030;gfx1031;gfx1032;gfx1100") set(AMDGPU_TARGETS "${DEFAULT_AMDGPU_TARGETS}" CACHE STRING "List of specific machine types for library to target") + find_package(HIP QUIET) find_package(FFmpeg QUIET) -message("-- ${CMAKE_CURRENT_SOURCE_DIR}") -if(HIP_FOUND AND FFMPEG_FOUND) - include_directories (${ROCM_PATH}/include/rocdecode) +# find rocDecode +find_library(ROCDECODE_LIBRARY NAMES rocdecode HINTS {ROCM_PATH}/lib) +find_path(ROCDECODE_INCLUDE_DIR NAMES rocdecode.h PATHS /opt/rocm/include/rocdecode {ROCM_PATH}/include/rocdecode) + +if(ROCDECODE_LIBRARY AND ROCDECODE_INCLUDE_DIR) + set(ROCDECODE_FOUND TRUE) + message("-- ${White}Using rocDecode -- \n\tLibraries:${ROCDECODE_LIBRARY} \n\tIncludes:${ROCDECODE_INCLUDE_DIR}${ColourReset}") +endif() + +if(HIP_FOUND AND FFMPEG_FOUND AND ROCDECODE_FOUND) + # HIP + set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} hip::device) + # FFMPEG + include_directories(${AVUTIL_INCLUDE_DIR} ${AVCODEC_INCLUDE_DIR} + ${SWSCALE_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR}) + set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${FFMPEG_LIBRARIES}) + # rocDecode + include_directories (${ROCDECODE_INCLUDE_DIR}) + set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${ROCDECODE_LIBRARY}) + list(APPEND SOURCES ${PROJECT_SOURCE_DIR} videodecode.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../utils/rocvideodecode/roc_video_dec.cpp) add_executable(${PROJECT_NAME} ${SOURCES}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++17") - target_link_libraries(${PROJECT_NAME} ${AVUTIL_LIBRARY} ${AVCODEC_LIBRARY} ${AVFORMAT_LIBRARY} hip::device rocdecode) + target_link_libraries(${PROJECT_NAME} ${LINK_LIBRARY_LIST}) else() + message("-- ERROR!: ${PROJECT_NAME} excluded! please install all the dependencies and try again!") if (NOT HIP_FOUND) message(FATAL_ERROR "-- ERROR!: HIP Not Found! - please install ROCm and HIP!") endif() if (NOT FFMPEG_FOUND) - message(FATAL_ERROR "-- ERROR!: FFMPEG Not Found! - please insatll FFMPEG!") + message(FATAL_ERROR "-- ERROR!: FFMPEG Not Found! - please install FFMPEG!") endif() - if (NOT Libva_FOUND) - message(FATAL_ERROR "-- ERROR!: libva-dev Not Found - please install libva-dev!") + if (NOT ROCDECODE_FOUND) + message(FATAL_ERROR "-- ERROR!: rocDecode Not Found! - please install rocDecode!") endif() - message("-- ERROR!: ${PROJECT_NAME} excluded! please install all the dependencies and try again!") endif() \ No newline at end of file diff --git a/projects/rocdecode/samples/videoDecode/README.md b/projects/rocdecode/samples/videoDecode/README.md index 9cd72a75d4..d0901132d3 100644 --- a/projects/rocdecode/samples/videoDecode/README.md +++ b/projects/rocdecode/samples/videoDecode/README.md @@ -1,11 +1,36 @@ # Video Decode Sample -This sample illustrates the FFMPEG demuxer to get the individual frames which are then decoded on AMD hardware using VAAPI. This sample supports both YUV420 8-bit and 10-bit streams. +This sample illustrates the FFMPEG demuxer to get the individual frames which are then decoded on AMD hardware using VAAPI. -## Build and run the sample: +This sample supports both YUV420 8-bit and 10-bit streams. + +## Prerequisites: + +* Linux distribution + + Ubuntu - `20.04` / `22.04` + +* [ROCm supported hardware](https://rocm.docs.amd.com/en/latest/release/gpu_os_support.html) + +* Install [ROCm 5.5 or later](https://rocmdocs.amd.com/en/latest/deploy/linux/installer/install.html) with `--usecase=graphics,rocm --no-32` + +* rocDecode + +* CMake `3.5` or later + +* [FFMPEG](https://ffmpeg.org/about.html) + ``` + sudo apt install ffmpeg libavcodec-dev libavformat-dev libswscale-dev + ``` + +## Build ``` mkdir build cd build -cmake .. +cmake ../ make -j -./videodecode -i -o -d +``` +# Run +``` +./videodecode -i + -o + -d ``` \ No newline at end of file diff --git a/projects/rocdecode/samples/videoDecode/videodecode.cpp b/projects/rocdecode/samples/videoDecode/videodecode.cpp index 38840f33ed..11f41988c1 100644 --- a/projects/rocdecode/samples/videoDecode/videodecode.cpp +++ b/projects/rocdecode/samples/videoDecode/videodecode.cpp @@ -21,6 +21,7 @@ THE SOFTWARE. */ #include +#include #include #include #include