2024年1月3日发(作者:)

/* */ nalu->len = (pos + rewind) - nalu->startcodeprefix_len; memcpy(nalu->buf, &Buf[nalu->startcodeprefix_len], nalu->len);// //-得到NAL Header的信息 nalu->forbidden_bit = nalu->buf[0] & 0x80; //- 10000000 //1 bit

nalu->nal_reference_idc = nalu->buf[0] & 0x60; //- 01100000 // 2 bit nalu->nal_unit_type = (nalu->buf[0]) & 0x1f; //- 00011111 // 5 bit free(Buf); return (pos + rewind);}//-解析H.264的函数/*** Analysis H.264 Bitstream* @param url Location of input H.264 bitstream file.*/int simplest_h264_parser(const char *url) { NALU_t *n; int buffersize = 100000; FILE *myout=fopen("output_","wb+"); //FILE *myout = stdout; h264bitstream = fopen(url, "rb+"); if (h264bitstream == NULL) { printf("Open file errorn"); return 0; } n = (NALU_t*)calloc(1, sizeof(NALU_t)); if (n == NULL) { printf("Alloc NALU Errorn"); return 0; } n->max_size = buffersize; n->buf = (char*)calloc(buffersize, sizeof(char)); if (n->buf == NULL) { free(n); printf("AllocNALU: n->buf"); return 0; } int data_offset = 0; int nal_num = 0; printf("-----+-------- NALU Table ------+---------+n"); printf(" NUM | POS | IDC | TYPE | LEN |n"); printf("-----+---------+--------+-------+---------+n"); while (!feof(h264bitstream)) { int data_length; data_length = GetAnnexbNALU(n); char type_str[20] = { 0 }; switch (n->nal_unit_type) { case NALU_TYPE_SLICE:sprintf(type_str, "SLICE"); break; case NALU_TYPE_DPA:sprintf(type_str, "DPA"); break; case NALU_TYPE_DPB:sprintf(type_str, "DPB"); break; case NALU_TYPE_DPC:sprintf(type_str, "DPC"); break;

case NALU_TYPE_IDR:sprintf(type_str, "IDR"); break; case NALU_TYPE_SEI:sprintf(type_str, "SEI"); break; case NALU_TYPE_SPS:sprintf(type_str, "SPS"); break; case NALU_TYPE_PPS:sprintf(type_str, "PPS"); break; case NALU_TYPE_AUD:sprintf(type_str, "AUD"); break; case NALU_TYPE_EOSEQ:sprintf(type_str, "EOSEQ"); break; case NALU_TYPE_EOSTREAM:sprintf(type_str, "EOSTREAM"); break; case NALU_TYPE_FILL:sprintf(type_str, "FILL"); break; } char idc_str[20] = { 0 }; switch (n->nal_reference_idc >> 5) { case NALU_PRIORITY_DISPOSABLE:sprintf(idc_str, "DISPOS"); break; case NALU_PRIORITY_LOW:sprintf(idc_str, "LOW"); break; case NALU_PRIORITY_HIGH:sprintf(idc_str, "HIGH"); break; case NALU_PRIORITY_HIGHEST:sprintf(idc_str, "HIGHEST"); break; } fprintf(myout, "%5d| %8d| %7s| %6s| %8d|n", nal_num, data_offset, idc_str, type_str, n->len); data_offset = data_offset + data_length; nal_num++; } //Free if (n) { if (n->buf) { free(n->buf); n->buf = NULL; } free(n); } return 0;}int main(){ simplest_h264_parser("sintel.h264"); getchar(); return 0;}