📄 ogg.h
字号:
// ------------------------------------------------// File : ogg.h// Date: 28-may-2003// Author: giles//// (c) 2002-3 peercast.org// ------------------------------------------------// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// ------------------------------------------------#ifndef _OGG_H#define _OGG_H#include "channel.h"// ----------------------------------------------class OggPage;
// ----------------------------------
class OggPacket
{
public:
enum
{
MAX_BODYLEN = 65536, // probably too small
MAX_PACKETS = 256 // prolly too small too, but realloc?!?!?!
};
void addLacing(OggPage &);
int bodyLen;
unsigned char body[MAX_BODYLEN];
int numPackets;
unsigned int packetSizes[MAX_PACKETS];
};
// ----------------------------------------------
class OggSubStream
{
public:
OggSubStream()
:maxHeaders(0),serialNo(0),bitrate(0)
{}
bool needHeader()
{
return maxHeaders && (pack.numPackets < maxHeaders);
}
void eos()
{
maxHeaders=0;
serialNo=0;
}
void bos(unsigned int ser)
{
maxHeaders = 3;
pack.numPackets=0;
pack.packetSizes[0]=0;
pack.bodyLen = 0;
serialNo = ser;
bitrate = 0;
}
bool isActive() {return serialNo!=0;}
void readHeader(Channel *,OggPage &);
virtual void procHeaders(Channel *) = 0;
int bitrate;
OggPacket pack;
int maxHeaders;
unsigned int serialNo;
};
// ----------------------------------------------
class OggVorbisSubStream : public OggSubStream
{
public:
OggVorbisSubStream()
:samplerate(0)
{}
virtual void procHeaders(Channel *);
void readIdent(Stream &, ChanInfo &);
void readSetup(Stream &);
void readComment(Stream &, ChanInfo &);
double getTime(OggPage &);
int samplerate;
};
// ----------------------------------------------
class OggTheoraSubStream : public OggSubStream
{
public:
OggTheoraSubStream() : granposShift(0), frameTime(0) {}
virtual void procHeaders(Channel *);
void readInfo(Stream &, ChanInfo &);
double getTime(OggPage &);
int granposShift;
double frameTime;
};
// ----------------------------------------------class OGGStream : public ChannelStream{public:
OGGStream()
{}
virtual void readHeader(Stream &,Channel *);
virtual int readPacket(Stream &,Channel *);
virtual void readEnd(Stream &,Channel *);
void readHeaders(Stream &,Channel *, OggPage &);
OggVorbisSubStream vorbis;
OggTheoraSubStream theora;
};
// ----------------------------------class OggPage{public: enum
{ MAX_BODYLEN = 65536, MAX_HEADERLEN = 27+256 }; void read(Stream &); bool isBOS(); bool isEOS();
bool isNewPacket();
bool isHeader();
unsigned int getSerialNo();
bool detectVorbis(); bool detectTheora();
int64_t granPos; int headLen,bodyLen; unsigned char data[MAX_HEADERLEN+MAX_BODYLEN];
};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -