📄 player_media_rtp.cpp
字号:
{ 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 + -