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

📄 media.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.// Media// Implementation#include "Media.hh"#include "HashTable.hh"// A data structure for looking up a Medium by its string nameclass MediaLookupTable {public:  static MediaLookupTable* ourMedia(UsageEnvironment& env);  Medium* lookup(char const* name) const;      // Returns NULL if none already exists  void addNew(Medium* medium, char* mediumName);  void remove(char const* name);  void generateNewName(char* mediumName, unsigned maxLen);  protected:  MediaLookupTable(UsageEnvironment& env);  virtual ~MediaLookupTable();private:  UsageEnvironment& fEnv;  HashTable* fTable;  unsigned fNameGenerator;};////////// Medium //////////Medium::Medium(UsageEnvironment& env)	: fEnviron(env), fNextTask(NULL) {  // First generate a name for the new medium:  MediaLookupTable::ourMedia(env)->generateNewName(fMediumName, mediumNameMaxLen);  env.setResultMsg(fMediumName);  // Then add it to our table:  MediaLookupTable::ourMedia(env)->addNew(this, fMediumName);}Medium::~Medium() {  // Remove any tasks that might be pending for us:  fEnviron.taskScheduler().unscheduleDelayedTask(fNextTask);}Boolean Medium::lookupByName(UsageEnvironment& env, char const* mediumName,				  Medium*& resultMedium) {  resultMedium = MediaLookupTable::ourMedia(env)->lookup(mediumName);  if (resultMedium == NULL) {    env.setResultMsg("Medium ", mediumName, " does not exist");    return False;  }  return True;}void Medium::close(UsageEnvironment& env, char const* name) {  MediaLookupTable::ourMedia(env)->remove(name);}void Medium::close(Medium* medium) {  if (medium == NULL) return;  close(medium->envir(), medium->name());}Boolean Medium::isSource() const {  return False; // default implementation}Boolean Medium::isSink() const {  return False; // default implementation}Boolean Medium::isRTCPInstance() const {  return False; // default implementation}Boolean Medium::isRTSPClient() const {  return False; // default implementation}Boolean Medium::isRTSPServer() const {  return False; // default implementation}Boolean Medium::isMediaSession() const {  return False; // default implementation}Boolean Medium::isServerMediaSession() const {  return False; // default implementation}Boolean Medium::isDarwinInjector() const {  return False; // default implementation}////////// _Tables implementation //////////_Tables* _Tables::getOurTables(UsageEnvironment& env) {  if (env.liveMediaPriv == NULL) {    env.liveMediaPriv = new _Tables(env);  }  return (_Tables*)(env.liveMediaPriv);}void _Tables::reclaimIfPossible() {  if (mediaTable == NULL && socketTable == NULL) {    fEnv.liveMediaPriv = NULL;    delete this;  }}_Tables::_Tables(UsageEnvironment& env)  : mediaTable(NULL), socketTable(NULL), fEnv(env) {}_Tables::~_Tables() {}////////// MediaLookupTable implementation //////////MediaLookupTable* MediaLookupTable::ourMedia(UsageEnvironment& env) {  _Tables* ourTables = _Tables::getOurTables(env);  if (ourTables->mediaTable == NULL) {    // Create a new table to record the media that are to be created in    // this environment:    ourTables->mediaTable = new MediaLookupTable(env);  }  return (MediaLookupTable*)(ourTables->mediaTable);}Medium* MediaLookupTable::lookup(char const* name) const {  return (Medium*)(fTable->Lookup(name));}void MediaLookupTable::addNew(Medium* medium, char* mediumName) {  fTable->Add(mediumName, (void*)medium);}void MediaLookupTable::remove(char const* name) {  Medium* medium = lookup(name);  if (medium != NULL) {    fTable->Remove(name);    if (fTable->IsEmpty()) {      // We can also delete ourselves (to reclaim space):      _Tables* ourTables = _Tables::getOurTables(fEnv);      delete this;      ourTables->mediaTable = NULL;      ourTables->reclaimIfPossible();    }    delete medium;  }}void MediaLookupTable::generateNewName(char* mediumName,				       unsigned /*maxLen*/) {  // We should really use snprintf() here, but not all systems have it  sprintf(mediumName, "liveMedia%d", fNameGenerator++);}MediaLookupTable::MediaLookupTable(UsageEnvironment& env)  : fEnv(env), fTable(HashTable::create(STRING_HASH_KEYS)), fNameGenerator(0) {}MediaLookupTable::~MediaLookupTable() {  delete fTable;}

⌨️ 快捷键说明

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