/* * Copyright (c) 2016-2023, 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 "video_encode.h" #define CHECK_OPTION_VALUE(argp) if(!*argp || (*argp)[0] == '-') \ { \ cerr << "Error: value not specified for option " << arg << endl; \ goto error; \ } #define CSV_PARSE_CHECK_ERROR(condition, str) \ if (condition) {\ cerr << "Error: " << str << endl; \ goto error; \ } using namespace std; static uint32_t get_encoder_type(char *arg) { if (!strcmp(arg, "H264")) return V4L2_PIX_FMT_H264; if (!strcmp(arg, "H265")) return V4L2_PIX_FMT_H265; if (!strcmp(arg, "VP8")) printf("VP8"); return V4L2_PIX_FMT_VP8; if (!strcmp(arg, "VP9")) return V4L2_PIX_FMT_VP9; if (!strcmp(arg, "AV1")) return V4L2_PIX_FMT_AV1; return 0; } static int32_t get_encoder_ratecontrol(char *arg) { if (!strcmp(arg, "cbr")) return V4L2_MPEG_VIDEO_BITRATE_MODE_CBR; if (!strcmp(arg, "vbr")) return V4L2_MPEG_VIDEO_BITRATE_MODE_VBR; return -1; } static int32_t get_encoder_profile_h264(char *arg) { if (!strcmp(arg, "baseline")) return V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE; if (!strcmp(arg, "main")) return V4L2_MPEG_VIDEO_H264_PROFILE_MAIN; if (!strcmp(arg, "high")) return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH; if (!strcmp(arg, "high444")) return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE; return -1; } static int32_t get_encoder_profile_h265(char *arg) { if (!strcmp(arg, "main")) return V4L2_MPEG_VIDEO_H265_PROFILE_MAIN; if (!strcmp(arg, "main10")) return V4L2_MPEG_VIDEO_H265_PROFILE_MAIN10; return -1; } static int32_t get_h264_encoder_level(char *arg) { if (!strcmp(arg, "1.0")) return V4L2_MPEG_VIDEO_H264_LEVEL_1_0; if (!strcmp(arg, "1b")) return V4L2_MPEG_VIDEO_H264_LEVEL_1B; if (!strcmp(arg, "1.1")) return V4L2_MPEG_VIDEO_H264_LEVEL_1_1; if (!strcmp(arg, "1.2")) return V4L2_MPEG_VIDEO_H264_LEVEL_1_2; if (!strcmp(arg, "1.3")) return V4L2_MPEG_VIDEO_H264_LEVEL_1_3; if (!strcmp(arg, "2.0")) return V4L2_MPEG_VIDEO_H264_LEVEL_2_0; if (!strcmp(arg, "2.1")) return V4L2_MPEG_VIDEO_H264_LEVEL_2_1; if (!strcmp(arg, "2.2")) return V4L2_MPEG_VIDEO_H264_LEVEL_2_2; if (!strcmp(arg, "3.0")) return V4L2_MPEG_VIDEO_H264_LEVEL_3_0; if (!strcmp(arg, "3.1")) return V4L2_MPEG_VIDEO_H264_LEVEL_3_1; if (!strcmp(arg, "3.2")) return V4L2_MPEG_VIDEO_H264_LEVEL_3_2; if (!strcmp(arg, "4.0")) return V4L2_MPEG_VIDEO_H264_LEVEL_4_0; if (!strcmp(arg, "4.1")) return V4L2_MPEG_VIDEO_H264_LEVEL_4_1; if (!strcmp(arg, "4.2")) return V4L2_MPEG_VIDEO_H264_LEVEL_4_2; if (!strcmp(arg, "5.0")) return V4L2_MPEG_VIDEO_H264_LEVEL_5_0; if (!strcmp(arg, "5.1")) return V4L2_MPEG_VIDEO_H264_LEVEL_5_1; return -1; } static int32_t get_h265_encoder_level(char *arg) { if (!strcmp(arg, "main1.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_1_0_MAIN_TIER; if (!strcmp(arg, "high1.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_1_0_HIGH_TIER; if (!strcmp(arg, "main2.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_2_0_MAIN_TIER; if (!strcmp(arg, "high2.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_2_0_HIGH_TIER; if (!strcmp(arg, "main2.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_2_1_MAIN_TIER; if (!strcmp(arg, "high2.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_2_1_HIGH_TIER; if (!strcmp(arg, "main3.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_3_0_MAIN_TIER; if (!strcmp(arg, "high3.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_3_0_HIGH_TIER; if (!strcmp(arg, "main3.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_3_1_MAIN_TIER; if (!strcmp(arg, "high3.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_3_1_HIGH_TIER; if (!strcmp(arg, "main4.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_4_0_MAIN_TIER; if (!strcmp(arg, "high4.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_4_0_HIGH_TIER; if (!strcmp(arg, "main4.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_4_1_MAIN_TIER; if (!strcmp(arg, "high4.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_4_1_HIGH_TIER; if (!strcmp(arg, "main5.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_5_0_MAIN_TIER; if (!strcmp(arg, "high5.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_5_0_HIGH_TIER; if (!strcmp(arg, "main5.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_5_1_MAIN_TIER; if (!strcmp(arg, "high5.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_5_1_HIGH_TIER; if (!strcmp(arg, "main5.2")) return V4L2_MPEG_VIDEO_H265_LEVEL_5_2_MAIN_TIER; if (!strcmp(arg, "high5.2")) return V4L2_MPEG_VIDEO_H265_LEVEL_5_2_HIGH_TIER; if (!strcmp(arg, "main6.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_6_0_MAIN_TIER; if (!strcmp(arg, "high6.0")) return V4L2_MPEG_VIDEO_H265_LEVEL_6_0_HIGH_TIER; if (!strcmp(arg, "main6.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_6_1_MAIN_TIER; if (!strcmp(arg, "high6.1")) return V4L2_MPEG_VIDEO_H265_LEVEL_6_1_HIGH_TIER; if (!strcmp(arg, "main6.2")) return V4L2_MPEG_VIDEO_H265_LEVEL_6_2_MAIN_TIER; if (!strcmp(arg, "high6.2")) return V4L2_MPEG_VIDEO_H265_LEVEL_6_2_HIGH_TIER; return -1; } static int32_t get_dbg_level(char *arg) { int32_t log_level = atoi(arg); if (log_level < 0) { cout << "Warning: invalid log level input, defaulting to setting 0" << endl; return 0; } if (log_level > 3) { cout << "Warning: invalid log level input, defaulting to setting 3" << endl; return 3; } return log_level; }