00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef BITSTREAM_H
00021 #define BITSTREAM_H
00022
00023 #include "mpeg3demux.h"
00024
00025 #if defined(__cplusplus)
00026 extern "C" {
00027 #endif
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 typedef struct
00038 {
00039 unsigned MPEG3_INT32 bfr;
00040 int bit_number;
00041 int bfr_size;
00042 struct mpeg3_rec *file;
00043 mpeg3_demuxer_t *demuxer;
00044
00045 unsigned char *input_ptr;
00046 } mpeg3_bits_t;
00047
00048 LIBMPEG_EXPORT unsigned int mpeg3demux_read_char_packet(mpeg3_demuxer_t *demuxer);
00049 LIBMPEG_EXPORT unsigned int mpeg3demux_read_prev_char_packet(mpeg3_demuxer_t *demuxer);
00050
00051
00052
00053
00054
00055 #define mpeg3bits_tell_percentage(stream) mpeg3demux_tell_percentage((stream)->demuxer)
00056
00057 #define mpeg3bits_packet_time(stream) mpeg3demux_current_time((stream)->demuxer)
00058
00059 #define mpeg3bits_time_offset(stream) mepg2demux_time_offset((stream)->demuxer)
00060
00061 #define mpeg3bits_error(stream) mpeg3demux_error((stream)->demuxer)
00062
00063 #define mpeg3bits_eof(stream) mpeg3demux_eof((stream)->demuxer)
00064
00065 #define mpeg3bits_bof(stream) mpeg3demux_bof((stream)->demuxer)
00066
00067
00068 static inline void mpeg3bits_fill_reverse_bits(mpeg3_bits_t* stream, int bits)
00069 {
00070
00071 while(stream->bit_number > 7)
00072 {
00073 stream->bfr >>= 8;
00074 stream->bfr_size -= 8;
00075 stream->bit_number -= 8;
00076 }
00077
00078
00079 while(stream->bfr_size - stream->bit_number < bits)
00080 {
00081 if(stream->input_ptr)
00082 stream->bfr |= (unsigned int)(*--stream->input_ptr) << stream->bfr_size;
00083 else
00084 stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << stream->bfr_size;
00085 stream->bfr_size += 8;
00086 }
00087 }
00088
00089
00090 extern inline void mpeg3bits_fill_bits(mpeg3_bits_t* stream, int bits)
00091 {
00092 while(stream->bit_number < bits)
00093 {
00094 stream->bfr <<= 8;
00095 if(stream->input_ptr)
00096 {
00097 stream->bfr |= *stream->input_ptr++;
00098 }
00099 else
00100 {
00101 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00102 }
00103 stream->bit_number += 8;
00104 stream->bfr_size += 8;
00105 if(stream->bfr_size > 32) stream->bfr_size = 32;
00106 }
00107 }
00108
00109
00110 extern inline unsigned int mpeg3bits_getbyte_noptr(mpeg3_bits_t* stream)
00111 {
00112 if(stream->bit_number < 8)
00113 {
00114 stream->bfr <<= 8;
00115 if(stream->input_ptr)
00116 stream->bfr |= *stream->input_ptr++;
00117 else
00118 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00119
00120 stream->bfr_size += 8;
00121 if(stream->bfr_size > 32) stream->bfr_size = 32;
00122
00123 return (stream->bfr >> stream->bit_number) & 0xff;
00124 }
00125 return (stream->bfr >> (stream->bit_number -= 8)) & 0xff;
00126 }
00127
00128 extern inline unsigned int mpeg3bits_getbit_noptr(mpeg3_bits_t* stream)
00129 {
00130 if(!stream->bit_number)
00131 {
00132 stream->bfr <<= 8;
00133 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00134
00135 stream->bfr_size += 8;
00136 if(stream->bfr_size > 32) stream->bfr_size = 32;
00137
00138 stream->bit_number = 7;
00139
00140 return (stream->bfr >> 7) & 0x1;
00141 }
00142 return (stream->bfr >> (--stream->bit_number)) & (0x1);
00143 }
00144
00145
00146
00147 extern inline unsigned int mpeg3bits_getbits(mpeg3_bits_t* stream, int bits)
00148 {
00149 if(bits <= 0) return 0;
00150 mpeg3bits_fill_bits(stream, bits);
00151 return (stream->bfr >> (stream->bit_number -= bits)) & (0xffffffff >> (32 - bits));
00152 }
00153
00154 extern inline unsigned int mpeg3bits_showbits24_noptr(mpeg3_bits_t* stream)
00155 {
00156 while(stream->bit_number < 24)
00157 {
00158 stream->bfr <<= 8;
00159 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00160 stream->bit_number += 8;
00161 stream->bfr_size += 8;
00162 if(stream->bfr_size > 32) stream->bfr_size = 32;
00163 }
00164 return (stream->bfr >> (stream->bit_number - 24)) & 0xffffff;
00165 }
00166
00167 extern inline unsigned int mpeg3bits_showbits32_noptr(mpeg3_bits_t* stream)
00168 {
00169 while(stream->bit_number < 32)
00170 {
00171 stream->bfr <<= 8;
00172 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00173 stream->bit_number += 8;
00174 stream->bfr_size += 8;
00175 if(stream->bfr_size > 32) stream->bfr_size = 32;
00176 }
00177 return stream->bfr;
00178 }
00179
00180 extern inline unsigned int mpeg3bits_showbits(mpeg3_bits_t* stream, int bits)
00181 {
00182 mpeg3bits_fill_bits(stream, bits);
00183 return (stream->bfr >> (stream->bit_number - bits)) & (0xffffffff >> (32 - bits));
00184 }
00185
00186 extern inline unsigned int mpeg3bits_getbits_reverse(mpeg3_bits_t* stream, int bits)
00187 {
00188 unsigned int result;
00189 mpeg3bits_fill_reverse_bits(stream, bits);
00190 result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
00191 stream->bit_number += bits;
00192 return result;
00193 }
00194
00195 extern inline unsigned int mpeg3bits_showbits_reverse(mpeg3_bits_t* stream, int bits)
00196 {
00197 unsigned int result;
00198 mpeg3bits_fill_reverse_bits(stream, bits);
00199 result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
00200 return result;
00201 }
00202
00203 #if defined(__cplusplus)
00204 }
00205 #endif
00206
00207 #endif