2020年7月23日 星期四

Header(IPcam,NVR)

Android header 基本順序:
====================以下為IPCAM 基本====================

HuntStreamHeader(DATAHEADER) => HuntSystemHeader =>

以下為實際送: (system frame (uctype=0);
i frame  (uctype=1,4);
p frame(uctype=2,3) ;
faceframe(uctype=41)
motionFrame(uctype=6);
fisheyeFrame (uctype=39);
AIFrame (uctype=42)
AI_OSD_frame(uctype=32)


====================以下為IPCAM  人臉====================
*uctype=41: //face

預計送法 :  DATAHEADER =>  FACE_RECOGNITION HEADER=> FACE_RECOGNITION BODY=>THUMBNAIL DATA (沒用,影像?)=>FACE_RECOGNITION BODY=>THUMBNAIL DATA




//_FACE_RECOGNITION_HEADER  大小為18
typedef struct _FACE_RECOGNITION_HEADER 
{
unsigned short face_count;  //Total number of faces //偵測到的人臉數量
unsigned short inwidth;     //input width  //目前stream的解析度寬度
unsigned short inheight;    //input height //目前stream的解析度高度
unsigned int   length;      //(sizeof(FACE_RECOGNITION_BODY)* face_count + total_thumbnail_size) 
// +---------------+---------------+---------------+---------------+
// |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
// +---------------+---------------+---------------+---------------+
// |商湯(0x01)     | 版本佔3bytes                                  |
// |閱面(0x02)     |                                               |
// +---------------+---------------+---------------+---------------+
unsigned int   version;     //version
unsigned int   body_size;   //單個body struct size   (sizeof(FACE_RECOGNITION_BODY)) body_size=242

}__attribute__((packed)) FACE_RECOGNITION_HEADER;

FACE_RECOGNITION BODY (有好幾版v1.1 ~v9 ;以FACE_RECOGNITION_HEADER::body_size 區分)

====================以下為IPCAM  Fisheye====================
*uctype=39


size:240 bytes


typedef struct _FISHEYE_HEADER
{
    int Mode;                                               0
    int Display;                                            4
    int x1[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE];        8
    int y1[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE];        40
    int x2[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE];        72
    int y2[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE];        104
    int posx[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE];      136
    int posy[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE];      168
    int channel;                                            200
    int limit_x_min[FISHEYE_CHANNEL_SIZE];                  204
    int limit_x_max[FISHEYE_CHANNEL_SIZE];                  212
    int limit_y_min[FISHEYE_CHANNEL_SIZE];                  220
    int limit_y_max[FISHEYE_CHANNEL_SIZE];                  228
    int speed;                                              236
} __attribute__((packed)) FISHEYE_HEADER;


====================以下為IPCAM  AI====================

uctype=42: // 人形偵測?
isHuntIpcamAIFeature
new HuntAIFeatureHeader


unsigned int obj_num;               0
------依據obj_num數量決定重覆幾次------------ size: 16
    unsigned short left;                4       20
    unsigned short top;                 6       22
    unsigned short width;               8       24
    unsigned short height;              10      26
    unsigned char rect_color_R;         12      28
    unsigned char rect_color_G;         13      29
    unsigned char rect_color_B;         14      30
    unsigned char line_color_R;         15      31
    unsigned char line_color_G;         16      32
    unsigned char line_color_B;         17      33
    unsigned char line_size;            18      34
    char point_num;                     19      35

========================================

uctype=32: // 文字資訊
isHuntIpcamAI_OSD
new HuntAIFeatureOSDHeader

size:167 bytes.


typedef struct _TEXT_PRINT_EXTEND_HEADER
{
    char text[30];              0
    char color;                    30        //文字顏色 0/1/2/3/4/5: Red/White/Blue/Black/Yellow/Green
    char size;                 31        //文字大小 0/1/2: Small/Medium/Big default: 1(Medium)
    char position;             32        //文字出現的位置 0/1/2/3: LeftTop/RightTop/LeftBottom/RightBottom
    char order;                    33        //跟著position設定顯示文字排列順序 (0,1,2,3)
    int time;                  34        //文字閃爍的時間 (-2:clear all, -1:close, 0:always, 1:1s, 2:2s, ...., 120:120s)
    char extend_text[128];      38
    char fixFlag;               166

}TEXT_PRINT_EXTEND_HEADER

========================================
===================以下為NVR 基本(QT)=====================

QT header 順序=> _DATAHEADER , DVRFRAME_HEADER_V2, Image_header_V3 

已知:
iss & fltk : Image_header_V2
android 中 已整 uctype(_DATAHEADER ):

      private final static int HUNT_HEADER_TYPE_SYSTEM_FRAME = 0;
private final static int HUNT_HEADER_TYPE_I_FRAME = 1;
private final static int HUNT_HEADER_TYPE_P_FRAME = 2;
private final static int HUNT_HEADER_TYPE_B_FRAME = 3;
private final static int HUNT_HEADER_TYPE_JPEG_FRAME = 4;
protected final static byte HUNT_HEADER_TYPE_AUDIO = 5;
private final static int HUNT_HEADER_TYPE_MOTION = 6;
protected final static byte HUNT_HEADER_TYPE_CHAT = 11;
private final static int HUNT_HEADER_TYPE_DVR_STREAM = 14;
private final static int HUNT_HEADER_TYPE_HYBRID_STREAM = 19;
private final static int HUNT_HEADER_TYPE_NVR_STREAM = 21;
private final static int HUNT_HEADER_TYPE_NVR_36_STREAM = 24;//qt

private final static int HUNT_HEADER_TYPE_FISHEYE_INFO = 39;
private final static int HUNT_HEADER_TYPE_FACE_STREAM = 41;

private final static int HUNT_HEADER_TYPE_AI_FEATURE = 42;
private final static int HUNT_HEADER_TYPE_AI_OSD = 32;



=============================================

total len:20

typedef struct _DATAHEADER // Audio 或 Video Frame 所需的 header
{
    unsigned char ucID[4];          // 識別碼,請用"3297"              //pos end:4
    unsigned char ucHeaderLen;  // length of _DataHeader, 0xFF 保留供將來擴充用 //5
    unsigned char ucType;           // pos end:6
    
// Mask1~~~Mask3 total 32 bit(4 byte)
    unsigned int Mask1:1;
    unsigned int uiTimeMsec:10; //  time millisecond
    unsigned int uiReserved1:3; //  每個bit都是1
    unsigned int Mask2:1;
    unsigned int uiTimeSecHigh:16;  //  time second
    unsigned int Mask3:1; // pos end:10

    unsigned short usTimeSecLow;    //  time second  //pos end:12

    unsigned int Mask4:1;
    unsigned int uiLength:24;       //  data length (Byte)
    unsigned int uiReserved2:6; //  每個bit都是1
    unsigned int Mask5:1; //pos end:16

    unsigned short usSendCount:15; // send出去的frame,包system,I,P,B,J..... //18
    unsigned short Mask6:1;
    unsigned short usEncoderCount:15; // Encoder出來的frame,encoder只要切換就重算 //20
    unsigned short Mask7:1;

} __attribute__((packed)) DATAHEADER ;


QT重點在:

Dataheader.ucType =0x 3, 0x 2, 0x 9, ox 7 //QT

      Dataheader.ucType    =  (QT: 24 ,)

    Dataheader.uiLength    = sizeof(DVRFRAME_HEADER_V2);//下個frame長

ipcam:

Dataheader.ucType =' 3', '2', '9', '7' // ascii :0x33, 0x 32, 0x 39,ox 37





=============================================

DVRFRAME_HEADER_V2 //QT, hybrid

typedef struct _DVRFRAME_HEADER_V2
{
    unsigned char ucVideoSystem; //NT=1;PAL=2
    unsigned short usHeight; //影像高
    unsigned short usWidth; //影像寬
    unsigned char ucCompress:4;  //0:mpeg4   1:h.264 2.jpeg 3:pcm 4:adpcm
    unsigned char ucFrameType:4; //0:I 1:P 2:B
    unsigned char ucCh;          //Channel index
    unsigned int uiDataLen; //資料長度
    unsigned char ucSerial;           //流水號 0-255
    unsigned char ucPlayback;        //0x80:PB/LIVE  FF:0x40 RF:0x20 PAUSE:0x10
    unsigned char ucArg;              //回放時之速度
    unsigned char ucImageSource;  //0: DVR  1:IPCam   //2: audio

} __attribute__((packed)) DVRFRAME_HEADER_V2;


QT 重點:

    // DVRFRAME_HEADER_V2
    dvrheader.usHeight = 0; //影像高
    dvrheader.usWidth = 0; //影像寬
    dvrheader.ucFrameType = 5;
    dvrheader.ucCh = 0;
    dvrheader.uiDataLen = pImage_header->u32Len+sizeof(struct Image_header_V3);
    dvrheader.ucSerial = 0;
    dvrheader.ucArg = get_speed(pMobileUserClient->nAction,pMobileUserClient->nSpeed);;

    dvrheader.ucPlayback =  0x80;

=============================================

例如v3 header //QT 使用

typedef struct Image_header_V3 

 unsigned int nStartCode;   //FFFFFFAA
 time_t      tSec;            //時間
 unsigned int tuSec;
 unsigned int nLen;    //Frame 的資料長度
 unsigned long long nRec_ch;   //紀錄錄影當時的頻道
 unsigned short  nChA;          //Channel number
 unsigned short  nChB:4;          // For Video:Reaolution, For Audio:Audio Type
 unsigned short  nFrameType:2;   // 0: MPEG4 , 1: H264 , 2: ALL_AUDIO , 3: MJPEG
 unsigned short  nKeyframe:1;     // 0: P-Frame , 1: I-Frame
 unsigned short  nVideosystem:1; // 0: NTSC , 1: PAL

 unsigned short  Capture:1;   // 0: Analog , 1: IPCAM
 unsigned short  nRes:1;           // 不使用,預設為 0
 unsigned short  field:2;   // 不使用,預設為 3
 unsigned short  Reserver:4;

}__attribute__((packed)) Image_header_V3;

------------------------------------------------

int time_t int int (long long) short short
4      4        4      4         8            2        2     //占的位子大小(單位btye)

最後那個short為2byte,包含
 nchB , nFrameType,nKeyframe,nVideosystem, //總和1byte
Capture,nRes,field,Reserver   //總和1byte

以上是送
---------------------------------------
以下是收

如到因為little ending  所以會反過來,
如果為getshort(26)//26為起始位置

收到順序Reserver,field,nRes,Capture,
nVideosystem,nKeyframe,nFrameType:2,nchB:4

所以: nFrameType 取為& 00 30 
//30表示 0011(nVideosystem,nKeyframe,nFrameType:2
0000(nchB)


=============================================

//fltk, iss 使用
typedef struct Image_Header_V2 {
    unsigned int  nStartCode;        //FFFFFFAA
    /*time_t*/ unsigned int  tSec;   //時間 unsigned int for 64-bit issue
    //unsigned long long tSec;     //時間 unsigned int for 64-bit issue
    unsigned int    tuSec;
    unsigned int    nLen;            //Frame 的資料長度
    unsigned int    nRec_ch;         //
    unsigned short  nChA;            //Channel number
    unsigned short  nChB:4;          // For Video:Reaolution, For Audio:Audio Type
    unsigned short  nFrameType:2;    // 0: MPEG4 , 1: H264 , 2: ALL_AUDIO , 3: MJPEG
    unsigned short  nKeyframe:1;     // 0: P-Frame , 1: I-Frame
    unsigned short  nVideosystem:1;  // 0: NTSC , 1: PAL
    
    unsigned short  Capture:1;       // 0: Analog , 1: IPCAM
    unsigned short  nRes:1;          // 
    unsigned short  field:2;         //
    unsigned short  Reserver:4;
    
} Image_Header_V2;


============以下為NVR Fisheye=============

*uctype=39


size:240 bytes.


typedef struct FisheyeInfo
{
    unsigned int u32Chnn;                                   0
    int u32Mount;                                           4
    int u32Display;                                         8
    int u32Speed;                                           12
    int mainx1[FISHEYE_AREA_SIZE];                          16
    int mainy1[FISHEYE_AREA_SIZE];                          32
    int mainx2[FISHEYE_AREA_SIZE];                          48
    int mainy2[FISHEYE_AREA_SIZE];                          64
    int subx1[FISHEYE_AREA_SIZE];                           80
    int suby1[FISHEYE_AREA_SIZE];                           96
    int subx2[FISHEYE_AREA_SIZE];                           112
    int suby2[FISHEYE_AREA_SIZE];                           128
    int posx[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE];      144
    int posy[FISHEYE_CHANNEL_SIZE][FISHEYE_AREA_SIZE];      176
    int limit_x_min[FISHEYE_CHANNEL_SIZE];                  208
    int limit_x_max[FISHEYE_CHANNEL_SIZE];                  216
    int limit_y_min[FISHEYE_CHANNEL_SIZE];                  224
    int limit_y_max[FISHEYE_CHANNEL_SIZE];                  232

} FisheyeInfo;


====================以下為NVR人臉====================

*uctype=41: //face

同IPCAM 人臉

====================以下為IPCAM  AI====================

*uctype=




沒有留言:

張貼留言