| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 882 // side to cause recreation of the stream. | 882 // side to cause recreation of the stream. |
| 883 before[i].codec.preference = 0; | 883 before[i].codec.preference = 0; |
| 884 after[i].codec.preference = 0; | 884 after[i].codec.preference = 0; |
| 885 if (before[i] != after[i]) { | 885 if (before[i] != after[i]) { |
| 886 return true; | 886 return true; |
| 887 } | 887 } |
| 888 } | 888 } |
| 889 return false; | 889 return false; |
| 890 } | 890 } |
| 891 | 891 |
| 892 bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) { | 892 bool WebRtcVideoChannel2::SetSendParameters( |
| 893 const VideoSendParameters& send_params) { |
| 893 // TODO(pbos): Refactor this to only recreate the send streams once | 894 // TODO(pbos): Refactor this to only recreate the send streams once |
| 894 // instead of 4 times. | 895 // instead of 4 times. |
| 895 return (SetSendCodecs(params.codecs) && | 896 if (!SetSendCodecs(send_params.codecs) || |
| 896 SetSendRtpHeaderExtensions(params.extensions) && | 897 !SetSendRtpHeaderExtensions(send_params.extensions) || |
| 897 SetMaxSendBandwidth(params.max_bandwidth_bps) && | 898 !SetMaxSendBandwidth(send_params.max_bandwidth_bps) || |
| 898 SetOptions(params.options)); | 899 !SetOptions(send_params.options)) { |
| 900 return false; |
| 901 } |
| 902 send_params_ = send_params; |
| 903 return true; |
| 899 } | 904 } |
| 900 | 905 |
| 901 bool WebRtcVideoChannel2::SetRecvParameters(const VideoRecvParameters& params) { | 906 bool WebRtcVideoChannel2::SetRecvParameters( |
| 907 const VideoRecvParameters& recv_params) { |
| 902 // TODO(pbos): Refactor this to only recreate the recv streams once | 908 // TODO(pbos): Refactor this to only recreate the recv streams once |
| 903 // instead of twice. | 909 // instead of twice. |
| 904 return (SetRecvCodecs(params.codecs) && | 910 if (!SetRecvCodecs(recv_params.codecs) || |
| 905 SetRecvRtpHeaderExtensions(params.extensions)); | 911 !SetRecvRtpHeaderExtensions(recv_params.extensions)) { |
| 912 return false; |
| 913 } |
| 914 recv_params_ = recv_params; |
| 915 return true; |
| 906 } | 916 } |
| 907 | 917 |
| 908 std::string WebRtcVideoChannel2::CodecSettingsVectorToString( | 918 std::string WebRtcVideoChannel2::CodecSettingsVectorToString( |
| 909 const std::vector<VideoCodecSettings>& codecs) { | 919 const std::vector<VideoCodecSettings>& codecs) { |
| 910 std::stringstream out; | 920 std::stringstream out; |
| 911 out << '{'; | 921 out << '{'; |
| 912 for (size_t i = 0; i < codecs.size(); ++i) { | 922 for (size_t i = 0; i < codecs.size(); ++i) { |
| 913 out << codecs[i].codec.ToString(); | 923 out << codecs[i].codec.ToString(); |
| 914 if (i != codecs.size() - 1) { | 924 if (i != codecs.size() - 1) { |
| 915 out << ", "; | 925 out << ", "; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1104 return false; | 1114 return false; |
| 1105 | 1115 |
| 1106 rtc::CritScope stream_lock(&stream_crit_); | 1116 rtc::CritScope stream_lock(&stream_crit_); |
| 1107 | 1117 |
| 1108 if (!ValidateSendSsrcAvailability(sp)) | 1118 if (!ValidateSendSsrcAvailability(sp)) |
| 1109 return false; | 1119 return false; |
| 1110 | 1120 |
| 1111 for (uint32 used_ssrc : sp.ssrcs) | 1121 for (uint32 used_ssrc : sp.ssrcs) |
| 1112 send_ssrcs_.insert(used_ssrc); | 1122 send_ssrcs_.insert(used_ssrc); |
| 1113 | 1123 |
| 1114 WebRtcVideoSendStream* stream = | 1124 WebRtcVideoSendStream* stream = new WebRtcVideoSendStream( |
| 1115 new WebRtcVideoSendStream(call_.get(), | 1125 call_.get(), external_encoder_factory_, options_, |
| 1116 external_encoder_factory_, | 1126 bitrate_config_.max_bitrate_bps, send_codec_, sp, send_rtp_extensions_, |
| 1117 options_, | 1127 send_params_); |
| 1118 bitrate_config_.max_bitrate_bps, | |
| 1119 send_codec_, | |
| 1120 sp, | |
| 1121 send_rtp_extensions_); | |
| 1122 | 1128 |
| 1123 uint32 ssrc = sp.first_ssrc(); | 1129 uint32 ssrc = sp.first_ssrc(); |
| 1124 DCHECK(ssrc != 0); | 1130 DCHECK(ssrc != 0); |
| 1125 send_streams_[ssrc] = stream; | 1131 send_streams_[ssrc] = stream; |
| 1126 | 1132 |
| 1127 if (rtcp_receiver_report_ssrc_ == kDefaultRtcpReceiverReportSsrc) { | 1133 if (rtcp_receiver_report_ssrc_ == kDefaultRtcpReceiverReportSsrc) { |
| 1128 rtcp_receiver_report_ssrc_ = ssrc; | 1134 rtcp_receiver_report_ssrc_ = ssrc; |
| 1129 LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because we added " | 1135 LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because we added " |
| 1130 "a send stream."; | 1136 "a send stream."; |
| 1131 for (auto& kv : receive_streams_) | 1137 for (auto& kv : receive_streams_) |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1242 | 1248 |
| 1243 void WebRtcVideoChannel2::ConfigureReceiverRtp( | 1249 void WebRtcVideoChannel2::ConfigureReceiverRtp( |
| 1244 webrtc::VideoReceiveStream::Config* config, | 1250 webrtc::VideoReceiveStream::Config* config, |
| 1245 const StreamParams& sp) const { | 1251 const StreamParams& sp) const { |
| 1246 uint32 ssrc = sp.first_ssrc(); | 1252 uint32 ssrc = sp.first_ssrc(); |
| 1247 | 1253 |
| 1248 config->rtp.remote_ssrc = ssrc; | 1254 config->rtp.remote_ssrc = ssrc; |
| 1249 config->rtp.local_ssrc = rtcp_receiver_report_ssrc_; | 1255 config->rtp.local_ssrc = rtcp_receiver_report_ssrc_; |
| 1250 | 1256 |
| 1251 config->rtp.extensions = recv_rtp_extensions_; | 1257 config->rtp.extensions = recv_rtp_extensions_; |
| 1258 config->rtp.rtcp_mode = recv_params_.rtcp.reduced_size |
| 1259 ? webrtc::newapi::kRtcpReducedSize |
| 1260 : webrtc::newapi::kRtcpCompound; |
| 1252 | 1261 |
| 1253 // TODO(pbos): This protection is against setting the same local ssrc as | 1262 // TODO(pbos): This protection is against setting the same local ssrc as |
| 1254 // remote which is not permitted by the lower-level API. RTCP requires a | 1263 // remote which is not permitted by the lower-level API. RTCP requires a |
| 1255 // corresponding sender SSRC. Figure out what to do when we don't have | 1264 // corresponding sender SSRC. Figure out what to do when we don't have |
| 1256 // (receive-only) or know a good local SSRC. | 1265 // (receive-only) or know a good local SSRC. |
| 1257 if (config->rtp.remote_ssrc == config->rtp.local_ssrc) { | 1266 if (config->rtp.remote_ssrc == config->rtp.local_ssrc) { |
| 1258 if (config->rtp.local_ssrc != kDefaultRtcpReceiverReportSsrc) { | 1267 if (config->rtp.local_ssrc != kDefaultRtcpReceiverReportSsrc) { |
| 1259 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc; | 1268 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc; |
| 1260 } else { | 1269 } else { |
| 1261 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc + 1; | 1270 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc + 1; |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1724 } | 1733 } |
| 1725 } | 1734 } |
| 1726 | 1735 |
| 1727 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( | 1736 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( |
| 1728 webrtc::Call* call, | 1737 webrtc::Call* call, |
| 1729 WebRtcVideoEncoderFactory* external_encoder_factory, | 1738 WebRtcVideoEncoderFactory* external_encoder_factory, |
| 1730 const VideoOptions& options, | 1739 const VideoOptions& options, |
| 1731 int max_bitrate_bps, | 1740 int max_bitrate_bps, |
| 1732 const Settable<VideoCodecSettings>& codec_settings, | 1741 const Settable<VideoCodecSettings>& codec_settings, |
| 1733 const StreamParams& sp, | 1742 const StreamParams& sp, |
| 1734 const std::vector<webrtc::RtpExtension>& rtp_extensions) | 1743 const std::vector<webrtc::RtpExtension>& rtp_extensions, |
| 1744 // TODO(pbos): Don't duplicate information between send_params, |
| 1745 // rtp_extensions, options, etc. |
| 1746 const VideoSendParameters& send_params) |
| 1735 : ssrcs_(sp.ssrcs), | 1747 : ssrcs_(sp.ssrcs), |
| 1736 ssrc_groups_(sp.ssrc_groups), | 1748 ssrc_groups_(sp.ssrc_groups), |
| 1737 call_(call), | 1749 call_(call), |
| 1738 external_encoder_factory_(external_encoder_factory), | 1750 external_encoder_factory_(external_encoder_factory), |
| 1739 stream_(NULL), | 1751 stream_(NULL), |
| 1740 parameters_(webrtc::VideoSendStream::Config(), | 1752 parameters_(webrtc::VideoSendStream::Config(), |
| 1741 options, | 1753 options, |
| 1742 max_bitrate_bps, | 1754 max_bitrate_bps, |
| 1743 codec_settings), | 1755 codec_settings), |
| 1744 allocated_encoder_(NULL, webrtc::kVideoCodecUnknown, false), | 1756 allocated_encoder_(NULL, webrtc::kVideoCodecUnknown, false), |
| 1745 capturer_(NULL), | 1757 capturer_(NULL), |
| 1746 sending_(false), | 1758 sending_(false), |
| 1747 muted_(false), | 1759 muted_(false), |
| 1748 old_adapt_changes_(0), | 1760 old_adapt_changes_(0), |
| 1749 first_frame_timestamp_ms_(0), | 1761 first_frame_timestamp_ms_(0), |
| 1750 last_frame_timestamp_ms_(0) { | 1762 last_frame_timestamp_ms_(0) { |
| 1751 parameters_.config.rtp.max_packet_size = kVideoMtu; | 1763 parameters_.config.rtp.max_packet_size = kVideoMtu; |
| 1752 | 1764 |
| 1753 sp.GetPrimarySsrcs(¶meters_.config.rtp.ssrcs); | 1765 sp.GetPrimarySsrcs(¶meters_.config.rtp.ssrcs); |
| 1754 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, | 1766 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, |
| 1755 ¶meters_.config.rtp.rtx.ssrcs); | 1767 ¶meters_.config.rtp.rtx.ssrcs); |
| 1756 parameters_.config.rtp.c_name = sp.cname; | 1768 parameters_.config.rtp.c_name = sp.cname; |
| 1757 parameters_.config.rtp.extensions = rtp_extensions; | 1769 parameters_.config.rtp.extensions = rtp_extensions; |
| 1770 // TODO(pbos): Add this to send stream when we support it. |
| 1771 // parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size ? |
| 1772 // webrtc::newapi::kRtcpReducedSize : webrtc::newapi::kRtcpCompound; |
| 1758 | 1773 |
| 1759 VideoCodecSettings params; | 1774 VideoCodecSettings params; |
| 1760 if (codec_settings.Get(¶ms)) { | 1775 if (codec_settings.Get(¶ms)) { |
| 1761 SetCodec(params); | 1776 SetCodec(params); |
| 1762 } | 1777 } |
| 1763 } | 1778 } |
| 1764 | 1779 |
| 1765 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { | 1780 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { |
| 1766 DisconnectCapturer(); | 1781 DisconnectCapturer(); |
| 1767 if (stream_ != NULL) { | 1782 if (stream_ != NULL) { |
| (...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2722 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; | 2737 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; |
| 2723 } | 2738 } |
| 2724 } | 2739 } |
| 2725 | 2740 |
| 2726 return video_codecs; | 2741 return video_codecs; |
| 2727 } | 2742 } |
| 2728 | 2743 |
| 2729 } // namespace cricket | 2744 } // namespace cricket |
| 2730 | 2745 |
| 2731 #endif // HAVE_WEBRTC_VIDEO | 2746 #endif // HAVE_WEBRTC_VIDEO |
| OLD | NEW |