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

P2P编程

开发平台:

Windows_Unix

  1. // ------------------------------------------------ // File : mms.cpp // 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. // ------------------------------------------------ #include "channel.h" #include "mms.h" #include "asf.h" // ------------------------------------------ ASFInfo parseASFHeader(Stream &in);
  2. // ------------------------------------------
  3. void MMSStream::readEnd(Stream &,Channel *)
  4. {
  5. }
  6. // ------------------------------------------ void MMSStream::readHeader(Stream &,Channel *) {
  7. } // ------------------------------------------ int MMSStream::readPacket(Stream &in,Channel *ch) { { ASFChunk chunk; chunk.read(in);
  8. switch (chunk.type) { case 0x4824: // asf header { MemoryStream mem(ch->headPack.data,sizeof(ch->headPack.data)); chunk.write(mem);
  9. MemoryStream asfm(chunk.data,chunk.dataLen); ASFObject asfHead; asfHead.readHead(asfm); ASFInfo asf = parseASFHeader(asfm); LOG_DEBUG("ASF Info: pnum=%d, psize=%d, br=%d",asf.numPackets,asf.packetSize,asf.bitrate); for(int i=0; i<ASFInfo::MAX_STREAMS; i++) { ASFStream *s = &asf.streams[i]; if (s->id) LOG_DEBUG("ASF Stream %d : %s, br=%d",s->id,s->getTypeName(),s->bitrate); } ch->info.bitrate = asf.bitrate/1000;
  10. ch->headPack.type = ChanPacket::T_HEAD;
  11. ch->headPack.len = mem.pos;
  12. ch->headPack.pos = ch->streamPos;
  13. ch->newPacket(ch->headPack);
  14. ch->streamPos += ch->headPack.len;
  15. break; } case 0x4424: // asf data { ChanPacket pack;
  16. MemoryStream mem(pack.data,sizeof(pack.data)); chunk.write(mem);
  17. pack.type = ChanPacket::T_DATA;
  18. pack.len = mem.pos;
  19. pack.pos = ch->streamPos;
  20. ch->newPacket(pack);
  21. ch->streamPos += pack.len;
  22. break; } default: throw StreamException("Unknown ASF chunk"); } }
  23. return 0; } // ----------------------------------- ASFInfo parseASFHeader(Stream &in) { ASFInfo asf; try { int numHeaders = in.readLong(); in.readChar(); in.readChar(); LOG_CHANNEL("ASF Headers: %d",numHeaders); for(int i=0; i<numHeaders; i++) { ASFObject obj; unsigned int l = obj.readHead(in); obj.readData(in,l); MemoryStream data(obj.data,obj.lenLo); switch (obj.type) { case ASFObject::T_FILE_PROP: { data.skip(32); unsigned int dpLo = data.readLong(); unsigned int dpHi = data.readLong(); data.skip(24); data.readLong(); //data.writeLong(1); // flags = broadcast, not seekable int min = data.readLong(); int max = data.readLong(); int br = data.readLong(); if (min != max) throw StreamException("ASF packetsizes (min/max) must match"); asf.packetSize = max; asf.bitrate = br; asf.numPackets = dpLo; break; } case ASFObject::T_STREAM_BITRATE: { int cnt = data.readShort(); for(int i=0; i<cnt; i++) { unsigned int id = data.readShort(); int bitrate = data.readLong(); if (id < ASFInfo::MAX_STREAMS) asf.streams[id].bitrate = bitrate; } break; } case ASFObject::T_STREAM_PROP: { ASFStream s; s.read(data); asf.streams[s.id].id = s.id; asf.streams[s.id].type = s.type; break; } } } }catch(StreamException &e) { LOG_ERROR("ASF: %s",e.msg); } return asf; }