ogg.h
上传用户:chn_coc
上传日期:2007-12-20
资源大小:563k
文件大小:3k
- // ------------------------------------------------
// 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