int RBSPtoNALU (unsigned char *rbsp, NALU_t *nalu, int rbsp_size, int nal_unit_type, int nal_reference_idc, int min_num_bytes, int UseAnnexbLongStartcode) { int len; assert (nalu != NULL); assert (nal_reference_idc <=3 && nal_reference_idc >=0); assert (nal_unit_type > 0 && nal_unit_type <= 10); assert (rbsp_size < MAXRBSPSIZE); nalu->forbidden_bit = 0; nalu->nal_reference_idc = nal_reference_idc; nalu->nal_unit_type = nal_unit_type; nalu->startcodeprefix_len = UseAnnexbLongStartcode?4:3; nalu->buf[0] = nalu->forbidden_bit << 7 | nalu->nal_reference_idc << 5 | nalu->nal_unit_type; memcpy (&nalu->buf[1], rbsp, rbsp_size); // printf ("First Byte %x\n", nalu->buf[0]); // printf ("RBSPtoNALU: Before: NALU len %d\t RBSP %x %x %x %x\n", rbsp_size, (unsigned) nalu->buf[1], (unsigned) nalu->buf[2], (unsigned) nalu->buf[3], (unsigned) nalu->buf[4]); len = 1 + RBSPtoEBSP (&nalu->buf[1], 0, rbsp_size, min_num_bytes); // printf ("RBSPtoNALU: After : NALU len %d\t EBSP %x %x %x %x\n", rbsp_size, (unsigned) nalu->buf[1], (unsigned) nalu->buf[2], (unsigned) nalu->buf[3], (unsigned) nalu->buf[4]); // printf ("len %d\n\n", len); nalu->len = len; return len; }
/*! ************************************************************************ * \brief * This function terminates a slice (but doesn't write it out), * the old terminate_slice (0) * \return * 0 if OK, \n * 1 in case of error * ************************************************************************ */ int terminate_slice() { int bytes_written; Bitstream *currStream; Slice *currSlice = img->currentSlice; EncodingEnvironmentPtr eep; int i; int byte_pos_before_startcode_emu_prevention; if (input->symbol_mode == CABAC) write_terminating_bit (1); // only once, not for all partitions for (i=0; i<currSlice->max_part_nr; i++) { currStream = (currSlice->partArr[i]).bitstream; if (input->symbol_mode == UVLC) { SODBtoRBSP(currStream); byte_pos_before_startcode_emu_prevention = currStream->byte_pos; currStream->byte_pos = RBSPtoEBSP(currStream->streamBuffer, 0 , currStream->byte_pos, 0); *(stat->em_prev_bits) += (currStream->byte_pos - byte_pos_before_startcode_emu_prevention) * 8; } else // CABAC { eep = &((currSlice->partArr[i]).ee_cabac); // terminate the arithmetic code arienco_done_encoding(eep); currStream->bits_to_go = eep->Ebits_to_go; currStream->byte_buf = 0; bytes_written = currStream->byte_pos; byte_pos_before_startcode_emu_prevention= currStream->byte_pos; currStream->byte_pos = RBSPtoEBSP(currStream->streamBuffer, 0, currStream->byte_pos, eep->E); *(stat->em_prev_bits) += (currStream->byte_pos - byte_pos_before_startcode_emu_prevention) * 8; } // CABAC } // partition loop if( input->symbol_mode == CABAC ) { store_contexts(); } return 0; }
int RBSPtoNALU (unsigned char *rbsp, NALU_t *nalu, int rbsp_size, int nal_unit_type, int nal_reference_idc, int UseAnnexbLongStartcode) { int len; assert (nalu != NULL); assert (nal_reference_idc <=3 && nal_reference_idc >=0); #if (MVC_EXTENSION_ENABLE) assert (nal_unit_type > 0 && nal_unit_type <= NALU_TYPE_SLC_EXT); #else assert (nal_unit_type > 0 && nal_unit_type <= NALU_TYPE_FILL); #endif assert (rbsp_size < MAXRBSPSIZE); nalu->startcodeprefix_len = UseAnnexbLongStartcode ? 4 : 3; nalu->forbidden_bit = 0; nalu->nal_reference_idc = (NalRefIdc) nal_reference_idc; nalu->nal_unit_type = (NaluType) nal_unit_type; #if (MVC_EXTENSION_ENABLE) if(nal_unit_type==NALU_TYPE_PREFIX || nal_unit_type==NALU_TYPE_SLC_EXT) { nalu->svc_extension_flag = 0; //nalu->non_idr_flag = (nal_reference_idc==NALU_PRIORITY_HIGHEST) ? 0:1; nalu->reserved_one_bit = 1; } else nalu->svc_extension_flag = 0; #endif len = RBSPtoEBSP (nalu->buf, rbsp, rbsp_size); nalu->len = len; return len; }