You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/mpeglib/lib/splay/mpegAudioStream.h

140 lines
2.4 KiB

/*
initializer/resyncer/frame detection etc.. for mpeg audio
Copyright (C) 2000 Martin Vogt
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Library General Public License as published by
the Free Software Foundation.
For more information look at the file COPYRIGHT in this package
*/
#ifndef __MPEGAUDIOSTREAM_H
#define __MPEGAUDIOSTREAM_H
// we include this for the big_endian define
#include "mpegAudioBitWindow.h"
#define _MAX_MPEG_BUFFERSIZE 4096
/**
Here we go from the frame to the bitlevel.
*/
class MpegAudioStream {
char* buffer;
int len;
int bitindex;
public:
MpegAudioStream();
~MpegAudioStream();
void setFrame(unsigned char* prt,int len);
// Bit functions
inline char* getBuffer() { return buffer; }
inline int getBufferSize() { return _MAX_MPEG_BUFFERSIZE ;}
inline void sync() { bitindex=(bitindex+7)&0xFFFFFFF8; }
inline int issync() { return (bitindex&7);};
/**
Now follow ugly inline function. The performance gain is 1.5 %
on a 400 MHz AMD
*/
inline int getbyte() {
int r=(unsigned char)buffer[bitindex>>3];
bitindex+=8;
return r;
}
inline int getbits9(int bits) {
unsigned short a;
{
int offset=bitindex>>3;
a=(((unsigned char)buffer[offset])<<8) |
((unsigned char)buffer[offset+1]);
}
a<<=(bitindex&7);
bitindex+=bits;
return (int)((unsigned int)(a>>(16-bits)));
}
inline int getbits8() {
unsigned short a;
{
int offset=bitindex>>3;
a=(((unsigned char)buffer[offset])<<8) |
((unsigned char)buffer[offset+1]);
}
a<<=(bitindex&7);
bitindex+=8;
return (int)((unsigned int)(a>>8));
}
inline int getbit() {
int r=(buffer[bitindex>>3]>>(7-(bitindex&7)))&1;
bitindex++;
return r;
}
inline int getbits(int bits) {
union
{
char store[4];
int current;
}u;
int bi;
if(!bits)return 0;
u.current=0;
bi=(bitindex&7);
u.store[_KEY]=buffer[bitindex>>3]<<bi;
bi=8-bi;
bitindex+=bi;
while(bits) {
if(!bi) {
u.store[_KEY]=buffer[bitindex>>3];
bitindex+=8;
bi=8;
}
if(bits>=bi) {
u.current<<=bi;
bits-=bi;
bi=0;
} else {
u.current<<=bits;
bi-=bits;
bits=0;
}
}
bitindex-=bi;
return (u.current>>8);
}
};
#endif