2443 lines
74 KiB
C
Executable File
2443 lines
74 KiB
C
Executable File
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/mman.h>
|
|
#include <sys/types.h>
|
|
#include <pthread.h>
|
|
#include <unistd.h>
|
|
#include <sys/time.h>
|
|
#include <semaphore.h>
|
|
#include <signal.h>
|
|
|
|
#define LOG_TAG "demo_video"
|
|
|
|
#include "AW_VideoInput_API.h"
|
|
#include "aw_util.h"
|
|
#include "awnn.h"
|
|
|
|
#if 1
|
|
#define NETWORK_HUMAN "/lib/1.1.0_Beta.nb"
|
|
#define NETWORK_HUMAN_POST_TYPE AWNN_DET_POST_HUMANOID_1
|
|
#define HUMAN_DET_WIDTH (320)
|
|
#define HUMAN_DET_HEIGHT (192)
|
|
#define HUMAN_VIPP_WIDTH (320)
|
|
#define HUMAN_VIPP_HEIGHT (180)
|
|
#define HUMAN_DET_THRESH (0.35)
|
|
#define HUMAN_DET_MEM_SIZE (1862796)
|
|
#else
|
|
#define NETWORK_HUMAN "/lib/3.0.1_Beta.nb"
|
|
#define NETWORK_HUMAN_POST_TYPE AWNN_DET_POST_HUMANOID_3
|
|
#define HUMAN_DET_WIDTH (384)
|
|
#define HUMAN_DET_HEIGHT (224)
|
|
#define HUMAN_VIPP_WIDTH (384)
|
|
#define HUMAN_VIPP_HEIGHT (216)
|
|
#define HUMAN_DET_THRESH (0.25)
|
|
#define HUMAN_DET_MEM_SIZE (2702920)
|
|
#endif
|
|
|
|
#define ENABLE_SECOND_CHANNEL (0)
|
|
#define ENABLE_THIRD_CHANNEL (0)
|
|
|
|
#define ENABLE_OSD_FUNCTION (0)
|
|
#define ENABLE_CATCH_JPEG (1)
|
|
|
|
#define ENABLE_GET_BIN_IMAGE_DATA (0)
|
|
#define ENABLE_GET_MV_INFO_DATA (0)
|
|
#define ENABLE_GET_LV_SET_IR (0)
|
|
|
|
#define TESET_ROI_FUNC 0
|
|
|
|
#define ENABLE_SET_HFLIP (0)
|
|
#define ENABLE_SET_VFLIP (0)
|
|
#define ENABLE_SET_PLF (0)
|
|
|
|
#define ENABLE_SET_I_FRAME (0)
|
|
#define ENABLE_RESET_ENCODER_TYPE (0)
|
|
#define ENABLE_RESET_SIZE (0)
|
|
|
|
#define ENABLE_ONLY_ENCODER (0)
|
|
|
|
#define ENABLE_SET_VBR_PARAM (0)
|
|
#define ENABLE_GET_SUM_MAD (0)
|
|
|
|
#define ENABLE_HUMAN_DETECT 0
|
|
|
|
#if ENABLE_HUMAN_DETECT
|
|
#define ENABLE_GET_MOTION_SEARCH_RESULT 1
|
|
#else
|
|
#define ENABLE_GET_MOTION_SEARCH_RESULT 0
|
|
#endif
|
|
|
|
#define MOTION_SEARCH_HOR_NUM 16
|
|
#define MOTION_SEARCH_VER_NUM 9
|
|
#define MOTION_SEARCH_TOTAL_NUM (MOTION_SEARCH_HOR_NUM * MOTION_SEARCH_VER_NUM)
|
|
|
|
#define ENABLE_DYNAMIC_SET_QP_AND_BITRATE_AND_FPS (0)
|
|
#define ENABLE_SET_SUPER_FRAME_PARAM (0)
|
|
|
|
#if ENABLE_ONLY_ENCODER
|
|
#define ENABLE_SECOND_CHANNEL (0)
|
|
#define ENABLE_THIRD_CHANNEL (0)
|
|
#endif
|
|
|
|
#define DROP_STREAM_DATA (0)
|
|
|
|
#define TEST_CROP_FUNC 0
|
|
|
|
#define OUT_PUT_FILE_PREFIX "/tmp/stream0"
|
|
#define OUT_PUT_FILE_PREFIX_jpg "/tmp/jpg_0.jpg"
|
|
#define OUT_PUT_FILE_PREFIX_mjpeg "/tmp/jpg_0.mjpeg"
|
|
#define OUT_PUT_FILE_PREFIX_1 "/tmp/stream1"
|
|
#define OUT_PUT_FILE_0_1 "/mnt/extsd/stream0-1.h264"
|
|
#define OUT_PUT_FILE_PREFIX_2 "/tmp/stream2"
|
|
#define OUT_PUT_FILE_0_2 "/mnt/extsd/stream0-2.h264"
|
|
|
|
|
|
#define OUT_PUT_FILE_2 "/mnt/extsd/data.yuv"
|
|
#define OUT_PUT_FILE_3 "/mnt/extsd/stream0.h265"
|
|
#define OUT_PUT_FILE_JPEG "/tmp/data.jpg"
|
|
#define OUT_PUT_FILE_BIN_IMAGE "/mnt/extsd/bin_image.data"
|
|
#define OUT_PUT_FILE_MV_INFO "/mnt/extsd/mv_info.data"
|
|
#define IN_YUV_FILE "/mnt/extsd/1920x1080_nv12.yuv"
|
|
|
|
//#define IN_OSD_ARGB_FILE "/mnt/extsd/01_argb_464x32_time.dat"
|
|
|
|
#define IN_OSD_ARGB_FILE "/mnt/extsd/fs_v853/01_argb_464x32_time.dat"
|
|
#define IN_OSD_ARGB_FILE_1 "/mnt/extsd/03_argb_864x160_time.argb"
|
|
|
|
//#define ALIGN_XXB(y, x) (((x) + ((y)-1)) & ~((y)-1))
|
|
|
|
//#define OUT_PUT_FILE_0 "/tmp/stream.h264"
|
|
|
|
#define ENABLE_TEST_SET_CAMERA_MOVE_STATUS (0)
|
|
#define ENABLE_TEST_SET_CAMERA_ADAPTIVE_MOVING_AND_STATIC (0)
|
|
|
|
static int max_bitstream_count = SAVE_BITSTREAM_COUNT;
|
|
FILE *out_file_0 = NULL;
|
|
FILE *out_file_1 = NULL;
|
|
FILE *out_file_2 = NULL;
|
|
|
|
static int stream_count_0 = 0;
|
|
static int stream_count_1 = 0;
|
|
static int stream_count_2 = 0;
|
|
|
|
|
|
static int64_t time_start = 0;
|
|
static int64_t time_end = 0;
|
|
|
|
static int64_t time_aw_start = 0;
|
|
|
|
static sem_t finish_sem;
|
|
static int video_finish_flag = 0;
|
|
|
|
|
|
demo_video_param mparam;
|
|
|
|
static int led_fwrite(const char *_path, const char *val_str)
|
|
{
|
|
FILE * stream = NULL;
|
|
size_t len = 0;
|
|
|
|
//aw_logd("led_write: path = %s, val = %s\n", _path, val_str);
|
|
|
|
stream = fopen(_path, "w");
|
|
if (!stream) {
|
|
fprintf(stderr, "Cannot open:%s\n", _path);
|
|
return -EINVAL;
|
|
}
|
|
|
|
len = strlen(val_str);
|
|
|
|
if (len != fwrite(val_str, 1, len, stream)) {
|
|
fprintf(stderr, "[err] %s --->fwrite size: %d\n",
|
|
val_str, (int)len);
|
|
fclose(stream);
|
|
return -EINVAL;
|
|
}
|
|
|
|
fprintf(stdout, "echo %s > %s\n", val_str, _path);
|
|
fclose(stream);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static uint64_t pre_pts = 0;
|
|
static int save_file_cnt = 0;
|
|
static int need_save_new_file = 0;
|
|
|
|
static int pre_pts_in_seconds = 0;
|
|
static int cb_stream_cnt_in_seconds = 0;
|
|
|
|
void channel_thread_exit(void)
|
|
{
|
|
sem_post(&finish_sem);
|
|
}
|
|
|
|
void video_stream_cb(const AWVideoInput_StreamInfo* stream_info)
|
|
{
|
|
int keyframe = stream_info->keyframe_flag;
|
|
|
|
if (stream_info->size0 == 0 || stream_info->data0 == NULL) {
|
|
aw_logd("stream data error: data = %p, len = %d",stream_info->data0, stream_info->size0);
|
|
return ;
|
|
}
|
|
|
|
if(stream_count_0 < max_bitstream_count)
|
|
{
|
|
|
|
uint64_t cur_time = get_cur_time_us();
|
|
|
|
uint64_t pts = stream_info->pts;
|
|
uint64_t pts_in_seconds = pts/1000/1000;
|
|
unsigned char file_name[128] = {0};
|
|
unsigned char new_file_name[128] = {0};
|
|
|
|
if(stream_count_0%15 == 0)
|
|
{
|
|
aw_logd("*data = %p, len = %d, cnt = %d, kf = %d, pts = %llu us, %llu s; diff = %llu ms, cur_time = %llu us, diff = %llu ms\n",
|
|
stream_info->data0, stream_info->size0, stream_count_0, keyframe,
|
|
pts, pts/1000000, (pts - pre_pts)/1000, cur_time, (cur_time - pts)/1000);
|
|
}
|
|
|
|
if(pts_in_seconds != pre_pts_in_seconds)
|
|
{
|
|
aw_logd("get video stream, fps = %d", cb_stream_cnt_in_seconds);
|
|
pre_pts_in_seconds = pts_in_seconds;
|
|
cb_stream_cnt_in_seconds = 0;
|
|
}
|
|
cb_stream_cnt_in_seconds++;
|
|
|
|
pre_pts = pts;
|
|
time_end = get_cur_time_us();
|
|
|
|
if(stream_count_0 == 0)
|
|
{
|
|
aw_logd("time of first stream: = %lld\n",time_end - time_aw_start);
|
|
/* led_fwrite("/sys/class/gpio_sw/PH11/data", "0"); */
|
|
}
|
|
|
|
//if((time_end - time_start) > 30000)
|
|
//if(stream_count_0%200 == 0)
|
|
if(stream_count_0 == 0)
|
|
{
|
|
aw_logd("save first bitstream[0]: count = %d, time = %.3f s\n",
|
|
stream_count_0,
|
|
((float)(time_end - time_start)/1000/1000));
|
|
}
|
|
|
|
/*
|
|
if((time_end - time_start) > 30000)
|
|
{
|
|
aw_logd("big time [0]: data = %p, len = %d, count = %d, time = %lld\n",
|
|
data, len, stream_count_0,
|
|
(time_end - time_start));
|
|
}
|
|
*/
|
|
|
|
time_start = get_cur_time_us();
|
|
|
|
|
|
#if (DROP_STREAM_DATA == 0)
|
|
if(stream_count_0%450 == 0)
|
|
need_save_new_file = 1;
|
|
|
|
if((need_save_new_file == 1 && keyframe == 1)
|
|
|| out_file_0 == NULL)
|
|
{
|
|
save_file_cnt++;
|
|
if (mparam.c0_encoder_format == 0)
|
|
sprintf(file_name, "%s_%d.h264", mparam.OutputFilePath, save_file_cnt);
|
|
else
|
|
sprintf(file_name, "%s_%d.h265", mparam.OutputFilePath, save_file_cnt);
|
|
aw_logd("save new file, cnt = %d, file_name = %s", stream_count_0, file_name);
|
|
need_save_new_file = 0;
|
|
|
|
if(out_file_0)
|
|
{
|
|
fclose(out_file_0);
|
|
}
|
|
out_file_0 = fopen(file_name, "wb");
|
|
}
|
|
if(out_file_0) {
|
|
if (stream_info->b_insert_sps_pps && stream_info->sps_pps_size && stream_info->sps_pps_buf)
|
|
fwrite(stream_info->sps_pps_buf, 1, stream_info->sps_pps_size, out_file_0);
|
|
|
|
fwrite(stream_info->data0, 1, stream_info->size0, out_file_0);
|
|
|
|
if (stream_info->size1)
|
|
fwrite(stream_info->data1, 1, stream_info->size1, out_file_0);
|
|
if (stream_info->size2)
|
|
fwrite(stream_info->data2, 1, stream_info->size2, out_file_0);
|
|
}
|
|
|
|
if(stream_count_0 == 0)
|
|
{
|
|
if (mparam.c0_encoder_format == 1) {
|
|
if (mparam.jpg_mode)
|
|
{
|
|
sprintf(new_file_name, "%s.mjpeg", mparam.OutputFilePath);
|
|
rename(file_name, new_file_name);
|
|
}
|
|
else
|
|
{
|
|
sprintf(new_file_name, "%s.jpg", mparam.OutputFilePath);
|
|
rename(file_name, new_file_name);
|
|
}
|
|
} else {
|
|
uint64_t time = get_cur_time_us();
|
|
/* led_fwrite("/sys/class/gpio_sw/PF6/data", "0"); */
|
|
aw_logw("route 0 save first stream buffer done, time: %lld.%lldms ", time/1000, time%1000);
|
|
if (mparam.c0_encoder_format == 0)
|
|
sprintf(new_file_name, "%s_%d_%lld.%lldms.h264", mparam.OutputFilePath, save_file_cnt, time/1000, time%1000);
|
|
else
|
|
sprintf(new_file_name, "%s_%d_%lld.%lldms.h265", mparam.OutputFilePath, save_file_cnt, time/1000, time%1000);
|
|
rename(file_name, new_file_name);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
aw_logd("already arrive max_bitstream_count %d", max_bitstream_count);
|
|
return ;
|
|
}
|
|
|
|
#if ENABLE_SET_I_FRAME
|
|
if(stream_count_0 == 2 || stream_count_0 == 10)
|
|
AWVideoInput_SetIFrame(0);
|
|
#endif
|
|
#if 0
|
|
/*ircut*/
|
|
RTIrParam pIrParam;
|
|
if (stream_count_0 == 0) {
|
|
pIrParam.grey = 0;
|
|
pIrParam.ir_on = 0;
|
|
pIrParam.ir_flash_on = 0;
|
|
AWVideoInput_SetIrParam(0, &pIrParam);
|
|
aw_logd("********************%d:change to day mode\n", stream_count_0);
|
|
} else if (stream_count_0 == 50) {
|
|
pIrParam.grey = 1;
|
|
pIrParam.ir_on = 1;
|
|
pIrParam.ir_flash_on = 1;
|
|
AWVideoInput_SetIrParam(0, &pIrParam);
|
|
aw_logd("********************%d:change to night mode\n", stream_count_0);
|
|
} else if (stream_count_0 == 100) {
|
|
pIrParam.grey = 0;
|
|
pIrParam.ir_on = 0;
|
|
pIrParam.ir_flash_on = 0;
|
|
AWVideoInput_SetIrParam(0, &pIrParam);
|
|
aw_logd("********************%d:change to day mode\n", stream_count_0);
|
|
} else if (stream_count_0 == 150) {
|
|
pIrParam.grey = 1;
|
|
pIrParam.ir_on = 1;
|
|
pIrParam.ir_flash_on = 1;
|
|
AWVideoInput_SetIrParam(0, &pIrParam);
|
|
aw_logd("********************%d:change to night mode\n", stream_count_0);
|
|
} else if (stream_count_0 == 200) {
|
|
pIrParam.grey = 0;
|
|
pIrParam.ir_on = 0;
|
|
pIrParam.ir_flash_on = 0;
|
|
AWVideoInput_SetIrParam(0, &pIrParam);
|
|
aw_logd("********************%d:change to day mode\n", stream_count_0);
|
|
}
|
|
|
|
/*hist*/
|
|
int i, j = 0;
|
|
unsigned int hist[256];
|
|
memset(hist, 0, 256*sizeof(unsigned int));
|
|
if (stream_count_0 == 50) {
|
|
AWVideoInput_GetHist(0, hist);
|
|
for (i = 0; i < 256; i++) {
|
|
j++;
|
|
printf("0x%8x, ", hist[i]);
|
|
if (j%8 == 0)
|
|
printf("\n");
|
|
}
|
|
}
|
|
|
|
if (stream_count_0 == 30)
|
|
AWVideoInput_SetAeMeteringMode(0, RT_AE_METERING_MODE_CENTER);
|
|
|
|
RTIspCtrlAttr isp_ctrl_attr;
|
|
|
|
isp_ctrl_attr.isp_ctrl_id = RT_ISP_CTRL_HIGH_LIGHT;
|
|
isp_ctrl_attr.value = 15;
|
|
if (stream_count_0 == 20)
|
|
AWVideoInput_SetIspAttrCfg(0, &isp_ctrl_attr);
|
|
#endif
|
|
if (mparam.enable_orl) {
|
|
int i;
|
|
RTIspOrl isp_orl;
|
|
memset(&isp_orl, 0, sizeof(RTIspOrl));
|
|
isp_orl.on = 1;
|
|
isp_orl.orl_cnt = 16;
|
|
isp_orl.orl_width = 4;
|
|
for (i = 0; i < isp_orl.orl_cnt; i++) {
|
|
isp_orl.orl_win[i].width = 70;
|
|
isp_orl.orl_win[i].height = 60;
|
|
isp_orl.orl_win[i].left = 70*i;
|
|
isp_orl.orl_win[i].top = 60*i;
|
|
isp_orl.orl_win[i].rgb_orl = 0xff0000 >> ((i % 3)*8);
|
|
|
|
}
|
|
if (stream_count_0 == 0) {
|
|
isp_orl.on = 1;
|
|
isp_orl.orl_cnt = 16;
|
|
isp_orl.orl_width = 1;
|
|
AWVideoInput_SetIspOrl(0, &isp_orl);
|
|
} else if (stream_count_0 == 50) {
|
|
isp_orl.on = 1;
|
|
isp_orl.orl_cnt = 10;
|
|
isp_orl.orl_width = 2;
|
|
AWVideoInput_SetIspOrl(0, &isp_orl);
|
|
} else if (stream_count_0 == 100) {
|
|
isp_orl.on = 1;
|
|
isp_orl.orl_cnt = 5;
|
|
isp_orl.orl_width = 4;
|
|
AWVideoInput_SetIspOrl(0, &isp_orl);
|
|
} else if (stream_count_0 == 150) {
|
|
isp_orl.on = 0;
|
|
isp_orl.orl_cnt = 5;
|
|
isp_orl.orl_width = 6;
|
|
AWVideoInput_SetIspOrl(0, &isp_orl);
|
|
}
|
|
}
|
|
stream_count_0++;
|
|
if(stream_count_0 >= max_bitstream_count && !video_finish_flag)
|
|
{
|
|
video_finish_flag = 1;
|
|
sem_post(&finish_sem);
|
|
}
|
|
}
|
|
|
|
static int save_file_cnt_1 = 0;
|
|
static int need_save_new_file_1 = 0;
|
|
|
|
|
|
void video_stream_cb_1(const AWVideoInput_StreamInfo* stream_info)
|
|
{
|
|
int keyframe = stream_info->keyframe_flag;
|
|
|
|
if (stream_info->size0 == 0 || stream_info->data0 == NULL) {
|
|
aw_logd("stream data error: data = %p, len = %d",stream_info->data0, stream_info->size0);
|
|
return ;
|
|
}
|
|
|
|
if(stream_count_0 < max_bitstream_count)
|
|
{
|
|
//if(stream_count_1%200 == 0)
|
|
{
|
|
//aw_logd("save bitstream[1]: data = %p, len = %d, count = %d\n",
|
|
// data, len, stream_count_1);
|
|
}
|
|
unsigned char file_name[128] = {0};
|
|
unsigned char new_file_name[128] = {0};
|
|
#if (DROP_STREAM_DATA == 0)
|
|
if(stream_count_1%450 == 0)
|
|
need_save_new_file_1 = 1;
|
|
|
|
if((need_save_new_file_1 == 1 && keyframe == 1)
|
|
|| out_file_1 == NULL)
|
|
{
|
|
save_file_cnt_1++;
|
|
sprintf(file_name, "%s_%d.h264", OUT_PUT_FILE_PREFIX_1, save_file_cnt_1);
|
|
aw_logd("save new file, cnt = %d, file_name = %s", stream_count_1, file_name);
|
|
need_save_new_file_1 = 0;
|
|
|
|
if(out_file_1)
|
|
{
|
|
fclose(out_file_1);
|
|
}
|
|
out_file_1 = fopen(file_name, "wb");
|
|
}
|
|
if(out_file_1) {
|
|
if (stream_info->b_insert_sps_pps && stream_info->sps_pps_size && stream_info->sps_pps_buf)
|
|
fwrite(stream_info->sps_pps_buf, 1, stream_info->sps_pps_size, out_file_1);
|
|
|
|
fwrite(stream_info->data0, 1, stream_info->size0, out_file_1);
|
|
|
|
if (stream_info->size1)
|
|
fwrite(stream_info->data1, 1, stream_info->size1, out_file_1);
|
|
if (stream_info->size2)
|
|
fwrite(stream_info->data2, 1, stream_info->size2, out_file_1);
|
|
}
|
|
|
|
if(stream_count_1 == 0)
|
|
{
|
|
uint64_t time = get_cur_time_us();
|
|
/* led_fwrite("/sys/class/gpio_sw/PF6/data", "0"); */
|
|
aw_logw("route 1 save first stream buffer done, time: %lld.%lldms ", time/1000, time%1000);
|
|
sprintf(new_file_name, "%s_%d_%lld.%lldms.h264", OUT_PUT_FILE_PREFIX_1, save_file_cnt_1, time/1000, time%1000);
|
|
rename(file_name, new_file_name);
|
|
}
|
|
stream_count_1++;
|
|
#endif
|
|
|
|
}
|
|
else
|
|
{
|
|
aw_logd("already arrive max_bitstream_count %d", max_bitstream_count);
|
|
return ;
|
|
}
|
|
}
|
|
|
|
|
|
static int save_file_cnt_2 = 0;
|
|
static int need_save_new_file_2 = 0;
|
|
|
|
void video_stream_cb_2(const AWVideoInput_StreamInfo* stream_info)
|
|
{
|
|
int keyframe = stream_info->keyframe_flag;
|
|
|
|
if (stream_info->size0 == 0 || stream_info->data0 == NULL) {
|
|
aw_logd("stream data error: data = %p, len = %d",stream_info->data0, stream_info->size0);
|
|
return ;
|
|
}
|
|
|
|
if(stream_count_0 < max_bitstream_count)
|
|
{
|
|
//if(stream_count_1%200 == 0)
|
|
{
|
|
//aw_logd("save bitstream[1]: data = %p, len = %d, count = %d\n",
|
|
// data, len, stream_count_1);
|
|
}
|
|
unsigned char file_name[128] = {0};
|
|
unsigned char new_file_name[128] = {0};
|
|
#if (DROP_STREAM_DATA == 0)
|
|
if(stream_count_2%450 == 0)
|
|
need_save_new_file_2 = 1;
|
|
|
|
if((need_save_new_file_2 == 1 && keyframe == 1)
|
|
|| out_file_2 == NULL)
|
|
{
|
|
save_file_cnt_2++;
|
|
sprintf(file_name, "%s_%d.h264", OUT_PUT_FILE_PREFIX_2, save_file_cnt_2);
|
|
aw_logd("save new file, cnt = %d, file_name = %s", stream_count_2, file_name);
|
|
need_save_new_file_2 = 0;
|
|
|
|
if(out_file_2)
|
|
{
|
|
fclose(out_file_2);
|
|
}
|
|
out_file_2 = fopen(file_name, "wb");
|
|
}
|
|
if(out_file_2) {
|
|
if (stream_info->b_insert_sps_pps && stream_info->sps_pps_size && stream_info->sps_pps_buf)
|
|
fwrite(stream_info->sps_pps_buf, 1, stream_info->sps_pps_size, out_file_2);
|
|
|
|
fwrite(stream_info->data0, 1, stream_info->size0, out_file_2);
|
|
|
|
if (stream_info->size1)
|
|
fwrite(stream_info->data1, 1, stream_info->size1, out_file_2);
|
|
if (stream_info->size2)
|
|
fwrite(stream_info->data2, 1, stream_info->size2, out_file_2);
|
|
}
|
|
|
|
if(stream_count_2 == 0)
|
|
{
|
|
uint64_t time = get_cur_time_us();
|
|
/* led_fwrite("/sys/class/gpio_sw/PF6/data", "0"); */
|
|
aw_logw("route 1 save first stream buffer done, time: %lld.%lldms ", time/1000, time%1000);
|
|
sprintf(new_file_name, "%s_%d_%lld.%lldms.h264", OUT_PUT_FILE_PREFIX_2, save_file_cnt_2, time/1000, time%1000);
|
|
rename(file_name, new_file_name);
|
|
}
|
|
stream_count_2++;
|
|
#endif
|
|
|
|
}
|
|
else
|
|
{
|
|
aw_logd("already arrive max_bitstream_count %d", max_bitstream_count);
|
|
return ;
|
|
}
|
|
}
|
|
|
|
|
|
typedef struct {
|
|
unsigned int width;
|
|
unsigned int height;
|
|
unsigned char* argb_addr;
|
|
unsigned int size;
|
|
}BitMapInfoS;
|
|
|
|
|
|
#define MAX_BITMAP_NUM (8)
|
|
BitMapInfoS bit_map_info[MAX_BITMAP_NUM];
|
|
|
|
int init_overlay_info(VideoInputOSD *pOverlayInfo, int index)
|
|
{
|
|
int i = index;
|
|
unsigned char num_bitMap = 1;
|
|
BitMapInfoS* pBitMapInfo;
|
|
unsigned int start_x;
|
|
unsigned int start_y;
|
|
|
|
FILE* icon_hdle = NULL;
|
|
int width = pOverlayInfo->item_info[i].widht;
|
|
int height = pOverlayInfo->item_info[i].height;
|
|
unsigned char *argb_addr = NULL;
|
|
|
|
if(num_bitMap > MAX_BITMAP_NUM)
|
|
{
|
|
aw_logd("error: num_bitmap[%d] is too big", num_bitMap);
|
|
return -1;
|
|
}
|
|
|
|
if (pOverlayInfo->item_info[index].osd_type == RT_NORMAL_OVERLAY
|
|
|| pOverlayInfo->item_info[index].osd_type == RT_LUMA_REVERSE_OVERLAY) {
|
|
int bitmap_size = width * height * 4;
|
|
|
|
icon_hdle = fopen(IN_OSD_ARGB_FILE, "r");
|
|
aw_logd("icon_hdle = %p",icon_hdle);
|
|
if (icon_hdle == NULL)
|
|
{
|
|
aw_loge("get icon_hdle error: %s\n", IN_OSD_ARGB_FILE);
|
|
return -1;
|
|
}
|
|
|
|
if(argb_addr == NULL)
|
|
{
|
|
argb_addr = (unsigned char*)malloc(bitmap_size);
|
|
|
|
if(argb_addr == NULL)
|
|
{
|
|
aw_logd("malloc bit_map_info[%d].argb_addr fail\n", i);
|
|
if (icon_hdle) {
|
|
fclose(icon_hdle);
|
|
icon_hdle = NULL;
|
|
}
|
|
return -1;
|
|
}
|
|
memset(argb_addr, 0, bitmap_size);
|
|
}
|
|
aw_logd("bitMap[%d] size[%d,%d], argb_addr:%p\n", i, width, height, argb_addr);
|
|
|
|
int ret;
|
|
ret = fread(argb_addr, 1, bitmap_size, icon_hdle);
|
|
if(ret != bitmap_size)
|
|
aw_logd("read bitMap[%d] error, ret value:%d\n", i, ret);
|
|
|
|
fseek(icon_hdle, 0, SEEK_SET);
|
|
|
|
fclose(icon_hdle);
|
|
|
|
pOverlayInfo->argb_type = OVERLAY_ARGB8888;
|
|
aw_logd("osd_num:%d, argb_type:%d\n", pOverlayInfo->osd_num, pOverlayInfo->argb_type);
|
|
|
|
start_x = 80;
|
|
start_y = 68;
|
|
|
|
if(width%16 !=0 || height%16 !=0)
|
|
{
|
|
aw_logd("error: w or h is not 16_align: %d, %d", width, height);
|
|
//continue;
|
|
}
|
|
pOverlayInfo->item_info[i].data_buf = argb_addr;
|
|
pOverlayInfo->item_info[i].data_size = bitmap_size;
|
|
|
|
} else if (pOverlayInfo->item_info[index].osd_type == RT_COVER_OSD) {
|
|
aw_logd("osd_type RT_COVER_OSD!");
|
|
} else {
|
|
aw_logd("not support!");
|
|
}
|
|
|
|
aw_logd("osd item info[%d]: x = %d, y = %d, w = %d, h = %d, buf = %p, size = %d",
|
|
i, pOverlayInfo->item_info[i].start_x, pOverlayInfo->item_info[i].start_y,
|
|
pOverlayInfo->item_info[i].widht, pOverlayInfo->item_info[i].height,
|
|
pOverlayInfo->item_info[i].data_buf, pOverlayInfo->item_info[i].data_size);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int catch_jpeg(catch_jpeg_config *p_jpg_config)
|
|
{
|
|
char* buf = NULL;
|
|
int bufLen = p_jpg_config->width*p_jpg_config->height/2;
|
|
int ret = 0;
|
|
AWVideoInput_State channel_state = 0;
|
|
|
|
buf = malloc(bufLen);
|
|
if(buf == NULL)
|
|
{
|
|
aw_logd("catch_jpeg, error: malloc failed");
|
|
return -1;
|
|
}
|
|
memset(buf, 0, bufLen);
|
|
|
|
int loop_cnt = 5;
|
|
int cur_len = bufLen;
|
|
|
|
while(loop_cnt > 0)
|
|
{
|
|
channel_state = AWVideoInput_Get_channel_state(p_jpg_config->channel_id);
|
|
if (AWVideoInput_Get_csi_status(p_jpg_config->channel_id) == 0 || channel_state != VIDEO_INPUT_STATE_EXCUTING) {
|
|
usleep(200*1000);
|
|
aw_logd("jpg wait start");
|
|
continue;
|
|
}
|
|
AWVideoInput_CatchJpegConfig(p_jpg_config);
|
|
cur_len = bufLen;
|
|
ret = AWVideoInput_CatchJpeg(buf, &cur_len, p_jpg_config->channel_id);
|
|
|
|
aw_logd("catch jpeg: buf = %p, size = %d, ret = %d, w = %d, h = %d, cnt = %d\n",
|
|
buf, cur_len, ret, p_jpg_config->width, p_jpg_config->height, loop_cnt);
|
|
usleep(200*1000);
|
|
|
|
if(ret != 0) {
|
|
aw_loge("catch jpeg failed\n");
|
|
free(buf);
|
|
return -1;
|
|
}
|
|
loop_cnt--;
|
|
}
|
|
|
|
FILE* file = fopen(OUT_PUT_FILE_JPEG, "wb");
|
|
if(file == NULL)
|
|
{
|
|
aw_logd("fopen failed\n");
|
|
return -1;
|
|
}
|
|
|
|
fwrite(buf, 1, bufLen, file);
|
|
|
|
fclose(file);
|
|
|
|
free(buf);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int nv12_draw_point(unsigned char* yBuffer, unsigned char* uvBuffer, int w, int h, int x, int y, int yColor, int uColor, int vColor) {
|
|
if (x < 0 || x >= w) return -1;
|
|
if (y < 0 || y >= h) return -1;
|
|
yBuffer[y*w+x] = yColor;
|
|
uvBuffer[(y/2)*w+x/2*2] = uColor;
|
|
uvBuffer[(y/2)*w+x/2*2+1] = vColor;
|
|
return 0;
|
|
}
|
|
|
|
static int nv12_draw_rect(unsigned char* yBuffer, unsigned char* uvBuffer, int w, int h, int left, int top, int right, int bottom, int yColor, int uColor, int vColor) {
|
|
int i;
|
|
for (i = left; i <= right; i++) {
|
|
nv12_draw_point(yBuffer, uvBuffer, w, h, i, top, yColor, uColor, vColor);
|
|
nv12_draw_point(yBuffer, uvBuffer, w, h, i, bottom, yColor, uColor, vColor);
|
|
}
|
|
for (i = top; i <= bottom; i++) {
|
|
nv12_draw_point(yBuffer, uvBuffer, w, h, left, i, yColor, uColor, vColor);
|
|
nv12_draw_point(yBuffer, uvBuffer, w, h, right, i, yColor, uColor, vColor);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int check_cross_rect(int ra[], int rb[]) {
|
|
int left = ra[0] > rb[0] ? ra[0] : rb[0];
|
|
int right = ra[2] < rb[2] ? ra[2] : rb[2];
|
|
int top = ra[1] > rb[1] ? ra[1] : rb[1];
|
|
int bottom = ra[3] < rb[3] ? ra[3] : rb[3];
|
|
int width = right > left ? right - left : 0;
|
|
int height = bottom > top ? bottom - top : 0;
|
|
return width * height;
|
|
}
|
|
RTVencMotionSearchRegion* pMotionSearchResult = NULL;
|
|
int curMotionSearch = 0;
|
|
int lastMotionSearch = -1;
|
|
int useMotionSearch = -1;
|
|
static int score_rect(int r[]) {
|
|
int i;
|
|
if (useMotionSearch < 0 || pMotionSearchResult == NULL) return 1920 * 1080;
|
|
RTVencMotionSearchRegion* result = &pMotionSearchResult[useMotionSearch];
|
|
int score = 0;
|
|
int rect[4];
|
|
for(i = 0; i < 50; i++)
|
|
{
|
|
if (result[i].is_motion) {
|
|
rect[0] = result[i].pix_x_bgn;
|
|
rect[1] = result[i].pix_y_bgn;
|
|
rect[2] = result[i].pix_x_end;
|
|
rect[3] = result[i].pix_y_end;
|
|
score += check_cross_rect(r, rect);
|
|
}
|
|
}
|
|
return score;
|
|
}
|
|
static int get_yuv_frame_data(int channel, VideoInputConfig* config)
|
|
{
|
|
int ret = 0;
|
|
VideoYuvFrame mYuvFrame;
|
|
int cnt = 20;
|
|
int bsave_yuv_data = 1;
|
|
int64_t wait_start_time = 0;
|
|
|
|
out_file_2 = fopen(OUT_PUT_FILE_2, "wb");
|
|
if(out_file_2 == NULL)
|
|
{
|
|
aw_logd("fopen failed");
|
|
}
|
|
#if ENABLE_HUMAN_DETECT
|
|
|
|
// only get once for the same nb file.
|
|
#if 0
|
|
awnn_info_t * nbinfo;
|
|
nbinfo = awnn_get_info(NETWORK_HUMAN);
|
|
aw_logd("%s, %s, %dx%d, %d, %f\n", nbinfo->name, nbinfo->md5, nbinfo->width, nbinfo->height, nbinfo->mem_size, nbinfo->thresh);
|
|
#endif
|
|
|
|
// we can get this info from readme.txt for awnn_get_info()
|
|
float thresh = HUMAN_DET_THRESH; //nbinfo->thresh;
|
|
unsigned int awnn_mem_size = HUMAN_DET_MEM_SIZE; //nbinfo->mem_size;
|
|
aw_logw("%s, %dx%d, mem_size %d, thresh %f\n", NETWORK_HUMAN, HUMAN_DET_WIDTH, HUMAN_DET_HEIGHT, HUMAN_DET_MEM_SIZE, HUMAN_DET_THRESH);
|
|
awnn_init(awnn_mem_size);
|
|
|
|
Awnn_Context_t *context = awnn_create(NETWORK_HUMAN);
|
|
if (!context) {
|
|
aw_loge("Failed to awnn_create\n");
|
|
if (out_file_2) {
|
|
fclose(out_file_2);
|
|
}
|
|
awnn_uninit();
|
|
return -1;
|
|
}
|
|
aw_logd("awnn_create %p ok", context);
|
|
|
|
unsigned char *human_input_buffers[2];
|
|
unsigned char yBuffer[HUMAN_DET_WIDTH * HUMAN_DET_HEIGHT];
|
|
memset(&yBuffer, 0, sizeof(yBuffer));
|
|
unsigned char uvBuffer[HUMAN_DET_WIDTH * HUMAN_DET_HEIGHT / 2];
|
|
memset(&uvBuffer, 0, sizeof(uvBuffer));
|
|
human_input_buffers[0] = yBuffer;
|
|
human_input_buffers[1] = uvBuffer;
|
|
awnn_set_input_buffers(context, human_input_buffers);
|
|
#endif
|
|
while(cnt > 0)
|
|
{
|
|
if (AWVideoInput_Check_Wait_Start(channel)) {
|
|
if (wait_start_time == 0)
|
|
wait_start_time = get_cur_time_us();
|
|
|
|
if (get_cur_time_us() - wait_start_time > WAIT_CSI_TIMEOUT_TIME) {
|
|
aw_loge("wait csi ready more than 5s, exit!");
|
|
return -1;
|
|
}
|
|
|
|
usleep(200*1000);
|
|
aw_logd("wait start");
|
|
continue;
|
|
}
|
|
|
|
memset(&mYuvFrame, 0, sizeof(VideoYuvFrame));
|
|
ret = AWVideoInput_GetYuvFrame(channel, &mYuvFrame);
|
|
|
|
#if ENABLE_HUMAN_DETECT
|
|
if (0 == ret)
|
|
{
|
|
aw_logd("ret = %d, cnt = %d; YuvFrame: buf %dx%d data %dx%d; phyAddr = %p, %p, %p, virAddr = %p, %p, %p\n",
|
|
ret, cnt, mYuvFrame.widht, mYuvFrame.height, config->width, config->height,
|
|
mYuvFrame.phyAddr[0], mYuvFrame.phyAddr[1], mYuvFrame.phyAddr[2],
|
|
mYuvFrame.virAddr[0], mYuvFrame.virAddr[1], mYuvFrame.virAddr[2]);
|
|
|
|
memcpy(yBuffer, mYuvFrame.virAddr[0], config->width * config->height);
|
|
memcpy(uvBuffer, mYuvFrame.virAddr[1], config->width * config->height / 2);
|
|
|
|
awnn_run(context);
|
|
|
|
Awnn_Post_t post;
|
|
post.type = NETWORK_HUMAN_POST_TYPE;
|
|
post.width = HUMAN_DET_WIDTH;
|
|
post.height = HUMAN_DET_HEIGHT;
|
|
post.thresh = thresh;
|
|
Awnn_Result_t res;
|
|
memset(&res, 0, sizeof(Awnn_Result_t));
|
|
awnn_det_post(context, &post, &res);
|
|
|
|
aw_logw("awnn detect valid_cnt = %d, current time:%lld\n", res.valid_cnt, get_cur_time_us());
|
|
for(int i = 0; i < res.valid_cnt; i++) {
|
|
if (res.boxes[i].label == 0) {
|
|
int rect[] = {
|
|
res.boxes[i].xmin * mparam.c0_src_w / config->width,
|
|
res.boxes[i].ymin * mparam.c0_src_w / config->width,
|
|
res.boxes[i].xmax * mparam.c0_src_w / config->width,
|
|
res.boxes[i].ymax * mparam.c0_src_w / config->width};
|
|
int score = score_rect(rect);
|
|
int w = res.boxes[i].xmax - res.boxes[i].xmin;
|
|
int h = res.boxes[i].ymax - res.boxes[i].ymin;
|
|
float percentage = (w * h) / (config->width * config->height);
|
|
aw_logw("[%d/%d] cls %d, prob %f, rect %d, %d, %d, %d, score %d, percentage=%.4f\n", i+1, res.valid_cnt, res.boxes[i].label, res.boxes[i].score,
|
|
res.boxes[i].xmin, res.boxes[i].ymin, res.boxes[i].xmax, res.boxes[i].ymax, score, percentage);
|
|
if ((score == 0 && res.boxes[i].score < 0.6) || // 无移动数据,阈值<0.6则忽略
|
|
(percentage < 0.002 && res.boxes[i].score < 0.6) || // 检测区域太小,阈值<0.6则忽略
|
|
(percentage > 0.8 && res.boxes[i].score < 0.8) || // 检测区域太大,阈值<0.8则忽略
|
|
(w > h && res.boxes[i].score < 0.8)) {// 宽大于高,阈值<0.8则忽略
|
|
aw_logd("skip rect %d %d\n", w, h);
|
|
continue;
|
|
}
|
|
nv12_draw_rect(mYuvFrame.virAddr[0], mYuvFrame.virAddr[1], config->width, config->height,
|
|
res.boxes[i].xmin, res.boxes[i].ymin, res.boxes[i].xmax, res.boxes[i].ymax, 0x96, 0x2C, 0x15);
|
|
}
|
|
}
|
|
useMotionSearch = lastMotionSearch;
|
|
|
|
usleep(100*1000);
|
|
}
|
|
else
|
|
{
|
|
aw_loge("AWVideoInput_GetYuvFrame failed! ret=%d", ret);
|
|
}
|
|
#endif
|
|
|
|
if(ret == 0)
|
|
{
|
|
int buf_size = mYuvFrame.widht*mYuvFrame.height*3/2;
|
|
if(bsave_yuv_data == 1 && out_file_2 != NULL)
|
|
fwrite(mYuvFrame.virAddr[0], 1, buf_size, out_file_2);
|
|
|
|
AWVideoInput_ReleaseYuvFrame(channel, &mYuvFrame);
|
|
}
|
|
if (ret != 0) {
|
|
aw_logd("Getting yuv failed, break!");
|
|
break;
|
|
}
|
|
#if 0
|
|
RTIspExpGain expgain;
|
|
AWVideoInput_GetExpGain(channel, &expgain);
|
|
aw_loge("exp:%d, again:%d, rgain:%d, bgain:%d\n",
|
|
expgain.exp_val, expgain.gain_val, expgain.r_gain, expgain.b_gain);
|
|
|
|
#endif
|
|
|
|
cnt--;
|
|
}
|
|
|
|
#if ENABLE_HUMAN_DETECT
|
|
if (context)
|
|
{
|
|
aw_logd("awnn_destroy %p", context);
|
|
awnn_destroy(context);
|
|
context = NULL;
|
|
}
|
|
|
|
aw_logd("awnn_uninit");
|
|
awnn_uninit();
|
|
#endif
|
|
|
|
if (out_file_2 != NULL)
|
|
fclose(out_file_2);
|
|
return 0;
|
|
}
|
|
|
|
#if ENABLE_GET_BIN_IMAGE_DATA
|
|
static int get_bin_image_data(int channel, VideoInputConfig* config)
|
|
{
|
|
int ret = 0;
|
|
FILE* file = fopen(OUT_PUT_FILE_BIN_IMAGE, "wb");
|
|
if(file == NULL)
|
|
{
|
|
aw_logd("fopen failed");
|
|
return -1;
|
|
}
|
|
|
|
int ctu_size = 32;
|
|
int log2_ctu_size_sqrt = 5;
|
|
//int w_in_4ctu_align = 0;
|
|
int w_in_ctu = 0;
|
|
int h_in_ctu = 0;
|
|
|
|
//w_in_4ctu_align = (ALIGN_XXB(ctu_size*4, config->width)) >> log2_ctu_size_sqrt;
|
|
h_in_ctu = (ALIGN_XXB(ctu_size, config->height)) >> log2_ctu_size_sqrt;
|
|
w_in_ctu = (ALIGN_XXB(ctu_size, config->width)) >> log2_ctu_size_sqrt;
|
|
|
|
unsigned int buf_size = ALIGN_XXB(2, w_in_ctu * h_in_ctu) * 2;
|
|
|
|
unsigned char* tmp_buf = malloc(buf_size);
|
|
if(tmp_buf == NULL)
|
|
{
|
|
aw_logd("malloc failed\n");
|
|
abort();
|
|
}
|
|
memset(tmp_buf, 0, buf_size);
|
|
|
|
ret = AWVideoInput_GetBinImageData(channel, tmp_buf, buf_size);
|
|
|
|
aw_logd("get_bin_image_data: buf_size = %d, ret = %d\n", buf_size, ret);
|
|
|
|
//* analyze the bin image info
|
|
int x = 0;
|
|
int y = 0;
|
|
unsigned char* data_buf = tmp_buf;
|
|
int count = 0;
|
|
for(y = 0; y < h_in_ctu; y++)
|
|
{
|
|
//* 1ctu(32x32) = 16x8x8 : 8x8 mb need 1 bit, every ctu need 2 bytes;
|
|
for(x = 0; x < w_in_ctu; x++)
|
|
{
|
|
data_buf++;
|
|
data_buf++;
|
|
count += 2;
|
|
}
|
|
}
|
|
aw_logd("get_bin_image_data: analyze count = %d\n", count);
|
|
|
|
fwrite(tmp_buf, 1, buf_size, file);
|
|
fclose(file);
|
|
free(tmp_buf);
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#if ENABLE_GET_MV_INFO_DATA
|
|
static int get_mv_info_data_h264(int channel, VideoInputConfig* config)
|
|
{
|
|
int ret = 0;
|
|
FILE* file = fopen(OUT_PUT_FILE_MV_INFO, "wb");
|
|
if(file == NULL)
|
|
{
|
|
aw_logd("fopen failed");
|
|
return -1;
|
|
}
|
|
|
|
unsigned char* tmp_buf = NULL;
|
|
unsigned int mv_info_len = 0;
|
|
|
|
int widthMb = (ALIGN_XXB(16, config->width)) >> 4;
|
|
int heightMb = (ALIGN_XXB(16, config->height)) >> 4;
|
|
int widthMb_align4 = ALIGN_XXB(4, widthMb); //((widthMb + 3) & (~3));
|
|
mv_info_len = widthMb_align4 * heightMb * 8;
|
|
|
|
tmp_buf = malloc(mv_info_len);
|
|
if(tmp_buf == NULL)
|
|
{
|
|
aw_logd("malloc failed\n");
|
|
abort();
|
|
}
|
|
memset(tmp_buf, 0, mv_info_len);
|
|
|
|
ret = AWVideoInput_GetMvInfoData(channel, tmp_buf, mv_info_len);
|
|
|
|
aw_logd("get_mv_info_data_h264: mv_info_len = %d, ret = %d\n", mv_info_len, ret);
|
|
|
|
//* analyze the mv_info
|
|
long long *mv_info_parcel;
|
|
int mvx, mvy, mb_type;
|
|
int w, h, k;
|
|
k = 0;
|
|
|
|
for(h = 0; h < heightMb; h++)
|
|
{
|
|
for(w = 0; w < widthMb_align4; w++)
|
|
{
|
|
mv_info_parcel = (long long *)(tmp_buf) + k;
|
|
k++;
|
|
if(w < widthMb)// inside the picture
|
|
{
|
|
mb_type = (((*mv_info_parcel) >> 55) & 0x1); // intra: 1; inter: 0
|
|
mvx = ((*mv_info_parcel) >> 47) & (0x00ff);
|
|
mvy = ((*mv_info_parcel) >> 40) & (0x007f);
|
|
mvx = (mvx & 0x80) ? (mvx | (~0xff)) : mvx;
|
|
mvy = (mvy & 0x40) ? (mvy | (~0x7f)) : mvy;
|
|
}
|
|
}
|
|
}
|
|
|
|
aw_logd("get_mv_info_data_h264: analyze mv info, k = %d\n", k);
|
|
|
|
fwrite(tmp_buf, 1, mv_info_len, file);
|
|
fclose(file);
|
|
free(tmp_buf);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int get_mv_info_data_h265(int channel, VideoInputConfig* config)
|
|
{
|
|
int ret = 0;
|
|
FILE* file = fopen(OUT_PUT_FILE_MV_INFO, "wb");
|
|
if(file == NULL)
|
|
{
|
|
aw_logd("fopen failed");
|
|
return -1;
|
|
}
|
|
|
|
unsigned char* tmp_buf = NULL;
|
|
unsigned int mv_info_len = 0;
|
|
|
|
int ctu_size = 32;
|
|
int log2_ctu_size_sqrt = 5;
|
|
int w_in_4ctu_align = 0;
|
|
int h_in_ctu = 0;
|
|
w_in_4ctu_align = (ALIGN_XXB(ctu_size*4, config->width)) >> log2_ctu_size_sqrt;
|
|
h_in_ctu = (ALIGN_XXB(ctu_size, config->height)) >> log2_ctu_size_sqrt;
|
|
|
|
unsigned int width_in_ctu_16align = ALIGN_XXB(16, w_in_4ctu_align);
|
|
mv_info_len = width_in_ctu_16align * h_in_ctu * 16;
|
|
|
|
tmp_buf = malloc(mv_info_len);
|
|
if(tmp_buf == NULL)
|
|
{
|
|
aw_logd("malloc failed\n");
|
|
abort();
|
|
}
|
|
memset(tmp_buf, 0, mv_info_len);
|
|
|
|
ret = AWVideoInput_GetMvInfoData(channel, tmp_buf, mv_info_len);
|
|
|
|
aw_logd("get_mv_info_data_h265: mv_info_len = %d, ret = %d\n", mv_info_len, ret);
|
|
|
|
//* analyze the mv_info
|
|
int mvx, mvy, mb_type;
|
|
int w, h, k, n;
|
|
k = 0;
|
|
unsigned int *mv_info_parcel;
|
|
int ctu_width = width_in_ctu_16align;
|
|
int ctu_height = h_in_ctu;
|
|
|
|
for(h = 0; h < ctu_height; h++)
|
|
{
|
|
for(w = 0; w < ctu_width; w++)
|
|
{
|
|
for(n = 0; n < 4; n++) // 4 16x16 block in ctu
|
|
{
|
|
int curx = 32 * w + (n % 2) * 16;
|
|
int cury = 32 * h + (n / 2) * 16;
|
|
mv_info_parcel = (unsigned int *)tmp_buf + k;
|
|
if(curx < config->width && cury < config->height) // inside the picture
|
|
{
|
|
mb_type = (((*mv_info_parcel) >> 19) & 0x1); // intra: 1; inter: 0
|
|
mvx = ((*mv_info_parcel) >> 0) & (0x00ff);
|
|
mvy = ((*mv_info_parcel) >> 10) & (0x007f);
|
|
mvx = (mvx & 0x80) ? (mvx | (~0xff)) : mvx;
|
|
mvy = (mvy & 0x40) ? (mvy | (~0x7f)) : mvy;
|
|
}
|
|
k++;
|
|
} // n
|
|
} // w
|
|
} // h
|
|
|
|
aw_logd("get_mv_info_data_h265: analyze mv info, k = %d\n", k);
|
|
|
|
fwrite(tmp_buf, 1, mv_info_len, file);
|
|
fclose(file);
|
|
free(tmp_buf);
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
static int reset_size(int channel_id, VideoInputOSD *pOverlayInfo)
|
|
{
|
|
int loop_cnt = 1;
|
|
int reset_w = 1920;
|
|
int reset_h = 1080;
|
|
|
|
aw_logd("start reset size");
|
|
//usleep(1*1000*1000);
|
|
|
|
while(loop_cnt > 0)
|
|
{
|
|
reset_w = 1280;
|
|
reset_h = 720;
|
|
|
|
AWVideoInput_Start(channel_id, 0);
|
|
AWVideoInput_ResetSize(channel_id, reset_w, reset_h);
|
|
|
|
#if 0
|
|
if(out_file_0)
|
|
{
|
|
fclose(out_file_0);
|
|
out_file_0 = fopen(OUT_PUT_FILE_0_1, "wb");
|
|
}
|
|
#endif
|
|
|
|
aw_logd("reset size[%dx%d], loop_cnt = %d -- reopen : %p, path = %s",reset_w, reset_h, loop_cnt, out_file_0, OUT_PUT_FILE_0_1);
|
|
|
|
AWVideoInput_Start(channel_id, 1);
|
|
|
|
usleep(2*1000*1000);
|
|
|
|
#if ENABLE_OSD_FUNCTION
|
|
AWVideoInput_SetOSD(channel_id, pOverlayInfo);
|
|
#endif
|
|
|
|
#if 1
|
|
usleep(1*1000*1000);
|
|
|
|
reset_w = 1920;
|
|
reset_h = 1080;
|
|
AWVideoInput_Start(channel_id, 0);
|
|
AWVideoInput_ResetSize(channel_id, reset_w, reset_h);
|
|
|
|
#if 0
|
|
if(out_file_0)
|
|
{
|
|
fclose(out_file_0);
|
|
out_file_0 = fopen("/tmp/stream0-2.h264", "wb");
|
|
}
|
|
#endif
|
|
|
|
aw_logd("reset size[%dx%d], loop_cnt = %d -- reopen : %p, path = %s",reset_w, reset_h, loop_cnt, out_file_0, OUT_PUT_FILE_0_1);
|
|
|
|
AWVideoInput_Start(channel_id, 1);
|
|
|
|
#if ENABLE_OSD_FUNCTION
|
|
AWVideoInput_SetOSD(channel_id, pOverlayInfo);
|
|
#endif
|
|
|
|
usleep(1*1000*1000);
|
|
#endif
|
|
loop_cnt--;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//int initSharpFunc(RTsEncppSharpParamDynamic *pSharpParamDynamic, RTsEncppSharpParamStatic *pSharpParamStatic)
|
|
//{
|
|
// pSharpParamDynamic->ss_ns_lw = 0; //[0,255];
|
|
// pSharpParamDynamic->ss_ns_hi = 0; //[0,255];
|
|
// pSharpParamDynamic->ls_ns_lw = 0; //[0,255];
|
|
// pSharpParamDynamic->ls_ns_hi = 0; //[0,255];
|
|
// pSharpParamDynamic->ss_lw_cor = 0; //[0,255];
|
|
// pSharpParamDynamic->ss_hi_cor = 0; //[0,255];
|
|
// pSharpParamDynamic->ls_lw_cor = 0; //[0,255];
|
|
// pSharpParamDynamic->ls_hi_cor = 0; //[0,255];
|
|
// pSharpParamDynamic->ss_blk_stren = 256; //[0,4095];
|
|
// pSharpParamDynamic->ss_wht_stren = 256; //[0,4095];
|
|
// pSharpParamDynamic->ls_blk_stren = 256; //[0,4095];
|
|
// pSharpParamDynamic->ls_wht_stren = 256; //[0,4095];
|
|
// pSharpParamDynamic->wht_clp_para = 256; //[0,1023];
|
|
// pSharpParamDynamic->blk_clp_para = 256; //[0,1023];
|
|
// pSharpParamDynamic->ss_avg_smth = 0; //[0,255];
|
|
// pSharpParamDynamic->hfr_mf_blk_stren = 0; //[0,4095];
|
|
// pSharpParamDynamic->hfr_hf_blk_stren = 0; //[0,4095];
|
|
// pSharpParamDynamic->hfr_hf_wht_clp = 32; //[0,255];
|
|
// pSharpParamDynamic->hfr_hf_cor_ratio = 0; //[0,255];
|
|
// pSharpParamDynamic->hfr_mf_mix_ratio = 390; //[0,1023];
|
|
// pSharpParamDynamic->ss_dir_smth = 0; //[0,16];
|
|
// pSharpParamDynamic->wht_clp_slp = 16; //[0,63];
|
|
// pSharpParamDynamic->blk_clp_slp = 8; //[0,63];
|
|
// pSharpParamDynamic->max_clp_ratio = 64; //[0,255];
|
|
// pSharpParamDynamic->hfr_hf_blk_clp = 32; //[0,255];
|
|
// pSharpParamDynamic->hfr_smth_ratio = 0; //[0,32];
|
|
// pSharpParamDynamic->dir_smth[0] = 0; //[0,16];
|
|
// pSharpParamDynamic->dir_smth[1] = 0; //[0,16];
|
|
// pSharpParamDynamic->dir_smth[2] = 0; //[0,16];
|
|
// pSharpParamDynamic->dir_smth[3] = 0; //[0,16];
|
|
// pSharpParamStatic->ss_shp_ratio = 0; //[0,255];
|
|
// pSharpParamStatic->ls_shp_ratio = 0; //[0,255];
|
|
// pSharpParamStatic->ss_dir_ratio = 98; //[0,1023];
|
|
// pSharpParamStatic->ls_dir_ratio = 90; //[0,1023];
|
|
// pSharpParamStatic->ss_crc_stren = 128; //[0,1023];
|
|
// pSharpParamStatic->ss_crc_min = 16; //[0,255];
|
|
// pSharpParamDynamic->hfr_mf_blk_clp = 32; //[0,255];
|
|
// pSharpParamDynamic->hfr_mf_wht_clp = 32; //[0,255];
|
|
// pSharpParamDynamic->hfr_hf_wht_stren = 0; //[0,4095];
|
|
// pSharpParamDynamic->hfr_mf_wht_stren = 0; //[0,4095];
|
|
// pSharpParamDynamic->hfr_mf_cor_ratio = 0; //[0,255];
|
|
// pSharpParamDynamic->hfr_hf_mix_ratio = 390; //[0,1023];
|
|
// pSharpParamDynamic->hfr_hf_mix_min_ratio = 0; //[0,255];
|
|
// pSharpParamDynamic->hfr_mf_mix_min_ratio = 0; //[0,255];
|
|
//
|
|
// pSharpParamStatic->sharp_ss_value[0]=384;
|
|
// pSharpParamStatic->sharp_ss_value[1]=416;
|
|
// pSharpParamStatic->sharp_ss_value[2]=471;
|
|
// pSharpParamStatic->sharp_ss_value[3]=477;
|
|
// pSharpParamStatic->sharp_ss_value[4]=443;
|
|
// pSharpParamStatic->sharp_ss_value[5]=409;
|
|
// pSharpParamStatic->sharp_ss_value[6]=374;
|
|
// pSharpParamStatic->sharp_ss_value[7]=340;
|
|
// pSharpParamStatic->sharp_ss_value[8]=306;
|
|
// pSharpParamStatic->sharp_ss_value[9]=272;
|
|
// pSharpParamStatic->sharp_ss_value[10]=237;
|
|
// pSharpParamStatic->sharp_ss_value[11]=203;
|
|
// pSharpParamStatic->sharp_ss_value[12]=169;
|
|
// pSharpParamStatic->sharp_ss_value[13]=134;
|
|
// pSharpParamStatic->sharp_ss_value[14]=100;
|
|
// pSharpParamStatic->sharp_ss_value[15]=66;
|
|
// pSharpParamStatic->sharp_ss_value[16]=41;
|
|
// pSharpParamStatic->sharp_ss_value[17]=32;
|
|
// pSharpParamStatic->sharp_ss_value[18]=32;
|
|
// pSharpParamStatic->sharp_ss_value[19]=32;
|
|
// pSharpParamStatic->sharp_ss_value[20]=32;
|
|
// pSharpParamStatic->sharp_ss_value[21]=32;
|
|
// pSharpParamStatic->sharp_ss_value[22]=32;
|
|
// pSharpParamStatic->sharp_ss_value[23]=32;
|
|
// pSharpParamStatic->sharp_ss_value[24]=32;
|
|
// pSharpParamStatic->sharp_ss_value[25]=32;
|
|
// pSharpParamStatic->sharp_ss_value[26]=32;
|
|
// pSharpParamStatic->sharp_ss_value[27]=32;
|
|
// pSharpParamStatic->sharp_ss_value[28]=32;
|
|
// pSharpParamStatic->sharp_ss_value[29]=32;
|
|
// pSharpParamStatic->sharp_ss_value[30]=32;
|
|
// pSharpParamStatic->sharp_ss_value[31]=32;
|
|
// pSharpParamStatic->sharp_ss_value[32]=32;
|
|
//
|
|
// pSharpParamStatic->sharp_ls_value[0]=384;
|
|
// pSharpParamStatic->sharp_ls_value[1]=395;
|
|
// pSharpParamStatic->sharp_ls_value[2]=427;
|
|
// pSharpParamStatic->sharp_ls_value[3]=470;
|
|
// pSharpParamStatic->sharp_ls_value[4]=478;
|
|
// pSharpParamStatic->sharp_ls_value[5]=416;
|
|
// pSharpParamStatic->sharp_ls_value[6]=320;
|
|
// pSharpParamStatic->sharp_ls_value[7]=224;
|
|
// pSharpParamStatic->sharp_ls_value[8]=152;
|
|
// pSharpParamStatic->sharp_ls_value[9]=128;
|
|
// pSharpParamStatic->sharp_ls_value[10]=128;
|
|
// pSharpParamStatic->sharp_ls_value[11]=128;
|
|
// pSharpParamStatic->sharp_ls_value[12]=128;
|
|
// pSharpParamStatic->sharp_ls_value[13]=128;
|
|
// pSharpParamStatic->sharp_ls_value[14]=128;
|
|
// pSharpParamStatic->sharp_ls_value[15]=128;
|
|
// pSharpParamStatic->sharp_ls_value[16]=128;
|
|
// pSharpParamStatic->sharp_ls_value[17]=128;
|
|
// pSharpParamStatic->sharp_ls_value[18]=128;
|
|
// pSharpParamStatic->sharp_ls_value[19]=128;
|
|
// pSharpParamStatic->sharp_ls_value[20]=128;
|
|
// pSharpParamStatic->sharp_ls_value[21]=128;
|
|
// pSharpParamStatic->sharp_ls_value[22]=128;
|
|
// pSharpParamStatic->sharp_ls_value[23]=128;
|
|
// pSharpParamStatic->sharp_ls_value[24]=128;
|
|
// pSharpParamStatic->sharp_ls_value[25]=128;
|
|
// pSharpParamStatic->sharp_ls_value[26]=128;
|
|
// pSharpParamStatic->sharp_ls_value[27]=128;
|
|
// pSharpParamStatic->sharp_ls_value[28]=128;
|
|
// pSharpParamStatic->sharp_ls_value[29]=128;
|
|
// pSharpParamStatic->sharp_ls_value[30]=128;
|
|
// pSharpParamStatic->sharp_ls_value[31]=128;
|
|
// pSharpParamStatic->sharp_ls_value[32]=128;
|
|
//
|
|
// pSharpParamStatic->sharp_hsv[0]=218;
|
|
// pSharpParamStatic->sharp_hsv[1]=206;
|
|
// pSharpParamStatic->sharp_hsv[2]=214;
|
|
// pSharpParamStatic->sharp_hsv[3]=247;
|
|
// pSharpParamStatic->sharp_hsv[4]=282;
|
|
// pSharpParamStatic->sharp_hsv[5]=299;
|
|
// pSharpParamStatic->sharp_hsv[6]=308;
|
|
// pSharpParamStatic->sharp_hsv[7]=316;
|
|
// pSharpParamStatic->sharp_hsv[8]=325;
|
|
// pSharpParamStatic->sharp_hsv[9]=333;
|
|
// pSharpParamStatic->sharp_hsv[10]=342;
|
|
// pSharpParamStatic->sharp_hsv[11]=350;
|
|
// pSharpParamStatic->sharp_hsv[12]=359;
|
|
// pSharpParamStatic->sharp_hsv[13]=367;
|
|
// pSharpParamStatic->sharp_hsv[14]=376;
|
|
// pSharpParamStatic->sharp_hsv[15]=380;
|
|
// pSharpParamStatic->sharp_hsv[16]=375;
|
|
// pSharpParamStatic->sharp_hsv[17]=366;
|
|
// pSharpParamStatic->sharp_hsv[18]=358;
|
|
// pSharpParamStatic->sharp_hsv[19]=349;
|
|
// pSharpParamStatic->sharp_hsv[20]=341;
|
|
// pSharpParamStatic->sharp_hsv[21]=332;
|
|
// pSharpParamStatic->sharp_hsv[22]=324;
|
|
// pSharpParamStatic->sharp_hsv[23]=315;
|
|
// pSharpParamStatic->sharp_hsv[24]=307;
|
|
// pSharpParamStatic->sharp_hsv[25]=298;
|
|
// pSharpParamStatic->sharp_hsv[26]=290;
|
|
// pSharpParamStatic->sharp_hsv[27]=281;
|
|
// pSharpParamStatic->sharp_hsv[28]=273;
|
|
// pSharpParamStatic->sharp_hsv[29]=264;
|
|
// pSharpParamStatic->sharp_hsv[30]=258;
|
|
// pSharpParamStatic->sharp_hsv[31]=256;
|
|
// pSharpParamStatic->sharp_hsv[32]=256;
|
|
// pSharpParamStatic->sharp_hsv[33]=256;
|
|
// pSharpParamStatic->sharp_hsv[34]=256;
|
|
// pSharpParamStatic->sharp_hsv[35]=256;
|
|
// pSharpParamStatic->sharp_hsv[36]=256;
|
|
// pSharpParamStatic->sharp_hsv[37]=256;
|
|
// pSharpParamStatic->sharp_hsv[38]=256;
|
|
// pSharpParamStatic->sharp_hsv[39]=256;
|
|
// pSharpParamStatic->sharp_hsv[40]=256;
|
|
// pSharpParamStatic->sharp_hsv[41]=256;
|
|
// pSharpParamStatic->sharp_hsv[42]=256;
|
|
// pSharpParamStatic->sharp_hsv[43]=256;
|
|
// pSharpParamStatic->sharp_hsv[44]=256;
|
|
// pSharpParamStatic->sharp_hsv[45]=256;
|
|
//
|
|
// pSharpParamDynamic->sharp_edge_lum[0]=128;
|
|
// pSharpParamDynamic->sharp_edge_lum[1]=144;
|
|
// pSharpParamDynamic->sharp_edge_lum[2]=160;
|
|
// pSharpParamDynamic->sharp_edge_lum[3]=176;
|
|
// pSharpParamDynamic->sharp_edge_lum[4]=192;
|
|
// pSharpParamDynamic->sharp_edge_lum[5]=208;
|
|
// pSharpParamDynamic->sharp_edge_lum[6]=224;
|
|
// pSharpParamDynamic->sharp_edge_lum[7]=240;
|
|
// pSharpParamDynamic->sharp_edge_lum[8]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[9]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[10]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[11]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[12]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[13]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[14]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[15]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[16]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[17]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[18]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[19]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[20]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[21]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[22]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[23]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[24]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[25]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[26]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[27]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[28]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[29]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[30]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[31]=256;
|
|
// pSharpParamDynamic->sharp_edge_lum[32]=256;
|
|
//
|
|
//#if 0
|
|
// pSharpParamDynamic->roi_num = 0; //<=8
|
|
// pSharpParamDynamic->roi_item[0].x = 40;
|
|
// pSharpParamDynamic->roi_item[0].y = 59;
|
|
// pSharpParamDynamic->roi_item[0].width = 32;
|
|
// pSharpParamDynamic->roi_item[0].height = 32;
|
|
//
|
|
//
|
|
// pSharpParam->roi_item[1].x = 40;
|
|
// pSharpParam->roi_item[1].y = 59;
|
|
// pSharpParam->roi_item[1].width = 32;
|
|
// pSharpParam->roi_item[1].height = 32;
|
|
//
|
|
// pSharpParam->roi_item[2].x = 40;
|
|
// pSharpParam->roi_item[2].y = 59;
|
|
// pSharpParam->roi_item[2].width = 32;
|
|
// pSharpParam->roi_item[2].height = 32;
|
|
//
|
|
// pSharpParam->roi_item[3].x = 40;
|
|
// pSharpParam->roi_item[3].y = 59;
|
|
// pSharpParam->roi_item[3].width = 32;
|
|
// pSharpParam->roi_item[3].height = 32;
|
|
//
|
|
// pSharpParam->roi_item[4].x = 40;
|
|
// pSharpParam->roi_item[4].y = 59;
|
|
// pSharpParam->roi_item[4].width = 32;
|
|
// pSharpParam->roi_item[4].height = 32;
|
|
//
|
|
// pSharpParam->roi_item[5].x = 40;
|
|
// pSharpParam->roi_item[5].y = 59;
|
|
// pSharpParam->roi_item[5].width = 32;
|
|
// pSharpParam->roi_item[5].height = 32;
|
|
//
|
|
// pSharpParam->roi_item[6].x = 40;
|
|
// pSharpParam->roi_item[6].y = 59;
|
|
// pSharpParam->roi_item[6].width = 32;
|
|
// pSharpParam->roi_item[6].height = 32;
|
|
//
|
|
// pSharpParam->roi_item[7].x = 40;
|
|
// pSharpParam->roi_item[7].y = 59;
|
|
// pSharpParam->roi_item[7].width = 32;
|
|
// pSharpParam->roi_item[7].height = 32;
|
|
//#endif
|
|
//
|
|
// return 0;
|
|
//}
|
|
static void init_motion_search_param(RTVencMotionSearchParam *motion_search_param)
|
|
{
|
|
motion_search_param->en_motion_search = 1;
|
|
motion_search_param->dis_default_para = 1;
|
|
motion_search_param->hor_region_num = MOTION_SEARCH_HOR_NUM;
|
|
motion_search_param->ver_region_num = MOTION_SEARCH_VER_NUM;
|
|
motion_search_param->large_mv_th = 20;
|
|
motion_search_param->large_mv_ratio_th = 12.0f;
|
|
motion_search_param->non_zero_mv_ratio_th = 20.0f;
|
|
motion_search_param->large_sad_ratio_th = 30.0f;
|
|
return ;
|
|
}
|
|
static void init_roi(RTVencROIConfig *sRoiConfig)
|
|
{
|
|
sRoiConfig[0].bEnable = 1;
|
|
sRoiConfig[0].index = 0;
|
|
sRoiConfig[0].nQPoffset = -10;
|
|
sRoiConfig[0].sRect.nLeft = 0;
|
|
sRoiConfig[0].sRect.nTop = 0;
|
|
sRoiConfig[0].sRect.nWidth = 150;
|
|
sRoiConfig[0].sRect.nHeight = 500;
|
|
|
|
sRoiConfig[1].bEnable = 1;
|
|
sRoiConfig[1].index = 1;
|
|
sRoiConfig[1].nQPoffset = -5;
|
|
sRoiConfig[1].sRect.nLeft = 320;
|
|
sRoiConfig[1].sRect.nTop = 180;
|
|
sRoiConfig[1].sRect.nWidth = 320;
|
|
sRoiConfig[1].sRect.nHeight = 180;
|
|
|
|
sRoiConfig[2].bEnable = 1;
|
|
sRoiConfig[2].index = 2;
|
|
sRoiConfig[2].nQPoffset = -5;
|
|
sRoiConfig[2].sRect.nLeft = 320;
|
|
sRoiConfig[2].sRect.nTop = 180;
|
|
sRoiConfig[2].sRect.nWidth = 320;
|
|
sRoiConfig[2].sRect.nHeight = 180;
|
|
|
|
sRoiConfig[3].bEnable = 1;
|
|
sRoiConfig[3].index = 3;
|
|
sRoiConfig[3].nQPoffset = -5;
|
|
sRoiConfig[3].sRect.nLeft = 320;
|
|
sRoiConfig[3].sRect.nTop = 180;
|
|
sRoiConfig[3].sRect.nWidth = 320;
|
|
sRoiConfig[3].sRect.nHeight = 180;
|
|
}
|
|
|
|
static void init_2d_3d_param(RTs2DfilterParam *p2DfilterParam, RTs3DfilterParam *p3DfilterParam)
|
|
{
|
|
//init 2dfilter(2dnr) is open
|
|
p2DfilterParam->enable_2d_filter = 1;
|
|
p2DfilterParam->filter_strength_y = 127;
|
|
p2DfilterParam->filter_strength_uv = 128;
|
|
p2DfilterParam->filter_th_y = 11;
|
|
p2DfilterParam->filter_th_uv = 7;
|
|
|
|
//init 3dfilter(3dnr) is open
|
|
p3DfilterParam->enable_3d_filter = 1;
|
|
p3DfilterParam->adjust_pix_level_enable = 0;
|
|
p3DfilterParam->smooth_filter_enable = 1;
|
|
p3DfilterParam->max_pix_diff_th = 6;
|
|
p3DfilterParam->max_mv_th = 8;
|
|
p3DfilterParam->max_mad_th = 16;
|
|
p3DfilterParam->min_coef = 13;
|
|
p3DfilterParam->max_coef = 16;
|
|
return ;
|
|
}
|
|
|
|
static int motion_search_thread(void* param)
|
|
{
|
|
#if ENABLE_GET_MOTION_SEARCH_RESULT
|
|
if (mparam.c0_encoder_format == 1)
|
|
return -1;
|
|
usleep(2*1000*1000);
|
|
int channel_id = *(int *)param;
|
|
int ret = 0;
|
|
int i = 0;
|
|
curMotionSearch = 0;
|
|
int count = MOTION_SEARCH_TOTAL_NUM;
|
|
int result_len = count*sizeof(RTVencMotionSearchRegion);
|
|
pMotionSearchResult = (RTVencMotionSearchRegion *)malloc(result_len*3);
|
|
memset(pMotionSearchResult, 0, result_len*3);
|
|
aw_logd("result_len = %d", result_len);
|
|
for (int j = 0; j < 60; j++) {
|
|
RTVencMotionSearchResult sMotion_result;
|
|
RTVencMotionSearchRegion* region = &pMotionSearchResult[curMotionSearch];
|
|
memset(region, 0, result_len);
|
|
memset(&sMotion_result, 0, sizeof(RTVencMotionSearchResult));
|
|
|
|
sMotion_result.region = region;
|
|
aw_logd("get motion search result = %d", j);
|
|
ret = AWVideoInput_GetMotionSearchResult(channel_id, &sMotion_result);
|
|
for(i = 0; i < count; i++)
|
|
{
|
|
if (region[i].is_motion)
|
|
aw_logd("i = %d, totalN = %d, intraN = %d, largeMvN = %d, smallMvN = %d, zeroMvN = %d, largeSadN = %d, is_motion = %d, region:%d,%d,%d,%d",
|
|
i, region[i].total_num, region[i].intra_num,
|
|
region[i].large_mv_num, region[i].small_mv_num,
|
|
region[i].zero_mv_num, region[i].large_sad_num,
|
|
region[i].is_motion,
|
|
region[i].pix_x_bgn, region[i].pix_x_end,
|
|
region[i].pix_y_bgn, region[i].pix_y_end);
|
|
|
|
}
|
|
if (useMotionSearch < 0) {
|
|
lastMotionSearch = curMotionSearch;
|
|
useMotionSearch = lastMotionSearch;
|
|
curMotionSearch = (curMotionSearch + count) % (count * 3);
|
|
} else {
|
|
lastMotionSearch = curMotionSearch;
|
|
do {
|
|
curMotionSearch = (curMotionSearch + count) % (count * 3);
|
|
} while (curMotionSearch == useMotionSearch);
|
|
}
|
|
aw_logd("cur %d, last %d, use %d", curMotionSearch, lastMotionSearch, useMotionSearch);
|
|
usleep(42*1000);
|
|
}
|
|
free(pMotionSearchResult);
|
|
pMotionSearchResult = NULL;
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
static void init_wbyuv_param_info(RTsWbYuvParam *pWbYuvParam, WbYuvFuncInfo *pWbYuvFuncInfo)
|
|
{
|
|
pWbYuvParam->bEnableWbYuv = 1;
|
|
pWbYuvParam->nWbBufferNum = 2;
|
|
pWbYuvParam->scalerRatio = RTVENC_ISP_SCALER_0;
|
|
pWbYuvParam->bEnableCrop = 0;
|
|
pWbYuvParam->sWbYuvcrop.nHeight = 640;
|
|
pWbYuvParam->sWbYuvcrop.nWidth = 640;
|
|
|
|
pWbYuvFuncInfo->enable_wbyuv = 1;
|
|
pWbYuvFuncInfo->get_num = 5;
|
|
return ;
|
|
}
|
|
|
|
static void setParamBeforeStart(const demo_video_param* pmparam, int channel_id)
|
|
{
|
|
if (pmparam->rotate_angle != 0)
|
|
AWVideoInput_SetRotate(channel_id, pmparam->rotate_angle);
|
|
|
|
if (pmparam->enable_gray)
|
|
AWVideoInput_SetChmoraGray(channel_id, pmparam->enable_gray);
|
|
|
|
if (pmparam->enable_wbyuv) {
|
|
WbYuvFuncInfo *pWbYuvFuncInfo = NULL;
|
|
RTsWbYuvParam mWbYuvParam;
|
|
|
|
pWbYuvFuncInfo = calloc(1, sizeof(WbYuvFuncInfo));
|
|
memset(&mWbYuvParam, 0, sizeof(RTsWbYuvParam));
|
|
|
|
init_wbyuv_param_info(&mWbYuvParam, pWbYuvFuncInfo);
|
|
if (pmparam->c0_dst_w && pmparam->c0_dst_h)
|
|
AWVideoInput_SetWbYuv(channel_id, pWbYuvFuncInfo, &mWbYuvParam, pmparam->c0_dst_w, pmparam->c0_dst_h);
|
|
else
|
|
AWVideoInput_SetWbYuv(channel_id, pWbYuvFuncInfo, &mWbYuvParam, pmparam->c0_src_w, pmparam->c0_src_h);
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
static int setParam(demo_video_param* mparam, int channel_id, VideoInputConfig* pConfig)
|
|
{
|
|
int ret = 0;
|
|
#if 0//this for user debug, kernel use isp param reality.
|
|
if(mparam->enable_sharp)
|
|
{
|
|
RTsEncppSharp s_Sharp;
|
|
RTsEncppSharpParamDynamic mSharpParamDynamic;
|
|
RTsEncppSharpParamStatic mSharpParamStatic;
|
|
|
|
memset(&mSharpParamDynamic, 0, sizeof(RTsEncppSharpParamDynamic));
|
|
memset(&mSharpParamStatic, 0, sizeof(RTsEncppSharpParamStatic));
|
|
memset(&s_Sharp, 0, sizeof(RTsEncppSharp));
|
|
initSharpFunc(&mSharpParamDynamic, &mSharpParamStatic);
|
|
s_Sharp.sEncppSharpParam.pDynamicParam = &mSharpParamDynamic;;
|
|
s_Sharp.sEncppSharpParam.pStaticParam = &mSharpParamStatic;;
|
|
s_Sharp.bsharp = 1;
|
|
|
|
AWVideoInput_SetSharp(channel_id, &s_Sharp);
|
|
}
|
|
#endif
|
|
#if TEST_CROP_FUNC
|
|
usleep(1000*1000);
|
|
RTCropInfo rt_crop_info;
|
|
rt_crop_info.enable_crop = 1;
|
|
rt_crop_info.s_crop_rect.nLeft = 80;
|
|
rt_crop_info.s_crop_rect.nTop = 64;
|
|
rt_crop_info.s_crop_rect.nWidth = 1280;
|
|
rt_crop_info.s_crop_rect.nHeight = 720;
|
|
AWVideoInput_SetCrop(channel_id, &rt_crop_info);
|
|
usleep(1000*1000);
|
|
rt_crop_info.enable_crop = 1;
|
|
rt_crop_info.s_crop_rect.nLeft = 80;
|
|
rt_crop_info.s_crop_rect.nTop = 64;
|
|
rt_crop_info.s_crop_rect.nWidth = 640;
|
|
rt_crop_info.s_crop_rect.nHeight = 480;
|
|
AWVideoInput_SetCrop(channel_id, &rt_crop_info);
|
|
usleep(1000*1000);
|
|
rt_crop_info.enable_crop = 0;
|
|
AWVideoInput_SetCrop(channel_id, &rt_crop_info);
|
|
#endif
|
|
|
|
if (mparam->en_2d_3d_nr) {
|
|
RTs3DfilterParam m3DfilterParam;
|
|
RTs2DfilterParam m2DfilterParam;
|
|
init_2d_3d_param(&m2DfilterParam, &m3DfilterParam);
|
|
AWVideoInput_Set2dNR(channel_id, &m2DfilterParam);
|
|
AWVideoInput_Set3dNR(channel_id, &m3DfilterParam);
|
|
}
|
|
|
|
if (mparam->enable_p_intra_refresh) {
|
|
RTVencCyclicIntraRefresh sIntraRefresh;
|
|
sIntraRefresh.bEnable = 1;
|
|
sIntraRefresh.nBlockNumber = 10;
|
|
AWVideoInput_SetPIntraRefresh(channel_id, &sIntraRefresh);
|
|
}
|
|
|
|
#if ENABLE_GET_MOTION_SEARCH_RESULT
|
|
if (pConfig->encodeType == 0 || pConfig->encodeType == 2) {
|
|
init_motion_search_param(&mparam->motion_search_param);
|
|
AWVideoInput_SetMotionSearchParam(channel_id, &mparam->motion_search_param);
|
|
}
|
|
#endif
|
|
#if TESET_ROI_FUNC
|
|
RTVencROIConfig stRoiConfigs[MAX_ROI_AREA];
|
|
init_roi(stRoiConfigs);
|
|
AWVideoInput_SetRoi(channel_id, stRoiConfigs);
|
|
#endif
|
|
#if ENABLE_RESET_ENCODER_TYPE
|
|
AWVideoInput_Start(0, 0);
|
|
AWVideoInput_ResetEncoderType(0, 2);
|
|
|
|
fclose(out_file_0);
|
|
out_file_0 = fopen(OUT_PUT_FILE_3, "wb");
|
|
aw_logd("reset encodertype -- reopen : %p, path = %s", out_file_0, OUT_PUT_FILE_3);
|
|
|
|
AWVideoInput_Start(0, 1);
|
|
#endif
|
|
|
|
#if ENABLE_GET_BIN_IMAGE_DATA
|
|
get_bin_image_data(channel_id, pConfig);
|
|
#endif
|
|
|
|
#if ENABLE_GET_MV_INFO_DATA
|
|
if(pConfig->encodeType == 0)//* h264
|
|
get_mv_info_data_h264(channel_id, pConfig);
|
|
else if(pConfig->encodeType == 2)//* h265
|
|
get_mv_info_data_h265(channel_id, pConfig);
|
|
#endif
|
|
|
|
#if ENABLE_SET_HFLIP
|
|
usleep(1000*1000);
|
|
aw_logd("set h flip, channelId = %d\n", channel_id);
|
|
AWVideoInput_SetHFlip(channel_id, 1);
|
|
#endif
|
|
|
|
#if ENABLE_SET_VFLIP
|
|
usleep(1000*1000);
|
|
aw_logd("set v flip, channelId = %d\n", channel_id);
|
|
AWVideoInput_SetVFlip(channel_id, 1);
|
|
#endif
|
|
|
|
#if ENABLE_SET_PLF
|
|
AWVideoInput_SetPowerLineFreq(channel_id, RT_FREQUENCY_50HZ);
|
|
#endif
|
|
|
|
#if ENABLE_DYNAMIC_SET_QP_AND_BITRATE_AND_FPS
|
|
video_qp_range mqp_range;
|
|
mqp_range.i_min_qp = 35;
|
|
mqp_range.i_max_qp = 51;
|
|
mqp_range.p_min_qp = 35;
|
|
mqp_range.p_max_qp = 51;
|
|
mqp_range.i_init_qp = 35;
|
|
mqp_range.enable_mb_qp_limit = 0;
|
|
|
|
AWVideoInput_SetQpRange(channel_id, &mqp_range);
|
|
AWVideoInput_SetBitrate(channel_id, 1536/* kbps */);
|
|
AWVideoInput_SetFps(channel_id, 13);
|
|
|
|
memset(&mqp_range, 0, sizeof(video_qp_range));
|
|
AWVideoInput_GetQpRange(channel_id, &mqp_range);
|
|
int bitrate = AWVideoInput_GetBitrate(channel_id);
|
|
int fps = AWVideoInput_GetFps(channel_id);
|
|
aw_logd("get info: i_min&max_qp = %d, %d, p_min&max_qp = %d, %d, bitrate = %d, fps = %d",
|
|
mqp_range.i_min_qp, mqp_range.i_max_qp, mqp_range.p_min_qp, mqp_range.p_max_qp,
|
|
bitrate, fps);
|
|
|
|
usleep(3*1000*1000);
|
|
AWVideoInput_SetFps(channel_id, 15);
|
|
#endif
|
|
|
|
|
|
#if ENABLE_OSD_FUNCTION
|
|
VideoInputOSD OverlayInfo;
|
|
int index = 0;
|
|
memset(&OverlayInfo, 0, sizeof(VideoInputOSD));
|
|
|
|
OverlayInfo.osd_num = 3;
|
|
|
|
OverlayInfo.item_info[index].osd_type = RT_NORMAL_OVERLAY;
|
|
OverlayInfo.item_info[index].start_x = 16;
|
|
OverlayInfo.item_info[index].start_y = 752;
|
|
OverlayInfo.item_info[index].widht = 464;
|
|
OverlayInfo.item_info[index].height = 32;
|
|
ret = init_overlay_info(&OverlayInfo, index);
|
|
|
|
index = 1;
|
|
OverlayInfo.item_info[index].osd_type = RT_LUMA_REVERSE_OVERLAY;
|
|
OverlayInfo.item_info[index].start_x = 480;
|
|
OverlayInfo.item_info[index].start_y = 784;
|
|
OverlayInfo.item_info[index].widht = 464;
|
|
OverlayInfo.item_info[index].height = 32;
|
|
OverlayInfo.invert_mode = 3;
|
|
OverlayInfo.invert_threshold = 90;
|
|
ret = init_overlay_info(&OverlayInfo, index);
|
|
|
|
index = 2;
|
|
OverlayInfo.item_info[index].osd_type = RT_COVER_OSD;
|
|
OverlayInfo.item_info[index].start_x = 800;
|
|
OverlayInfo.item_info[index].start_y = 512;
|
|
OverlayInfo.item_info[index].widht = 464;
|
|
OverlayInfo.item_info[index].height = 32;
|
|
OverlayInfo.item_info[index].cover_yuv.cover_y = 0;
|
|
OverlayInfo.item_info[index].cover_yuv.cover_u = 0;
|
|
OverlayInfo.item_info[index].cover_yuv.cover_v = 0x64;
|
|
ret |= init_overlay_info(&OverlayInfo, index);
|
|
|
|
if(ret == 0)
|
|
AWVideoInput_SetOSD(channel_id, &OverlayInfo);
|
|
|
|
usleep(2*1000*1000);
|
|
//AWVideoInput_SetOSD(channel_id, &OverlayInfo);
|
|
|
|
#if 0
|
|
unsigned int g2d_data_size = 464*32*4;
|
|
unsigned char* g2d_data = malloc(g2d_data_size);
|
|
AWVideoInput_GetG2DData(channelId_0, g2d_data);
|
|
|
|
FILE *g2d_file = NULL;
|
|
g2d_file = fopen("/tmp/g2d.dat", "wb");
|
|
fwrite(g2d_data, 1, g2d_data_size, g2d_file);
|
|
usleep(200*1000);
|
|
fclose(g2d_file);
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
#if ENABLE_RESET_SIZE
|
|
reset_size(channel_id, &OverlayInfo);
|
|
#endif
|
|
|
|
if(mparam->encode_local_yuv)
|
|
{
|
|
FILE * in_yuv_fp = fopen(mparam->InputFileName, "rb");
|
|
aw_logd("fopen %s w&h = %d, %d", mparam->InputFileName, pConfig->width, pConfig->height);
|
|
if(in_yuv_fp == NULL)
|
|
{
|
|
aw_loge("fopen failed: %s", mparam->InputFileName);
|
|
}
|
|
else
|
|
{
|
|
int yuv_size = pConfig->width*pConfig->height*3/2;
|
|
VideoYuvFrame mYuvFrame;
|
|
|
|
if(pConfig->pixelformat == RT_PIXEL_LBC_25X)
|
|
{
|
|
int y_stride = 0;
|
|
int yc_stride = 0;
|
|
int bit_depth = 8;
|
|
int com_ratio_even = 0;
|
|
int com_ratio_odd = 0;
|
|
int pic_width_32align = (pConfig->width + 31) & ~31;
|
|
int pic_height = pConfig->height;
|
|
unsigned int lbc_ext_size = 0;
|
|
|
|
com_ratio_even = 440;
|
|
com_ratio_odd = 380;
|
|
y_stride = ((com_ratio_even * pic_width_32align * bit_depth / 1000 +511) & (~511)) >> 3;
|
|
yc_stride = ((com_ratio_odd * pic_width_32align * bit_depth / 500 + 511) & (~511)) >> 3;
|
|
|
|
int total_stream_len = (y_stride + yc_stride) * pic_height / 2;
|
|
|
|
//* add more 1KB to fix ve-lbc-error
|
|
//lbc_ext_size = 1*1024;
|
|
total_stream_len += lbc_ext_size;
|
|
|
|
aw_logd("LBC in buf:com_ratio: %d, %d, w32alin = %d, pic_height = %d, \
|
|
y_s = %d, yc_s = %d, total_len = %d,\n",
|
|
com_ratio_even, com_ratio_odd,
|
|
pic_width_32align, pic_height,
|
|
y_stride, yc_stride, total_stream_len);
|
|
|
|
yuv_size = total_stream_len;
|
|
|
|
}
|
|
|
|
|
|
|
|
aw_logd("* yuv_size = %d, w&h = %d, %d", yuv_size, pConfig->width, pConfig->height);
|
|
|
|
while (1)
|
|
{
|
|
if(video_finish_flag == 1)
|
|
break;
|
|
|
|
memset(&mYuvFrame, 0, sizeof(VideoYuvFrame));
|
|
ret = AWVideoInput_RequestEmptyYuvFrame(channel_id, &mYuvFrame);
|
|
if(ret == 0)
|
|
{
|
|
ret = fread(mYuvFrame.virAddr[0], 1, yuv_size, in_yuv_fp);
|
|
aw_logd("vir_addr = %p, ret = %d, yuv_size = %d",
|
|
mYuvFrame.virAddr[0], ret, yuv_size);
|
|
|
|
if(ret != yuv_size)
|
|
{
|
|
fseek(in_yuv_fp, 0, SEEK_SET);
|
|
fread(mYuvFrame.virAddr[0], 1, yuv_size, in_yuv_fp);
|
|
}
|
|
AWVideoInput_SubmitFilledYuvFrame(channel_id, &mYuvFrame, yuv_size);
|
|
}
|
|
else
|
|
usleep(50*1000);
|
|
|
|
}
|
|
|
|
fclose(in_yuv_fp);
|
|
}
|
|
}
|
|
|
|
#if ENABLE_SET_VBR_PARAM
|
|
RTVencVbrParam mVbrParam;
|
|
memset(&mVbrParam, 0, sizeof(RTVencVbrParam));
|
|
mVbrParam.uMaxBitRate = 2048;
|
|
mVbrParam.nMovingTh = 20;
|
|
mVbrParam.nQuality = 10;
|
|
mVbrParam.nIFrmBitsCoef = 10;
|
|
mVbrParam.nPFrmBitsCoef = 10;
|
|
|
|
AWVideoInput_SetVbrParam(channel_id, &mVbrParam);
|
|
|
|
memset(&mVbrParam, 0, sizeof(RTVencVbrParam));
|
|
|
|
AWVideoInput_GetVbrParam(channel_id, &mVbrParam);
|
|
aw_logd("get vbr param: MaxBitRate = %d, MovingTh = %d, quality = %d, I&PFrmBitsCoef = %d, %d",
|
|
mVbrParam.uMaxBitRate, mVbrParam.nMovingTh,
|
|
mVbrParam.nQuality, mVbrParam.nIFrmBitsCoef, mVbrParam.nPFrmBitsCoef);
|
|
#endif
|
|
|
|
#if ENABLE_GET_SUM_MAD
|
|
usleep(2*1000*1000);
|
|
int sum_mad = AWVideoInput_GetSumMad(channel_id);
|
|
aw_logd("sum_mad = %d",sum_mad);
|
|
#endif
|
|
|
|
#if ENABLE_GET_LV_SET_IR
|
|
ret = AWVideoInput_GetLuminance(channel_id);
|
|
aw_logd("the lv is : %d\n", ret);
|
|
RTIrParam mIrParam;
|
|
memset(&mIrParam, 0, sizeof(RTIrParam));
|
|
mIrParam.grey = 1;
|
|
mIrParam.ir_on = 1;
|
|
mIrParam.ir_flash_on = 0;
|
|
|
|
AWVideoInput_SetIrParam(channel_id, &mIrParam);
|
|
#endif
|
|
|
|
#if ENABLE_SET_SUPER_FRAME_PARAM
|
|
RTVencSuperFrameConfig mSuperConfig;
|
|
|
|
memset(&mSuperConfig, 0, sizeof(RTVencSuperFrameConfig));
|
|
mSuperConfig.eSuperFrameMode = RT_VENC_SUPERFRAME_NONE;
|
|
mSuperConfig.nMaxRencodeTimes = 0;
|
|
mSuperConfig.nMaxIFrameBits = 200*1024*8; //* 200 KB
|
|
mSuperConfig.nMaxPFrameBits = mSuperConfig.nMaxIFrameBits / 3;
|
|
mSuperConfig.nMaxP2IFrameBitsRatio = 0.33;
|
|
|
|
AWVideoInput_SetSuperFrameParam(channel_id, &mSuperConfig);
|
|
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void* catch_jpeg_thread(void* param)
|
|
{
|
|
|
|
#if ENABLE_CATCH_JPEG
|
|
catch_jpeg_config jpg_config = *((catch_jpeg_config *)param);
|
|
catch_jpeg(&jpg_config);
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void exit_demo()
|
|
{
|
|
int i = 0;
|
|
AWVideoInput_DeInit();
|
|
aw_logd("exit: deInit end\n");
|
|
|
|
sem_destroy(&finish_sem);
|
|
|
|
for(i = 0; i < MAX_BITMAP_NUM; i++)
|
|
{
|
|
if(bit_map_info[i].argb_addr)
|
|
{
|
|
free(bit_map_info[i].argb_addr);
|
|
bit_map_info[i].argb_addr = NULL;
|
|
}
|
|
}
|
|
|
|
if(out_file_0)
|
|
{
|
|
fclose(out_file_0);
|
|
out_file_0 = NULL;
|
|
}
|
|
|
|
if(out_file_1)
|
|
{
|
|
fclose(out_file_1);
|
|
out_file_1 = NULL;
|
|
}
|
|
|
|
if(out_file_2)
|
|
{
|
|
fclose(out_file_2);
|
|
out_file_2 = NULL;
|
|
}
|
|
|
|
aw_logw("aw_demo, finish!\n");
|
|
return ;
|
|
}
|
|
|
|
static int initGdcFunc(RTsGdcParam *pGdcParam)
|
|
{
|
|
pGdcParam->bGDC_en = 1;
|
|
pGdcParam->eWarpMode = RT_Gdc_Warp_LDC;
|
|
pGdcParam->eMountMode = RT_Gdc_Mount_Wall;
|
|
pGdcParam->bMirror = 0;
|
|
pGdcParam->calib_widht = 3264;
|
|
pGdcParam->calib_height = 2448;
|
|
|
|
pGdcParam->fx = 2417.19;
|
|
pGdcParam->fy = 2408.43;
|
|
pGdcParam->cx = 1631.50;
|
|
pGdcParam->cy = 1223.50;
|
|
pGdcParam->fx_scale = 2161.82;
|
|
pGdcParam->fy_scale = 2153.99;
|
|
pGdcParam->cx_scale = 1631.50;
|
|
pGdcParam->cy_scale = 1223.50;
|
|
|
|
pGdcParam->eLensDistModel = RT_Gdc_DistModel_FishEye;
|
|
|
|
pGdcParam->distCoef_wide_ra[0] = -0.3849;
|
|
pGdcParam->distCoef_wide_ra[1] = 0.1567;
|
|
pGdcParam->distCoef_wide_ra[2] = -0.0030;
|
|
pGdcParam->distCoef_wide_ta[0] = -0.00005;
|
|
pGdcParam->distCoef_wide_ta[1] = 0.0016;
|
|
|
|
pGdcParam->distCoef_fish_k[0] = -0.0024;
|
|
pGdcParam->distCoef_fish_k[1] = 0.141;
|
|
pGdcParam->distCoef_fish_k[2] = -0.3;
|
|
pGdcParam->distCoef_fish_k[3] = 0.2328;
|
|
|
|
pGdcParam->centerOffsetX = 0;
|
|
pGdcParam->centerOffsetY = 0;
|
|
pGdcParam->rotateAngle = 0; //[0,360]
|
|
pGdcParam->radialDistortCoef = 0; //[-255,255]
|
|
pGdcParam->trapezoidDistortCoef = 0; //[-255,255]
|
|
pGdcParam->fanDistortCoef = 0; //[-255,255]
|
|
pGdcParam->pan = 0; //pano360:[0,360]; others:[-90,90]
|
|
pGdcParam->tilt = 0; //[-90,90]
|
|
pGdcParam->zoomH = 100; //[0,100]
|
|
pGdcParam->zoomV = 100; //[0,100]
|
|
pGdcParam->scale = 100; //[0,100]
|
|
pGdcParam->innerRadius = 0; //[0,width/2]
|
|
pGdcParam->roll = 0; //[-90,90]
|
|
pGdcParam->pitch = 0; //[-90,90]
|
|
pGdcParam->yaw = 0; //[-90,90]
|
|
|
|
pGdcParam->perspFunc = RT_Gdc_Persp_Only;
|
|
pGdcParam->perspectiveProjMat[0] = 1.0;
|
|
pGdcParam->perspectiveProjMat[1] = 0.0;
|
|
pGdcParam->perspectiveProjMat[2] = 0.0;
|
|
pGdcParam->perspectiveProjMat[3] = 0.0;
|
|
pGdcParam->perspectiveProjMat[4] = 1.0;
|
|
pGdcParam->perspectiveProjMat[5] = 0.0;
|
|
pGdcParam->perspectiveProjMat[6] = 0.0;
|
|
pGdcParam->perspectiveProjMat[7] = 0.0;
|
|
pGdcParam->perspectiveProjMat[8] = 1.0;
|
|
|
|
pGdcParam->mountHeight = 0.85; //meters
|
|
pGdcParam->roiDist_ahead = 4.5; //meters
|
|
pGdcParam->roiDist_left = -1.5; //meters
|
|
pGdcParam->roiDist_right = 1.5; //meters
|
|
pGdcParam->roiDist_bottom = 0.65; //meters
|
|
|
|
pGdcParam->peaking_en = 1; //0/1
|
|
pGdcParam->peaking_clamp = 1; //0/1
|
|
pGdcParam->peak_m = 16; //[0,63]
|
|
pGdcParam->th_strong_edge = 6; //[0,15]
|
|
pGdcParam->peak_weights_strength = 2; //[0,15]
|
|
|
|
if(pGdcParam->eWarpMode == RT_Gdc_Warp_LDC)
|
|
{
|
|
pGdcParam->birdsImg_width = 768;
|
|
pGdcParam->birdsImg_height = 1080;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void init_color_space(RTVencVideoSignal *pvenc_video_signal)
|
|
{
|
|
pvenc_video_signal->video_format = RT_DEFAULT;
|
|
pvenc_video_signal->full_range_flag = 1;
|
|
pvenc_video_signal->src_colour_primaries = RT_VENC_BT709;
|
|
pvenc_video_signal->dst_colour_primaries = RT_VENC_BT709;
|
|
return ;
|
|
}
|
|
|
|
void handler(int sig)
|
|
{
|
|
aw_logw("rev sig=%d\n", sig);
|
|
if (SIGSEGV == sig) {
|
|
exit_demo();
|
|
_exit(1);
|
|
}
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
aw_logw("aw_demo start, OUT_PUT_FILE_PREFIX = %s time: %lld clock_gettime: %lld\n", OUT_PUT_FILE_PREFIX, get_timeofday(), get_cur_time_us());
|
|
|
|
#if 0
|
|
int tmp_size = 10*1024*1024;
|
|
unsigned char* tmp_buf = malloc(tmp_size);
|
|
memset(tmp_buf, 0xf, tmp_size);
|
|
#endif
|
|
|
|
pthread_t thread = 0;
|
|
int i = 0;
|
|
int ret = 0;
|
|
int channelId_0 = MAIN_CHANNEL_CHANNEL_ID;
|
|
int channelId_1 = 4;
|
|
int channelId_2 = 8;
|
|
|
|
stream_count_1 = 0;
|
|
stream_count_0 = 0;
|
|
stream_count_2 = 0;
|
|
video_finish_flag = 0;
|
|
save_file_cnt = 0;
|
|
need_save_new_file = 0;
|
|
save_file_cnt_1 = 0;
|
|
need_save_new_file_1 = 0;
|
|
save_file_cnt_2 = 0;
|
|
need_save_new_file_2 = 0;
|
|
|
|
memset(&mparam, 0, sizeof(demo_video_param));
|
|
memset(bit_map_info, 0, MAX_BITMAP_NUM*sizeof(BitMapInfoS));
|
|
mparam.c0_encoder_format = -1;
|
|
mparam.c1_encoder_format = -1;
|
|
mparam.pixelformat = RT_PIXEL_NUM;
|
|
mparam.pixelformat_1 = RT_PIXEL_NUM;
|
|
mparam.pixelformat_2 = RT_PIXEL_NUM;
|
|
mparam.use_vipp_num = 0;
|
|
mparam.use_vipp_num_1 = 4;
|
|
mparam.use_vipp_num_2 = 8;
|
|
mparam.jpg_width = HUMAN_VIPP_WIDTH;
|
|
mparam.jpg_heigh = HUMAN_VIPP_HEIGHT;
|
|
mparam.use_vipp_num = 0;
|
|
mparam.use_vipp_num_1 = 4;
|
|
mparam.use_vipp_num_2 = 8;
|
|
mparam.share_buf_num = 2;
|
|
mparam.enable_sharp = 1;
|
|
strcpy(mparam.OutputFilePath, OUT_PUT_FILE_PREFIX);
|
|
/******** begin parse the config paramter ********/
|
|
if(argc >= 2)
|
|
{
|
|
aw_logd("******************************\n");
|
|
for(i = 1; i < (int)argc; i += 2)
|
|
{
|
|
ParseArgument(&mparam, argv[i], argv[i + 1]);
|
|
}
|
|
aw_logd("******************************\n");
|
|
}
|
|
else
|
|
{
|
|
aw_logd(" we need more arguments \n");
|
|
PrintDemoUsage();
|
|
//return 0;
|
|
}
|
|
|
|
check_param(&mparam);
|
|
|
|
aw_logd("*demo param: c0: w&h = %d, %d; encode_format = %d, bitrate = %d",
|
|
mparam.c0_src_w, mparam.c0_src_h, mparam.c0_encoder_format, mparam.c0_bitrate);
|
|
aw_logd("*demo param: c1: w&h = %d, %d; encode_format = %d, bitrate = %d",
|
|
mparam.c1_src_w, mparam.c1_src_h, mparam.c1_encoder_format, mparam.c1_bitrate);
|
|
|
|
time_start = get_cur_time_us();
|
|
|
|
if(mparam.encoder_num > 0)
|
|
max_bitstream_count = mparam.encoder_num;
|
|
else
|
|
max_bitstream_count = SAVE_BITSTREAM_COUNT;
|
|
|
|
channelId_0 = mparam.use_vipp_num;
|
|
channelId_1 = mparam.use_vipp_num_1;
|
|
channelId_2 = mparam.use_vipp_num_2;
|
|
VideoInputConfig config_0;
|
|
memset(&config_0, 0, sizeof(VideoInputConfig));
|
|
config_0.channelId = channelId_0;
|
|
config_0.fps = MAIN_CHANNEL_FPS;
|
|
config_0.gop = MAIN_CHANNEL_GOP;
|
|
config_0.product_mode = MAIN_CHANNEL_PRODUCT_MODE;
|
|
config_0.vbr = MAIN_CHANNEL_VBR;
|
|
if (config_0.vbr) {
|
|
config_0.vbr_param.uMaxBitRate = mparam.c0_bitrate/1024; //* kb
|
|
config_0.vbr_param.nMovingTh = 20;
|
|
config_0.vbr_param.nQuality = 10;
|
|
config_0.vbr_param.nIFrmBitsCoef = 10;
|
|
config_0.vbr_param.nPFrmBitsCoef = 10;
|
|
}
|
|
#if ENABLE_GET_MOTION_SEARCH_RESULT
|
|
if (!(1 == config_0.vbr ||
|
|
RTVENC_PRODUCT_STATIC_IPC == config_0.product_mode ||
|
|
RTVENC_PRODUCT_MOVING_IPC == config_0.product_mode ||
|
|
RTVENC_PRODUCT_DOORBELL == config_0.product_mode))
|
|
{
|
|
aw_logw("channel %d MOTION SEARCH only for VBR mode or IPC or DOORBELL, vbr=%d, product_mode=%d",
|
|
channelId_0, config_0.vbr, config_0.product_mode);
|
|
}
|
|
#endif
|
|
config_0.qp_range.i_min_qp = MAIN_CHANNEL_I_MIN_QP;
|
|
config_0.qp_range.i_max_qp = MAIN_CHANNEL_I_MAX_QP;
|
|
config_0.qp_range.p_min_qp = MAIN_CHANNEL_P_MIN_QP;
|
|
config_0.qp_range.p_max_qp = MAIN_CHANNEL_P_MAX_QP;
|
|
config_0.qp_range.i_init_qp = MAIN_CHANNEL_INIT_QP;
|
|
config_0.profile = AW_Video_H264ProfileMain;
|
|
config_0.level = AW_Video_H264Level51;
|
|
config_0.pixelformat = mparam.pixelformat;
|
|
config_0.enable_sharp = mparam.enable_sharp;
|
|
config_0.bonline_channel = mparam.bonline_channel;
|
|
config_0.share_buf_num = mparam.share_buf_num;
|
|
config_0.en_16_align_fill_data = 0;
|
|
config_0.breduce_refrecmem = MAIN_CHANNEL_REDUCE_REFREC_MEM;
|
|
init_color_space(&config_0.venc_video_signal);
|
|
|
|
if(mparam.encode_local_yuv)
|
|
{
|
|
config_0.qp_range.i_min_qp = 20;
|
|
config_0.qp_range.i_max_qp = 45;
|
|
config_0.qp_range.p_min_qp = 20;
|
|
config_0.qp_range.p_max_qp = 45;
|
|
config_0.qp_range.i_init_qp = 20;
|
|
config_0.output_mode = OUTPUT_MODE_ENCODE_FILE_YUV;
|
|
|
|
mparam.en_second_channel = 0;
|
|
mparam.en_third_channel = 0;
|
|
}
|
|
else
|
|
{
|
|
config_0.output_mode = OUTPUT_MODE_STREAM;
|
|
}
|
|
config_0.width = mparam.c0_src_w;
|
|
config_0.height = mparam.c0_src_h;
|
|
config_0.dst_width = mparam.c0_dst_w;
|
|
config_0.dst_height = mparam.c0_dst_h;
|
|
config_0.bitrate = mparam.c0_bitrate/1024; //* kb
|
|
config_0.encodeType = mparam.c0_encoder_format;
|
|
config_0.drop_frame_num = 0;
|
|
config_0.enable_wdr = 0;
|
|
config_0.dst_fps = mparam.dst_fps;
|
|
#if ENABLE_TEST_SET_CAMERA_MOVE_STATUS
|
|
config_0.enable_ve_isp_linkage = 1;
|
|
#else
|
|
config_0.enable_ve_isp_linkage = 0;
|
|
#endif
|
|
if (config_0.encodeType == 1) {//jpg encode
|
|
config_0.jpg_quality = 80;
|
|
if (mparam.encoder_num > 1) {//mjpg
|
|
config_0.jpg_mode = mparam.jpg_mode = 1;
|
|
config_0.bitrate = 12*1024;//kb
|
|
config_0.bit_rate_range.bitRateMin = 10*1024;//kb
|
|
config_0.bit_rate_range.bitRateMax = 14*1024;//kb
|
|
}
|
|
}
|
|
#if ENABLE_GET_BIN_IMAGE_DATA
|
|
config_0.enable_bin_image = 1;
|
|
config_0.bin_image_moving_th = 20;
|
|
#endif
|
|
|
|
#if ENABLE_GET_MV_INFO_DATA
|
|
config_0.enable_mv_info = 1;
|
|
#endif
|
|
|
|
if (mparam.enable_crop) {
|
|
config_0.s_crop_info.enable_crop = 1;
|
|
config_0.s_crop_info.s_crop_rect.nLeft = 80;
|
|
config_0.s_crop_info.s_crop_rect.nTop = 64;
|
|
config_0.s_crop_info.s_crop_rect.nWidth = 640;
|
|
config_0.s_crop_info.s_crop_rect.nHeight = 320;
|
|
}
|
|
|
|
time_end = get_cur_time_us();
|
|
//aw_logd("init start, time = %lld, max_count = %d\n",time_end - time_start, max_bitstream_count);
|
|
struct sigaction act;
|
|
act.sa_handler = handler;
|
|
sigemptyset(&act.sa_mask);
|
|
act.sa_flags = 0;
|
|
|
|
if (sigaction(SIGTERM, &act, NULL) < 0)
|
|
aw_loge("install signal error\n");
|
|
if (sigaction(SIGINT, &act, NULL) < 0)
|
|
aw_loge("install signal error\n");
|
|
if (sigaction(SIGABRT, &act, NULL) < 0)
|
|
aw_loge("install signal error\n");
|
|
if (sigaction(SIGSEGV, &act, NULL) < 0)
|
|
aw_loge("install signal error\n");
|
|
|
|
AWVideoInput_Init();
|
|
sem_init(&finish_sem, 0, 0);
|
|
int64_t time_end1 = get_cur_time_us();
|
|
aw_logd("time of aw_init: %lld\n",time_end1 - time_end);
|
|
|
|
if(AWVideoInput_Configure(channelId_0, &config_0))
|
|
{
|
|
aw_loge("config err, exit!");
|
|
goto _exit;
|
|
}
|
|
setParamBeforeStart(&mparam, channelId_0);
|
|
int64_t time_end2 = get_cur_time_us();
|
|
aw_logd("time of aw_config: = %lld\n",time_end2 - time_end1);
|
|
if (mparam.enable_gdc) {
|
|
RTsGdcParam mGdcParam;
|
|
memset(&mGdcParam, 0, sizeof(RTsGdcParam));
|
|
initGdcFunc(&mGdcParam);
|
|
AWVideoInput_SetGdc(channelId_0, &mGdcParam);
|
|
}
|
|
AWVideoInput_CallBack(channelId_0, video_stream_cb, 1);
|
|
AWVideoInput_SetChannelThreadExitCb(channelId_0, channel_thread_exit);
|
|
int64_t time_end3 = get_cur_time_us();
|
|
//aw_logd("callback end, time = %lld\n",time_end3 - time_end2);
|
|
|
|
AWVideoInput_Start(channelId_0, 1);
|
|
|
|
int64_t time_end4 = get_cur_time_us();
|
|
aw_logd("time of aw_start: = %lld, total_time = %lld\n",
|
|
time_end4 - time_end3,
|
|
time_end4 - time_start);
|
|
|
|
time_aw_start = time_end4;
|
|
|
|
VideoChannelInfo mChannelInfo;
|
|
memset(&mChannelInfo, 0, sizeof(VideoChannelInfo));
|
|
|
|
AWVideoInput_GetChannelInfo(channelId_0, &mChannelInfo);
|
|
aw_logd("state = %d, w&h = %d,%d, bitrate = %d kbps, fps = %d, i_qp = %d~%d, p_qp = %d~%d",
|
|
mChannelInfo.state,
|
|
mChannelInfo.mConfig.width, mChannelInfo.mConfig.height,
|
|
mChannelInfo.mConfig.bitrate, mChannelInfo.mConfig.fps,
|
|
mChannelInfo.mConfig.qp_range.i_min_qp, mChannelInfo.mConfig.qp_range.i_max_qp,
|
|
mChannelInfo.mConfig.qp_range.p_min_qp, mChannelInfo.mConfig.qp_range.p_max_qp);
|
|
|
|
if (mparam.en_second_channel) {
|
|
VideoInputConfig config_1;
|
|
memset(&config_1, 0, sizeof(VideoInputConfig));
|
|
config_1.channelId = channelId_1;
|
|
config_1.fps = 15;
|
|
config_1.gop = 30;
|
|
config_1.product_mode = 0;
|
|
config_1.vbr = 1;
|
|
if (config_1.vbr) {
|
|
config_1.vbr_param.uMaxBitRate = mparam.c1_bitrate/1024; //* kb
|
|
config_1.vbr_param.nMovingTh = 20;
|
|
config_1.vbr_param.nQuality = 10;
|
|
config_1.vbr_param.nIFrmBitsCoef = 10;
|
|
config_1.vbr_param.nPFrmBitsCoef = 10;
|
|
}
|
|
config_1.qp_range.i_min_qp = 25;
|
|
config_1.qp_range.i_max_qp = 45;
|
|
config_1.qp_range.p_min_qp = 25;
|
|
config_1.qp_range.p_max_qp = 45;
|
|
config_1.qp_range.i_init_qp = 35;
|
|
config_1.profile = AW_Video_H264ProfileMain;
|
|
config_1.level = AW_Video_H264Level51;
|
|
config_1.output_mode = OUTPUT_MODE_STREAM;
|
|
|
|
config_1.width = mparam.c1_src_w;
|
|
config_1.height = mparam.c1_src_h;
|
|
config_1.bitrate = mparam.c1_bitrate/1024; //* kb
|
|
config_1.encodeType = mparam.c1_encoder_format;
|
|
config_1.pixelformat = mparam.pixelformat_1;
|
|
config_1.enable_sharp = 1;
|
|
config_1.vin_buf_num = mparam.vin_buf_num;//for example, not set, kernel will set to 3
|
|
config_1.breduce_refrecmem = 1;
|
|
#if ENABLE_TEST_SET_CAMERA_MOVE_STATUS
|
|
config_0.enable_ve_isp_linkage = 1;
|
|
#else
|
|
config_1.enable_ve_isp_linkage = 0;
|
|
#endif
|
|
if (mparam.c0_src_w)
|
|
config_1.ve_encpp_sharp_atten_coef_per = 100 * mparam.c1_src_w / mparam.c0_src_w;
|
|
else
|
|
config_1.ve_encpp_sharp_atten_coef_per = 100;
|
|
|
|
init_color_space(&config_1.venc_video_signal);
|
|
AWVideoInput_Configure(channelId_1, &config_1);
|
|
AWVideoInput_CallBack(channelId_1, video_stream_cb_1, 1);
|
|
AWVideoInput_Start(channelId_1, 1);
|
|
}
|
|
|
|
if (mparam.en_third_channel) {
|
|
VideoInputConfig config_2;
|
|
memset(&config_2, 0, sizeof(VideoInputConfig));
|
|
config_2.channelId = channelId_2;
|
|
config_2.fps = 15;
|
|
config_2.gop = 30;
|
|
config_2.product_mode = 0;
|
|
config_2.vbr = 1;
|
|
if (config_2.vbr) {
|
|
config_2.vbr_param.uMaxBitRate = mparam.c1_bitrate/1024; //* kb
|
|
config_2.vbr_param.nMovingTh = 20;
|
|
config_2.vbr_param.nQuality = 10;
|
|
config_2.vbr_param.nIFrmBitsCoef = 10;
|
|
config_2.vbr_param.nPFrmBitsCoef = 10;
|
|
}
|
|
config_2.qp_range.i_min_qp = 25;
|
|
config_2.qp_range.i_max_qp = 45;
|
|
config_2.qp_range.p_min_qp = 25;
|
|
config_2.qp_range.p_max_qp = 45;
|
|
config_2.qp_range.i_init_qp = 35;
|
|
config_2.profile = AW_Video_H264ProfileMain;
|
|
config_2.level = AW_Video_H264Level51;
|
|
config_2.output_mode = OUTPUT_MODE_STREAM;
|
|
|
|
config_2.width = mparam.c1_src_w;
|
|
config_2.height = mparam.c1_src_h;
|
|
config_2.bitrate = mparam.c1_bitrate/1024; //* kb
|
|
config_2.encodeType = mparam.c1_encoder_format;
|
|
config_2.pixelformat = mparam.pixelformat_1;
|
|
config_2.enable_sharp = 1;
|
|
config_2.vin_buf_num = mparam.vin_buf_num;//for example, not set, kernel will set to 3
|
|
config_2.breduce_refrecmem = 1;
|
|
|
|
init_color_space(&config_2.venc_video_signal);
|
|
AWVideoInput_Configure(channelId_2, &config_2);
|
|
AWVideoInput_CallBack(channelId_2, video_stream_cb_2, 2);
|
|
AWVideoInput_Start(channelId_2, 1);
|
|
}
|
|
|
|
setParam(&mparam, channelId_0, &config_0);
|
|
#if ENABLE_GET_MOTION_SEARCH_RESULT
|
|
pthread_t motion_thread = 0;
|
|
pthread_create(&motion_thread, NULL, motion_search_thread, (void*)&channelId_0);
|
|
|
|
if(motion_thread != 0)
|
|
pthread_join(motion_thread, (void**)&ret);
|
|
#endif
|
|
if(thread != 0)
|
|
pthread_join(thread, (void**)&ret);
|
|
|
|
#if ENABLE_TEST_SET_CAMERA_MOVE_STATUS
|
|
#if ENABLE_TEST_SET_CAMERA_ADAPTIVE_MOVING_AND_STATIC
|
|
sleep(2);
|
|
aw_logw("camera start to adapt moving and static");
|
|
AWVideoInput_SetCameraMoveStatus(mparam.use_vipp_num, RT_VENC_CAMERA_ADAPTIVE_MOVING_AND_STATIC);
|
|
#else
|
|
sleep(2);
|
|
aw_logw("camera start to moving");
|
|
AWVideoInput_SetCameraMoveStatus(mparam.use_vipp_num, RT_VENC_CAMERA_FORCE_MOVING);
|
|
sleep(2);
|
|
aw_logd("camera moving stop");
|
|
/* necessary! must set RT_VENC_CAMERA_ADAPTIVE_STATIC */
|
|
AWVideoInput_SetCameraMoveStatus(mparam.use_vipp_num, RT_VENC_CAMERA_ADAPTIVE_STATIC);
|
|
#endif
|
|
#endif
|
|
|
|
//* wait for finish
|
|
sem_wait(&finish_sem);
|
|
#if 1//ENABLE_FIRST_CHANNEL
|
|
aw_logd("exit, stream_count_0 = %d\n", stream_count_0);
|
|
AWVideoInput_Start(mparam.use_vipp_num, 0);
|
|
#endif
|
|
|
|
if (mparam.en_second_channel) {
|
|
AWVideoInput_Start(mparam.use_vipp_num_1, 0);
|
|
}
|
|
|
|
if (mparam.en_third_channel) {
|
|
AWVideoInput_Start(mparam.use_vipp_num_2, 0);
|
|
}
|
|
_exit:
|
|
exit_demo();
|
|
//isp_config_to_flash();
|
|
|
|
return 0;
|
|
}
|
|
|