2408 lines
72 KiB
C
2408 lines
72 KiB
C
/*
|
|
Copyright (c), 2001-2022, Shenshu Tech. Co., Ltd.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <pthread.h>
|
|
#include <signal.h>
|
|
#include <net/if.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <netdb.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <linux/sockios.h>
|
|
#include <fcntl.h>
|
|
|
|
|
|
#include "sample_comm.h"
|
|
#include "securec.h"
|
|
|
|
#include "ringbuffer.h"
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#endif /* end of #ifdef __cplusplus */
|
|
|
|
|
|
#define PIC_SIZE PIC_1080P
|
|
//#define BIG_STREAM_SIZE PIC_1080P
|
|
//#define BIG_STREAM_SIZE PIC_720P
|
|
|
|
#define BIG_STREAM_SIZE PIC_3840X2160
|
|
#define SMALL_STREAM_SIZE PIC_D1_NTSC
|
|
|
|
#define ENTER_ASCII 10
|
|
|
|
#define VB_MAX_NUM 10
|
|
|
|
#define CHN_NUM_MAX 2
|
|
|
|
static int resolution;
|
|
|
|
struct ring_buffer *ringbuffer;
|
|
|
|
typedef struct {
|
|
ot_size max_size;
|
|
ot_pixel_format pixel_format;
|
|
ot_size output_size[OT_VPSS_MAX_PHYS_CHN_NUM];
|
|
ot_compress_mode compress_mode[OT_VPSS_MAX_PHYS_CHN_NUM];
|
|
td_bool enable[OT_VPSS_MAX_PHYS_CHN_NUM];
|
|
} sample_venc_vpss_chn_attr;
|
|
|
|
typedef struct {
|
|
td_u32 valid_num;
|
|
td_u64 blk_size[OT_VB_MAX_COMMON_POOLS];
|
|
td_u32 blk_cnt[OT_VB_MAX_COMMON_POOLS];
|
|
td_u32 supplement_config;
|
|
} sample_venc_vb_attr;
|
|
|
|
typedef struct {
|
|
ot_vpss_chn vpss_chn[CHN_NUM_MAX];
|
|
ot_venc_chn venc_chn[CHN_NUM_MAX];
|
|
} sample_venc_vpss_chn;
|
|
|
|
/******************************************************************************
|
|
* function : show usage
|
|
******************************************************************************/
|
|
static td_void sample_venc_usage(td_char *s_prg_nm)
|
|
{
|
|
printf("usage : %s [index] \n", s_prg_nm);
|
|
printf("index:\n");
|
|
printf("\t 0) normal :H.265e@1080P@30fps + h264e@D1@30fps.\n");
|
|
printf("\t 1) qpmap :H.265e@1080P@30fps + h264e@1080P@30fps.\n");
|
|
printf("\t 2) intra_refresh :H.265e@1080P@30fps(row) + h264e@1080P@30fps(column).\n");
|
|
printf("\t 3) roi_bg_frame_rate:H.265e@1080P@30fps + H.264@1080P@30fps.\n");
|
|
printf("\t 4) debreath_effect :H.265e@1080P@30fps(enable) + H.265e@1080P@30fps(disable).\n");
|
|
printf("\t 5) roi_set :Mjpege@1080P@30fps(user set roi info by API).\n");
|
|
printf("\t 6) roimap :Mjpege@1080P@30fps(user customize every region).\n");
|
|
}
|
|
|
|
static td_bool g_sample_venc_exit = TD_FALSE;
|
|
|
|
|
|
|
|
extern int socket_descriptor;
|
|
extern struct sockaddr_in address;
|
|
|
|
extern int socket_descriptor_audio;
|
|
extern struct sockaddr_in address_audio;
|
|
|
|
int udp_init(char *ip, int port){
|
|
bzero(&address,sizeof(address));
|
|
address.sin_family=AF_INET;
|
|
address.sin_addr.s_addr=inet_addr(ip);
|
|
address.sin_port=htons(port);
|
|
|
|
socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);//IPV4
|
|
|
|
// fcntl(socket_descriptor,F_SETFL, O_NONBLOCK);
|
|
|
|
|
|
bzero(&address_audio,sizeof(address_audio));
|
|
address_audio.sin_family=AF_INET;
|
|
address_audio.sin_addr.s_addr=inet_addr(ip);
|
|
address_audio.sin_port=htons(port+1);
|
|
|
|
socket_descriptor_audio=socket(AF_INET,SOCK_DGRAM,0);//IPV4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if 1
|
|
int sendbuf = 1024*1024; //20M
|
|
int recvbuf = 1024*1024;
|
|
int lenbuf = sizeof( recvbuf );
|
|
|
|
setsockopt( socket_descriptor , SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof( sendbuf ) );
|
|
getsockopt( socket_descriptor, SOL_SOCKET, SO_SNDBUF, &sendbuf, ( socklen_t* )&lenbuf );
|
|
printf( "the sender buffer size after settting is %d\n", sendbuf );
|
|
|
|
|
|
setsockopt( socket_descriptor, SOL_SOCKET, SO_RCVBUF, &recvbuf, sizeof( recvbuf ) );
|
|
getsockopt( socket_descriptor, SOL_SOCKET, SO_RCVBUF, &recvbuf, ( socklen_t* )&lenbuf );
|
|
printf( "the receive buffer size after settting is %d\n", recvbuf );
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
int ringbuffer_init(){
|
|
void *buffer = (void *)malloc(2*1024*1024);
|
|
if (!buffer)
|
|
{
|
|
printf("Failed to malloc memory.\n");
|
|
return -1;
|
|
}
|
|
|
|
|
|
int size = 2*1024*1024;
|
|
ringbuffer = ring_buffer_init(buffer, size);
|
|
if (!ringbuffer)
|
|
{
|
|
fprintf(stderr, "Failed to init ring buffer.\n");
|
|
return -1;
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
* function : to process abnormal case
|
|
******************************************************************************/
|
|
static td_void sample_venc_handle_sig(td_s32 signo)
|
|
{
|
|
if (g_sample_venc_exit == TD_TRUE) {
|
|
return;
|
|
}
|
|
|
|
if (signo == SIGINT || signo == SIGTERM) {
|
|
g_sample_venc_exit = TD_TRUE;
|
|
}
|
|
}
|
|
|
|
static td_s32 sample_venc_getchar()
|
|
{
|
|
td_s32 c;
|
|
if (g_sample_venc_exit == TD_TRUE) {
|
|
printf("\033[0;31mprogram termination abnormally!\033[0;39m\n");
|
|
return 'e';
|
|
}
|
|
|
|
c = getchar();
|
|
|
|
if (g_sample_venc_exit == TD_TRUE) {
|
|
printf("\033[0;31mprogram termination abnormally!\033[0;39m\n");
|
|
return 'e';
|
|
}
|
|
|
|
return c;
|
|
}
|
|
|
|
static td_s32 get_gop_mode(ot_venc_gop_mode *gop_mode)
|
|
{
|
|
td_s32 c[2] = {'\0'}; /* 2: len */
|
|
|
|
begin_get:
|
|
printf("please input choose gop mode!\n");
|
|
printf("\t 0) normal p.\n");
|
|
printf("\t 1) smart p.\n");
|
|
|
|
c[0] = sample_venc_getchar();
|
|
if (c[0] == 'e') {
|
|
return TD_FAILURE;
|
|
} else if ((c[0] == ENTER_ASCII) || ((c[0] != '0') && (c[0] != '1'))) {
|
|
sample_print("invalid input! please try again.\n");
|
|
while (sample_venc_getchar() != ENTER_ASCII) {
|
|
}
|
|
goto begin_get;
|
|
}
|
|
c[1] = sample_venc_getchar();
|
|
if (c[1] != ENTER_ASCII) {
|
|
sample_print("invalid input! please try again.\n");
|
|
while (sample_venc_getchar() != ENTER_ASCII) {
|
|
}
|
|
goto begin_get;
|
|
}
|
|
switch (c[0]) {
|
|
case '0':
|
|
*gop_mode = OT_VENC_GOP_MODE_NORMAL_P;
|
|
break;
|
|
|
|
case '1':
|
|
*gop_mode = OT_VENC_GOP_MODE_SMART_P;
|
|
break;
|
|
|
|
default:
|
|
sample_print("input invalid!\n");
|
|
goto begin_get;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_void print_rc_mode(ot_payload_type type)
|
|
{
|
|
printf("please input choose rc mode!\n");
|
|
printf("\t c) cbr.\n");
|
|
printf("\t v) vbr.\n");
|
|
if (type != OT_PT_MJPEG) {
|
|
printf("\t a) avbr.\n");
|
|
printf("\t x) cvbr.\n");
|
|
printf("\t q) qvbr.\n");
|
|
}
|
|
printf("\t f) fix_qp\n");
|
|
}
|
|
|
|
static td_s32 get_rc_mode(ot_payload_type type, sample_rc *rc_mode)
|
|
{
|
|
td_s32 c[2] = {'\0'}; /* 2: len */
|
|
|
|
begin_get:
|
|
if (type != OT_PT_JPEG) {
|
|
print_rc_mode(type);
|
|
|
|
c[0] = sample_venc_getchar();
|
|
if (c[0] == 'e') {
|
|
return TD_FAILURE;
|
|
} else if ((c[0] == ENTER_ASCII) || ((c[0] != 'c') && (c[0] != 'v') && (c[0] != 'a') && (c[0] != 'x') &&
|
|
(c[0] != 'q') && (c[0] != 'f'))) {
|
|
sample_print("invalid input! please try again.\n");
|
|
while (sample_venc_getchar() != ENTER_ASCII) {
|
|
}
|
|
goto begin_get;
|
|
}
|
|
c[1] = sample_venc_getchar();
|
|
if (c[1] != ENTER_ASCII) {
|
|
sample_print("invalid input! please try again.\n");
|
|
while (sample_venc_getchar() != ENTER_ASCII) {
|
|
}
|
|
goto begin_get;
|
|
}
|
|
switch (c[0]) {
|
|
case 'c':
|
|
*rc_mode = SAMPLE_RC_CBR;
|
|
break;
|
|
|
|
case 'v':
|
|
*rc_mode = SAMPLE_RC_VBR;
|
|
break;
|
|
|
|
case 'a':
|
|
*rc_mode = SAMPLE_RC_AVBR;
|
|
break;
|
|
|
|
case 'x':
|
|
*rc_mode = SAMPLE_RC_CVBR;
|
|
break;
|
|
|
|
case 'q':
|
|
*rc_mode = SAMPLE_RC_QVBR;
|
|
break;
|
|
|
|
case 'f':
|
|
*rc_mode = SAMPLE_RC_FIXQP;
|
|
break;
|
|
|
|
default:
|
|
sample_print("input invalid!\n");
|
|
goto begin_get;
|
|
}
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_s32 get_intra_refresh_mode(ot_venc_intra_refresh_mode *intra_refresh_mode)
|
|
{
|
|
td_s32 c[2] = {'\0'}; /* 2: len */
|
|
|
|
begin_get:
|
|
printf("please input choose intra refresh mode!\n");
|
|
printf("\t r) row.\n");
|
|
printf("\t c) column.\n");
|
|
|
|
c[0] = sample_venc_getchar();
|
|
if (c[0] == 'e') {
|
|
return TD_FAILURE;
|
|
} else if ((c[0] == ENTER_ASCII) || ((c[0] != 'c') && (c[0] != 'r'))) {
|
|
sample_print("invalid input! please try again.\n");
|
|
while (sample_venc_getchar() != ENTER_ASCII) {
|
|
}
|
|
goto begin_get;
|
|
}
|
|
c[1] = sample_venc_getchar();
|
|
if (c[1] != ENTER_ASCII) {
|
|
sample_print("invalid input! please try again.\n");
|
|
while (sample_venc_getchar() != ENTER_ASCII) {
|
|
}
|
|
goto begin_get;
|
|
}
|
|
switch (c[0]) {
|
|
case 'r':
|
|
*intra_refresh_mode = OT_VENC_INTRA_REFRESH_ROW;
|
|
break;
|
|
|
|
case 'c':
|
|
*intra_refresh_mode = OT_VENC_INTRA_REFRESH_COLUMN;
|
|
break;
|
|
|
|
default:
|
|
sample_print("input invalid!\n");
|
|
goto begin_get;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_void get_vb_attr(const ot_size *vi_size, const sample_venc_vpss_chn_attr *vpss_chn_attr,
|
|
sample_venc_vb_attr *vb_attr)
|
|
{
|
|
td_s32 i;
|
|
ot_pic_buf_attr pic_buf_attr = {0};
|
|
|
|
vb_attr->valid_num = 0;
|
|
|
|
// vb for vi-vpss
|
|
pic_buf_attr.width = vi_size->width;
|
|
pic_buf_attr.height = vi_size->height;
|
|
pic_buf_attr.align = OT_DEFAULT_ALIGN;
|
|
pic_buf_attr.bit_width = OT_DATA_BIT_WIDTH_8;
|
|
pic_buf_attr.pixel_format = SAMPLE_PIXEL_FORMAT;
|
|
pic_buf_attr.compress_mode = OT_COMPRESS_MODE_NONE;
|
|
vb_attr->blk_size[vb_attr->valid_num] = ot_common_get_pic_buf_size(&pic_buf_attr);
|
|
vb_attr->blk_cnt[vb_attr->valid_num] = 4; // 4: vb num
|
|
vb_attr->valid_num++;
|
|
|
|
// vb for vpss-venc(big stream)
|
|
if (vb_attr->valid_num >= OT_VB_MAX_COMMON_POOLS) {
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < OT_VPSS_MAX_PHYS_CHN_NUM && vb_attr->valid_num < OT_VB_MAX_COMMON_POOLS; i++) {
|
|
if (vpss_chn_attr->enable[i] == TD_TRUE) {
|
|
pic_buf_attr.width = vpss_chn_attr->output_size[i].width;
|
|
pic_buf_attr.height = vpss_chn_attr->output_size[i].height;
|
|
pic_buf_attr.align = OT_DEFAULT_ALIGN;
|
|
pic_buf_attr.bit_width = OT_DATA_BIT_WIDTH_8;
|
|
pic_buf_attr.pixel_format = vpss_chn_attr->pixel_format;
|
|
pic_buf_attr.compress_mode = vpss_chn_attr->compress_mode[i];
|
|
vb_attr->blk_size[vb_attr->valid_num] = ot_common_get_pic_buf_size(&pic_buf_attr);
|
|
vb_attr->blk_cnt[vb_attr->valid_num] = 3; // 3: vb num
|
|
vb_attr->valid_num++;
|
|
}
|
|
}
|
|
}
|
|
|
|
static td_void get_vb_attr_default(sample_venc_vb_attr *vb_attr)
|
|
{
|
|
td_s32 i;
|
|
ot_pic_buf_attr pic_buf_attr = {0};
|
|
|
|
vb_attr->valid_num = 0;
|
|
|
|
// vb for vi-vpss
|
|
pic_buf_attr.width = 3840;
|
|
pic_buf_attr.height = 2160;
|
|
pic_buf_attr.align = OT_DEFAULT_ALIGN;
|
|
pic_buf_attr.bit_width = OT_DATA_BIT_WIDTH_8;
|
|
pic_buf_attr.pixel_format = SAMPLE_PIXEL_FORMAT;
|
|
pic_buf_attr.compress_mode = OT_COMPRESS_MODE_NONE;
|
|
vb_attr->blk_size[vb_attr->valid_num] = ot_common_get_pic_buf_size(&pic_buf_attr);
|
|
vb_attr->blk_cnt[vb_attr->valid_num] = 4; // 4: vb num
|
|
vb_attr->valid_num++;
|
|
|
|
// vb for vpss-venc(big stream)
|
|
if (vb_attr->valid_num >= OT_VB_MAX_COMMON_POOLS) {
|
|
return;
|
|
}
|
|
|
|
// for (i = 0; i < OT_VPSS_MAX_PHYS_CHN_NUM && vb_attr->valid_num < OT_VB_MAX_COMMON_POOLS; i++) {
|
|
// if (vpss_chn_attr->enable[i] == TD_TRUE) {
|
|
pic_buf_attr.width = 3840;
|
|
pic_buf_attr.height = 2160;
|
|
pic_buf_attr.align = OT_DEFAULT_ALIGN;
|
|
pic_buf_attr.bit_width = OT_DATA_BIT_WIDTH_8;
|
|
pic_buf_attr.pixel_format = SAMPLE_PIXEL_FORMAT;
|
|
pic_buf_attr.compress_mode = OT_COMPRESS_MODE_NONE;
|
|
vb_attr->blk_size[vb_attr->valid_num] = ot_common_get_pic_buf_size(&pic_buf_attr);
|
|
vb_attr->blk_cnt[vb_attr->valid_num] = 3; // 3: vb num
|
|
vb_attr->valid_num++;
|
|
// }
|
|
//}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static td_void get_default_vi_cfg(sample_vi_config *vi_cfg)
|
|
{
|
|
#if SAMPLE_AD_TYPE == AD_NVP6158
|
|
vi_cfg->vi_mode = SAMPLE_VI_MODE_720P_2X2;
|
|
#elif SAMPLE_AD_TYPE == AD_TP2854B || SAMPLE_AD_TYPE == AD_TP2856
|
|
vi_cfg->vi_mode = SAMPLE_VI_MODE_1080P_1X2;
|
|
#elif SAMPLE_AD_TYPE == BT1120
|
|
vi_cfg->vi_mode = SAMPLE_VI_MODE_1080P_2X1;
|
|
#endif
|
|
if(resolution==0){ //720P
|
|
vi_cfg->vi_mode = SAMPLE_VI_MODE_720P_2X1;
|
|
}else if(resolution==1){ //1080P
|
|
vi_cfg->vi_mode = SAMPLE_VI_MODE_1080P_2X1;
|
|
}else if(resolution==2){ //4K
|
|
vi_cfg->vi_mode = SAMPLE_VI_MODE_4K_2X1;
|
|
}
|
|
|
|
|
|
vi_cfg->video_encoding = SAMPLE_VIDEO_ENCODING_NTSC;
|
|
}
|
|
|
|
static ot_size get_vi_size_from_mode(sample_vi_mode vi_mode)
|
|
{
|
|
td_s32 ret;
|
|
ot_size vi_size = { 0 };
|
|
ot_pic_size vi_pic_size;
|
|
|
|
ret = sample_common_vi_get_size_by_mode(vi_mode, &vi_pic_size);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("get size by mode failed!\n");
|
|
goto exit;
|
|
}
|
|
|
|
ret = sample_comm_sys_get_pic_size(vi_pic_size, &vi_size);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("get pic size failed!\n");
|
|
goto exit;
|
|
}
|
|
|
|
exit:
|
|
return vi_size;
|
|
}
|
|
|
|
static td_void get_default_vpss_chn_attr(ot_size vi_size, ot_size enc_size[], td_s32 len,
|
|
sample_venc_vpss_chn_attr *vpss_chan_attr)
|
|
{
|
|
td_s32 i;
|
|
td_u32 max_width, max_height;
|
|
|
|
if (memset_s(vpss_chan_attr, sizeof(sample_venc_vpss_chn_attr), 0, sizeof(sample_venc_vpss_chn_attr)) != EOK) {
|
|
printf("vpss chn attr call memset_s error\n");
|
|
return;
|
|
}
|
|
|
|
max_width = vi_size.width;
|
|
max_height = vi_size.height;
|
|
|
|
for (i = 0; (i < len) && (i < OT_VPSS_MAX_PHYS_CHN_NUM); i++) {
|
|
vpss_chan_attr->output_size[i].width = enc_size[i].width;
|
|
vpss_chan_attr->output_size[i].height = enc_size[i].height;
|
|
vpss_chan_attr->compress_mode[i] = OT_COMPRESS_MODE_NONE;
|
|
vpss_chan_attr->enable[i] = TD_TRUE;
|
|
|
|
max_width = MAX2(max_width, enc_size[i].width);
|
|
max_height = MAX2(max_height, enc_size[i].height);
|
|
}
|
|
|
|
vpss_chan_attr->max_size.width = max_width;
|
|
vpss_chan_attr->max_size.height = max_height;
|
|
vpss_chan_attr->pixel_format = OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420;
|
|
|
|
return;
|
|
}
|
|
|
|
static td_s32 sample_venc_sys_init(sample_venc_vb_attr *vb_attr)
|
|
{
|
|
td_s32 ret;
|
|
td_u32 i;
|
|
ot_vb_cfg vb_cfg = {0};
|
|
|
|
if (vb_attr->valid_num > OT_VB_MAX_COMMON_POOLS) {
|
|
sample_print("sample_venc_sys_init vb valid num(%d) too large than OT_VB_MAX_COMMON_POOLS(%d)!\n",
|
|
vb_attr->valid_num, OT_VB_MAX_COMMON_POOLS);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
for (i = 0; i < vb_attr->valid_num; i++) {
|
|
vb_cfg.common_pool[i].blk_size = vb_attr->blk_size[i];
|
|
vb_cfg.common_pool[i].blk_cnt = vb_attr->blk_cnt[i];
|
|
}
|
|
|
|
vb_cfg.max_pool_cnt = vb_attr->valid_num;
|
|
|
|
if (vb_attr->supplement_config == 0) {
|
|
ret = sample_comm_sys_init(&vb_cfg);
|
|
} else {
|
|
ret = sample_comm_sys_init_with_vb_supplement(&vb_cfg, vb_attr->supplement_config);
|
|
}
|
|
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("sample_venc_sys_init failed!\n");
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 sample_venc_vi_init(sample_vi_config *vi_cfg)
|
|
{
|
|
td_s32 ret;
|
|
sample_vi_param vi_param;
|
|
|
|
/* get parameter from vi mode */
|
|
ret = sample_common_vi_mode_to_param(vi_cfg->vi_mode, &vi_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("vi get param failed!\n");
|
|
return ret;
|
|
}
|
|
|
|
//vi_param.vi_dev_cnt = 1;
|
|
//vi_param.vi_chn_cnt = 1;
|
|
//vi_param.minor_attr_en = TD_FALSE;
|
|
ret = sample_common_vi_start_vi(vi_cfg->vi_mode, vi_cfg->video_encoding, &vi_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("start vi failed with 0x%x!\n", ret);
|
|
}
|
|
|
|
ot_vi_chn_attr attr;
|
|
ss_mpi_vi_get_chn_attr(0, &attr);
|
|
attr.src_frame_rate = -1;
|
|
attr.dst_frame_rate = -1;
|
|
ss_mpi_vi_set_chn_attr(0, &attr);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_void sample_venc_vi_deinit(sample_vi_config *vi_cfg)
|
|
{
|
|
td_s32 ret;
|
|
sample_vi_param vi_param;
|
|
/* get parameter from vi mode */
|
|
ret = sample_common_vi_mode_to_param(vi_cfg->vi_mode, &vi_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("vi get param failed!\n");
|
|
return;
|
|
}
|
|
|
|
//vi_param.vi_dev_cnt = 1;
|
|
//vi_param.vi_chn_cnt = 1;
|
|
//vi_param.minor_attr_en = TD_FALSE;
|
|
ret = sample_common_vi_stop(vi_cfg->vi_mode, &vi_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("stop vi failed with 0x%x!\n", ret);
|
|
}
|
|
}
|
|
|
|
static td_s32 sample_venc_vpss_init(ot_vpss_grp vpss_grp, sample_venc_vpss_chn_attr *vpss_chan_cfg)
|
|
{
|
|
td_s32 ret;
|
|
ot_vpss_chn vpss_chn;
|
|
ot_vpss_grp_attr grp_attr = { 0 };
|
|
ot_vpss_chn_attr chn_attr[OT_VPSS_MAX_PHYS_CHN_NUM] = {0};
|
|
|
|
grp_attr.max_width = vpss_chan_cfg->max_size.width;
|
|
grp_attr.max_height = vpss_chan_cfg->max_size.height;
|
|
grp_attr.nr_en = TD_TRUE;
|
|
grp_attr.dei_mode = OT_VPSS_DEI_MODE_OFF;
|
|
grp_attr.pixel_format = vpss_chan_cfg->pixel_format;
|
|
grp_attr.frame_rate.src_frame_rate = -1;
|
|
grp_attr.frame_rate.dst_frame_rate = -1;
|
|
|
|
for (vpss_chn = 0; vpss_chn < OT_VPSS_MAX_PHYS_CHN_NUM; vpss_chn++) {
|
|
if (vpss_chan_cfg->enable[vpss_chn] == 1) {
|
|
chn_attr[vpss_chn].width = vpss_chan_cfg->output_size[vpss_chn].width;
|
|
chn_attr[vpss_chn].height = vpss_chan_cfg->output_size[vpss_chn].height;
|
|
chn_attr[vpss_chn].chn_mode = OT_VPSS_CHN_MODE_USER;
|
|
chn_attr[vpss_chn].compress_mode = vpss_chan_cfg->compress_mode[vpss_chn];
|
|
chn_attr[vpss_chn].pixel_format = vpss_chan_cfg->pixel_format;
|
|
chn_attr[vpss_chn].frame_rate.src_frame_rate = 60;
|
|
chn_attr[vpss_chn].frame_rate.dst_frame_rate = 59;
|
|
chn_attr[vpss_chn].depth = 0;
|
|
chn_attr[vpss_chn].mirror_en = 0;
|
|
chn_attr[vpss_chn].flip_en = 0;
|
|
chn_attr[vpss_chn].aspect_ratio.mode = OT_ASPECT_RATIO_NONE;
|
|
}
|
|
}
|
|
|
|
ret = sample_common_vpss_start(vpss_grp, vpss_chan_cfg->enable, &grp_attr, chn_attr, OT_VPSS_MAX_PHYS_CHN_NUM);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("failed with %#x!\n", ret);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_void sample_venc_vpss_deinit(ot_vpss_grp vpss_grp, sample_venc_vpss_chn_attr *vpss_chan_cfg)
|
|
{
|
|
td_s32 ret;
|
|
|
|
ret = sample_common_vpss_stop(vpss_grp, vpss_chan_cfg->enable, OT_VPSS_MAX_PHYS_CHN_NUM);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("failed with %#x!\n", ret);
|
|
}
|
|
}
|
|
|
|
static td_s32 sample_venc_init_param(ot_size *enc_size, td_s32 chn_num_max, sample_vi_config *vi_cfg, ot_size *vi_size,
|
|
sample_venc_vpss_chn_attr *vpss_param)
|
|
{
|
|
td_s32 i, ret;
|
|
ot_pic_size pic_size[CHN_NUM_MAX] = {BIG_STREAM_SIZE, SMALL_STREAM_SIZE};
|
|
//ot_pic_size pic_size[CHN_NUM_MAX] = {BIG_STREAM_SIZE, BIG_STREAM_SIZE};
|
|
|
|
|
|
if(resolution == 0){
|
|
|
|
printf("resolution == 720P\n");
|
|
pic_size[0] = PIC_720P;
|
|
pic_size[1] = PIC_720P;
|
|
}
|
|
|
|
if(resolution == 1){
|
|
printf("resolution == 1080P\n");
|
|
pic_size[0] = PIC_1080P;
|
|
pic_size[1] = PIC_1080P;
|
|
|
|
}
|
|
|
|
if(resolution == 2){
|
|
printf("resolution == 4KP\n");
|
|
pic_size[0] = PIC_3840X2160;
|
|
pic_size[1] = PIC_3840X2160;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < chn_num_max && i < CHN_NUM_MAX; i++) {
|
|
ret = sample_comm_sys_get_pic_size(pic_size[i], &enc_size[i]);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("sample_comm_sys_get_pic_size failed!\n");
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
// get vi param
|
|
get_default_vi_cfg(vi_cfg);
|
|
*vi_size = get_vi_size_from_mode(vi_cfg->vi_mode);
|
|
if (vi_size->width == 0 || vi_size->height == 0) {
|
|
sample_print("call get_vi_size_from_mode failed! vi mode = %d\n", vi_cfg->vi_mode);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
// get vpss param
|
|
get_default_vpss_chn_attr(*vi_size, enc_size, CHN_NUM_MAX, vpss_param);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static td_void sample_venc_set_video_param(sample_comm_venc_chnl_param *venc_create_param,
|
|
ot_venc_gop_attr gop_attr, td_s32 chn_num_max, td_bool qp_map)
|
|
{
|
|
td_u32 profile[CHN_NUM_MAX] = {0, 0};
|
|
td_bool share_buf_en = TD_TRUE;
|
|
ot_pic_size pic_size[CHN_NUM_MAX] = {BIG_STREAM_SIZE, SMALL_STREAM_SIZE};
|
|
ot_payload_type payload[CHN_NUM_MAX] = {OT_PT_H265, OT_PT_H264};
|
|
sample_rc rc_mode = 0;
|
|
|
|
|
|
if(resolution == 0){
|
|
pic_size[0] = PIC_720P;
|
|
pic_size[1] = PIC_720P;
|
|
}
|
|
|
|
if(resolution == 1){
|
|
pic_size[0] = PIC_1080P;
|
|
pic_size[1] = PIC_1080P;
|
|
|
|
}
|
|
|
|
if(resolution == 2){
|
|
pic_size[0] = PIC_3840X2160;
|
|
pic_size[1] = PIC_3840X2160;
|
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
if (qp_map) {
|
|
rc_mode = SAMPLE_RC_QPMAP;
|
|
} else {
|
|
if (get_rc_mode(payload[0], &rc_mode) != TD_SUCCESS) {
|
|
return;
|
|
}
|
|
}
|
|
rc_mode = SAMPLE_RC_CBR
|
|
#endif
|
|
rc_mode = SAMPLE_RC_CBR;
|
|
if (chn_num_max < 2) { /* 2: venc_create_param array len */
|
|
sample_print("chn_num_max %d not enough! should > 2\n", chn_num_max);
|
|
return;
|
|
}
|
|
|
|
/* encode h.265 */
|
|
venc_create_param[0].gop_attr = gop_attr;
|
|
venc_create_param[0].type = payload[0];
|
|
venc_create_param[0].size = pic_size[0];
|
|
venc_create_param[0].rc_mode = rc_mode;
|
|
venc_create_param[0].profile = profile[0];
|
|
venc_create_param[0].is_rcn_ref_share_buf = share_buf_en;
|
|
|
|
/* encode h.264 */
|
|
venc_create_param[1].gop_attr = gop_attr;
|
|
venc_create_param[1].type = payload[1];
|
|
venc_create_param[1].size = pic_size[1];
|
|
venc_create_param[1].rc_mode = rc_mode;
|
|
venc_create_param[1].profile = profile[1];
|
|
venc_create_param[1].is_rcn_ref_share_buf = share_buf_en;
|
|
}
|
|
|
|
static td_void sample_set_venc_vpss_chn(sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 i;
|
|
|
|
for (i = 0; i < CHN_NUM_MAX; i++) {
|
|
venc_vpss_chn->vpss_chn[i] = i;
|
|
venc_vpss_chn->venc_chn[i] = i;
|
|
}
|
|
}
|
|
|
|
static td_void sample_venc_unbind_vpss_stop(ot_vpss_grp vpss_grp, const sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 i;
|
|
|
|
for (i = 0; i < CHN_NUM_MAX; i++) {
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[i], venc_vpss_chn->venc_chn[i]);
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[i]);
|
|
}
|
|
}
|
|
|
|
static td_void sample_venc_stop(const sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 i;
|
|
|
|
for (i = 0; i < CHN_NUM_MAX; i++) {
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[i]);
|
|
}
|
|
}
|
|
|
|
static td_s32 sample_venc_normal_start_encode(ot_vpss_grp vpss_grp, sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_gop_mode gop_mode;
|
|
ot_venc_gop_attr gop_attr;
|
|
sample_comm_venc_chnl_param venc_create_param[CHN_NUM_MAX] = {0};
|
|
sample_comm_venc_chnl_param h265_venc_param, h264_venc_param;
|
|
|
|
//if (get_gop_mode(&gop_mode) != TD_SUCCESS) {
|
|
// return TD_FAILURE;
|
|
//}
|
|
|
|
gop_mode = OT_VENC_GOP_MODE_NORMAL_P;
|
|
if ((ret = sample_comm_venc_get_gop_attr(gop_mode, &gop_attr)) != TD_SUCCESS) {
|
|
sample_print("Venc Get GopAttr for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_set_video_param(venc_create_param, gop_attr, CHN_NUM_MAX, TD_FALSE);
|
|
|
|
/* encode h.265 */
|
|
h265_venc_param = venc_create_param[0];
|
|
if ((ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[0], &h265_venc_param)) != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = sample_comm_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("sample_comm_vpss_bind_venc failed for %#x!\n", ret);
|
|
goto EXIT_VENC_H265_STOP;
|
|
}
|
|
|
|
|
|
// return TD_SUCCESS;
|
|
|
|
#if 0
|
|
/* encode h.264 */
|
|
h264_venc_param = venc_create_param[1];
|
|
if ((ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[1], &h264_venc_param)) != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
goto EXIT_VENC_H265_UnBind;
|
|
}
|
|
|
|
ret = sample_comm_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("sample_comm_vpss_bind_venc failed for %#x!\n", ret);
|
|
goto EXIT_VENC_H264_STOP;
|
|
}
|
|
|
|
#endif
|
|
|
|
/******************************************
|
|
stream save process
|
|
******************************************/
|
|
//if ((ret = sample_comm_venc_start_get_stream(venc_vpss_chn->venc_chn, CHN_NUM_MAX)) != TD_SUCCESS) {
|
|
if ((ret = sample_comm_venc_start_get_stream(venc_vpss_chn->venc_chn, 1)) != TD_SUCCESS) {
|
|
sample_print("Start Venc failed!\n");
|
|
goto EXIT_VENC_H264_UnBind;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
|
|
EXIT_VENC_H264_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_H264_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_H265_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
EXIT_VENC_H265_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[0]);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_void sample_venc_exit_process()
|
|
{
|
|
printf("please press twice ENTER to exit this sample\n");
|
|
//(td_void)getchar();
|
|
|
|
// if (g_sample_venc_exit != TD_TRUE) {
|
|
// (td_void)getchar();
|
|
//}
|
|
sample_comm_venc_stop_get_stream(1);
|
|
}
|
|
|
|
/******************************************************************************
|
|
* function : H.265e@1080P@30fps + h264e@D1@30fps
|
|
******************************************************************************/
|
|
static td_s32 sample_venc_normal(td_void)
|
|
{
|
|
td_s32 ret;
|
|
sample_vi_config vi_cfg;
|
|
ot_size enc_size[CHN_NUM_MAX];
|
|
ot_size vi_size = {0};
|
|
const ot_vi_pipe vi_pipe = 0;
|
|
const ot_vi_chn vi_chn = 0;
|
|
const ot_vpss_grp vpss_grp = 0;
|
|
sample_venc_vpss_chn_attr vpss_param;
|
|
sample_venc_vb_attr vb_attr = {0};
|
|
sample_venc_vpss_chn venc_vpss_chn = {0};
|
|
|
|
sample_set_venc_vpss_chn(&venc_vpss_chn);
|
|
unsigned char buf[2048];
|
|
|
|
|
|
#if 0
|
|
/******************************************
|
|
step 0: related parameter ready
|
|
******************************************/
|
|
ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param);
|
|
if (ret != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
#endif
|
|
|
|
/******************************************
|
|
step 1: init sys alloc common vb
|
|
******************************************/
|
|
get_vb_attr_default(&vb_attr);
|
|
|
|
if ((ret = sample_venc_sys_init(&vb_attr)) != TD_SUCCESS) {
|
|
sample_print("Init SYS err for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
audio_init();
|
|
|
|
|
|
ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param);
|
|
if (ret != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
if ((ret = sample_venc_normal_start_encode(vpss_grp, &venc_vpss_chn)) != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
|
|
|
|
printf("sample_venc_normal_start_encode\n");
|
|
|
|
|
|
while(1){
|
|
sleep(5);
|
|
}
|
|
|
|
|
|
td_s32 ch;
|
|
while(1){
|
|
|
|
|
|
//sleep(40);
|
|
//ch++;
|
|
ch=getchar();
|
|
if(ch == 'q'){
|
|
// if(ch%2){
|
|
printf("sample_venc_vi_deinit\n");
|
|
sample_venc_exit_process();
|
|
sample_venc_unbind_vpss_stop(vpss_grp, &venc_vpss_chn);
|
|
sample_comm_vi_un_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0);
|
|
sample_venc_vpss_deinit(vpss_grp, &vpss_param);
|
|
|
|
sample_venc_vi_deinit(&vi_cfg);
|
|
}
|
|
|
|
#if 0
|
|
if(ch%2==0){
|
|
|
|
printf("sample_venc_vi_init\n");
|
|
resolution = 0;
|
|
ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param);
|
|
if (ret != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
|
|
if ((ret = sample_venc_normal_start_encode(vpss_grp, &venc_vpss_chn)) != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
// sample_comm_venc_stop_get_stream(2);
|
|
// }
|
|
#if 1
|
|
if(ch == 's'){
|
|
printf("sample_venc_vi_init\n");
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
if ((ret = sample_venc_normal_start_encode(vpss_grp, &venc_vpss_chn)) != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
|
|
}
|
|
if(ch == '0'){
|
|
resolution = 0;
|
|
ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param);
|
|
if (ret != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
|
|
if ((ret = sample_venc_normal_start_encode(vpss_grp, &venc_vpss_chn)) != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
if(ch == '1'){
|
|
|
|
resolution = 1;
|
|
|
|
ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param);
|
|
if (ret != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
|
|
if ((ret = sample_venc_normal_start_encode(vpss_grp, &venc_vpss_chn)) != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(ch == '2'){
|
|
resolution = 2;
|
|
ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param);
|
|
if (ret != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
|
|
if ((ret = sample_venc_normal_start_encode(vpss_grp, &venc_vpss_chn)) != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// sleep(2);
|
|
|
|
}
|
|
|
|
|
|
|
|
/******************************************
|
|
exit process
|
|
******************************************/
|
|
sample_venc_exit_process();
|
|
sample_venc_unbind_vpss_stop(vpss_grp, &venc_vpss_chn);
|
|
|
|
EXIT_VI_VPSS_UNBIND:
|
|
sample_comm_vi_un_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0);
|
|
EXIT_VPSS_STOP:
|
|
sample_venc_vpss_deinit(vpss_grp, &vpss_param);
|
|
EXIT_VI_STOP:
|
|
sample_venc_vi_deinit(&vi_cfg);
|
|
EXIT_SYS_STOP:
|
|
sample_comm_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 sample_venc_qpmap_start_encode(ot_size *enc_size, td_s32 chn_num_max,
|
|
ot_vpss_grp vpss_grp, sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_gop_mode gop_mode;
|
|
ot_venc_gop_attr gop_attr;
|
|
sample_comm_venc_chnl_param venc_create_param[CHN_NUM_MAX] = {0};
|
|
sample_comm_venc_chnl_param h265_venc_param, h264_venc_param;
|
|
ot_unused(chn_num_max);
|
|
|
|
#if 0
|
|
if (get_gop_mode(&gop_mode) != TD_SUCCESS) {
|
|
return TD_FAILURE;
|
|
}
|
|
#endif
|
|
gop_mode = OT_VENC_GOP_MODE_NORMAL_P;
|
|
|
|
if ((ret = sample_comm_venc_get_gop_attr(gop_mode, &gop_attr)) != TD_SUCCESS) {
|
|
sample_print("Venc Get GopAttr for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_set_video_param(venc_create_param, gop_attr, CHN_NUM_MAX, TD_TRUE);
|
|
|
|
/* encode h.265 */
|
|
h265_venc_param = venc_create_param[0];
|
|
ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[0], &h265_venc_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
/* encode h.264 */
|
|
h264_venc_param = venc_create_param[1];
|
|
ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[1], &h264_venc_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
goto EXIT_VENC_H265_STOP;
|
|
}
|
|
|
|
ret = sample_comm_venc_qpmap_send_frame(vpss_grp, venc_vpss_chn->vpss_chn,
|
|
venc_vpss_chn->venc_chn, CHN_NUM_MAX, enc_size);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("sample_comm_venc_qpmap_send_frame failed for %#x!\n", ret);
|
|
goto EXIT_VENC_H264_STOP;
|
|
}
|
|
|
|
/******************************************
|
|
stream save process
|
|
******************************************/
|
|
if ((ret = sample_comm_venc_start_get_stream(venc_vpss_chn->venc_chn, CHN_NUM_MAX)) != TD_SUCCESS) {
|
|
sample_print("Start Venc failed!\n");
|
|
goto EXIT_VENC_H264_STOP;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
|
|
EXIT_VENC_H264_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_H265_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[0]);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_void sample_venc_qpmap_exit_process()
|
|
{
|
|
printf("please press twice ENTER to exit this sample\n");
|
|
(td_void)getchar();
|
|
|
|
if (g_sample_venc_exit != TD_TRUE) {
|
|
(td_void)getchar();
|
|
}
|
|
|
|
sample_comm_venc_stop_send_qpmap_frame();
|
|
sample_comm_venc_stop_get_stream(CHN_NUM_MAX);
|
|
}
|
|
|
|
static td_s32 sample_venc_qpmap(td_void)
|
|
{
|
|
td_s32 ret;
|
|
sample_vi_config vi_cfg;
|
|
ot_size enc_size[CHN_NUM_MAX];
|
|
ot_size vi_size = {0};
|
|
const ot_vi_pipe vi_pipe = 0;
|
|
const ot_vi_chn vi_chn = 0;
|
|
const ot_vpss_grp vpss_grp = 0;
|
|
sample_venc_vpss_chn_attr vpss_param;
|
|
sample_venc_vb_attr vb_attr = {0};
|
|
sample_venc_vpss_chn venc_vpss_chn = {0};
|
|
|
|
sample_set_venc_vpss_chn(&venc_vpss_chn);
|
|
|
|
/******************************************
|
|
step 0: related parameter ready
|
|
******************************************/
|
|
ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param);
|
|
if (ret != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
/******************************************
|
|
step 1: init sys alloc common vb
|
|
******************************************/
|
|
get_vb_attr(&vi_size, &vpss_param, &vb_attr);
|
|
|
|
if ((ret = sample_venc_sys_init(&vb_attr)) != TD_SUCCESS) {
|
|
sample_print("Init SYS err for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
/******************************************
|
|
start stream venc
|
|
******************************************/
|
|
if ((ret = sample_venc_qpmap_start_encode(enc_size, CHN_NUM_MAX, vpss_grp, &venc_vpss_chn)) != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
/******************************************
|
|
exit process
|
|
******************************************/
|
|
sample_venc_qpmap_exit_process();
|
|
sample_venc_stop(&venc_vpss_chn);
|
|
|
|
EXIT_VI_VPSS_UNBIND:
|
|
sample_comm_vi_un_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0);
|
|
EXIT_VPSS_STOP:
|
|
sample_venc_vpss_deinit(vpss_grp, &vpss_param);
|
|
EXIT_VI_STOP:
|
|
sample_venc_vi_deinit(&vi_cfg);
|
|
EXIT_SYS_STOP:
|
|
sample_comm_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 sample_venc_vpss_bind_venc(ot_vpss_grp vpss_grp, ot_vpss_chn vpss_chn, ot_venc_chn venc_chn)
|
|
{
|
|
td_s32 ret;
|
|
|
|
ret = sample_comm_vpss_bind_venc(vpss_grp, vpss_chn, venc_chn);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("call sample_comm_vpss_bind_venc vpss grp %d, vpss chn %d, venc chn %d, ret = %#x!\n",
|
|
vpss_grp, vpss_chn, venc_chn, ret);
|
|
return ret;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_void sample_venc_intra_refresh_param_init(ot_venc_intra_refresh_mode intra_refresh_mode,
|
|
ot_venc_intra_refresh *intra_refresh)
|
|
{
|
|
intra_refresh->enable = TD_TRUE;
|
|
intra_refresh->mode = intra_refresh_mode;
|
|
if (intra_refresh_mode == OT_VENC_INTRA_REFRESH_ROW) {
|
|
intra_refresh->refresh_num = 5; /* 5: refresh num */
|
|
} else {
|
|
intra_refresh->refresh_num = 10; /* 6: refresh num */
|
|
}
|
|
intra_refresh->request_i_qp = 42; /* 30: request num */
|
|
}
|
|
|
|
static td_s32 sample_venc_set_intra_refresh(ot_venc_chn venc_chn, ot_venc_intra_refresh_mode intra_refresh_mode)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_intra_refresh intra_refresh = {0};
|
|
|
|
if ((ret = ss_mpi_venc_get_intra_refresh(venc_chn, &intra_refresh)) != TD_SUCCESS) {
|
|
sample_print("Get Intra Refresh failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_intra_refresh_param_init(intra_refresh_mode, &intra_refresh);
|
|
|
|
if ((ret = ss_mpi_venc_set_intra_refresh(venc_chn, &intra_refresh)) != TD_SUCCESS) {
|
|
sample_print("Set Intra Refresh failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_s32 sample_comm_venc_get_gop_default_attr(ot_venc_gop_attr *gop_attr)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_gop_mode gop_mode;
|
|
#if 0
|
|
if (get_gop_mode(&gop_mode) != TD_SUCCESS) {
|
|
return TD_FAILURE;
|
|
}
|
|
#endif
|
|
gop_mode = OT_VENC_GOP_MODE_NORMAL_P;
|
|
ret = sample_comm_venc_get_gop_attr(gop_mode, gop_attr);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("Venc get gop default attr for mode %d failed return %#x!\n", gop_mode, ret);
|
|
return ret;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_s32 sample_venc_intra_refresh_set_video_param(ot_venc_intra_refresh_mode *intra_refresh_mode,
|
|
sample_comm_venc_chnl_param *venc_create_param, td_s32 len)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_gop_attr gop_attr;
|
|
|
|
if ((ret = sample_comm_venc_get_gop_default_attr(&gop_attr)) != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
#if 0
|
|
if (get_intra_refresh_mode(intra_refresh_mode) != TD_SUCCESS) {
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
*intra_refresh_mode = OT_VENC_INTRA_REFRESH_COLUMN;
|
|
if (len > CHN_NUM_MAX) {
|
|
sample_print("the num of venc_create_param is beyond CHN_NUM_MAX !\n");
|
|
return TD_FAILURE;
|
|
}
|
|
sample_venc_set_video_param(venc_create_param, gop_attr, CHN_NUM_MAX, TD_FALSE);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_s32 sample_venc_intra_refresh_start_encode(ot_vpss_grp vpss_grp, sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_intra_refresh_mode intra_refresh_mode;
|
|
sample_comm_venc_chnl_param venc_create_param[CHN_NUM_MAX] = {0};
|
|
sample_comm_venc_chnl_param h265_venc_param, h264_venc_param;
|
|
|
|
ret = sample_venc_intra_refresh_set_video_param(&intra_refresh_mode, venc_create_param, CHN_NUM_MAX);
|
|
if (ret != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
/* encode h.265 */
|
|
h265_venc_param = venc_create_param[0];
|
|
if ((ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[0], &h265_venc_param)) != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = sample_venc_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VENC_H265_STOP;
|
|
}
|
|
|
|
/* set intra refresh mode for chn 0 */
|
|
if ((ret = sample_venc_set_intra_refresh(venc_vpss_chn->venc_chn[0], intra_refresh_mode)) != TD_SUCCESS) {
|
|
goto EXIT_VENC_H265_UnBind;
|
|
}
|
|
#if 0
|
|
/* encode h.264 */
|
|
h264_venc_param = venc_create_param[1];
|
|
if ((ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[1], &h264_venc_param)) != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
goto EXIT_VENC_H265_UnBind;
|
|
}
|
|
|
|
ret = sample_venc_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VENC_H264_STOP;
|
|
}
|
|
|
|
/* set intra refresh mode for chn 1 */
|
|
if ((ret = sample_venc_set_intra_refresh(venc_vpss_chn->venc_chn[1], intra_refresh_mode)) != TD_SUCCESS) {
|
|
goto EXIT_VENC_H264_UnBind;
|
|
}
|
|
#endif
|
|
/******************************************
|
|
stream save process
|
|
******************************************/
|
|
if ((ret = sample_comm_venc_start_get_stream(venc_vpss_chn->venc_chn, 1)) != TD_SUCCESS) {
|
|
sample_print("Start Venc failed!\n");
|
|
}
|
|
|
|
return ret;
|
|
|
|
EXIT_VENC_H264_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_H264_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_H265_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
EXIT_VENC_H265_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[0]);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* function : intra_refresh:H.265e@1080P@30fps(row) + h264e@1080P@30fps(column).
|
|
******************************************************************************/
|
|
static td_s32 sample_venc_intra_refresh(td_void)
|
|
{
|
|
td_s32 ret;
|
|
sample_vi_config vi_cfg;
|
|
ot_size vi_size = {0};
|
|
ot_size enc_size[CHN_NUM_MAX];
|
|
const ot_vi_pipe vi_pipe = 0;
|
|
const ot_vi_chn vi_chn = 0;
|
|
const ot_vpss_grp vpss_grp = 0;
|
|
sample_venc_vpss_chn_attr vpss_param;
|
|
sample_venc_vb_attr vb_attr = {0};
|
|
sample_venc_vpss_chn venc_vpss_chn = {0};
|
|
|
|
sample_set_venc_vpss_chn(&venc_vpss_chn);
|
|
|
|
/******************************************
|
|
step 0: related parameter ready
|
|
******************************************/
|
|
//if ((ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param)) != TD_SUCCESS) {
|
|
// return ret;
|
|
//}
|
|
|
|
/******************************************
|
|
step 1: init sys alloc common vb
|
|
******************************************/
|
|
//get_vb_attr(&vi_size, &vpss_param, &vb_attr);
|
|
get_vb_attr_default(&vb_attr);
|
|
if ((ret = sample_venc_sys_init(&vb_attr)) != TD_SUCCESS) {
|
|
sample_print("Init SYS err for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param)) != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
/******************************************
|
|
start stream venc
|
|
******************************************/
|
|
ret = sample_venc_intra_refresh_start_encode(vpss_grp, &venc_vpss_chn);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
|
|
while(1){
|
|
|
|
sleep(5);
|
|
}
|
|
|
|
|
|
/******************************************
|
|
exit process
|
|
******************************************/
|
|
sample_venc_exit_process();
|
|
sample_venc_unbind_vpss_stop(vpss_grp, &venc_vpss_chn);
|
|
|
|
EXIT_VI_VPSS_UNBIND:
|
|
sample_comm_vi_un_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0);
|
|
EXIT_VPSS_STOP:
|
|
sample_venc_vpss_deinit(vpss_grp, &vpss_param);
|
|
EXIT_VI_STOP:
|
|
sample_venc_vi_deinit(&vi_cfg);
|
|
EXIT_SYS_STOP:
|
|
sample_comm_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_void sample_venc_roi_attr_init(ot_venc_roi_attr *roi_attr)
|
|
{
|
|
roi_attr->is_abs_qp = TD_TRUE;
|
|
roi_attr->enable = TD_TRUE;
|
|
roi_attr->qp = 30; /* 30: qp value */
|
|
roi_attr->idx = 0;
|
|
roi_attr->rect.x = 64; /* 64: rect.x value */
|
|
roi_attr->rect.y = 64; /* 64: rect.y value */
|
|
roi_attr->rect.height = 256; /* 256: rect.height value */
|
|
roi_attr->rect.width = 256; /* 256: rect.width value */
|
|
}
|
|
|
|
static td_void sample_venc_roi_bg_frame_rate_init(ot_venc_roi_bg_frame_rate *roi_bg_frame_rate)
|
|
{
|
|
roi_bg_frame_rate->src_frame_rate = 30; /* 30: src_frame_rate value */
|
|
roi_bg_frame_rate->dst_frame_rate = 15; /* 15: dst_frame_rate value */
|
|
}
|
|
|
|
static td_s32 sample_venc_set_roi_attr(ot_venc_chn venc_chn)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_roi_attr roi_attr;
|
|
ot_venc_roi_bg_frame_rate roi_bg_frame_rate;
|
|
|
|
if ((ret = ss_mpi_venc_get_roi_attr(venc_chn, 0, &roi_attr)) != TD_SUCCESS) { /* 0: roi index */
|
|
sample_print("chn %d Get Roi Attr failed for %#x!\n", venc_chn, ret);
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_roi_attr_init(&roi_attr);
|
|
|
|
if ((ret = ss_mpi_venc_set_roi_attr(venc_chn, &roi_attr)) != TD_SUCCESS) {
|
|
sample_print("chn %d Set Roi Attr failed for %#x!\n", venc_chn, ret);
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = ss_mpi_venc_get_roi_bg_frame_rate(venc_chn, &roi_bg_frame_rate)) != TD_SUCCESS) {
|
|
sample_print("chn %d Get Roi BgFrameRate failed for %#x!\n", venc_chn, ret);
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_roi_bg_frame_rate_init(&roi_bg_frame_rate);
|
|
|
|
if ((ret = ss_mpi_venc_set_roi_bg_frame_rate(venc_chn, &roi_bg_frame_rate)) != TD_SUCCESS) {
|
|
sample_print("chn %d Set Roi BgFrameRate failed for %#x!\n", venc_chn, ret);
|
|
return ret;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_s32 sample_venc_roi_bg_start_encode(ot_vpss_grp vpss_grp, sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_gop_attr gop_attr;
|
|
sample_comm_venc_chnl_param venc_create_param[CHN_NUM_MAX] = {0};
|
|
sample_comm_venc_chnl_param h265_venc_param, h264_venc_param;
|
|
|
|
if ((ret = sample_comm_venc_get_gop_default_attr(&gop_attr)) != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_set_video_param(venc_create_param, gop_attr, CHN_NUM_MAX, TD_FALSE);
|
|
|
|
/* encode h.265 */
|
|
h265_venc_param = venc_create_param[0];
|
|
if ((ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[0], &h265_venc_param)) != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = sample_venc_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VENC_H265_STOP;
|
|
}
|
|
|
|
/* set roi bg frame rate for chn 0 */
|
|
if ((ret = sample_venc_set_roi_attr(venc_vpss_chn->venc_chn[0])) != TD_SUCCESS) {
|
|
goto EXIT_VENC_H265_UnBind;
|
|
}
|
|
|
|
/* encode h.264 */
|
|
h264_venc_param = venc_create_param[1];
|
|
if ((ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[1], &h264_venc_param)) != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
goto EXIT_VENC_H265_UnBind;
|
|
}
|
|
|
|
ret = sample_venc_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VENC_H264_STOP;
|
|
}
|
|
|
|
/* set roi bg frame rate for chn 1 */
|
|
if ((ret = sample_venc_set_roi_attr(venc_vpss_chn->venc_chn[1])) != TD_SUCCESS) {
|
|
goto EXIT_VENC_H264_UnBind;
|
|
}
|
|
|
|
/******************************************
|
|
stream save process
|
|
******************************************/
|
|
if ((ret = sample_comm_venc_start_get_stream(venc_vpss_chn->venc_chn, CHN_NUM_MAX)) != TD_SUCCESS) {
|
|
sample_print("Start Venc failed!\n");
|
|
goto EXIT_VENC_H264_UnBind;
|
|
}
|
|
|
|
return ret;
|
|
|
|
EXIT_VENC_H264_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_H264_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_H265_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
EXIT_VENC_H265_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[0]);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* function : roi_bg_frame_rate:H.265e@1080P@30fps + H.264@1080P@30fps.
|
|
******************************************************************************/
|
|
static td_s32 sample_venc_roi_bg(td_void)
|
|
{
|
|
td_s32 ret;
|
|
sample_vi_config vi_cfg;
|
|
ot_size vi_size = {0};
|
|
const ot_vi_pipe vi_pipe = 0;
|
|
const ot_vi_chn vi_chn = 0;
|
|
const ot_vpss_grp vpss_grp = 0;
|
|
sample_venc_vpss_chn_attr vpss_param;
|
|
sample_venc_vb_attr vb_attr = {0};
|
|
ot_size enc_size[CHN_NUM_MAX];
|
|
sample_venc_vpss_chn venc_vpss_chn = {0};
|
|
|
|
sample_set_venc_vpss_chn(&venc_vpss_chn);
|
|
|
|
/******************************************
|
|
step 0: related parameter ready
|
|
******************************************/
|
|
if ((ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param)) != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
/******************************************
|
|
step 1: init sys alloc common vb
|
|
******************************************/
|
|
get_vb_attr(&vi_size, &vpss_param, &vb_attr);
|
|
|
|
if ((ret = sample_venc_sys_init(&vb_attr)) != TD_SUCCESS) {
|
|
sample_print("Init SYS err for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
/******************************************
|
|
start stream venc
|
|
******************************************/
|
|
if ((ret = sample_venc_roi_bg_start_encode(vpss_grp, &venc_vpss_chn)) != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
/******************************************
|
|
exit process
|
|
******************************************/
|
|
sample_venc_exit_process();
|
|
sample_venc_unbind_vpss_stop(vpss_grp, &venc_vpss_chn);
|
|
|
|
EXIT_VI_VPSS_UNBIND:
|
|
sample_comm_vi_un_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0);
|
|
EXIT_VPSS_STOP:
|
|
sample_venc_vpss_deinit(vpss_grp, &vpss_param);
|
|
EXIT_VI_STOP:
|
|
sample_venc_vi_deinit(&vi_cfg);
|
|
EXIT_SYS_STOP:
|
|
sample_comm_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 sample_venc_set_debreath_effect(ot_venc_chn venc_chn, td_bool enable)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_debreath_effect debreath_effect;
|
|
|
|
if ((ret = ss_mpi_venc_get_debreath_effect(venc_chn, &debreath_effect)) != TD_SUCCESS) {
|
|
sample_print("Get debreath_effect failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
if (enable) {
|
|
debreath_effect.enable = TD_TRUE;
|
|
debreath_effect.strength0 = 3; /* 3 : param */
|
|
debreath_effect.strength1 = 20; /* 20 : param */
|
|
} else {
|
|
debreath_effect.enable = TD_FALSE;
|
|
}
|
|
|
|
if ((ret = ss_mpi_venc_set_debreath_effect(venc_chn, &debreath_effect)) != TD_SUCCESS) {
|
|
sample_print("Set debreath_effect failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_s32 sample_venc_debreath_effect_start_encode(ot_vpss_grp vpss_grp, sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_gop_attr gop_attr;
|
|
sample_comm_venc_chnl_param venc_create_param[CHN_NUM_MAX] = {0};
|
|
sample_comm_venc_chnl_param h265_venc_param, h264_venc_param;
|
|
|
|
if ((ret = sample_comm_venc_get_gop_default_attr(&gop_attr)) != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_set_video_param(venc_create_param, gop_attr, CHN_NUM_MAX, TD_FALSE);
|
|
|
|
/* encode h.265 */
|
|
h265_venc_param = venc_create_param[0];
|
|
if ((ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[0], &h265_venc_param)) != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = sample_venc_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VENC_H265_STOP;
|
|
}
|
|
|
|
/* set intra refresh mode for chn 0 */
|
|
if ((ret = sample_venc_set_debreath_effect(venc_vpss_chn->venc_chn[0], TD_TRUE)) != TD_SUCCESS) {
|
|
goto EXIT_VENC_H265_UnBind;
|
|
}
|
|
|
|
/* encode h.264 */
|
|
h264_venc_param = venc_create_param[1];
|
|
if ((ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[1], &h264_venc_param)) != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
goto EXIT_VENC_H265_UnBind;
|
|
}
|
|
|
|
ret = sample_venc_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VENC_H264_STOP;
|
|
}
|
|
|
|
/* set intra refresh mode for chn 1 */
|
|
if ((ret = sample_venc_set_debreath_effect(venc_vpss_chn->venc_chn[1], TD_FALSE)) != TD_SUCCESS) {
|
|
goto EXIT_VENC_H264_UnBind;
|
|
}
|
|
|
|
/******************************************
|
|
stream save process
|
|
******************************************/
|
|
if ((ret = sample_comm_venc_start_get_stream(venc_vpss_chn->venc_chn, CHN_NUM_MAX)) != TD_SUCCESS) {
|
|
sample_print("Start Venc failed!\n");
|
|
goto EXIT_VENC_H264_UnBind;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
|
|
EXIT_VENC_H264_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_H264_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_H265_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
EXIT_VENC_H265_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[0]);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 sample_venc_debreath_effect(td_void)
|
|
{
|
|
td_s32 ret;
|
|
sample_vi_config vi_cfg;
|
|
ot_size vi_size = {0};
|
|
const ot_vi_pipe vi_pipe = 0;
|
|
const ot_vi_chn vi_chn = 0;
|
|
const ot_vpss_grp vpss_grp = 0;
|
|
sample_venc_vpss_chn_attr vpss_param;
|
|
sample_venc_vb_attr vb_attr = {0};
|
|
ot_size enc_size[CHN_NUM_MAX];
|
|
sample_venc_vpss_chn venc_vpss_chn = {0};
|
|
|
|
sample_set_venc_vpss_chn(&venc_vpss_chn);
|
|
|
|
/******************************************
|
|
step 0: related parameter ready
|
|
******************************************/
|
|
if ((ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param)) != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
/******************************************
|
|
step 1: init sys alloc common vb
|
|
******************************************/
|
|
get_vb_attr(&vi_size, &vpss_param, &vb_attr);
|
|
|
|
if ((ret = sample_venc_sys_init(&vb_attr)) != TD_SUCCESS) {
|
|
sample_print("Init SYS err for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
/******************************************
|
|
start stream venc
|
|
******************************************/
|
|
ret = sample_venc_debreath_effect_start_encode(vpss_grp, &venc_vpss_chn);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
/******************************************
|
|
exit process
|
|
******************************************/
|
|
sample_venc_exit_process();
|
|
sample_venc_unbind_vpss_stop(vpss_grp, &venc_vpss_chn);
|
|
|
|
EXIT_VI_VPSS_UNBIND:
|
|
sample_comm_vi_un_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0);
|
|
EXIT_VPSS_STOP:
|
|
sample_venc_vpss_deinit(vpss_grp, &vpss_param);
|
|
EXIT_VI_STOP:
|
|
sample_venc_vi_deinit(&vi_cfg);
|
|
EXIT_SYS_STOP:
|
|
sample_comm_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_void sample_venc_mjpeg_roi_attr_init(ot_venc_jpeg_roi_attr *roi_attr, td_s32 chn_num_max)
|
|
{
|
|
if (chn_num_max < 2) { /* 2: roi_attr array len */
|
|
sample_print("roi_attr array len not enough, need 2, current %d!\n", chn_num_max);
|
|
return;
|
|
}
|
|
roi_attr[0].enable = 1;
|
|
roi_attr[0].idx = 0;
|
|
roi_attr[0].rect.x = 0;
|
|
roi_attr[0].rect.y = 0;
|
|
roi_attr[0].rect.width = 160; /* 160: rect.width value */
|
|
roi_attr[0].rect.height = 160; /* 160: rect.height value */
|
|
roi_attr[0].level = 0;
|
|
|
|
roi_attr[1].enable = 1;
|
|
roi_attr[1].idx = 0;
|
|
roi_attr[1].rect.x = 0;
|
|
roi_attr[1].rect.y = 0;
|
|
roi_attr[1].rect.width = 160; /* 160: rect.width value */
|
|
roi_attr[1].rect.height = 160; /* 160: rect.height value */
|
|
roi_attr[1].level = 0;
|
|
}
|
|
|
|
static td_void sample_venc_set_jpeg_param(sample_comm_venc_chnl_param *venc_create_param,
|
|
ot_venc_gop_attr gop_attr, td_s32 chn_num_max)
|
|
{
|
|
td_u32 profile[CHN_NUM_MAX] = {0, 0};
|
|
ot_pic_size pic_size[CHN_NUM_MAX] = {BIG_STREAM_SIZE, SMALL_STREAM_SIZE};
|
|
td_bool share_buf_en = TD_FALSE;
|
|
ot_payload_type payload[CHN_NUM_MAX] = {OT_PT_MJPEG, OT_PT_MJPEG};
|
|
sample_rc rc_mode = 0;
|
|
|
|
if (get_rc_mode(payload[0], &rc_mode) != TD_SUCCESS) {
|
|
return;
|
|
}
|
|
if (chn_num_max < 2) { /* 2: venc_create_param array len */
|
|
sample_print("chn_num_max %d not enough! should > 2\n", chn_num_max);
|
|
return;
|
|
}
|
|
|
|
venc_create_param[0].gop_attr = gop_attr;
|
|
venc_create_param[0].type = payload[0];
|
|
venc_create_param[0].size = pic_size[0];
|
|
venc_create_param[0].rc_mode = rc_mode;
|
|
venc_create_param[0].profile = profile[0];
|
|
venc_create_param[0].is_rcn_ref_share_buf = share_buf_en;
|
|
|
|
venc_create_param[1].gop_attr = gop_attr;
|
|
venc_create_param[1].type = payload[1];
|
|
venc_create_param[1].size = pic_size[1];
|
|
venc_create_param[1].rc_mode = rc_mode;
|
|
venc_create_param[1].profile = profile[1];
|
|
venc_create_param[1].is_rcn_ref_share_buf = share_buf_en;
|
|
}
|
|
|
|
static td_s32 sample_venc_mjpeg_roimap_start_encode(ot_vpss_grp vpss_grp, ot_venc_jpeg_roi_attr *roi_attr,
|
|
ot_size *enc_size, td_s32 chn_num_max, sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_gop_attr gop_attr;
|
|
sample_comm_venc_chnl_param venc_create_param[CHN_NUM_MAX] = {0};
|
|
sample_comm_venc_chnl_param venc_chn0_param, venc_chn1_param;
|
|
sample_venc_roimap_chn_info roimap_chn_info = {0};
|
|
ot_unused(chn_num_max);
|
|
|
|
if ((ret = sample_comm_venc_get_gop_attr(OT_VENC_GOP_MODE_NORMAL_P, &gop_attr)) != TD_SUCCESS) {
|
|
sample_print("Venc Get GopAttr for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_set_jpeg_param(venc_create_param, gop_attr, CHN_NUM_MAX);
|
|
|
|
venc_chn0_param = venc_create_param[0];
|
|
ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[0], &venc_chn0_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
venc_chn1_param = venc_create_param[1];
|
|
ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[1], &venc_chn1_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
goto EXIT_VENC_CHN0_STOP;
|
|
}
|
|
|
|
roimap_chn_info.vpss_chn = venc_vpss_chn->vpss_chn;
|
|
roimap_chn_info.venc_chn = venc_vpss_chn->venc_chn;
|
|
roimap_chn_info.cnt = CHN_NUM_MAX;
|
|
ret = sample_comm_venc_send_roimap_frame(vpss_grp, roimap_chn_info, enc_size, roi_attr);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("sample_comm_venc_qpmap_send_frame failed for %#x!\n", ret);
|
|
goto EXIT_VENC_CHN1_STOP;
|
|
}
|
|
|
|
/******************************************
|
|
stream save process
|
|
******************************************/
|
|
if ((ret = sample_comm_venc_start_get_stream(venc_vpss_chn->venc_chn, CHN_NUM_MAX)) != TD_SUCCESS) {
|
|
sample_print("Start Venc failed!\n");
|
|
goto EXIT_VENC_CHN1_STOP;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
|
|
EXIT_VENC_CHN1_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_CHN0_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[0]);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_void sample_venc_mjpeg_roimap_exit_process()
|
|
{
|
|
printf("please press twice ENTER to exit this sample\n");
|
|
(td_void)getchar();
|
|
|
|
if (g_sample_venc_exit != TD_TRUE) {
|
|
(td_void)getchar();
|
|
}
|
|
|
|
sample_comm_venc_stop_send_roimap_frame();
|
|
sample_comm_venc_stop_get_stream(CHN_NUM_MAX);
|
|
}
|
|
|
|
static td_s32 sample_venc_mjpeg_roimap(td_void)
|
|
{
|
|
td_s32 ret;
|
|
sample_vi_config vi_cfg;
|
|
ot_size vi_size = {0};
|
|
const ot_vi_pipe vi_pipe = 0;
|
|
const ot_vi_chn vi_chn = 0;
|
|
const ot_vpss_grp vpss_grp = 0;
|
|
sample_venc_vpss_chn_attr vpss_param;
|
|
sample_venc_vb_attr vb_attr = {0};
|
|
ot_venc_jpeg_roi_attr roi_attr[CHN_NUM_MAX];
|
|
ot_size enc_size[CHN_NUM_MAX];
|
|
sample_venc_vpss_chn venc_vpss_chn = {0};
|
|
|
|
sample_set_venc_vpss_chn(&venc_vpss_chn);
|
|
|
|
sample_venc_mjpeg_roi_attr_init(roi_attr, CHN_NUM_MAX);
|
|
|
|
if ((ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param)) != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
/******************************************
|
|
step 1: init sys alloc common vb
|
|
******************************************/
|
|
get_vb_attr(&vi_size, &vpss_param, &vb_attr);
|
|
|
|
if ((ret = sample_venc_sys_init(&vb_attr)) != TD_SUCCESS) {
|
|
sample_print("Init SYS err for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
ret = sample_venc_mjpeg_roimap_start_encode(vpss_grp, roi_attr, enc_size, CHN_NUM_MAX, &venc_vpss_chn);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
/******************************************
|
|
exit process
|
|
******************************************/
|
|
sample_venc_mjpeg_roimap_exit_process();
|
|
sample_venc_stop(&venc_vpss_chn);
|
|
|
|
EXIT_VI_VPSS_UNBIND:
|
|
sample_comm_vi_un_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0);
|
|
EXIT_VPSS_STOP:
|
|
sample_venc_vpss_deinit(vpss_grp, &vpss_param);
|
|
EXIT_VI_STOP:
|
|
sample_venc_vi_deinit(&vi_cfg);
|
|
EXIT_SYS_STOP:
|
|
sample_comm_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_void sample_venc_mjpeg_roi_param_init(ot_venc_jpeg_roi_attr *roi_param)
|
|
{
|
|
roi_param->idx = 0;
|
|
roi_param->enable = TD_TRUE;
|
|
roi_param->level = 0;
|
|
roi_param->rect.x = 0;
|
|
roi_param->rect.y = 0;
|
|
roi_param->rect.width = 1280; /* 1280: rect.width value */
|
|
roi_param->rect.height = 720; /* 720: rect.height value */
|
|
}
|
|
|
|
static td_s32 sample_venc_set_mjpeg_roi(ot_venc_chn venc_chn)
|
|
{
|
|
td_s32 ret;
|
|
const td_u32 idx = 0;
|
|
ot_venc_jpeg_roi_attr roi_param;
|
|
|
|
if ((ret = ss_mpi_venc_get_jpeg_roi_attr(venc_chn, idx, &roi_param)) != TD_SUCCESS) {
|
|
sample_print("Get roi_param failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_mjpeg_roi_param_init(&roi_param);
|
|
|
|
if ((ret = ss_mpi_venc_set_jpeg_roi_attr(venc_chn, &roi_param)) != TD_SUCCESS) {
|
|
sample_print("Set roi_param failed for %#x!\n", ret);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 sample_venc_mjpeg_roi_set_start_encode(ot_vpss_grp vpss_grp, sample_venc_vpss_chn *venc_vpss_chn)
|
|
{
|
|
td_s32 ret;
|
|
ot_venc_gop_attr gop_attr;
|
|
sample_comm_venc_chnl_param venc_create_param[CHN_NUM_MAX] = {0};
|
|
sample_comm_venc_chnl_param venc_chn0_param, venc_chn1_param;
|
|
|
|
if ((ret = sample_comm_venc_get_gop_attr(OT_VENC_GOP_MODE_NORMAL_P, &gop_attr)) != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
sample_venc_set_jpeg_param(venc_create_param, gop_attr, CHN_NUM_MAX);
|
|
|
|
venc_chn0_param = venc_create_param[0];
|
|
ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[0], &venc_chn0_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = sample_venc_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VENC_CHN0_STOP;
|
|
}
|
|
|
|
/* set intra refresh mode for chn 0 */
|
|
if ((ret = sample_venc_set_mjpeg_roi(venc_vpss_chn->venc_chn[0])) != TD_SUCCESS) {
|
|
goto EXIT_VENC_CHN_0_UnBind;
|
|
}
|
|
|
|
venc_chn1_param = venc_create_param[1];
|
|
ret = sample_comm_venc_start(venc_vpss_chn->venc_chn[1], &venc_chn1_param);
|
|
if (ret != TD_SUCCESS) {
|
|
sample_print("Venc Start failed for %#x!\n", ret);
|
|
goto EXIT_VENC_CHN_0_UnBind;
|
|
}
|
|
|
|
ret = sample_venc_vpss_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VENC_CHN_1_STOP;
|
|
}
|
|
|
|
/******************************************
|
|
stream save process
|
|
******************************************/
|
|
if ((ret = sample_comm_venc_start_get_stream(venc_vpss_chn->venc_chn, CHN_NUM_MAX)) != TD_SUCCESS) {
|
|
goto EXIT_VENC_CHN_1_UnBind;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
|
|
EXIT_VENC_CHN_1_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[1], venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_CHN_1_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[1]);
|
|
EXIT_VENC_CHN_0_UnBind:
|
|
sample_comm_vpss_un_bind_venc(vpss_grp, venc_vpss_chn->vpss_chn[0], venc_vpss_chn->venc_chn[0]);
|
|
EXIT_VENC_CHN0_STOP:
|
|
sample_comm_venc_stop(venc_vpss_chn->venc_chn[0]);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 sample_venc_mjpeg_roi_set(td_void)
|
|
{
|
|
td_s32 ret;
|
|
sample_vi_config vi_cfg;
|
|
ot_size vi_size = {0};
|
|
const ot_vi_pipe vi_pipe = 0;
|
|
const ot_vi_chn vi_chn = 0;
|
|
const ot_vpss_grp vpss_grp = 0;
|
|
sample_venc_vpss_chn_attr vpss_param;
|
|
sample_venc_vb_attr vb_attr = {0};
|
|
ot_size enc_size[CHN_NUM_MAX];
|
|
sample_venc_vpss_chn venc_vpss_chn = {0};
|
|
|
|
sample_set_venc_vpss_chn(&venc_vpss_chn);
|
|
|
|
/******************************************
|
|
step 0: related parameter ready
|
|
******************************************/
|
|
if ((ret = sample_venc_init_param(enc_size, CHN_NUM_MAX, &vi_cfg, &vi_size, &vpss_param)) != TD_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
/******************************************
|
|
step 1: init sys alloc common vb
|
|
******************************************/
|
|
get_vb_attr(&vi_size, &vpss_param, &vb_attr);
|
|
|
|
if ((ret = sample_venc_sys_init(&vb_attr)) != TD_SUCCESS) {
|
|
sample_print("Init SYS err for %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
if ((ret = sample_venc_vi_init(&vi_cfg)) != TD_SUCCESS) {
|
|
sample_print("Init VI err for %#x!\n", ret);
|
|
goto EXIT_SYS_STOP;
|
|
}
|
|
|
|
if ((ret = sample_venc_vpss_init(vpss_grp, &vpss_param)) != TD_SUCCESS) {
|
|
sample_print("Init VPSS err for %#x!\n", ret);
|
|
goto EXIT_VI_STOP;
|
|
}
|
|
|
|
if ((ret = sample_comm_vi_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0)) != TD_SUCCESS) {
|
|
sample_print("VI Bind VPSS err for %#x!\n", ret);
|
|
goto EXIT_VPSS_STOP;
|
|
}
|
|
|
|
/******************************************
|
|
start stream venc
|
|
******************************************/
|
|
ret = sample_venc_mjpeg_roi_set_start_encode(vpss_grp, &venc_vpss_chn);
|
|
if (ret != TD_SUCCESS) {
|
|
goto EXIT_VI_VPSS_UNBIND;
|
|
}
|
|
|
|
/******************************************
|
|
exit process
|
|
******************************************/
|
|
sample_venc_exit_process();
|
|
sample_venc_unbind_vpss_stop(vpss_grp, &venc_vpss_chn);
|
|
|
|
EXIT_VI_VPSS_UNBIND:
|
|
sample_comm_vi_un_bind_vpss(vi_pipe, vi_chn, vpss_grp, 0);
|
|
EXIT_VPSS_STOP:
|
|
sample_venc_vpss_deinit(vpss_grp, &vpss_param);
|
|
EXIT_VI_STOP:
|
|
sample_venc_vi_deinit(&vi_cfg);
|
|
EXIT_SYS_STOP:
|
|
sample_comm_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 sample_venc_choose_mode(td_u32 index)
|
|
{
|
|
td_s32 ret;
|
|
|
|
switch (index) {
|
|
case 0: /* 0: mode 0 */
|
|
ret = sample_venc_normal();
|
|
break;
|
|
|
|
case 1: /* 1: mode 1 */
|
|
ret = sample_venc_qpmap();
|
|
break;
|
|
|
|
case 2: /* 2: mode 2 */
|
|
ret = sample_venc_intra_refresh();
|
|
break;
|
|
|
|
case 3: /* 3: mode 3 */
|
|
ret = sample_venc_roi_bg();
|
|
break;
|
|
|
|
case 4: /* 4: mode 4 */
|
|
ret = sample_venc_debreath_effect();
|
|
break;
|
|
|
|
case 5: /* 5: mode 5 */
|
|
ret = sample_venc_mjpeg_roi_set();
|
|
break;
|
|
|
|
case 6: /* 6: mode 6 */
|
|
ret = sample_venc_mjpeg_roimap();
|
|
break;
|
|
default:
|
|
printf("the index is invalid!\n");
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* function : main()
|
|
* description : video venc sample
|
|
******************************************************************************/
|
|
#ifdef __LITEOS__
|
|
td_s32 app_main(td_s32 argc, td_char *argv[])
|
|
#else
|
|
td_s32 main(td_s32 argc, td_char *argv[])
|
|
#endif
|
|
{
|
|
td_s32 ret;
|
|
td_u32 index;
|
|
|
|
#if 0
|
|
if (argc != 2) { /* 2:arg num */
|
|
sample_venc_usage(argv[0]);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
if (!strncmp(argv[1], "-h", 2)) { /* 2:arg num */
|
|
sample_venc_usage(argv[0]);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
if (strlen(argv[1]) != 1) {
|
|
sample_venc_usage(argv[0]);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
if (argv[1][0] < '0' || argv[1][0] > '9') {
|
|
sample_venc_usage(argv[0]);
|
|
return TD_FAILURE;
|
|
}
|
|
#endif
|
|
index = atoi(argv[1]);
|
|
udp_init(argv[2],atoi(argv[3]));
|
|
|
|
|
|
//ringbuffer_init();
|
|
|
|
#if 1
|
|
struct ifreq ifr;
|
|
|
|
memset(&ifr, 0, sizeof(ifr));
|
|
strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
|
|
strncpy(ifr.ifr_name, "lo", sizeof(ifr.ifr_name));
|
|
|
|
ioctl(socket_descriptor, SIOCGIFTXQLEN, &ifr);
|
|
|
|
printf("len is %d\n",ifr.ifr_qlen);
|
|
|
|
ifr.ifr_qlen = 2000;
|
|
|
|
ioctl(socket_descriptor, SIOCSIFTXQLEN, &ifr);
|
|
|
|
printf("len is %d\n",ifr.ifr_qlen);
|
|
|
|
memset(&ifr, 0, sizeof(ifr));
|
|
strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
|
|
strncpy(ifr.ifr_name, "lo", sizeof(ifr.ifr_name));
|
|
|
|
ioctl(socket_descriptor, SIOCGIFTXQLEN, &ifr);
|
|
|
|
printf("len is %d\n",ifr.ifr_qlen);
|
|
|
|
#endif
|
|
|
|
#ifndef __LITEOS__
|
|
sample_sys_signal(sample_venc_handle_sig);
|
|
#endif
|
|
|
|
#if defined(OT_VQE_USE_STATIC_MODULE_REGISTER)
|
|
ret = sample_audio_register_vqe_module();
|
|
if (ret != TD_SUCCESS) {
|
|
return TD_FAILURE;
|
|
}
|
|
#endif
|
|
|
|
|
|
resolution=1;
|
|
|
|
|
|
ret = sample_venc_choose_mode(index);
|
|
if (ret == TD_SUCCESS) {
|
|
printf("program exit normally!\n");
|
|
} else {
|
|
printf("program exit abnormally!\n");
|
|
}
|
|
|
|
#ifdef __LITEOS__
|
|
return ret;
|
|
#else
|
|
exit(ret);
|
|
#endif
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* end of #ifdef __cplusplus */
|