10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004 Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org#include "talk/session/media/bundlefilter.h" 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/base/logging.h" 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/rtputils.h" 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint32 kSsrc01 = 0x01; 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 37907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgBundleFilter::BundleFilter() { 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 40907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgBundleFilter::~BundleFilter() { 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 43907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgbool BundleFilter::DemuxPacket(const char* data, size_t len, bool rtcp) { 44907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // For rtp packets, we check whether the payload type can be found. 45907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // For rtcp packets, we check whether the ssrc can be found or is the special 46907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // value 1 except for SDES packets which always pass through. Plus, if 47907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // |streams_| is empty, we will allow all rtcp packets pass through provided 48907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // that they are valid rtcp packets in case that they are for early media. 49907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org if (!rtcp) { 50907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org int payload_type = 0; 51907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org if (!GetRtpPayloadType(data, len, &payload_type)) { 52907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org return false; 53907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org } 54907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org return FindPayloadType(payload_type); 55907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org } 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 57907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // Rtcp packets using ssrc filter. 58907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org int pl_type = 0; 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc = 0; 60907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org if (!GetRtcpType(data, len, &pl_type)) return false; 61907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org if (pl_type == kRtcpTypeSDES) { 62907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // SDES packet parsing not supported. 63907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org LOG(LS_INFO) << "SDES packet received for demux."; 64907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org return true; 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 66907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org if (!GetRtcpSsrc(data, len, &ssrc)) return false; 67907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org if (ssrc == kSsrc01) { 68907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // SSRC 1 has a special meaning and indicates generic feedback on 69907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // some systems and should never be dropped. If it is forwarded 70907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // incorrectly it will be ignored by lower layers anyway. 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 74907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org // Pass through if |streams_| is empty to allow early rtcp packets in. 75907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org return !HasStreams() || FindStream(ssrc); 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 78907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgvoid BundleFilter::AddPayloadType(int payload_type) { 79907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org payload_types_.insert(payload_type); 80907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org} 81907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org 82907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgbool BundleFilter::AddStream(const StreamParams& stream) { 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (GetStreamBySsrc(streams_, stream.first_ssrc(), NULL)) { 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_WARNING) << "Stream already added to filter"; 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org streams_.push_back(stream); 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 91907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgbool BundleFilter::RemoveStream(uint32 ssrc) { 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return RemoveStreamBySsrc(&streams_, ssrc); 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 95907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgbool BundleFilter::HasStreams() const { 96907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org return !streams_.empty(); 97907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org} 98907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org 99907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgbool BundleFilter::FindStream(uint32 ssrc) const { 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (ssrc == 0) { 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (GetStreamBySsrc(streams_, ssrc, NULL)); 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 106907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgbool BundleFilter::FindPayloadType(int pl_type) const { 107907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org return payload_types_.find(pl_type) != payload_types_.end(); 108907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org} 109907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org 110907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgvoid BundleFilter::ClearAllPayloadTypes() { 111907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org payload_types_.clear(); 112907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org} 113907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 115