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

📄 framedsource.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.// Framed Sources// Implementation#include "FramedSource.hh"#include <stdlib.h>////////// FramedSource //////////FramedSource::FramedSource(UsageEnvironment& env)  : MediaSource(env),    fAfterGettingFunc(NULL), fAfterGettingClientData(NULL),    fOnCloseFunc(NULL), fOnCloseClientData(NULL),    fIsCurrentlyAwaitingData(False) {  fPresentationTime.tv_sec = fPresentationTime.tv_usec = 0; // initially}FramedSource::~FramedSource() {}Boolean FramedSource::isFramedSource() const {  return True;}Boolean FramedSource::lookupByName(UsageEnvironment& env, char const* sourceName,				   FramedSource*& resultSource) {  resultSource = NULL; // unless we succeed  MediaSource* source;  if (!MediaSource::lookupByName(env, sourceName, source)) return False;  if (!source->isFramedSource()) {    env.setResultMsg(sourceName, " is not a framed source");    return False;  }  resultSource = (FramedSource*)source;  return True;}void FramedSource::getNextFrame(unsigned char* to, unsigned maxSize,				afterGettingFunc* afterGettingFunc,				void* afterGettingClientData,				onCloseFunc* onCloseFunc,				void* onCloseClientData) {  // Make sure we're not already being read:  if (fIsCurrentlyAwaitingData) {    envir() << "FramedSource[" << this << "]::getNextFrame(): attempting to read more than once at the same time!\n";    exit(1);  }  fTo = to;  fMaxSize = maxSize;  fNumTruncatedBytes = 0; // by default; could be changed by doGetNextFrame()  fDurationInMicroseconds = 0; // by default; could be changed by doGetNextFrame()  fAfterGettingFunc = afterGettingFunc;  fAfterGettingClientData = afterGettingClientData;  fOnCloseFunc = onCloseFunc;  fOnCloseClientData = onCloseClientData;  fIsCurrentlyAwaitingData = True;  doGetNextFrame();}// ##### The following is for backwards-compatibility; remove it eventually:#ifdef BACKWARDS_COMPATIBLE_WITH_OLD_AFTER_GETTING_FUNCstatic void bwCompatHackAfterGetting(void* clientData, unsigned frameSize,				     unsigned /*numTruncatedBytes*/,				     struct timeval presentationTime,				     unsigned /*durationInMicroseconds*/) {  FramedSource* source = (FramedSource*)clientData;  FramedSource::bwCompatAfterGettingFunc* clientAfterGettingFunc    = source->fSavedBWCompatAfterGettingFunc;  void* afterGettingClientData = source->fSavedBWCompatAfterGettingClientData;  if (clientAfterGettingFunc != NULL) {    (*clientAfterGettingFunc)(afterGettingClientData, frameSize, presentationTime);  }}void FramedSource::getNextFrame(unsigned char* to, unsigned maxSize,				bwCompatAfterGettingFunc* afterGettingFunc,				void* afterGettingClientData,				onCloseFunc* onCloseFunc,				void* onCloseClientData) {  fSavedBWCompatAfterGettingFunc = afterGettingFunc;  fSavedBWCompatAfterGettingClientData = afterGettingClientData;  // Call the regular (new) "getNextFrame()":  getNextFrame(to, maxSize, bwCompatHackAfterGetting, this,	       onCloseFunc, onCloseClientData);}#endif// ##### End of code for backwards-compatibility.void FramedSource::afterGetting(FramedSource* source) {  source->fIsCurrentlyAwaitingData = False;      // indicates that we can be read again      // Note that this needs to be done here, in case the "fAfterFunc"      // called below tries to read another frame (which it usually will)  if (source->fAfterGettingFunc != NULL) {    (*(source->fAfterGettingFunc))(source->fAfterGettingClientData,				   source->fFrameSize, source->fNumTruncatedBytes,				   source->fPresentationTime,				   source->fDurationInMicroseconds);  }}void FramedSource::handleClosure(void* clientData) {  FramedSource* source = (FramedSource*)clientData;  source->fIsCurrentlyAwaitingData = False; // because we got a close instead  if (source->fOnCloseFunc != NULL) {    (*(source->fOnCloseFunc))(source->fOnCloseClientData);  }}void FramedSource::stopGettingFrames() {  fIsCurrentlyAwaitingData = False; // indicates that we can be read again  // Perform any specialized action now:  doStopGettingFrames();}void FramedSource::doStopGettingFrames() {  // Default implementation: Do nothing  // Subclasses may wish to specialize this so as to ensure that a  // subsequent reader can pick up where this one left off.}unsigned FramedSource::maxFrameSize() const {  // By default, this source has no maximum frame size.  return 0;} Boolean FramedSource::isPrioritizedRTPStreamSelector() const {  return False; // default implementation}

⌨️ 快捷键说明

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