00001 #include "mpeg3private.h"
00002 #include "mpeg3protos.h"
00003
00004 #include <stdlib.h>
00005
00006 mpeg3_bits_t* mpeg3bits_new_stream(mpeg3_t *file, mpeg3_demuxer_t *demuxer)
00007 {
00008 mpeg3_bits_t *stream = malloc(sizeof(mpeg3_bits_t));
00009 stream->bfr = 0;
00010 stream->bfr_size = 0;
00011 stream->bit_number = 0;
00012 stream->file = file;
00013 stream->demuxer = demuxer;
00014 stream->input_ptr = 0;
00015 return stream;
00016 }
00017
00018 int mpeg3bits_delete_stream(mpeg3_bits_t* stream)
00019 {
00020 free(stream);
00021 return 0;
00022 }
00023
00024
00025
00026 int mpeg3bits_read_buffer(mpeg3_bits_t* stream, unsigned char *buffer, int bytes)
00027 {
00028 int result, i = 0;
00029 while(stream->bit_number > 0)
00030 {
00031 stream->bit_number -= 8;
00032 mpeg3demux_read_prev_char(stream->demuxer);
00033 }
00034
00035 stream->bit_number = 0;
00036 stream->bfr_size = 0;
00037 stream->bfr = 0;
00038 result = mpeg3demux_read_data(stream->demuxer, buffer, bytes);
00039 return result;
00040 }
00041
00042
00043 int mpeg3bits_use_ptr(mpeg3_bits_t* stream, unsigned char *buffer)
00044 {
00045 stream->bfr_size = stream->bit_number = 0;
00046 stream->bfr = 0;
00047 stream->input_ptr = buffer;
00048 return 0;
00049 }
00050
00051
00052 int mpeg3bits_use_demuxer(mpeg3_bits_t* stream)
00053 {
00054 if(stream->input_ptr)
00055 {
00056 stream->bfr_size = stream->bit_number = 0;
00057 stream->input_ptr = 0;
00058 stream->bfr = 0;
00059 }
00060
00061 return 0;
00062 }
00063
00064
00065
00066 void mpeg3bits_start_reverse(mpeg3_bits_t* stream)
00067 {
00068 int i;
00069 for(i = 0; i < stream->bfr_size; i += 8)
00070 {
00071 if(stream->input_ptr)
00072 stream->input_ptr--;
00073 else
00074 mpeg3demux_read_prev_char(stream->demuxer);
00075 }
00076 }
00077
00078
00079 void mpeg3bits_start_forward(mpeg3_bits_t* stream)
00080 {
00081 int i;
00082
00083
00084 if(stream->demuxer && mpeg3bits_bof(stream))
00085 {
00086 stream->bfr_size = 0;
00087 stream->bit_number = 0;
00088 stream->bfr = 0;
00089 stream->input_ptr = 0;
00090 mpeg3demux_read_char(stream->demuxer);
00091 }
00092 else
00093 for(i = 0; i < stream->bfr_size; i += 8)
00094 {
00095 if(stream->input_ptr)
00096 stream->input_ptr++;
00097 else
00098 mpeg3demux_read_char(stream->demuxer);
00099 }
00100 }
00101
00102
00103 int mpeg3bits_refill(mpeg3_bits_t* stream)
00104 {
00105 stream->bit_number = 32;
00106 stream->bfr_size = 32;
00107
00108 if(stream->input_ptr)
00109 {
00110 stream->bfr = (unsigned int)(*stream->input_ptr++) << 24;
00111 stream->bfr |= (unsigned int)(*stream->input_ptr++) << 16;
00112 stream->bfr |= (unsigned int)(*stream->input_ptr++) << 8;
00113 stream->bfr |= *stream->input_ptr++;
00114 }
00115 else
00116 {
00117 stream->bfr = mpeg3demux_read_char(stream->demuxer) << 24;
00118 stream->bfr |= mpeg3demux_read_char(stream->demuxer) << 16;
00119 stream->bfr |= mpeg3demux_read_char(stream->demuxer) << 8;
00120 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00121 }
00122 return mpeg3demux_eof(stream->demuxer);
00123 }
00124
00125
00126 int mpeg3bits_refill_backwards(mpeg3_bits_t* stream)
00127 {
00128 stream->bit_number = 0;
00129 stream->bfr_size = 32;
00130 stream->bfr = mpeg3demux_read_prev_char(stream->demuxer);
00131 stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << 8;
00132 stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << 16;
00133 stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << 24;
00134 return mpeg3demux_eof(stream->demuxer);
00135 }
00136
00137 int mpeg3bits_byte_align(mpeg3_bits_t *stream)
00138 {
00139 stream->bit_number = (stream->bit_number + 7) & 0xf8;
00140 return 0;
00141 }
00142
00143 int mpeg3bits_open_title(mpeg3_bits_t* stream, int title)
00144 {
00145 stream->bfr_size = stream->bit_number = 0;
00146 return mpeg3demux_open_title(stream->demuxer, title);
00147 }
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 int mpeg3bits_seek_byte(mpeg3_bits_t* stream, int64_t position)
00158 {
00159 stream->bfr_size = stream->bit_number = 0;
00160 return mpeg3demux_seek_byte(stream->demuxer, position);
00161 }
00162
00163 void mpeg3bits_reset(mpeg3_bits_t *stream)
00164 {
00165 stream->bfr_size = stream->bit_number = 0;
00166 }
00167
00168 int64_t mpeg3bits_tell(mpeg3_bits_t* stream)
00169 {
00170 return mpeg3demux_tell_byte(stream->demuxer);
00171 }
00172
00173 int mpeg3bits_getbitoffset(mpeg3_bits_t *stream)
00174 {
00175 return stream->bit_number & 7;
00176 }
00177