mirror of
https://github.com/NVIDIA/cuda-samples.git
synced 2026-10-23 21:28:17 +08:00
add and update samples for CUDA 11.6
This commit is contained in:
18
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/.vscode/c_cpp_properties.json
vendored
Normal file
18
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/.vscode/c_cpp_properties.json
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Linux",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**",
|
||||
"${workspaceFolder}/../../../Common"
|
||||
],
|
||||
"defines": [],
|
||||
"compilerPath": "/usr/local/cuda/bin/nvcc",
|
||||
"cStandard": "gnu17",
|
||||
"cppStandard": "gnu++14",
|
||||
"intelliSenseMode": "linux-gcc-x64",
|
||||
"configurationProvider": "ms-vscode.makefile-tools"
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
||||
7
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/.vscode/extensions.json
vendored
Normal file
7
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"nvidia.nsight-vscode-edition",
|
||||
"ms-vscode.cpptools",
|
||||
"ms-vscode.makefile-tools"
|
||||
]
|
||||
}
|
||||
10
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/.vscode/launch.json
vendored
Normal file
10
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "CUDA C++: Launch",
|
||||
"type": "cuda-gdb",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/cudaNvSciNvMedia"
|
||||
}
|
||||
]
|
||||
}
|
||||
15
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/.vscode/tasks.json
vendored
Normal file
15
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "sample",
|
||||
"type": "shell",
|
||||
"command": "make dbg=1",
|
||||
"problemMatcher": ["$nvcc"],
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
483
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/Makefile
Normal file
483
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/Makefile
Normal file
@@ -0,0 +1,483 @@
|
||||
################################################################################
|
||||
# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
################################################################################
|
||||
#
|
||||
# Makefile project only supported on Mac OS X and Linux Platforms)
|
||||
#
|
||||
################################################################################
|
||||
|
||||
# Location of the CUDA Toolkit
|
||||
CUDA_PATH ?= /usr/local/cuda
|
||||
|
||||
##############################
|
||||
# start deprecated interface #
|
||||
##############################
|
||||
ifeq ($(x86_64),1)
|
||||
$(info WARNING - x86_64 variable has been deprecated)
|
||||
$(info WARNING - please use TARGET_ARCH=x86_64 instead)
|
||||
TARGET_ARCH ?= x86_64
|
||||
endif
|
||||
ifeq ($(ARMv7),1)
|
||||
$(info WARNING - ARMv7 variable has been deprecated)
|
||||
$(info WARNING - please use TARGET_ARCH=armv7l instead)
|
||||
TARGET_ARCH ?= armv7l
|
||||
endif
|
||||
ifeq ($(aarch64),1)
|
||||
$(info WARNING - aarch64 variable has been deprecated)
|
||||
$(info WARNING - please use TARGET_ARCH=aarch64 instead)
|
||||
TARGET_ARCH ?= aarch64
|
||||
endif
|
||||
ifeq ($(ppc64le),1)
|
||||
$(info WARNING - ppc64le variable has been deprecated)
|
||||
$(info WARNING - please use TARGET_ARCH=ppc64le instead)
|
||||
TARGET_ARCH ?= ppc64le
|
||||
endif
|
||||
ifneq ($(GCC),)
|
||||
$(info WARNING - GCC variable has been deprecated)
|
||||
$(info WARNING - please use HOST_COMPILER=$(GCC) instead)
|
||||
HOST_COMPILER ?= $(GCC)
|
||||
endif
|
||||
ifneq ($(abi),)
|
||||
$(error ERROR - abi variable has been removed)
|
||||
endif
|
||||
############################
|
||||
# end deprecated interface #
|
||||
############################
|
||||
|
||||
# architecture
|
||||
HOST_ARCH := $(shell uname -m)
|
||||
TARGET_ARCH ?= $(HOST_ARCH)
|
||||
ifneq (,$(filter $(TARGET_ARCH),x86_64 aarch64 sbsa ppc64le armv7l))
|
||||
ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
||||
ifneq (,$(filter $(TARGET_ARCH),x86_64 aarch64 sbsa ppc64le))
|
||||
TARGET_SIZE := 64
|
||||
else ifneq (,$(filter $(TARGET_ARCH),armv7l))
|
||||
TARGET_SIZE := 32
|
||||
endif
|
||||
else
|
||||
TARGET_SIZE := $(shell getconf LONG_BIT)
|
||||
endif
|
||||
else
|
||||
$(error ERROR - unsupported value $(TARGET_ARCH) for TARGET_ARCH!)
|
||||
endif
|
||||
|
||||
# sbsa and aarch64 systems look similar. Need to differentiate them at host level for now.
|
||||
ifeq ($(HOST_ARCH),aarch64)
|
||||
ifeq ($(CUDA_PATH)/targets/sbsa-linux,$(shell ls -1d $(CUDA_PATH)/targets/sbsa-linux 2>/dev/null))
|
||||
HOST_ARCH := sbsa
|
||||
TARGET_ARCH := sbsa
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
||||
ifeq (,$(filter $(HOST_ARCH)-$(TARGET_ARCH),aarch64-armv7l x86_64-armv7l x86_64-aarch64 x86_64-sbsa x86_64-ppc64le))
|
||||
$(error ERROR - cross compiling from $(HOST_ARCH) to $(TARGET_ARCH) is not supported!)
|
||||
endif
|
||||
endif
|
||||
|
||||
# When on native aarch64 system with userspace of 32-bit, change TARGET_ARCH to armv7l
|
||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_SIZE),aarch64-aarch64-32)
|
||||
TARGET_ARCH = armv7l
|
||||
endif
|
||||
|
||||
# operating system
|
||||
HOST_OS := $(shell uname -s 2>/dev/null | tr "[:upper:]" "[:lower:]")
|
||||
TARGET_OS ?= $(HOST_OS)
|
||||
ifeq (,$(filter $(TARGET_OS),linux darwin qnx android))
|
||||
$(error ERROR - unsupported value $(TARGET_OS) for TARGET_OS!)
|
||||
endif
|
||||
|
||||
# host compiler
|
||||
ifeq ($(TARGET_OS),darwin)
|
||||
ifeq ($(shell expr `xcodebuild -version | grep -i xcode | awk '{print $$2}' | cut -d'.' -f1` \>= 5),1)
|
||||
HOST_COMPILER ?= clang++
|
||||
endif
|
||||
else ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-armv7l)
|
||||
ifeq ($(TARGET_OS),linux)
|
||||
HOST_COMPILER ?= arm-linux-gnueabihf-g++
|
||||
else ifeq ($(TARGET_OS),qnx)
|
||||
ifeq ($(QNX_HOST),)
|
||||
$(error ERROR - QNX_HOST must be passed to the QNX host toolchain)
|
||||
endif
|
||||
ifeq ($(QNX_TARGET),)
|
||||
$(error ERROR - QNX_TARGET must be passed to the QNX target toolchain)
|
||||
endif
|
||||
export QNX_HOST
|
||||
export QNX_TARGET
|
||||
HOST_COMPILER ?= $(QNX_HOST)/usr/bin/arm-unknown-nto-qnx6.6.0eabi-g++
|
||||
else ifeq ($(TARGET_OS),android)
|
||||
HOST_COMPILER ?= arm-linux-androideabi-g++
|
||||
endif
|
||||
else ifeq ($(TARGET_ARCH),aarch64)
|
||||
ifeq ($(TARGET_OS), linux)
|
||||
HOST_COMPILER ?= aarch64-linux-gnu-g++
|
||||
else ifeq ($(TARGET_OS),qnx)
|
||||
ifeq ($(QNX_HOST),)
|
||||
$(error ERROR - QNX_HOST must be passed to the QNX host toolchain)
|
||||
endif
|
||||
ifeq ($(QNX_TARGET),)
|
||||
$(error ERROR - QNX_TARGET must be passed to the QNX target toolchain)
|
||||
endif
|
||||
export QNX_HOST
|
||||
export QNX_TARGET
|
||||
HOST_COMPILER ?= $(QNX_HOST)/usr/bin/q++
|
||||
else ifeq ($(TARGET_OS), android)
|
||||
HOST_COMPILER ?= aarch64-linux-android-clang++
|
||||
endif
|
||||
else ifeq ($(TARGET_ARCH),sbsa)
|
||||
HOST_COMPILER ?= aarch64-linux-gnu-g++
|
||||
else ifeq ($(TARGET_ARCH),ppc64le)
|
||||
HOST_COMPILER ?= powerpc64le-linux-gnu-g++
|
||||
endif
|
||||
endif
|
||||
HOST_COMPILER ?= g++
|
||||
NVCC := $(CUDA_PATH)/bin/nvcc -ccbin $(HOST_COMPILER)
|
||||
|
||||
# internal flags
|
||||
NVCCFLAGS := -m${TARGET_SIZE}
|
||||
CCFLAGS :=
|
||||
LDFLAGS :=
|
||||
|
||||
# build flags
|
||||
ifeq ($(TARGET_OS),darwin)
|
||||
LDFLAGS += -rpath $(CUDA_PATH)/lib
|
||||
CCFLAGS += -arch $(HOST_ARCH)
|
||||
else ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-armv7l-linux)
|
||||
LDFLAGS += --dynamic-linker=/lib/ld-linux-armhf.so.3
|
||||
CCFLAGS += -mfloat-abi=hard
|
||||
else ifeq ($(TARGET_OS),android)
|
||||
LDFLAGS += -pie
|
||||
CCFLAGS += -fpie -fpic -fexceptions
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux)
|
||||
ifneq ($(TARGET_FS),)
|
||||
GCCVERSIONLTEQ46 := $(shell expr `$(HOST_COMPILER) -dumpversion` \<= 4.6)
|
||||
ifeq ($(GCCVERSIONLTEQ46),1)
|
||||
CCFLAGS += --sysroot=$(TARGET_FS)
|
||||
endif
|
||||
LDFLAGS += --sysroot=$(TARGET_FS)
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/lib
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/arm-linux-gnueabihf
|
||||
endif
|
||||
endif
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux)
|
||||
ifneq ($(TARGET_FS),)
|
||||
GCCVERSIONLTEQ46 := $(shell expr `$(HOST_COMPILER) -dumpversion` \<= 4.6)
|
||||
ifeq ($(GCCVERSIONLTEQ46),1)
|
||||
CCFLAGS += --sysroot=$(TARGET_FS)
|
||||
endif
|
||||
LDFLAGS += --sysroot=$(TARGET_FS)
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/lib -L$(TARGET_FS)/lib
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/lib/aarch64-linux-gnu -L$(TARGET_FS)/lib/aarch64-linux-gnu
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib -L$(TARGET_FS)/usr/lib
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/aarch64-linux-gnu -L$(TARGET_FS)/usr/lib/aarch64-linux-gnu
|
||||
LDFLAGS += --unresolved-symbols=ignore-in-shared-libs
|
||||
CCFLAGS += -isystem=$(TARGET_FS)/usr/include -I$(TARGET_FS)/usr/include -I$(TARGET_FS)/usr/include/libdrm
|
||||
CCFLAGS += -isystem=$(TARGET_FS)/usr/include/aarch64-linux-gnu -I$(TARGET_FS)/usr/include/aarch64-linux-gnu
|
||||
endif
|
||||
endif
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx)
|
||||
NVCCFLAGS += -D_QNX_SOURCE
|
||||
NVCCFLAGS += --qpp-config 8.3.0,gcc_ntoaarch64le
|
||||
CCFLAGS += -DWIN_INTERFACE_CUSTOM -I/usr/include/aarch64-qnx-gnu
|
||||
LDFLAGS += -lsocket
|
||||
LDFLAGS += -L/usr/lib/aarch64-qnx-gnu
|
||||
CCFLAGS += "-Wl\,-rpath-link\,/usr/lib/aarch64-qnx-gnu"
|
||||
ifdef TARGET_OVERRIDE
|
||||
LDFLAGS += -lslog2
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_FS),)
|
||||
LDFLAGS += -L$(TARGET_FS)/usr/lib
|
||||
CCFLAGS += "-Wl\,-rpath-link\,$(TARGET_FS)/usr/lib"
|
||||
LDFLAGS += -L$(TARGET_FS)/usr/libnvidia
|
||||
CCFLAGS += "-Wl\,-rpath-link\,$(TARGET_FS)/usr/libnvidia"
|
||||
CCFLAGS += -I$(TARGET_FS)/../include
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef TARGET_OVERRIDE # cuda toolkit targets override
|
||||
NVCCFLAGS += -target-dir $(TARGET_OVERRIDE)
|
||||
endif
|
||||
|
||||
# Install directory of different arch
|
||||
CUDA_INSTALL_TARGET_DIR :=
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/armv7-linux-gnueabihf/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/aarch64-linux/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),sbsa-linux)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/sbsa-linux/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-android)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/armv7-linux-androideabi/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-android)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/aarch64-linux-androideabi/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-qnx)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/ARMv7-linux-QNX/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/aarch64-qnx/
|
||||
else ifeq ($(TARGET_ARCH),ppc64le)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/ppc64le-linux/
|
||||
endif
|
||||
|
||||
# Debug build flags
|
||||
ifeq ($(dbg),1)
|
||||
NVCCFLAGS += -g -G
|
||||
BUILD_TYPE := debug
|
||||
else
|
||||
BUILD_TYPE := release
|
||||
endif
|
||||
|
||||
ALL_CCFLAGS :=
|
||||
ALL_CCFLAGS += $(NVCCFLAGS)
|
||||
ALL_CCFLAGS += $(EXTRA_NVCCFLAGS)
|
||||
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(CCFLAGS))
|
||||
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(EXTRA_CCFLAGS))
|
||||
|
||||
UBUNTU = $(shell lsb_release -i -s 2>/dev/null | grep -i ubuntu)
|
||||
|
||||
SAMPLE_ENABLED := 1
|
||||
|
||||
# This sample is not supported on Linux x86_64
|
||||
ifeq ($(TARGET_OS),linux)
|
||||
ifeq ($(TARGET_ARCH),x86_64)
|
||||
$(info >>> WARNING - cudaNvSciNvMedia is not supported on Linux x86_64 - waiving sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
endif
|
||||
|
||||
# This sample is not supported on Mac OSX
|
||||
ifeq ($(TARGET_OS),darwin)
|
||||
$(info >>> WARNING - cudaNvSciNvMedia is not supported on Mac OSX - waiving sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
|
||||
# This sample is not supported on ARMv7
|
||||
ifeq ($(TARGET_ARCH),armv7l)
|
||||
$(info >>> WARNING - cudaNvSciNvMedia is not supported on ARMv7 - waiving sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
|
||||
# This sample is not supported on sbsa
|
||||
ifeq ($(TARGET_ARCH),sbsa)
|
||||
$(info >>> WARNING - cudaNvSciNvMedia is not supported on sbsa - waiving sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
|
||||
ALL_LDFLAGS :=
|
||||
ALL_LDFLAGS += $(ALL_CCFLAGS)
|
||||
ALL_LDFLAGS += $(addprefix -Xlinker ,$(LDFLAGS))
|
||||
ALL_LDFLAGS += $(addprefix -Xlinker ,$(EXTRA_LDFLAGS))
|
||||
|
||||
# Common includes and paths for CUDA
|
||||
INCLUDES := -I../../../Common
|
||||
LIBRARIES :=
|
||||
|
||||
################################################################################
|
||||
|
||||
# Makefile include to help find NVSCI Libraries
|
||||
include ./findnvsci.mk
|
||||
|
||||
# Makefile include to help find NvMedia Libraries
|
||||
include ./findnvmedia.mk
|
||||
|
||||
#Detect if installed version of GCC supports required C++11
|
||||
ifeq ($(TARGET_OS),linux)
|
||||
empty :=
|
||||
space := $(empty) $(empty)
|
||||
GCCVERSIONSTRING := $(shell expr `$(HOST_COMPILER) -dumpversion`)
|
||||
#Create version number without "."
|
||||
GCCVERSION := $(shell expr `echo $(GCCVERSIONSTRING)` | cut -f1 -d.)
|
||||
GCCVERSION += $(shell expr `echo $(GCCVERSIONSTRING)` | cut -f2 -d.)
|
||||
GCCVERSION += $(shell expr `echo $(GCCVERSIONSTRING)` | cut -f3 -d.)
|
||||
# Make sure the version number has at least 3 decimals
|
||||
GCCVERSION += 00
|
||||
# Remove spaces from the version number
|
||||
GCCVERSION := $(subst $(space),$(empty),$(GCCVERSION))
|
||||
#$(warning $(GCCVERSION))
|
||||
|
||||
IS_MIN_VERSION := $(shell expr `echo $(GCCVERSION)` \>= 47000)
|
||||
|
||||
ifeq ($(IS_MIN_VERSION), 1)
|
||||
$(info >>> GCC Version is greater or equal to 4.7.0 <<<)
|
||||
else
|
||||
$(info >>> Waiving build. Minimum GCC version required is 4.7.0<<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
endif
|
||||
|
||||
# Gencode arguments
|
||||
ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),armv7l aarch64 sbsa))
|
||||
SMS ?= 53 61 70 72 75 80 86 87
|
||||
else
|
||||
SMS ?= 35 37 50 52 60 61 70 75 80 86
|
||||
endif
|
||||
|
||||
ifeq ($(SMS),)
|
||||
$(info >>> WARNING - no SM architectures have been specified - waiving sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
|
||||
ifeq ($(GENCODE_FLAGS),)
|
||||
# Generate SASS code for each SM architecture listed in $(SMS)
|
||||
$(foreach sm,$(SMS),$(eval GENCODE_FLAGS += -gencode arch=compute_$(sm),code=sm_$(sm)))
|
||||
|
||||
# Generate PTX code from the highest SM architecture in $(SMS) to guarantee forward-compatibility
|
||||
HIGHEST_SM := $(lastword $(sort $(SMS)))
|
||||
ifneq ($(HIGHEST_SM),)
|
||||
GENCODE_FLAGS += -gencode arch=compute_$(HIGHEST_SM),code=compute_$(HIGHEST_SM)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_OS),darwin)
|
||||
ALL_LDFLAGS += -Xcompiler -F/Library/Frameworks -Xlinker -framework -Xlinker CUDA
|
||||
else
|
||||
ifeq ($(TARGET_ARCH),x86_64)
|
||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/lib64/stubs
|
||||
CUDA_SEARCH_PATH += $(CUDA_PATH)/lib/stubs
|
||||
CUDA_SEARCH_PATH += $(CUDA_PATH)/targets/x86_64-linux/lib/stubs
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux)
|
||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/armv7-linux-gnueabihf/lib/stubs
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux)
|
||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/aarch64-linux/lib/stubs
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),sbsa-linux)
|
||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/sbsa-linux/lib/stubs
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-android)
|
||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/armv7-linux-androideabi/lib/stubs
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-android)
|
||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/aarch64-linux-androideabi/lib/stubs
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-qnx)
|
||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/ARMv7-linux-QNX/lib/stubs
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx)
|
||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/aarch64-qnx/lib/stubs
|
||||
ifdef TARGET_OVERRIDE
|
||||
CUDA_SEARCH_PATH := $(CUDA_PATH)/targets/$(TARGET_OVERRIDE)/lib/stubs
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH),ppc64le)
|
||||
CUDA_SEARCH_PATH ?= $(CUDA_PATH)/targets/ppc64le-linux/lib/stubs
|
||||
endif
|
||||
|
||||
ifeq ($(HOST_ARCH),ppc64le)
|
||||
CUDA_SEARCH_PATH += $(CUDA_PATH)/lib64/stubs
|
||||
endif
|
||||
|
||||
CUDALIB ?= $(shell find -L $(CUDA_SEARCH_PATH) -maxdepth 1 -name libcuda.so 2> /dev/null)
|
||||
ifeq ("$(CUDALIB)","")
|
||||
$(info >>> WARNING - libcuda.so not found, CUDA Driver is not installed. Please re-install the driver. <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
else
|
||||
CUDALIB := $(shell echo $(CUDALIB) | sed "s/ .*//" | sed "s/\/libcuda.so//" )
|
||||
LIBRARIES += -L$(CUDALIB) -lcuda
|
||||
endif
|
||||
endif
|
||||
|
||||
ALL_CCFLAGS += --std=c++11 --threads 0
|
||||
|
||||
LIBRARIES += -lnvscibuf -lnvscisync -lnvmedia
|
||||
|
||||
ifeq ($(SAMPLE_ENABLED),0)
|
||||
EXEC ?= @echo "[@]"
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
|
||||
# Target rules
|
||||
all: build
|
||||
|
||||
build: cudaNvSciNvMedia
|
||||
|
||||
check.deps:
|
||||
ifeq ($(SAMPLE_ENABLED),0)
|
||||
@echo "Sample will be waived due to the above missing dependencies"
|
||||
else
|
||||
@echo "Sample is ready - all dependencies have been met"
|
||||
endif
|
||||
|
||||
cuda_consumer.o:cuda_consumer.cu
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
main.o:main.cpp
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
nvmedia_producer.o:nvmedia_producer.cpp
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
cmdline.o:nvmedia_utils/cmdline.cpp
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
config_parser.o:nvmedia_utils/config_parser.cpp
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
image_utils.o:nvmedia_utils/image_utils.cpp
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
log_utils.o:nvmedia_utils/log_utils.cpp
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
misc_utils.o:nvmedia_utils/misc_utils.cpp
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
nvsci_setup.o:nvsci_setup.cpp
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
cudaNvSciNvMedia: cuda_consumer.o main.o nvmedia_producer.o cmdline.o config_parser.o image_utils.o log_utils.o misc_utils.o nvsci_setup.o
|
||||
$(EXEC) $(NVCC) $(ALL_LDFLAGS) $(GENCODE_FLAGS) -o $@ $+ $(LIBRARIES)
|
||||
$(EXEC) mkdir -p ../../../bin/$(TARGET_ARCH)/$(TARGET_OS)/$(BUILD_TYPE)
|
||||
$(EXEC) cp $@ ../../../bin/$(TARGET_ARCH)/$(TARGET_OS)/$(BUILD_TYPE)
|
||||
|
||||
run: build
|
||||
$(EXEC) ./cudaNvSciNvMedia
|
||||
|
||||
testrun: build
|
||||
|
||||
clean:
|
||||
rm -f cudaNvSciNvMedia cuda_consumer.o main.o nvmedia_producer.o cmdline.o config_parser.o image_utils.o log_utils.o misc_utils.o nvsci_setup.o
|
||||
rm -rf ../../../bin/$(TARGET_ARCH)/$(TARGET_OS)/$(BUILD_TYPE)/cudaNvSciNvMedia
|
||||
|
||||
clobber: clean
|
||||
95
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/NsightEclipse.xml
Normal file
95
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/NsightEclipse.xml
Normal file
@@ -0,0 +1,95 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE entry SYSTEM "SamplesInfo.dtd">
|
||||
<entry>
|
||||
<name>cudaNvSciNvMedia</name>
|
||||
<cflags>
|
||||
<flag>--std=c++11</flag>
|
||||
</cflags>
|
||||
<cuda_api_list>
|
||||
<driver>cuDeviceGetUuid</driver>
|
||||
<toolkit>cudaGetMipmappedArrayLevel</toolkit>
|
||||
<toolkit>cudaImportNvSciImage</toolkit>
|
||||
<toolkit>cudaImportExternalSemaphore</toolkit>
|
||||
<toolkit>cudaStreamCreateWithFlags</toolkit>
|
||||
<toolkit>cudaExternalMemoryGetMappedMipmappedArray</toolkit>
|
||||
<toolkit>cudaDestroyExternalMemory</toolkit>
|
||||
<toolkit>cudaMemcpyAsync</toolkit>
|
||||
<toolkit>cudaStreamDestroy</toolkit>
|
||||
<toolkit>cudaSignalExternalSemaphoresAsync</toolkit>
|
||||
<toolkit>cudaDeviceGetNvSciSyncAttributes</toolkit>
|
||||
<toolkit>cudaFreeMipmappedArray</toolkit>
|
||||
<toolkit>cudaMallocHost</toolkit>
|
||||
<toolkit>cudaDestroySurfaceObject</toolkit>
|
||||
<toolkit>cudaImportExternalMemory</toolkit>
|
||||
<toolkit>cudaMalloc</toolkit>
|
||||
<toolkit>cudaSetDevice</toolkit>
|
||||
<toolkit>cudaDestroyExternalSemaphore</toolkit>
|
||||
<toolkit>cudaCreateChannelDesc</toolkit>
|
||||
<toolkit>cudaStreamSynchronize</toolkit>
|
||||
<toolkit>cudaFree</toolkit>
|
||||
<toolkit>cudaFreeArray</toolkit>
|
||||
<toolkit>cudaCreateSurfaceObject</toolkit>
|
||||
<toolkit>cudaFreeHost</toolkit>
|
||||
<toolkit>cudaMallocArray</toolkit>
|
||||
<toolkit>cudaWaitExternalSemaphoresAsync</toolkit>
|
||||
<toolkit>cudaImportNvSciSync</toolkit>
|
||||
</cuda_api_list>
|
||||
<description><![CDATA[This sample demonstrates CUDA-NvMedia interop via NvSciBuf/NvSciSync APIs. Note that this sample only supports cross build from x86_64 to aarch64, aarch64 native build is not supported. For detailed workflow of the sample please check cudaNvSciNvMedia_Readme.pdf in the sample directory.]]></description>
|
||||
<devicecompilation>whole</devicecompilation>
|
||||
<includepaths>
|
||||
<path>./</path>
|
||||
<path>../</path>
|
||||
<path>../../../Common</path>
|
||||
</includepaths>
|
||||
<keyconcepts>
|
||||
<concept level="basic">CUDA NvSci Interop</concept>
|
||||
<concept level="advanced">Data Parallel Algorithms</concept>
|
||||
<concept level="advanced">Image Processing</concept>
|
||||
</keyconcepts>
|
||||
<keywords>
|
||||
<keyword>CUDA</keyword>
|
||||
<keyword>CPP11</keyword>
|
||||
</keywords>
|
||||
<libraries>
|
||||
<library os="linux">cuda</library>
|
||||
<library framework="true" os="macosx">CUDA</library>
|
||||
<library>nvscibuf</library>
|
||||
<library>nvscisync</library>
|
||||
<library>nvmedia</library>
|
||||
</libraries>
|
||||
<librarypaths>
|
||||
</librarypaths>
|
||||
<nsight_eclipse>true</nsight_eclipse>
|
||||
<primary_file>main.cpp</primary_file>
|
||||
<required_dependencies>
|
||||
<dependency>NVSCI</dependency>
|
||||
<dependency>NvMedia</dependency>
|
||||
</required_dependencies>
|
||||
<scopes>
|
||||
<scope>1:CUDA Advanced Topics</scope>
|
||||
<scope>1:CUDA NvSciBuf/NvSciSync Interop</scope>
|
||||
</scopes>
|
||||
<sm-arch>sm60</sm-arch>
|
||||
<sm-arch>sm61</sm-arch>
|
||||
<sm-arch>sm70</sm-arch>
|
||||
<sm-arch>sm72</sm-arch>
|
||||
<sm-arch>sm75</sm-arch>
|
||||
<sm-arch>sm80</sm-arch>
|
||||
<sm-arch>sm86</sm-arch>
|
||||
<sm-arch>sm87</sm-arch>
|
||||
<supported_envs>
|
||||
<env>
|
||||
<arch>aarch64</arch>
|
||||
<platform>linux</platform>
|
||||
</env>
|
||||
<env>
|
||||
<arch>aarch64</arch>
|
||||
<platform>qnx</platform>
|
||||
</env>
|
||||
</supported_envs>
|
||||
<supported_sm_architectures>
|
||||
<from>6.0</from>
|
||||
</supported_sm_architectures>
|
||||
<title>NvMedia CUDA Interop</title>
|
||||
<type>exe</type>
|
||||
</entry>
|
||||
67
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/README.md
Normal file
67
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/README.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# cudaNvSciNvMedia - NvMedia CUDA Interop
|
||||
|
||||
## Description
|
||||
|
||||
This sample demonstrates CUDA-NvMedia interop via NvSciBuf/NvSciSync APIs. Note that this sample only supports cross build from x86_64 to aarch64, aarch64 native build is not supported. For detailed workflow of the sample please check cudaNvSciNvMedia_Readme.pdf in the sample directory.
|
||||
|
||||
## Key Concepts
|
||||
|
||||
CUDA NvSci Interop, Data Parallel Algorithms, Image Processing
|
||||
|
||||
## Supported SM Architectures
|
||||
|
||||
[SM 6.0 ](https://developer.nvidia.com/cuda-gpus) [SM 6.1 ](https://developer.nvidia.com/cuda-gpus) [SM 7.0 ](https://developer.nvidia.com/cuda-gpus) [SM 7.2 ](https://developer.nvidia.com/cuda-gpus) [SM 7.5 ](https://developer.nvidia.com/cuda-gpus) [SM 8.0 ](https://developer.nvidia.com/cuda-gpus) [SM 8.6 ](https://developer.nvidia.com/cuda-gpus) [SM 8.7 ](https://developer.nvidia.com/cuda-gpus)
|
||||
|
||||
## Supported OSes
|
||||
|
||||
Linux, QNX
|
||||
|
||||
## Supported CPU Architecture
|
||||
|
||||
aarch64
|
||||
|
||||
## CUDA APIs involved
|
||||
|
||||
### [CUDA Driver API](http://docs.nvidia.com/cuda/cuda-driver-api/index.html)
|
||||
cuDeviceGetUuid
|
||||
|
||||
### [CUDA Runtime API](http://docs.nvidia.com/cuda/cuda-runtime-api/index.html)
|
||||
cudaGetMipmappedArrayLevel, cudaImportNvSciImage, cudaImportExternalSemaphore, cudaStreamCreateWithFlags, cudaExternalMemoryGetMappedMipmappedArray, cudaDestroyExternalMemory, cudaMemcpyAsync, cudaStreamDestroy, cudaSignalExternalSemaphoresAsync, cudaDeviceGetNvSciSyncAttributes, cudaFreeMipmappedArray, cudaMallocHost, cudaDestroySurfaceObject, cudaImportExternalMemory, cudaMalloc, cudaSetDevice, cudaDestroyExternalSemaphore, cudaCreateChannelDesc, cudaStreamSynchronize, cudaFree, cudaFreeArray, cudaCreateSurfaceObject, cudaFreeHost, cudaMallocArray, cudaWaitExternalSemaphoresAsync, cudaImportNvSciSync
|
||||
|
||||
## Dependencies needed to build/run
|
||||
[NVSCI](../../README.md#nvsci), [NvMedia](../../README.md#nvmedia)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Download and install the [CUDA Toolkit 11.6](https://developer.nvidia.com/cuda-downloads) for your corresponding platform.
|
||||
Make sure the dependencies mentioned in [Dependencies]() section above are installed.
|
||||
|
||||
## Build and Run
|
||||
|
||||
### Linux
|
||||
The Linux samples are built using makefiles. To use the makefiles, change the current directory to the sample directory you wish to build, and run make:
|
||||
```
|
||||
$ cd <sample_dir>
|
||||
$ make
|
||||
```
|
||||
The samples makefiles can take advantage of certain options:
|
||||
* **TARGET_ARCH=<arch>** - cross-compile targeting a specific architecture. Allowed architectures are aarch64.
|
||||
By default, TARGET_ARCH is set to HOST_ARCH. On a x86_64 machine, not setting TARGET_ARCH is the equivalent of setting TARGET_ARCH=x86_64.<br/>
|
||||
`$ make TARGET_ARCH=aarch64` <br/>
|
||||
See [here](http://docs.nvidia.com/cuda/cuda-samples/index.html#cross-samples) for more details.
|
||||
* **dbg=1** - build with debug symbols
|
||||
```
|
||||
$ make dbg=1
|
||||
```
|
||||
* **SMS="A B ..."** - override the SM architectures for which the sample will be built, where `"A B ..."` is a space-delimited list of SM architectures. For example, to generate SASS for SM 50 and SM 60, use `SMS="50 60"`.
|
||||
```
|
||||
$ make SMS="50 60"
|
||||
```
|
||||
|
||||
* **HOST_COMPILER=<host_compiler>** - override the default g++ host compiler. See the [Linux Installation Guide](http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#system-requirements) for a list of supported host compilers.
|
||||
```
|
||||
$ make HOST_COMPILER=g++
|
||||
```
|
||||
|
||||
## References (for more details)
|
||||
|
||||
Binary file not shown.
428
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/cuda_consumer.cu
Normal file
428
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/cuda_consumer.cu
Normal file
@@ -0,0 +1,428 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <cuda_runtime.h>
|
||||
#include "cuda_consumer.h"
|
||||
#include <helper_image.h>
|
||||
#include "nvmedia_image_nvscibuf.h"
|
||||
#include "nvmedia_utils/cmdline.h"
|
||||
|
||||
// Enable this to 1 if require cuda processed output to ppm file.
|
||||
#define WRITE_OUTPUT_IMAGE 0
|
||||
|
||||
#define checkNvSciErrors(call) \
|
||||
do { \
|
||||
NvSciError _status = call; \
|
||||
if (NvSciError_Success != _status) { \
|
||||
printf( \
|
||||
"NVSCI call in file '%s' in line %i returned" \
|
||||
" %d, expected %d\n", \
|
||||
__FILE__, __LINE__, _status, NvSciError_Success); \
|
||||
fflush(stdout); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
__global__ static void yuvToGrayscale(cudaSurfaceObject_t surfaceObject,
|
||||
unsigned int *dstImage,
|
||||
int32_t imageWidth, int32_t imageHeight) {
|
||||
size_t x = blockIdx.x * blockDim.x + threadIdx.x;
|
||||
size_t y = blockIdx.y * blockDim.y + threadIdx.y;
|
||||
|
||||
uchar4 *dstImageUchar4 = (uchar4 *)dstImage;
|
||||
for (; x < imageWidth && y < imageHeight;
|
||||
x += gridDim.x * blockDim.x, y += gridDim.y * blockDim.y) {
|
||||
int colInBytes = x * sizeof(unsigned char);
|
||||
unsigned char luma =
|
||||
surf2Dread<unsigned char>(surfaceObject, colInBytes, y);
|
||||
uchar4 grayscalePix = make_uchar4(luma, luma, luma, 0);
|
||||
|
||||
dstImageUchar4[y * imageWidth + x] = grayscalePix;
|
||||
}
|
||||
}
|
||||
|
||||
static void cudaImportNvSciSync(cudaExternalSemaphore_t &extSem,
|
||||
NvSciSyncObj &syncObj) {
|
||||
cudaExternalSemaphoreHandleDesc extSemDesc;
|
||||
memset(&extSemDesc, 0, sizeof(extSemDesc));
|
||||
extSemDesc.type = cudaExternalSemaphoreHandleTypeNvSciSync;
|
||||
extSemDesc.handle.nvSciSyncObj = (void *)syncObj;
|
||||
|
||||
checkCudaErrors(cudaImportExternalSemaphore(&extSem, &extSemDesc));
|
||||
}
|
||||
|
||||
static void waitExternalSemaphore(cudaExternalSemaphore_t &waitSem,
|
||||
NvSciSyncFence *fence, cudaStream_t stream) {
|
||||
cudaExternalSemaphoreWaitParams waitParams;
|
||||
memset(&waitParams, 0, sizeof(waitParams));
|
||||
// For cross-process signaler-waiter applications need to use NvSciIpc
|
||||
// and NvSciSync[Export|Import] utilities to share the NvSciSyncFence
|
||||
// across process. This step is optional in single-process.
|
||||
waitParams.params.nvSciSync.fence = (void *)fence;
|
||||
waitParams.flags = 0;
|
||||
|
||||
checkCudaErrors(
|
||||
cudaWaitExternalSemaphoresAsync(&waitSem, &waitParams, 1, stream));
|
||||
}
|
||||
|
||||
static void signalExternalSemaphore(cudaExternalSemaphore_t &signalSem,
|
||||
NvSciSyncFence *fence,
|
||||
cudaStream_t stream) {
|
||||
cudaExternalSemaphoreSignalParams signalParams;
|
||||
memset(&signalParams, 0, sizeof(signalParams));
|
||||
// For cross-process signaler-waiter applications need to use NvSciIpc
|
||||
// and NvSciSync[Export|Import] utilities to share the NvSciSyncFence
|
||||
// across process. This step is optional in single-process.
|
||||
signalParams.params.nvSciSync.fence = (void *)fence;
|
||||
signalParams.flags = 0;
|
||||
|
||||
checkCudaErrors(
|
||||
cudaSignalExternalSemaphoresAsync(&signalSem, &signalParams, 1, stream));
|
||||
}
|
||||
|
||||
static void yuvToGrayscaleCudaKernel(cudaExternalResInterop &cudaExtResObj,
|
||||
int32_t imageWidth, int32_t imageHeight) {
|
||||
#if WRITE_OUTPUT_IMAGE
|
||||
unsigned int *h_dstImage;
|
||||
checkCudaErrors(cudaMallocHost(
|
||||
&h_dstImage, sizeof(unsigned int) * imageHeight * imageWidth));
|
||||
#endif
|
||||
dim3 block(16, 16, 1);
|
||||
dim3 grid((imageWidth / block.x) + 1, (imageHeight / block.y) + 1, 1);
|
||||
|
||||
yuvToGrayscale<<<grid, block, 0, cudaExtResObj.stream>>>(
|
||||
cudaExtResObj.cudaSurfaceNvmediaBuf[0], cudaExtResObj.d_outputImage,
|
||||
imageWidth, imageHeight);
|
||||
|
||||
#if WRITE_OUTPUT_IMAGE
|
||||
checkCudaErrors(
|
||||
cudaMemcpyAsync(h_dstImage, cudaExtResObj.d_outputImage,
|
||||
sizeof(unsigned int) * imageHeight * imageWidth,
|
||||
cudaMemcpyDeviceToHost, cudaExtResObj.stream));
|
||||
checkCudaErrors(cudaStreamSynchronize(cudaExtResObj.stream));
|
||||
char outputFilename[1024];
|
||||
std::string image_filename = "Grayscale";
|
||||
strcpy(outputFilename, image_filename.c_str());
|
||||
strcpy(outputFilename + image_filename.length(), "_nvsci_out.ppm");
|
||||
sdkSavePPM4ub(outputFilename, (unsigned char *)h_dstImage, imageWidth,
|
||||
imageHeight);
|
||||
printf("Wrote '%s'\n", outputFilename);
|
||||
checkCudaErrors(cudaFreeHost(h_dstImage));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void cudaImportNvSciImage(cudaExternalResInterop &cudaExtResObj,
|
||||
NvSciBufObj &inputBufObj) {
|
||||
NvSciBufModule module = NULL;
|
||||
NvSciBufAttrList attrlist = NULL;
|
||||
NvSciBufAttrKeyValuePair pairArrayOut[10];
|
||||
|
||||
checkNvSciErrors(NvSciBufModuleOpen(&module));
|
||||
checkNvSciErrors(NvSciBufAttrListCreate(module, &attrlist));
|
||||
checkNvSciErrors(NvSciBufObjGetAttrList(inputBufObj, &attrlist));
|
||||
|
||||
memset(pairArrayOut, 0, sizeof(NvSciBufAttrKeyValuePair) * 10);
|
||||
|
||||
int numAttrs = 0;
|
||||
pairArrayOut[numAttrs++].key = NvSciBufImageAttrKey_Size;
|
||||
pairArrayOut[numAttrs++].key = NvSciBufImageAttrKey_PlaneChannelCount;
|
||||
pairArrayOut[numAttrs++].key = NvSciBufImageAttrKey_PlaneCount;
|
||||
pairArrayOut[numAttrs++].key = NvSciBufImageAttrKey_PlaneWidth;
|
||||
pairArrayOut[numAttrs++].key = NvSciBufImageAttrKey_PlaneHeight;
|
||||
pairArrayOut[numAttrs++].key = NvSciBufImageAttrKey_Layout;
|
||||
pairArrayOut[numAttrs++].key = NvSciBufImageAttrKey_PlaneBitsPerPixel;
|
||||
pairArrayOut[numAttrs++].key = NvSciBufImageAttrKey_PlaneOffset;
|
||||
|
||||
checkNvSciErrors(NvSciBufAttrListGetAttrs(attrlist, pairArrayOut, numAttrs));
|
||||
|
||||
uint64_t size = *(uint64_t *)pairArrayOut[0].value;
|
||||
uint8_t channelCount = *(uint8_t *)pairArrayOut[1].value;
|
||||
cudaExtResObj.planeCount = *(int32_t *)pairArrayOut[2].value;
|
||||
cudaExtResObj.imageWidth =
|
||||
(int32_t *)malloc(sizeof(int32_t) * cudaExtResObj.planeCount);
|
||||
cudaExtResObj.imageHeight =
|
||||
(int32_t *)malloc(sizeof(int32_t) * cudaExtResObj.planeCount);
|
||||
cudaExtResObj.planeOffset =
|
||||
(uint64_t *)malloc(sizeof(uint64_t) * cudaExtResObj.planeCount);
|
||||
|
||||
memcpy(cudaExtResObj.imageWidth, (int32_t *)pairArrayOut[3].value,
|
||||
cudaExtResObj.planeCount * sizeof(int32_t));
|
||||
memcpy(cudaExtResObj.imageHeight, (int32_t *)pairArrayOut[4].value,
|
||||
cudaExtResObj.planeCount * sizeof(int32_t));
|
||||
memcpy(cudaExtResObj.planeOffset, (uint64_t *)pairArrayOut[7].value,
|
||||
cudaExtResObj.planeCount * sizeof(uint64_t));
|
||||
|
||||
NvSciBufAttrValImageLayoutType layout =
|
||||
*(NvSciBufAttrValImageLayoutType *)pairArrayOut[5].value;
|
||||
uint32_t bitsPerPixel = *(uint32_t *)pairArrayOut[6].value;
|
||||
|
||||
if (layout != NvSciBufImage_BlockLinearType) {
|
||||
printf("Image layout is not block linear.. waiving execution\n");
|
||||
exit(EXIT_WAIVED);
|
||||
}
|
||||
|
||||
cudaExternalMemoryHandleDesc memHandleDesc;
|
||||
memset(&memHandleDesc, 0, sizeof(memHandleDesc));
|
||||
memHandleDesc.type = cudaExternalMemoryHandleTypeNvSciBuf;
|
||||
memHandleDesc.handle.nvSciBufObject = inputBufObj;
|
||||
memHandleDesc.size = size;
|
||||
checkCudaErrors(
|
||||
cudaImportExternalMemory(&cudaExtResObj.extMemImageBuf, &memHandleDesc));
|
||||
|
||||
cudaExtResObj.d_mipmapArray = (cudaMipmappedArray_t *)malloc(
|
||||
sizeof(cudaMipmappedArray_t) * cudaExtResObj.planeCount);
|
||||
|
||||
for (int i = 0; i < cudaExtResObj.planeCount; i++) {
|
||||
cudaExtent extent = {};
|
||||
memset(&extent, 0, sizeof(extent));
|
||||
extent.width = cudaExtResObj.imageWidth[i];
|
||||
extent.height = cudaExtResObj.imageHeight[i];
|
||||
extent.depth = 0;
|
||||
cudaChannelFormatDesc desc;
|
||||
switch (channelCount) {
|
||||
case 1:
|
||||
default:
|
||||
desc = cudaCreateChannelDesc(bitsPerPixel, 0, 0, 0,
|
||||
cudaChannelFormatKindUnsigned);
|
||||
break;
|
||||
case 2:
|
||||
desc = cudaCreateChannelDesc(bitsPerPixel, bitsPerPixel, 0, 0,
|
||||
cudaChannelFormatKindUnsigned);
|
||||
break;
|
||||
case 3:
|
||||
desc = cudaCreateChannelDesc(bitsPerPixel, bitsPerPixel, bitsPerPixel,
|
||||
0, cudaChannelFormatKindUnsigned);
|
||||
break;
|
||||
case 4:
|
||||
desc =
|
||||
cudaCreateChannelDesc(bitsPerPixel, bitsPerPixel, bitsPerPixel,
|
||||
bitsPerPixel, cudaChannelFormatKindUnsigned);
|
||||
break;
|
||||
}
|
||||
|
||||
cudaExternalMemoryMipmappedArrayDesc mipmapDesc = {0};
|
||||
mipmapDesc.offset = cudaExtResObj.planeOffset[i];
|
||||
mipmapDesc.formatDesc = desc;
|
||||
mipmapDesc.extent = extent;
|
||||
mipmapDesc.flags = 0;
|
||||
mipmapDesc.numLevels = 1;
|
||||
checkCudaErrors(cudaExternalMemoryGetMappedMipmappedArray(
|
||||
&cudaExtResObj.d_mipmapArray[i], cudaExtResObj.extMemImageBuf,
|
||||
&mipmapDesc));
|
||||
}
|
||||
}
|
||||
|
||||
static cudaSurfaceObject_t createCudaSurface(cudaArray_t &d_mipLevelArray) {
|
||||
cudaResourceDesc resourceDesc;
|
||||
memset(&resourceDesc, 0, sizeof(resourceDesc));
|
||||
resourceDesc.resType = cudaResourceTypeArray;
|
||||
resourceDesc.res.array.array = d_mipLevelArray;
|
||||
|
||||
cudaSurfaceObject_t surfaceObject;
|
||||
checkCudaErrors(cudaCreateSurfaceObject(&surfaceObject, &resourceDesc));
|
||||
return surfaceObject;
|
||||
}
|
||||
|
||||
static cudaStream_t createCudaStream(int deviceId) {
|
||||
checkCudaErrors(cudaSetDevice(deviceId));
|
||||
cudaStream_t stream;
|
||||
checkCudaErrors(cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking));
|
||||
return stream;
|
||||
}
|
||||
|
||||
// CUDA setup buffers/synchronization objects for interop via NvSci API.
|
||||
void setupCuda(cudaExternalResInterop &cudaExtResObj, NvSciBufObj &inputBufObj,
|
||||
NvSciSyncObj &syncObj, NvSciSyncObj &cudaSignalerSyncObj,
|
||||
int deviceId) {
|
||||
checkCudaErrors(cudaSetDevice(deviceId));
|
||||
cudaImportNvSciSync(cudaExtResObj.waitSem, syncObj);
|
||||
cudaImportNvSciSync(cudaExtResObj.signalSem, cudaSignalerSyncObj);
|
||||
|
||||
cudaImportNvSciImage(cudaExtResObj, inputBufObj);
|
||||
cudaExtResObj.d_mipLevelArray =
|
||||
(cudaArray_t *)malloc(sizeof(cudaArray_t) * cudaExtResObj.planeCount);
|
||||
cudaExtResObj.cudaSurfaceNvmediaBuf = (cudaSurfaceObject_t *)malloc(
|
||||
sizeof(cudaSurfaceObject_t) * cudaExtResObj.planeCount);
|
||||
|
||||
for (int i = 0; i < cudaExtResObj.planeCount; ++i) {
|
||||
uint32_t mipLevelId = 0;
|
||||
checkCudaErrors(
|
||||
cudaGetMipmappedArrayLevel(&cudaExtResObj.d_mipLevelArray[i],
|
||||
cudaExtResObj.d_mipmapArray[i], mipLevelId));
|
||||
cudaExtResObj.cudaSurfaceNvmediaBuf[i] =
|
||||
createCudaSurface(cudaExtResObj.d_mipLevelArray[i]);
|
||||
}
|
||||
|
||||
cudaExtResObj.stream = createCudaStream(deviceId);
|
||||
checkCudaErrors(cudaMalloc(&cudaExtResObj.d_outputImage,
|
||||
sizeof(unsigned int) *
|
||||
cudaExtResObj.imageWidth[0] *
|
||||
cudaExtResObj.imageHeight[0]));
|
||||
}
|
||||
|
||||
// CUDA clean up buffers used **with** NvSci API.
|
||||
void cleanupCuda(cudaExternalResInterop &cudaExtResObj) {
|
||||
for (int i = 0; i < cudaExtResObj.planeCount; i++) {
|
||||
checkCudaErrors(
|
||||
cudaDestroySurfaceObject(cudaExtResObj.cudaSurfaceNvmediaBuf[i]));
|
||||
checkCudaErrors(cudaFreeMipmappedArray(cudaExtResObj.d_mipmapArray[i]));
|
||||
}
|
||||
free(cudaExtResObj.d_mipmapArray);
|
||||
free(cudaExtResObj.d_mipLevelArray);
|
||||
free(cudaExtResObj.cudaSurfaceNvmediaBuf);
|
||||
free(cudaExtResObj.imageWidth);
|
||||
free(cudaExtResObj.imageHeight);
|
||||
checkCudaErrors(cudaDestroyExternalSemaphore(cudaExtResObj.waitSem));
|
||||
checkCudaErrors(cudaDestroyExternalSemaphore(cudaExtResObj.signalSem));
|
||||
checkCudaErrors(cudaDestroyExternalMemory(cudaExtResObj.extMemImageBuf));
|
||||
checkCudaErrors(cudaStreamDestroy(cudaExtResObj.stream));
|
||||
checkCudaErrors(cudaFree(cudaExtResObj.d_outputImage));
|
||||
}
|
||||
|
||||
void runCudaOperation(cudaExternalResInterop &cudaExtResObj,
|
||||
NvSciSyncFence *cudaWaitFence,
|
||||
NvSciSyncFence *cudaSignalFence, int deviceId,
|
||||
int iterations) {
|
||||
checkCudaErrors(cudaSetDevice(deviceId));
|
||||
static int64_t launch = 0;
|
||||
|
||||
waitExternalSemaphore(cudaExtResObj.waitSem, cudaWaitFence,
|
||||
cudaExtResObj.stream);
|
||||
|
||||
// run cuda kernel over surface object of the LUMA surface part to extract
|
||||
// grayscale.
|
||||
yuvToGrayscaleCudaKernel(cudaExtResObj, cudaExtResObj.imageWidth[0],
|
||||
cudaExtResObj.imageHeight[0]);
|
||||
|
||||
// signal fence till the second last iterations for NvMedia2DBlit to wait for
|
||||
// cuda signal and for final iteration as there is no corresponding NvMedia
|
||||
// operation pending therefore we end with cudaStreamSynchronize()
|
||||
if (launch < iterations - 1) {
|
||||
signalExternalSemaphore(cudaExtResObj.signalSem, cudaSignalFence,
|
||||
cudaExtResObj.stream);
|
||||
} else {
|
||||
checkCudaErrors(cudaStreamSynchronize(cudaExtResObj.stream));
|
||||
}
|
||||
launch++;
|
||||
}
|
||||
|
||||
// CUDA imports and operates on NvSci buffer/synchronization objects
|
||||
void setupCuda(Blit2DTest *ctx, cudaResources &cudaResObj, int deviceId) {
|
||||
checkCudaErrors(cudaSetDevice(deviceId));
|
||||
cudaResObj.d_yuvArray =
|
||||
(cudaArray_t *)malloc(sizeof(cudaArray_t) * ctx->numSurfaces);
|
||||
cudaResObj.cudaSurfaceNvmediaBuf = (cudaSurfaceObject_t *)malloc(
|
||||
sizeof(cudaSurfaceObject_t) * ctx->numSurfaces);
|
||||
cudaChannelFormatDesc channelDesc;
|
||||
switch (ctx->bytesPerPixel) {
|
||||
case 1:
|
||||
default:
|
||||
channelDesc =
|
||||
cudaCreateChannelDesc(8, 0, 0, 0, cudaChannelFormatKindUnsigned);
|
||||
break;
|
||||
}
|
||||
|
||||
for (int k = 0; k < ctx->numSurfaces; k++) {
|
||||
checkCudaErrors(cudaMallocArray(
|
||||
&cudaResObj.d_yuvArray[k], &channelDesc,
|
||||
ctx->widthSurface * ctx->xScalePtr[k] * ctx->bytesPerPixel,
|
||||
ctx->heightSurface * ctx->yScalePtr[k]));
|
||||
cudaResObj.cudaSurfaceNvmediaBuf[k] =
|
||||
createCudaSurface(cudaResObj.d_yuvArray[k]);
|
||||
}
|
||||
checkCudaErrors(cudaMalloc(
|
||||
&cudaResObj.d_outputImage,
|
||||
sizeof(unsigned int) * ctx->widthSurface * ctx->heightSurface));
|
||||
|
||||
cudaResObj.stream = createCudaStream(deviceId);
|
||||
}
|
||||
|
||||
// CUDA clean up buffers used **without** NvSci API.
|
||||
void cleanupCuda(Blit2DTest *ctx, cudaResources &cudaResObj) {
|
||||
for (int k = 0; k < ctx->numSurfaces; k++) {
|
||||
checkCudaErrors(
|
||||
cudaDestroySurfaceObject(cudaResObj.cudaSurfaceNvmediaBuf[k]));
|
||||
checkCudaErrors(cudaFreeArray(cudaResObj.d_yuvArray[k]));
|
||||
}
|
||||
|
||||
free(cudaResObj.cudaSurfaceNvmediaBuf);
|
||||
|
||||
checkCudaErrors(cudaStreamDestroy(cudaResObj.stream));
|
||||
checkCudaErrors(cudaFree(cudaResObj.d_outputImage));
|
||||
}
|
||||
|
||||
static void yuvToGrayscaleCudaKernelNonNvSci(cudaResources &cudaResObj,
|
||||
int deviceId, int32_t imageWidth,
|
||||
int32_t imageHeight) {
|
||||
#if WRITE_OUTPUT_IMAGE
|
||||
unsigned int *h_dstImage;
|
||||
checkCudaErrors(cudaMallocHost(
|
||||
&h_dstImage, sizeof(unsigned int) * imageHeight * imageWidth));
|
||||
#endif
|
||||
dim3 block(16, 16, 1);
|
||||
dim3 grid((imageWidth / block.x) + 1, (imageHeight / block.y) + 1, 1);
|
||||
|
||||
yuvToGrayscale<<<grid, block, 0, cudaResObj.stream>>>(
|
||||
cudaResObj.cudaSurfaceNvmediaBuf[0], cudaResObj.d_outputImage, imageWidth,
|
||||
imageHeight);
|
||||
|
||||
#if WRITE_OUTPUT_IMAGE
|
||||
checkCudaErrors(
|
||||
cudaMemcpyAsync(h_dstImage, cudaResObj.d_outputImage,
|
||||
sizeof(unsigned int) * imageHeight * imageWidth,
|
||||
cudaMemcpyDeviceToHost, cudaResObj.stream));
|
||||
checkCudaErrors(cudaStreamSynchronize(cudaResObj.stream));
|
||||
char outputFilename[1024];
|
||||
std::string image_filename = "Grayscale";
|
||||
strcpy(outputFilename, image_filename.c_str());
|
||||
strcpy(outputFilename + image_filename.length(), "_non-nvsci_out.ppm");
|
||||
sdkSavePPM4ub(outputFilename, (unsigned char *)h_dstImage, imageWidth,
|
||||
imageHeight);
|
||||
printf("Wrote '%s'\n", outputFilename);
|
||||
checkCudaErrors(cudaFreeHost(h_dstImage));
|
||||
#else
|
||||
checkCudaErrors(cudaStreamSynchronize(cudaResObj.stream));
|
||||
#endif
|
||||
}
|
||||
|
||||
// CUDA operates **without** NvSci APIs buffer/synchronization objects.
|
||||
void runCudaOperation(Blit2DTest *ctx, cudaResources &cudaResObj,
|
||||
int deviceId) {
|
||||
for (int k = 0; k < ctx->numSurfaces; k++) {
|
||||
checkCudaErrors(cudaMemcpy2DToArray(
|
||||
cudaResObj.d_yuvArray[k], 0, 0, ctx->dstBuff[k],
|
||||
ctx->widthSurface * ctx->xScalePtr[k] * ctx->bytesPerPixel,
|
||||
ctx->widthSurface * ctx->xScalePtr[k] * ctx->bytesPerPixel,
|
||||
ctx->heightSurface * ctx->yScalePtr[k], cudaMemcpyHostToDevice));
|
||||
}
|
||||
// run cuda kernel over surface object of the LUMA surface part to extract
|
||||
// grayscale.
|
||||
yuvToGrayscaleCudaKernelNonNvSci(cudaResObj, deviceId, ctx->widthSurface,
|
||||
ctx->heightSurface);
|
||||
}
|
||||
72
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/cuda_consumer.h
Normal file
72
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/cuda_consumer.h
Normal file
@@ -0,0 +1,72 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __CUDA_BUFIMPORT_KERNEL_H__
|
||||
#define __CUDA_BUFIMPORT_KERNEL_H__
|
||||
|
||||
#include <cuda_runtime.h>
|
||||
#include "helper_cuda.h"
|
||||
#include "nvmedia_image_nvscibuf.h"
|
||||
#include "nvscisync.h"
|
||||
#include "nvmedia_utils/cmdline.h"
|
||||
|
||||
struct cudaExternalResInterop {
|
||||
cudaMipmappedArray_t *d_mipmapArray;
|
||||
cudaArray_t *d_mipLevelArray;
|
||||
cudaSurfaceObject_t *cudaSurfaceNvmediaBuf;
|
||||
cudaStream_t stream;
|
||||
cudaExternalMemory_t extMemImageBuf;
|
||||
cudaExternalSemaphore_t waitSem;
|
||||
cudaExternalSemaphore_t signalSem;
|
||||
|
||||
int32_t planeCount;
|
||||
uint64_t *planeOffset;
|
||||
int32_t *imageWidth;
|
||||
int32_t *imageHeight;
|
||||
unsigned int *d_outputImage;
|
||||
};
|
||||
|
||||
struct cudaResources {
|
||||
cudaArray_t *d_yuvArray;
|
||||
cudaStream_t stream;
|
||||
cudaSurfaceObject_t *cudaSurfaceNvmediaBuf;
|
||||
unsigned int *d_outputImage;
|
||||
};
|
||||
|
||||
void runCudaOperation(cudaExternalResInterop &cudaExtResObj,
|
||||
NvSciSyncFence *fence, NvSciSyncFence *cudaSignalfence,
|
||||
int deviceId, int iterations);
|
||||
void runCudaOperation(Blit2DTest *ctx, cudaResources &cudaResObj, int deviceId);
|
||||
|
||||
void setupCuda(cudaExternalResInterop &cudaExtResObj, NvSciBufObj &inputBufObj,
|
||||
NvSciSyncObj &syncObj, NvSciSyncObj &cudaSignalerSyncObj,
|
||||
int deviceId);
|
||||
void setupCuda(Blit2DTest *ctx, cudaResources &cudaResObj, int deviceId);
|
||||
void cleanupCuda(cudaExternalResInterop &cudaObjs);
|
||||
void cleanupCuda(Blit2DTest *ctx, cudaResources &cudaResObj);
|
||||
|
||||
#endif
|
||||
127
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/findnvmedia.mk
Normal file
127
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/findnvmedia.mk
Normal file
@@ -0,0 +1,127 @@
|
||||
################################################################################
|
||||
# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
#################################################################################
|
||||
# findnvmedia.mk is used to find the NvMedia Libraries
|
||||
#
|
||||
################################################################################
|
||||
|
||||
# Determine OS platform and unix distribution
|
||||
ifeq ("$(TARGET_OS)","linux")
|
||||
# first search lsb_release
|
||||
DISTRO = $(shell lsb_release -i -s 2>/dev/null | tr "[:upper:]" "[:lower:]")
|
||||
ifeq ("$(DISTRO)","")
|
||||
# second search and parse /etc/issue
|
||||
DISTRO = $(shell more /etc/issue | awk '{print $$1}' | sed '1!d' | sed -e "/^$$/d" 2>/dev/null | tr "[:upper:]" "[:lower:]")
|
||||
# ensure data from /etc/issue is valid
|
||||
ifeq (,$(filter $(DISTRO),ubuntu fedora red rhel centos suse))
|
||||
DISTRO =
|
||||
endif
|
||||
ifeq ("$(DISTRO)","")
|
||||
# third, we can search in /etc/os-release or /etc/{distro}-release
|
||||
DISTRO = $(shell awk '/ID/' /etc/*-release | sed 's/ID=//' | grep -v "VERSION" | grep -v "ID" | grep -v "DISTRIB")
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ("$(TARGET_OS)","linux")
|
||||
# $(info) >> findegl.mk -> LINUX path <<<)
|
||||
# Each set of Linux Distros have different paths for where to find their OpenGL libraries reside
|
||||
UBUNTU = $(shell echo $(DISTRO) | grep -i ubuntu >/dev/null 2>&1; echo $$?)
|
||||
FEDORA = $(shell echo $(DISTRO) | grep -i fedora >/dev/null 2>&1; echo $$?)
|
||||
RHEL = $(shell echo $(DISTRO) | grep -i 'red\|rhel' >/dev/null 2>&1; echo $$?)
|
||||
CENTOS = $(shell echo $(DISTRO) | grep -i centos >/dev/null 2>&1; echo $$?)
|
||||
SUSE = $(shell echo $(DISTRO) | grep -i 'suse\|sles' >/dev/null 2>&1; echo $$?)
|
||||
ifeq ("$(UBUNTU)","0")
|
||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-armv7l)
|
||||
GLPATH := /usr/arm-linux-gnueabihf/lib
|
||||
GLLINK := -L/usr/arm-linux-gnueabihf/lib
|
||||
ifneq ($(TARGET_FS),)
|
||||
GLPATH += $(TARGET_FS)/usr/lib/arm-linux-gnueabihf
|
||||
GLLINK += -L$(TARGET_FS)/usr/lib/arm-linux-gnueabihf
|
||||
endif
|
||||
else ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-aarch64)
|
||||
GLPATH := /usr/aarch64-linux-gnu/lib
|
||||
GLLINK := -L/usr/aarch64-linux-gnu/lib
|
||||
ifneq ($(TARGET_FS),)
|
||||
GLPATH += $(TARGET_FS)/usr/lib
|
||||
GLPATH += $(TARGET_FS)/usr/lib/aarch64-linux-gnu
|
||||
GLLINK += -L$(TARGET_FS)/usr/lib/aarch64-linux-gnu
|
||||
endif
|
||||
else
|
||||
UBUNTU_PKG_NAME = $(shell which dpkg >/dev/null 2>&1 && dpkg -l 'nvidia-*' | grep '^ii' | awk '{print $$2}' | head -1)
|
||||
ifneq ("$(UBUNTU_PKG_NAME)","")
|
||||
GLPATH ?= /usr/lib/$(UBUNTU_PKG_NAME)
|
||||
GLLINK ?= -L/usr/lib/$(UBUNTU_PKG_NAME)
|
||||
endif
|
||||
DFLT_PATH ?= /usr/lib
|
||||
endif
|
||||
endif
|
||||
ifeq ("$(SUSE)","0")
|
||||
GLPATH ?= /usr/X11R6/lib64
|
||||
GLLINK ?= -L/usr/X11R6/lib64
|
||||
DFLT_PATH ?= /usr/lib64
|
||||
endif
|
||||
ifeq ("$(FEDORA)","0")
|
||||
GLPATH ?= /usr/lib64/nvidia
|
||||
GLLINK ?= -L/usr/lib64/nvidia
|
||||
DFLT_PATH ?= /usr/lib64
|
||||
endif
|
||||
ifeq ("$(RHEL)","0")
|
||||
GLPATH ?= /usr/lib64/nvidia
|
||||
GLLINK ?= -L/usr/lib64/nvidia
|
||||
DFLT_PATH ?= /usr/lib64
|
||||
endif
|
||||
ifeq ("$(CENTOS)","0")
|
||||
GLPATH ?= /usr/lib64/nvidia
|
||||
GLLINK ?= -L/usr/lib64/nvidia
|
||||
DFLT_PATH ?= /usr/lib64
|
||||
endif
|
||||
|
||||
NVMEDIALIB := $(shell find -L $(GLPATH) $(DFLT_PATH) -name libnvmedia.so -print 2>/dev/null)
|
||||
|
||||
ifeq ("$(NVMEDIALIB)","")
|
||||
$(info >>> WARNING - libnvmedia.so not found, Waiving the sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
|
||||
HEADER_SEARCH_PATH ?= $(TARGET_FS)/usr/include
|
||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-armv7l-linux)
|
||||
HEADER_SEARCH_PATH += /usr/arm-linux-gnueabihf/include
|
||||
else ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-aarch64-linux)
|
||||
HEADER_SEARCH_PATH += /usr/aarch64-linux-gnu/include
|
||||
endif
|
||||
|
||||
NVMEDIAHEADER := $(shell find -L $(HEADER_SEARCH_PATH) -name nvmedia_core.h -print 2>/dev/null)
|
||||
|
||||
ifeq ("$(NVMEDIAHEADER)","")
|
||||
$(info >>> WARNING - nvmedia headers not found, Waiving the sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
else
|
||||
endif
|
||||
|
||||
138
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/findnvsci.mk
Normal file
138
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/findnvsci.mk
Normal file
@@ -0,0 +1,138 @@
|
||||
################################################################################
|
||||
# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
#################################################################################
|
||||
# findnvsci.mk is used to find the NVSCI Libraries and headers
|
||||
#
|
||||
################################################################################
|
||||
|
||||
# Determine OS platform and unix distribution
|
||||
ifeq ("$(TARGET_OS)","linux")
|
||||
# first search lsb_release
|
||||
DISTRO = $(shell lsb_release -i -s 2>/dev/null | tr "[:upper:]" "[:lower:]")
|
||||
ifeq ("$(DISTRO)","")
|
||||
# second search and parse /etc/issue
|
||||
DISTRO = $(shell more /etc/issue | awk '{print $$1}' | sed '1!d' | sed -e "/^$$/d" 2>/dev/null | tr "[:upper:]" "[:lower:]")
|
||||
# ensure data from /etc/issue is valid
|
||||
ifeq (,$(filter $(DISTRO),ubuntu fedora red rhel centos suse))
|
||||
DISTRO =
|
||||
endif
|
||||
ifeq ("$(DISTRO)","")
|
||||
# third, we can search in /etc/os-release or /etc/{distro}-release
|
||||
DISTRO = $(shell awk '/ID/' /etc/*-release | sed 's/ID=//' | grep -v "VERSION" | grep -v "ID" | grep -v "DISTRIB")
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ("$(TARGET_OS)","linux")
|
||||
# $(info) >> findegl.mk -> LINUX path <<<)
|
||||
# Each set of Linux Distros have different paths for where to find their OpenGL libraries reside
|
||||
UBUNTU = $(shell echo $(DISTRO) | grep -i ubuntu >/dev/null 2>&1; echo $$?)
|
||||
FEDORA = $(shell echo $(DISTRO) | grep -i fedora >/dev/null 2>&1; echo $$?)
|
||||
RHEL = $(shell echo $(DISTRO) | grep -i 'red\|rhel' >/dev/null 2>&1; echo $$?)
|
||||
CENTOS = $(shell echo $(DISTRO) | grep -i centos >/dev/null 2>&1; echo $$?)
|
||||
SUSE = $(shell echo $(DISTRO) | grep -i 'suse\|sles' >/dev/null 2>&1; echo $$?)
|
||||
ifeq ("$(UBUNTU)","0")
|
||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-armv7l)
|
||||
GLPATH := /usr/arm-linux-gnueabihf/lib
|
||||
GLLINK := -L/usr/arm-linux-gnueabihf/lib
|
||||
ifneq ($(TARGET_FS),)
|
||||
GLPATH += $(TARGET_FS)/usr/lib/arm-linux-gnueabihf
|
||||
GLLINK += -L$(TARGET_FS)/usr/lib/arm-linux-gnueabihf
|
||||
endif
|
||||
else ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-aarch64)
|
||||
GLPATH := /usr/aarch64-linux-gnu/lib
|
||||
GLLINK := -L/usr/aarch64-linux-gnu/lib
|
||||
ifneq ($(TARGET_FS),)
|
||||
GLPATH += $(TARGET_FS)/usr/lib
|
||||
GLPATH += $(TARGET_FS)/usr/lib/aarch64-linux-gnu
|
||||
GLLINK += -L$(TARGET_FS)/usr/lib/aarch64-linux-gnu
|
||||
endif
|
||||
else
|
||||
UBUNTU_PKG_NAME = $(shell which dpkg >/dev/null 2>&1 && dpkg -l 'nvidia-*' | grep '^ii' | awk '{print $$2}' | head -1)
|
||||
ifneq ("$(UBUNTU_PKG_NAME)","")
|
||||
GLPATH ?= /usr/lib/$(UBUNTU_PKG_NAME)
|
||||
GLLINK ?= -L/usr/lib/$(UBUNTU_PKG_NAME)
|
||||
endif
|
||||
DFLT_PATH ?= /usr/lib
|
||||
endif
|
||||
endif
|
||||
ifeq ("$(SUSE)","0")
|
||||
GLPATH ?= /usr/X11R6/lib64
|
||||
GLLINK ?= -L/usr/X11R6/lib64
|
||||
DFLT_PATH ?= /usr/lib64
|
||||
endif
|
||||
ifeq ("$(FEDORA)","0")
|
||||
GLPATH ?= /usr/lib64/nvidia
|
||||
GLLINK ?= -L/usr/lib64/nvidia
|
||||
DFLT_PATH ?= /usr/lib64
|
||||
endif
|
||||
ifeq ("$(RHEL)","0")
|
||||
GLPATH ?= /usr/lib64/nvidia
|
||||
GLLINK ?= -L/usr/lib64/nvidia
|
||||
DFLT_PATH ?= /usr/lib64
|
||||
endif
|
||||
ifeq ("$(CENTOS)","0")
|
||||
GLPATH ?= /usr/lib64/nvidia
|
||||
GLLINK ?= -L/usr/lib64/nvidia
|
||||
DFLT_PATH ?= /usr/lib64
|
||||
endif
|
||||
|
||||
NVSCIBUFLIB := $(shell find -L $(GLPATH) $(DFLT_PATH) -name libnvscibuf.so -print 2>/dev/null)
|
||||
NVSCISYNCLIB := $(shell find -L $(GLPATH) $(DFLT_PATH) -name libnvscisync.so -print 2>/dev/null)
|
||||
|
||||
ifeq ("$(NVSCIBUFLIB)","")
|
||||
$(info >>> WARNING - libnvscibuf.so not found, Waiving the sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
|
||||
ifeq ("$(NVSCISYNCLIB)","")
|
||||
$(info >>> WARNING - libnvscisync.so not found, Waiving the sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
|
||||
HEADER_SEARCH_PATH ?= $(TARGET_FS)/usr/include
|
||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-armv7l-linux)
|
||||
HEADER_SEARCH_PATH += /usr/arm-linux-gnueabihf/include
|
||||
else ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-aarch64-linux)
|
||||
HEADER_SEARCH_PATH += /usr/aarch64-linux-gnu/include
|
||||
endif
|
||||
|
||||
NVSCIBUFHEADER := $(shell find -L $(HEADER_SEARCH_PATH) -name nvscibuf.h -print 2>/dev/null)
|
||||
NVSCISYNCHEADER := $(shell find -L $(HEADER_SEARCH_PATH) -name nvscisync.h -print 2>/dev/null)
|
||||
|
||||
ifeq ("$(NVSCIBUFHEADER)","")
|
||||
$(info >>> WARNING - nvscibuf.h not found, Waiving the sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
ifeq ("$(NVSCISYNCHEADER)","")
|
||||
$(info >>> WARNING - nvscisync.h not found, Waiving the sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
else
|
||||
endif
|
||||
|
||||
210
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/main.cpp
Normal file
210
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/main.cpp
Normal file
@@ -0,0 +1,210 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* standard headers */
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <signal.h>
|
||||
#include <thread>
|
||||
|
||||
/* Nvidia headers */
|
||||
#include <nvscisync.h>
|
||||
#include "nvmedia_utils/cmdline.h"
|
||||
#include "nvmedia_image.h"
|
||||
#include "nvmedia_2d.h"
|
||||
#include "nvmedia_2d_nvscisync.h"
|
||||
#include "nvmedia_surface.h"
|
||||
#include "nvmedia_utils/image_utils.h"
|
||||
#include "nvmedia_image_nvscibuf.h"
|
||||
#include "cuda_consumer.h"
|
||||
#include "nvmedia_producer.h"
|
||||
#include "nvsci_setup.h"
|
||||
|
||||
#define checkNvSciErrors(call) \
|
||||
do { \
|
||||
NvSciError _status = call; \
|
||||
if (NvSciError_Success != _status) { \
|
||||
printf( \
|
||||
"NVSCI call in file '%s' in line %i returned" \
|
||||
" %d, expected %d\n", \
|
||||
__FILE__, __LINE__, _status, NvSciError_Success); \
|
||||
fflush(stdout); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static void cleanup(Blit2DTest* ctx, NvMediaStatus status) {
|
||||
if (ctx->i2d != NULL) {
|
||||
NvMedia2DDestroy(ctx->i2d);
|
||||
}
|
||||
|
||||
if (ctx->device != NULL) {
|
||||
NvMediaDeviceDestroy(ctx->device);
|
||||
}
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
TestArgs args;
|
||||
Blit2DTest ctx;
|
||||
NvMediaStatus status = NVMEDIA_STATUS_ERROR;
|
||||
NvSciSyncFence nvMediaSignalerFence = NvSciSyncFenceInitializer;
|
||||
NvSciSyncFence cudaSignalerFence = NvSciSyncFenceInitializer;
|
||||
|
||||
int cudaDeviceId;
|
||||
uint64_t startTime, endTime;
|
||||
uint64_t operationStartTime, operationEndTime;
|
||||
double processingTime;
|
||||
|
||||
/* Read configuration from command line and config file */
|
||||
memset(&args, 0, sizeof(TestArgs));
|
||||
memset(&ctx, 0, sizeof(Blit2DTest));
|
||||
|
||||
/* ParseArgs parses the command line and the 2D configuration file and
|
||||
* populates all initParams and run time configuration in to appropriate
|
||||
* structures within args
|
||||
*/
|
||||
if (ParseArgs(argc, argv, &args)) {
|
||||
PrintUsage();
|
||||
return -1;
|
||||
}
|
||||
/* Check version */
|
||||
NvMediaVersion version;
|
||||
status = NvMedia2DGetVersion(&version);
|
||||
if (status == NVMEDIA_STATUS_OK) {
|
||||
printf("Library version: %u.%u\n", version.major, version.minor);
|
||||
printf("Header version: %u.%u\n", NVMEDIA_2D_VERSION_MAJOR,
|
||||
NVMEDIA_2D_VERSION_MINOR);
|
||||
if ((version.major != NVMEDIA_2D_VERSION_MAJOR) ||
|
||||
(version.minor != NVMEDIA_2D_VERSION_MINOR)) {
|
||||
printf("Library and Header mismatch!\n");
|
||||
cleanup(&ctx, status);
|
||||
}
|
||||
}
|
||||
|
||||
// Create NvMedia device
|
||||
ctx.device = NvMediaDeviceCreate();
|
||||
if (!ctx.device) {
|
||||
printf("%s: Failed to create NvMedia device\n", __func__);
|
||||
cleanup(&ctx, status);
|
||||
}
|
||||
|
||||
// Create 2D blitter
|
||||
ctx.i2d = NvMedia2DCreate(ctx.device);
|
||||
if (!ctx.i2d) {
|
||||
printf("%s: Failed to create NvMedia 2D i2d\n", __func__);
|
||||
cleanup(&ctx, status);
|
||||
}
|
||||
|
||||
cudaDeviceId = findCudaDevice(argc, (const char**)argv);
|
||||
|
||||
// NvMedia-CUDA operations without NvSCI APIs starts
|
||||
cudaResources cudaResObj;
|
||||
GetTimeMicroSec(&startTime);
|
||||
setupNvMedia(&args, &ctx);
|
||||
setupCuda(&ctx, cudaResObj, cudaDeviceId);
|
||||
|
||||
GetTimeMicroSec(&operationStartTime);
|
||||
for (int i = 0; i < args.iterations; i++) {
|
||||
runNvMediaBlit2D(&args, &ctx);
|
||||
runCudaOperation(&ctx, cudaResObj, cudaDeviceId);
|
||||
}
|
||||
GetTimeMicroSec(&operationEndTime);
|
||||
|
||||
cleanupNvMedia(&ctx);
|
||||
cleanupCuda(&ctx, cudaResObj);
|
||||
GetTimeMicroSec(&endTime);
|
||||
// NvMedia-CUDA operations without NvSCI APIs ends
|
||||
|
||||
processingTime = (double)(operationEndTime - operationStartTime) / 1000.0;
|
||||
printf(
|
||||
"Overall Processing time of NvMedia-CUDA Operations without NvSCI APIs "
|
||||
"%.4f ms with %zu iterations\n",
|
||||
processingTime, args.iterations);
|
||||
processingTime = (double)(endTime - startTime) / 1000.0;
|
||||
printf(
|
||||
"Overall Processing time of NvMedia-CUDA Operations + allocation/cleanup "
|
||||
"without NvSCI APIs %.4f ms with %zu iterations\n",
|
||||
processingTime, args.iterations);
|
||||
|
||||
NvSciBufObj dstNvSciBufobj, srcNvSciBufobj;
|
||||
NvSciSyncObj nvMediaSignalerSyncObj, cudaSignalerSyncObj;
|
||||
cudaExternalResInterop cudaExtResObj;
|
||||
// NvMedia-CUDA operations via interop with NvSCI APIs starts
|
||||
GetTimeMicroSec(&startTime);
|
||||
setupNvMediaSignalerNvSciSync(&ctx, nvMediaSignalerSyncObj, cudaDeviceId);
|
||||
setupCudaSignalerNvSciSync(&ctx, cudaSignalerSyncObj, cudaDeviceId);
|
||||
setupNvMedia(&args, &ctx, srcNvSciBufobj, dstNvSciBufobj,
|
||||
nvMediaSignalerSyncObj, cudaSignalerSyncObj, cudaDeviceId);
|
||||
setupCuda(cudaExtResObj, dstNvSciBufobj, nvMediaSignalerSyncObj,
|
||||
cudaSignalerSyncObj, cudaDeviceId);
|
||||
|
||||
GetTimeMicroSec(&operationStartTime);
|
||||
for (int i = 0; i < args.iterations; i++) {
|
||||
runNvMediaBlit2D(&args, &ctx, nvMediaSignalerSyncObj, &cudaSignalerFence,
|
||||
&nvMediaSignalerFence);
|
||||
runCudaOperation(cudaExtResObj, &nvMediaSignalerFence, &cudaSignalerFence,
|
||||
cudaDeviceId, args.iterations);
|
||||
}
|
||||
GetTimeMicroSec(&operationEndTime);
|
||||
|
||||
cleanupNvMedia(&ctx, nvMediaSignalerSyncObj, cudaSignalerSyncObj);
|
||||
cleanupCuda(cudaExtResObj);
|
||||
cleanupNvSciSync(nvMediaSignalerSyncObj);
|
||||
cleanupNvSciSync(cudaSignalerSyncObj);
|
||||
cleanupNvSciBuf(srcNvSciBufobj);
|
||||
cleanupNvSciBuf(dstNvSciBufobj);
|
||||
GetTimeMicroSec(&endTime);
|
||||
// NvMedia-CUDA operations via interop with NvSCI APIs ends
|
||||
|
||||
processingTime = (double)(operationEndTime - operationStartTime) / 1000.0;
|
||||
printf(
|
||||
"Overall Processing time of NvMedia-CUDA Operations with NvSCI APIs %.4f "
|
||||
"ms with %zu iterations\n",
|
||||
processingTime, args.iterations);
|
||||
processingTime = (double)(endTime - startTime) / 1000.0;
|
||||
printf(
|
||||
"Overall Processing time of NvMedia-CUDA Operations + allocation/cleanup "
|
||||
"with NvSCI APIs %.4f ms with %zu iterations\n",
|
||||
processingTime, args.iterations);
|
||||
|
||||
if (ctx.i2d != NULL) {
|
||||
NvMedia2DDestroy(ctx.i2d);
|
||||
}
|
||||
|
||||
if (ctx.device != NULL) {
|
||||
NvMediaDeviceDestroy(ctx.device);
|
||||
}
|
||||
|
||||
if (status == NVMEDIA_STATUS_OK) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
471
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/nvmedia_producer.cpp
Normal file
471
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/nvmedia_producer.cpp
Normal file
@@ -0,0 +1,471 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
/* Nvidia headers */
|
||||
#include "nvmedia_utils/cmdline.h"
|
||||
#include "nvmedia_image.h"
|
||||
#include "nvmedia_2d.h"
|
||||
#include "nvmedia_surface.h"
|
||||
#include "nvmedia_utils/image_utils.h"
|
||||
#include "nvmedia_image_nvscibuf.h"
|
||||
#include "nvmedia_producer.h"
|
||||
#include "nvmedia_2d_nvscisync.h"
|
||||
#include "nvsci_setup.h"
|
||||
|
||||
NvMediaImage *NvMediaImageCreateUsingNvScibuf(NvMediaDevice *device,
|
||||
NvMediaSurfaceType type,
|
||||
const NvMediaSurfAllocAttr *attrs,
|
||||
uint32_t numAttrs, uint32_t flags,
|
||||
NvSciBufObj &bufobj,
|
||||
int cudaDeviceId) {
|
||||
NvSciBufModule module = NULL;
|
||||
NvSciError err = NvSciError_Success;
|
||||
NvMediaStatus status = NVMEDIA_STATUS_OK;
|
||||
NvSciBufAttrList attrlist = NULL;
|
||||
NvSciBufAttrList conflictlist = NULL;
|
||||
NvSciBufAttrValAccessPerm access_perm = NvSciBufAccessPerm_ReadWrite;
|
||||
NvSciBufAttrKeyValuePair attr_kvp = {NvSciBufGeneralAttrKey_RequiredPerm,
|
||||
&access_perm, sizeof(access_perm)};
|
||||
NvSciBufAttrKeyValuePair pairArrayOut[10];
|
||||
|
||||
NvMediaImage *image = NULL;
|
||||
|
||||
err = NvSciBufModuleOpen(&module);
|
||||
if (err != NvSciError_Success) {
|
||||
printf("%s: NvSciBuffModuleOpen failed. Error: %d \n", __func__, err);
|
||||
goto fail_cleanup;
|
||||
}
|
||||
|
||||
err = NvSciBufAttrListCreate(module, &attrlist);
|
||||
if (err != NvSciError_Success) {
|
||||
printf("%s: SciBufAttrListCreate failed. Error: %d \n", __func__, err);
|
||||
goto fail_cleanup;
|
||||
}
|
||||
|
||||
err = NvSciBufAttrListSetAttrs(attrlist, &attr_kvp, 1);
|
||||
if (err != NvSciError_Success) {
|
||||
printf("%s: AccessPermSetAttr failed. Error: %d \n", __func__, err);
|
||||
goto fail_cleanup;
|
||||
}
|
||||
|
||||
status =
|
||||
NvMediaImageFillNvSciBufAttrs(device, type, attrs, numAttrs, 0, attrlist);
|
||||
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: ImageFillSciBufAttrs failed. Error: %d \n", __func__, err);
|
||||
goto fail_cleanup;
|
||||
}
|
||||
|
||||
setupNvSciBuf(bufobj, attrlist, cudaDeviceId);
|
||||
|
||||
status = NvMediaImageCreateFromNvSciBuf(device, bufobj, &image);
|
||||
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: ImageCreatefromSciBuf failed. Error: %d \n", __func__, err);
|
||||
goto fail_cleanup;
|
||||
}
|
||||
|
||||
NvSciBufAttrListFree(attrlist);
|
||||
|
||||
if (module != NULL) {
|
||||
NvSciBufModuleClose(module);
|
||||
}
|
||||
|
||||
return image;
|
||||
|
||||
fail_cleanup:
|
||||
if (attrlist != NULL) {
|
||||
NvSciBufAttrListFree(attrlist);
|
||||
}
|
||||
if (bufobj != NULL) {
|
||||
NvSciBufObjFree(bufobj);
|
||||
bufobj = NULL;
|
||||
}
|
||||
|
||||
if (module != NULL) {
|
||||
NvSciBufModuleClose(module);
|
||||
}
|
||||
NvMediaImageDestroy(image);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create NvMediaImage surface based on the input attributes.
|
||||
* Returns NVMEDIA_STATUS_OK on success
|
||||
*/
|
||||
static NvMediaStatus createSurface(Blit2DTest *ctx,
|
||||
NvMediaSurfFormatAttr *surfFormatAttrs,
|
||||
NvMediaSurfAllocAttr *surfAllocAttrs,
|
||||
uint32_t numSurfAllocAttrs,
|
||||
NvMediaImage **image, NvSciBufObj &bufObj,
|
||||
int cudaDeviceId) {
|
||||
NvMediaSurfaceType surfType;
|
||||
|
||||
/* create source image */
|
||||
surfType =
|
||||
NvMediaSurfaceFormatGetType(surfFormatAttrs, NVM_SURF_FMT_ATTR_MAX);
|
||||
*image = NvMediaImageCreateUsingNvScibuf(ctx->device, /* device */
|
||||
surfType, /* surface type */
|
||||
surfAllocAttrs, numSurfAllocAttrs, 0,
|
||||
bufObj, cudaDeviceId);
|
||||
|
||||
if (*image == NULL) {
|
||||
printf("Unable to create image\n");
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
InitImage(*image, surfAllocAttrs[0].value, surfAllocAttrs[1].value);
|
||||
|
||||
/* printf("%s: NvMediaImageCreate:: Image size: %ux%u Image type: %d\n",
|
||||
__func__, surfAllocAttrs[0].value, surfAllocAttrs[1].value,
|
||||
surfType);*/
|
||||
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
/* Create NvMediaImage surface based on the input attributes.
|
||||
* Returns NVMEDIA_STATUS_OK on success
|
||||
*/
|
||||
static NvMediaStatus createSurfaceNonNvSCI(
|
||||
Blit2DTest *ctx, NvMediaSurfFormatAttr *surfFormatAttrs,
|
||||
NvMediaSurfAllocAttr *surfAllocAttrs, uint32_t numSurfAllocAttrs,
|
||||
NvMediaImage **image) {
|
||||
NvMediaSurfaceType surfType;
|
||||
|
||||
/* create source image */
|
||||
surfType =
|
||||
NvMediaSurfaceFormatGetType(surfFormatAttrs, NVM_SURF_FMT_ATTR_MAX);
|
||||
|
||||
*image = NvMediaImageCreateNew(ctx->device, surfType, surfAllocAttrs,
|
||||
numSurfAllocAttrs, 0);
|
||||
|
||||
if (*image == NULL) {
|
||||
printf("Unable to create image\n");
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
InitImage(*image, surfAllocAttrs[0].value, surfAllocAttrs[1].value);
|
||||
|
||||
/* printf("%s: NvMediaImageCreate:: Image size: %ux%u Image type: %d\n",
|
||||
__func__, surfAllocAttrs[0].value, surfAllocAttrs[1].value,
|
||||
surfType);*/
|
||||
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
static void destroySurface(NvMediaImage *image) { NvMediaImageDestroy(image); }
|
||||
|
||||
static NvMediaStatus blit2DImage(Blit2DTest *ctx, TestArgs *args,
|
||||
NvSciSyncObj &nvMediaSignalerSyncObj,
|
||||
NvSciSyncFence *preSyncFence,
|
||||
NvSciSyncFence *fence) {
|
||||
NvMediaStatus status;
|
||||
NvMediaImageSurfaceMap surfaceMap;
|
||||
|
||||
status = ReadImage(args->inputFileName, /* fileName */
|
||||
0, /* frameNum */
|
||||
args->srcSurfAllocAttrs[0].value, /* source image width */
|
||||
args->srcSurfAllocAttrs[1].value, /* source image height */
|
||||
ctx->srcImage, /* srcImage */
|
||||
NVMEDIA_TRUE, /* uvOrderFlag */
|
||||
1, /* bytesPerPixel */
|
||||
MSB_ALIGNED); /* pixelAlignment */
|
||||
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: ReadImage failed for input buffer: %d\n", __func__, status);
|
||||
return status;
|
||||
}
|
||||
|
||||
if ((args->srcRect.x1 <= args->srcRect.x0) ||
|
||||
(args->srcRect.y1 <= args->srcRect.y0)) {
|
||||
ctx->srcRect = NULL;
|
||||
} else {
|
||||
ctx->srcRect = &(args->srcRect);
|
||||
}
|
||||
|
||||
if ((args->dstRect.x1 <= args->dstRect.x0) ||
|
||||
(args->dstRect.y1 <= args->dstRect.y0)) {
|
||||
ctx->dstRect = NULL;
|
||||
} else {
|
||||
ctx->dstRect = &(args->dstRect);
|
||||
}
|
||||
|
||||
static int64_t launch = 0;
|
||||
// Start inserting pre-fence from second launch inorder to for NvMedia2Blit to
|
||||
// wait
|
||||
// for cuda signal on fence.
|
||||
if (launch) {
|
||||
status = NvMedia2DInsertPreNvSciSyncFence(ctx->i2d, preSyncFence);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMedia2DSetNvSciSyncObjforEOF failed: %d\n", __func__,
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
NvSciSyncFenceClear(preSyncFence);
|
||||
}
|
||||
launch++;
|
||||
|
||||
status = NvMedia2DSetNvSciSyncObjforEOF(ctx->i2d, nvMediaSignalerSyncObj);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMedia2DSetNvSciSyncObjforEOF failed: %d\n", __func__,
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
/* 2DBlit processing on input image */
|
||||
status = NvMedia2DBlitEx(ctx->i2d, /* i2d */
|
||||
ctx->dstImage, /* dstSurface */
|
||||
ctx->dstRect, /* dstRect */
|
||||
ctx->srcImage, /* srcSurface */
|
||||
ctx->srcRect, /* srcRect */
|
||||
&args->blitParams, /* params */
|
||||
NULL); /* paramsOut */
|
||||
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMedia2DBlitEx failed: %d\n", __func__, status);
|
||||
return status;
|
||||
}
|
||||
|
||||
status =
|
||||
NvMedia2DGetEOFNvSciSyncFence(ctx->i2d, nvMediaSignalerSyncObj, fence);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMedia2DGetEOFNvSciSyncFence failed: %d\n", __func__, status);
|
||||
return status;
|
||||
}
|
||||
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
static NvMediaStatus blit2DImageNonNvSCI(Blit2DTest *ctx, TestArgs *args) {
|
||||
NvMediaStatus status;
|
||||
NvMediaImageSurfaceMap surfaceMap;
|
||||
|
||||
status = ReadImage(args->inputFileName, /* fileName */
|
||||
0, /* frameNum */
|
||||
args->srcSurfAllocAttrs[0].value, /* source image width */
|
||||
args->srcSurfAllocAttrs[1].value, /* source image height */
|
||||
ctx->srcImage, /* srcImage */
|
||||
NVMEDIA_TRUE, /* uvOrderFlag */
|
||||
1, /* bytesPerPixel */
|
||||
MSB_ALIGNED); /* pixelAlignment */
|
||||
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: ReadImage failed for input buffer: %d\n", __func__, status);
|
||||
return status;
|
||||
}
|
||||
|
||||
if ((args->srcRect.x1 <= args->srcRect.x0) ||
|
||||
(args->srcRect.y1 <= args->srcRect.y0)) {
|
||||
ctx->srcRect = NULL;
|
||||
} else {
|
||||
ctx->srcRect = &(args->srcRect);
|
||||
}
|
||||
|
||||
if ((args->dstRect.x1 <= args->dstRect.x0) ||
|
||||
(args->dstRect.y1 <= args->dstRect.y0)) {
|
||||
ctx->dstRect = NULL;
|
||||
} else {
|
||||
ctx->dstRect = &(args->dstRect);
|
||||
}
|
||||
|
||||
/* 2DBlit processing on input image */
|
||||
status = NvMedia2DBlitEx(ctx->i2d, /* i2d */
|
||||
ctx->dstImage, /* dstSurface */
|
||||
ctx->dstRect, /* dstRect */
|
||||
ctx->srcImage, /* srcSurface */
|
||||
ctx->srcRect, /* srcRect */
|
||||
&args->blitParams, /* params */
|
||||
NULL); /* paramsOut */
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMedia2DBlitEx failed: %d\n", __func__, status);
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Write output image into buffer */
|
||||
ctx->bytesPerPixel = 1;
|
||||
WriteImageToAllocatedBuffer(ctx, ctx->dstImage, NVMEDIA_TRUE, NVMEDIA_FALSE,
|
||||
ctx->bytesPerPixel);
|
||||
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
static void cleanup(Blit2DTest *ctx, NvMediaStatus status = NVMEDIA_STATUS_OK) {
|
||||
if (ctx->srcImage != NULL) {
|
||||
NvMedia2DImageUnRegister(ctx->i2d, ctx->srcImage);
|
||||
destroySurface(ctx->srcImage);
|
||||
}
|
||||
if (ctx->dstImage != NULL) {
|
||||
NvMedia2DImageUnRegister(ctx->i2d, ctx->dstImage);
|
||||
destroySurface(ctx->dstImage);
|
||||
}
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
void cleanupNvMedia(Blit2DTest *ctx, NvSciSyncObj &syncObj,
|
||||
NvSciSyncObj &preSyncObj) {
|
||||
NvMediaStatus status;
|
||||
cleanup(ctx);
|
||||
status = NvMedia2DUnregisterNvSciSyncObj(ctx->i2d, syncObj);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImageSciBufInit failed\n", __func__);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
status = NvMedia2DUnregisterNvSciSyncObj(ctx->i2d, preSyncObj);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImageSciBufInit failed\n", __func__);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
NvMediaImageNvSciBufDeinit();
|
||||
}
|
||||
|
||||
void cleanupNvMedia(Blit2DTest *ctx) {
|
||||
cleanup(ctx);
|
||||
free(ctx->dstBuffPitches);
|
||||
free(ctx->dstBuffer);
|
||||
free(ctx->dstBuff);
|
||||
}
|
||||
|
||||
void setupNvMedia(TestArgs *args, Blit2DTest *ctx, NvSciBufObj &srcNvSciBufobj,
|
||||
NvSciBufObj &dstNvSciBufobj, NvSciSyncObj &syncObj,
|
||||
NvSciSyncObj &preSyncObj, int cudaDeviceId) {
|
||||
NvMediaStatus status;
|
||||
status = NvMediaImageNvSciBufInit();
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImageSciBufInit failed\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
|
||||
// Create source surface
|
||||
status = createSurface(ctx, args->srcSurfFormatAttrs, args->srcSurfAllocAttrs,
|
||||
args->numSurfAllocAttrs, &ctx->srcImage,
|
||||
srcNvSciBufobj, cudaDeviceId);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to create buffer pools\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
|
||||
// Create destination surface
|
||||
status = createSurface(ctx, args->dstSurfFormatAttrs, args->dstSurfAllocAttrs,
|
||||
args->numSurfAllocAttrs, &ctx->dstImage,
|
||||
dstNvSciBufobj, cudaDeviceId);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to create buffer pools\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
|
||||
// Register source Surface
|
||||
status =
|
||||
NvMedia2DImageRegister(ctx->i2d, ctx->srcImage, NVMEDIA_ACCESS_MODE_READ);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to register source surface\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
// Register destination Surface
|
||||
status = NvMedia2DImageRegister(ctx->i2d, ctx->dstImage,
|
||||
NVMEDIA_ACCESS_MODE_READ_WRITE);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to register destination surface\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
|
||||
status = NvMedia2DRegisterNvSciSyncObj(ctx->i2d, NVMEDIA_EOFSYNCOBJ, syncObj);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to NvMedia2DRegisterNvSciSyncObj\n", __func__);
|
||||
}
|
||||
|
||||
status =
|
||||
NvMedia2DRegisterNvSciSyncObj(ctx->i2d, NVMEDIA_PRESYNCOBJ, preSyncObj);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to NvMedia2DRegisterNvSciSyncObj\n", __func__);
|
||||
}
|
||||
}
|
||||
|
||||
// Create NvMedia src & dst image without NvSciBuf
|
||||
void setupNvMedia(TestArgs *args, Blit2DTest *ctx) {
|
||||
NvMediaStatus status;
|
||||
|
||||
// Create source surface
|
||||
status = createSurfaceNonNvSCI(ctx, args->srcSurfFormatAttrs,
|
||||
args->srcSurfAllocAttrs,
|
||||
args->numSurfAllocAttrs, &ctx->srcImage);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to create buffer pools\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
|
||||
// Create destination surface
|
||||
status = createSurfaceNonNvSCI(ctx, args->dstSurfFormatAttrs,
|
||||
args->dstSurfAllocAttrs,
|
||||
args->numSurfAllocAttrs, &ctx->dstImage);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to create buffer pools\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
|
||||
// Register source Surface
|
||||
status =
|
||||
NvMedia2DImageRegister(ctx->i2d, ctx->srcImage, NVMEDIA_ACCESS_MODE_READ);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to register source surface\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
|
||||
// Register destination Surface
|
||||
status = NvMedia2DImageRegister(ctx->i2d, ctx->dstImage,
|
||||
NVMEDIA_ACCESS_MODE_READ_WRITE);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Unable to register destination surface\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
|
||||
// Allocate buffer for writing image & set image parameters in Blit2DTest.
|
||||
ctx->bytesPerPixel = 1;
|
||||
AllocateBufferToWriteImage(ctx, ctx->dstImage, NVMEDIA_TRUE, /* uvOrderFlag */
|
||||
NVMEDIA_FALSE); /* appendFlag */
|
||||
}
|
||||
|
||||
void runNvMediaBlit2D(TestArgs *args, Blit2DTest *ctx) {
|
||||
// Blit2D function
|
||||
NvMediaStatus status = blit2DImageNonNvSCI(ctx, args);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Blit2D failed\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
}
|
||||
|
||||
void runNvMediaBlit2D(TestArgs *args, Blit2DTest *ctx,
|
||||
NvSciSyncObj &nvMediaSignalerSyncObj,
|
||||
NvSciSyncFence *preSyncFence, NvSciSyncFence *fence) {
|
||||
// Blit2D function
|
||||
NvMediaStatus status =
|
||||
blit2DImage(ctx, args, nvMediaSignalerSyncObj, preSyncFence, fence);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Blit2D failed\n", __func__);
|
||||
cleanup(ctx, status);
|
||||
}
|
||||
}
|
||||
48
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/nvmedia_producer.h
Normal file
48
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/nvmedia_producer.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __NVMEDIA_PRODUCER_H__
|
||||
#define __NVMEDIA_PRODUCER_H__
|
||||
#include "nvmedia_utils/cmdline.h"
|
||||
#include "nvmedia_image.h"
|
||||
#include "nvmedia_2d.h"
|
||||
#include "nvmedia_surface.h"
|
||||
#include "nvmedia_utils/image_utils.h"
|
||||
#include "nvmedia_image_nvscibuf.h"
|
||||
#include "nvscisync.h"
|
||||
|
||||
void runNvMediaBlit2D(TestArgs* args, Blit2DTest* ctx, NvSciSyncObj& syncObj,
|
||||
NvSciSyncFence* preSyncFence, NvSciSyncFence* fence);
|
||||
void runNvMediaBlit2D(TestArgs* args, Blit2DTest* ctx);
|
||||
void setupNvMedia(TestArgs* args, Blit2DTest* ctx, NvSciBufObj& srcNvSciBufobj,
|
||||
NvSciBufObj& dstNvSciBufobj, NvSciSyncObj& syncObj,
|
||||
NvSciSyncObj& preSyncObj, int cudaDeviceId);
|
||||
void setupNvMedia(TestArgs* args, Blit2DTest* ctx);
|
||||
void cleanupNvMedia(Blit2DTest* ctx, NvSciSyncObj& syncObj,
|
||||
NvSciSyncObj& preSyncObj);
|
||||
void cleanupNvMedia(Blit2DTest* ctx);
|
||||
#endif
|
||||
@@ -0,0 +1,192 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
/* Standard headers */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Nvidia headers */
|
||||
#include "cmdline.h"
|
||||
#include "log_utils.h"
|
||||
#include "misc_utils.h"
|
||||
#include "config_parser.h"
|
||||
#include "helper_cuda.h"
|
||||
|
||||
/* see cmdline.h for details */
|
||||
void PrintUsage()
|
||||
{
|
||||
printf("cudaNvSciNvMedia\n");
|
||||
printf("Usage: cudaNvSciNvMedia [options]\n");
|
||||
printf("Options:\n");
|
||||
printf("-h Prints usage\n");
|
||||
printf("-device=n (n >= 0 for cuda device ID)\n");
|
||||
printf("-cf=[config] 2d config file. Path length limited to %u chars\n", FILE_NAME_SIZE);
|
||||
printf("-iterations=n (n > 0 - num of iterations of NvMedia-CUDA operations to be launched)\n");
|
||||
}
|
||||
|
||||
SectionMap sectionsMap[] = {
|
||||
{SECTION_NONE, "", 0, 0} /* Has to be the last item - specifies the end of array */
|
||||
};
|
||||
|
||||
/* see cmdline.h for details */
|
||||
int ParseArgs(int argc, char *argv[], TestArgs *args)
|
||||
{
|
||||
NvMediaBool bLastArg = NVMEDIA_FALSE;
|
||||
NvMediaBool bDataAvailable = NVMEDIA_FALSE;
|
||||
NvMediaStatus status = NVMEDIA_STATUS_OK;
|
||||
const char* filename = NULL;
|
||||
int i;
|
||||
|
||||
args->srcSurfAllocAttrs[0].type = args->dstSurfAllocAttrs[0].type = NVM_SURF_ATTR_WIDTH;
|
||||
args->srcSurfAllocAttrs[1].type = args->dstSurfAllocAttrs[1].type = NVM_SURF_ATTR_HEIGHT;
|
||||
args->srcSurfAllocAttrs[2].type = args->dstSurfAllocAttrs[2].type = NVM_SURF_ATTR_EMB_LINES_TOP;
|
||||
args->srcSurfAllocAttrs[3].type = args->dstSurfAllocAttrs[3].type = NVM_SURF_ATTR_EMB_LINES_BOTTOM;
|
||||
args->srcSurfAllocAttrs[4].type = args->dstSurfAllocAttrs[4].type = NVM_SURF_ATTR_CPU_ACCESS;
|
||||
args->srcSurfAllocAttrs[5].type = args->dstSurfAllocAttrs[5].type = NVM_SURF_ATTR_ALLOC_TYPE;
|
||||
args->srcSurfAllocAttrs[6].type = args->dstSurfAllocAttrs[6].type = NVM_SURF_ATTR_SCAN_TYPE;
|
||||
args->srcSurfAllocAttrs[7].type = args->dstSurfAllocAttrs[7].type = NVM_SURF_ATTR_COLOR_STD_TYPE;
|
||||
args->numSurfAllocAttrs = 8;
|
||||
|
||||
args->srcSurfFormatAttrs[0].type = args->dstSurfFormatAttrs[0].type = NVM_SURF_ATTR_SURF_TYPE;
|
||||
args->srcSurfFormatAttrs[1].type = args->dstSurfFormatAttrs[1].type = NVM_SURF_ATTR_LAYOUT;
|
||||
args->srcSurfFormatAttrs[2].type = args->dstSurfFormatAttrs[2].type = NVM_SURF_ATTR_DATA_TYPE;
|
||||
args->srcSurfFormatAttrs[3].type = args->dstSurfFormatAttrs[3].type = NVM_SURF_ATTR_MEMORY;
|
||||
args->srcSurfFormatAttrs[4].type = args->dstSurfFormatAttrs[4].type = NVM_SURF_ATTR_SUB_SAMPLING_TYPE;
|
||||
args->srcSurfFormatAttrs[5].type = args->dstSurfFormatAttrs[5].type = NVM_SURF_ATTR_BITS_PER_COMPONENT;
|
||||
args->srcSurfFormatAttrs[6].type = args->dstSurfFormatAttrs[6].type = NVM_SURF_ATTR_COMPONENT_ORDER;
|
||||
|
||||
/* ConfigParamsMap
|
||||
* See nvmedia_2d.h and sample config file(s) for details.
|
||||
*/
|
||||
ConfigParamsMap paramsMap[] = {
|
||||
/*ParamName, &args->variableName, paramType, D, LimitType, Mn, Mx, CharSize, p2C, section */
|
||||
{"transformMode", &args->blitParams.dstTransform, TYPE_UINT, 0, LIMITS_BOTH, 0, 7, 0, 0, SECTION_NONE},
|
||||
{"filterMode", &args->blitParams.filter, TYPE_UINT, 1, LIMITS_BOTH, 1, 4, 0, 0, SECTION_NONE},
|
||||
{"colorStd", &args->blitParams.colorStandard, TYPE_UINT, 0, LIMITS_MIN, 0, 3, 0, 0, SECTION_NONE},
|
||||
{"validOperations", &args->blitParams.validFields, TYPE_UINT, 0, LIMITS_BOTH, 0, 15, 0, 0, SECTION_NONE},
|
||||
{"inputfile", &args->inputFileName, TYPE_CHAR_ARR, 0, LIMITS_NONE, 0, 0, FILE_NAME_SIZE, 0, SECTION_NONE},
|
||||
|
||||
/*src surface alloc attributes*/
|
||||
{"srcWidth", &args->srcSurfAllocAttrs[0].value, TYPE_UINT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"srcHeight", &args->srcSurfAllocAttrs[1].value, TYPE_UINT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"srcCPUAccess", &args->srcSurfAllocAttrs[4].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 3, 0, 0, SECTION_NONE},
|
||||
{"srcAllocType", &args->srcSurfAllocAttrs[5].value, TYPE_UINT, 0, LIMITS_BOTH, 0, 1, 0, 0, SECTION_NONE},
|
||||
{"srcScanType", &args->srcSurfAllocAttrs[6].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 1, 0, 0, SECTION_NONE},
|
||||
{"srcColorStd", &args->srcSurfAllocAttrs[7].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 12, 0, 0, SECTION_NONE},
|
||||
/*src surface format attributes*/
|
||||
{"srcSurfType", &args->srcSurfFormatAttrs[0].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 3, 0, 0, SECTION_NONE},
|
||||
{"srcLayout", &args->srcSurfFormatAttrs[1].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 2, 0, 0, SECTION_NONE},
|
||||
{"srcDataType", &args->srcSurfFormatAttrs[2].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 4, 0, 0, SECTION_NONE},
|
||||
{"srcMemory", &args->srcSurfFormatAttrs[3].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 3, 0, 0, SECTION_NONE},
|
||||
{"srcSubSamplingType", &args->srcSurfFormatAttrs[4].value, TYPE_UINT, 1, LIMITS_BOTH, 0, 4, 0, 0, SECTION_NONE},
|
||||
{"srcBitsPerComponent", &args->srcSurfFormatAttrs[5].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 10, 0, 0, SECTION_NONE},
|
||||
{"srcComponentOrder", &args->srcSurfFormatAttrs[6].value, TYPE_UINT, 2, LIMITS_BOTH, 1, 45, 0, 0, SECTION_NONE},
|
||||
/*srcRect*/
|
||||
{"srcRectx0", &args->srcRect.x0, TYPE_USHORT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"srcRecty0", &args->srcRect.y0, TYPE_USHORT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"srcRectx1", &args->srcRect.x1, TYPE_USHORT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"srcRecty1", &args->srcRect.y1, TYPE_USHORT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
/*dst surface alloc attributes*/
|
||||
{"dstWidth", &args->dstSurfAllocAttrs[0].value, TYPE_UINT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"dstHeight", &args->dstSurfAllocAttrs[1].value, TYPE_UINT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"dstCPUAccess", &args->dstSurfAllocAttrs[4].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 3, 0, 0, SECTION_NONE},
|
||||
{"dstAllocType", &args->dstSurfAllocAttrs[5].value, TYPE_UINT, 0, LIMITS_BOTH, 0, 1, 0, 0, SECTION_NONE},
|
||||
{"dstScanType", &args->dstSurfAllocAttrs[6].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 1, 0, 0, SECTION_NONE},
|
||||
{"dstColorStd", &args->dstSurfAllocAttrs[7].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 12, 0, 0, SECTION_NONE},
|
||||
/*dst surface format attributes*/
|
||||
{"dstSurfType", &args->dstSurfFormatAttrs[0].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 3, 0, 0, SECTION_NONE},
|
||||
{"dstLayout", &args->dstSurfFormatAttrs[1].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 2, 0, 0, SECTION_NONE},
|
||||
{"dstDataType", &args->dstSurfFormatAttrs[2].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 4, 0, 0, SECTION_NONE},
|
||||
{"dstMemory", &args->dstSurfFormatAttrs[3].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 3, 0, 0, SECTION_NONE},
|
||||
{"dstSubSamplingType", &args->dstSurfFormatAttrs[4].value, TYPE_UINT, 1, LIMITS_BOTH, 0, 4, 0, 0, SECTION_NONE},
|
||||
{"dstBitsPerComponent", &args->dstSurfFormatAttrs[5].value, TYPE_UINT, 1, LIMITS_BOTH, 1, 10, 0, 0, SECTION_NONE},
|
||||
{"dstComponentOrder", &args->dstSurfFormatAttrs[6].value, TYPE_UINT, 2, LIMITS_BOTH, 1, 45, 0, 0, SECTION_NONE},
|
||||
/*dstRect*/
|
||||
{"dstRectx0", &args->dstRect.x0, TYPE_USHORT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"dstRecty0", &args->dstRect.y0, TYPE_USHORT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"dstRectx1", &args->dstRect.x1, TYPE_USHORT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
{"dstRecty1", &args->dstRect.y1, TYPE_USHORT, 0, LIMITS_MIN, 0, 0, 0, 0, SECTION_NONE},
|
||||
/*End of the array */
|
||||
{NULL, NULL, TYPE_UINT, 0, LIMITS_NONE, 0, 0, 0, 0, SECTION_NONE}
|
||||
};
|
||||
|
||||
args->iterations = 100; // Set default iterations value.
|
||||
|
||||
if (checkCmdLineFlag(argc, (const char **)argv, "-h")) {
|
||||
return -1;
|
||||
}
|
||||
if (checkCmdLineFlag(argc, (const char **)argv, "cf")) {
|
||||
|
||||
char *inputFileName = NULL;
|
||||
getCmdLineArgumentString(argc, (const char **)argv, "cf", (char**)&inputFileName);
|
||||
if (!inputFileName) {
|
||||
printf("ERR: Invalid config file name\n");
|
||||
return -1;
|
||||
}
|
||||
filename = sdkFindFilePath(inputFileName, ".");
|
||||
}
|
||||
if (checkCmdLineFlag(argc, (const char **)argv, "iterations")) {
|
||||
args->iterations = getCmdLineArgumentInt(argc, (const char **)argv, "iterations");
|
||||
}
|
||||
|
||||
if (filename == NULL) {
|
||||
// Set default file to use if no config file given.
|
||||
filename = sdkFindFilePath("sample.cfg", ".");
|
||||
}
|
||||
|
||||
if (filename != NULL)
|
||||
{
|
||||
printf("Using config file %s\n", filename);
|
||||
|
||||
/* Init Parser Map*/
|
||||
status = ConfigParser_InitParamsMap(paramsMap);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("ERR: ConfigParser_InitParamsMap failed! status:%x\n", status);
|
||||
return -1;
|
||||
}
|
||||
|
||||
status = ConfigParser_ParseFile(paramsMap, 1, sectionsMap, (char*)filename);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("ERR: Failed to parse config file. status:%x\n", status);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_INFO("ParseArgs: Validating params from config file\n");
|
||||
status = ConfigParser_ValidateParams(paramsMap, sectionsMap);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("ERR: Some of the params in config file are invalid.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _NVMEDIA_2D_CMD_LINE_H_
|
||||
#define _NVMEDIA_2D_CMD_LINE_H_
|
||||
|
||||
/* Include header containing NvMedia2D declarations */
|
||||
#include "nvmedia_2d.h"
|
||||
|
||||
/* Maximum length of the path including file name */
|
||||
#define FILE_NAME_SIZE 1024
|
||||
|
||||
/* TestArgs contains all arguments required to run the 2D test */
|
||||
typedef struct _TestArgs {
|
||||
char inputFileName[FILE_NAME_SIZE];
|
||||
|
||||
NvMediaSurfAllocAttr srcSurfAllocAttrs[NVM_SURF_ALLOC_ATTR_MAX];
|
||||
NvMediaSurfAllocAttr dstSurfAllocAttrs[NVM_SURF_ALLOC_ATTR_MAX];
|
||||
uint32_t numSurfAllocAttrs;
|
||||
|
||||
NvMediaSurfFormatAttr srcSurfFormatAttrs[NVM_SURF_FMT_ATTR_MAX];
|
||||
NvMediaSurfFormatAttr dstSurfFormatAttrs[NVM_SURF_FMT_ATTR_MAX];
|
||||
|
||||
NvMediaRect srcRect;
|
||||
NvMediaRect dstRect;
|
||||
NvMedia2DBlitParameters blitParams;
|
||||
size_t iterations;
|
||||
} TestArgs;
|
||||
|
||||
typedef struct {
|
||||
NvMediaDevice *device;
|
||||
/* I2D for 2D blit processing */
|
||||
NvMedia2D *i2d;
|
||||
NvMediaImage *srcImage;
|
||||
NvMediaImage *dstImage;
|
||||
NvMediaRect *srcRect;
|
||||
NvMediaRect *dstRect;
|
||||
uint8_t **dstBuff;
|
||||
uint32_t *dstBuffPitches;
|
||||
uint8_t *dstBuffer;
|
||||
uint32_t numSurfaces;
|
||||
uint32_t bytesPerPixel;
|
||||
uint32_t heightSurface;
|
||||
uint32_t widthSurface;
|
||||
float *xScalePtr;
|
||||
float *yScalePtr;
|
||||
|
||||
} Blit2DTest;
|
||||
|
||||
/* Prints application usage options */
|
||||
void PrintUsage (void);
|
||||
|
||||
/* Parses command line arguments.
|
||||
* Also parses any configuration files supplied in the command line arguments.
|
||||
* Arguments:
|
||||
* argc
|
||||
* (in) Number of tokens in the command line
|
||||
* argv
|
||||
* (in) Command line tokens
|
||||
* args
|
||||
* (out) Pointer to test arguments structure
|
||||
*/
|
||||
int ParseArgs(int argc, char **argv, TestArgs *args);
|
||||
|
||||
#endif /* _NVMEDIA_2D_CMD_LINE_H_ */
|
||||
@@ -0,0 +1,558 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "config_parser.h"
|
||||
#include "log_utils.h"
|
||||
#if defined(__QNX__)
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
static NvMediaStatus GetParamIndex(ConfigParamsMap *paramsMap, char *paramName, unsigned int *index)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while(paramsMap[i].paramName != NULL) {
|
||||
if (strcasecmp(paramsMap[i].paramName, paramName) == 0) {
|
||||
*index = i;
|
||||
return NVMEDIA_STATUS_OK;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
return NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
NvMediaStatus ConfigParser_GetSectionIndexByName(SectionMap *sectionsMap, char *sectionName, unsigned int *index)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
|
||||
while(sectionsMap[i].secType != SECTION_NONE) {
|
||||
if(strcmp(sectionsMap[i].name, sectionName) == 0) {
|
||||
*index = i;
|
||||
return NVMEDIA_STATUS_OK;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
return NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
NvMediaStatus ConfigParser_GetSectionIndexByType(SectionMap *sectionsMap, SectionType sectionType, unsigned int *index)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
|
||||
while(sectionsMap[i].secType != SECTION_NONE) {
|
||||
if(sectionsMap[i].secType == sectionType) {
|
||||
*index = i;
|
||||
return NVMEDIA_STATUS_OK;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
*index = i;
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
static NvMediaStatus GetFileContent(char *filename, char **fileContentOut)
|
||||
{
|
||||
FILE *file;
|
||||
char *fileCotent;
|
||||
long fileSize;
|
||||
|
||||
file = fopen(filename, "r");
|
||||
if(file == NULL) {
|
||||
printf("Parser_GetFileContent: Cannot open configuration file %s\n", filename);
|
||||
return NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
if (fseek(file, 0, SEEK_END) != 0) {
|
||||
printf("Parser_GetFileContent: Cannot fseek in configuration file %s\n", filename);
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
|
||||
fileSize = ftell(file);
|
||||
if(fileSize < 0 || fileSize > 150000) {
|
||||
printf("Parser_GetFileContent: Unreasonable Filesize %ld encountered for file %s\n", fileSize, filename);
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
|
||||
if(fseek (file, 0, SEEK_SET) != 0) {
|
||||
printf("Parser_GetFileContent: Cannot fseek in configuration file %s\n", filename);
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
|
||||
fileCotent = (char*)malloc(fileSize + 1);
|
||||
if(fileCotent == NULL) {
|
||||
printf("Parser_GetFileContent: Failed allocating buffer for file Content\n");
|
||||
return NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
fileSize = (long)fread(fileCotent, 1, fileSize, file);
|
||||
fileCotent[fileSize] = '\0';
|
||||
*fileContentOut = fileCotent;
|
||||
|
||||
fclose(file);
|
||||
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
NvMediaStatus ConfigParser_ParseFile(ConfigParamsMap *paramsMap, unsigned int numParams, SectionMap *sectionsMap, char *fileName)
|
||||
{
|
||||
char *items[MAX_ITEMS_TO_PARSE] = {NULL};
|
||||
int intValue, itemsCount = 0, i = 0, sectionIndex = 0;
|
||||
double doubleValue;
|
||||
float floatValue;
|
||||
unsigned int currItemIndex, uintValue, sectionId = 0, currSectionId = 0, charValue, paramDefaultLength;
|
||||
unsigned short ushortValue;
|
||||
short shortValue;
|
||||
unsigned long long ullValue;
|
||||
NvMediaBool isInString = NVMEDIA_FALSE, isInItem = NVMEDIA_FALSE;
|
||||
char *buffer, *bufferEnd, *param, *pParamLength;
|
||||
char sectionName[100];
|
||||
char currDigit;
|
||||
char *configContentBuf = NULL;
|
||||
unsigned int numSetsInSection = 0;
|
||||
|
||||
if(GetFileContent(fileName, &configContentBuf) != NVMEDIA_STATUS_OK) {
|
||||
printf("ConfigParser_ParseFile: Failed reading file %s", fileName);
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
|
||||
buffer = configContentBuf;
|
||||
bufferEnd = &configContentBuf[strlen(configContentBuf)];
|
||||
|
||||
// Stage one: Create items mapping in the content using "items" pointers array. For each parameter we have 3 items: param name, '=' char and the param value.
|
||||
while(buffer < bufferEnd) {
|
||||
if(itemsCount >= MAX_ITEMS_TO_PARSE) {
|
||||
LOG_WARN("ConfigParser_ParseFile: Number of items in configuration file exceeded the maximum allowed (%d). Only %d items will be parsed.\n",
|
||||
MAX_ITEMS_TO_PARSE, MAX_ITEMS_TO_PARSE);
|
||||
itemsCount = MAX_ITEMS_TO_PARSE;
|
||||
break;
|
||||
}
|
||||
switch(*buffer) {
|
||||
// Carriage return
|
||||
case 13:
|
||||
++buffer;
|
||||
break;
|
||||
case '#':
|
||||
*buffer = '\0'; // Replace '#' with '\0' in case of comment immediately following integer or string
|
||||
while(*buffer != '\n' && buffer < bufferEnd) { // Skip till EOL or EOF
|
||||
++buffer;
|
||||
}
|
||||
isInString = NVMEDIA_FALSE;
|
||||
isInItem = NVMEDIA_FALSE;
|
||||
break;
|
||||
case '\n':
|
||||
isInItem = NVMEDIA_FALSE;
|
||||
isInString = NVMEDIA_FALSE;
|
||||
*buffer++='\0';
|
||||
break;
|
||||
case ' ':
|
||||
case '\t': // Skip whitespace, leave state unchanged
|
||||
if(isInString)
|
||||
buffer++;
|
||||
else { // Terminate non-strings once whitespace is found
|
||||
*buffer++ = '\0';
|
||||
isInItem = NVMEDIA_FALSE;
|
||||
}
|
||||
break;
|
||||
case '"': // Begin/End of String
|
||||
*buffer++ = '\0';
|
||||
if(!isInString) {
|
||||
items[itemsCount++] = buffer;
|
||||
isInItem = ~isInItem;
|
||||
} else {
|
||||
isInItem = NVMEDIA_FALSE;
|
||||
}
|
||||
isInString = ~isInString; // Toggle
|
||||
break;
|
||||
case '[':
|
||||
*(buffer++) = '\0';
|
||||
items[itemsCount++] = buffer;
|
||||
while(*buffer != ' ' && *buffer != '\n' && buffer < bufferEnd) { // Skip till whitespace (after which is located the parsed section number) or EOL or EOF
|
||||
sectionName[i++] = *(buffer++);
|
||||
}
|
||||
sectionName[i] = '\0';
|
||||
i = 0;
|
||||
while(*buffer == ' ') {
|
||||
*(buffer++) = '\0';
|
||||
}
|
||||
items[itemsCount++] = buffer;
|
||||
while(*buffer != ']' && *buffer != '\n' && buffer < bufferEnd) { // Read the section number
|
||||
currDigit = *buffer;
|
||||
sectionIndex = sectionIndex * 10 + (currDigit - '0');
|
||||
buffer++;
|
||||
}
|
||||
*(buffer++) = '\0';
|
||||
sectionIndex--;
|
||||
if(ConfigParser_GetSectionIndexByName(sectionsMap, sectionName, §ionId) != NVMEDIA_STATUS_OK) {
|
||||
printf("ConfigParser_ParseFile: SectionName couldn't be found in section map: '%s'.\n", sectionName);
|
||||
}
|
||||
numSetsInSection++;
|
||||
sectionsMap[sectionId].lastSectionIndex = sectionIndex;
|
||||
sectionIndex = 0;
|
||||
isInString = NVMEDIA_FALSE;
|
||||
isInItem = NVMEDIA_FALSE;
|
||||
break;
|
||||
default:
|
||||
if(!isInItem) {
|
||||
items[itemsCount++] = buffer;
|
||||
isInItem = ~isInItem;
|
||||
}
|
||||
buffer++;
|
||||
}
|
||||
}
|
||||
|
||||
itemsCount--;
|
||||
|
||||
if(numSetsInSection > numParams) {
|
||||
printf("%s: Not enough buffers allocated for parsing. Number of sets allocated: %d. Number of sets in config file: %d \n",
|
||||
__func__, numParams, numSetsInSection);
|
||||
if(configContentBuf) {
|
||||
free(configContentBuf);
|
||||
}
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
|
||||
// Stage 2: Go through the list of items and save their values in parameters map
|
||||
for(i = 0; i < itemsCount; i += 3) {
|
||||
if(ConfigParser_GetSectionIndexByName(sectionsMap, items[i], &currItemIndex) == NVMEDIA_STATUS_OK) {
|
||||
currSectionId = atoi(items[i + 1]);
|
||||
currSectionId--;
|
||||
LOG_DBG("ConfigParser_ParseFile: Parsing section %s index %d\n", items[i], currSectionId);
|
||||
i -= 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(GetParamIndex(paramsMap, items[i], &currItemIndex) != NVMEDIA_STATUS_OK) {
|
||||
LOG_WARN("ConfigParser_ParseFile: Parameter Name '%s' is not recognized. Dismissing this parameter.\n", items[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(strcmp("=", items[i + 1])) {
|
||||
printf("ConfigParser_ParseFile: '=' expected as the second token in each line. Error caught while parsing parameter '%s'.\n", items[i]);
|
||||
i -= 2;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(ConfigParser_GetSectionIndexByType(sectionsMap, paramsMap[currItemIndex].sectionType, §ionId) != NVMEDIA_STATUS_OK) {
|
||||
printf("ConfigParser_ParseFile: Section index couldn't be found in section map by type. Param Name: '%s'.\n", paramsMap[currItemIndex].paramName);
|
||||
}
|
||||
|
||||
if(sectionsMap[sectionId].lastSectionIndex == 0) {
|
||||
// Param is not part of a collection or collection includes only one item
|
||||
currSectionId = 0;
|
||||
}
|
||||
|
||||
param = (char *)paramsMap[currItemIndex].mappedLocation + currSectionId * sectionsMap[sectionId].sizeOfStruct;
|
||||
pParamLength = (char *)paramsMap[currItemIndex].stringLengthAddr + currSectionId * sectionsMap[sectionId].sizeOfStruct;
|
||||
paramDefaultLength = paramsMap[currItemIndex].stringLength;
|
||||
|
||||
// Interpret the Value
|
||||
LOG_DBG("ConfigParser_ParseFile: Interpreting parameter %s\n", items[i]);
|
||||
switch(paramsMap[currItemIndex].type) {
|
||||
case TYPE_INT:
|
||||
if(sscanf(items[i + 2], "%d", &intValue) != 1) {
|
||||
printf("ConfigParser_ParseFile: Expected numerical value for Parameter %s, found value '%s'\n", items[i], items[i + 2]);
|
||||
}
|
||||
*(int *)(void *)param = intValue;
|
||||
break;
|
||||
case TYPE_UINT:
|
||||
if(sscanf(items[i + 2], "%u", &uintValue) != 1) {
|
||||
printf("ConfigParser_ParseFile: Expected numerical value for Parameter %s, found value '%s'\n", items[i], items[i + 2]);
|
||||
}
|
||||
*(unsigned int *)(void *)param = uintValue;
|
||||
break;
|
||||
case TYPE_UINT_HEX:
|
||||
if(sscanf(items[i + 2], "%x", &uintValue) != 1) {
|
||||
printf("ConfigParser_ParseFile: Expected unsigned char value for Parameter %s, found value '%s'\n", items[i], items[i + 2]);
|
||||
}
|
||||
*(unsigned int *)(void *)param = uintValue;
|
||||
break;
|
||||
case TYPE_CHAR_ARR:
|
||||
if(items[i + 2] == NULL)
|
||||
memset(param, 0, (pParamLength != NULL && *pParamLength != 0) ? *pParamLength : paramDefaultLength);
|
||||
else {
|
||||
strncpy(param, items[i + 2], paramsMap[currItemIndex].stringLength);
|
||||
param[strlen(items[i + 2])] = '\0';
|
||||
}
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
if(sscanf(items[i + 2], "%lf", &doubleValue) != 1) {
|
||||
printf("ConfigParser_ParseFile: Expected double value for Parameter %s, found value '%s'\n", items[i], items[i + 2]);
|
||||
}
|
||||
*(double *)(void *)param = doubleValue;
|
||||
break;
|
||||
case TYPE_FLOAT:
|
||||
if(sscanf(items[i + 2], "%f", &floatValue) != 1) {
|
||||
printf("ConfigParser_ParseFile: Expected double value for Parameter %s, found value '%s'\n", items[i], items[i + 2]);
|
||||
}
|
||||
*(float *)(void *)param = floatValue;
|
||||
break;
|
||||
case TYPE_UCHAR:
|
||||
if(sscanf(items[i + 2], "%u", &charValue) != 1) {
|
||||
printf("ConfigParser_ParseFile: Expected unsigned char value for Parameter %s, found value '%s'\n", items[i], items[i + 2]);
|
||||
}
|
||||
*(unsigned char *)(void *)param = charValue;
|
||||
break;
|
||||
case TYPE_USHORT:
|
||||
if(sscanf(items[i + 2], "%hu", &ushortValue) != 1) {
|
||||
printf("ConfigParser_ParseFile: Expected unsigned short value for Parameter %s, found value '%s'\n", items[i], items[i + 2]);
|
||||
}
|
||||
*(unsigned short *)(void *)param = ushortValue;
|
||||
break;
|
||||
case TYPE_SHORT:
|
||||
if(sscanf(items[i + 2], "%hd", &shortValue) != 1) {
|
||||
printf("ConfigParser_ParseFile: Expected short value for Parameter %s, found value '%s'\n", items[i], items[i + 2]);
|
||||
}
|
||||
*(short *)(void *)param = shortValue;
|
||||
break;
|
||||
case TYPE_UCHAR_ARR:
|
||||
if(items[i + 2] == NULL)
|
||||
memset(param, 0, (pParamLength != NULL && *pParamLength != 0) ? *pParamLength : paramDefaultLength);
|
||||
else {
|
||||
strncpy(param, items[i + 2], paramsMap[currItemIndex].stringLength);
|
||||
param[strlen(items[i + 2])] = '\0';
|
||||
}
|
||||
break;
|
||||
case TYPE_ULLONG:
|
||||
if(sscanf(items[i + 2], "%llu", &ullValue) != 1) {
|
||||
printf("ConfigParser_ParseFile: Expected numerical value for Parameter %s, found value '%s'\n", items[i], items[i + 2]);
|
||||
}
|
||||
*(unsigned long long *)(void *)param = ullValue;
|
||||
break;
|
||||
default:
|
||||
printf("ConfigParser_ParseFile: Encountered unknown value type in the map\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (configContentBuf)
|
||||
free(configContentBuf);
|
||||
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
NvMediaStatus ConfigParser_InitParamsMap(ConfigParamsMap *paramsMap)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while(paramsMap[i].paramName != NULL) {
|
||||
if (paramsMap[i].mappedLocation == NULL) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(paramsMap[i].type) {
|
||||
case TYPE_UINT:
|
||||
case TYPE_UINT_HEX:
|
||||
*(unsigned int *)(paramsMap[i].mappedLocation) = (unsigned int)paramsMap[i].defaultValue;
|
||||
break;
|
||||
case TYPE_INT:
|
||||
*(int *)(paramsMap[i].mappedLocation) = (int)paramsMap[i].defaultValue;
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
*(double *)(paramsMap[i].mappedLocation) = (double)paramsMap[i].defaultValue;
|
||||
break;
|
||||
case TYPE_FLOAT:
|
||||
*(float *)(paramsMap[i].mappedLocation) = (float)paramsMap[i].defaultValue;
|
||||
break;
|
||||
case TYPE_UCHAR:
|
||||
*(unsigned char *)(paramsMap[i].mappedLocation) = (NvMediaBool)paramsMap[i].defaultValue;
|
||||
break;
|
||||
case TYPE_USHORT:
|
||||
*(unsigned short *)(paramsMap[i].mappedLocation) = (unsigned short)paramsMap[i].defaultValue;
|
||||
break;
|
||||
case TYPE_SHORT:
|
||||
*(short *)(paramsMap[i].mappedLocation) = (short)paramsMap[i].defaultValue;
|
||||
break;
|
||||
case TYPE_ULLONG:
|
||||
*(unsigned long long *)(paramsMap[i].mappedLocation) = (unsigned long long)paramsMap[i].defaultValue;
|
||||
break;
|
||||
case TYPE_CHAR_ARR:
|
||||
case TYPE_UCHAR_ARR:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
NvMediaStatus ConfigParser_ValidateParams(ConfigParamsMap *paramsMap, SectionMap *sectionsMap)
|
||||
{
|
||||
NvMediaStatus status = NVMEDIA_STATUS_OK;
|
||||
unsigned int sectionId = 0, i = 0, j;
|
||||
char *param;
|
||||
|
||||
while(paramsMap[i].paramName != NULL) {
|
||||
if(ConfigParser_GetSectionIndexByType(sectionsMap, paramsMap[i].sectionType, §ionId) != NVMEDIA_STATUS_OK) {
|
||||
printf("ConfigParser_ValidateParams: Section index couldn't be found in section map. Param Name: '%s'.\n", paramsMap[i].paramName);
|
||||
}
|
||||
|
||||
for(j = 0; j <= sectionsMap[sectionId].lastSectionIndex; j++) {
|
||||
if(paramsMap[i].paramLimits == 1 || paramsMap[i].paramLimits == 2) {
|
||||
param = (char *)paramsMap[i].mappedLocation + j * sectionsMap[sectionId].sizeOfStruct;
|
||||
if (param == NULL) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
switch (paramsMap[i].type) {
|
||||
case TYPE_UINT:
|
||||
case TYPE_UINT_HEX:
|
||||
if(*(unsigned int *)(void *)param < (unsigned int)paramsMap[i].minLimit ||
|
||||
(paramsMap[i].paramLimits == 2 && *(unsigned int *)(void *)param > (unsigned int)paramsMap[i].maxLimit )) {
|
||||
printf("ConfigParser_ValidateParams: Error in input parameter %s\n", paramsMap[i].paramName);
|
||||
printf("Check configuration file for parameter limits\n");
|
||||
status = NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
if(*(double *)(void *)param < (double)paramsMap[i].minLimit ||
|
||||
(paramsMap[i].paramLimits == 2 && *(double *)(void *)param > (double)paramsMap[i].maxLimit )) {
|
||||
printf("ConfigParser_ValidateParams: Error in input parameter %s\n", paramsMap[i].paramName);
|
||||
printf("Check configuration file for parameter limits\n");
|
||||
status = NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
break;
|
||||
case TYPE_FLOAT:
|
||||
if(*(float *)(void *)param < (float)paramsMap[i].minLimit ||
|
||||
(paramsMap[i].paramLimits == 2 && *(float *)(void *)param > (float)paramsMap[i].maxLimit )) {
|
||||
printf("ConfigParser_ValidateParams: Error in input parameter %s\n", paramsMap[i].paramName);
|
||||
printf("Check configuration file for parameter limits\n");
|
||||
status = NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
break;
|
||||
case TYPE_INT:
|
||||
if(*(int *)(void *)param < (int)paramsMap[i].minLimit ||
|
||||
(paramsMap[i].paramLimits == 2 && *(int *)(void *)param > (int)paramsMap[i].maxLimit )) {
|
||||
printf("ConfigParser_ValidateParams: Error in input parameter %s\n", paramsMap[i].paramName);
|
||||
printf("Check configuration file for parameter limits\n");
|
||||
status = NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
break;
|
||||
case TYPE_USHORT:
|
||||
if(*(unsigned short *)(void *)param < (unsigned short)paramsMap[i].minLimit ||
|
||||
(paramsMap[i].paramLimits == 2 && *(unsigned short *)(void *)param > (unsigned short)paramsMap[i].maxLimit )) {
|
||||
printf("ConfigParser_ValidateParams: Error in input parameter %s\n", paramsMap[i].paramName);
|
||||
printf("Check configuration file for parameter limits\n");
|
||||
status = NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
break;
|
||||
case TYPE_SHORT:
|
||||
if(*(short *)(void *)param < (short)paramsMap[i].minLimit ||
|
||||
(paramsMap[i].paramLimits == 2 && *(short *)(void *)param > (short)paramsMap[i].maxLimit )) {
|
||||
printf("ConfigParser_ValidateParams: Error in input parameter %s\n", paramsMap[i].paramName);
|
||||
printf("Check configuration file for parameter limits\n");
|
||||
status = NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
break;
|
||||
case TYPE_ULLONG:
|
||||
if(*(unsigned long long *)(void *)param < (unsigned long long)paramsMap[i].minLimit ||
|
||||
(paramsMap[i].paramLimits == 2 && *(unsigned long long *)(void *)param > (unsigned long long)paramsMap[i].maxLimit )) {
|
||||
printf("ConfigParser_ValidateParams: Error in input parameter %s\n", paramsMap[i].paramName);
|
||||
printf("Check configuration file for parameter limits\n");
|
||||
status = NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
NvMediaStatus ConfigParser_DisplayParams(ConfigParamsMap *pParamsMap, SectionMap *pSectionsMap)
|
||||
{
|
||||
unsigned int i = 0, j, sectionId = 0;
|
||||
char *param;
|
||||
|
||||
while(pParamsMap[i].paramName != NULL) {
|
||||
if(ConfigParser_GetSectionIndexByType(pSectionsMap, pParamsMap[i].sectionType, §ionId) != NVMEDIA_STATUS_OK) {
|
||||
printf("ConfigParser_DisplayParams: Section index couldn't be found in section map by type. Param Name: '%s'.\n", pParamsMap[i].paramName);
|
||||
}
|
||||
|
||||
for(j = 0; j <= pSectionsMap[sectionId].lastSectionIndex; j++) {
|
||||
param = (char *)pParamsMap[i].mappedLocation + j * pSectionsMap[sectionId].sizeOfStruct;
|
||||
if (param == NULL) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(pParamsMap[i].type) {
|
||||
case TYPE_UINT:
|
||||
printf("(%d) %s = %u\n", j, pParamsMap[i].paramName, *(unsigned int *)(void *)param);
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
printf("(%d) %s = %.2lf\n", j, pParamsMap[i].paramName, *(double *)(void *)param);
|
||||
break;
|
||||
case TYPE_FLOAT:
|
||||
printf("(%d) %s = %.2f\n", j, pParamsMap[i].paramName, *(float *)(void *)param);
|
||||
break;
|
||||
case TYPE_UCHAR:
|
||||
printf("(%d) %s = %d\n", j, pParamsMap[i].paramName, *(unsigned char *)(void *)param);
|
||||
break;
|
||||
case TYPE_USHORT:
|
||||
printf("(%d) %s = %hu\n", j, pParamsMap[i].paramName, *(unsigned short *)(void *)param);
|
||||
break;
|
||||
case TYPE_SHORT:
|
||||
printf("(%d) %s = %hd\n", j, pParamsMap[i].paramName, *(short *)(void *)param);
|
||||
break;
|
||||
case TYPE_ULLONG:
|
||||
printf("(%d) %s = %llu\n", j, pParamsMap[i].paramName, *(unsigned long long *)(void *)param);
|
||||
break;
|
||||
case TYPE_CHAR_ARR:
|
||||
printf("(%d) %s = ""%s""\n", j, pParamsMap[i].paramName, param);
|
||||
break;
|
||||
case TYPE_UCHAR_ARR:
|
||||
printf("(%d) %s = ""%s""\n", j, pParamsMap[i].paramName, (unsigned char *)(void *)param);
|
||||
break;
|
||||
case TYPE_INT:
|
||||
printf("(%d) %s = %d\n", j, pParamsMap[i].paramName, *(int *)(void *)param);
|
||||
break;
|
||||
case TYPE_UINT_HEX:
|
||||
printf("(%d) %s = %x\n", j, pParamsMap[i].paramName, *(unsigned int *)(void *)param);
|
||||
break;
|
||||
default:
|
||||
// Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _NVMEDIA_TEST_CONFIG_PARSER_H_
|
||||
#define _NVMEDIA_TEST_CONFIG_PARSER_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nvmedia_core.h"
|
||||
#include "nvmedia_surface.h"
|
||||
|
||||
#define MAX_ITEMS_TO_PARSE 10000
|
||||
|
||||
typedef enum _ParamType {
|
||||
TYPE_UINT = 0,
|
||||
TYPE_UINT_HEX,
|
||||
TYPE_INT,
|
||||
TYPE_DOUBLE,
|
||||
TYPE_FLOAT,
|
||||
TYPE_UCHAR,
|
||||
TYPE_ULLONG,
|
||||
TYPE_USHORT,
|
||||
TYPE_CHAR_ARR,
|
||||
TYPE_UCHAR_ARR,
|
||||
TYPE_SHORT
|
||||
} ParamType;
|
||||
|
||||
typedef enum {
|
||||
LIMITS_NONE = 0,
|
||||
LIMITS_MIN = 1,
|
||||
LIMITS_BOTH = 2
|
||||
} LimitsType;
|
||||
|
||||
typedef enum {
|
||||
SECTION_NONE,
|
||||
SECTION_CAPTURE,
|
||||
SECTION_QP,
|
||||
SECTION_RC,
|
||||
SECTION_ENCODE_PIC,
|
||||
SECTION_ENCODE_PIC_H264,
|
||||
SECTION_ENCODE_PIC_H265,
|
||||
SECTION_MVC,
|
||||
SECTION_PAYLOAD,
|
||||
SECTION_2DPROCESSOR
|
||||
} SectionType;
|
||||
|
||||
typedef struct {
|
||||
SectionType secType;
|
||||
const char *name;
|
||||
unsigned int lastSectionIndex;
|
||||
size_t sizeOfStruct;
|
||||
} SectionMap;
|
||||
|
||||
typedef struct {
|
||||
const char *paramName;
|
||||
void *mappedLocation;
|
||||
ParamType type;
|
||||
double defaultValue;
|
||||
LimitsType paramLimits;
|
||||
double minLimit;
|
||||
double maxLimit;
|
||||
unsigned int stringLength; // string param size
|
||||
unsigned int *stringLengthAddr; // address of string param size
|
||||
SectionType sectionType;
|
||||
} ConfigParamsMap;
|
||||
|
||||
NvMediaStatus ConfigParser_InitParamsMap(ConfigParamsMap *paramsMap);
|
||||
NvMediaStatus ConfigParser_ParseFile(ConfigParamsMap *paramsMap, unsigned int numParams, SectionMap *sectionsMap, char *file);
|
||||
NvMediaStatus ConfigParser_ValidateParams(ConfigParamsMap *paramsMap, SectionMap *sectionsMap);
|
||||
NvMediaStatus ConfigParser_DisplayParams(ConfigParamsMap *paramsMap, SectionMap *sectionsMap);
|
||||
NvMediaStatus ConfigParser_GetSectionIndexByName(SectionMap *sectionsMap, char *sectionName, unsigned int *index);
|
||||
NvMediaStatus ConfigParser_GetSectionIndexByType(SectionMap *sectionsMap, SectionType sectionType, unsigned int *index);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NVMEDIA_TEST_CONFIG_PARSER_H_ */
|
||||
@@ -0,0 +1,808 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "image_utils.h"
|
||||
#include "misc_utils.h"
|
||||
#include "nvmedia_surface.h"
|
||||
|
||||
#define MAXM_NUM_SURFACES 6
|
||||
|
||||
typedef struct {
|
||||
float heightFactor[6];
|
||||
float widthFactor[6];
|
||||
unsigned int numSurfaces;
|
||||
} ImgUtilSurfParams;
|
||||
|
||||
ImgUtilSurfParams ImgSurfParamsTable_RGBA = {
|
||||
.heightFactor = {1, 0, 0, 0, 0, 0},
|
||||
.widthFactor = {1, 0, 0, 0, 0, 0},
|
||||
.numSurfaces = 1,
|
||||
};
|
||||
|
||||
ImgUtilSurfParams ImgSurfParamsTable_RAW = {
|
||||
.heightFactor = {1, 0, 0, 0, 0, 0},
|
||||
.widthFactor = {1, 0, 0, 0, 0, 0},
|
||||
.numSurfaces = 1,
|
||||
};
|
||||
|
||||
ImgUtilSurfParams ImgSurfParamsTable_YUV[][4] = {
|
||||
{ /* PLANAR */
|
||||
{ /* 420 */
|
||||
.heightFactor = {1, 0.5, 0.5, 0, 0, 0},
|
||||
.widthFactor = {1, 0.5, 0.5, 0, 0, 0},
|
||||
.numSurfaces = 3,
|
||||
},
|
||||
{ /* 422 */
|
||||
.heightFactor = {1, 1, 1, 0, 0, 0},
|
||||
.widthFactor = {1, 0.5, 0.5, 0, 0, 0},
|
||||
.numSurfaces = 3,
|
||||
},
|
||||
{ /* 444 */
|
||||
.heightFactor = {1, 1, 1, 0, 0, 0},
|
||||
.widthFactor = {1, 1, 1, 0, 0, 0},
|
||||
.numSurfaces = 3,
|
||||
},
|
||||
{ /* 422R */
|
||||
.heightFactor = {1, 0.5, 0.5, 0, 0, 0},
|
||||
.widthFactor = {1, 1, 1, 0, 0, 0},
|
||||
.numSurfaces = 3,
|
||||
},
|
||||
},
|
||||
{ /* SEMI_PLANAR */
|
||||
{ /* 420 */
|
||||
.heightFactor = {1, 0.5, 0, 0, 0, 0},
|
||||
.widthFactor = {1, 0.5, 0, 0, 0, 0},
|
||||
.numSurfaces = 2,
|
||||
},
|
||||
{ /* 422 */
|
||||
.heightFactor = {1, 1, 0, 0, 0, 0},
|
||||
.widthFactor = {1, 0.5, 0, 0, 0, 0},
|
||||
.numSurfaces = 2,
|
||||
},
|
||||
{ /* 444 */
|
||||
.heightFactor = {1, 1, 0.5, 0, 0, 0},
|
||||
.widthFactor = {1, 1, 0.5, 0, 0, 0},
|
||||
.numSurfaces = 2,
|
||||
},
|
||||
{ /* 422R */
|
||||
.heightFactor = {1, 0.5, 0.5, 0, 0, 0},
|
||||
.widthFactor = {1, 1, 0.5, 0, 0, 0},
|
||||
.numSurfaces = 2,
|
||||
},
|
||||
},
|
||||
{ /* PACKED */
|
||||
{ /* 420 */
|
||||
.heightFactor = {1, 0.5, 0.5, 0, 0, 0},
|
||||
.widthFactor = {1, 0.5, 0.5, 0, 0, 0},
|
||||
.numSurfaces = 3,
|
||||
},
|
||||
{ /* 422 */
|
||||
.heightFactor = {1, 1, 1, 0, 0, 0},
|
||||
.widthFactor = {1, 0.5, 0.5, 0, 0, 0},
|
||||
.numSurfaces = 3,
|
||||
},
|
||||
{ /* 444 */
|
||||
.heightFactor = {1, 1, 1, 0, 0, 0},
|
||||
.widthFactor = {1, 1, 1, 0, 0, 0},
|
||||
.numSurfaces = 3,
|
||||
},
|
||||
{ /* 422R */
|
||||
.heightFactor = {1, 0.5, 0.5, 0, 0, 0},
|
||||
.widthFactor = {1, 1, 1, 0, 0, 0},
|
||||
.numSurfaces = 3,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
ImgUtilSurfParams ImgSurfParamsTable_Packed = {
|
||||
.heightFactor = {1, 0, 0, 0, 0, 0},
|
||||
.widthFactor = {1, 0, 0, 0, 0, 0},
|
||||
.numSurfaces = 1,
|
||||
};
|
||||
|
||||
|
||||
unsigned int ImgBytesPerPixelTable_RGBA[][6] = {
|
||||
{4, 0, 0, 0, 0, 0}, /* 8 */
|
||||
};
|
||||
|
||||
unsigned int ImgBytesPerPixelTable_RGBA16[][6] = {
|
||||
{8, 0, 0, 0, 0, 0}, /* 16 */
|
||||
};
|
||||
|
||||
unsigned int ImgBytesPerPixelTable_RG16[6] =
|
||||
{4, 0, 0, 0, 0, 0};
|
||||
|
||||
unsigned int ImgBytesPerPixelTable_Alpha[][6] = {
|
||||
{1, 0, 0, 0, 0, 0}, /* 8 */
|
||||
{2, 0, 0, 0, 0, 0}, /* 10 */
|
||||
{2, 0, 0, 0, 0, 0}, /* 12 */
|
||||
{2, 0, 0, 0, 0, 0}, /* 14 */
|
||||
{2, 0, 0, 0, 0, 0}, /* 16 */
|
||||
{4, 0, 0, 0, 0, 0}, /* 32 */
|
||||
};
|
||||
|
||||
unsigned int ImgBytesPerPixelTable_RAW[][6] = {
|
||||
{1, 0, 0, 0, 0, 0}, /* 8 */
|
||||
{2, 0, 0, 0, 0, 0}, /* 10 */
|
||||
{2, 0, 0, 0, 0, 0}, /* 12 */
|
||||
{2, 0, 0, 0, 0, 0}, /* 14 */
|
||||
{2, 0, 0, 0, 0, 0}, /* 16 */
|
||||
{4, 0, 0, 0, 0, 0}, /* 32 */
|
||||
{4, 0, 0, 0, 0, 0}, /* 16_8_8 */
|
||||
{4, 0, 0, 0, 0, 0}, /* 10_8_8 */
|
||||
{4, 0, 0, 0, 0, 0}, /* 2_10_10_10 */
|
||||
{4, 0, 0, 0, 0, 0}, /* 20 */
|
||||
};
|
||||
|
||||
unsigned int ImgBytesPerPixelTable_YUV[][9][6] = {
|
||||
{ /* PLANAR */
|
||||
{1, 1, 1, 0, 0, 0}, /* 8 */
|
||||
{2, 2, 2, 0, 0, 0}, /* 10 */
|
||||
{2, 2, 2, 0, 0, 0}, /* 12 */
|
||||
{2, 2, 2, 0, 0, 0}, /* 14 */
|
||||
{2, 2, 2, 0, 0, 0}, /* 16 */
|
||||
{4, 4, 4, 0, 0, 0}, /* 32 */
|
||||
{2, 1, 1, 0, 0, 0}, /* 16_8_8 */
|
||||
{2, 1, 1, 0, 0, 0}, /* 10_8_8 */
|
||||
{4, 0, 0, 0, 0, 0}, /* 2_10_10_10 */
|
||||
},
|
||||
{ /* SEMI_PLANAR */
|
||||
{1, 2, 0, 0, 0, 0}, /* 8 */
|
||||
{2, 4, 0, 0, 0, 0}, /* 10 */
|
||||
{2, 4, 0, 0, 0, 0}, /* 12 */
|
||||
{2, 4, 0, 0, 0, 0}, /* 14 */
|
||||
{2, 4, 0, 0, 0, 0}, /* 16 */
|
||||
{4, 8, 0, 0, 0, 0}, /* 32 */
|
||||
{2, 2, 0, 0, 0, 0}, /* 16_8_8 */
|
||||
{2, 2, 0, 0, 0, 0}, /* 10_8_8 */
|
||||
{4, 0, 0, 0, 0, 0}, /* 2_10_10_10 */
|
||||
}
|
||||
};
|
||||
|
||||
static NvMediaStatus
|
||||
GetBytesPerCompForPackedYUV(unsigned int surfBPCidx,
|
||||
unsigned int *bytespercomp
|
||||
)
|
||||
{
|
||||
switch(surfBPCidx) {
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_8:
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_LAYOUT_2_10_10_10:
|
||||
*bytespercomp = 1;
|
||||
break;
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_10:
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_12:
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_14:
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_16:
|
||||
*bytespercomp = 2;
|
||||
break;
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_20:
|
||||
*bytespercomp = 3;
|
||||
break;
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_32:
|
||||
*bytespercomp = 4;
|
||||
break;
|
||||
default:
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
return NVMEDIA_STATUS_OK;
|
||||
|
||||
}
|
||||
|
||||
static NvMediaStatus
|
||||
GetSurfParams(unsigned int surfaceType,
|
||||
float **xScale,
|
||||
float **yScale,
|
||||
unsigned int **bytePerPixel,
|
||||
uint32_t *numSurfacesVal)
|
||||
{
|
||||
NvMediaStatus status;
|
||||
unsigned int surfType, surfMemoryType, surfSubSamplingType, surfBPC, surfCompOrder;
|
||||
float *xScalePtr = NULL, *yScalePtr = NULL;
|
||||
unsigned int *bytePerPixelPtr = NULL;
|
||||
NVM_SURF_FMT_DEFINE_ATTR(srcAttr);
|
||||
uint32_t numSurfaces = 1;
|
||||
static unsigned int yuvpackedtbl[6] = {1, 0, 0, 0, 0, 0};
|
||||
unsigned int numcomps = 1;
|
||||
|
||||
status = NvMediaSurfaceFormatGetAttrs(surfaceType,
|
||||
srcAttr,
|
||||
NVM_SURF_FMT_ATTR_MAX);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s:NvMediaSurfaceFormatGetAttrs failed\n", __func__);
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
|
||||
surfType = srcAttr[NVM_SURF_ATTR_SURF_TYPE].value;
|
||||
surfMemoryType = srcAttr[NVM_SURF_ATTR_MEMORY].value;
|
||||
surfSubSamplingType = srcAttr[NVM_SURF_ATTR_SUB_SAMPLING_TYPE].value;
|
||||
surfBPC = srcAttr[NVM_SURF_ATTR_BITS_PER_COMPONENT].value;
|
||||
surfCompOrder = srcAttr[NVM_SURF_ATTR_COMPONENT_ORDER].value;
|
||||
|
||||
switch(surfType) {
|
||||
case NVM_SURF_ATTR_SURF_TYPE_YUV:
|
||||
if (surfSubSamplingType == NVM_SURF_ATTR_SUB_SAMPLING_TYPE_NONE &&
|
||||
surfMemoryType == NVM_SURF_ATTR_MEMORY_PACKED) {
|
||||
|
||||
xScalePtr = &ImgSurfParamsTable_Packed.widthFactor[0];
|
||||
yScalePtr = &ImgSurfParamsTable_Packed.heightFactor[0];
|
||||
numSurfaces = ImgSurfParamsTable_Packed.numSurfaces;
|
||||
|
||||
if (NVMEDIA_STATUS_OK != GetBytesPerCompForPackedYUV(surfBPC, &yuvpackedtbl[0])) {
|
||||
printf("Invalid Bits per component and Packed YUV combination\n");
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
|
||||
switch(surfCompOrder) {
|
||||
case NVM_SURF_ATTR_COMPONENT_ORDER_VUYX:
|
||||
case NVM_SURF_ATTR_COMPONENT_ORDER_XYUV:
|
||||
case NVM_SURF_ATTR_COMPONENT_ORDER_XUYV:
|
||||
numcomps = 4;
|
||||
break;
|
||||
case NVM_SURF_ATTR_COMPONENT_ORDER_UYVY:
|
||||
case NVM_SURF_ATTR_COMPONENT_ORDER_VYUY:
|
||||
case NVM_SURF_ATTR_COMPONENT_ORDER_YVYU:
|
||||
case NVM_SURF_ATTR_COMPONENT_ORDER_YUYV:
|
||||
numcomps = 2;
|
||||
break;
|
||||
case NVM_SURF_ATTR_COMPONENT_ORDER_LUMA:
|
||||
numcomps = 1;
|
||||
break;
|
||||
default:
|
||||
printf("Invalid component Order and Packed YUV combination\n");
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
yuvpackedtbl[0] = yuvpackedtbl[0] * numcomps;
|
||||
bytePerPixelPtr = &yuvpackedtbl[0];
|
||||
|
||||
} else {
|
||||
xScalePtr = &ImgSurfParamsTable_YUV[0][surfSubSamplingType - NVM_SURF_ATTR_SUB_SAMPLING_TYPE_420].widthFactor[0];
|
||||
yScalePtr = &ImgSurfParamsTable_YUV[0][surfSubSamplingType - NVM_SURF_ATTR_SUB_SAMPLING_TYPE_420].heightFactor[0];
|
||||
numSurfaces = ImgSurfParamsTable_YUV[0][surfSubSamplingType - NVM_SURF_ATTR_SUB_SAMPLING_TYPE_420].numSurfaces;
|
||||
bytePerPixelPtr = &ImgBytesPerPixelTable_YUV[0][surfBPC - NVM_SURF_ATTR_BITS_PER_COMPONENT_8][0];
|
||||
}
|
||||
|
||||
break;
|
||||
case NVM_SURF_ATTR_SURF_TYPE_RGBA:
|
||||
if (surfCompOrder == NVM_SURF_ATTR_COMPONENT_ORDER_ALPHA) {
|
||||
bytePerPixelPtr = &ImgBytesPerPixelTable_Alpha[surfBPC - NVM_SURF_ATTR_BITS_PER_COMPONENT_8][0];
|
||||
} else if (surfCompOrder == NVM_SURF_ATTR_COMPONENT_ORDER_RG) {
|
||||
if(surfBPC == NVM_SURF_ATTR_BITS_PER_COMPONENT_16) {
|
||||
bytePerPixelPtr = &ImgBytesPerPixelTable_RG16[0];
|
||||
} else {
|
||||
printf("Invalid RGorder & Bitspercomp combination.Only RG16 is supported\n");
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
} else { /* RGBA, ARGB, BGRA */
|
||||
if (surfBPC == NVM_SURF_ATTR_BITS_PER_COMPONENT_16) {
|
||||
bytePerPixelPtr = &ImgBytesPerPixelTable_RGBA16[0][0];
|
||||
} else if (surfBPC == NVM_SURF_ATTR_BITS_PER_COMPONENT_8) {
|
||||
bytePerPixelPtr = &ImgBytesPerPixelTable_RGBA[0][0];
|
||||
} else {
|
||||
printf("RGBA orders with 8 and 16bits only is supported \n");
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
}
|
||||
xScalePtr = &ImgSurfParamsTable_RGBA.widthFactor[0];
|
||||
yScalePtr = &ImgSurfParamsTable_RGBA.heightFactor[0];
|
||||
numSurfaces = ImgSurfParamsTable_RGBA.numSurfaces;
|
||||
break;
|
||||
case NVM_SURF_ATTR_SURF_TYPE_RAW:
|
||||
bytePerPixelPtr = &ImgBytesPerPixelTable_RAW[surfBPC - NVM_SURF_ATTR_BITS_PER_COMPONENT_8][0];
|
||||
xScalePtr = &ImgSurfParamsTable_RAW.widthFactor[0];
|
||||
yScalePtr = &ImgSurfParamsTable_RAW.heightFactor[0];
|
||||
numSurfaces = ImgSurfParamsTable_RAW.numSurfaces;
|
||||
break;
|
||||
default:
|
||||
printf("%s: Unsupported Pixel Format %d", __func__, surfType);
|
||||
return NVMEDIA_STATUS_ERROR;
|
||||
}
|
||||
|
||||
if (xScale) {
|
||||
*xScale = xScalePtr;
|
||||
}
|
||||
if (yScale) {
|
||||
*yScale = yScalePtr;
|
||||
}
|
||||
if (bytePerPixel) {
|
||||
*bytePerPixel = bytePerPixelPtr;
|
||||
}
|
||||
if (numSurfacesVal) {
|
||||
*numSurfacesVal = numSurfaces;
|
||||
}
|
||||
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
NvMediaStatus
|
||||
AllocateBufferToWriteImage(
|
||||
Blit2DTest *ctx,
|
||||
NvMediaImage *image,
|
||||
NvMediaBool uvOrderFlag,
|
||||
NvMediaBool appendFlag)
|
||||
{
|
||||
uint32_t imageSize = 0;
|
||||
unsigned int size[3] ={0};
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t i, k, newk = 0;
|
||||
unsigned int *bytePerPixelPtr = NULL;
|
||||
ctx->numSurfaces = 1;
|
||||
NvMediaImageSurfaceMap surfaceMap;
|
||||
NvMediaStatus status = NVMEDIA_STATUS_ERROR;
|
||||
uint32_t lineWidth, numRows, startOffset;
|
||||
|
||||
if(!image) {
|
||||
printf("%s: Bad parameter\n", __func__);
|
||||
return NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
status = NvMediaImageLock(image, NVMEDIA_IMAGE_ACCESS_WRITE, &surfaceMap);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImageLock() failed\n", __func__);
|
||||
return status;
|
||||
}
|
||||
NvMediaImageUnlock(image);
|
||||
|
||||
ctx->dstBuff = (uint8_t**) malloc(sizeof(uint8_t*)*MAXM_NUM_SURFACES);
|
||||
if(!ctx->dstBuff) {
|
||||
printf("%s: Out of memory\n", __func__);
|
||||
status = NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ctx->dstBuffPitches = (uint32_t*) calloc(1,sizeof(uint32_t) * MAXM_NUM_SURFACES);
|
||||
if(!ctx->dstBuffPitches) {
|
||||
printf("%s: Out of memory\n", __func__);
|
||||
status = NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ctx->heightSurface = surfaceMap.height;
|
||||
ctx->widthSurface = surfaceMap.width;
|
||||
|
||||
status = GetSurfParams(image->type,
|
||||
&ctx->xScalePtr,
|
||||
&ctx->yScalePtr,
|
||||
&bytePerPixelPtr,
|
||||
&ctx->numSurfaces);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: GetSurfParams() failed\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
|
||||
imageSize = 0;
|
||||
for(i = 0; i < ctx->numSurfaces; i++) {
|
||||
size[i] = (ctx->widthSurface * ctx->xScalePtr[i] * ctx->heightSurface * ctx->yScalePtr[i] * bytePerPixelPtr[i]);
|
||||
imageSize += size[i];
|
||||
ctx->dstBuffPitches[i] = (uint32_t)((float)ctx->widthSurface * ctx->xScalePtr[i]) * bytePerPixelPtr[i];
|
||||
}
|
||||
|
||||
// Embedded data size needs to be included for RAW surftype
|
||||
size[0] += image->embeddedDataTopSize;
|
||||
size[0] += image->embeddedDataBottomSize;
|
||||
imageSize += image->embeddedDataTopSize;
|
||||
imageSize += image->embeddedDataBottomSize;
|
||||
|
||||
buffer = (uint8_t *) calloc(1, imageSize);
|
||||
if(!buffer) {
|
||||
printf("%s: Out of memory\n", __func__);
|
||||
status = NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ctx->dstBuffer = buffer;
|
||||
memset(buffer, 0xFF, imageSize);
|
||||
for(i = 0; i < ctx->numSurfaces; i++) {
|
||||
ctx->dstBuff[i] = buffer;
|
||||
buffer = buffer + (uint32_t)(ctx->heightSurface * ctx->yScalePtr[i] * ctx->dstBuffPitches[i]);
|
||||
}
|
||||
|
||||
done:
|
||||
return status;
|
||||
}
|
||||
|
||||
NvMediaStatus
|
||||
WriteImageToAllocatedBuffer(
|
||||
Blit2DTest *ctx,
|
||||
NvMediaImage *image,
|
||||
NvMediaBool uvOrderFlag,
|
||||
NvMediaBool appendFlag,
|
||||
uint32_t bytesPerPixel)
|
||||
{
|
||||
NvMediaImageSurfaceMap surfaceMap;
|
||||
|
||||
NvMediaStatus status = NvMediaImageLock(image, NVMEDIA_IMAGE_ACCESS_WRITE, &surfaceMap);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImageLock() failed\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
status = NvMediaImageGetBits(image, NULL, (void **)ctx->dstBuff, ctx->dstBuffPitches);
|
||||
NvMediaImageUnlock(image);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaVideoSurfaceGetBits() failed \n", __func__);
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static NvMediaStatus
|
||||
ReadImageNew(
|
||||
char *fileName,
|
||||
uint32_t frameNum,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
NvMediaImage *image,
|
||||
NvMediaBool uvOrderFlag,
|
||||
uint32_t bytesPerPixel,
|
||||
uint32_t pixelAlignment)
|
||||
{
|
||||
uint8_t **pBuff = NULL;
|
||||
uint32_t *pBuffPitches = NULL;
|
||||
uint32_t imageSize = 0,surfaceSize = 0;
|
||||
uint8_t *buffer = NULL;
|
||||
uint8_t *pBuffer = NULL;
|
||||
uint32_t i, j, k, newk = 0;
|
||||
float *xScalePtr = NULL, *yScalePtr = NULL;
|
||||
unsigned int *bytePerPixelPtr = NULL;
|
||||
uint32_t numSurfaces = 1;
|
||||
unsigned int uHeightSurface, uWidthSurface;
|
||||
NvMediaImageSurfaceMap surfaceMap;
|
||||
NvMediaStatus status = NVMEDIA_STATUS_ERROR;
|
||||
FILE *file = NULL;
|
||||
unsigned int count, index;
|
||||
NVM_SURF_FMT_DEFINE_ATTR(srcAttr);
|
||||
unsigned int surfType, surfBPC;
|
||||
|
||||
if(!image || !fileName) {
|
||||
printf("%s: Bad parameter\n", __func__);
|
||||
return NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
status = NvMediaImageLock(image, NVMEDIA_IMAGE_ACCESS_WRITE, &surfaceMap);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImageLock() failed\n", __func__);
|
||||
return status;
|
||||
}
|
||||
NvMediaImageUnlock(image);
|
||||
|
||||
uHeightSurface = surfaceMap.height;
|
||||
uWidthSurface = surfaceMap.width;
|
||||
|
||||
if(width > uWidthSurface || height > uHeightSurface) {
|
||||
printf("%s: Bad parameter\n", __func__);
|
||||
return NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
pBuff = (uint8_t **) malloc(sizeof(uint8_t*)*MAXM_NUM_SURFACES);
|
||||
if(!pBuff) {
|
||||
printf("%s: Out of memory\n", __func__);
|
||||
status = NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
pBuffPitches = (uint32_t *)calloc(1,sizeof(uint32_t) * MAXM_NUM_SURFACES);
|
||||
if(!pBuffPitches) {
|
||||
printf("%s: Out of memory\n", __func__);
|
||||
status = NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = GetSurfParams(image->type,
|
||||
&xScalePtr,
|
||||
&yScalePtr,
|
||||
&bytePerPixelPtr,
|
||||
&numSurfaces);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: GetSurfParams() failed\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = NvMediaSurfaceFormatGetAttrs(image->type,
|
||||
srcAttr,
|
||||
NVM_SURF_FMT_ATTR_MAX);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s:NvMediaSurfaceFormatGetAttrs failed\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
surfType = srcAttr[NVM_SURF_ATTR_SURF_TYPE].value;
|
||||
surfBPC = srcAttr[NVM_SURF_ATTR_BITS_PER_COMPONENT].value;
|
||||
|
||||
surfaceSize = 0;
|
||||
imageSize = 0;
|
||||
for(i = 0; i < numSurfaces; i++) {
|
||||
surfaceSize += (uWidthSurface * xScalePtr[i] * uHeightSurface * yScalePtr[i] * bytePerPixelPtr[i]);
|
||||
imageSize += (width * xScalePtr[i] * height * yScalePtr[i] * bytePerPixelPtr[i]);
|
||||
pBuffPitches[i] = (uint32_t)((float)uWidthSurface * xScalePtr[i]) * bytePerPixelPtr[i];
|
||||
}
|
||||
|
||||
buffer = (uint8_t *)calloc(1, surfaceSize);
|
||||
if(!buffer) {
|
||||
printf("%s: Out of memory\n", __func__);
|
||||
status = NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
pBuffer = buffer;
|
||||
memset(buffer,0x10,surfaceSize);
|
||||
for(i = 0; i < numSurfaces; i++) {
|
||||
pBuff[i] = buffer;
|
||||
if (i) {
|
||||
memset(pBuff[i], 0x80, (uHeightSurface * yScalePtr[i] * pBuffPitches[i]));
|
||||
}
|
||||
buffer = buffer + (uint32_t)(uHeightSurface * yScalePtr[i] * pBuffPitches[i]);
|
||||
}
|
||||
|
||||
file = fopen(fileName, "rb");
|
||||
if(!file) {
|
||||
printf("%s: Error opening file: %s\n", __func__, fileName);
|
||||
status = NVMEDIA_STATUS_ERROR;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(frameNum > 0) {
|
||||
if(fseeko(file, frameNum * (off_t)imageSize, SEEK_SET)) {
|
||||
printf("ReadImage: Error seeking file: %s\n", fileName);
|
||||
status = NVMEDIA_STATUS_ERROR;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
if((surfType == NVM_SURF_ATTR_SURF_TYPE_RGBA ) && strstr(fileName, ".png")) {
|
||||
printf("ReadImage: Does not support png format\n");
|
||||
status = NVMEDIA_STATUS_ERROR;
|
||||
goto done;
|
||||
}
|
||||
for(k = 0; k < numSurfaces; k++) {
|
||||
for(j = 0; j < height*yScalePtr[k]; j++) {
|
||||
newk = (!uvOrderFlag && k ) ? (numSurfaces - k) : k;
|
||||
index = j * pBuffPitches[newk];
|
||||
count = width * xScalePtr[newk] * bytePerPixelPtr[newk];
|
||||
if (fread(pBuff[newk] + index, count, 1, file) != 1) {
|
||||
status = NVMEDIA_STATUS_ERROR;
|
||||
printf("ReadImage: Error reading file: %s\n", fileName);
|
||||
goto done;
|
||||
}
|
||||
if((surfType == NVM_SURF_ATTR_SURF_TYPE_YUV) && (pixelAlignment == LSB_ALIGNED)) {
|
||||
uint16_t *psrc = (uint16_t*)(pBuff[newk] + index);
|
||||
switch(surfBPC) {
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_10:
|
||||
for(i = 0; i < count/2; i++) {
|
||||
*(psrc + i) = (*(psrc + i)) << (16 - 10);
|
||||
}
|
||||
break;
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_12:
|
||||
for(i = 0; i < count/2; i++) {
|
||||
*(psrc + i) = (*(psrc + i)) << (16 - 12);
|
||||
}
|
||||
break;
|
||||
case NVM_SURF_ATTR_BITS_PER_COMPONENT_14:
|
||||
for(i = 0; i < count/2; i++) {
|
||||
*(psrc + i) = (*(psrc + i)) << (16 - 14);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
status = NvMediaImageLock(image, NVMEDIA_IMAGE_ACCESS_WRITE, &surfaceMap);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImageLock() failed\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
status = NvMediaImagePutBits(image, NULL, (void **)pBuff, pBuffPitches);
|
||||
NvMediaImageUnlock(image);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: Failed to put bits\n", __func__);
|
||||
}
|
||||
|
||||
done:
|
||||
if(pBuff) {
|
||||
free(pBuff);
|
||||
}
|
||||
|
||||
if (pBuffPitches) {
|
||||
free(pBuffPitches);
|
||||
}
|
||||
|
||||
if (pBuffer) {
|
||||
free(pBuffer);
|
||||
}
|
||||
|
||||
if(file) {
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
NvMediaStatus
|
||||
ReadImage(
|
||||
char *fileName,
|
||||
uint32_t frameNum,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
NvMediaImage *image,
|
||||
NvMediaBool uvOrderFlag,
|
||||
uint32_t bytesPerPixel,
|
||||
uint32_t pixelAlignment)
|
||||
{
|
||||
NvMediaStatus status;
|
||||
NVM_SURF_FMT_DEFINE_ATTR(srcAttr);
|
||||
|
||||
status = NvMediaSurfaceFormatGetAttrs(image->type,
|
||||
srcAttr,
|
||||
NVM_SURF_FMT_ATTR_MAX);
|
||||
if (status == NVMEDIA_STATUS_OK) {
|
||||
return ReadImageNew(
|
||||
fileName,
|
||||
frameNum,
|
||||
width,
|
||||
height,
|
||||
image,
|
||||
uvOrderFlag,
|
||||
bytesPerPixel,
|
||||
pixelAlignment);
|
||||
} else {
|
||||
printf("%s:NvMediaSurfaceFormatGetAttrs failed\n", __func__);
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
NvMediaStatus
|
||||
InitImage(
|
||||
NvMediaImage *image,
|
||||
uint32_t width,
|
||||
uint32_t height)
|
||||
{
|
||||
uint8_t **pBuff = NULL;
|
||||
uint32_t *pBuffPitches = NULL;
|
||||
uint32_t imageSize = 0,surfaceSize = 0;
|
||||
uint8_t *buffer = NULL;
|
||||
uint8_t *pBuffer = NULL;
|
||||
float *xScalePtr = NULL, *yScalePtr = NULL;
|
||||
unsigned int *bytePerPixelPtr = NULL;
|
||||
uint32_t numSurfaces = 1;
|
||||
uint32_t i;
|
||||
unsigned int uHeightSurface, uWidthSurface;
|
||||
NvMediaImageSurfaceMap surfaceMap;
|
||||
NvMediaStatus status = NVMEDIA_STATUS_ERROR;
|
||||
NVM_SURF_FMT_DEFINE_ATTR(srcAttr);
|
||||
|
||||
if(!image) {
|
||||
printf("%s: Bad parameter\n", __func__);
|
||||
return NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
status = NvMediaImageLock(image, NVMEDIA_IMAGE_ACCESS_WRITE, &surfaceMap);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImageLock failed\n", __func__);
|
||||
return status;
|
||||
}
|
||||
NvMediaImageUnlock(image);
|
||||
|
||||
|
||||
uHeightSurface = surfaceMap.height;
|
||||
uWidthSurface = surfaceMap.width;
|
||||
|
||||
if(width > uWidthSurface || height > uHeightSurface) {
|
||||
printf("%s: Bad parameter\n", __func__);
|
||||
return NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
pBuff = (uint8_t **) calloc(1,sizeof(uint8_t*)*MAXM_NUM_SURFACES);
|
||||
if(!pBuff) {
|
||||
printf("%s: out of memory\n", __func__);
|
||||
status = NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
pBuffPitches = (uint32_t *) calloc(1,sizeof(uint32_t) * MAXM_NUM_SURFACES);
|
||||
if(!pBuffPitches) {
|
||||
printf("%s: out of memory\n", __func__);
|
||||
status = NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = GetSurfParams(image->type,
|
||||
&xScalePtr,
|
||||
&yScalePtr,
|
||||
&bytePerPixelPtr,
|
||||
&numSurfaces);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: GetSurfParams failed\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = NvMediaSurfaceFormatGetAttrs(image->type,
|
||||
srcAttr,
|
||||
NVM_SURF_FMT_ATTR_MAX);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaSurfaceFormatGetAttrs failed\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
|
||||
surfaceSize = 0;
|
||||
imageSize = 0;
|
||||
for(i = 0; i < numSurfaces; i++) {
|
||||
surfaceSize += (uWidthSurface * xScalePtr[i] * uHeightSurface * yScalePtr[i] * bytePerPixelPtr[i]);
|
||||
imageSize += (width * xScalePtr[i] * height * yScalePtr[i] * bytePerPixelPtr[i]);
|
||||
pBuffPitches[i] = (uint32_t)((float)uWidthSurface * xScalePtr[i]) * bytePerPixelPtr[i];
|
||||
}
|
||||
|
||||
buffer = (uint8_t *)calloc(1, surfaceSize);
|
||||
if(!buffer) {
|
||||
printf("%s: out of memory\n", __func__);
|
||||
status = NVMEDIA_STATUS_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
pBuffer = buffer;
|
||||
memset(buffer,0x00,surfaceSize);
|
||||
for(i = 0; i < numSurfaces; i++) {
|
||||
pBuff[i] = buffer;
|
||||
buffer = buffer + (uint32_t)(uHeightSurface * yScalePtr[i] * pBuffPitches[i]);
|
||||
}
|
||||
|
||||
status = NvMediaImageLock(image, NVMEDIA_IMAGE_ACCESS_WRITE, &surfaceMap);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImageLock failed\n", __func__);
|
||||
goto done;
|
||||
}
|
||||
status = NvMediaImagePutBits(image, NULL, (void **)pBuff, pBuffPitches);
|
||||
NvMediaImageUnlock(image);
|
||||
if(status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMediaImagePutBits failed\n", __func__);
|
||||
}
|
||||
|
||||
done:
|
||||
if(pBuff) {
|
||||
free(pBuff);
|
||||
}
|
||||
|
||||
if (pBuffPitches) {
|
||||
free(pBuffPitches);
|
||||
}
|
||||
|
||||
if (pBuffer) {
|
||||
free(pBuffer);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _NVMEDIA_TEST_IMAGE_UTILS_H_
|
||||
#define _NVMEDIA_TEST_IMAGE_UTILS_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "misc_utils.h"
|
||||
#include "nvmedia_core.h"
|
||||
#include "nvmedia_surface.h"
|
||||
#include "nvmedia_image.h"
|
||||
#include "cmdline.h"
|
||||
|
||||
#if (NV_IS_SAFETY == 1)
|
||||
#include "nvmedia_image_internal.h"
|
||||
#endif
|
||||
|
||||
#define PACK_RGBA(R, G, B, A) (((uint32_t)(A) << 24) | ((uint32_t)(B) << 16) | \
|
||||
((uint32_t)(G) << 8) | (uint32_t)(R))
|
||||
#define DEFAULT_ALPHA 0x80
|
||||
|
||||
|
||||
|
||||
|
||||
// ReadImage
|
||||
//
|
||||
// ReadImage() Read image from file
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// filename
|
||||
// (in) Input file name
|
||||
//
|
||||
// frameNum
|
||||
// (in) Frame number to read. Use for stream input files.
|
||||
//
|
||||
// width
|
||||
// (in) Surface width
|
||||
//
|
||||
// height
|
||||
// (in) Surface height
|
||||
//
|
||||
// image
|
||||
// (out) Pointer to pre-allocated output surface
|
||||
//
|
||||
// uvOrderFlag
|
||||
// (in) Flag for UV order. If true - UV; If false - VU;
|
||||
//
|
||||
// bytesPerPixel
|
||||
// (in) Bytes per pixel. Nedded for RAW image types handling.
|
||||
// RAW8 - 1 byte per pixel
|
||||
// RAW10, RAW12, RAW14 - 2 bytes per pixel
|
||||
//
|
||||
// pixelAlignment
|
||||
// (in) Alignment of bits in pixel.
|
||||
// 0 - LSB Aligned
|
||||
// 1 - MSB Aligned
|
||||
|
||||
NvMediaStatus
|
||||
ReadImage(
|
||||
char *fileName,
|
||||
uint32_t frameNum,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
NvMediaImage *image,
|
||||
NvMediaBool uvOrderFlag,
|
||||
uint32_t bytesPerPixel,
|
||||
uint32_t pixelAlignment);
|
||||
|
||||
// InitImage
|
||||
//
|
||||
// InitImage() Init image data to zeros
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// image
|
||||
// (in) image to initialize
|
||||
//
|
||||
// width
|
||||
// (in) Surface width
|
||||
//
|
||||
// height
|
||||
// (in) Surface height
|
||||
|
||||
NvMediaStatus
|
||||
InitImage(
|
||||
NvMediaImage *image,
|
||||
uint32_t width,
|
||||
uint32_t height);
|
||||
|
||||
NvMediaStatus
|
||||
AllocateBufferToWriteImage(
|
||||
Blit2DTest *ctx,
|
||||
NvMediaImage *image,
|
||||
NvMediaBool uvOrderFlag,
|
||||
NvMediaBool appendFlag);
|
||||
|
||||
// WriteImageToBuffer
|
||||
//
|
||||
// WriteImageToBuffer() Save RGB or YUV image
|
||||
//
|
||||
NvMediaStatus
|
||||
WriteImageToAllocatedBuffer(
|
||||
Blit2DTest *ctx,
|
||||
NvMediaImage *image,
|
||||
NvMediaBool uvOrderFlag,
|
||||
NvMediaBool appendFlag,
|
||||
uint32_t bytesPerPixel);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NVMEDIA_TEST_IMAGE_UTILS_H_ */
|
||||
@@ -0,0 +1,154 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#ifdef NVMEDIA_ANDROID
|
||||
#define LOG_TAG "nvmedia_common"
|
||||
#define LOG_NDEBUG 1
|
||||
#include <utils/Log.h>
|
||||
#endif
|
||||
#ifdef NVMEDIA_QNX
|
||||
#include <sys/slog.h>
|
||||
#endif
|
||||
|
||||
#include "log_utils.h"
|
||||
|
||||
#ifdef NVMEDIA_QNX
|
||||
#define NV_SLOGCODE 0xAAAA
|
||||
#endif
|
||||
#define MAX_STATS_LEN 500
|
||||
|
||||
#define LOG_BUFFER_BYTES 1024
|
||||
|
||||
static enum LogLevel msg_level = LEVEL_ERR;
|
||||
static enum LogStyle msg_style = LOG_STYLE_NORMAL;
|
||||
static FILE *msg_file = NULL;
|
||||
|
||||
void SetLogLevel(enum LogLevel level)
|
||||
{
|
||||
if (level > LEVEL_DBG)
|
||||
return;
|
||||
|
||||
msg_level = level;
|
||||
}
|
||||
|
||||
void SetLogStyle(enum LogStyle style)
|
||||
{
|
||||
if (style > LOG_STYLE_FUNCTION_LINE)
|
||||
return;
|
||||
|
||||
msg_style = style;
|
||||
}
|
||||
|
||||
void SetLogFile(FILE *logFileHandle)
|
||||
{
|
||||
if(!logFileHandle)
|
||||
return;
|
||||
|
||||
msg_file = logFileHandle;
|
||||
}
|
||||
|
||||
void LogLevelMessage(enum LogLevel level, const char *functionName,
|
||||
int lineNumber, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char str[LOG_BUFFER_BYTES] = {'\0',};
|
||||
FILE *logFile = msg_file ? msg_file : stdout;
|
||||
|
||||
if (level > msg_level)
|
||||
return;
|
||||
|
||||
#ifndef NVMEDIA_ANDROID
|
||||
/** In the case of Android ADB log, if LOG_TAG is defined,
|
||||
* before 'Log.h' is included in source file,
|
||||
* LOG_TAG is automatically concatenated at the beginning of log message,
|
||||
* so, we don't copy 'nvmedia: ' into 'str'.
|
||||
*/
|
||||
strcpy(str, "nvmedia: ");
|
||||
|
||||
/** As LOG_TAG is concatednated, log level is also automatically concatenated,
|
||||
* by calling different ADB log function such as ALOGE(for eror log message),
|
||||
* ALOGW(for warning log message).
|
||||
*/
|
||||
switch (level) {
|
||||
case LEVEL_ERR:
|
||||
strcat(str, "ERROR: ");
|
||||
break;
|
||||
case LEVEL_WARN:
|
||||
strcat(str, "WARNING: ");
|
||||
break;
|
||||
case LEVEL_INFO:
|
||||
case LEVEL_DBG:
|
||||
// Empty
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
va_start(ap, format);
|
||||
vsnprintf(str + strlen(str), sizeof(str) - strlen(str), format, ap);
|
||||
|
||||
if(msg_style == LOG_STYLE_NORMAL) {
|
||||
// Add trailing new line char
|
||||
if(strlen(str) && str[strlen(str) - 1] != '\n')
|
||||
strcat(str, "\n");
|
||||
|
||||
} else if(msg_style == LOG_STYLE_FUNCTION_LINE) {
|
||||
// Remove trailing new line char
|
||||
if(strlen(str) && str[strlen(str) - 1] == '\n')
|
||||
str[strlen(str) - 1] = 0;
|
||||
|
||||
// Add function and line info
|
||||
snprintf(str + + strlen(str), sizeof(str) - strlen(str), " at %s():%d\n", functionName, lineNumber);
|
||||
}
|
||||
|
||||
#ifdef NVMEDIA_ANDROID
|
||||
switch (msg_level) {
|
||||
case LEVEL_ERR:
|
||||
ALOGE("%s", str);
|
||||
break;
|
||||
case LEVEL_WARN:
|
||||
ALOGW("%s", str);
|
||||
break;
|
||||
case LEVEL_INFO:
|
||||
ALOGI("%s", str);
|
||||
break;
|
||||
case LEVEL_DBG:
|
||||
ALOGD("%s", str);
|
||||
break;
|
||||
}
|
||||
#else
|
||||
fprintf(logFile, "%s", str);
|
||||
#endif
|
||||
#ifdef NVMEDIA_QNX
|
||||
/* send to system logger */
|
||||
slogf(_SLOG_SETCODE(NV_SLOGCODE, 0), _SLOG_ERROR, str);
|
||||
#endif
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _NVMEDIA_TEST_LOG_UTILS_H_
|
||||
#define _NVMEDIA_TEST_LOG_UTILS_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
enum LogLevel {
|
||||
LEVEL_ERR = 0,
|
||||
LEVEL_WARN = 1,
|
||||
LEVEL_INFO = 2,
|
||||
LEVEL_DBG = 3,
|
||||
};
|
||||
|
||||
enum LogStyle {
|
||||
LOG_STYLE_NORMAL = 0,
|
||||
LOG_STYLE_FUNCTION_LINE
|
||||
};
|
||||
|
||||
#define LINE_INFO __FUNCTION__, __LINE__
|
||||
#define LOG_DBG(...) LogLevelMessage(LEVEL_DBG, LINE_INFO, __VA_ARGS__)
|
||||
#define LOG_INFO(...) LogLevelMessage(LEVEL_INFO, LINE_INFO, __VA_ARGS__)
|
||||
#define LOG_WARN(...) LogLevelMessage(LEVEL_WARN, LINE_INFO, __VA_ARGS__)
|
||||
|
||||
// SetLogLevel
|
||||
//
|
||||
// SetLogLevel() Set logging level
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// level
|
||||
// (in) Logging level
|
||||
|
||||
void
|
||||
SetLogLevel(
|
||||
enum LogLevel level);
|
||||
|
||||
// SetLogStyle
|
||||
//
|
||||
// SetLogStyle() Set logging print slyle
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// level
|
||||
// (in) Logging style
|
||||
|
||||
void
|
||||
SetLogStyle(
|
||||
enum LogStyle style);
|
||||
|
||||
// SetLogFile
|
||||
//
|
||||
// SetLogFile() Set logging file handle
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// level
|
||||
// (in) Logging file handle
|
||||
|
||||
void
|
||||
SetLogFile(
|
||||
FILE *logFileHandle);
|
||||
|
||||
// LogLevelMessage
|
||||
//
|
||||
// LogLevelMessage() Print message if logging level is higher than message level
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// LogLevel
|
||||
// (in) Message level
|
||||
//
|
||||
// format
|
||||
// (in) Message format
|
||||
//
|
||||
// ...
|
||||
// (in) Parameters list
|
||||
|
||||
void
|
||||
LogLevelMessage(
|
||||
enum LogLevel level,
|
||||
const char *functionName,
|
||||
int lineNumber,
|
||||
const char *format,
|
||||
...);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NVMEDIA_TEST_LOG_UTILS_H_ */
|
||||
@@ -0,0 +1,67 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#if defined (__QNX__)
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include "misc_utils.h"
|
||||
|
||||
uint32_t
|
||||
u32(const uint8_t* ptr)
|
||||
{
|
||||
return ptr[0] | (ptr[1]<<8) | (ptr[2]<<16) | (ptr[3]<<24);
|
||||
}
|
||||
|
||||
NvMediaStatus
|
||||
GetTimeMicroSec(
|
||||
uint64_t *uTime)
|
||||
{
|
||||
struct timespec t;
|
||||
#if !(defined(CLOCK_MONOTONIC) && defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0 && _POSIX_TIMERS > 0)
|
||||
struct timeval tv;
|
||||
#endif
|
||||
|
||||
if(!uTime)
|
||||
return NVMEDIA_STATUS_BAD_PARAMETER;
|
||||
|
||||
#if !(defined(CLOCK_MONOTONIC) && defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0 && _POSIX_TIMERS > 0)
|
||||
gettimeofday(&tv, NULL);
|
||||
t.tv_sec = tv.tv_sec;
|
||||
t.tv_nsec = tv.tv_usec*1000L;
|
||||
#else
|
||||
clock_gettime(CLOCK_MONOTONIC, &t);
|
||||
#endif
|
||||
|
||||
*uTime = (uint64_t)t.tv_sec * 1000000LL + (uint64_t)t.tv_nsec / 1000LL;
|
||||
return NVMEDIA_STATUS_OK;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _NVMEDIA_TEST_MISC_UTILS_H_
|
||||
#define _NVMEDIA_TEST_MISC_UTILS_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "nvmedia_core.h"
|
||||
#include "nvmedia_common.h"
|
||||
|
||||
#ifndef __INTEGRITY
|
||||
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
LSB_ALIGNED,
|
||||
MSB_ALIGNED
|
||||
} PixelAlignment;
|
||||
|
||||
|
||||
// u32
|
||||
//
|
||||
// u32() Reads 4 bytes from buffer and returns the read value
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// ptr
|
||||
// (in) Input buffer
|
||||
|
||||
uint32_t u32(const uint8_t* ptr);
|
||||
|
||||
// GetTimeMicroSec
|
||||
//
|
||||
// GetTimeMicroSec() Returns current time in microseconds
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// uTime
|
||||
// (out) Pointer to current time in microseconds
|
||||
|
||||
NvMediaStatus
|
||||
GetTimeMicroSec(
|
||||
uint64_t *uTime);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NVMEDIA_TEST_MISC_UTILS_H_ */
|
||||
157
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/nvsci_setup.cpp
Normal file
157
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/nvsci_setup.cpp
Normal file
@@ -0,0 +1,157 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "nvmedia_utils/cmdline.h"
|
||||
#include <cuda.h>
|
||||
#include <cuda_runtime.h>
|
||||
#include "helper_cuda.h"
|
||||
#include "nvsci_setup.h"
|
||||
#include "nvmedia_2d_nvscisync.h"
|
||||
|
||||
#define checkNvSciErrors(call) \
|
||||
do { \
|
||||
NvSciError _status = call; \
|
||||
if (NvSciError_Success != _status) { \
|
||||
printf( \
|
||||
"NVSCI call in file '%s' in line %i returned" \
|
||||
" %d, expected %d\n", \
|
||||
__FILE__, __LINE__, _status, NvSciError_Success); \
|
||||
fflush(stdout); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
void setupNvMediaSignalerNvSciSync(Blit2DTest *ctx, NvSciSyncObj &syncObj,
|
||||
int cudaDeviceId) {
|
||||
NvSciSyncModule sciSyncModule;
|
||||
checkNvSciErrors(NvSciSyncModuleOpen(&sciSyncModule));
|
||||
NvSciSyncAttrList signalerAttrList, waiterAttrList;
|
||||
NvSciSyncAttrList syncUnreconciledList[2];
|
||||
NvSciSyncAttrList syncReconciledList, syncConflictList;
|
||||
|
||||
checkNvSciErrors(NvSciSyncAttrListCreate(sciSyncModule, &signalerAttrList));
|
||||
checkNvSciErrors(NvSciSyncAttrListCreate(sciSyncModule, &waiterAttrList));
|
||||
|
||||
NvMediaStatus status = NvMedia2DFillNvSciSyncAttrList(
|
||||
ctx->i2d, signalerAttrList, NVMEDIA_SIGNALER);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMedia2DFillNvSciSyncAttrList failed\n", __func__);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
checkCudaErrors(cudaSetDevice(cudaDeviceId));
|
||||
checkCudaErrors(cudaDeviceGetNvSciSyncAttributes(waiterAttrList, cudaDeviceId,
|
||||
cudaNvSciSyncAttrWait));
|
||||
|
||||
syncUnreconciledList[0] = signalerAttrList;
|
||||
syncUnreconciledList[1] = waiterAttrList;
|
||||
checkNvSciErrors(NvSciSyncAttrListReconcile(
|
||||
syncUnreconciledList, 2, &syncReconciledList, &syncConflictList));
|
||||
checkNvSciErrors(NvSciSyncObjAlloc(syncReconciledList, &syncObj));
|
||||
|
||||
NvSciSyncAttrListFree(signalerAttrList);
|
||||
NvSciSyncAttrListFree(waiterAttrList);
|
||||
if (syncConflictList != nullptr) {
|
||||
NvSciSyncAttrListFree(syncConflictList);
|
||||
}
|
||||
}
|
||||
|
||||
void setupCudaSignalerNvSciSync(Blit2DTest *ctx, NvSciSyncObj &syncObj,
|
||||
int cudaDeviceId) {
|
||||
NvSciSyncModule sciSyncModule;
|
||||
checkNvSciErrors(NvSciSyncModuleOpen(&sciSyncModule));
|
||||
NvSciSyncAttrList signalerAttrList, waiterAttrList;
|
||||
NvSciSyncAttrList syncUnreconciledList[2];
|
||||
NvSciSyncAttrList syncReconciledList, syncConflictList;
|
||||
|
||||
checkNvSciErrors(NvSciSyncAttrListCreate(sciSyncModule, &signalerAttrList));
|
||||
checkNvSciErrors(NvSciSyncAttrListCreate(sciSyncModule, &waiterAttrList));
|
||||
|
||||
NvMediaStatus status =
|
||||
NvMedia2DFillNvSciSyncAttrList(ctx->i2d, waiterAttrList, NVMEDIA_WAITER);
|
||||
if (status != NVMEDIA_STATUS_OK) {
|
||||
printf("%s: NvMedia2DFillNvSciSyncAttrList failed\n", __func__);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
checkCudaErrors(cudaSetDevice(cudaDeviceId));
|
||||
checkCudaErrors(cudaDeviceGetNvSciSyncAttributes(
|
||||
signalerAttrList, cudaDeviceId, cudaNvSciSyncAttrSignal));
|
||||
|
||||
syncUnreconciledList[0] = signalerAttrList;
|
||||
syncUnreconciledList[1] = waiterAttrList;
|
||||
checkNvSciErrors(NvSciSyncAttrListReconcile(
|
||||
syncUnreconciledList, 2, &syncReconciledList, &syncConflictList));
|
||||
checkNvSciErrors(NvSciSyncObjAlloc(syncReconciledList, &syncObj));
|
||||
|
||||
NvSciSyncAttrListFree(signalerAttrList);
|
||||
NvSciSyncAttrListFree(waiterAttrList);
|
||||
if (syncConflictList != nullptr) {
|
||||
NvSciSyncAttrListFree(syncConflictList);
|
||||
}
|
||||
}
|
||||
|
||||
void setupNvSciBuf(NvSciBufObj &bufobj, NvSciBufAttrList &nvmediaAttrlist,
|
||||
int cudaDeviceId) {
|
||||
CUuuid devUUID;
|
||||
NvSciBufAttrList conflictlist;
|
||||
NvSciBufAttrList bufUnreconciledAttrlist[1];
|
||||
|
||||
CUresult res = cuDeviceGetUuid(&devUUID, cudaDeviceId);
|
||||
if (res != CUDA_SUCCESS) {
|
||||
fprintf(stderr, "Driver API error = %04d \n", res);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
NvSciBufAttrKeyValuePair attr_gpuid[] = {NvSciBufGeneralAttrKey_GpuId,
|
||||
&devUUID, sizeof(devUUID)};
|
||||
|
||||
// set CUDA GPU ID to attribute list
|
||||
checkNvSciErrors(NvSciBufAttrListSetAttrs(
|
||||
nvmediaAttrlist, attr_gpuid,
|
||||
sizeof(attr_gpuid) / sizeof(NvSciBufAttrKeyValuePair)));
|
||||
|
||||
bufUnreconciledAttrlist[0] = nvmediaAttrlist;
|
||||
|
||||
checkNvSciErrors(NvSciBufAttrListReconcileAndObjAlloc(
|
||||
bufUnreconciledAttrlist, 1, &bufobj, &conflictlist));
|
||||
if (conflictlist != NULL) {
|
||||
NvSciBufAttrListFree(conflictlist);
|
||||
}
|
||||
}
|
||||
|
||||
void cleanupNvSciBuf(NvSciBufObj &Bufobj) {
|
||||
if (Bufobj != NULL) {
|
||||
NvSciBufObjFree(Bufobj);
|
||||
}
|
||||
}
|
||||
|
||||
void cleanupNvSciSync(NvSciSyncObj &syncObj) {
|
||||
if (NvSciSyncObjFree != NULL) {
|
||||
NvSciSyncObjFree(syncObj);
|
||||
}
|
||||
}
|
||||
42
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/nvsci_setup.h
Normal file
42
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/nvsci_setup.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __NVSCI_SETUP_H__
|
||||
#define __NVSCI_SETUP_H__
|
||||
#include "nvmedia_utils/cmdline.h"
|
||||
#include <nvscibuf.h>
|
||||
#include <nvscisync.h>
|
||||
|
||||
void setupNvMediaSignalerNvSciSync(Blit2DTest *ctx, NvSciSyncObj &syncObj,
|
||||
int cudaDeviceId);
|
||||
void setupCudaSignalerNvSciSync(Blit2DTest *ctx, NvSciSyncObj &syncObj,
|
||||
int cudaDeviceId);
|
||||
void setupNvSciBuf(NvSciBufObj &bufobj, NvSciBufAttrList &nvmediaAttrlist,
|
||||
int cudaDeviceId);
|
||||
void cleanupNvSciBuf(NvSciBufObj &Bufobj);
|
||||
void cleanupNvSciSync(NvSciSyncObj &syncObj);
|
||||
#endif
|
||||
198
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/sample.cfg
Normal file
198
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/sample.cfg
Normal file
@@ -0,0 +1,198 @@
|
||||
###################################################################################################
|
||||
#
|
||||
# Copyright (c) 2022, NVIDIA CORPORATION. All Rights Reserved.
|
||||
#
|
||||
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
||||
# and proprietary rights in and to this software, related documentation
|
||||
# and any modifications thereto. Any use, reproduction, disclosure or
|
||||
# distribution of this software and related documentation without an express
|
||||
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
||||
#
|
||||
# 2D configuration file for nvimg_2d application.
|
||||
#
|
||||
# Plese see nvmedia_2d.h for detailed information about parameters and datatypes
|
||||
#
|
||||
###################################################################################################
|
||||
|
||||
|
||||
###################################################################################################
|
||||
# Top level application parameters
|
||||
#
|
||||
# inputFile name limited to 1024 chars
|
||||
inputfile = "teapot.rgba"
|
||||
|
||||
|
||||
# The following bit-masks can be ORed:
|
||||
# 1 => If the user wants to enable Filtering mode
|
||||
# 2 => Reserved for future use
|
||||
# 4 => If the user wants to enable Transformation mode
|
||||
# 8 => If the user wants to enable color space conversion standard
|
||||
validOperations = 0
|
||||
|
||||
# Transformation Mode for Blit2D
|
||||
# 0 => IDENTITY
|
||||
# 1 => ROTATE_90
|
||||
# 2 => ROTATE_180
|
||||
# 3 => ROTATE_270
|
||||
# 4 => FLIP_HORIZONTAL
|
||||
# 5 => INV_TRANSPOSE
|
||||
# 6 => FLIP_VERTICAL
|
||||
# 7 => TRANSPOSE
|
||||
transformMode = 0
|
||||
|
||||
# Filtering mode for Blit2D
|
||||
# 1 => FILTER_OFF
|
||||
# 2 => FILTER_LOW
|
||||
# 3 => FILTER_MEDIUM
|
||||
# 4 => FILTER_HIGH
|
||||
filterMode = 1
|
||||
|
||||
# color space conversion standard
|
||||
# 0 => ITU BT.601
|
||||
# 1 => ITU BT.709
|
||||
# 2 => SMTE 240M
|
||||
# 3 => BT.601 Extended Range
|
||||
colorStd = 0
|
||||
|
||||
####################### source image properties##########################
|
||||
srcWidth = 1024
|
||||
srcHeight = 1024
|
||||
# 1 => Uncached (mapped) access type flag
|
||||
# 2 => Cached (mapped) access type flag
|
||||
# 3 => Unmapped access type flag
|
||||
srcCPUAccess = 3
|
||||
# Allocation type
|
||||
# 0 => none
|
||||
# 1 => isochronous
|
||||
srcAllocType = 1
|
||||
# Surface scan type
|
||||
# Only progressive scan is supported
|
||||
# 1 => Progressive
|
||||
srcScanType = 1
|
||||
# Color Standard type
|
||||
# 1 => sRGB
|
||||
# 2 => YCbCr Rec.601 (Studio Range)
|
||||
# 3 => YCbCr Rec.601 (Extended Range)
|
||||
# 4 => YCbCr Rec.709 (Studio Range)
|
||||
# 5 => YCbCr Rec.709 (Extended Range)
|
||||
# 11 => Sensor RGBA
|
||||
srcColorStd = 1
|
||||
|
||||
# 1 => YUV
|
||||
# 2 => RGBA
|
||||
# 3 => RAW
|
||||
srcSurfType = 2
|
||||
# 1 => Block Linear
|
||||
# 2 => Pitch Linear
|
||||
srcLayout = 2
|
||||
# 1 => uint
|
||||
# 2 => int
|
||||
srcDataType = 1
|
||||
# 1 => planar
|
||||
# 2 => Semi Planar
|
||||
# 3 => Packed
|
||||
srcMemory = 3
|
||||
# Sub-Sampling type of the input surface
|
||||
# 1 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_420
|
||||
# 2 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_422
|
||||
# 3 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_444
|
||||
# 4 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_422R
|
||||
# 0 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_NONE
|
||||
srcSubSamplingType = 0
|
||||
# Bits per component of the input surface
|
||||
# 1 => NVM_SURF_ATTR_BITS_PER_COMPONENT_8
|
||||
# 2 => NVM_SURF_ATTR_BITS_PER_COMPONENT_10
|
||||
# 3 => NVM_SURF_ATTR_BITS_PER_COMPONENT_12
|
||||
# 5 => NVM_SURF_ATTR_BITS_PER_COMPONENT_16
|
||||
srcBitsPerComponent = 1
|
||||
# 1 => NVM_SURF_ATTR_COMPONENT_ORDER_LUMA
|
||||
# 2 => NVM_SURF_ATTR_COMPONENT_ORDER_YUV
|
||||
# 3 => NVM_SURF_ATTR_COMPONENT_ORDER_YVU
|
||||
# 4 => NVM_SURF_ATTR_COMPONENT_ORDER_YUYV
|
||||
# 5 => NVM_SURF_ATTR_COMPONENT_ORDER_YVYU
|
||||
# 6 => NVM_SURF_ATTR_COMPONENT_ORDER_VYUY
|
||||
# 10 => NVM_SURF_ATTR_COMPONENT_ORDER_VUYX
|
||||
# 18 => NVM_SURF_ATTR_COMPONENT_ORDER_RGBA
|
||||
# 20 => NVM_SURF_ATTR_COMPONENT_ORDER_BGRA
|
||||
srcComponentOrder = 18
|
||||
|
||||
# srcRect Structure containing co-ordinates of the rectangle in the source image.
|
||||
# Left X co-ordinate.
|
||||
srcRectx0 = 0
|
||||
# Top Y co-ordinate.
|
||||
srcRecty0 = 0
|
||||
# Right X co-ordinate.
|
||||
srcRectx1 = 1024
|
||||
# Bottom Y co-ordinate.
|
||||
srcRecty1 = 1024
|
||||
|
||||
####################### output image properties##########################
|
||||
dstWidth = 1024
|
||||
dstHeight = 1024
|
||||
# 1 => Uncached (mapped) access type flag
|
||||
# 2 => Cached (mapped) access type flag
|
||||
# 3 => Unmapped access type flag
|
||||
dstCPUAccess = 3
|
||||
# Allocation type
|
||||
# 0 => none
|
||||
# 1 => isochronous
|
||||
dstAllocType = 1
|
||||
# Surface scan type
|
||||
# Only progressive scan is supported
|
||||
# 1 => Progressive
|
||||
dstScanType = 1
|
||||
# Color Standard type
|
||||
# 1 => sRGB
|
||||
# 2 => YCbCr Rec.601 (Studio Range)
|
||||
# 3 => YCbCr Rec.601 (Extended Range)
|
||||
# 4 => YCbCr Rec.709 (Studio Range)
|
||||
# 5 => YCbCr Rec.709 (Extended Range)
|
||||
# 11 => Sensor RGBA
|
||||
dstColorStd = 2
|
||||
|
||||
# 1 => YUV
|
||||
# 2 => RGBA
|
||||
# 3 => RAW
|
||||
dstSurfType = 1
|
||||
# 1 => Block Linear
|
||||
# 2 => Pitch Linear
|
||||
dstLayout = 1
|
||||
# 1 => uint
|
||||
# 2 => int
|
||||
dstDataType = 1
|
||||
# 1 => planar
|
||||
# 2 => Semi Planar
|
||||
# 3 => Packed
|
||||
dstMemory = 1
|
||||
# Sub-Sampling type of the output surface
|
||||
# 1 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_420
|
||||
# 2 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_422
|
||||
# 3 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_444
|
||||
# 4 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_422R
|
||||
# 0 => NVM_SURF_ATTR_SUB_SAMPLING_TYPE_NONE
|
||||
dstSubSamplingType = 1
|
||||
# Bits per component of the output surface
|
||||
# 1 => NVM_SURF_ATTR_BITS_PER_COMPONENT_8
|
||||
# 2 => NVM_SURF_ATTR_BITS_PER_COMPONENT_10
|
||||
# 3 => NVM_SURF_ATTR_BITS_PER_COMPONENT_12
|
||||
# 5 => NVM_SURF_ATTR_BITS_PER_COMPONENT_16
|
||||
dstBitsPerComponent = 1
|
||||
# 1 => NVM_SURF_ATTR_COMPONENT_ORDER_LUMA
|
||||
# 2 => NVM_SURF_ATTR_COMPONENT_ORDER_YUV
|
||||
# 3 => NVM_SURF_ATTR_COMPONENT_ORDER_YVU
|
||||
# 4 => NVM_SURF_ATTR_COMPONENT_ORDER_YUYV
|
||||
# 5 => NVM_SURF_ATTR_COMPONENT_ORDER_YVYU
|
||||
# 6 => NVM_SURF_ATTR_COMPONENT_ORDER_VYUY
|
||||
# 10 => NVM_SURF_ATTR_COMPONENT_ORDER_VUYX
|
||||
# 18 => NVM_SURF_ATTR_COMPONENT_ORDER_RGBA
|
||||
# 20 => NVM_SURF_ATTR_COMPONENT_ORDER_BGRA
|
||||
dstComponentOrder = 2
|
||||
# dstRect Structure containing co-ordinates of the rectangle in the destination image.
|
||||
# Left X co-ordinate.
|
||||
dstRectx0 = 0
|
||||
# Top Y co-ordinate.
|
||||
dstRecty0 = 0
|
||||
# Right X co-ordinate.
|
||||
dstRectx1 = 1024
|
||||
# Bottom Y co-ordinate.
|
||||
dstRecty1 = 1024
|
||||
BIN
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/teapot.rgba
Normal file
BIN
Samples/4_CUDA_Libraries/cudaNvSciNvMedia/teapot.rgba
Normal file
Binary file not shown.
Reference in New Issue
Block a user