int Write_AUD_NALU( VideoParameters *p_Vid ) { int RBSPlen = 0; int len; byte rbsp[MAXRBSPSIZE]; NALU_t *nalu = AllocNALU( MAXNALUSIZE ); switch( p_Vid->type ) { case I_SLICE: p_Vid->primary_pic_type = 0; break; case P_SLICE: p_Vid->primary_pic_type = 1; break; case B_SLICE: p_Vid->primary_pic_type = 2; break; } RBSPlen = 1; rbsp[0] = (byte) (p_Vid->primary_pic_type << 5); rbsp[0] |= (1 << 4); // write RBSP into NALU RBSPtoNALU( rbsp, nalu, RBSPlen, NALU_TYPE_AUD, NALU_PRIORITY_DISPOSABLE, 1 ); // write NALU into bitstream len = p_Vid->WriteNALU( p_Vid, nalu, p_Vid->f_out ); FreeNALU( nalu ); return len; }
int Write_Filler_Data_NALU( VideoParameters *p_Vid, int num_bytes ) { int RBSPlen = num_bytes - 1; int len, bytes_written = 0; byte rbsp[MAXRBSPSIZE]; byte filler_byte = (byte)0xFF; byte trailing_byte = (byte)0x80; NALU_t *nalu = AllocNALU( MAXNALUSIZE ); num_bytes = iClip3( 1, (MAXRBSPSIZE - 2), num_bytes ); assert( num_bytes > 0 && num_bytes < (MAXRBSPSIZE - 1) ); num_bytes = imax( 2, num_bytes ); // one byte for the NAL header and one for the rbsp trailing byte if ( RBSPlen > 1 ) { while ( bytes_written < (RBSPlen - 1) ) { rbsp[ bytes_written++ ] = filler_byte; } } rbsp[ bytes_written++ ] = trailing_byte; // rbsp_trailing_bits assert( num_bytes == (bytes_written + 1) ); // write RBSP into NALU RBSPtoNALU( rbsp, nalu, RBSPlen, NALU_TYPE_FILL, NALU_PRIORITY_DISPOSABLE, 1 ); // write NALU into bitstream len = p_Vid->WriteNALU( p_Vid, nalu, p_Vid->f_out ); p_Vid->bytes_in_picture += (nalu->len + 1); FreeNALU( nalu ); return len; }
NALU_t *GeneratePic_parameter_set_NALU(int PPS_id) { NALU_t *n = AllocNALU(64000); int RBSPlen = 0; int NALUlen; byte rbsp[MAXRBSPSIZE]; RBSPlen = GeneratePic_parameter_set_rbsp (&PicParSet[PPS_id], rbsp); NALUlen = RBSPtoNALU (rbsp, n, RBSPlen, NALU_TYPE_PPS, NALU_PRIORITY_HIGHEST, 0, 1); n->startcodeprefix_len = 4; return n; }
NALU_t *GenerateSeq_parameter_set_NALU () { NALU_t *n = AllocNALU(64000); int RBSPlen = 0; int NALUlen; byte rbsp[MAXRBSPSIZE]; RBSPlen = GenerateSeq_parameter_set_rbsp (active_sps, rbsp); NALUlen = RBSPtoNALU (rbsp, n, RBSPlen, NALU_TYPE_SPS, NALU_PRIORITY_HIGHEST, 0, 1); n->startcodeprefix_len = 4; return n; }
NALU_t *GeneratePic_parameter_set_NALU() { NALU_t *n = AllocNALU(64000); int RBSPlen = 0; int NALUlen; byte rbsp[MAXRBSPSIZE]; RBSPlen = GeneratePic_parameter_set_rbsp (active_pps, rbsp); //++ 参见标准7.3.2.2、7.4.2.2节 NALUlen = RBSPtoNALU (rbsp, n, RBSPlen, NALU_TYPE_PPS, NALU_PRIORITY_HIGHEST, 0, 1); n->startcodeprefix_len = 4; return n; }
/*! ************************************************************************************* * \brief * NALU_t *GeneratePic_parameter_set_NALU (); * * \note * Uses the global variables through FillParameterSetStructures() * * \return * A NALU containing the Picture Parameter Set * ************************************************************************************* */ NALU_t *GeneratePic_parameter_set_NALU(pic_parameter_set_rbsp_t *active_pps) { NALU_t *n = AllocNALU(64000); t_sint32 RBSPlen = 0; byte *rbsp = (byte*)NULL; void * vfm_memory_ctxt = my_vfm_memory_ctxt; /*byte rbsp[MAXRBSPSIZE]; */ rbsp = (byte *)malloc_(MAXRBSPSIZE * sizeof(char)); // rbsp = (byte *)alloca(MAXRBSPSIZE * sizeof(char)); RBSPlen = GeneratePic_parameter_set_rbsp (active_pps, (char *)rbsp); RBSPtoNALU ((char *)rbsp, n, RBSPlen, NALU_TYPE_PPS, NALU_PRIORITY_HIGHEST, 0, 1); n->startcodeprefix_len = 4; free(rbsp); return n; }