From 4bf866bca80657708a5119e749d2954bf020a77c Mon Sep 17 00:00:00 2001 From: svcmobrel-release Date: Fri, 27 Sep 2024 12:48:57 -0700 Subject: [PATCH] Updating prebuilts and/or headers f033de710a45790f16c7a2c1b693a1950187d084 - opencv-sample-apps/README 78f8540a5b70d8f6f33af45dce451967e058c457 - opencv-sample-apps/opencv_camera/Makefile db64c69a108016f4caa0562a86a9316933453ae6 - opencv-sample-apps/opencv_camera/opencv_gst_camera.cpp b04f70bbeeeb21aaedc10c2c3560b643bc005ea9 - opencv-sample-apps/opencv_encoder/Makefile afd48b88d80c0e8dd65329a0a0192ef0a3c83e7f - opencv-sample-apps/opencv_encoder/opencv_gst_encoder.cpp c15cb929e1a9a8fb03830c5ece6b68ea773ce687 - opencv-sample-apps/opencv_decoder/Makefile ebb52673c89af5c951ca7e62d7fa49f1700b18a6 - opencv-sample-apps/opencv_decoder/opencv_gst_decoder.cpp Change-Id: Ic539645554b25709ffb8960ad5202d774112d534 --- commitFile.txt | 9 + opencv-sample-apps/README | 154 ++++++++++++++ opencv-sample-apps/Rules.mk | 93 +++++++++ opencv-sample-apps/opencv_camera/Makefile | 51 +++++ .../opencv_camera/opencv_gst_camera.cpp | 144 +++++++++++++ opencv-sample-apps/opencv_decoder/Makefile | 51 +++++ .../opencv_decoder/opencv_gst_decoder.cpp | 197 ++++++++++++++++++ opencv-sample-apps/opencv_encoder/Makefile | 51 +++++ .../opencv_encoder/opencv_gst_encoder.cpp | 175 ++++++++++++++++ push_info.txt | 1 + 10 files changed, 926 insertions(+) create mode 100644 commitFile.txt create mode 100644 opencv-sample-apps/README create mode 100644 opencv-sample-apps/Rules.mk create mode 100644 opencv-sample-apps/opencv_camera/Makefile create mode 100644 opencv-sample-apps/opencv_camera/opencv_gst_camera.cpp create mode 100644 opencv-sample-apps/opencv_decoder/Makefile create mode 100644 opencv-sample-apps/opencv_decoder/opencv_gst_decoder.cpp create mode 100644 opencv-sample-apps/opencv_encoder/Makefile create mode 100644 opencv-sample-apps/opencv_encoder/opencv_gst_encoder.cpp create mode 100644 push_info.txt diff --git a/commitFile.txt b/commitFile.txt new file mode 100644 index 0000000..75d9b1d --- /dev/null +++ b/commitFile.txt @@ -0,0 +1,9 @@ +Updating prebuilts and/or headers + +f033de710a45790f16c7a2c1b693a1950187d084 - opencv-sample-apps/README +78f8540a5b70d8f6f33af45dce451967e058c457 - opencv-sample-apps/opencv_camera/Makefile +db64c69a108016f4caa0562a86a9316933453ae6 - opencv-sample-apps/opencv_camera/opencv_gst_camera.cpp +b04f70bbeeeb21aaedc10c2c3560b643bc005ea9 - opencv-sample-apps/opencv_encoder/Makefile +afd48b88d80c0e8dd65329a0a0192ef0a3c83e7f - opencv-sample-apps/opencv_encoder/opencv_gst_encoder.cpp +c15cb929e1a9a8fb03830c5ece6b68ea773ce687 - opencv-sample-apps/opencv_decoder/Makefile +ebb52673c89af5c951ca7e62d7fa49f1700b18a6 - opencv-sample-apps/opencv_decoder/opencv_gst_decoder.cpp diff --git a/opencv-sample-apps/README b/opencv-sample-apps/README new file mode 100644 index 0000000..8bac9a9 --- /dev/null +++ b/opencv-sample-apps/README @@ -0,0 +1,154 @@ +############################################################################### +# +# Copyright (c) 2019, 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. +# +############################################################################### + +These samples demonstrate how to integrate NVIDIA accelerated GStreamer +plugins with the custom OpenCV software library to acquire frames for +computation. + +------------------------------------------------------------------------------- +Sample-wise contents: + +- opencv_camera: + opencv_gst_camera.cpp- File for GStreamer nvarguscamerasrc plugin use case + to use CSI camera for capture. +- opencv_decoder: + opencv_gst_decoder.cpp- File for GStreamer nvv4l2decoder plugin use case + to decode an H264 mp4 file. +- opencv_encoder: + opencv_gst_encoder.cpp- The file opens a CSI nvarguscamerasrc camera pipeline + for capture and encoding to an H264 mp4 file. + +------------------------------------------------------------------------------- +Prerequisites: + +The development environment must include GStreamer libraries and OpenCV 3.3.1 +installed through JetPack. + +- GStreamer + Installation command: + + sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base \ + gstreamer1.0-libav gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \ + gstreamer1.0-plugins-ugly gstreamer1.0-tools gstreamer1.0-alsa + +- OpenCV 3.3.1 + JetPack builds OpenCV with GStreamer enabled. To verify GStreamer support, + run on python shell: + + >>> import cv2 + >>> print (cv2.getBuildInformation()) + + GStreamer flags should be enabled in the output. + + >>> + General configuration for OpenCV 3.3.1 ================================ + Version control: 3.3.1-2-g31ccdfe11 + + Platform: + Timestamp: 2019-02-06T09:45:58Z + Host: Linux 4.9.140-tegra aarch64 + CMake: 2.8.12.2 + CMake generator: Unix Makefiles + CMake build tool: /usr/bin/make + Configuration: Release + ... + ... + ... + + Video I/O: + DC1394 1.x: NO + DC1394 2.x: NO + FFMPEG: YES + avcodec: YES (ver 57.107.100) + avformat: YES (ver 57.83.100) + avutil: YES (ver 55.78.100) + swscale: YES (ver 4.8.100) + avresample: NO + GStreamer: + base: YES (ver 1.14.1) + video: YES (ver 1.14.1) + app: YES (ver 1.14.1) + riff: YES (ver 1.14.1) + pbutils: YES (ver 1.14.1) + OpenNI: NO + ... + ... + ... + Install path: /usr + + cvconfig.h is in: /tmp/build_opencv/build + +------------------------------------------------------------------------------- +Compliation: + +Each sample directory contains a makefile to build the respective application. +The command is: + + cd opencv-sample-apps/[SAMPLE_DIR] + make + + Example: + $ cd opencv-sample-apps/opencv_camera + $ make + +------------------------------------------------------------------------------- +Execution: + +To run each sample: + +- opencv_camera: + $ ./opencv_nvgstcam [--Options] + --h help : Use case help + --width : capture width + --height : capture height + --fps : Frames per second + Example: + $ ./opencv_nvgstcam --width=1920 --height=1080 --fps=30 + +- opencv_decoder: + $ ./opencv_nvgstdec [--Options] + --help -h : Use case help + --file-path : Absolute path of file to be decoded + --show-fps : Display number of frames decoded per second + from GStreamer pipeline + Example: + $ ./opencv_nvgstdec --file-path=[_FILEPATH_] + +-opencv_encoder + $ ./opencv_nvgstenc [--Options] + --h help : Use case help + --width : capture width + --height : capture height + --fps : Frames per second + --filename : Target H264 encoded filename + --time : Duration for capture in seconds + Example: + $ ./opencv_nvgstenc --width=1920 --height=1080 --fps=30 --time=60 + --filename= test_h264_1080p_30fps.mp4 diff --git a/opencv-sample-apps/Rules.mk b/opencv-sample-apps/Rules.mk new file mode 100644 index 0000000..f39ae62 --- /dev/null +++ b/opencv-sample-apps/Rules.mk @@ -0,0 +1,93 @@ +############################################################################### +# +# Copyright (c) 2020, 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. +# +############################################################################### + +# Clear the flags from env +CPPFLAGS := +LDFLAGS := + +# Verbose flag +ifeq ($(VERBOSE), 1) +AT = +else +AT = @ +endif + +# ARM ABI of the target platform +ifeq ($(TEGRA_ARMABI),) +TEGRA_ARMABI ?= aarch64-linux-gnu +endif + +# Location of the target rootfs +ifeq ($(shell uname -m), aarch64) +TARGET_ROOTFS := +else +ifeq ($(TARGET_ROOTFS),) +$(error Please specify the target rootfs path if you are cross-compiling) +endif +endif + +# Use absolute path for better access from everywhere +TOP_DIR := $(shell pwd | awk '{split($$0, f, "/opencv\-sample\-apps"); print f[1]}') + +ifeq ($(shell uname -m), aarch64) +CROSS_COMPILE := +else +CROSS_COMPILE ?= aarch64-unknown-linux-gnu- +endif +AS = $(AT) $(CROSS_COMPILE)as +LD = $(AT) $(CROSS_COMPILE)ld +CC = $(AT) $(CROSS_COMPILE)gcc +CPP = $(AT) $(CROSS_COMPILE)g++ +AR = $(AT) $(CROSS_COMPILE)ar +NM = $(AT) $(CROSS_COMPILE)nm +STRIP = $(AT) $(CROSS_COMPILE)strip +OBJCOPY = $(AT) $(CROSS_COMPILE)objcopy +OBJDUMP = $(AT) $(CROSS_COMPILE)objdump + +# Specify the logical root directory for headers and libraries. +ifneq ($(TARGET_ROOTFS),) +CPPFLAGS += --sysroot=$(TARGET_ROOTFS) +LDFLAGS += \ + -Wl,-rpath-link=$(TARGET_ROOTFS)/usr/lib \ + -Wl,-rpath-link=$(TARGET_ROOTFS)/lib/$(TEGRA_ARMABI) \ + -Wl,-rpath-link=$(TARGET_ROOTFS)/usr/lib/$(TEGRA_ARMABI)/gstreamer-1.0 +endif + +# All common header files +CPPFLAGS += -std=c++11 \ + -I"$(TARGET_ROOTFS)/usr/include/$(TEGRA_ARMABI)" \ + -I"$(TARGET_ROOTFS)/usr/include/opencv4" + +# All common dependent libraries +LDFLAGS += \ + -lpthread -lopencv_core -lopencv_highgui -lopencv_videoio -lopencv_imgproc \ + -L"$(TARGET_ROOTFS)/usr/lib" \ + -L"$(TARGET_ROOTFS)/usr/lib/$(TEGRA_ARMABI)" \ + -L"$(TARGET_ROOTFS)/usr/lib/$(TEGRA_ARMABI)/gstreamer-1.0" diff --git a/opencv-sample-apps/opencv_camera/Makefile b/opencv-sample-apps/opencv_camera/Makefile new file mode 100644 index 0000000..e4932e8 --- /dev/null +++ b/opencv-sample-apps/opencv_camera/Makefile @@ -0,0 +1,51 @@ +############################################################################### +# +# Copyright (c) 2019, 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 ../Rules.mk + +APP := opencv_nvgstcam + +SRCS := \ + opencv_gst_camera.cpp + +OBJS := $(SRCS:.cpp=.o) + +all: $(APP) + +%.o: %.cpp + @echo "Compiling: $<" + $(CPP) $(CPPFLAGS) -c $< + +$(APP): $(OBJS) + @echo "Linking: $@" + $(CPP) -o $@ $(OBJS) $(CPPFLAGS) $(LDFLAGS) + +clean: + $(AT)rm -rf $(APP) $(OBJS) diff --git a/opencv-sample-apps/opencv_camera/opencv_gst_camera.cpp b/opencv-sample-apps/opencv_camera/opencv_gst_camera.cpp new file mode 100644 index 0000000..6795b1d --- /dev/null +++ b/opencv-sample-apps/opencv_camera/opencv_gst_camera.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2019, 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 +#include +#include +#include +#include +#include +#include +#include + +static std::string create_capture (int width, int height, int fps); + +static void help() +{ + std::cout << "\nThis is a sample OpenCV application to demonstrate " + "CSI-camera capture pipeline for NVIDIA accelerated GStreamer.\n\n" + "./opencv_nvgstcam [--Options]\n\n" + "OPTIONS:\n" + "\t-h,--help Prints this message\n" + "\t--width Capture width [Default = 1280]\n" + "\t--height Capture height [Default = 720]\n" + "\t--fps Frames per second [Default = 30]\n" + "\tq Runtime command to stop capture\n\n" + << std::endl; + +} + +static std::string create_capture (int width, int height, int fps) +{ + std::stringstream pipeline_str; + pipeline_str << "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)" + << std::to_string(width) << ", height=(int)" << std::to_string(height) + << ", format=(string)NV12, framerate=(fraction)" << std::to_string(fps) + << "/1 ! nvvidconv ! video/x-raw, format=(string)I420 ! videoconvert" + " ! video/x-raw, format=(string)BGR ! appsink "; + + return pipeline_str.str(); +} + +int main(int argc, char const *argv[]) +{ + unsigned int fps; + int width; + int height; + int return_val = 0; + double fps_calculated; + cv::VideoCapture capture; + cv::Mat frame; + cv::TickMeter ticks; + + const std::string keys = + "{h help | | message }" + "{width |1280 | width }" + "{height |720 | height }" + "{fps |30 | frame per second }" + ; + + cv::CommandLineParser cmd_parser(argc, argv, keys); + + if (cmd_parser.has("help")) + { + help(); + goto cleanup; + } + + fps = cmd_parser.get("fps"); + width = cmd_parser.get("width"); + height = cmd_parser.get("height"); + + if (!cmd_parser.check()) + { + cmd_parser.printErrors(); + help(); + return_val = -1; + goto cleanup; + } + + capture.open(create_capture(width, height, fps), cv::CAP_GSTREAMER); + + if (!capture.isOpened()) + { + std::cerr << "Failed to open VideoCapture" << std::endl; + return_val = -4; + goto cleanup; + } + + while (true) + { + ticks.start(); + capture >> frame; + + // computations + cv::imshow("Capture Window", frame); + int key = cv::waitKey(1); + + // 'q' for termination + if (key == 'q' ) + { + break; + } + ticks.stop(); + } + + if (ticks.getCounter() == 0) + { + std::cerr << "No frames processed" << std::endl; + return_val = -10; + goto cleanup; + } + + fps_calculated = ticks.getCounter() / ticks.getTimeSec(); + std::cout << "Fps observed " << fps_calculated << std::endl; + +cleanup: + capture.release(); + return return_val; +} diff --git a/opencv-sample-apps/opencv_decoder/Makefile b/opencv-sample-apps/opencv_decoder/Makefile new file mode 100644 index 0000000..250f855 --- /dev/null +++ b/opencv-sample-apps/opencv_decoder/Makefile @@ -0,0 +1,51 @@ +############################################################################### +# +# Copyright (c) 2019, 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 ../Rules.mk + +APP := opencv_nvgstdec + +SRCS := \ + opencv_gst_decoder.cpp + +OBJS := $(SRCS:.cpp=.o) + +all: $(APP) + +%.o: %.cpp + @echo "Compiling: $<" + $(CPP) $(CPPFLAGS) -c $< + +$(APP): $(OBJS) + @echo "Linking: $@" + $(CPP) -o $@ $(OBJS) $(CPPFLAGS) $(LDFLAGS) + +clean: + $(AT)rm -rf $(APP) $(OBJS) diff --git a/opencv-sample-apps/opencv_decoder/opencv_gst_decoder.cpp b/opencv-sample-apps/opencv_decoder/opencv_gst_decoder.cpp new file mode 100644 index 0000000..9c97327 --- /dev/null +++ b/opencv-sample-apps/opencv_decoder/opencv_gst_decoder.cpp @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2020, 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 +#include +#include +#include +#include +#include +#include +#include +#include + +void * display_thread(void *); + +bool capture_complete = false; +pthread_mutex_t lock; +pthread_t displayThread; +std::queue frame_queue; + +static void help() +{ + std::cout << "\nThis is a sample OpenCV application to demonstrate the " + "usage of NVIDIA accelerated GStreamer to decode an mp4 H264 container " + "file for VideoCapture\n\n" + "./opencv_nvgstdec --file-path=\n\n" + "OPTIONS:\n" + "\t-h,--help Prints this message.\n" + "\t--file-path Absolute path of file.\n" + "\t--show-fps[=true] Option to display framerate from VideoCapture.\n\n" + << std::endl; + +} + +static std::string create_capture(std::string filename) +{ + std::stringstream pipeline; + pipeline << "filesrc location= " + << filename << " ! qtdemux ! h264parse ! nvv4l2decoder ! nvvidconv ! " + "video/x-raw, format=(string)I420 ! appsink drop=true sync=false "; + + return pipeline.str(); +} + +void * display_thread(void *) +{ + if (capture_complete) + { + std::cout << "End of stream" << std::endl; + return NULL; + } + while (true) + { + cv::Mat display_frame; + if (frame_queue.empty() && capture_complete) + { + break; + } + pthread_mutex_lock(&lock); + if (!frame_queue.empty()) + { + display_frame = frame_queue.front(); + frame_queue.pop(); + } + pthread_mutex_unlock(&lock); + if (!display_frame.empty()) + { + cv::imshow("Display Window", display_frame); + cv::waitKey(1); + } + } + return NULL; +} + +int main(int argc, char *argv[]) +{ + int count = 0; + int return_val = 0; + bool fps_display; + double fps_captured; + std::string filename; + cv::VideoCapture capture; + cv::TickMeter tick_in_loop; + cv::Mat frame; + + pthread_mutex_init(&lock, NULL); + cv::CommandLineParser parser(argc, argv, + "{help h||}" + "{file-path||}" + "{show-fps||}" + ); + + if (parser.has("help")) + { + help(); + goto cleanup; + } + + filename = parser.get("file-path"); + fps_display = parser.has("show-fps"); + + if (!parser.check()) + { + parser.printErrors(); + return_val = -1; + goto cleanup; + } + if(filename.empty()) + { + std::cout << "ERROR: Input file is required" << std::endl; + help (); + return_val = -1; + goto cleanup; + } + + capture.open(create_capture(filename), cv::CAP_GSTREAMER); + + if (!capture.isOpened()) + { + std::cerr << "Failed to open VideoCapture" << std::endl; + return_val = -4; + goto cleanup; + } + + pthread_create(&displayThread, NULL, display_thread, NULL); + + while (true) + { + tick_in_loop.start(); + capture.read(frame); + + if (frame.empty()) + { + break; + } + cv::Mat bgr; + cv::cvtColor(frame, bgr, cv::COLOR_YUV2BGR_I420); + + pthread_mutex_lock(&lock); + + frame_queue.push(bgr); + + pthread_mutex_unlock (&lock); + + count++; + tick_in_loop.stop(); + + } + capture_complete = true; + pthread_join(displayThread, NULL); + + fps_captured = capture.get(cv::CAP_PROP_FPS); + std::cout << "Display FPS "<< fps_captured << std::endl; + + if (tick_in_loop.getCounter() == 0) + { + std::cerr << "No frames processed" << std::endl; + return_val = -10; + goto cleanup; + } + + if (fps_display) + { + double fps_calculated = tick_in_loop.getCounter() / tick_in_loop.getTimeSec(); + std::cout << "Captured Fps : " << fps_calculated << std::endl; + } + +cleanup: + capture.release(); + pthread_mutex_destroy(&lock); + return return_val; +} diff --git a/opencv-sample-apps/opencv_encoder/Makefile b/opencv-sample-apps/opencv_encoder/Makefile new file mode 100644 index 0000000..77b2093 --- /dev/null +++ b/opencv-sample-apps/opencv_encoder/Makefile @@ -0,0 +1,51 @@ +############################################################################### +# +# Copyright (c) 2019, 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 ../Rules.mk + +APP := opencv_nvgstenc + +SRCS := \ + opencv_gst_encoder.cpp + +OBJS := $(SRCS:.cpp=.o) + +all: $(APP) + +%.o: %.cpp + @echo "Compiling: $<" + $(CPP) $(CPPFLAGS) -c $< + +$(APP): $(OBJS) + @echo "Linking: $@" + $(CPP) -o $@ $(OBJS) $(CPPFLAGS) $(LDFLAGS) + +clean: + $(AT)rm -rf $(APP) $(OBJS) diff --git a/opencv-sample-apps/opencv_encoder/opencv_gst_encoder.cpp b/opencv-sample-apps/opencv_encoder/opencv_gst_encoder.cpp new file mode 100644 index 0000000..9bc88eb --- /dev/null +++ b/opencv-sample-apps/opencv_encoder/opencv_gst_encoder.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2019, 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 +#include +#include +#include +#include +#include +#include + +static void help() +{ + std::cout << "\nThis is a sample OpenCV application to demonstrate usage " + "of NVIDIA accelerated GStreamer to encode CSI camera capture in an H264 " + "mp4 container file.\n\n" + "./opencv_nvgstenc [--Options]\n\n" + "OPTIONS:\n" + "\t-h,--help Prints this message\n" + "\t--width Capture width [Default = 1280]\n" + "\t--height Capture height [Default = 720]\n" + "\t--fps Frames per second [Default = 30]\n" + "\t--filename Target H264 encoded mp4 filestream " + "[Default = test_camera_h264.mp4]\n" + "\t--time Duration for capture in seconds [Default = 10]\n\n" + << std::endl; +} + +static std::string create_cap_pipeline (int width, int height, int fps, + unsigned int num_buffers) +{ + std::stringstream cap_pipeline_str; + cap_pipeline_str << "nvarguscamerasrc num-buffers=" + << std::to_string(num_buffers) << " ! video/x-raw(memory:NVMM), " + "width=(int)" << std::to_string(width) << ", height=(int)" + << std::to_string(height) << ", format=(string)NV12, " + "framerate=(fraction)" << std::to_string(fps) << "/1 ! nvvidconv ! " + "video/x-raw, format=(string)I420 ! videoconvert ! video/x-raw, " + "format=(string)BGR ! appsink"; + + return cap_pipeline_str.str(); +} + +static std::string create_out_pipeline (std::string filename) +{ + std::stringstream out_pipeline_str; + out_pipeline_str << "appsrc ! video/x-raw, format=(string)BGR ! " + "videoconvert ! video/x-raw, format=(string)I420 ! nvvidconv ! " + "video/x-raw(memory:NVMM), format=(string)NV12 ! nvv4l2h264enc ! " + "h264parse ! qtmux ! filesink location=" + << filename << " "; + + return out_pipeline_str.str(); +} + +int main(int argc, char const *argv[]) +{ + unsigned int fps; + unsigned int time; + unsigned int num_buffers; + int width; + int height; + int return_val = 0; + double fps_calculated; + std::string filename; + std::string cap_pipeline; + std::string out_pipeline; + cv::VideoCapture capture; + cv::VideoWriter output; + cv::Mat frame; + cv::TickMeter ticks; + + const std::string keys = + "{h help usage ? | | message }" + "{width |1280 | width }" + "{height |720 | height }" + "{fps |30 | fps (supported: fps > 0) }" + "{filename |test_camera_h264.mp4 | h264 encoded filename }" + "{time |10 | capture time in seconds }" + ; + + cv::CommandLineParser cmd_parser(argc, argv, keys); + + if (cmd_parser.has("help")) + { + help(); + goto cleanup; + } + fps = cmd_parser.get("fps"); + width = cmd_parser.get("width"); + height = cmd_parser.get("height"); + filename = cmd_parser.get("filename"); + time = cmd_parser.get("time"); + if (!cmd_parser.check()) + { + cmd_parser.printErrors(); + help(); + return_val = -1; + goto cleanup; + } + + num_buffers = fps * time; + cap_pipeline = create_cap_pipeline(width, height, fps, num_buffers); + out_pipeline = create_out_pipeline(filename); + capture.open(cap_pipeline, cv::CAP_GSTREAMER); + output.open(out_pipeline, cv::CAP_GSTREAMER, 0, capture.get(cv::CAP_PROP_FPS), + cv::Size(capture.get(cv::CAP_PROP_FRAME_WIDTH), + capture.get(cv::CAP_PROP_FRAME_HEIGHT))); + + if (!capture.isOpened() || !output.isOpened()) + { + std::cerr << "Failed to open VideoCapture/ VideoWriter" << std::endl; + return_val = -4; + goto cleanup; + } + + while (true) + { + ticks.start(); + capture >> frame; + if (frame.empty()) + { + break; + } + + // computations + + output.write(frame); + cv::imshow("Capture Window", frame); + if (cv::waitKey(1) == 'q') + { + break; + } + ticks.stop(); + } + + if (ticks.getCounter() == 0) + { + std::cerr << "No frames processed" << std::endl; + return_val = -10; + goto cleanup; + } + fps_calculated = ticks.getCounter() / ticks.getTimeSec(); + std::cout << "Fps observed: " << fps_calculated << std::endl; + +cleanup: + capture.release(); + output.release(); + return return_val; +} diff --git a/push_info.txt b/push_info.txt new file mode 100644 index 0000000..a3e9379 --- /dev/null +++ b/push_info.txt @@ -0,0 +1 @@ +jetson_36.4