| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * libjingle | 2  * libjingle | 
| 3  * Copyright 2004 Google Inc. | 3  * Copyright 2004 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 14 matching lines...) Expand all  Loading... | 
| 25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| 26  */ | 26  */ | 
| 27 | 27 | 
| 28 #include "talk/session/media/bundlefilter.h" | 28 #include "talk/session/media/bundlefilter.h" | 
| 29 | 29 | 
| 30 #include "talk/media/base/rtputils.h" | 30 #include "talk/media/base/rtputils.h" | 
| 31 #include "webrtc/base/logging.h" | 31 #include "webrtc/base/logging.h" | 
| 32 | 32 | 
| 33 namespace cricket { | 33 namespace cricket { | 
| 34 | 34 | 
| 35 static const uint32_t kSsrc01 = 0x01; |  | 
| 36 |  | 
| 37 BundleFilter::BundleFilter() { | 35 BundleFilter::BundleFilter() { | 
| 38 } | 36 } | 
| 39 | 37 | 
| 40 BundleFilter::~BundleFilter() { | 38 BundleFilter::~BundleFilter() { | 
| 41 } | 39 } | 
| 42 | 40 | 
| 43 bool BundleFilter::DemuxPacket(const char* data, size_t len, bool rtcp) { | 41 bool BundleFilter::DemuxPacket(const uint8_t* data, size_t len) { | 
| 44   // For rtp packets, we check whether the payload type can be found. | 42   // For RTP packets, we check whether the payload type can be found. | 
| 45   // For rtcp packets, we check whether the ssrc can be found or is the special | 43   if (!IsRtpPacket(data, len)) { | 
| 46   // value 1 except for SDES packets which always pass through. Plus, if | 44     return false; | 
| 47   // |streams_| is empty, we will allow all rtcp packets pass through provided |  | 
| 48   // that they are valid rtcp packets in case that they are for early media. |  | 
| 49   if (!rtcp) { |  | 
| 50     // It may not be a RTP packet (e.g. SCTP). |  | 
| 51     if (!IsRtpPacket(data, len)) |  | 
| 52       return false; |  | 
| 53 |  | 
| 54     int payload_type = 0; |  | 
| 55     if (!GetRtpPayloadType(data, len, &payload_type)) { |  | 
| 56       return false; |  | 
| 57     } |  | 
| 58     return FindPayloadType(payload_type); |  | 
| 59   } | 45   } | 
| 60 | 46 | 
| 61   // Rtcp packets using ssrc filter. | 47   int payload_type = 0; | 
| 62   int pl_type = 0; | 48   if (!GetRtpPayloadType(data, len, &payload_type)) { | 
| 63   uint32_t ssrc = 0; | 49     return false; | 
| 64   if (!GetRtcpType(data, len, &pl_type)) return false; |  | 
| 65   if (pl_type == kRtcpTypeSDES) { |  | 
| 66     // SDES packet parsing not supported. |  | 
| 67     LOG(LS_INFO) << "SDES packet received for demux."; |  | 
| 68     return true; |  | 
| 69   } else { |  | 
| 70     if (!GetRtcpSsrc(data, len, &ssrc)) return false; |  | 
| 71     if (ssrc == kSsrc01) { |  | 
| 72       // SSRC 1 has a special meaning and indicates generic feedback on |  | 
| 73       // some systems and should never be dropped.  If it is forwarded |  | 
| 74       // incorrectly it will be ignored by lower layers anyway. |  | 
| 75       return true; |  | 
| 76     } |  | 
| 77   } | 50   } | 
| 78   // Pass through if |streams_| is empty to allow early rtcp packets in. | 51   return FindPayloadType(payload_type); | 
| 79   return !HasStreams() || FindStream(ssrc); |  | 
| 80 } | 52 } | 
| 81 | 53 | 
| 82 void BundleFilter::AddPayloadType(int payload_type) { | 54 void BundleFilter::AddPayloadType(int payload_type) { | 
| 83   payload_types_.insert(payload_type); | 55   payload_types_.insert(payload_type); | 
| 84 } | 56 } | 
| 85 | 57 | 
| 86 bool BundleFilter::AddStream(const StreamParams& stream) { |  | 
| 87   if (GetStreamBySsrc(streams_, stream.first_ssrc())) { |  | 
| 88     LOG(LS_WARNING) << "Stream already added to filter"; |  | 
| 89     return false; |  | 
| 90   } |  | 
| 91   streams_.push_back(stream); |  | 
| 92   return true; |  | 
| 93 } |  | 
| 94 |  | 
| 95 bool BundleFilter::RemoveStream(uint32_t ssrc) { |  | 
| 96   return RemoveStreamBySsrc(&streams_, ssrc); |  | 
| 97 } |  | 
| 98 |  | 
| 99 bool BundleFilter::HasStreams() const { |  | 
| 100   return !streams_.empty(); |  | 
| 101 } |  | 
| 102 |  | 
| 103 bool BundleFilter::FindStream(uint32_t ssrc) const { |  | 
| 104   return ssrc == 0 ? false : GetStreamBySsrc(streams_, ssrc) != nullptr; |  | 
| 105 } |  | 
| 106 |  | 
| 107 bool BundleFilter::FindPayloadType(int pl_type) const { | 58 bool BundleFilter::FindPayloadType(int pl_type) const { | 
| 108   return payload_types_.find(pl_type) != payload_types_.end(); | 59   return payload_types_.find(pl_type) != payload_types_.end(); | 
| 109 } | 60 } | 
| 110 | 61 | 
| 111 void BundleFilter::ClearAllPayloadTypes() { | 62 void BundleFilter::ClearAllPayloadTypes() { | 
| 112   payload_types_.clear(); | 63   payload_types_.clear(); | 
| 113 } | 64 } | 
| 114 | 65 | 
| 115 }  // namespace cricket | 66 }  // namespace cricket | 
| OLD | NEW | 
|---|