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

📄 player_media_rtp.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{  uint8_t payload_type, temp;  format_list_t *fmt;  uint64_t tickpersec;  if (m_head != NULL) {    payload_type = m_head->rtp_pak_pt;  } else {    payload_type = atoi(m_media_info->fmt_list->fmt);  }  fmt = m_media_info->fmt_list;  while (fmt != NULL) {    // rtp payloads are all numeric    temp = atoi(fmt->fmt);    if (temp == payload_type) {      m_media_fmt = fmt;      if (fmt->rtpmap_name != NULL) {	tickpersec = fmt->rtpmap_clock_rate;      } else {	if (payload_type >= 96) {	  media_message(LOG_ERR, "Media %s, rtp payload type of %u, no rtp map",			m_media_info->media, payload_type);	  return (FALSE);	} else {	  // generic payload type.  between 0 and 23 are audio - most	  // are 8000	  // all video (above 25) are 90000	  tickpersec = 90000;	  // this will handle the >= 0 case as well.	  if (payload_type <= 23) {	    tickpersec = 8000;	    if (payload_type == 6) {	      tickpersec = 16000;	    } else if (payload_type == 10 || payload_type == 11) {	      tickpersec = 44100;	    } else if (payload_type == 14) 	      tickpersec = 90000;	  }	}      }      create_rtp_byte_stream(payload_type,			     tickpersec,			     fmt);      uint64_t start_time = (uint64_t)(m_play_start_time * 1000.0);      m_rtp_byte_stream->play(start_time);      m_byte_stream = m_rtp_byte_stream;      if (is_audio()) {	m_rtp_byte_stream->set_sync(m_parent);      } else {	m_parent->synchronize_rtp_bytestreams(NULL);      }#if 1      media_message(LOG_DEBUG, "media %s - rtp tps %u ntp per rtp ",			   m_media_info->media,			   m_rtptime_tickpersec);#endif      return (TRUE);    }    fmt = fmt->next;  }  media_message(LOG_ERR, "Payload type %d not in format list for media %s", 		payload_type, get_name());  return (FALSE);}/* * set up rtptime */void CPlayerMedia::set_rtp_base_ts (uint32_t time){  m_rtsp_base_ts_received = 1;  m_rtp_base_ts = time;  if (m_rtp_byte_stream != NULL) {    m_rtp_byte_stream->set_rtp_base_ts(time);  }}void CPlayerMedia::set_rtp_base_seq (uint16_t seq){  m_rtsp_base_seq_received = 1;   m_rtp_base_seq = seq;  if (m_rtp_byte_stream != NULL) {    m_rtp_byte_stream->set_rtp_base_seq(seq);  }}void CPlayerMedia::rtp_init (bool do_tcp) {  rtp_stream_params_t rsp;  connect_desc_t *cptr;  double bw;  if (m_rtp_session == NULL) {    m_rtp_session_from_outside = false;    rtp_default_params(&rsp);    if (find_rtcp_bandwidth_from_media(m_media_info, &bw) < 0) {      bw = 5000.0;    }     rsp.rtcp_bandwidth = bw;    cptr = get_connect_desc_from_media(m_media_info);      rsp.rtp_addr = m_source_addr == NULL ? cptr->conn_addr : m_source_addr;    rsp.rtp_rx_port = m_our_port;    rsp.rtp_tx_port = m_server_port;    rsp.rtp_ttl = cptr == NULL ? 1 : cptr->ttl;    rsp.rtp_callback = c_recv_callback;    if (do_tcp) {      rsp.dont_init_sockets = 1;      rsp.rtcp_send_packet = c_rtcp_send_packet;    } else {      // udp.  See if we have a seperate rtcp field      if (m_media_info->rtcp_connect.used) {	rsp.rtcp_rx_port = m_media_info->rtcp_port;	rsp.rtcp_addr = m_media_info->rtcp_connect.conn_addr;	rsp.rtcp_ttl = m_media_info->rtcp_connect.ttl;      }      if (config.get_config_string(CONFIG_MULTICAST_RX_IF) != NULL) {	struct in_addr if_addr;	if (getIpAddressFromInterface(config.get_config_string(CONFIG_MULTICAST_RX_IF),				      &if_addr) >= 0) {	  rsp.physical_interface_addr = inet_ntoa(if_addr);	}      }    }    rsp.recv_userdata = this;    m_rtp_session = rtp_init_stream(&rsp);    rtp_set_option(m_rtp_session, RTP_OPT_WEAK_VALIDATION, FALSE);    rtp_set_option(m_rtp_session, RTP_OPT_PROMISC, TRUE);    if (strncasecmp(m_media_info->proto, "RTP/SVP", strlen("RTP/SVP")) == 0) {      srtp_init();    }  } else {    m_rtp_session_from_outside = true;    rtp_set_rtp_callback(m_rtp_session, c_recv_callback, this);  }  m_rtp_inited = 1;}void CPlayerMedia::create_rtp_byte_stream (uint8_t rtp_pt,					   uint64_t tps,					   format_list_t *fmt){  int codec;  rtp_check_return_t plugin_ret;  rtp_plugin_t *rtp_plugin;  int stream_ondemand;  rtp_plugin = NULL;  plugin_ret = check_for_rtp_plugins(fmt, rtp_pt, &rtp_plugin, &config);    stream_ondemand = 0;  if (m_stream_ondemand == 1 &&      get_range_from_media(m_media_info) != NULL) {    // m_stream_ondemand == 1 means we're using RTSP, and having a range     // in the SDP means that we have an ondemand presentation; otherwise, we    // want to treat it like a broadcast session, and use the RTCP.    stream_ondemand = 1;  }  if (plugin_ret != RTP_PLUGIN_NO_MATCH) {    switch (plugin_ret) {    case RTP_PLUGIN_MATCH:      player_debug_message("Starting rtp bytestream %s from plugin", 			   rtp_plugin->name);      m_rtp_byte_stream = new CPluginRtpByteStream(rtp_plugin,						 fmt,						 rtp_pt,						 stream_ondemand,						 tps,						 &m_head,						 &m_tail,						 m_rtsp_base_seq_received,						 m_rtp_base_seq,						 m_rtsp_base_ts_received,						 m_rtp_base_ts,						 m_rtcp_received,						 m_rtcp_ntp_frac,						 m_rtcp_ntp_sec,						 m_rtcp_rtp_ts);      return;    case RTP_PLUGIN_MATCH_USE_VIDEO_DEFAULT:      // just fall through...      break;     case RTP_PLUGIN_MATCH_USE_AUDIO_DEFAULT:      m_rtp_byte_stream = 	new CAudioRtpByteStream(rtp_pt, 				fmt, 				stream_ondemand,				tps,				&m_head,				&m_tail,				m_rtsp_base_seq_received,				m_rtp_base_seq,				m_rtsp_base_ts_received,				m_rtp_base_ts,				m_rtcp_received,				m_rtcp_ntp_frac,				m_rtcp_ntp_sec,				m_rtcp_rtp_ts);      if (m_rtp_byte_stream != NULL) {	player_debug_message("Starting generic audio byte stream");	return;      }    case RTP_PLUGIN_NO_MATCH:    default:      break;    }  } else {    if (is_audio() == false && (rtp_pt == 32)) {      codec = VIDEO_MPEG12;      m_rtp_byte_stream = new CMpeg3RtpByteStream(rtp_pt,						  fmt, 						  stream_ondemand,						  tps,						  &m_head,						  &m_tail,						  m_rtsp_base_seq_received,						  m_rtp_base_seq,						  m_rtsp_base_ts_received,						  m_rtp_base_ts,						  m_rtcp_received,						  m_rtcp_ntp_frac,						  m_rtcp_ntp_sec,						  m_rtcp_rtp_ts);      if (m_rtp_byte_stream != NULL) {	return;      }    } else {      if (rtp_pt == 14) {	codec = MPEG4IP_AUDIO_MP3;      } else if (rtp_pt <= 23) {	codec = MPEG4IP_AUDIO_GENERIC;      }  else {	if (fmt->rtpmap_name == NULL) return;	codec = lookup_audio_codec_by_name(fmt->rtpmap_name);	if (codec < 0) {	  codec = MPEG4IP_AUDIO_NONE; // fall through everything to generic	}      }      switch (codec) {      case MPEG4IP_AUDIO_MP3: {	m_rtp_byte_stream = 	  new CAudioRtpByteStream(rtp_pt, fmt, 				  stream_ondemand,				  tps,				  &m_head,				  &m_tail,				  m_rtsp_base_seq_received,				  m_rtp_base_seq,				  m_rtsp_base_ts_received,				  m_rtp_base_ts,				  m_rtcp_received,				  m_rtcp_ntp_frac,				  m_rtcp_ntp_sec,				  m_rtcp_rtp_ts);	if (m_rtp_byte_stream != NULL) {	  m_rtp_byte_stream->set_skip_on_advance(4);	  player_debug_message("Starting mp3 2250 audio byte stream");	  return;	}      }	break;      case MPEG4IP_AUDIO_MP3_ROBUST:	m_rtp_byte_stream = 	  new CRfc3119RtpByteStream(rtp_pt, fmt, 				    stream_ondemand,				    tps,				    &m_head,				    &m_tail,				    m_rtsp_base_seq_received,				    m_rtp_base_seq,				    m_rtsp_base_ts_received,				    m_rtp_base_ts,				    m_rtcp_received,				    m_rtcp_ntp_frac,				    m_rtcp_ntp_sec,				    m_rtcp_rtp_ts);	if (m_rtp_byte_stream != NULL) {	  player_debug_message("Starting mpa robust byte stream");	  return;	}	break;      case MPEG4IP_AUDIO_GENERIC:	m_rtp_byte_stream = 	  new CAudioRtpByteStream(rtp_pt, fmt, 				  stream_ondemand,				  tps,				  &m_head,				  &m_tail,				  m_rtsp_base_seq_received,				  m_rtp_base_seq,				  m_rtsp_base_ts_received,				  m_rtp_base_ts,				  m_rtcp_received,				  m_rtcp_ntp_frac,				  m_rtcp_ntp_sec,				  m_rtcp_rtp_ts);	if (m_rtp_byte_stream != NULL) {	  player_debug_message("Starting generic audio byte stream");	  return;	}      default:	break;      }    }  }  if (m_rtp_byte_stream == NULL)     m_rtp_byte_stream = new CRtpByteStream(fmt->media->media,					   fmt, 					   rtp_pt,					   stream_ondemand,					   tps,					   &m_head,					   &m_tail,					   m_rtsp_base_seq_received,					   m_rtp_base_seq,					   m_rtsp_base_ts_received,					   m_rtp_base_ts,					   m_rtcp_received,					   m_rtcp_ntp_frac,					   m_rtcp_ntp_sec,					   m_rtcp_rtp_ts);}void CPlayerMedia::synchronize_rtp_bytestreams (rtcp_sync_t *sync){  if (is_audio()) {    player_error_message("Attempt to syncronize audio byte stream");    return;  }  if (m_rtp_byte_stream != NULL)     m_rtp_byte_stream->synchronize(sync);}int CPlayerMedia::srtp_init (void){  if (m_rtp_session == NULL) return -1;  const char *crypto;  crypto = find_unparsed_a_value(m_media_info->unparsed_a_lines, 				 "a=crypto");  if (crypto == NULL) {    media_message(LOG_CRIT, "%s: can't find a=crypto line in sdp for srtp",		  get_name());    return -1;  }  m_srtp_session = srtp_setup_from_sdp(get_name(), m_rtp_session, crypto);  if (m_srtp_session == NULL)    media_message(LOG_ERR, "player_media_rtp.srtp_init: srtp_setup failed");    return 0;}    /* end player_media_rtp.cpp */

⌨️ 快捷键说明

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