📄 video_enc.c
字号:
/*step 6: stop video encode channel*/ hiRet = HI_VENC_StopCH(venc_chn); if ( hiRet != HI_SUCCESS ) { HI_VENC_Close(); return hiRet; } /*step 7: destroy video encode channel*/ hiRet = HI_VENC_DestroyCH(venc_chn, HI_FALSE); if ( hiRet != HI_SUCCESS ) { HI_VENC_Close(); return hiRet; } fclose(pfile); return 0;}int vstart(VI_CHN vichn){ pthread_t mythread; if ( pthread_create( &mythread, NULL, (void*)venc_start, (void*)(&vichn)) ) { printf("error creating thread."); return -1; } printf("### You can use \"vstop\" to stop saving file.###\n"); return 0;}int vstart_sender(VSTART_ARG_S *pVstartArg){ pthread_t mythread; if ( pthread_create( &mythread, NULL, (void*)venc_sender_start, (void*)(pVstartArg)) ) { printf("error creating thread."); return -1; } printf("### You can use \"vstop\" to stop saving file.###\n"); return 0;}int vstop(VENC_CHN venc_chn){ if ( venc_chn >= VENC_MAX_CHN_NUM || venc_chn < 0 ) { printf("vstop: invalid venc chn\n"); return -1; } g_s32VencStopFlag[venc_chn] = HI_TRUE; return 0;}static VSTART_ARG_S g_struVstartArg;static HI_S32 parsearg(int argc){ HI_S32 hiRet; VENC_CHN venc_chn; VI_CHN vi_chn; if(0 == strcmp("vstart", args[0]) && strlen(args[1]) != 0 && argc == 2) { vi_chn = atoi(args[1]); printf("vi_chn = %d\n", vi_chn); hiRet = vstart(vi_chn); } else if(0 == strcmp("vstart", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0) { venc_chn = atoi(args[1]); printf("vi_chn = %d\n", venc_chn); g_struVstartArg.viChn = venc_chn; g_struVstartArg.ipaddr = args[2]; printf("\nipaddr %s\n",g_struVstartArg.ipaddr); hiRet = vstart_sender(&g_struVstartArg); } else if(0 == strcmp("vstop", args[0]) && strlen(args[1]) != 0) { venc_chn = atoi(args[1]); printf("venc_chn = %d\n", venc_chn); hiRet = vstop(venc_chn); } else if(0 == strcmp("i", args[0]) && strlen(args[1]) != 0)/*request i frame*/ { venc_chn = atoi(args[1]); printf("venc_chn = %d\n", venc_chn); hiRet = HI_VENC_RequestIFrame(venc_chn); if ( hiRet == HI_SUCCESS ) { printf("requst i frame ok!\n"); } CHECK_RET(hiRet); } else if(0 == strcmp("enc2g", args[0]) && strlen(args[1]) != 0 )/*start color2grey */ { venc_chn = atoi(args[1]); if (HI_SUCCESS == HI_VENC_EnColor2Grey(venc_chn)) { printf ("enable color 2 grey success\n"); } else { printf ("enable color 2 grey failed\n"); } return HI_SUCCESS; } else if(0 == strcmp("disc2g", args[0]) && strlen(args[1]) != 0 )/*stop color2grey */ { venc_chn = atoi(args[1]); if (HI_SUCCESS == HI_VENC_DisColor2Grey(venc_chn)) { printf ("enable color 2 grey success\n"); } else { printf ("enable color 2 grey failed\n"); } return HI_SUCCESS; } else if(0 == strcmp("gop", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set I fram GOP*/ { venc_chn = atoi(args[1]); HI_U32 gop = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_GOP, gop); if (HI_SUCCESS != hiRet) { printf ("set gop failed error: %x\n", hiRet); } else { printf ("set gop successful\n"); } } else if(0 == strcmp("fps", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set target frame rate*/ { venc_chn = atoi(args[1]); HI_U32 vencfps = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_TARGET_FRAMERATE, vencfps); if (HI_SUCCESS != hiRet) { printf ("set frame rate failed error: %x\n", hiRet); } else { printf ("set frame rate successful\n"); } } else if(0 == strcmp("maxqp", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set MAXQP*/ { venc_chn = atoi(args[1]); HI_U32 qp = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_MAX_QP, qp); if (HI_SUCCESS != hiRet) { printf ("set maxqp failed error: %x\n", hiRet); } else { printf ("set maxqp successful\n"); } } else if(0 == strcmp("tbps", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set target bit rate*/ { venc_chn = atoi(args[1]); HI_U32 bps = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_TARGET_BITRATE, bps); if (HI_SUCCESS != hiRet) { printf ("set target bps failed error: %x\n", hiRet); } else { printf ("set target bps successful\n"); } } else if(0 == strcmp("mbps", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set max bitrate*/ { venc_chn = atoi(args[1]); HI_U32 bps = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_MAXBPS, bps); if (HI_SUCCESS != hiRet) { printf ("set max bps failed error: %x\n", hiRet); } else { printf ("set max bps successful\n"); } } else if(0 == strcmp("mode", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set stream mode(CRV/BR)*/ { venc_chn = atoi(args[1]); HI_U32 mode = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_MODE, mode); if (HI_SUCCESS != hiRet) { printf ("set mode(cbr/vbr) failed error: %x\n", hiRet); } else { printf ("set mode(cbr/vbr) successful\n"); } } else if(0 == strcmp("delay", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*the time delay for video encoder*/ { venc_chn = atoi(args[1]); HI_U32 mode = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_STRATEGY, mode); if (HI_SUCCESS != hiRet) { printf ("set delay time failed error: %x\n", hiRet); } else { printf ("set delay time successful\n"); } } else if(0 == strcmp("bqp", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set baseQP*/ { venc_chn = atoi(args[1]); HI_U32 bqp = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_BASEQP, bqp); if (HI_SUCCESS != hiRet) { printf ("set baseqp failed error: %x\n", hiRet); } else { printf ("set baseqp successful\n"); } } else if(0 == strcmp("pre", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set preference*/ { venc_chn = atoi(args[1]); HI_U32 pre = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_PREFRAMERATE, pre); if (HI_SUCCESS != hiRet) { printf ("set preferframerate failed error: %x\n", hiRet); } else { printf ("set preferframerate successful\n"); } } else if(0 == strcmp("umv", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set UMV*/ { venc_chn = atoi(args[1]); HI_U32 width = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_UMV, width); if (HI_SUCCESS != hiRet) { printf ("set UMV failed error: %x\n", hiRet); } else { printf ("set UMV successful\n"); } } else if(0 == strcmp("df", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set DF*/ { venc_chn = atoi(args[1]); HI_U32 width = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_DF, width); if (HI_SUCCESS != hiRet) { printf ("set DF failed error: %x\n", hiRet); } else { printf ("set DF successful\n"); } } else if(0 == strcmp("mq", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set MQ*/ { venc_chn = atoi(args[1]); HI_U32 width = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_MQ, width); if (HI_SUCCESS != hiRet) { printf ("set MQ failed error: %x\n", hiRet); } else { printf ("set MQ successful\n"); } } else if(0 == strcmp("updatetime", args[0]) && strlen(args[1]) != 0 && strlen(args[2]) != 0)/*set updatetime[1,4]*/ { venc_chn = atoi(args[1]); HI_U32 width = atoi(args[2]); hiRet = HI_VENC_SetSingleAttr(venc_chn, VENC_UPDATETIME, width); if (HI_SUCCESS != hiRet) { printf ("set updatetime failed error: %x\n", hiRet); } else { printf ("set updatetime successful\n"); } } else if(0 == strcmp("userdata", args[0]) && strlen(args[1]) != 0)/*insert userdata*/ { venc_chn = atoi(args[1]); printf("venc_chn = %d\n", venc_chn); HI_CHAR userdata[256]; sprintf(userdata, "welcome to hisilicon!\n"); hiRet = HI_VENC_InsertUserInfo(venc_chn, userdata, strlen(userdata)); CHECK_RET(hiRet); } else if ( 0 == strcmp("get", args[0]) && strlen(args[1]) != 0 ) /*get the attribut of channel*/ { VENC_CONFIG_S venc_config; venc_chn = atoi(args[1]); switch (format) { case VENC_FORMAT_H263: { VENC_CONFIG_H263_S vencH263; hiRet = HI_VENC_GetAttr(venc_chn, &vencH263); if ( hiRet == HI_SUCCESS ) { printf("w:%u h:%u tbps:%u fps:%u maxQP:%u UMV:%u DF:%u MQ:%u prefreframerate: %u updattime: %u\n",vencH263.u32PicWidth, vencH263.u32PicHeight, vencH263.u32TargetBitrate, vencH263.u32TargetFramerate, vencH263.u32MaxQP,vencH263.u32UMV,vencH263.u32DF, vencH263.u32MQ, vencH263.u32PreferFrameRate, vencH263.UpdateTime); } else { printf ("error code: %x\n", hiRet); } } break; case VENC_FORMAT_H264: { VENC_CONFIG_H264_S vencH264; hiRet = HI_VENC_GetAttr(venc_chn, &vencH264); if ( hiRet == HI_SUCCESS ) { printf("mode:%u w:%u h:%u tbps:%u mbps:%u fps:%u gop:%u maxQP:%u baseqp:%u prefreframerate: %u, delay: %d\n",vencH264.u32VencMode,vencH264.u32PicWidth, vencH264.u32PicHeight, vencH264.u32TargetBitrate, vencH264.u32MaxBitRate,vencH264.u32TargetFramerate, vencH264.u32Gop,vencH264.u32MaxQP,vencH264.u32BaseQP, vencH264.u32PreferFrameRate, vencH264.u32Strategy); } else { printf ("error code: %x\n", hiRet); } } break; default: printf ("invvalid venc format"); break; } return HI_SUCCESS; } else { printf("cmd: \n"); printf("vstart x (w h fps) : save stream of channel x for h.264 and h.263\n"); printf("vstart vichn: ipaddr : send stream of channel x by rtp to ipaddr for h.264\n"); printf("vstop chn : stop saving stream of channel x for h.264 and h.263\n"); printf("tbps chn x : set target bps to [chn] [x] for h.264 and h.263\n"); printf("mbps chn x : set max bps to [chn] [x] for h.264\n"); printf("mode chn x : set vbr/cbr to [chn] [x], 0 stand cbr,1 stand vbr for h.264\n"); printf("fps chn x : set fps to [chn] [x] for h.264 and h.263\n"); printf("pre chn x : set preferframerate to [x] for h.264 and h.263\n"); printf("maxqp chn x : set max QP to [chn] [x] for h.264 and h.263\n"); printf("bqp chn x : set base QP to [chn] [x] for h.264\n"); printf("gop chn x : set gop to [chn] [x] for h.264\n"); printf("delay chn x : set time delay [chn] [x] ms for h.264\n"); printf("get chn : get attr info of [chn] for h.264 and h.263\n"); printf("i chn : request i frame at channel [chn] for h.264\n"); printf("enc2g chn : enable color2grey [chn] for h.264 and h.263\n"); printf("disc2g chn : disable color2grey [chn] for h.264 and h.263\n"); printf("umv chn x : set umv [chn] [x] for h.263\n"); printf("df chn x : set df [chn] for h.263\n"); printf("mq chn x : set mq [chn] for h.263\n"); printf("updatetime chn x : set updatetime [chn] for h.263\n"); printf("userdata chn : insert userdat to [chn] for h.264\n"); printf("q : exit for h.263 and h.264\n"); } return HI_SUCCESS;}static int adjust_str(char *ptr){ int i; while(*ptr==' ' && *ptr++ != '\0'); for(i=strlen(ptr);i>0;i--) { if(*(ptr+i-1) == 0x0a || *(ptr+i-1) == ' ') *(ptr+i-1) = '\0'; else break; } for(i=0;i<10;i++) { int j = 0; while(*ptr==' ' && *ptr++ != '\0'); while((*ptr !=' ') && (*ptr!='\0')) { args[i][j++] = *ptr++; } args[i][j] = '\0'; if('\0' == *ptr) { i++; break; } args[i][j] = '\0'; } return i;}int main(int argc, char* argv[]){ char buffer[256]; char *ptr; VENC_INIT_S venc_init; HI_S32 hiRet; /*step 1: config A/D devide*/ hiRet = ADconfig(mode, normal); if (HI_SUCCESS != hiRet) { printf ("ADconfig failed\n"); HI_VENC_Close(); return hiRet; } /*step 2: config VI public channel*/ hiRet = ViPubConfig(mode, normal, format); if (HI_SUCCESS != hiRet) { printf ("vi public atr config failed\n"); HI_VENC_Close(); return hiRet; } for(;;) { printf("> "); ptr = fgets(buffer, 255, stdin); memset(args, 0, sizeof(args)); argc = adjust_str(ptr); if(0 == strcmp("q", args[0]) || 0 == strcmp("Q", args[0])) { printf("Please wait...\n"); sleep(2); HI_VENC_Close(); return 0; } parsearg(argc); } return 0;}#ifdef __cplusplus#if __cplusplus}#endif#endif /* End of #ifdef __cplusplus */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -