Commit c8984e1f authored by hebohua's avatar hebohua

pt2 support qpmap

parent 02739e2a
Pipeline #60 failed with stages
...@@ -155,7 +155,7 @@ ...@@ -155,7 +155,7 @@
&i2c0PL { &i2c0PL {
clock-frequency = <10000>; clock-frequency = <10000>;
/*sa8900_0: codec@1a{ sa8900_0: codec@1a{
compatible = "microbt,sa8900"; compatible = "microbt,sa8900";
pinctrl-names = "default"; pinctrl-names = "default";
#sound-dai-cells = <0>; #sound-dai-cells = <0>;
...@@ -164,38 +164,20 @@ ...@@ -164,38 +164,20 @@
spk-ctrl = <0>; spk-ctrl = <0>;
powerup-gpios = <&portd 1 GPIO_ACTIVE_HIGH>; powerup-gpios = <&portd 1 GPIO_ACTIVE_HIGH>;
dacclk-sel = <0>; //0:dacclk=adcclk 1:dacclk=dacclk/adcclk=adcclk dacclk-sel = <0>; //0:dacclk=adcclk 1:dacclk=dacclk/adcclk=adcclk
};*/ };
}; };
&i2c2ACME { &i2c2ACME {
clock-frequency = <100000>; /*i2c 100k*/ clock-frequency = <10000>;
scl-gpios = <&portf 1 GPIO_ACTIVE_HIGH>; scl-gpios = <&portf 1 GPIO_ACTIVE_HIGH>;
sda-gpios = <&portf 2 GPIO_ACTIVE_HIGH>; sda-gpios = <&portf 2 GPIO_ACTIVE_HIGH>;
es8388_2: es8388@10 {
status = "okay";
#sound-dai-cells = <0>;
compatible = "everest,es8388";
reg = <0x10>;
clocks = <&clock I2S1_MCLK>;
clock-names = "mclk";
clock-frequency = <8192000>;
pinctrl-0 = <&pinctrl_i2s1_mclk_pmux>;
pinctrl-names = "default";
spk-en-gpios = <&portf 14 GPIO_ACTIVE_LOW>;
};
}; };
&i2s0_clk { &i2s0_clk {
clock-frequency = <24000000>; clock-frequency = <12288000>;
};
&i2s1_clk {
clock-frequency = <8192000>;
}; };
&i2s0PL{ &i2s1ACME {
status = "disabled"; status = "disabled";
}; };
...@@ -204,18 +186,14 @@ ...@@ -204,18 +186,14 @@
simple-audio-card,frame-master = <&i2s0_dailink_master>; simple-audio-card,frame-master = <&i2s0_dailink_master>;
simple-audio-card,format = "i2s"; simple-audio-card,format = "i2s";
simple-audio-card,cpu { simple-audio-card,cpu {
sound-dai = <&i2s1ACME>; sound-dai = <&i2s0PL>;
}; };
i2s0_dailink_master:simple-audio-card,codec { i2s0_dailink_master:simple-audio-card,codec {
sound-dai = <&es8388_2>; sound-dai = <&sa8900_0>;
clocks = <&i2s1_clk>; clocks = <&i2s0_clk>;
clock-names = "mclk"; clock-names = "mclk";
}; };
/*i2s0_dailink_master:simple-audio-card,codec {
sound-dai = <&pdm_codec>;
};*/
}; };
&sound_pdm{ &sound_pdm{
...@@ -234,7 +212,3 @@ ...@@ -234,7 +212,3 @@
}; };
}; };
}; };
&i2c3ACME {
status = "disabled";
};
\ No newline at end of file
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
}; };
chosen { chosen {
bootargs = "console=ttyS2,115200 mem=64M quiet"; bootargs = "console=ttyS2,115200 mem=96M quiet";
stdout-path = "serial2:115200n8"; stdout-path = "serial2:115200n8";
}; };
...@@ -156,7 +156,7 @@ ...@@ -156,7 +156,7 @@
&i2c0PL { &i2c0PL {
clock-frequency = <10000>; clock-frequency = <10000>;
sa8900_0: codec@1a{ /*sa8900_0: codec@1a{
compatible = "microbt,sa8900"; compatible = "microbt,sa8900";
pinctrl-names = "default"; pinctrl-names = "default";
#sound-dai-cells = <0>; #sound-dai-cells = <0>;
...@@ -165,20 +165,38 @@ ...@@ -165,20 +165,38 @@
spk-ctrl = <0>; spk-ctrl = <0>;
powerup-gpios = <&portd 1 GPIO_ACTIVE_HIGH>; powerup-gpios = <&portd 1 GPIO_ACTIVE_HIGH>;
dacclk-sel = <0>; //0:dacclk=adcclk 1:dacclk=dacclk/adcclk=adcclk dacclk-sel = <0>; //0:dacclk=adcclk 1:dacclk=dacclk/adcclk=adcclk
}; };*/
}; };
&i2c2ACME { &i2c2ACME {
clock-frequency = <10000>; clock-frequency = <100000>; /*i2c 100k*/
scl-gpios = <&portf 1 GPIO_ACTIVE_HIGH>; scl-gpios = <&portf 1 GPIO_ACTIVE_HIGH>;
sda-gpios = <&portf 2 GPIO_ACTIVE_HIGH>; sda-gpios = <&portf 2 GPIO_ACTIVE_HIGH>;
es8388_2: es8388@10 {
status = "okay";
#sound-dai-cells = <0>;
compatible = "everest,es8388";
reg = <0x10>;
clocks = <&clock I2S1_MCLK>;
clock-names = "mclk";
clock-frequency = <8192000>;
pinctrl-0 = <&pinctrl_i2s1_mclk_pmux>;
pinctrl-names = "default";
spk-en-gpios = <&portf 14 GPIO_ACTIVE_LOW>;
};
}; };
&i2s0_clk { &i2s0_clk {
clock-frequency = <12288000>; clock-frequency = <24000000>;
};
&i2s1_clk {
clock-frequency = <8192000>;
}; };
&i2s1ACME { &i2s0PL{
status = "disabled"; status = "disabled";
}; };
...@@ -187,14 +205,18 @@ ...@@ -187,14 +205,18 @@
simple-audio-card,frame-master = <&i2s0_dailink_master>; simple-audio-card,frame-master = <&i2s0_dailink_master>;
simple-audio-card,format = "i2s"; simple-audio-card,format = "i2s";
simple-audio-card,cpu { simple-audio-card,cpu {
sound-dai = <&i2s0PL>; sound-dai = <&i2s1ACME>;
}; };
i2s0_dailink_master:simple-audio-card,codec { i2s0_dailink_master:simple-audio-card,codec {
sound-dai = <&sa8900_0>; sound-dai = <&es8388_2>;
clocks = <&i2s0_clk>; clocks = <&i2s1_clk>;
clock-names = "mclk"; clock-names = "mclk";
}; };
/*i2s0_dailink_master:simple-audio-card,codec {
sound-dai = <&pdm_codec>;
};*/
}; };
&sound_pdm{ &sound_pdm{
...@@ -213,3 +235,7 @@ ...@@ -213,3 +235,7 @@
}; };
}; };
}; };
&i2c3ACME {
status = "disabled";
};
\ No newline at end of file
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
#define FINSH_USING_MSH #define FINSH_USING_MSH
#define FINSH_THREAD_NAME "tshell" #define FINSH_THREAD_NAME "tshell"
#define FINSH_THREAD_PRIORITY 20 #define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096 #define FINSH_THREAD_STACK_SIZE 2048
#define FINSH_USING_HISTORY #define FINSH_USING_HISTORY
#define FINSH_HISTORY_LINES 5 #define FINSH_HISTORY_LINES 5
#define FINSH_USING_SYMTAB #define FINSH_USING_SYMTAB
...@@ -287,33 +287,32 @@ ...@@ -287,33 +287,32 @@
#define BSP_USING_PWM5 #define BSP_USING_PWM5
#define BSP_USING_PWM6 #define BSP_USING_PWM6
#define BSP_USING_PWM7 #define BSP_USING_PWM7
#define BSP_USING_PWM10
#define BSP_USING_PWM11
#define BSP_USING_I2C #define BSP_USING_I2C
#define BSP_USING_I2C0 #define BSP_USING_I2C0
#define BSP_USING_I2C1 #define BSP_USING_I2C1
#define BSP_USING_I2C2
#define BSP_USING_I2C3
#define SA_I2C_TEST
#define BSP_USING_STAR #define BSP_USING_STAR
#define BSP_USING_WDT #define BSP_USING_WDT
#define BSP_MOUDLE_WITHIN_WDT #define BSP_MOUDLE_WITHIN_WDT
#define BSP_USING_DMAC #define BSP_USING_DMAC
#define BSP_USING_MAILBOX #define BSP_USING_MAILBOX
#define BSP_USING_NANO_FILTER #define BSP_USING_NANO_FILTER
#define PWM_ID_WL 10 #define PWM_ID_WL 1
#define PWM_ID_IR 11 #define PWM_ID_IR -1
#define IRCUT_DRV_EN_PIN 89
#define IRCUT_DRV_SPI_CSN_PIN 86
#define SNS_OS04D10 #define SNS_OS04D10
#define SNS_OS04L10 #define BSP_USING_SNS_RST_PIN 27
#define BSP_USING_SNS_RST_PIN 5
#define ICR_CTRL_SPI_TM8150B
#define IRCUT_DRV_EN_PIN 0
#define IRCUT_DRV_SPI_CSN_PIN 0
#define BSP_USING_SPI #define BSP_USING_SPI
#define BSP_USING_PIN #define BSP_USING_PIN
#define BSP_USE_TESTMODULE
/* Board extended module Drivers */ /* Board extended module Drivers */
#define BSP_USING_RPMSG #define BSP_USING_RPMSG
#define BSP_USING_PMIC
#define PMIC_SA9710
#define BSP_TEST_PMIC
#define DEFAULT_SELECT #define DEFAULT_SELECT
/* sa692x ext Config */ /* sa692x ext Config */
...@@ -323,7 +322,8 @@ ...@@ -323,7 +322,8 @@
#define SA_USEING_LISTENING_PROCEE #define SA_USEING_LISTENING_PROCEE
#define RT_USING_CPU_USAGE #define RT_USING_CPU_USAGE
#define BSP_USING_SIMPLE_CMD #define BSP_USING_SIMPLE_CMD
#define BOARD_PLATFORM 1 #define BOARD_PLATFORM 3
#define BOOT_FROM_SFC #define BOOT_FROM_SFC
#define A55_USING_QSPI
#endif #endif
...@@ -6,28 +6,37 @@ ...@@ -6,28 +6,37 @@
### 2.1 配置mcu与A55工具链的环境变量 ### 2.1 配置mcu与A55工具链的环境变量
例如: 例如:
export PATH=$PATH:/opt/uclibc-ng/v1.2/arm-microbt-linux-uclibcgnueabihf/bin/ export PATH=$PATH:/opt/uclibc-ng/v1.2/arm-microbt-linux-uclibcgnueabihf/bin/; export CROSS_COMPILE=/opt/uclibc-ng/v1.2/arm-microbt-linux-uclibcgnueabihf/bin/arm-microbt-linux-uclibcgnueabihf-; export RTT_EXEC_PATH=/opt/gcc-arm-none-eabi-10.3-2021.10/bin
export CROSS_COMPILE=/opt/uclibc-ng/v1.2/arm-microbt-linux-uclibcgnueabihf/bin/arm-microbt-linux-uclibcgnueabihf-
export RTT_EXEC_PATH=/opt/gcc-arm-none-eabi-10.3-2021.10/bin
### 2.2 编译
a、编译普通版本 export PATH=$PATH:~/microbt_gcc/arm-microbt-linux-uclibcgnueabihf/bin/; export CROSS_COMPILE=~/microbt_gcc/arm-microbt-linux-uclibcgnueabihf/bin/arm-microbt-linux-uclibcgnueabihf-; export RTT_EXEC_PATH=~/microbt_gcc/gcc-arm-none-eabi-10.3-2021.10/bin
./run.sh 编译所有版本
./run.sh clean 清除所有版本 ### 2.2 编译
./run.sh clean 清除所有版本
./run.sh emmc 编译所有emmc版本 ./run.sh qa 编译所有emmc 和pt2 版本,运行结束 burn_img_emmc 目录会有对应产物生成。
./run.sh nor 编译所有norflash版本
./run.sh outdoor-ipc 编译IPC类版本 编译动态库或sample
在同一个终端,先执行 2.1 所示配置编译工具链的命令,再cd 命令进入有 export.sh 的代码目录,比如 sdk/opensource/source 或 sdk/sample/source,执行命令: source export.sh
再 cd 命令进入需要编译的 so 或sample 代码 Makefile 所在目录,比如 sdk/opensource/source/hapi 或 sdk/sample/source/sample_vpu,执行 make 命令即可快速编译。
生成的 so 或 bin 在 Makefile 当前目录
./run.sh glasses 编译眼镜类版本
### 2.3 编译报错
WSL ubuntu22.04 编译报如下错:
/bin/sh: 1: pushd: not found
/bin/sh: 2: scons: not found
/bin/sh: line 1: flex: command not found
/bin/sh: line 1: bison: command not found
此外还有一些缺头文件和python库的错,解决方法如下:
1、执行sudo dpkg-reconfigure dash 命令,将dash设置为No。
2、sudo apt-get update; sudo apt-get install scons flex bison libssl-dev libgmp-dev libmpc-dev lz4
3、sudo apt-get install python3-pip; pip3 install --user pycryptodome
4、wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz; tar -xzf openssl-1.1.1t.tar.gz; cd openssl-1.1.1t
5、./config --prefix=/usr/local/openssl-1.1.1t --openssldir=/usr/local/openssl-1.1.1t shared zlib; make; sudo make install
6、sudo ln -s /usr/local/openssl-1.1.1t/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1; sudo ln -s /usr/local/openssl-1.1.1t/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1; sudo ldconfig
b、编译ota版本
./run_ota.sh
运行结束 burn_img_nor 目录会有对应产物生成,其中编译OTA版本时会有对应版本号的OTA BIN文件生成。
...@@ -72,6 +72,7 @@ rootfs_copy_file() { ...@@ -72,6 +72,7 @@ rootfs_copy_file() {
if [ "$type" == "qa" ];then if [ "$type" == "qa" ];then
echo *****ONLY TEST**** echo *****ONLY TEST****
cp sdk/lib/libArcEncCam*.so system_temp/lib/
cp sdk/lib/libsvp_*.so system_temp/lib/ cp sdk/lib/libsvp_*.so system_temp/lib/
cp sdk/conf system_temp/ -r cp sdk/conf system_temp/ -r
cp common/conf/* system_temp/conf/ -rf cp common/conf/* system_temp/conf/ -rf
...@@ -157,7 +158,7 @@ if [ "$1" == "glasses" ] || [ "$1" == "outdoor-ipc" ] || [ "$1" == "emmc" ]; the ...@@ -157,7 +158,7 @@ if [ "$1" == "glasses" ] || [ "$1" == "outdoor-ipc" ] || [ "$1" == "emmc" ]; the
set +e set +e
elif [ "$1" == "clean" ]; then elif [ "$1" == "clean" ]; then
echo "Running make clean..." echo "Running make clean..."
rm -rf 6920_bsp_release/linux/rootfs/ rm -rf ../6920_bsp_release/linux/rootfs/
rm -rf ../burn_img_nor rm -rf ../burn_img_nor
rm -rf ../burn_img_emmc rm -rf ../burn_img_emmc
rm -rf ../system_temp rm -rf ../system_temp
...@@ -220,6 +221,8 @@ copy_files "$1" ...@@ -220,6 +221,8 @@ copy_files "$1"
cp -d sdk/lib/libsvp_vnne.so system_temp/lib/ cp -d sdk/lib/libsvp_vnne.so system_temp/lib/
cp -d sdk/lib/libsvp_yolox.so system_temp/lib/ cp -d sdk/lib/libsvp_yolox.so system_temp/lib/
cp sdk/lib/libArcEncCam*.so system_temp/lib/
cp sdk/opensource/lib/libhapi_open.so* system_temp/lib/ cp sdk/opensource/lib/libhapi_open.so* system_temp/lib/
cp sdk/opensource/lib/libimu_open.so* system_temp/lib/ cp sdk/opensource/lib/libimu_open.so* system_temp/lib/
cp sdk/opensource/lib/libjson_open.so* system_temp/lib/ cp sdk/opensource/lib/libjson_open.so* system_temp/lib/
...@@ -351,14 +354,15 @@ copy_files "$1" ...@@ -351,14 +354,15 @@ copy_files "$1"
make clean make clean
make make
cd - cd -
cd sdk/sample/source/sample_hapi_media/ # cd sdk/sample/source/sample_hapi_media/
make clean # make clean
make # make
cd - # cd -
set +e set +e
git checkout sdk/sample/source/mkconfig git checkout sdk/sample/source/mkconfig
mv sdk/sample/source/sample_hapi_streamer/sample_hapi_streamer system_temp/bin/streamer_ipc mv sdk/sample/source/sample_hapi_streamer/sample_hapi_streamer system_temp/bin/streamer_ipc
cp sdk/sample/source/sample_hapi_media/sample_hapi_media system_temp/bin/streamer_media # cp sdk/sample/source/sample_hapi_media/sample_hapi_media system_temp/bin/streamer_media
cp sdk/sample/source/lib/libArcEncCam*.so system_temp/lib/
cp sdk/bin/ipc_*.json system_temp/bin/ cp sdk/bin/ipc_*.json system_temp/bin/
cp system/configs system_temp/ -r cp system/configs system_temp/ -r
......
...@@ -35,16 +35,16 @@ ...@@ -35,16 +35,16 @@
"venc": [ "venc": [
{ {
"enable": 1, "devid": 0, "channel": 0, "smartrc": 1, "smartsei": 1, "enable": 1, "devid": 0, "channel": 0, "smartrc": 1, "smartsei": 1,
"format": "h265", "width": 2560, "height": 1440, "rcmode": "vbr", "bitrate": 1024000, "format": "h265", "width": 2560, "height": 1440, "rcmode": "arcbr", "bitrate": 1024000,
"region": [ "region": [
{ {
"enable": 1, "osd": "image", "enable": 0, "osd": "image",
"rect": { "x": 32, "y": 32, "width": 256, "height": 128 }, "rect": { "x": 32, "y": 32, "width": 256, "height": 128 },
"color": [ 16777215, 6171602, 16745541 ], "color": [ 16777215, 6171602, 16745541 ],
"file": "/acme/bin/logo256x128.2bpp" "file": "/acme/bin/logo256x128.2bpp"
}, },
{ {
"enable": 1, "osd": "time", "enable": 0, "osd": "time",
"rect": { "x": 1728, "y": 1344, "width": 800, "height": 64 }, "rect": { "x": 1728, "y": 1344, "width": 800, "height": 64 },
"color": [ 16777215, 6171602, 16745541 ] "color": [ 16777215, 6171602, 16745541 ]
} }
......
#ifndef _ENCODER_ARC_H
#define _ENCODER_ARC_H
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#include <sys/time.h>
#include <stdint.h>
//#include "sa_comm.h"
//#include "sa_comm_venc.h"
//#include "sa_hapi_scene.h"
#define MPP_ALIGN(x, a) (((x)+(a)-1)&~((a)-1))
#define MPP_ALIGN_DOWN(x, a) ((x) & ~((a)-1))
#define ARC_DIV_CEIL(x, y) (((x) + (y) - 1) / (y))
typedef struct{
signed char qp : 6;
unsigned char force_intra : 1;
unsigned char force_skip : 1;
}qp_map_cu_t;
typedef struct{
signed int qp : 8;
unsigned int force_intra : 1;
unsigned int force_skip : 1;
unsigned int dc_only : 1;
unsigned int : 5;
unsigned int min_blk_size : 3;
unsigned int : 1;
unsigned int max_blk_size : 3;
unsigned int : 1;
unsigned int lambda_factor : 8;
qp_map_cu_t block32[4];
qp_map_cu_t block16[16];
unsigned char res[8]; // for byte align
}h265_qp_map_lcu_t;
typedef struct{
signed int qp : 8;
unsigned int force_intra : 1;
unsigned int force_skip : 1;
unsigned int dc_only : 1;
unsigned int : 5;
unsigned int min_blk_size : 3;
unsigned int : 1;
unsigned int max_blk_size : 3;
unsigned int : 1;
unsigned int lambda_factor : 8;
}h264_qp_map_lcu_t;
typedef struct tagArc_encPara {
int Width;
int Height;
int encType;
int targetBitrate; //bps
int targetmaxBitrate; //bps
int gopLen;
int viLen;
int i_fps_num;
int i_fps_den;
int quality_level;
int pcbt_enable;
int reserved[10];
} Arc_encPara;
typedef struct _ARC_VIDEO_SVP_TARGET {
unsigned int u32Type; // 目标类型
float f32Confidence; // 置信度
float f32StartX; // 目标位置
float f32StartY; // 目标位置
float f32EndX; // 目标位置
float f32EndY; // 目标位置
} ARC_VIDEO_SVP_TARGET;
typedef struct _ARC_VIDEO_SVP_DETECT_TARGETS {
unsigned int u32Seq; // 帧号
unsigned int u32TargetNum; // 目标个数
ARC_VIDEO_SVP_TARGET stTargets[8]; // 目标属性
} ARC_VIDEO_SVP_DETECT_TARGETS;
//typedef struct _ARC_VIDEO_FRAME_INFO_S
//{
// unsigned int u32Width;
// unsigned int u32Height;
// unsigned int u32Stride[3];
// void* pVirAddr[3];
//}ARC_VIDEO_FRAME_INFO_S;
#ifdef __cplusplus
extern "C" {
#endif
int Arc_enc_setconfig(char *modle_path);//暂时不需使用
void* Arc_enc_init(Arc_encPara* encPara);
int Arc_enc_deinit(void* handle);
int Arc_enc_rc_start(void* handle, int u32VencChn, unsigned char* pQpMap, unsigned int u32QpMapBufLen, int u32EncWidth, int u32EncHeight, int isHevc, void* pYuvAddr, int* stride, ARC_VIDEO_SVP_DETECT_TARGETS* stSvpDetectTargets);
void Arc_enc_rc_end(void* handle, unsigned int packet_len, int bkeyFrame);
void version_1_0_0_5();
#ifdef __cplusplus
}
#endif
#endif
...@@ -56,6 +56,8 @@ typedef enum saVENC_RC_QPMAP_MODE_E { ...@@ -56,6 +56,8 @@ typedef enum saVENC_RC_QPMAP_MODE_E {
VENC_RC_QPMAP_MODE_ABSOLUTE = 0, VENC_RC_QPMAP_MODE_ABSOLUTE = 0,
VENC_RC_QPMAP_MODE_RELATIVE_ROI, /* The QP table will be parsed as relative values (DeltaQP). The ROI requires this */ VENC_RC_QPMAP_MODE_RELATIVE_ROI, /* The QP table will be parsed as relative values (DeltaQP). The ROI requires this */
VENC_RC_QPMAP_MODE_ABSOLUTE_ROI, /* The QP table will be parsed as absolute values, overriding the rate-control-determined QP. */ VENC_RC_QPMAP_MODE_ABSOLUTE_ROI, /* The QP table will be parsed as absolute values, overriding the rate-control-determined QP. */
VENC_RC_QPMAP_MODE_RELATIVE_LOADQP, /* The QP table will be parsed as relative values (DeltaQP). The LOAD QP requires this */
VENC_RC_QPMAP_MODE_ABSOLUTE_LOADQP, /* The QP table will be parsed as absolute values, overriding the rate-control-determined QP. */
VENC_RC_QPMAP_MODE_BUTT VENC_RC_QPMAP_MODE_BUTT
} VENC_RC_QPMAP_MODE_E; } VENC_RC_QPMAP_MODE_E;
......
...@@ -359,6 +359,14 @@ typedef struct saVENC_WORK_MODE_INFO{ ...@@ -359,6 +359,14 @@ typedef struct saVENC_WORK_MODE_INFO{
VENC_WORK_MODE_CH_INFO stJpeg[VENC_MAX_JPEG_CHN_NUM]; VENC_WORK_MODE_CH_INFO stJpeg[VENC_MAX_JPEG_CHN_NUM];
}VENC_WORK_MODE_INFO; }VENC_WORK_MODE_INFO;
typedef struct saVENC_QPMAP_LCU_S {
SA_S32 s32NumQPPerLCU;
SA_S32 s32NumBytesPerLCU;
SA_S32 s32NumLCUs;
SA_S32 s32QPTableDepth;
} VENC_QPMAP_LCU_S;
typedef struct saSEI_USERDATA_S typedef struct saSEI_USERDATA_S
{ {
SA_U8* pUserData; SA_U8* pUserData;
...@@ -371,11 +379,19 @@ typedef struct saVIDEO_SEI_S ...@@ -371,11 +379,19 @@ typedef struct saVIDEO_SEI_S
SA_U32 u32PayloadNum; SA_U32 u32PayloadNum;
} VIDEO_SEI_S; } VIDEO_SEI_S;
typedef struct saUSER_RC_INFO_S
{
SA_BOOL bQpMapValid;
SA_U64 u64QpMapPhyAddr;
SA_U8 ATTRIBUTE* pu8QpmapVirAddr;
} USER_RC_INFO_S;
typedef struct saUSER_FRAME_INFO_S typedef struct saUSER_FRAME_INFO_S
{ {
VIDEO_FRAME_INFO_S stFrameInfo; VIDEO_FRAME_INFO_S stFrameInfo;
VENC_ROI_ATTR_S *pstRoiAttr; VENC_ROI_ATTR_S *pstRoiAttr;
VIDEO_SEI_S stSei; VIDEO_SEI_S stSei;
USER_RC_INFO_S stUserRcInfo;
} USER_FRAME_INFO_S; } USER_FRAME_INFO_S;
typedef struct saJPEG_SINGLE_FRAME_INFO_S typedef struct saJPEG_SINGLE_FRAME_INFO_S
......
...@@ -61,6 +61,10 @@ SA_S32 SA_MAPI_VENC_GetFrameInfo(VENC_CHN VeChn, VIDEO_FRAME_INFO_S *stFrmInfo); ...@@ -61,6 +61,10 @@ SA_S32 SA_MAPI_VENC_GetFrameInfo(VENC_CHN VeChn, VIDEO_FRAME_INFO_S *stFrmInfo);
* @note * @note
*/ */
SA_S32 SA_MAPI_VENC_SendFrame(VENC_CHN VeChn, const VIDEO_FRAME_INFO_S *pstFrameInfo); SA_S32 SA_MAPI_VENC_SendFrame(VENC_CHN VeChn, const VIDEO_FRAME_INFO_S *pstFrameInfo);
SA_S32 SA_MAPI_VENC_GetQpmapAddr(VENC_CHN VeChn, VENC_USER_BUF_S *pstQPMapBuf);
/** /**
* @brief 发送Frame进行编码,可以附加 SEI 和 ROI * @brief 发送Frame进行编码,可以附加 SEI 和 ROI
* @details * @details
......
libispalg.so.2.5.0.9.1 libispalg.so.2.5.0.9.6
\ No newline at end of file \ No newline at end of file
libive.so.2.5.0.9.1 libive.so.2.5.0.9.6
\ No newline at end of file \ No newline at end of file
liblapi.so.2.5.0.9.1 liblapi.so.2.5.0.9.6
\ No newline at end of file \ No newline at end of file
libmapi.so.2.5.0.9.1 libmapi.so.2.5.0.9.6
\ No newline at end of file \ No newline at end of file
libvqe.so.2.5.0.9.1 libvqe.so.2.5.0.9.6
\ No newline at end of file \ No newline at end of file
...@@ -340,6 +340,7 @@ typedef struct { ...@@ -340,6 +340,7 @@ typedef struct {
VENC_CHN u32ChnId; VENC_CHN u32ChnId;
SA_F32 f32Fps; SA_F32 f32Fps;
MPP_CHN_S stSrc; MPP_CHN_S stSrc;
SA_U32 u32Bitrate;
VENC_USER_BUF_S* stUserBuf; VENC_USER_BUF_S* stUserBuf;
VENC_RECV_PIC_PARAM_S stRecvParam; VENC_RECV_PIC_PARAM_S stRecvParam;
VENC_CHN_ATTR_S stChnAttr; VENC_CHN_ATTR_S stChnAttr;
......
...@@ -52,9 +52,23 @@ extern "C" { ...@@ -52,9 +52,23 @@ extern "C" {
#define HAPI_CALLOC calloc #define HAPI_CALLOC calloc
#define HAPI_FREE free #define HAPI_FREE free
#define HAPI_MDELAY(m) usleep(m * 1000) #define HAPI_MDELAY(m) usleep(m * 1000)
#define HAPI_LOG_I printf
#define HAPI_LOG_W printf #if __linux__
#define HAPI_LOG_E printf #include <sys/syscall.h>
#define SYS_GETTID syscall(SYS_gettid)
#else
#define SYS_GETTID 0
#endif
#define VENC_VIDEO_LOG_E(fmt, ...) do {printf("pid:%lld %s %d, error, " fmt "\n", (unsigned long long int)SYS_GETTID, __func__, __LINE__, ##__VA_ARGS__); } while (0)
#define VENC_VIDEO_LOG_W(fmt, ...) do {printf("pid:%lld %s %d, waring, " fmt "\n", (unsigned long long int)SYS_GETTID, __func__, __LINE__, ##__VA_ARGS__); } while (0)
#define VENC_VIDEO_LOG_I(fmt, ...) do {printf("pid:%lld %s %d, " fmt "\n", (unsigned long long int)SYS_GETTID, __func__, __LINE__, ##__VA_ARGS__); } while (0)
#define VENC_VIDEO_LOG_D(fmt, ...) do {printf("pid:%lld %s %d, " fmt "\n", (unsigned long long int)SYS_GETTID, __func__, __LINE__, ##__VA_ARGS__); } while (0)
#define HAPI_LOG_I VENC_VIDEO_LOG_I
#define HAPI_LOG_W VENC_VIDEO_LOG_W
#define HAPI_LOG_E VENC_VIDEO_LOG_E
#define HAPI_LOG_N(fmt, ...) do {} while (0)
#include <pthread.h> #include <pthread.h>
typedef pthread_t HAPI_THREAD_T; typedef pthread_t HAPI_THREAD_T;
...@@ -339,6 +353,7 @@ typedef struct { ...@@ -339,6 +353,7 @@ typedef struct {
SA_BOOL bEnable; SA_BOOL bEnable;
VENC_CHN u32ChnId; VENC_CHN u32ChnId;
SA_F32 f32Fps; SA_F32 f32Fps;
SA_U32 u32Bitrate;
MPP_CHN_S stSrc; MPP_CHN_S stSrc;
VENC_USER_BUF_S* stUserBuf; VENC_USER_BUF_S* stUserBuf;
VENC_RECV_PIC_PARAM_S stRecvParam; VENC_RECV_PIC_PARAM_S stRecvParam;
......
...@@ -20,7 +20,15 @@ extern "C" { ...@@ -20,7 +20,15 @@ extern "C" {
#include "sa_mapi_ae.h" #include "sa_mapi_ae.h"
#include "sa_mapi_vi.h" #include "sa_mapi_vi.h"
#include <sys/time.h> #include <sys/time.h>
#include <dlfcn.h>
#define XIANGSU_RC
#ifdef XIANGSU_RC
#include "encoder_arc.h"
#define SA_HAPI_VIDEO_SVP_DETECT_TARGETS ARC_VIDEO_SVP_DETECT_TARGETS
void* g_wrapper[SA_VIDEO_VENC_CHN_MAX];
#else
typedef struct _SA_HAPI_VIDEO_SVP_TARGET { typedef struct _SA_HAPI_VIDEO_SVP_TARGET {
SA_U32 u32Type; // 目标类型 SA_U32 u32Type; // 目标类型
SA_FLOAT f32Confidence; // 置信度 SA_FLOAT f32Confidence; // 置信度
...@@ -34,7 +42,9 @@ typedef struct _SA_HAPI_VIDEO_SVP_DETECT_TARGETS { ...@@ -34,7 +42,9 @@ typedef struct _SA_HAPI_VIDEO_SVP_DETECT_TARGETS {
SA_U32 u32Seq; // 帧号 SA_U32 u32Seq; // 帧号
SA_U32 u32TargetNum; // 目标个数 SA_U32 u32TargetNum; // 目标个数
SA_HAPI_VIDEO_SVP_TARGET stTargets[SA_VIDEO_SVP_TARGET_MAX]; // 目标属性 SA_HAPI_VIDEO_SVP_TARGET stTargets[SA_VIDEO_SVP_TARGET_MAX]; // 目标属性
VIDEO_ZOOM_INFO_S stVZzoomInof;
} SA_HAPI_VIDEO_SVP_DETECT_TARGETS; } SA_HAPI_VIDEO_SVP_DETECT_TARGETS;
#endif
typedef struct _SA_HAPI_VIDEO_OFFLINE_SEND_THR_PARAMS { typedef struct _SA_HAPI_VIDEO_OFFLINE_SEND_THR_PARAMS {
SA_U32 u32Index; SA_U32 u32Index;
...@@ -912,9 +922,46 @@ SA_VOID SA_INNER_HAPI_OFFLINE_SEND_Thr(void* p) ...@@ -912,9 +922,46 @@ SA_VOID SA_INNER_HAPI_OFFLINE_SEND_Thr(void* p)
stUserFrame.pstRoiAttr = &stRoiAttr; stUserFrame.pstRoiAttr = &stRoiAttr;
} }
} else if (SA_VIDEO_SMART_ENCODER_QP_MAP == g_enVencSmartEncoder[u32VencChn]) { }
// TODO else if (SA_VIDEO_SMART_ENCODER_QP_MAP == g_enVencSmartEncoder[u32VencChn]) {
// stUserFrame.pstQpMap = ; #ifdef XIANGSU_RC
// USER_FRAME_INFO_S stUserFrame = {0};
VIDEO_FRAME_INFO_S *pstFrameInfo = &(stUserFrame.stFrameInfo);
// memcpy(&stUserFrame.stFrameInfo, &stFrmInfo, sizeof(VIDEO_FRAME_INFO_S));
VENC_USER_BUF_S stQPMapBuf = {0};
s32Ret = SA_MAPI_VENC_GetQpmapAddr(u32VencChn, &stQPMapBuf);
if (SA_SUCCESS != s32Ret) {
HAPI_LOG_E("SA_MAPI_VENC_GetQpmapAddr failed with %#x!\n", s32Ret);
} else {
SA_VOID* pYuvAddr = pstFrameInfo->stVFrame.pVirAddr[0];
SA_U32 u32EncWidth = g_pstVideoAttr->stVenc.astChannel[u32VencChn].stChnAttr.stVencAttr.u32EncWidth;
SA_U32 u32EncHeight = g_pstVideoAttr->stVenc.astChannel[u32VencChn].stChnAttr.stVencAttr.u32EncHeight;
SA_BOOL isHevc = SA_FALSE;
if (g_pstVideoAttr->stVenc.astChannel[u32VencChn].stChnAttr.stVencAttr.eEncType == VENC_ENCODE_TYPE_H265) {
isHevc = SA_TRUE;
}
stUserFrame.stUserRcInfo.bQpMapValid = SA_TRUE;
stUserFrame.stUserRcInfo.u64QpMapPhyAddr = stQPMapBuf.u64StrPhyAddr;
int stride[3];
stride[0] = u32EncWidth;
stride[1] = u32EncWidth/2;
stride[2] = u32EncWidth/2;
if (g_wrapper[u32VencChn] != NULL)
{
s32Ret = Arc_enc_rc_start(g_wrapper[u32VencChn], u32VencChn, stQPMapBuf.pu8Addr, stQPMapBuf.u32StrBufLen, u32EncWidth,
u32EncHeight, isHevc, pYuvAddr, stride, &stSvpDetectTargets);
} else {
HAPI_LOG_E("g_wrapper[u32VencChn] == NULL\n");
}
if (SA_SUCCESS != s32Ret) {
HAPI_LOG_E("VeChn:%d, HAPI_VENC_FillQps failed with %#x!\n", u32VencChn, s32Ret);
} else {
HAPI_LOG_I("VeChn:%d, Arc_enc_rc_start done!\n", u32VencChn);
}
}
#endif
} }
// HAPI_LOG_I("VENC Chn %d SendFrameEx\n", u32VencChn); // HAPI_LOG_I("VENC Chn %d SendFrameEx\n", u32VencChn);
...@@ -1001,7 +1048,6 @@ SA_S32 SA_HAPI_VIDEO_Start(SA_VIDEO_ATTR_S *pstVideoAttr) ...@@ -1001,7 +1048,6 @@ SA_S32 SA_HAPI_VIDEO_Start(SA_VIDEO_ATTR_S *pstVideoAttr)
HAPI_LOG_E("SA_INNER_HAPI_VENC_Start failed with %#x!\n", s32Ret); HAPI_LOG_E("SA_INNER_HAPI_VENC_Start failed with %#x!\n", s32Ret);
goto VIDEO_START_RGN_FAIL; goto VIDEO_START_RGN_FAIL;
} }
s32Ret = SA_INNER_HAPI_VPSS_Start(pstVpssAttr); s32Ret = SA_INNER_HAPI_VPSS_Start(pstVpssAttr);
if (SA_SUCCESS != s32Ret) { if (SA_SUCCESS != s32Ret) {
HAPI_LOG_E("SA_INNER_HAPI_VPSS_Start failed with %#x!\n", s32Ret); HAPI_LOG_E("SA_INNER_HAPI_VPSS_Start failed with %#x!\n", s32Ret);
...@@ -1202,6 +1248,37 @@ SA_S32 SA_HAPI_VIDEO_GetStream(VENC_CHN u32VeChn, VENC_STREAM_S *pstStream, SA_S ...@@ -1202,6 +1248,37 @@ SA_S32 SA_HAPI_VIDEO_GetStream(VENC_CHN u32VeChn, VENC_STREAM_S *pstStream, SA_S
return s32Ret; return s32Ret;
} }
#ifdef XIANGSU_RC
int is_IFrame = 0;
int packet_len = 0;
VENC_PACK_S *pstPack = SA_NULL;
if(g_wrapper[u32VeChn])
is_IFrame = 0;
for (SA_U32 u32Index = 0; u32Index < pstStream->u32PackCount; u32Index++)
{
pstPack = &pstStream->pstPack[u32Index];
if (SA_NULL != pstPack->pu8Addr && pstPack->u32Len > 0)
{
packet_len += pstPack->u32Len;
if (g_wrapper[u32VeChn] != NULL && (pstPack->DataType.enH265EType == H265E_NALU_ISLICE || pstPack->DataType.enH265EType == H265E_NALU_IDRSLICE ||
pstPack->DataType.enH264EType == H264E_NALU_ISLICE || pstPack->DataType.enH264EType == H264E_NALU_IDRSLICE))
{
is_IFrame = 1;
}
}
else {
break;
}
}
if (g_wrapper[u32VeChn] != NULL)
{
Arc_enc_rc_end(g_wrapper[u32VeChn], packet_len, is_IFrame);
}
#endif
return SA_SUCCESS; return SA_SUCCESS;
} }
......
...@@ -19,6 +19,13 @@ extern SA_BOOL g_bVencSmartSEI[SA_VIDEO_VENC_CHN_MAX]; ...@@ -19,6 +19,13 @@ extern SA_BOOL g_bVencSmartSEI[SA_VIDEO_VENC_CHN_MAX];
extern SA_VIDEO_SMART_ENCODER_TYPE_E g_enVencSmartEncoder[SA_VIDEO_VENC_CHN_MAX]; extern SA_VIDEO_SMART_ENCODER_TYPE_E g_enVencSmartEncoder[SA_VIDEO_VENC_CHN_MAX];
SA_S32 g_s32HapiMaxVencResChn[SA_VIDEO_VIN_DEV_MAX] = {-1, -1}; SA_S32 g_s32HapiMaxVencResChn[SA_VIDEO_VIN_DEV_MAX] = {-1, -1};
#define XIANGSU_RC
#ifdef XIANGSU_RC
#include "encoder_arc.h"
// #define SA_VIDEO_VENC_CHN_MAX 1
extern void* g_wrapper[SA_VIDEO_VENC_CHN_MAX];
#endif
SA_BOOL SA_INNER_HAPI_VENC_Fps(SA_F32 f32Fps, SA_S32 *ps32Fps) SA_BOOL SA_INNER_HAPI_VENC_Fps(SA_F32 f32Fps, SA_S32 *ps32Fps)
{ {
if (((SA_S32)(f32Fps * 100)) > (((SA_S32)f32Fps) * 100)) { if (((SA_S32)(f32Fps * 100)) > (((SA_S32)f32Fps) * 100)) {
...@@ -103,7 +110,7 @@ SA_S32 SA_INNER_HAPI_VENC_GetConfig(SA_VIDEO_SCENE_E enScene, SA_VIDEO_CONFIG_S ...@@ -103,7 +110,7 @@ SA_S32 SA_INNER_HAPI_VENC_GetConfig(SA_VIDEO_SCENE_E enScene, SA_VIDEO_CONFIG_S
} }
if (SA_TRUE == pstVenChnCfg->bSmartSEI if (SA_TRUE == pstVenChnCfg->bSmartSEI
|| SA_VIDEO_SMART_ENCODER_NONE != pstVenChnCfg->enSmartEncoder) { /* || SA_VIDEO_SMART_ENCODER_NONE != pstVenChnCfg->enSmartEncoder */) {
if (VENC_ENCODE_TYPE_JPEG == pstVenChnCfg->enEncodeType) { if (VENC_ENCODE_TYPE_JPEG == pstVenChnCfg->enEncodeType) {
HAPI_LOG_E("jpeg do not support smart function!\n"); HAPI_LOG_E("jpeg do not support smart function!\n");
return SA_ERR_HAPI_VIDEO_ILLEGAL_PARAM; return SA_ERR_HAPI_VIDEO_ILLEGAL_PARAM;
...@@ -396,7 +403,13 @@ SA_S32 SA_INNER_HAPI_VENC_GetChnConfig(SA_U32 u32Chn, SA_VIDEO_SCENE_E enScene, ...@@ -396,7 +403,13 @@ SA_S32 SA_INNER_HAPI_VENC_GetChnConfig(SA_U32 u32Chn, SA_VIDEO_SCENE_E enScene,
/*get VENC_RC_ATTR_S*/ /*get VENC_RC_ATTR_S*/
pstChnAttr->stChnAttr.stRcAttr.eRcMode = pstSceneChn->astVencConfig[u32Chn].enRcMode; pstChnAttr->stChnAttr.stRcAttr.eRcMode = pstSceneChn->astVencConfig[u32Chn].enRcMode;
if (SA_VIDEO_SMART_ENCODER_ROI == pstSceneChn->astVencConfig[u32Chn].enSmartEncoder) {
if (SA_VIDEO_SMART_ENCODER_QP_MAP == pstSceneChn->astVencConfig[u32Chn].enSmartEncoder) {
pstChnAttr->stChnAttr.stRcAttr.eQpCtrlMode = VENC_QP_MODE_LOAD_QP;
pstChnAttr->stChnAttr.stRcAttr.eQpMapMode = VENC_RC_QPMAP_MODE_ABSOLUTE_LOADQP;
pstChnAttr->stChnAttr.stRcAttr.eRcMode = VENC_RC_MODE_BYPASS;
}
else if (SA_VIDEO_SMART_ENCODER_ROI == pstSceneChn->astVencConfig[u32Chn].enSmartEncoder) {
pstChnAttr->stChnAttr.stRcAttr.eQpCtrlMode = VENC_QP_MODE_AUTO_QP; pstChnAttr->stChnAttr.stRcAttr.eQpCtrlMode = VENC_QP_MODE_AUTO_QP;
pstChnAttr->stChnAttr.stRcAttr.eQpMapMode = VENC_RC_QPMAP_MODE_RELATIVE_ROI; pstChnAttr->stChnAttr.stRcAttr.eQpMapMode = VENC_RC_QPMAP_MODE_RELATIVE_ROI;
} }
...@@ -530,6 +543,10 @@ SA_S32 SA_INNER_HAPI_VENC_GetChnConfig(SA_U32 u32Chn, SA_VIDEO_SCENE_E enScene, ...@@ -530,6 +543,10 @@ SA_S32 SA_INNER_HAPI_VENC_GetChnConfig(SA_U32 u32Chn, SA_VIDEO_SCENE_E enScene,
memcpy(pstChnAttr->stChnAttr.stRcAttr.stAvbr.u8BrCoef, au8BrCoef, VENC_AVBR_COEF_NUM); memcpy(pstChnAttr->stChnAttr.stRcAttr.stAvbr.u8BrCoef, au8BrCoef, VENC_AVBR_COEF_NUM);
break; break;
case VENC_RC_MODE_BYPASS: case VENC_RC_MODE_BYPASS:
#ifdef XIANGSU_RC
pstChnAttr->u32Bitrate = pstSceneChn->astVencConfig[u32Chn].u32Bitrate;
break;
#endif
/* todo: code */ /* todo: code */
break; break;
default: default:
...@@ -552,6 +569,43 @@ SA_S32 SA_INNER_HAPI_VENC_StartChn(SA_VIDEO_VENC_CHN_ATTR_S *pstVencChnAttr) ...@@ -552,6 +569,43 @@ SA_S32 SA_INNER_HAPI_VENC_StartChn(SA_VIDEO_VENC_CHN_ATTR_S *pstVencChnAttr)
return s32Ret; return s32Ret;
} }
#ifdef XIANGSU_RC
if (1)
{ /*--------------------Arc------------------*/
Arc_encPara encPara;
encPara.Width = pstVencChnAttr->stChnAttr.stVencAttr.u32EncWidth;
encPara.Height = pstVencChnAttr->stChnAttr.stVencAttr.u32EncHeight;
encPara.encType = 1;
encPara.targetBitrate = pstVencChnAttr->u32Bitrate;
encPara.targetmaxBitrate = pstVencChnAttr->u32Bitrate * 1.5;
encPara.gopLen = pstVencChnAttr->stChnAttr.stGopAttr.stDefaultGop.u16GopLen;
encPara.viLen = pstVencChnAttr->f32Fps;
encPara.i_fps_num = pstVencChnAttr->f32Fps;
encPara.i_fps_den = 1;
encPara.quality_level = 3;
encPara.pcbt_enable = 0;
printf("Arc Info: ChanId = %d\n", u32ChnId);
printf("Arc Info: CodeTpye = %d\n",encPara.encType);
printf("Arc Info: width = %d, height = %d\n",encPara.Width, encPara.Height);
printf("Arc Info: gopLen = %d\n", encPara.gopLen);
printf("Arc Info: fps = %d\n",encPara.i_fps_num);
printf("Arc Info: targetBitrate = %d\n",encPara.targetBitrate);
g_wrapper[u32ChnId] = Arc_enc_init(&encPara);
if (!g_wrapper[u32ChnId])
{
printf("Arc_enc_init failed!\n");
return -1;
}
}
else
{
g_wrapper[u32ChnId] = NULL;
printf("Arc Info: ChanId = %d, do not use ArcEnc\n", u32ChnId);
}
#endif
if (pstVencChnAttr->stChnAttr.stVencAttr.eWorkMode == VENC_WORK_MODE_ONLINE if (pstVencChnAttr->stChnAttr.stVencAttr.eWorkMode == VENC_WORK_MODE_ONLINE
|| pstVencChnAttr->stChnAttr.stVencAttr.eWorkMode == VENC_WORK_MODE_OFFLINE_BIND) { || pstVencChnAttr->stChnAttr.stVencAttr.eWorkMode == VENC_WORK_MODE_OFFLINE_BIND) {
s32Ret = SA_INNER_HAPI_VENC_BindVpss(u32ChnId, s32Ret = SA_INNER_HAPI_VENC_BindVpss(u32ChnId,
...@@ -599,6 +653,13 @@ SA_S32 SA_INNER_HAPI_VENC_StopChn(SA_VIDEO_VENC_CHN_ATTR_S *pstVencChnAttr) ...@@ -599,6 +653,13 @@ SA_S32 SA_INNER_HAPI_VENC_StopChn(SA_VIDEO_VENC_CHN_ATTR_S *pstVencChnAttr)
} }
} }
#ifdef XIANGSU_RC
if (g_wrapper[u32ChnId] != NULL) {
Arc_enc_deinit(g_wrapper[u32ChnId]);
g_wrapper[u32ChnId] = NULL;
}
#endif
s32Ret = SA_MAPI_VENC_DestroyChn(u32ChnId); s32Ret = SA_MAPI_VENC_DestroyChn(u32ChnId);
if (s32Ret != SA_SUCCESS) { if (s32Ret != SA_SUCCESS) {
HAPI_LOG_E("SA_MAPI_VENC_DestroyChn failed with %x\n", s32Ret); HAPI_LOG_E("SA_MAPI_VENC_DestroyChn failed with %x\n", s32Ret);
......
...@@ -275,7 +275,7 @@ SA_S32 SA_INNER_HAPI_VPSS_GetChnConfig(SIZE_S *pstResolution, SA_S32 s32Fps, SA_ ...@@ -275,7 +275,7 @@ SA_S32 SA_INNER_HAPI_VPSS_GetChnConfig(SIZE_S *pstResolution, SA_S32 s32Fps, SA_
pstVpssChnAttr->stChnAttr.bSramEn = SA_FALSE; pstVpssChnAttr->stChnAttr.bSramEn = SA_FALSE;
pstVpssChnAttr->stChnAttr.bCacheEn = SA_FALSE; pstVpssChnAttr->stChnAttr.bCacheEn = SA_TRUE;
pstVpssChnAttr->stCropAttr.bCropEn = SA_FALSE; pstVpssChnAttr->stCropAttr.bCropEn = SA_FALSE;
return SA_SUCCESS; return SA_SUCCESS;
......
...@@ -6,6 +6,7 @@ CFLAGS := -g -Wall -fpic ...@@ -6,6 +6,7 @@ CFLAGS := -g -Wall -fpic
CFLAGS += $(MAPI_SDK_SYS_INC_DIR) CFLAGS += $(MAPI_SDK_SYS_INC_DIR)
LDFLAGS += $(MAPI_SDK_SYS_LIB_DIR) LDFLAGS += $(MAPI_SDK_SYS_LIB_DIR)
LDFLAGS += $(MAPI_SDK_SYS_LD_FLAGS) LDFLAGS += $(MAPI_SDK_SYS_LD_FLAGS)
LDFLAGS += -lArcEncCam1.0.0.6.1
LDFLAGS += -lhapi_open -lrtsp_open -lfreetype -limu_open -ltool_comm LDFLAGS += -lhapi_open -lrtsp_open -lfreetype -limu_open -ltool_comm
DIR_LIB := $(src) DIR_LIB := $(src)
......
...@@ -499,6 +499,9 @@ SA_S32 STREAMERLITE_Load_Config(const SA_CHAR *strConfigFile) ...@@ -499,6 +499,9 @@ SA_S32 STREAMERLITE_Load_Config(const SA_CHAR *strConfigFile)
pstVenCfg->enRcMode = VENC_RC_MODE_JPEG_FXIQP; pstVenCfg->enRcMode = VENC_RC_MODE_JPEG_FXIQP;
} else if (strcmp(strValue, "cqp") == SA_SUCCESS) { } else if (strcmp(strValue, "cqp") == SA_SUCCESS) {
pstVenCfg->enRcMode = VENC_RC_MODE_CONST_QP; pstVenCfg->enRcMode = VENC_RC_MODE_CONST_QP;
} else if (strcmp(strValue, "arcbr") == SA_SUCCESS) {
pstVenCfg->enRcMode = VENC_RC_MODE_BYPASS; // VENC_RC_MODE_ARC_BR;
pstVenCfg->enSmartEncoder = SA_VIDEO_SMART_ENCODER_QP_MAP;
} else { } else {
HAPI_LOG_E("wrong rc mode '%s'.", strValue); HAPI_LOG_E("wrong rc mode '%s'.", strValue);
} }
......
...@@ -91,14 +91,14 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL = ...@@ -91,14 +91,14 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL =
.s32VinDevId = 0, .s32VinDevId = 0,
.enEncodeType = VENC_ENCODE_TYPE_H265, .enEncodeType = VENC_ENCODE_TYPE_H265,
.stResolution = { .stResolution = {
.u32Width = 1280, .u32Width = 1920,
.u32Height = 720, .u32Height = 1080,
}, },
.enRcMode = VENC_RC_MODE_CBR, .enRcMode = VENC_RC_MODE_BYPASS, // VENC_RC_MODE_VBR,
.u32Bitrate = 128000, .u32Bitrate = 1024000,
.astRegion = { .astRegion = {
{ {
.bEnable = SA_TRUE, .bEnable = SA_FALSE,
.enType = VIDEO_RGN_TYPE_IMAGE, .enType = VIDEO_RGN_TYPE_IMAGE,
.astrImageFile = "/acme/bin/logo256x128.2bpp", .astrImageFile = "/acme/bin/logo256x128.2bpp",
.stRect = { .stRect = {
...@@ -110,7 +110,7 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL = ...@@ -110,7 +110,7 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL =
.u32RgbColor = { 0xFFFFFF, 0x5E2BD2, 0xFF8445 } .u32RgbColor = { 0xFFFFFF, 0x5E2BD2, 0xFF8445 }
}, },
{ {
.bEnable = SA_TRUE, .bEnable = SA_FALSE,
.enType = VIDEO_RGN_TYPE_TIMESTAMP, .enType = VIDEO_RGN_TYPE_TIMESTAMP,
.stRect = { .stRect = {
.s32X = 1728, //cavas width(2560) - region width(600) - padding(32) .s32X = 1728, //cavas width(2560) - region width(600) - padding(32)
...@@ -121,24 +121,24 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL = ...@@ -121,24 +121,24 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL =
.u32RgbColor = { 0xFFFFFF, 0x5E2BD2, 0xFF8445 } .u32RgbColor = { 0xFFFFFF, 0x5E2BD2, 0xFF8445 }
} }
}, },
.bSmartRateCtrl = SA_TRUE, .bSmartRateCtrl = SA_FALSE,
.bSmartSEI = SA_FALSE, .bSmartSEI = SA_FALSE,
.enSmartEncoder = SA_VIDEO_SMART_ENCODER_NONE .enSmartEncoder = SA_VIDEO_SMART_ENCODER_QP_MAP, // SA_VIDEO_SMART_ENCODER_NONE,
}, },
{ {
.u32VencChn = 1, .u32VencChn = 1,
.bEnable = SA_TRUE, .bEnable = SA_FALSE,
.s32VinDevId = 0, .s32VinDevId = 0,
.enEncodeType = VENC_ENCODE_TYPE_H265, .enEncodeType = VENC_ENCODE_TYPE_H265,
.stResolution = { .stResolution = {
.u32Width = 1920, .u32Width = 1920,
.u32Height = 1080, .u32Height = 1080,
}, },
.enRcMode = VENC_RC_MODE_CBR, .enRcMode = VENC_RC_MODE_ADAPTIVE_VBR,
.u32Bitrate = 128000, .u32Bitrate = 1024000,
.astRegion = { .astRegion = {
{ {
.bEnable = SA_TRUE, .bEnable = SA_FALSE,
.enType = VIDEO_RGN_TYPE_IMAGE, .enType = VIDEO_RGN_TYPE_IMAGE,
.astrImageFile = "/acme/bin/logo256x128.2bpp", .astrImageFile = "/acme/bin/logo256x128.2bpp",
.stRect = { .stRect = {
...@@ -150,7 +150,7 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL = ...@@ -150,7 +150,7 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL =
.u32RgbColor = { 0xFFFFFF, 0x5E2BD2, 0xFF8445 } .u32RgbColor = { 0xFFFFFF, 0x5E2BD2, 0xFF8445 }
}, },
{ {
.bEnable = SA_TRUE, .bEnable = SA_FALSE,
.enType = VIDEO_RGN_TYPE_TIMESTAMP, .enType = VIDEO_RGN_TYPE_TIMESTAMP,
.stRect = { .stRect = {
.s32X = 1028, //cavas width(2560) - region width(600) - padding(32) .s32X = 1028, //cavas width(2560) - region width(600) - padding(32)
...@@ -161,22 +161,22 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL = ...@@ -161,22 +161,22 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL =
.u32RgbColor = { 0xFFFFFF, 0x5E2BD2, 0xFF8445 } .u32RgbColor = { 0xFFFFFF, 0x5E2BD2, 0xFF8445 }
} }
}, },
.bSmartRateCtrl = SA_TRUE, .bSmartRateCtrl = SA_FALSE,
.bSmartSEI = SA_FALSE, .bSmartSEI = SA_FALSE,
.enSmartEncoder = SA_VIDEO_SMART_ENCODER_NONE .enSmartEncoder = SA_VIDEO_SMART_ENCODER_NONE,
}, },
}, },
.astSvpConfig = { .astSvpConfig = {
{ {
.bEnable = SA_TRUE, .bEnable = SA_FALSE,
.s32VinDevId = 0, .s32VinDevId = 0,
.u32DetectFps = 5, .u32DetectFps = 15,
.u32StructFps = 1, .u32StructFps = 1,
.strDetectModelFile = "/acme/conf/yolox_nano_PersonVehicleNonvehicle_800x480.hir", .strDetectModelFile = "/acme/conf/yolox_nano_PersonVehicleNonvehicle_800x480.hir",
.fNmsThreshold = 0.65, .fNmsThreshold = 0.65,
.pDetectCallback = SAMPLE_HAPI_VIDEO_SVP_DetectHandle, .pDetectCallback = SAMPLE_HAPI_VIDEO_SVP_DetectHandle,
.pStructCallback = SAMPLE_HAPI_VIDEO_SVP_StructHandle, .pStructCallback = SAMPLE_HAPI_VIDEO_SVP_StructHandle,
.bResultImage = SA_TRUE, .bResultImage = SA_FALSE,
.stScreenBlocks.u32Rows = 5, .stScreenBlocks.u32Rows = 5,
.stScreenBlocks.u32Cols = 5, .stScreenBlocks.u32Cols = 5,
.stMotionDetect.bEnable = SA_FALSE, .stMotionDetect.bEnable = SA_FALSE,
...@@ -216,7 +216,7 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL = ...@@ -216,7 +216,7 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL =
.fThreshold = 0.45, .fThreshold = 0.45,
}, },
.stLicensePlateDetect = { .stLicensePlateDetect = {
.bEnable = SA_TRUE, .bEnable = SA_FALSE,
.fThreshold = 0.45, .fThreshold = 0.45,
.bBlockEnable = {SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, .bBlockEnable = {SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE,
SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE,
...@@ -225,7 +225,7 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL = ...@@ -225,7 +225,7 @@ static SA_VIDEO_CONFIG_S SCENE_CONFIG_NORMAL =
SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE} SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE, SA_TRUE}
}, },
.stLicensePlateStruct = { .stLicensePlateStruct = {
.bEnable = SA_TRUE, .bEnable = SA_FALSE,
.strRecognizeModelFile = "/acme/conf/car_plate_rec_nv12.hir", .strRecognizeModelFile = "/acme/conf/car_plate_rec_nv12.hir",
} }
} }
...@@ -606,34 +606,81 @@ SA_S32 SAMPLE_SCENE_StartRtsp(SA_VOID) ...@@ -606,34 +606,81 @@ SA_S32 SAMPLE_SCENE_StartRtsp(SA_VOID)
return SA_SUCCESS; return SA_SUCCESS;
} }
#define STREAM_FILE_NAME_LEN 256 #define STREAM_FILE_NAME_LEN 1024
SA_CHAR StreamFile[STREAM_FILE_NAME_LEN] = {"/mnt/sdcard/stream.h265"}; SA_CHAR StreamFile[SA_VIDEO_VENC_CHN_MAX][STREAM_FILE_NAME_LEN] = {"/mnt/sdcard/stream.h265"};
FILE *pVencStrFile = NULL; FILE *pVencStrFile[SA_VIDEO_VENC_CHN_MAX] = {NULL};
SA_S32 StrFd[SA_VIDEO_VENC_CHN_MAX] = {-1};
SA_VOID SAMPLE_SCENE_CloseFile(SA_VOID) SA_VOID SAMPLE_SCENE_CloseFile(SA_VOID)
{ {
if (pVencStrFile) { for (int ci = 0; ci < SA_VIDEO_VENC_CHN_MAX; ci++) {
fclose(pVencStrFile); if (pVencStrFile[ci]) {
fclose(pVencStrFile[ci]);
}
} }
} }
SA_S32 SAMPLE_SCENE_OpenFile(SA_VIDEO_VENC_CONFIG_S *pstVencConfig) SA_S32 SAMPLE_SCENE_OpenFile(SA_VIDEO_VENC_CONFIG_S *pstVencConfig)
{ {
SA_BOOL bSmartSEI = pstVencConfig->bSmartSEI; SA_U32 Bitrate;
SA_U32 Bitrate = pstVencConfig->u32Bitrate/1000;
int s32Ret = SA_SUCCESS; int s32Ret = SA_SUCCESS;
if (bSmartSEI) {
snprintf(StreamFile, STREAM_FILE_NAME_LEN, "/mnt/sdcard/stream_smart_roi_br%dk.h265", Bitrate); for (int ci = 0; ci < SA_VIDEO_VENC_CHN_MAX; ci++) {
if (!pstVencConfig[ci].bEnable){
continue;
}
Bitrate = pstVencConfig[ci].u32Bitrate/1000;
if (g_pcWriteFilePath) {
if (g_pcReadFileName[ci]) {
snprintf(StreamFile[ci], STREAM_FILE_NAME_LEN, "%s/%s.265", g_pcWriteFilePath, g_pcReadFileName[ci]);
} else { } else {
snprintf(StreamFile, STREAM_FILE_NAME_LEN, "/mnt/sdcard/stream_noroi_br%dk.h265", Bitrate); snprintf(StreamFile[ci], STREAM_FILE_NAME_LEN, "%d_%s", ci, g_pcWriteFilePath);
}
}
else if (pstVencConfig[ci].enSmartEncoder == SA_VIDEO_SMART_ENCODER_ROI) {
snprintf(StreamFile[ci], STREAM_FILE_NAME_LEN, "/mnt/sdcard/stream%d_roi_br%dk.h265", ci, Bitrate);
}
else if (pstVencConfig[ci].enSmartEncoder == SA_VIDEO_SMART_ENCODER_QP_MAP) {
snprintf(StreamFile[ci], STREAM_FILE_NAME_LEN, "/mnt/sdcard/stream%d_qpmap_br%dk.h265", ci, Bitrate);
}
else {
snprintf(StreamFile[ci], STREAM_FILE_NAME_LEN, "/mnt/sdcard/stream%d_none_br%dk.h265", ci, Bitrate);
}
pVencStrFile[ci] = fopen(StreamFile[ci], "wb");
if (!pVencStrFile[ci])
{
printf("VeChn %d open StreamFile[%s] failed! \n", ci, StreamFile[ci]);
s32Ret = -1;
return s32Ret;
}
StrFd[ci] = fileno(pVencStrFile[ci]);
if (StrFd[ci] == -1) {
printf("VeChn %d fileno fd, %s failed! \n", ci, StreamFile[ci]);
s32Ret = -1;
return s32Ret;
} }
pVencStrFile = fopen(StreamFile, "wb"); if (g_pcReadFileName[ci]) {
if (!pVencStrFile) snprintf(YuvFileName[ci], STREAM_FILE_NAME_LEN, g_pcReadFileName[ci]);
pYuvFile[ci] = fopen(YuvFileName[ci], "rb");
if (!pYuvFile[ci])
{ {
printf("open StreamFile[%s] failed! \n", StreamFile); printf("VeChn %d open YuvFileName[%s] failed! \n", ci, YuvFileName[ci]);
s32Ret = -1; s32Ret = -1;
return s32Ret;
}
stVideoAttr.stVenc.astChannel[ci].FrameFILE = pYuvFile[ci];
stVideoAttr.stVenc.astChannel[ci].FrameFileName = g_pcReadFileName[ci];
printf("VeChn %d open YuvFileName[%s] ok! \n", ci, YuvFileName[ci]);
printf("VeChn %d open StreamFile[%s] ok! \n", ci, StreamFile[ci]);
}
} }
return s32Ret; return s32Ret;
} }
...@@ -772,8 +819,8 @@ void* SAMPLE_SCENE_VencProc(void *p) ...@@ -772,8 +819,8 @@ void* SAMPLE_SCENE_VencProc(void *p)
} }
if (g_bWriteFile && pVencStrFile && (pstVencChnAttr->u32ChnId == 0)) { if (g_bWriteFile && pVencStrFile && (pstVencChnAttr->u32ChnId == 0)) {
fwrite(pstPack->pu8Addr, pstPack->u32Len, 1, pVencStrFile); fwrite(pstPack->pu8Addr, pstPack->u32Len, 1, pVencStrFile[VeChn]);
fflush(pVencStrFile); fflush(pVencStrFile[VeChn]);
} }
} else { } else {
break; break;
......
...@@ -17,7 +17,7 @@ machine=`uname -m` ...@@ -17,7 +17,7 @@ machine=`uname -m`
if [ ${machine} = "aarch64" ];then if [ ${machine} = "aarch64" ];then
/sbin/insmod ${ko_dir}/osal/osaldrv.ko anony=1 mmz_allocator=superacme mmz=anonymous,0,0x68000000,128M:sram,0,0x201E0000,4352K /sbin/insmod ${ko_dir}/osal/osaldrv.ko anony=1 mmz_allocator=superacme mmz=anonymous,0,0x68000000,128M:sram,0,0x201E0000,4352K
else else
/sbin/insmod ${ko_dir}/osal/osaldrv.ko anony=1 mmz_allocator=superacme mmz=anonymous,0,0x64000000,192M:sram,0,0x201E0000,4352K /sbin/insmod ${ko_dir}/osal/osaldrv.ko anony=1 mmz_allocator=superacme mmz=anonymous,0,0x66000000,160M:sram,0,0x201E0000,4352K
fi fi
# dtbo # dtbo
mkdir -p /sys/kernel/config/device-tree/overlays/sdk mkdir -p /sys/kernel/config/device-tree/overlays/sdk
......
...@@ -15,7 +15,7 @@ machine=`uname -m` ...@@ -15,7 +15,7 @@ machine=`uname -m`
if [ ${machine} = "aarch64" ];then if [ ${machine} = "aarch64" ];then
/sbin/insmod ${ko_dir}/osal/osaldrv.ko anony=1 mmz_allocator=superacme mmz=anonymous,0,0x68000000,128M:sram,0,0x201E0000,4352K /sbin/insmod ${ko_dir}/osal/osaldrv.ko anony=1 mmz_allocator=superacme mmz=anonymous,0,0x68000000,128M:sram,0,0x201E0000,4352K
else else
/sbin/insmod ${ko_dir}/osal/osaldrv.ko anony=1 mmz_allocator=superacme mmz=anonymous,0,0x64000000,192M:sram,0,0x201E0000,4352K /sbin/insmod ${ko_dir}/osal/osaldrv.ko anony=1 mmz_allocator=superacme mmz=anonymous,0,0x66000000,160M:sram,0,0x201E0000,4352K
fi fi
# dtbo # dtbo
mkdir -p /sys/kernel/config/device-tree/overlays/sdk mkdir -p /sys/kernel/config/device-tree/overlays/sdk
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment