⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bytestreammultifilesource.cpp

📁 流媒体传输协议的实现代码,非常有用.可以支持rtsp mms等流媒体传输协议
💻 CPP
字号:
/**********This library is free software; you can redistribute it and/or modify it underthe terms of the GNU Lesser General Public License as published by theFree Software Foundation; either version 2.1 of the License, or (at youroption) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)This library is distributed in the hope that it will be useful, but WITHOUTANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESSFOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License formore details.You should have received a copy of the GNU Lesser General Public Licensealong with this library; if not, write to the Free Software Foundation, Inc.,59 Temple Place, Suite 330, Boston, MA  02111-1307  USA**********/// "liveMedia"// Copyright (c) 1996-2004 Live Networks, Inc.  All rights reserved.// A source that consists of multiple byte-stream files, read sequentially// Implementation#include "ByteStreamMultiFileSource.hh"ByteStreamMultiFileSource::ByteStreamMultiFileSource(UsageEnvironment& env, char const** fileNameArray,			    unsigned preferredFrameSize, unsigned playTimePerFrame)  : FramedSource(env),    fPreferredFrameSize(preferredFrameSize), fPlayTimePerFrame(playTimePerFrame),    fCurrentlyReadSourceNumber(0), fHaveStartedNewFile(False) {    // Begin by counting the number of sources:    for (fNumSources = 0; ; ++fNumSources) {      if (fileNameArray[fNumSources] == NULL) break;    }    // Next, copy the source file names into our own array:    fFileNameArray = new char const*[fNumSources];    if (fFileNameArray == NULL) return;    unsigned i;    for (i = 0; i < fNumSources; ++i) {      fFileNameArray[i] = strDup(fileNameArray[i]);    }    // Next, set up our array of component ByteStreamFileSources    // Don't actually create these yet; instead, do this on demand    fSourceArray = new ByteStreamFileSource*[fNumSources];    if (fSourceArray == NULL) return;    for (i = 0; i < fNumSources; ++i) {      fSourceArray[i] = NULL;    }}ByteStreamMultiFileSource::~ByteStreamMultiFileSource() {  unsigned i;  for (i = 0; i < fNumSources; ++i) {    Medium::close(fSourceArray[i]);  }  delete[] fSourceArray;  for (i = 0; i < fNumSources; ++i) {    delete[] (char*)(fFileNameArray[i]);  }  delete[] fFileNameArray;}ByteStreamMultiFileSource* ByteStreamMultiFileSource::createNew(UsageEnvironment& env, char const** fileNameArray,	    unsigned preferredFrameSize, unsigned playTimePerFrame) {  ByteStreamMultiFileSource* newSource    = new ByteStreamMultiFileSource(env, fileNameArray,				    preferredFrameSize, playTimePerFrame);  return newSource;}void ByteStreamMultiFileSource::doGetNextFrame() {  do {    // First, check whether we've run out of sources:    if (fCurrentlyReadSourceNumber >= fNumSources) break;    fHaveStartedNewFile = False;    ByteStreamFileSource*& source      = fSourceArray[fCurrentlyReadSourceNumber];    if (source == NULL) {      // The current source hasn't been created yet.  Do this now:      source = ByteStreamFileSource::createNew(envir(),		       fFileNameArray[fCurrentlyReadSourceNumber],		       fPreferredFrameSize, fPlayTimePerFrame);      if (source == NULL) break;      fHaveStartedNewFile = True;    }          // (Attempt to) read from the current source.    source->getNextFrame(fTo, fMaxSize,			       afterGettingFrame, this,			       onSourceClosure, this);    return;  } while (0);  // An error occurred; consider ourselves closed:  handleClosure(this);}void ByteStreamMultiFileSource  ::afterGettingFrame(void* clientData,		      unsigned frameSize, unsigned numTruncatedBytes,		      struct timeval presentationTime,		      unsigned durationInMicroseconds) {  ByteStreamMultiFileSource* source    = (ByteStreamMultiFileSource*)clientData;  source->fFrameSize = frameSize;  source->fNumTruncatedBytes = numTruncatedBytes;  source->fPresentationTime = presentationTime;  source->fDurationInMicroseconds = durationInMicroseconds;  FramedSource::afterGetting(source);}void ByteStreamMultiFileSource::onSourceClosure(void* clientData) {  ByteStreamMultiFileSource* source    = (ByteStreamMultiFileSource*)clientData;  source->onSourceClosure1();}void ByteStreamMultiFileSource::onSourceClosure1() {  // This routine was called because the currently-read source was closed  // (probably due to EOF).  Close this source down, and move to the  // next one:  ByteStreamFileSource*& source    = fSourceArray[fCurrentlyReadSourceNumber++];  Medium::close(source);  source = NULL;  // Try reading again:  doGetNextFrame();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -