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

📄 media_stream.cpp

📁 完整的RTP RTSP代码库
💻 CPP
字号:
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. *  * The Original Code is MPEG4IP. *  * The Initial Developer of the Original Code is Cisco Systems Inc. * Portions created by Cisco Systems Inc. are * Copyright (C) Cisco Systems Inc. 2005.  All Rights Reserved. *  * Contributor(s):  *		Bill May 		wmay@cisco.com */#include "mp4live.h"#include "profile_audio.h"#include "profile_video.h"#include "profile_text.h"#define DECLARE_CONFIG_VARIABLES#include "media_stream.h"#undef DECLARE_CONFIG_VARIABLES#include "media_sink.h"#include "media_flow.h"#include "file_mp4_recorder.h"#include "video_encoder.h"CMediaStream::CMediaStream (const char *filename,			    CConfigEntry *next,			    CVideoProfileList *vpl,			    CAudioProfileList *apl,			    CTextProfileList *tpl) :  CConfigEntry(filename, "stream", next){  m_pVideoProfile = NULL;  m_pAudioProfile = NULL;  m_pTextProfile = NULL;  m_video_profile_list = vpl;  m_audio_profile_list = apl;  m_text_profile_list = tpl;  m_mp4_recorder = NULL;  m_video_encoder = NULL;  m_audio_encoder = NULL;  m_text_encoder = NULL;  m_audio_key = NULL;  m_audio_salt = NULL;  m_video_key = NULL;  m_video_salt = NULL;  m_text_key = NULL;  m_text_salt = NULL;  m_video_rtp_session = m_audio_rtp_session = NULL;}CMediaStream::~CMediaStream (void){  CHECK_AND_FREE(m_audio_key);  CHECK_AND_FREE(m_audio_salt);  CHECK_AND_FREE(m_video_key);  CHECK_AND_FREE(m_video_salt);  CHECK_AND_FREE(m_text_key);  CHECK_AND_FREE(m_text_salt);}void CMediaStream::SetVideoProfile (const char *name){  SetStringValue(STREAM_VIDEO_PROFILE, name);  m_pVideoProfile = m_video_profile_list->FindProfile(name);}void CMediaStream::SetAudioProfile (const char *name) {  SetStringValue(STREAM_AUDIO_PROFILE, name);  m_pAudioProfile = m_audio_profile_list->FindProfile(name);}void CMediaStream::SetTextProfile (const char *name){  SetStringValue(STREAM_TEXT_PROFILE, name);  m_pTextProfile = m_text_profile_list->FindProfile(name);}void CMediaStream::Initialize (bool check_config_name){  // reads the configuration file  CConfigEntry::Initialize(check_config_name);  if (m_valid == false) {     return;  }  // set variables based on information we read  if (GetBoolValue(STREAM_VIDEO_ENABLED)) {    if (m_video_profile_list == NULL) {      error_message("No video profiles to read");      m_valid = false;      return;    }    SetVideoProfile(GetStringValue(STREAM_VIDEO_PROFILE));    if (m_pVideoProfile == NULL) {      SetVideoProfile("default");      if (m_pVideoProfile == NULL) {	error_message("Video profile \"%s\" could not be found in stream %s", 		      GetStringValue(STREAM_VIDEO_PROFILE),		      GetStringValue(STREAM_NAME));	m_valid = false;	return;      }       SetStringValue(STREAM_VIDEO_PROFILE, "default");    }        }  if (GetBoolValue(STREAM_AUDIO_ENABLED)) {    if (m_audio_profile_list == NULL) {      error_message("No audio profiles to read");      m_valid = false;      return;    }    SetAudioProfile(GetStringValue(STREAM_AUDIO_PROFILE));    if (m_pAudioProfile == NULL) {      SetAudioProfile("default");      if (m_pAudioProfile == NULL) {	error_message("Audio profile \"%s\" could not be found in stream %s", 		      GetStringValue(STREAM_AUDIO_PROFILE),		      GetStringValue(STREAM_NAME));	m_valid = false;	return;      }       SetStringValue(STREAM_AUDIO_PROFILE, "default");    }  }  if (GetBoolValue(STREAM_TEXT_ENABLED)) {    if (m_text_profile_list == NULL) {      error_message("No text profiles to read");      m_valid = false;      return;    }    SetTextProfile(GetStringValue(STREAM_TEXT_PROFILE));    if (m_pTextProfile == NULL) {      SetTextProfile("default");      if (m_pTextProfile == NULL) {	error_message("Text profile \"%s\" could not be found in stream %s", 		      GetStringValue(STREAM_TEXT_PROFILE),		      GetStringValue(STREAM_NAME));	m_valid = false;	return;      }       SetStringValue(STREAM_TEXT_PROFILE, "default");    }  }  // same profile for text here...  char buffer[PATH_MAX];  // Set up the file names, if they do not already exist  const char *last_sep = strrchr(m_filename, '/');  if (last_sep == NULL) last_sep = m_filename;  else last_sep++;  if (GetStringValue(STREAM_SDP_FILE_NAME) == NULL) {    snprintf(buffer, PATH_MAX, "%s.sdp", last_sep);    SetStringValue(STREAM_SDP_FILE_NAME, buffer);    debug_message("Setting stream %s sdp file to \"%s\"", 		  GetName(), buffer);  }  if (GetStringValue(STREAM_RECORD_MP4_FILE_NAME) == NULL) {    // set file name    snprintf(buffer, PATH_MAX, "%s.mp4", last_sep);    SetStringValue(STREAM_RECORD_MP4_FILE_NAME, buffer);    debug_message("Setting stream %s file to \"%s\"",		  GetName(), buffer);  }  if (GetStringValue(STREAM_CAPTION) == NULL) {    if (GetStringValue(STREAM_NAME) == NULL)      SetStringValue(STREAM_CAPTION, "default");    else      SetStringValue(STREAM_CAPTION, GetStringValue(STREAM_NAME));    debug_message("Setting stream %s caption to \"%s\"", 		  GetName(), GetStringValue(STREAM_NAME));  }}void CMediaStream::LoadConfigVariables (void){  AddConfigVariables(StreamConfigVariables, 		     NUM_ELEMENTS_IN_ARRAY(StreamConfigVariables));}CMediaSink *CMediaStream::CreateFileRecorder(CLiveConfig *pConfig){  if (m_mp4_recorder == NULL) {    m_mp4_recorder = new CMp4Recorder(this);    m_mp4_recorder->SetConfig(pConfig);    m_mp4_recorder->StartThread();  }  return m_mp4_recorder;}      void CMediaStream::Stop (void){  if (m_mp4_recorder != NULL) {    m_mp4_recorder->StopThread();    delete m_mp4_recorder;    m_mp4_recorder = NULL;  }}bool CMediaStream::GetStreamStatus (uint32_t valueName, void *pValue){  switch (valueName) {  case FLOW_STATUS_VIDEO_ENCODED_FRAMES:    if (m_video_encoder == NULL) return false;    *(uint32_t *)pValue = m_video_encoder->GetEncodedFrames();    return true;  case FLOW_STATUS_FILENAME:    if (m_mp4_recorder == NULL) return false;    *(const char **)pValue = m_mp4_recorder->GetRecordFileName();    return true;  }  return false;}void CMediaStream::RestartFileRecording (void){  if (m_mp4_recorder != NULL) {    m_mp4_recorder->Stop();    m_mp4_recorder->Start();  }}static char randhex (void){  char ret = random() & 0xf;  if (ret >= 10) return ret - 10 + 'a';  return '0' + ret;}const char *generate_random(uint size){  char *ret = (char *)malloc((size * 2) + 1);  uint ix;  for (ix = 0; ix < size; ix++) {    ret[ix * 2] = randhex();    ret[(ix * 2) + 1] = randhex();  }  ret[(size * 2)] = '\0';  return ret;}void CMediaStream::SetUpSRTPKeys (void) {  if (GetBoolValue(STREAM_VIDEO_USE_SRTP)) {    srandom(GetTimestamp());    if (GetBoolValue(STREAM_VIDEO_SRTP_FIXED_KEYS)) {      CHECK_AND_FREE(m_video_key);      m_video_key = strdup(GetStringValue(STREAM_VIDEO_SRTP_KEY));      CHECK_AND_FREE(m_video_salt);      m_video_salt = strdup(GetStringValue(STREAM_VIDEO_SRTP_SALT));    } else {      if (m_video_key == NULL)	m_video_key = generate_random(16);      if(m_video_salt == NULL) 	m_video_salt = generate_random(14);    }  }  if (GetBoolValue(STREAM_AUDIO_USE_SRTP)) {    if (GetBoolValue(STREAM_AUDIO_SRTP_FIXED_KEYS)) {      CHECK_AND_FREE(m_audio_key);      m_audio_key = strdup(GetStringValue(STREAM_AUDIO_SRTP_KEY));      CHECK_AND_FREE(m_audio_salt);      m_audio_salt = strdup(GetStringValue(STREAM_AUDIO_SRTP_SALT));    } else {      if (m_audio_key == NULL)	m_audio_key = generate_random(16);      if(m_audio_salt == NULL) 	m_audio_salt = generate_random(14);    }  }  if (GetBoolValue(STREAM_TEXT_USE_SRTP)) {    if (GetBoolValue(STREAM_TEXT_SRTP_FIXED_KEYS)) {      CHECK_AND_FREE(m_text_key);      m_text_key = strdup(GetStringValue(STREAM_TEXT_SRTP_KEY));      CHECK_AND_FREE(m_text_salt);      m_text_salt = strdup(GetStringValue(STREAM_TEXT_SRTP_SALT));    } else {      if (m_text_key == NULL)	m_text_key = generate_random(16);      if(m_text_salt == NULL) 	m_text_salt = generate_random(14);    }  }}

⌨️ 快捷键说明

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