H264分析

/*NUAL HEAD
 +---------------+
 |0|1|2|3|4|5|6|7|
 +-+-+-+-+-+-+-+-+
 |F|NRI|  Type   |
 +---------------+
 */


F  = Forbidden_zero_bit =0;

NRI = Nal_ref_idc:表示NAL的优先级。0~3,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。
Type = Nal_unit_type:当前NAL 单元的类型



#define TYPE_SPS_FRAME     0x67  //byte: 01100111     F:0   NRI:11   TYPE:00111  =  NALU_TYPE_SPS
#define TYPE_PPS_FRAME     0x68  //byte: 01101000     F:0   NRI:11   TYPE:01000  =  NALU_TYPE_PPS
#define TYPE_IDR_FRAME     0x65  //byte: 01100101     F:0   NRI:11   TYPE:00101  =  NALU_TYPE_IDR
#define TYPE_SLICE_FRAME   0x41  //byte: 01000001     F:0   NRI:10   TYPE:00001  =  NALU_TYPE_SLICE
#define TYPE_SEI_FRAME     0x06  //byte: 00000110     F:0   NRI:00   TYPE:00110  =  NALU_TYPE_SEI
#define TYPE_S_FRAME       0x61  //byte: 01100001     F:0   NRI:11   TYPE:00001  =  NALU_TYPE_SLICE




/*
 /H264定义的类型 values for nal_unit_type
 typedef enum {
 NALU_TYPE_SLICE    = 1,     byte: 00001   //非IDR图像的编码条带
 NALU_TYPE_DPA      = 2,     byte: 00010   //编码条带数据分割块A 
 NALU_TYPE_DPB      = 3,     byte: 00011   //编码条带数据分割块B
 NALU_TYPE_DPC      = 4,     byte: 00100   //编码条带数据分割块C
 NALU_TYPE_IDR      = 5,     byte: 00101   //IDR图像的编码条带 
 NALU_TYPE_SEI      = 6,     byte: 00110   //增强信息(SEI)
 NALU_TYPE_SPS      = 7,     byte: 00111   //序列参数集(SPS)
 NALU_TYPE_PPS      = 8,     byte: 01000   //图像参数集(PPS)
 NALU_TYPE_AUD      = 9,     byte: 01001
 NALU_TYPE_EOSEQ    = 10,    byte: 01010
 NALU_TYPE_EOSTREAM = 11,    byte: 01011
 NALU_TYPE_FILL     = 12,    byte: 01100
 #if (MVC_EXTENSION_ENABLE)
 NALU_TYPE_PREFIX   = 14,    byte: 01110
 NALU_TYPE_SUB_SPS  = 15,    byte: 01111
 NALU_TYPE_SLC_EXT  = 20,    byte: 10100
 NALU_TYPE_VDRD     = 24     byte: 11000   // View and Dependency Representation Delimiter NAL Unit
 #endif
 } NaluType;
 */


-(BOOL)h264Parse:(NSData *)frameData{
    char firstChar;
    BOOL isOK = NO;
    [frameData getBytes:&firstChar length:1];
    if (firstChar == TYPE_SPS_FRAME) {
        NSLog(@"TYPE_SPS_FRAME");
        isOK = YES;
    }else if (firstChar == TYPE_PPS_FRAME){
        NSLog(@"TYPE_PPS_FRAME");
                isOK = YES;
    }else if (firstChar == TYPE_IDR_FRAME){
        NSLog(@"TYPE_IDR_FRAME");
                isOK = YES;
    }else if (firstChar == TYPE_SLICE_FRAME){
        NSLog(@"TYPE_SLICE_FRAME");
    }else if (firstChar == TYPE_SEI_FRAME){
        NSLog(@"TYPE_SEI_FRAME");
    }else if (firstChar == TYPE_S_FRAME){
        NSLog(@"TYPE_S_FRAME");
                isOK = YES;
    }
    
    char lastChar;
    [frameData getBytes:&lastChar length:1];
    if ((lastChar & 0x80) == 0X80) {
        NSLog(@"Start Frame......");
    }
    
    
    return isOK;
}

你可能感兴趣的:(H264分析)