/**************************************************************************** Non static functions ****************************************************************************/ int32_t get_next_nal_unit(nal_unit * nalu) { int32_t i, segment_start; int32_t nalu_size = 0; // search for the next NALU start for (;;) { if (input_remain <= 4) return 0; //scan the ring BUF if ((!ring_buf[ring_pos]) && (!ring_buf[(ring_pos + 1) & RING_MOD]) && (!ring_buf[(ring_pos + 2) & RING_MOD]) && (ring_buf[(ring_pos + 3) & RING_MOD] == 1)) break; gnn_advance(); } for (i = 0; i < 4; ++i) gnn_advance(); // add bytes to the NALU until the end is found segment_start = ring_pos; while (input_remain) { if ((!ring_buf[ring_pos]) && (!ring_buf[(ring_pos + 1) & RING_MOD]) && (!ring_buf[(ring_pos + 2) & RING_MOD])) break; ring_pos = (ring_pos + 1) & RING_MOD; --input_remain; if (ring_pos == 0) { gnn_add_segment(RING_BUF_SIZE); input_read(&ring_buf[HALF_RING], HALF_RING); } if (ring_pos == HALF_RING) { gnn_add_segment(HALF_RING); input_read(&ring_buf[0], HALF_RING); } } gnn_add_segment(ring_pos); if (!nalu_size) return 0; // read the NAL unit nal_pos[0] = 0; nal_bit[0] = 0; nalu->forbidden_zero_bit = input_get_bits(1); nalu->nal_ref_idc = input_get_bits(2); nalu->nal_unit_type = input_get_bits(5); nalu->last_rbsp_byte = &nal_buf[0][nalu_size - 1]; nalu->NumBytesInNALunit = nalu_size; EBSPtoRBSP(nal_buf[0],nalu_size,0); return 1; }
int NALUtoRBSP (NALU_t *nalu) { assert (nalu != NULL); nalu->len = EBSPtoRBSP (nalu->buf, nalu->len, 1) ; return nalu->len ; }
unsigned char *remove_03emu(unsigned char *from, unsigned char *to) { int num=to-from; int newsize = EBSPtoRBSP (from,num,0); //TODO: Do something if newsize == -1 (broken NAL) if (newsize==-1) return NULL; return from+newsize; }
int NALUtoRBSP (NALU_t *nalu) { assert (nalu != NULL); //++ È·±£nalu²»Îª¿Õ nalu->len = EBSPtoRBSP (nalu->buf, nalu->len, 1) ; return nalu->len ; }
AVCDec_Status BitstreamInit(AVCDecBitstream *stream, uint8 *buffer, int size) { EBSPtoRBSP(buffer, &size); stream->incnt = 0; stream->incnt_next = 0; stream->bitcnt = 0; stream->curr_word = stream->next_word = 0; stream->read_pos = 0; stream->bitstreamBuffer = buffer; stream->data_end_pos = size; stream->nal_size = size; return AVCDEC_SUCCESS; }