ogg.h
上传用户:chn_coc
上传日期:2007-12-20
资源大小:563k
文件大小:3k
源码类别:

P2P编程

开发平台:

Windows_Unix

  1. // ------------------------------------------------ // 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;
  2. // ----------------------------------
  3. class OggPacket
  4. {
  5. public:
  6. enum 
  7. {
  8. MAX_BODYLEN = 65536, // probably too small
  9. MAX_PACKETS = 256 // prolly too small too, but realloc?!?!?!
  10. };
  11. void addLacing(OggPage &);
  12. int bodyLen;
  13. unsigned char body[MAX_BODYLEN];
  14. int numPackets;
  15. unsigned int packetSizes[MAX_PACKETS];
  16. };
  17. // ----------------------------------------------
  18. class OggSubStream
  19. {
  20. public:
  21. OggSubStream()
  22. :maxHeaders(0),serialNo(0),bitrate(0)
  23. {}
  24. bool needHeader()
  25. {
  26. return maxHeaders && (pack.numPackets < maxHeaders);
  27. }
  28. void eos()
  29. {
  30. maxHeaders=0;
  31. serialNo=0;
  32. }
  33. void bos(unsigned int ser)
  34. {
  35. maxHeaders = 3;
  36. pack.numPackets=0;
  37. pack.packetSizes[0]=0;
  38. pack.bodyLen = 0;
  39. serialNo = ser;
  40. bitrate = 0;
  41. }
  42. bool isActive() {return serialNo!=0;}
  43. void readHeader(Channel *,OggPage &);
  44. virtual void procHeaders(Channel *) = 0;
  45. int bitrate;
  46. OggPacket pack;
  47. int maxHeaders;
  48. unsigned int serialNo;
  49. };
  50. // ----------------------------------------------
  51. class OggVorbisSubStream : public OggSubStream
  52. {
  53. public:
  54. OggVorbisSubStream()
  55. :samplerate(0)
  56. {}
  57. virtual void procHeaders(Channel *);
  58. void readIdent(Stream &, ChanInfo &);
  59. void readSetup(Stream &);
  60. void readComment(Stream &, ChanInfo &);
  61. double getTime(OggPage &);
  62. int samplerate;
  63. };
  64. // ----------------------------------------------
  65. class OggTheoraSubStream : public OggSubStream
  66. {
  67. public:
  68. OggTheoraSubStream() : granposShift(0), frameTime(0) {}
  69. virtual void procHeaders(Channel *);
  70. void readInfo(Stream &, ChanInfo &);
  71. double getTime(OggPage &);
  72. int granposShift;
  73. double frameTime;
  74. };
  75. // ---------------------------------------------- class OGGStream : public ChannelStream { public:
  76. OGGStream()
  77. {}
  78. virtual void readHeader(Stream &,Channel *);
  79. virtual int readPacket(Stream &,Channel *);
  80. virtual void readEnd(Stream &,Channel *);
  81. void readHeaders(Stream &,Channel *, OggPage &);
  82. OggVorbisSubStream vorbis;
  83. OggTheoraSubStream theora;
  84. };
  85. // ---------------------------------- class OggPage { public: enum 
  86. { MAX_BODYLEN = 65536, MAX_HEADERLEN = 27+256 }; void read(Stream &); bool isBOS(); bool isEOS();
  87. bool isNewPacket();
  88. bool isHeader();
  89. unsigned int getSerialNo();
  90. bool detectVorbis(); bool detectTheora();
  91. int64_t granPos; int headLen,bodyLen; unsigned char data[MAX_HEADERLEN+MAX_BODYLEN];
  92. }; #endif