|
|
@@ -0,0 +1,579 @@ |
|
|
|
#include "../XNetSDKTest.h" |
|
|
|
#include "Simplify_Encode.h" |
|
|
|
#include "XNetSDKSyn.h" |
|
|
|
#include "EncodeCapability.h" |
|
|
|
#include "SystemFunction.h" |
|
|
|
|
|
|
|
USE_NS_NETSDK_CFG |
|
|
|
|
|
|
|
#define IFRAME_EQ_PFRAME 10 |
|
|
|
#define BITMSK(bit) (int)(1 << (bit)) |
|
|
|
|
|
|
|
|
|
|
|
typedef struct |
|
|
|
{ |
|
|
|
unsigned long dwSize; |
|
|
|
unsigned long dsMask; |
|
|
|
}SResolution; |
|
|
|
|
|
|
|
enum |
|
|
|
{ |
|
|
|
MAIN_STREAM = 0, |
|
|
|
EXPAND_STREAM, |
|
|
|
COMBINE_STREAM, |
|
|
|
STREAM_NUM, |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static SResolution m_resolution[CAPTURE_IMAGE_SIZE_EXT_V3_NR]; |
|
|
|
|
|
|
|
static int STREAM_CODE_VALUE[CAPTURE_IMAGE_SIZE_EXT_V3_NR][6] = { |
|
|
|
{512, 768, 1024, 1536, 2048, 2560}, ///< D1 |
|
|
|
{384, 512, 768, 1024, 1536, 2048}, ///< HD1 |
|
|
|
{384, 512, 768, 1024, 1536, 2048}, ///< BCIF |
|
|
|
{64, 192, 384, 512, 768, 1024}, ///< CIF |
|
|
|
{64, 128, 192, 384, 448, 512}, ///< QCIF |
|
|
|
{512, 768, 896, 1280, 1536, 2048}, ///< VGA |
|
|
|
{256, 384, 512, 640, 768, 1024}, ///< QVGA |
|
|
|
{512, 768, 896, 1280, 1536, 2048}, ///< SVCD |
|
|
|
{64, 128, 192, 384, 448, 512}, ///< QQVGA |
|
|
|
{64, 128, 256, 448, 512, 768}, ///< ND1 |
|
|
|
{896, 1024, 1536, 2048, 3072, 4096}, ///< 650TVL |
|
|
|
{1024,1536, 2048, 2560, 3072, 4096}, ///< 720P |
|
|
|
{1024,1536, 2048, 3072, 4096, 5120}, ///< 1_3M |
|
|
|
{1024,2048, 3072, 4096, 6144, 8192}, ///< UXGA |
|
|
|
{1024,2048, 3072, 4096, 6144, 8192}, ///< 1080P |
|
|
|
{1177,2355, 3532, 4710, 7065, 10240}, ///< WUXGA |
|
|
|
{1280,2560, 3840, 5120, 7680, 10240}, ///< 2_5M |
|
|
|
{1536, 3072, 4096, 6144, 8192, 10240}, ///< 3M |
|
|
|
{2048, 3072, 4096, 6144, 8192,10240}, ///5M |
|
|
|
{1024,1536, 2048, 2560, 3072, 4096}, ///< 1080N |
|
|
|
{1536, 3072, 4096, 6144, 8192, 10240}, ///< 4M |
|
|
|
{1536, 3072, 4096, 6144, 8192, 10240}, ///< 6M |
|
|
|
{1536, 3072, 4096, 6144, 8192, 10240}, ///< 8M |
|
|
|
{1536, 3072, 4096, 6144, 8192, 10240}, ///< 12M |
|
|
|
{2048, 4096, 6144, 8192, 11264, 13312}, ///< 4K |
|
|
|
{512, 768, 1024, 1536, 2048, 2560}, ///< 720N |
|
|
|
{1024,1536, 2048, 2560, 3072, 4096}, ///< WSVGA |
|
|
|
{512, 768, 896, 1280, 1536, 2048}, ///< NHD |
|
|
|
{1024,1536, 2048, 3072, 4096, 5120}, ///< 3M_N |
|
|
|
{1024,2048, 3072, 4096, 6144, 8192}, ///< 4M_N |
|
|
|
{1280, 2560, 3840, 5120, 7680, 10240}, ///< 5M_N |
|
|
|
{1536, 3072, 4096, 6144, 8192, 10240}, ///< 4K_N |
|
|
|
}; |
|
|
|
|
|
|
|
//大小眼睛的低码率 |
|
|
|
static int LOWBITRATE_STREAM_CODE_VALUE[CAPTURE_IMAGE_SIZE_EXT_V3_NR][6] = { |
|
|
|
{384, 576, 768, 1152, 1536, 1920}, ///< D1 |
|
|
|
{384, 512, 768, 1024, 1536, 2048}, ///< HD1 |
|
|
|
{384, 512, 768, 1024, 1536, 2048}, ///< BCIF |
|
|
|
{48, 144, 288, 384, 576, 768}, ///< CIF |
|
|
|
{48, 96, 144, 288, 336, 384}, ///< QCIF |
|
|
|
{512, 768, 896, 1280, 1536, 2048}, ///< VGA |
|
|
|
{256, 384, 512, 640, 768, 1024}, ///< QVGA |
|
|
|
{512, 768, 896, 1280, 1536, 2048}, ///< SVCD |
|
|
|
{64, 128, 192, 384, 448, 512}, ///< QQVGA |
|
|
|
{64, 128, 256, 448, 512, 768}, ///< ND1 |
|
|
|
{896, 1024, 1536, 2048, 3072, 4096}, ///< 960H |
|
|
|
{768, 1152, 1536, 1920, 2304, 3072}, ///< 720P |
|
|
|
{1024,1536, 2048, 3072, 4096, 5120}, ///< 960P |
|
|
|
{1024,2048, 3072, 4096, 6144, 8192}, ///< UXGA |
|
|
|
{1024,2048, 3072, 4096, 6144, 8192}, ///< 1080P |
|
|
|
{640, 1024, 1536, 2048, 3072, 4096}, ///< WUXGA |
|
|
|
{640, 1024, 1536, 2048, 3072, 4096}, ///< 2_5M |
|
|
|
{640, 1024, 1536, 2048, 3072, 4096}, ///< 3M |
|
|
|
{720, 1024, 1536, 2048, 3072, 5120}, ///< 5M |
|
|
|
{0,0, 0, 0, 0, 0}, ///< 1080N |
|
|
|
{0, 0, 0, 0, 0, 0}, ///< 4M |
|
|
|
{0,0,0,0,0,0}, //6M |
|
|
|
{0,0,0,0,0,0}, //8M |
|
|
|
{0,0,0,0,0,0}, //12M |
|
|
|
{0,0,0,0,0,0}, //4K |
|
|
|
{0, 0, 0, 0, 0, 0}, ///< 720N |
|
|
|
{0,0,0,0,0,0}, //RES1 |
|
|
|
{0,0,0,0,0,0}, //RES2 |
|
|
|
{0,0,0,0,0,0}, //RES3 |
|
|
|
{0,0,0,0,0,0}, //RES4 |
|
|
|
{0,0,0,0,0,0}, //RES5 |
|
|
|
{0,0,0,0,0,0}, //RES6 |
|
|
|
}; |
|
|
|
|
|
|
|
static int FISHEYE_STREAM_CODE_VALUE[CAPTURE_IMAGE_SIZE_EXT_V3_NR][6] = { |
|
|
|
|
|
|
|
{512, 768, 1024, 1536, 2048, 2560}, ///< D1 |
|
|
|
{384, 512, 768, 1024, 1536, 2048}, ///< HD1 |
|
|
|
{384, 512, 768, 1024, 1536, 2048}, ///< BCIF |
|
|
|
{64, 192, 384, 512, 768, 1024}, ///< CIF |
|
|
|
{64, 128, 192, 384, 448, 512}, ///< QCIF |
|
|
|
{512, 768, 896, 1280, 1536, 2048}, ///< VGA |
|
|
|
{256, 384, 512, 640, 768, 1024}, ///< QVGA |
|
|
|
{512, 768, 896, 1280, 1536, 2048}, ///< SVCD |
|
|
|
{64, 128, 192, 384, 448, 512}, ///< QQVGA |
|
|
|
{64, 128, 256, 448, 512, 768}, ///< ND1 |
|
|
|
{896, 1024, 1536, 2048, 3072, 4096}, ///< 650TVL |
|
|
|
{1536, 2048, 2560, 3072, 4096, 6096}, ///< 720P |
|
|
|
{1024,1536, 2048, 3072, 4096, 5120}, ///< 1_3M |
|
|
|
{1024,2048, 3072, 4096, 6144, 8192}, ///< UXGA |
|
|
|
{1024,2048, 3072, 4096, 6144, 8192}, ///< 1080P |
|
|
|
{1177,2355, 3532, 4710, 7065, 10240}, ///< WUXGA |
|
|
|
{1280,2560, 3840, 5120, 7680, 10240}, ///< 2_5M |
|
|
|
{1536, 3072, 4096, 6144, 8192, 10240}, ///< 3M |
|
|
|
{2048, 3072, 4096, 6144, 8192,10240}, ///5M |
|
|
|
{1024,1536, 2048, 2560, 3072, 4096}, ///< 1080N |
|
|
|
{1536, 3072, 4096, 6144, 8192, 10240}, ///< 4M |
|
|
|
{0,0,0,0,0,0}, //6M |
|
|
|
{0,0,0,0,0,0}, //8M |
|
|
|
{0,0,0,0,0,0}, //12M |
|
|
|
{0,0,0,0,0,0}, //4K |
|
|
|
{512, 768, 1024, 1536, 2048, 2560}, ///< 720N |
|
|
|
{1024,1536, 2048, 2560, 3072, 4096}, ///< WSVGA |
|
|
|
{0,0,0,0,0,0}, //RES2 |
|
|
|
{0,0,0,0,0,0}, //RES3 |
|
|
|
{0,0,0,0,0,0}, //RES4 |
|
|
|
{0,0,0,0,0,0}, //RES5 |
|
|
|
{0,0,0,0,0,0}, //RES6 |
|
|
|
}; |
|
|
|
static int H265_STREAM_CODE_VALUE[CAPTURE_IMAGE_SIZE_EXT_V3_NR][6] = { |
|
|
|
|
|
|
|
{332, 499, 665, 998, 1331, 1664}, ///< D1 |
|
|
|
{249, 332, 499, 665, 998, 1331}, ///< HD1 |
|
|
|
{249, 332, 499, 665, 998, 1331}, ///< BCIF |
|
|
|
{41, 124, 249, 332, 499, 665}, ///< CIF |
|
|
|
{41, 83, 124, 249, 291, 332}, ///< QCIF |
|
|
|
{332, 499, 582, 832, 998, 1331}, ///< VGA |
|
|
|
{166, 249, 332, 416, 499, 665}, ///< QVGA |
|
|
|
{332, 499, 582, 832, 998, 1331}, ///< SVCD |
|
|
|
{41, 83, 124, 249, 291, 332}, ///< QQVGA |
|
|
|
{41, 83, 166, 291, 332, 499}, ///< ND1 |
|
|
|
{582, 665, 998, 1331, 1996, 2662}, ///< 650TVL |
|
|
|
{665,998, 1331, 1664, 1996, 2662}, ///< 720P |
|
|
|
{665,998, 1331, 1996, 2662, 3328}, ///< 1_3M |
|
|
|
{665,1331, 1996, 2662, 3993, 5324}, ///< UXGA |
|
|
|
{665,1331, 1996, 2662, 3993, 5324}, ///< 1080P |
|
|
|
{765,1530, 2295, 3061, 4592, 6656}, ///< WUXGA |
|
|
|
{832,1664, 2496, 3328, 4992, 6656}, ///< 2_5M |
|
|
|
{998, 1996, 2662, 3993, 5324, 6656}, ///< 3M |
|
|
|
{1331, 1996, 2662, 3993, 5324,6656}, ///5M |
|
|
|
{665,998, 1331, 1664, 1996, 2662}, ///< 1080N |
|
|
|
{998, 1996, 2662, 3993, 5324, 6656}, ///< 4M |
|
|
|
{998, 1996, 2662, 3993, 5324, 6656}, ///< 6M |
|
|
|
{998, 1996, 2662, 3993, 5324, 6656}, ///< 8M |
|
|
|
{998, 1996, 2662, 3993, 5324, 6656}, ///< 12M |
|
|
|
{1331, 2662, 3993, 5324, 7321, 8652}, ///< 4K |
|
|
|
{332, 499, 665, 998, 1331, 1664}, ///< 720N |
|
|
|
{582, 665, 998, 1331, 1996, 2662}, ///< WSVGA(1024*576) |
|
|
|
{332, 499, 582, 832, 998, 1327}, ///< NHD |
|
|
|
{665,998, 1331, 1996, 2662, 3328}, ///< 3M_N |
|
|
|
{665,1331, 1996, 2662, 3993, 5324}, ///< 4M_N |
|
|
|
{832, 1664, 2496, 3328, 4992, 6656}, ///< 5M_N |
|
|
|
{1331, 1996, 2665, 3993, 5324, 6656}, ///< 4K_N |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
//函数说明:计算码固定码率支持的码流值 |
|
|
|
//参数说明: |
|
|
|
//dstFormat : 媒体格式 |
|
|
|
//bLowBitrate : 是否支持大小眼 |
|
|
|
//bLowBitrate : 是否支持鱼眼 |
|
|
|
//bH265Bitrate : 是否支持h265 |
|
|
|
|
|
|
|
void CalculateCodeStreamValue(SDK_VIDEO_FORMAT * vfSetFormat, bool bLowBitrate, bool bFisheyeBitrate, bool bH265Bitrate) |
|
|
|
{ |
|
|
|
int j = 0; |
|
|
|
int nTmpFPS = 0; |
|
|
|
int nFPS = 25; |
|
|
|
nTmpFPS = min(vfSetFormat->nFPS, nFPS); |
|
|
|
int iBitrate = 0; |
|
|
|
|
|
|
|
if(bLowBitrate) |
|
|
|
{ |
|
|
|
for (j = 0; j < sizeof(LOWBITRATE_STREAM_CODE_VALUE[vfSetFormat->iResolution]) / sizeof(int); ++j) |
|
|
|
{ |
|
|
|
iBitrate = LOWBITRATE_STREAM_CODE_VALUE[vfSetFormat->iResolution][j] * (vfSetFormat->iGOP * nTmpFPS + IFRAME_EQ_PFRAME - 1) / (vfSetFormat->iGOP * nFPS + IFRAME_EQ_PFRAME - 1); |
|
|
|
|
|
|
|
printf("Support iBitrate[%d] = %d\r\n", j, iBitrate); |
|
|
|
} |
|
|
|
} |
|
|
|
else if(bFisheyeBitrate) |
|
|
|
{ |
|
|
|
for (j = 0; j < sizeof(FISHEYE_STREAM_CODE_VALUE[vfSetFormat->iResolution]) / sizeof(int); ++j) |
|
|
|
{ |
|
|
|
iBitrate = FISHEYE_STREAM_CODE_VALUE[vfSetFormat->iResolution][j] * (vfSetFormat->iGOP * nTmpFPS + IFRAME_EQ_PFRAME - 1) / (vfSetFormat->iGOP * nFPS + IFRAME_EQ_PFRAME - 1); |
|
|
|
printf("Support iBitrate[%d] = %d\r\n", j, iBitrate); |
|
|
|
} |
|
|
|
} |
|
|
|
else if(bH265Bitrate) |
|
|
|
{ |
|
|
|
for (j = 0; j < sizeof(H265_STREAM_CODE_VALUE[vfSetFormat->iResolution]) / sizeof(int); ++j) |
|
|
|
{ |
|
|
|
iBitrate = H265_STREAM_CODE_VALUE[vfSetFormat->iResolution][j] * (vfSetFormat->iGOP * nTmpFPS + IFRAME_EQ_PFRAME - 1) / (vfSetFormat->iGOP * nFPS + IFRAME_EQ_PFRAME - 1); |
|
|
|
printf("Support iBitrate[%d] = %d\r\n", j, iBitrate); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for (j = 0; j < sizeof(STREAM_CODE_VALUE[vfSetFormat->iResolution]) / sizeof(int); ++j) |
|
|
|
{ |
|
|
|
iBitrate = STREAM_CODE_VALUE[vfSetFormat->iResolution][j] * (vfSetFormat->iGOP * nTmpFPS + IFRAME_EQ_PFRAME - 1) / (vfSetFormat->iGOP * nFPS + IFRAME_EQ_PFRAME - 1); |
|
|
|
printf("Support iBitrate[%d] = %d\r\n", j, iBitrate); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void GetMaxResolAndRate(int &nResolu, int &nRate, long lFreePower) |
|
|
|
{ |
|
|
|
if ( lFreePower <= 0 ) |
|
|
|
{ |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
int nSize = m_resolution[nResolu].dwSize; |
|
|
|
if ( nSize > lFreePower ) |
|
|
|
{ |
|
|
|
nResolu = -1; |
|
|
|
nRate = -1; |
|
|
|
return; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
int nTempRate = lFreePower / nSize; |
|
|
|
|
|
|
|
if ( nTempRate > 25 ) |
|
|
|
{ |
|
|
|
nTempRate = 25; |
|
|
|
} |
|
|
|
|
|
|
|
nRate = nTempRate; |
|
|
|
} |
|
|
|
|
|
|
|
long lMaxSize = nSize; |
|
|
|
for ( int i = 0; i < CAPTURE_IMAGE_SIZE_EXT_V3_NR; i ++ ) |
|
|
|
{ |
|
|
|
long lTempsize = m_resolution[i].dwSize; |
|
|
|
if ( lFreePower >= lTempsize && lMaxSize < lTempsize ) |
|
|
|
{ |
|
|
|
nResolu = i; |
|
|
|
lMaxSize = lTempsize; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void GetSupportRes(int maxSize, unsigned long dwMask ) |
|
|
|
{ |
|
|
|
for (int i = 0; i < CAPTURE_IMAGE_SIZE_EXT_V3_NR ; i ++) |
|
|
|
{ |
|
|
|
if ( (m_resolution[i].dwSize <= m_resolution[maxSize].dwSize ) |
|
|
|
&& ( dwMask & (0x01<<i) ) ) |
|
|
|
{ |
|
|
|
printf("m_resolution[%d]\r\n", i); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int TestEncodeConfig() |
|
|
|
{ |
|
|
|
printf("%s\r\n", __FUNCTION__); |
|
|
|
char c = 0; |
|
|
|
int nRet = 0; |
|
|
|
bool bSupport = false; |
|
|
|
char szOutBuffer[40960] = {0}; |
|
|
|
int nInOutSize = sizeof(szOutBuffer); |
|
|
|
int nResult = 0; |
|
|
|
int nCompression; |
|
|
|
|
|
|
|
int nMainStreamResolution = 0; |
|
|
|
unsigned long ulMask = 0; |
|
|
|
int nQuality = 0; |
|
|
|
int nGop = 0; |
|
|
|
int nFps = 0; |
|
|
|
|
|
|
|
bool m_bH265Bitrate[STREAM_NUM]; |
|
|
|
|
|
|
|
bool m_bMultiStream = false; |
|
|
|
bool m_bLowBitrate = false; |
|
|
|
bool m_bFisheyeBitrate = false; |
|
|
|
m_bH265Bitrate[MAIN_STREAM] = false; |
|
|
|
m_bH265Bitrate[EXPAND_STREAM] = false; |
|
|
|
m_bH265Bitrate[COMBINE_STREAM] = false; |
|
|
|
|
|
|
|
unsigned long lFreePower = 0; |
|
|
|
|
|
|
|
///////////////////////////////////现有支持的所有分辨率///////////////////////////////// |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_D1].dwSize = 704 * 480; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_HD1].dwSize = 704 * 240; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_BCIF].dwSize = 352 * 480; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_CIF].dwSize = 352 * 240; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_QCIF].dwSize = 176 * 120; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_VGA].dwSize = 640 * 480; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_QVGA].dwSize = 320 * 240; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_SVCD].dwSize = 480 * 480; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_QQVGA].dwSize = 160 * 128; |
|
|
|
|
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_ND1].dwSize = 240*192; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_650TVL].dwSize = 928*480; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_720P].dwSize = 1280*720; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_1_3M].dwSize = 1280*960; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_UXGA].dwSize = 1600*1200; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_1080P].dwSize = 1920*1080; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_WUXGA].dwSize = 1920*1200; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_2_5M].dwSize = 1872*1408; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_3M].dwSize = 2048*1536; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_5M].dwSize = 3744*1408; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_1080N].dwSize = 944*1080; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_4M].dwSize = 2592*1520; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_6M].dwSize = 3072*2048; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_8M].dwSize = 3264*2448; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_12M].dwSize = 4000*3000; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_4K].dwSize = 4096*2160; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_720N].dwSize = 640*720; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_WSVGA].dwSize = 1024*576; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_NHD].dwSize = 640*360; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_3M_N].dwSize = 1024*1536; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_4M_N].dwSize = 1296*1520; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_5M_N].dwSize = 1872*1408; |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_4K_N].dwSize = 2048*2160; ///2048 * 2160通用/1920*2160海思 |
|
|
|
|
|
|
|
/////////////////////////////////////////////掩码////////////////////////////////////////// |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_D1].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_HD1].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_BCIF].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_BCIF) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_CIF].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_QCIF].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_VGA].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_VGA) | BITMSK(CAPTURE_IMAGE_SIZE_QVGA); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_QVGA].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_QVGA); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_SVCD].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_SVCD); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_QQVGA].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_QQVGA); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_ND1].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_ND1); |
|
|
|
|
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_650TVL].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_720P].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_1_3M].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_UXGA].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_1080P].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_WUXGA].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_2_5M].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_3M].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_5M].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_1080N].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_650TVL) | BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF) | BITMSK(CAPTURE_IMAGE_SIZE_720P); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_4M].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_D1) | BITMSK(CAPTURE_IMAGE_SIZE_HD1) | BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF) | BITMSK(CAPTURE_IMAGE_SIZE_720P); |
|
|
|
m_resolution[CAPTURE_IMAGE_SIZE_720N].dsMask = BITMSK(CAPTURE_IMAGE_SIZE_CIF) | BITMSK(CAPTURE_IMAGE_SIZE_QCIF); |
|
|
|
|
|
|
|
while((c = getchar()) != 'q') |
|
|
|
{ |
|
|
|
switch(c) |
|
|
|
{ |
|
|
|
//判断是否支持组合编码 |
|
|
|
case 'a': |
|
|
|
{ |
|
|
|
memset(&szOutBuffer, 0, 40960); |
|
|
|
nResult = XSDK_DevGetSysConfigSyn(g_hDevice, JK_SystemFunction, szOutBuffer, &nInOutSize, 4000, JK_SystemFunction_MsgId); |
|
|
|
|
|
|
|
if(nResult >= 0) |
|
|
|
{ |
|
|
|
SystemFunction sysfunc; |
|
|
|
sysfunc.Parse(szOutBuffer); |
|
|
|
|
|
|
|
bSupport = sysfunc.mEncodeFunction.CombineStream.ToBool(); |
|
|
|
m_bMultiStream = sysfunc.mEncodeFunction.DoubleStream.ToBool(); |
|
|
|
m_bLowBitrate = sysfunc.mEncodeFunction.LowBitRate.ToBool(); |
|
|
|
m_bFisheyeBitrate = sysfunc.mOtherFunction.SupportFishEye.ToBool(); |
|
|
|
|
|
|
|
printf("bSupport = %d, m_bMultiStream = %d, m_bLowBitrate = %d, m_bFisheyeBitrate = %d\r\n", |
|
|
|
bSupport, m_bMultiStream, m_bLowBitrate, m_bFisheyeBitrate); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case 'b': |
|
|
|
{ |
|
|
|
memset(&szOutBuffer, 0, 40960); |
|
|
|
nResult = XSDK_DevGetSysConfigSyn(g_hDevice, JK_EncodeCapability, szOutBuffer, &nInOutSize, 4000, EXCMD_ABILITY_GET); |
|
|
|
|
|
|
|
if(nResult >= 0) |
|
|
|
{ |
|
|
|
EncodeCapability encode; |
|
|
|
encode.Parse(szOutBuffer); |
|
|
|
|
|
|
|
///////////////////////////////////获取主辅码流支持的压缩格式///////////////////////////////// |
|
|
|
////获取主码流支持的压缩格式 |
|
|
|
nCompression = encode.mEncodeInfo[0].CompressionMask.Value(); |
|
|
|
|
|
|
|
for ( int i = 0; i < CAPTURE_COMPRESS_NR; i ++ ) |
|
|
|
{ |
|
|
|
if (nCompression & ( 1 << i ) ) |
|
|
|
{ |
|
|
|
printf("[Main]Support Compression Type = %s\r\n", CompressionMap[i].name); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
////获取辅码流的支持的压缩格式 |
|
|
|
nCompression = encode.mEncodeInfo[1].CompressionMask.Value(); |
|
|
|
|
|
|
|
for ( int i = 0; i < CAPTURE_COMPRESS_NR; i ++ ) |
|
|
|
{ |
|
|
|
if (nCompression & ( 1 << i ) ) |
|
|
|
{ |
|
|
|
printf("[Extra]Support Compression Type = %s\r\n", CompressionMap[i].name); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
lFreePower = encode.MaxEncodePower.Value(); |
|
|
|
ulMask = encode.ImageSizePerChannel[0].Value(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case 'g': |
|
|
|
{ |
|
|
|
char szOutBuf[40960] = {0}; |
|
|
|
int nInOutBufLen = sizeof(szOutBuf); |
|
|
|
SDK_VIDEO_FORMAT mainFormat; |
|
|
|
memset(&mainFormat, 0, sizeof(SDK_VIDEO_FORMAT)); |
|
|
|
|
|
|
|
int nGetCfg = XSDK_DevGetSysConfigSyn(g_hDevice, JK_Simplify_Encode, szOutBuf, &nInOutBufLen, 4000, EXCMD_CONFIG_GET); |
|
|
|
if (nGetCfg >= 0 && nInOutBufLen > 0) |
|
|
|
{ |
|
|
|
JObjArrayObject<Simplify_Encode> cfg(NULL, JK_Simplify_Encode); |
|
|
|
cfg.Parse(szOutBuf); |
|
|
|
if(cfg.objs.Size() > 0) |
|
|
|
{ |
|
|
|
///主码流分辨率 |
|
|
|
const char * mainStrRes = cfg.objs[0].mMainFormat.mVideo.Resolution.Value(); |
|
|
|
printf("MainFormat[Resolution:%s]\r\n", cfg.objs[0].mMainFormat.mVideo.Resolution.Value()); |
|
|
|
|
|
|
|
for ( int i = 0; i < CAPTURE_IMAGE_SIZE_EXT_V3_NR; i ++ ) |
|
|
|
{ |
|
|
|
if(strcmp(mainStrRes, s_videoResolutionMap[i].name) == 0) |
|
|
|
{ |
|
|
|
nMainStreamResolution = i; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if(nMainStreamResolution == CAPTURE_COMPRESS_H265) |
|
|
|
{ |
|
|
|
m_bH265Bitrate[EXPAND_STREAM] = true; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
m_bH265Bitrate[EXPAND_STREAM] = false; |
|
|
|
} |
|
|
|
|
|
|
|
mainFormat.iResolution = nMainStreamResolution; |
|
|
|
|
|
|
|
///主码流帧率 |
|
|
|
nFps = cfg.objs[0].mMainFormat.mVideo.FPS.Value(); |
|
|
|
printf("MainFormat[FPS:%d]\r\n", cfg.objs[0].mMainFormat.mVideo.FPS.Value()); |
|
|
|
|
|
|
|
mainFormat.nFPS = nFps; |
|
|
|
|
|
|
|
///主码流码流值 |
|
|
|
printf("MainFormat[BitRate:%d]\r\n", cfg.objs[0].mMainFormat.mVideo.BitRate.Value()); |
|
|
|
|
|
|
|
mainFormat.nBitRate = cfg.objs[0].mMainFormat.mVideo.BitRate.Value(); |
|
|
|
|
|
|
|
///主码流帧间隔 |
|
|
|
nGop = cfg.objs[0].mMainFormat.mVideo.GOP.Value(); |
|
|
|
printf("MainFormat[GOP:%d]\r\n", cfg.objs[0].mMainFormat.mVideo.GOP.Value()); |
|
|
|
|
|
|
|
mainFormat.iGOP = cfg.objs[0].mMainFormat.mVideo.GOP.Value(); |
|
|
|
|
|
|
|
///主码流码率控制 |
|
|
|
printf("MainFormat[BitRateControl:%s]\r\n", cfg.objs[0].mMainFormat.mVideo.BitRateControl.Value()); |
|
|
|
|
|
|
|
|
|
|
|
///主码流压缩格式 |
|
|
|
printf("MainFormat[Compression:%s]\r\n", cfg.objs[0].mMainFormat.mVideo.Compression.Value()); |
|
|
|
|
|
|
|
int iCompression = 0; |
|
|
|
for ( int i = 0; i < CAPTURE_COMPRESS_NR; i ++ ) |
|
|
|
{ |
|
|
|
if(strcmp(mainStrRes, CompressionMap[i].name) == 0) |
|
|
|
{ |
|
|
|
iCompression = i; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
mainFormat.iCompression = iCompression; |
|
|
|
|
|
|
|
///主码流画质 |
|
|
|
nQuality = cfg.objs[0].mMainFormat.mVideo.Quality.Value(); |
|
|
|
printf("MainFormat[Quality:%d]\r\n", cfg.objs[0].mMainFormat.mVideo.Quality.Value()); |
|
|
|
|
|
|
|
mainFormat.iQuality = nQuality; |
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////设置////////////////////////////////////////////////// |
|
|
|
int nChannelCount = 1; //通道个数,默认为1 |
|
|
|
unsigned long dwChnUsed = 0; |
|
|
|
unsigned long dwChnFree = 0; |
|
|
|
unsigned long dwPower = lFreePower / nChannelCount; |
|
|
|
int nExStreamResolution = 0; |
|
|
|
|
|
|
|
int nExFps = 0; |
|
|
|
|
|
|
|
const char * ExStrRes = cfg.objs[0].mExtraFormat.mVideo.Resolution.Value(); |
|
|
|
nExFps = cfg.objs[0].mExtraFormat.mVideo.FPS.Value(); |
|
|
|
|
|
|
|
for ( int i = 0; i < CAPTURE_IMAGE_SIZE_EXT_V3_NR; i ++ ) |
|
|
|
{ |
|
|
|
if(strcmp(ExStrRes, s_videoResolutionMap[i].name) == 0) |
|
|
|
{ |
|
|
|
nExStreamResolution = i; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (m_bMultiStream && cfg.objs[0].mExtraFormat.VideoEnable.Value()) |
|
|
|
{ |
|
|
|
dwChnUsed = m_resolution[nExStreamResolution].dwSize * nExFps; |
|
|
|
} |
|
|
|
dwChnFree = dwPower - dwChnUsed; |
|
|
|
|
|
|
|
////////////主码流///////// |
|
|
|
mainFormat.nFPS = 25; |
|
|
|
int MaxSize = 0; |
|
|
|
GetMaxResolAndRate(MaxSize, nFps, dwChnFree); |
|
|
|
GetSupportRes(MaxSize, ulMask); |
|
|
|
|
|
|
|
//////固定码率时的码流值选择 |
|
|
|
CalculateCodeStreamValue(&mainFormat, m_bLowBitrate, m_bFisheyeBitrate, m_bH265Bitrate); |
|
|
|
|
|
|
|
//////////设置码流值 |
|
|
|
cfg.objs[0].mMainFormat.mVideo.FPS.SetValue(25); |
|
|
|
mainFormat.nFPS = 25; |
|
|
|
int nFPS = 25; |
|
|
|
int nTmpFPS = 25; /////设置的帧率 |
|
|
|
int dwBitrate = 0; |
|
|
|
|
|
|
|
//////////码流值的计算//////// |
|
|
|
if (m_bLowBitrate) |
|
|
|
{ |
|
|
|
dwBitrate = LOWBITRATE_STREAM_CODE_VALUE[mainFormat.iResolution][mainFormat.iQuality - 1] * (mainFormat.iGOP * nTmpFPS + IFRAME_EQ_PFRAME - 1) / (mainFormat.iGOP * nFPS + IFRAME_EQ_PFRAME - 1); |
|
|
|
} |
|
|
|
else if(m_bFisheyeBitrate) |
|
|
|
{ |
|
|
|
dwBitrate = FISHEYE_STREAM_CODE_VALUE[mainFormat.iResolution][mainFormat.iQuality - 1] * (mainFormat.iGOP * nTmpFPS + IFRAME_EQ_PFRAME - 1) / (mainFormat.iGOP * nFPS + IFRAME_EQ_PFRAME - 1); |
|
|
|
} |
|
|
|
else if (m_bH265Bitrate[MAIN_STREAM]) |
|
|
|
{ |
|
|
|
dwBitrate = H265_STREAM_CODE_VALUE[mainFormat.iResolution][mainFormat.iQuality - 1] * (mainFormat.iGOP * nTmpFPS + IFRAME_EQ_PFRAME - 1) / (mainFormat.iGOP * nFPS + IFRAME_EQ_PFRAME - 1); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
dwBitrate = STREAM_CODE_VALUE[mainFormat.iResolution][mainFormat.iQuality - 1] * (mainFormat.iGOP * nTmpFPS + IFRAME_EQ_PFRAME - 1) / (mainFormat.iGOP * nFPS + IFRAME_EQ_PFRAME - 1); |
|
|
|
} |
|
|
|
|
|
|
|
cfg.objs[0].mMainFormat.mVideo.BitRate.SetValue(dwBitrate); |
|
|
|
const char *pCfg = cfg.ToString(); |
|
|
|
|
|
|
|
XSDK_DevSetSysConfig(g_hDevice, JK_Simplify_Encode, pCfg, strlen(pCfg), 1, 5000, EXCMD_CONFIG_SET); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
|