Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

bitstream.h

Go to the documentation of this file.
00001 /**********************************************************************
00002 ** Copyright (C) 2000 Trolltech AS.  All rights reserved.
00003 **
00004 ** This file is part of Qtopia Environment.
00005 **
00006 ** This file may be distributed and/or modified under the terms of the
00007 ** GNU General Public License version 2 as published by the Free Software
00008 ** Foundation and appearing in the file LICENSE.GPL included in the
00009 ** packaging of this file.
00010 **
00011 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00012 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00013 **
00014 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
00015 **
00016 ** Contact info@trolltech.com if any conditions of this licensing are
00017 ** not clear to you.
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 //                                    next bit in forward direction
00030 //                                  next bit in reverse direction |
00031 //                                                              v v
00032 // | | | | | | | | | | | | | | | | | | | | | | | | | | |1|1|1|1|1|1| */
00033 //                                                     ^         ^
00034 //                                                     |         bit_number = 1
00035 //                                                     bfr_size = 6
00036 
00037 typedef struct
00038 {
00039         unsigned MPEG3_INT32 bfr;  /* bfr = buffer for bits */
00040         int bit_number;   /* position of pointer in bfr */
00041         int bfr_size;    /* number of bits in bfr.  Should always be a multiple of 8 */
00042         struct mpeg3_rec *file;    /* Mpeg2 file */
00043         mpeg3_demuxer_t *demuxer;   /* Mpeg2 demuxer */
00044 /* If the input ptr is true, data is read from it instead of the demuxer. */
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 /*                                 Entry Points */
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 /* Read bytes backward from the file until the reverse_bits is full. */
00068 static inline void mpeg3bits_fill_reverse_bits(mpeg3_bits_t* stream, int bits)
00069 {
00070 // Right justify
00071         while(stream->bit_number > 7)
00072         {
00073                 stream->bfr >>= 8;
00074                 stream->bfr_size -= 8;
00075                 stream->bit_number -= 8;
00076         }
00077 
00078 // Insert bytes before bfr_size
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 /* Read bytes forward from the file until the forward_bits is full. */
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 /* Return 8 bits, advancing the file position. */
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 /* Return n number of bits, advancing the file position. */
00146 /* Use in place of flushbits */
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

Generated on Sat Nov 5 16:15:37 2005 for OPIE by  doxygen 1.4.2