static bool Check_StartCode(unsigned char *Buf, int pos) { int info3 = 0; info3 = FindStartCode(&Buf[pos - 4], 3); return info3 == 1; }
int GetAnnexbNALU (NALU_t *nalu) { int info2, info3, pos = 0; int StartCodeFound, rewind; char *Buf; int LeadingZero8BitsCount=0, TrailingZero8Bits=0; if ((Buf = (char*)calloc (nalu->max_size , sizeof(char))) == NULL) no_mem_exit("GetAnnexbNALU: Buf"); while(!feof(bits) && (Buf[pos++]=fgetc(bits))==0); if(feof(bits)) { if(pos==0) return 0; else { printf( "GetAnnexbNALU can't read start code\n"); free(Buf); return -1; } } if(Buf[pos-1]!=1) { printf ("GetAnnexbNALU: no Start Code at the begin of the NALU, return -1\n"); free(Buf); return -1; } if(pos<3) { printf ("GetAnnexbNALU: no Start Code at the begin of the NALU, return -1\n"); free(Buf); return -1; } else if(pos==3) { nalu->startcodeprefix_len = 3; LeadingZero8BitsCount = 0; } else { LeadingZero8BitsCount = pos-4; nalu->startcodeprefix_len = 4; } //the 1st byte stream NAL unit can has leading_zero_8bits, but subsequent ones are not //allowed to contain it since these zeros(if any) are considered trailing_zero_8bits //of the previous byte stream NAL unit. if(!IsFirstByteStreamNALU && LeadingZero8BitsCount>0) { printf ("GetAnnexbNALU: The leading_zero_8bits syntax can only be present in the first byte stream NAL unit, return -1\n"); free(Buf); return -1; } IsFirstByteStreamNALU=0; StartCodeFound = 0; info2 = 0; info3 = 0; while (!StartCodeFound) { if (feof (bits)) { //Count the trailing_zero_8bits while(Buf[pos-2-TrailingZero8Bits]==0) TrailingZero8Bits++; nalu->len = (pos-1)-nalu->startcodeprefix_len-LeadingZero8BitsCount-TrailingZero8Bits; memcpy (nalu->buf, &Buf[LeadingZero8BitsCount+nalu->startcodeprefix_len], nalu->len); nalu->forbidden_bit = (nalu->buf[0]>>7) & 1; nalu->nal_reference_idc = (nalu->buf[0]>>5) & 3; nalu->nal_unit_type = (nalu->buf[0]) & 0x1f; // printf ("GetAnnexbNALU, eof case: pos %d nalu->len %d, nalu->reference_idc %d, nal_unit_type %d \n", pos, nalu->len, nalu->nal_reference_idc, nalu->nal_unit_type); #if TRACE fprintf (p_trace, "\n\nLast NALU in File\n\n"); fprintf (p_trace, "Annex B NALU w/ %s startcode, len %d, forbidden_bit %d, nal_reference_idc %d, nal_unit_type %d\n\n", nalu->startcodeprefix_len == 4?"long":"short", nalu->len, nalu->forbidden_bit, nalu->nal_reference_idc, nalu->nal_unit_type); fflush (p_trace); #endif free(Buf); return 0; //return pos-1; } Buf[pos++] = fgetc (bits); info3 = FindStartCode(&Buf[pos-4], 3); //++ info3=1表示找到的下一个NALU的开始码前有8比特填零码(00000001) if(info3 != 1) info2 = FindStartCode(&Buf[pos-3], 2); //++ info2=1表示找到的下一个NALU的开始码前没有8比特填零码(000001) StartCodeFound = (info2 == 1 || info3 == 1); } //Count the trailing_zero_8bits if(info3==1) //if the detected start code is 00 00 01, trailing_zero_8bits is sure not to be present { //++ 即info2=1时,当前NALU必然不存在拖尾8比特填零码,因此不必计数;反之,即info3=1时,要分析当前NALU是否有拖尾8比特填零码,有则计数 while(Buf[pos-5-TrailingZero8Bits]==0) TrailingZero8Bits++; } // Here, we have found another start code (and read length of startcode bytes more than we should // have. Hence, go back in the file rewind = 0; if(info3 == 1) rewind = -4; else if (info2 == 1) rewind = -3; else printf(" Panic: Error in next start code search \n"); if (0 != fseek (bits, rewind, SEEK_CUR)) //++ SEEK_CUR=1,代表文件指针当前位置 { snprintf (errortext, ET_SIZE, "GetAnnexbNALU: Cannot fseek %d in the bit stream file", rewind); free(Buf); error(errortext, 600); } // Here the leading zeros(if any), Start code, the complete NALU, trailing zeros(if any) // and the next start code is in the Buf. // The size of Buf is pos, pos+rewind are the number of bytes excluding the next // start code, and (pos+rewind)-startcodeprefix_len-LeadingZero8BitsCount-TrailingZero8Bits // is the size of the NALU. nalu->len = (pos+rewind)-nalu->startcodeprefix_len-LeadingZero8BitsCount-TrailingZero8Bits; memcpy (nalu->buf, &Buf[LeadingZero8BitsCount+nalu->startcodeprefix_len], nalu->len); fwrite(&Buf[0], nalu->startcodeprefix_len + LeadingZero8BitsCount, 1, fp_test); tailingbits = TrailingZero8Bits; nalu->forbidden_bit = (nalu->buf[0]>>7) & 1; //+++++++++++++++++++++++++++ nalu->nal_reference_idc = (nalu->buf[0]>>5) & 3; //++ 该三值定义参见标准7.4.1 nalu->nal_unit_type = (nalu->buf[0]) & 0x1f; //+++++++++++++++++++++++++++ //printf ("GetAnnexbNALU, regular case: pos %d nalu->len %d, nalu->reference_idc %d, nal_unit_type %d \n", pos, nalu->len, nalu->nal_reference_idc, nalu->nal_unit_type); #if TRACE fprintf (p_trace, "\n\nAnnex B NALU w/ %s startcode, len %d, forbidden_bit %d, nal_reference_idc %d, nal_unit_type %d\n\n", nalu->startcodeprefix_len == 4?"long":"short", nalu->len, nalu->forbidden_bit, nalu->nal_reference_idc, nalu->nal_unit_type); fflush (p_trace); #endif free(Buf); return (pos+rewind); }
static bool Check_StartCode(unsigned char* pBuf, int nPos) { return FindStartCode(&pBuf[nPos-4], 3); }
int GetAnnexbNALU (NALU_t *nalu) { int info2, info3, pos = 0; int StartCodeFound, rewind; //unsigned int myFP = FPindex; #ifdef ESLCPP unsigned char *myBuf; #else char *myBuf; #endif #ifdef ESLCPP if ((myBuf = (unsigned char*)calloc (nalu->max_size , sizeof(char))) == NULL) no_mem_exit("GetAnnexbNALU: Buf"); #else if ((myBuf = (char*)calloc (nalu->max_size , sizeof(char))) == NULL) no_mem_exit("GetAnnexbNALU: Buf"); #endif nalu->startcodeprefix_len=3; info2 = 0; info3 = 0; // if (3 != fread (Buf, 1, 3, bits))//read 3 Bytes // { // free(Buf); // return 0; // } // memcpy(myBuf, Buf, 3);//boy for (unsigned int i = 0; i < 3; i++) { myBuf[i] = Buf[i+FPindex]; //myBuf[i] = Buf[i+myFP]; } FPindex += 3; //myFP += 3; info2 = FindStartCode (myBuf, 2); if(info2 != 1) { // if(1 != fread(Buf+3, 1, 1, bits))//read 1 Bytes // { // free(Buf); // return 0; // } //memcpy(myBuf+3, Buf, 1);//boy myBuf[3] = Buf[FPindex]; FPindex ++; /* myBuf[3] = Buf[myFP]; myFP ++; */ info3 = FindStartCode (myBuf, 3); } if (info2 != 1 && info3 != 1) { printf ("GetAnnexbNALU: no Start Code at the begin of the NALU, return -1\n"); free(myBuf); exit(0); return -1; } if( info2 == 1) { nalu->startcodeprefix_len = 3; pos = 3; } else if(info3 ==1 ) { pos = 4; nalu->startcodeprefix_len = 4; } else printf( " Panic: Error \n"); StartCodeFound = 0; info2 = 0; info3 = 0; while (!StartCodeFound) { //if (feof (bits)) if (FPindex == Bitstream_leng +1) //if (myFP == Bitstream_leng +1) { nalu->len = (pos-1)-nalu->startcodeprefix_len; memcpy (nalu->buf, &myBuf[nalu->startcodeprefix_len], nalu->len); nalu->forbidden_bit = (nalu->buf[0]>>7) & 1; nalu->nal_reference_idc = (nalu->buf[0]>>5) & 3; nalu->nal_unit_type = (nalu->buf[0]) & 0x1f; // printf ("GetAnnexbNALU, eof case: pos %d nalu->len %d, nalu->reference_idc %d, nal_unit_type %d \n", pos, nalu->len, nalu->nal_reference_idc, nalu->nal_unit_type); #if TRACE fprintf (p_trace, "\n\nLast NALU in File\n\n"); fprintf (p_trace, "Annex B NALU w/ %s startcode, len %d, forbidden_bit %d, nal_reference_idc %d, nal_unit_type %d\n\n", nalu->startcodeprefix_len == 4?"long":"short", nalu->len, nalu->forbidden_bit, nalu->nal_reference_idc, nalu->nal_unit_type); fflush (p_trace); #endif free(myBuf); return pos-1; } //Buf[pos++] = fgetc (bits); //memcpy((void *)myBuf[pos++], Buf, 1);//boy myBuf[pos] = Buf[FPindex]; //myBuf[pos] = Buf[myFP]; pos++; FPindex++; //myFP++; info3 = FindStartCode(&myBuf[pos-4], 3); if(info3 != 1) info2 = FindStartCode(&myBuf[pos-3], 2); StartCodeFound = (info2 == 1 || info3 == 1); }
int GetAnnexbNALU (NALU_t *nalu,FILE* bits) { int info2, info3, pos = 0; int StartCodeFound, rewind; unsigned char *Buf; int LeadingZero8BitsCount=0, TrailingZero8Bits=0; if ((Buf = (unsigned char*)calloc (MAXNALBUFFERSIZE , sizeof(char))) == NULL) { puts("not enough memory"); exit(-1); } while(!feof(bits) && (Buf[pos++]=fgetc(bits))==0); if(feof(bits)) { if(pos==0) return 0; else { printf( "GetAnnexbNALU can't read start code\n"); free(Buf); return -1; } } if(Buf[pos-1]!=1) { printf ("GetAnnexbNALU: no Start Code at the begin of the NALU, return -1\n"); free(Buf); return -1; } if(pos<3) { printf ("GetAnnexbNALU: no Start Code at the begin of the NALU, return -1\n"); free(Buf); return -1; } else if(pos==3) { nalu->startcodeprefix_len = 3; LeadingZero8BitsCount = 0; } else { LeadingZero8BitsCount = pos-4; nalu->startcodeprefix_len = 4; } //the 1st byte stream NAL unit can has leading_zero_8bits, but subsequent ones are not //allowed to contain it since these zeros(if any) are considered trailing_zero_8bits //of the previous byte stream NAL unit. if(!IsFirstByteStreamNALU && LeadingZero8BitsCount>0) { printf ("GetAnnexbNALU: The leading_zero_8bits syntax can only be present in the first byte stream NAL unit, return -1\n"); free(Buf); return -1; } IsFirstByteStreamNALU=0; StartCodeFound = 0; info2 = 0; info3 = 0; while (!StartCodeFound) { if (feof (bits)) { //Count the trailing_zero_8bits while(Buf[pos-2-TrailingZero8Bits]==0) TrailingZero8Bits++; nalu->len = (pos-1)-nalu->startcodeprefix_len-LeadingZero8BitsCount-TrailingZero8Bits; if(nalu->len > MAXNALBUFFERSIZE) { #if _N_HLS_ printf("lengh of NAL unit is larger than maxmum buffer size!"); #endif exit(-1); } memcpy (nalu->buf, &Buf[LeadingZero8BitsCount+nalu->startcodeprefix_len], nalu->len); nalu->forbidden_bit = (nalu->buf[0]>>7) & 1; nalu->nal_reference_idc = (nalu->buf[0]>>5) & 3; nalu->nal_unit_type = (nalu->buf[0]) & 0x1f; // printf ("GetAnnexbNALU, eof case: pos %d nalu->len %d, nalu->reference_idc %d, nal_unit_type %d \n", pos, nalu->len, nalu->nal_reference_idc, nalu->nal_unit_type); #if TRACE fprintf (p_trace, "\n\nLast NALU in File\n\n"); fprintf (p_trace, "Annex B NALU w/ %s startcode, len %d, forbidden_bit %d, nal_reference_idc %d, nal_unit_type %d\n\n", nalu->startcodeprefix_len == 4?"long":"short", nalu->len, nalu->forbidden_bit, nalu->nal_reference_idc, nalu->nal_unit_type); fflush (p_trace); #endif free(Buf); return pos-1; } Buf[pos++] = fgetc (bits); info3 = FindStartCode(&Buf[pos-4], 3); if(info3 != 1) info2 = FindStartCode(&Buf[pos-3], 2); StartCodeFound = (info2 == 1 || info3 == 1); } //Count the trailing_zero_8bits if(info3==1) //if the detected start code is 00 00 01, trailing_zero_8bits is sure not to be present { while(Buf[pos-5-TrailingZero8Bits]==0) TrailingZero8Bits++; } // Here, we have found another start code (and read length of startcode bytes more than we should // have. Hence, go back in the file rewind = 0; if(info3 == 1) rewind = -4; else if (info2 == 1) rewind = -3; else printf(" Panic: Error in next start code search \n"); if (0 != fseek (bits, rewind, SEEK_CUR)) { fprintf (stderr, "GetAnnexbNALU: Cannot fseek %d in the bit stream file", rewind); free(Buf); exit(-2); } // Here the leading zeros(if any), Start code, the complete NALU, trailing zeros(if any) // and the next start code is in the Buf. // The size of Buf is pos, pos+rewind are the number of bytes excluding the next // start code, and (pos+rewind)-startcodeprefix_len-LeadingZero8BitsCount-TrailingZero8Bits // is the size of the NALU. nalu->len = (pos+rewind)-nalu->startcodeprefix_len-LeadingZero8BitsCount-TrailingZero8Bits; if(nalu->len > MAXNALBUFFERSIZE) { #if _N_HLS_ printf("lengh of NAL unit is larger than maxmum buffer size!"); #endif exit(-1); } memcpy (nalu->buf, &Buf[LeadingZero8BitsCount+nalu->startcodeprefix_len], nalu->len); nalu->forbidden_bit = (nalu->buf[0]>>7) & 1; nalu->nal_reference_idc = (nalu->buf[0]>>5) & 3; nalu->nal_unit_type = (nalu->buf[0]) & 0x1f; //printf ("GetAnnexbNALU, regular case: pos %d nalu->len %d, nalu->reference_idc %d, nal_unit_type %d \n", pos, nalu->len, nalu->nal_reference_idc, nalu->nal_unit_type); #if TRACE fprintf (p_trace, "\n\nAnnex B NALU w/ %s startcode, len %d, forbidden_bit %d, nal_reference_idc %d, nal_unit_type %d\n\n", nalu->startcodeprefix_len == 4?"long":"short", nalu->len, nalu->forbidden_bit, nalu->nal_reference_idc, nalu->nal_unit_type); fflush (p_trace); #endif free(Buf); return (pos+rewind); }
int GetAnnexbNALU (NALU_t *nalu) { int info2, info3, pos = 0; int StartCodeFound, rewind; char *Buf; if ((Buf = (char*)calloc (nalu->max_size , sizeof(char))) == NULL) no_mem_exit("GetAnnexbNALU: Buf"); nalu->startcodeprefix_len=3; info2 = 0; info3 = 0; if (3 != fread (Buf, 1, 3, bits)) { free(Buf); return 0; } info2 = FindStartCode (Buf, 2); if(info2 != 1) { if(1 != fread(Buf+3, 1, 1, bits)) { free(Buf); return 0; } info3 = FindStartCode (Buf, 3); } if (info2 != 1 && info3 != 1) { printf ("GetAnnexbNALU: no Start Code at the begin of the NALU, return -1\n"); free(Buf); return -1; } if( info2 == 1) { nalu->startcodeprefix_len = 3; pos = 3; } else if(info3 ==1 ) { pos = 4; nalu->startcodeprefix_len = 4; } else printf( " Panic: Error \n"); StartCodeFound = 0; info2 = 0; info3 = 0; while (!StartCodeFound) { if (feof (bits)) { nalu->len = (pos-1)-nalu->startcodeprefix_len; memcpy (nalu->buf, &Buf[nalu->startcodeprefix_len], nalu->len); nalu->forbidden_bit = (nalu->buf[0]>>7) & 1; nalu->nal_reference_idc = (nalu->buf[0]>>5) & 3; nalu->nal_unit_type = (nalu->buf[0]) & 0x1f; // printf ("GetAnnexbNALU, eof case: pos %d nalu->len %d, nalu->reference_idc %d, nal_unit_type %d \n", pos, nalu->len, nalu->nal_reference_idc, nalu->nal_unit_type); #if TRACE fprintf (p_trace, "\n\nLast NALU in File\n\n"); fprintf (p_trace, "Annex B NALU w/ %s startcode, len %d, forbidden_bit %d, nal_reference_idc %d, nal_unit_type %d\n\n", nalu->startcodeprefix_len == 4?"long":"short", nalu->len, nalu->forbidden_bit, nalu->nal_reference_idc, nalu->nal_unit_type); fflush (p_trace); #endif free(Buf); return pos-1; } Buf[pos++] = fgetc (bits); info3 = FindStartCode(&Buf[pos-4], 3); if(info3 != 1) info2 = FindStartCode(&Buf[pos-3], 2); StartCodeFound = (info2 == 1 || info3 == 1); } // Here, we have found another start code (and read length of startcode bytes more than we should // have. Hence, go back in the file rewind = 0; if(info3 == 1) rewind = -4; else if (info2 == 1) rewind = -3; else printf(" Panic: Error in next start code search \n"); if (0 != fseek (bits, rewind, SEEK_CUR)) { snprintf (errortext, ET_SIZE, "GetAnnexbNALU: Cannot fseek %d in the bit stream file", rewind); free(Buf); error(errortext, 600); } // Here the Start code, the complete NALU, and the next start code is in the Buf. // The size of Buf is pos, pos+rewind are the number of bytes excluding the next // start code, and (pos+rewind)-startcodeprefix_len is the size of the NALU nalu->len = (pos+rewind)-nalu->startcodeprefix_len; memcpy (nalu->buf, &Buf[nalu->startcodeprefix_len], nalu->len); nalu->forbidden_bit = (nalu->buf[0]>>7) & 1; nalu->nal_reference_idc = (nalu->buf[0]>>5) & 3; nalu->nal_unit_type = (nalu->buf[0]) & 0x1f; //printf ("GetAnnexbNALU, regular case: pos %d nalu->len %d, nalu->reference_idc %d, nal_unit_type %d \n", pos, nalu->len, nalu->nal_reference_idc, nalu->nal_unit_type); #if TRACE fprintf (p_trace, "\n\nAnnex B NALU w/ %s startcode, len %d, forbidden_bit %d, nal_reference_idc %d, nal_unit_type %d\n\n", nalu->startcodeprefix_len == 4?"long":"short", nalu->len, nalu->forbidden_bit, nalu->nal_reference_idc, nalu->nal_unit_type); fflush (p_trace); #endif free(Buf); return (pos+rewind); }