?? bitstream.h
字號:
#ifndef _BITSTREAM_H_#define _BITSTREAM_H_#include <stdio.h>#include <stdlib.h>#include "../portab.h"#include "../decoder.h"//#include "../encoder.h"/* Quatization type */#define H263_QUANT 0#define MPEG4_QUANT 1extern FILE *temp_f;/***************************************************************************** * Constants ****************************************************************************//* comment any #defs we dont use */#define VIDOBJ_START_CODE 0x00000100 /* ..0x0000011f */#define VIDOBJLAY_START_CODE 0x00000120 /* ..0x0000012f */#define VISOBJSEQ_START_CODE 0x000001b0#define VISOBJSEQ_STOP_CODE 0x000001b1 /* ??? */#define USERDATA_START_CODE 0x000001b2#define GRPOFVOP_START_CODE 0x000001b3/*#define VIDSESERR_ERROR_CODE 0x000001b4 */#define VISOBJ_START_CODE 0x000001b5/*#define SLICE_START_CODE 0x000001b7 *//*#define EXT_START_CODE 0x000001b8 */#define VISOBJ_TYPE_VIDEO 1/*#define VISOBJ_TYPE_STILLTEXTURE 2 *//*#define VISOBJ_TYPE_MESH 3 *//*#define VISOBJ_TYPE_FBA 4 *//*#define VISOBJ_TYPE_3DMESH 5 */#define VIDOBJLAY_TYPE_SIMPLE 1/*#define VIDOBJLAY_TYPE_SIMPLE_SCALABLE 2 */#define VIDOBJLAY_TYPE_CORE 3#define VIDOBJLAY_TYPE_MAIN 4/*#define VIDOBJLAY_AR_SQUARE 1 *//*#define VIDOBJLAY_AR_625TYPE_43 2 *//*#define VIDOBJLAY_AR_525TYPE_43 3 *//*#define VIDOBJLAY_AR_625TYPE_169 8 *//*#define VIDOBJLAY_AR_525TYPE_169 9 */#define VIDOBJLAY_AR_EXTPAR 15#define VIDOBJLAY_SHAPE_RECTANGULAR 0#define VIDOBJLAY_SHAPE_BINARY 1#define VIDOBJLAY_SHAPE_BINARY_ONLY 2#define VIDOBJLAY_SHAPE_GRAYSCALE 3#define VO_START_CODE 0x8#define VOL_START_CODE 0x12#define VOP_START_CODE 0x1b6#define READ_MARKER() BitstreamSkip(bs, 1)#define WRITE_MARKER() BitstreamPutBit(bs, 1)/* vop coding types *//* intra, prediction, backward, sprite, not_coded */#define I_VOP 0#define P_VOP 1#define B_VOP 2#define S_VOP 3#define N_VOP 4#define I_VOP_D 5#define P_VOP_D 6//static int32_t num_gobs_in_vop[8] = {0, 6, 9, 18, 18, 18, 0, 0};//static int32_t num_marcoblocks_in_gob[8] = {0, 8, 11, 22, 88, 352, 0, 0};/* resync-specific */#define NUMBITS_VP_RESYNC_MARKER 17#define RESYNC_MARKER 1static const int stuffing_codes[8] ={ /* nbits stuffing code */ 0, /* 1 0 */ 1, /* 2 01 */ 3, /* 3 011 */ 7, /* 4 0111 */ 0xf, /* 5 01111 */ 0x1f, /* 6 011111 */ 0x3f, /* 7 0111111 */ 0x7f, /* 8 01111111 */};/***************************************************************************** * Prototypes ****************************************************************************/intread_video_packet_header(Bitstream *bs, DECODER *dec, const int addbits, int *quant, int *fcode_forward, int *fcode_backward);boolbRead_video_packet_header(DECODER * dec, int *fcode_forward, int *fcode_backward, int32_t * mbnum);/* header stuff */int BitstreamReadHeaders(Bitstream * bs, DECODER * dec, uint32_t * rounding, uint32_t * quant, uint32_t * fcode_forward, uint32_t * fcode_backward, uint32_t * intra_dc_threshold_bit);//void BitstreamWriteVolHeader(Bitstream * const bs,// const MBParam * pParam,// const FRAMEINFO * frame);//void BitstreamWriteVopHeader(Bitstream * const bs,// const MBParam * pParam,// const FRAMEINFO * frame,// int vop_coded);/***************************************************************************** * Inlined functions ****************************************************************************//* initialise bitstream structure */static void __inlineBitstreamForward(Bitstream * const bs, const uint32_t bits){ bs->pos += bits; if (bs->pos >= 32) { uint32_t b = bs->buf; *bs->tail++ = b; bs->buf = 0; bs->pos -= 32; }}static void __inlineBitstreamPutBits(Bitstream * const bs, const uint32_t value, const uint32_t size){ uint32_t shift = 32 - bs->pos - size; if (shift <= 32) { bs->buf |= value << shift; BitstreamForward(bs, size); } else { uint32_t remainder; shift = size - (32 - bs->pos); bs->buf |= value >> shift; BitstreamForward(bs, size - shift); remainder = shift; shift = 32 - shift; bs->buf |= value << shift; BitstreamForward(bs, remainder); }}static __inline unsigned long get_word(unsigned char *ptr){#ifndef ARCH_IS_BIG_ENDIAN return ptr[3] | (ptr[2]<<8) | (ptr[1]<<16) | (ptr[0]<<24); ///return *(unsigned long *)ptr;#else return ptr[0] | (ptr[1]<<8) | (ptr[2]<<16) | (ptr[3]<<24);#endif}static void __inlineBitstreamInit(Bitstream * const bs, void *const bitstream, void * const bitstream_phy, uint32_t length){ uint32_t tmp; bs->start_pos = ((uint32_t) bitstream & 0x3) * 8; tmp = ((uint32_t) bitstream & 0xfffffffc); bs->start = bs->tail = (uint32_t *) tmp; tmp = *bs->start; bs->bufa = get_word((uint8_t *)bs->start); bs->bufb = get_word((uint8_t *)((uint32_t)bs->start + 4)); bs->buf = 0; tmp = ((uint32_t) bitstream_phy & 0xfffffffc); bs->start_phy = bs->tail_phy = (uint32_t *)tmp; bs->pos = bs->start_pos; bs->length = length;}static void __inline BitstreamUpdatePos(Bitstream * const bs, uint32_t *tail, unsigned int pos){ if (tail != NULL) { bs->tail = tail; bs->bufa = get_word((uint8_t *)bs->tail); bs->bufb = get_word((uint8_t *)((uint32_t)bs->start + 4));// bs->bufa = *bs->tail;// bs->bufb = *(bs->tail + 1); bs->pos = pos; } bs->tail_phy = bs->start_phy + (bs->tail - bs->start);}static void __inline BitstreamUpdatePos_phy(Bitstream * const bs, uint32_t *tail_phy, unsigned int pos){ if (tail_phy != NULL) { bs->tail_phy = tail_phy; bs->pos = pos; } bs->tail = bs->start + (bs->tail_phy - bs->start_phy); bs->bufa = get_word((uint8_t *)bs->tail); bs->bufb = get_word((uint8_t *)((uint32_t)bs->start + 4));}/* reads n bits from bitstream without changing the stream pos */static uint32_t __inlineBitstreamShowBits(Bitstream * const bs, const uint32_t bits){ int nbit = (bits + bs->pos) - 32; if (nbit > 0) { return ((bs->bufa & (0xffffffff >> bs->pos)) << nbit) | (bs->bufb >> (32 - nbit)); } else { return (bs->bufa & (0xffffffff >> bs->pos)) >> (32 - bs->pos - bits); }}/* skip n bits forward in bitstream */static void __inlineBitstreamSkip(Bitstream * const bs, const uint32_t bits){ bs->pos += bits; if (bs->pos >= 32) {// uint32_t tmp; bs->bufa = bs->bufb;// tmp = *((uint32_t *) bs->tail + 2);// bs->bufb = tmp; bs->bufb = get_word((uint8_t *)((uint32_t)bs->tail + 8)); bs->tail++; bs->pos -= 32; }}/* number of bits to next byte alignment */static uint32_t __inlineBitstreamNumBitsToByteAlign(Bitstream *bs){ uint32_t n = (32 - bs->pos) % 8; return n == 0 ? 8 : n;}/* number of bits to next byte alignment */static uint32_t __inlineBitstreamNumBitsToByteAlign_a(Bitstream *bs){ return (32 - bs->pos) % 8;}/* show nbits from next byte alignment */static uint32_t __inlineBitstreamShowBitsFromByteAlign(Bitstream *bs, int bits){ int bspos = bs->pos + BitstreamNumBitsToByteAlign(bs); int nbit = (bits + bspos) - 32; if (bspos >= 32) { return bs->bufb >> (32 - nbit); } else if (nbit > 0) { return ((bs->bufa & (0xffffffff >> bspos)) << nbit) | (bs->bufb >> (32 - nbit)); } else { return (bs->bufa & (0xffffffff >> bspos)) >> (32 - bspos - bits); }}/* move forward to the next byte boundary */static void __inlineBitstreamByteAlign(Bitstream * const bs){ uint32_t remainder = bs->pos % 8; if (remainder) { BitstreamSkip(bs, 8 - remainder); }}/* bitstream length (unit bits) */static uint32_t __inlineBitstreamPos(const Bitstream * const bs){ return((uint32_t)(8*((ptr_t)bs->tail - (ptr_t)bs->start) + bs->pos - bs->start_pos));}/* read n bits from bitstream */static uint32_t __inlineBitstreamGetBits(Bitstream * const bs, const uint32_t n){ uint32_t ret = BitstreamShowBits(bs, n); BitstreamSkip(bs, n); return ret;}/* read single bit from bitstream */static uint32_t __inlineBitstreamGetBit(Bitstream * const bs){ return BitstreamGetBits(bs, 1);}/* write n bits to bitstream */static uint32_t __inlineBitstreamShowBits_R(Bitstream * const bs, const uint32_t bits){ int nbit = bs->pos - bits; uint32_t a, b; if (nbit >= 0) { return (bs->bufa & (0xffffffff >> nbit)) >> (32-bs->pos); } else { if (bs->pos == 0) { a = 0; b = (bs->bufb & (0xffffffff >> (32 + nbit))); } else { a = ((bs->bufa >> (32-bs->pos))); b = (bs->bufb & (0xffffffff >> (32 + nbit))) << (bs->pos); } return a | b; }}static void __inlineBitstreamSkip_R(Bitstream * const bs,{ bs->pos -= bits; if (bs->pos < 0) { uint32_t tmp; bs->bufa = bs->bufb; tmp = *((uint32_t *) bs->tail - 1); bs->bufb = tmp; bs->tail--; bs->pos += 32; }}static uint32_t __inlineBitstreamGetBits_R(Bitstream * const bs, const uint32_t n){ uint32_t ret = BitstreamShowBits_R(bs, n); BitstreamSkip_R(bs, n); return ret;}#endif /* _BITSTREAM_H_ */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -