summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmpeg3/bitstream.h
Side-by-side diff
Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/bitstream.h') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmpeg3/bitstream.h207
1 files changed, 207 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/bitstream.h b/core/multimedia/opieplayer/libmpeg3/bitstream.h
new file mode 100644
index 0000000..2f6dcf9
--- a/dev/null
+++ b/core/multimedia/opieplayer/libmpeg3/bitstream.h
@@ -0,0 +1,207 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+#ifndef BITSTREAM_H
+#define BITSTREAM_H
+
+#include "mpeg3demux.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+// next bit in forward direction
+// next bit in reverse direction |
+// v v
+// | | | | | | | | | | | | | | | | | | | | | | | | | | |1|1|1|1|1|1| */
+// ^ ^
+// | bit_number = 1
+// bfr_size = 6
+
+typedef struct
+{
+ unsigned MPEG3_INT32 bfr; /* bfr = buffer for bits */
+ int bit_number; /* position of pointer in bfr */
+ int bfr_size; /* number of bits in bfr. Should always be a multiple of 8 */
+ struct mpeg3_rec *file; /* Mpeg2 file */
+ mpeg3_demuxer_t *demuxer; /* Mpeg2 demuxer */
+/* If the input ptr is true, data is read from it instead of the demuxer. */
+ unsigned char *input_ptr;
+} mpeg3_bits_t;
+
+LIBMPEG_EXPORT unsigned int mpeg3demux_read_char_packet(mpeg3_demuxer_t *demuxer);
+LIBMPEG_EXPORT unsigned int mpeg3demux_read_prev_char_packet(mpeg3_demuxer_t *demuxer);
+
+/* ======================================================================== */
+/* Entry Points */
+/* ======================================================================== */
+
+#define mpeg3bits_tell_percentage(stream) mpeg3demux_tell_percentage((stream)->demuxer)
+
+#define mpeg3bits_packet_time(stream) mpeg3demux_current_time((stream)->demuxer)
+
+#define mpeg3bits_time_offset(stream) mepg2demux_time_offset((stream)->demuxer)
+
+#define mpeg3bits_error(stream) mpeg3demux_error((stream)->demuxer)
+
+#define mpeg3bits_eof(stream) mpeg3demux_eof((stream)->demuxer)
+
+#define mpeg3bits_bof(stream) mpeg3demux_bof((stream)->demuxer)
+
+/* Read bytes backward from the file until the reverse_bits is full. */
+static inline void mpeg3bits_fill_reverse_bits(mpeg3_bits_t* stream, int bits)
+{
+// Right justify
+ while(stream->bit_number > 7)
+ {
+ stream->bfr >>= 8;
+ stream->bfr_size -= 8;
+ stream->bit_number -= 8;
+ }
+
+// Insert bytes before bfr_size
+ while(stream->bfr_size - stream->bit_number < bits)
+ {
+ if(stream->input_ptr)
+ stream->bfr |= (unsigned int)(*--stream->input_ptr) << stream->bfr_size;
+ else
+ stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << stream->bfr_size;
+ stream->bfr_size += 8;
+ }
+}
+
+/* Read bytes forward from the file until the forward_bits is full. */
+extern inline void mpeg3bits_fill_bits(mpeg3_bits_t* stream, int bits)
+{
+ while(stream->bit_number < bits)
+ {
+ stream->bfr <<= 8;
+ if(stream->input_ptr)
+ {
+ stream->bfr |= *stream->input_ptr++;
+ }
+ else
+ {
+ stream->bfr |= mpeg3demux_read_char(stream->demuxer);
+ }
+ stream->bit_number += 8;
+ stream->bfr_size += 8;
+ if(stream->bfr_size > 32) stream->bfr_size = 32;
+ }
+}
+
+/* Return 8 bits, advancing the file position. */
+extern inline unsigned int mpeg3bits_getbyte_noptr(mpeg3_bits_t* stream)
+{
+ if(stream->bit_number < 8)
+ {
+ stream->bfr <<= 8;
+ if(stream->input_ptr)
+ stream->bfr |= *stream->input_ptr++;
+ else
+ stream->bfr |= mpeg3demux_read_char(stream->demuxer);
+
+ stream->bfr_size += 8;
+ if(stream->bfr_size > 32) stream->bfr_size = 32;
+
+ return (stream->bfr >> stream->bit_number) & 0xff;
+ }
+ return (stream->bfr >> (stream->bit_number -= 8)) & 0xff;
+}
+
+extern inline unsigned int mpeg3bits_getbit_noptr(mpeg3_bits_t* stream)
+{
+ if(!stream->bit_number)
+ {
+ stream->bfr <<= 8;
+ stream->bfr |= mpeg3demux_read_char(stream->demuxer);
+
+ stream->bfr_size += 8;
+ if(stream->bfr_size > 32) stream->bfr_size = 32;
+
+ stream->bit_number = 7;
+
+ return (stream->bfr >> 7) & 0x1;
+ }
+ return (stream->bfr >> (--stream->bit_number)) & (0x1);
+}
+
+/* Return n number of bits, advancing the file position. */
+/* Use in place of flushbits */
+extern inline unsigned int mpeg3bits_getbits(mpeg3_bits_t* stream, int bits)
+{
+ if(bits <= 0) return 0;
+ mpeg3bits_fill_bits(stream, bits);
+ return (stream->bfr >> (stream->bit_number -= bits)) & (0xffffffff >> (32 - bits));
+}
+
+extern inline unsigned int mpeg3bits_showbits24_noptr(mpeg3_bits_t* stream)
+{
+ while(stream->bit_number < 24)
+ {
+ stream->bfr <<= 8;
+ stream->bfr |= mpeg3demux_read_char(stream->demuxer);
+ stream->bit_number += 8;
+ stream->bfr_size += 8;
+ if(stream->bfr_size > 32) stream->bfr_size = 32;
+ }
+ return (stream->bfr >> (stream->bit_number - 24)) & 0xffffff;
+}
+
+extern inline unsigned int mpeg3bits_showbits32_noptr(mpeg3_bits_t* stream)
+{
+ while(stream->bit_number < 32)
+ {
+ stream->bfr <<= 8;
+ stream->bfr |= mpeg3demux_read_char(stream->demuxer);
+ stream->bit_number += 8;
+ stream->bfr_size += 8;
+ if(stream->bfr_size > 32) stream->bfr_size = 32;
+ }
+ return stream->bfr;
+}
+
+extern inline unsigned int mpeg3bits_showbits(mpeg3_bits_t* stream, int bits)
+{
+ mpeg3bits_fill_bits(stream, bits);
+ return (stream->bfr >> (stream->bit_number - bits)) & (0xffffffff >> (32 - bits));
+}
+
+extern inline unsigned int mpeg3bits_getbits_reverse(mpeg3_bits_t* stream, int bits)
+{
+ unsigned int result;
+ mpeg3bits_fill_reverse_bits(stream, bits);
+ result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
+ stream->bit_number += bits;
+ return result;
+}
+
+extern inline unsigned int mpeg3bits_showbits_reverse(mpeg3_bits_t* stream, int bits)
+{
+ unsigned int result;
+ mpeg3bits_fill_reverse_bits(stream, bits);
+ result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
+ return result;
+}
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif