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#ifndef TALK_SESSION_MEDIA_BUNDLEFILTER_H_
29907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org#define TALK_SESSION_MEDIA_BUNDLEFILTER_H_
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
31907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org#include <set>
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector>
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/streamparams.h"
35cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/basictypes.h"
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket {
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// In case of single RTP session and single transport channel, all session
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// ( or media) channels share a common transport channel. Hence they all get
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SignalReadPacket when packet received on transport channel. This requires
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// cricket::BaseChannel to know all the valid sources, else media channel
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// will decode invalid packets.
44907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org//
45907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org// This class determines whether a packet is destined for cricket::BaseChannel.
46907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org// For rtp packets, this is decided based on the payload type. For rtcp packets,
47907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org// this is decided based on the sender ssrc values.
48907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.orgclass BundleFilter {
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
50907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  BundleFilter();
51907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  ~BundleFilter();
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Determines packet belongs to valid cricket::BaseChannel.
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool DemuxPacket(const char* data, size_t len, bool rtcp);
55907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
56907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  // Adds the supported payload type.
57907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  void AddPayloadType(int payload_type);
58907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Adding a valid source to the filter.
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool AddStream(const StreamParams& stream);
61907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Removes source from the filter.
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool RemoveStream(uint32 ssrc);
64907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
65907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  // Utility methods added for unitest.
66907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  // True if |streams_| is not empty.
67907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  bool HasStreams() const;
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool FindStream(uint32 ssrc) const;
69907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  bool FindPayloadType(int pl_type) const;
70907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  void ClearAllPayloadTypes();
71907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
74907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org  std::set<int> payload_types_;
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<StreamParams> streams_;
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace cricket
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
80907f45cd2b5d7872266db6d855e5de08bed77c75buildbot@webrtc.org#endif  // TALK_SESSION_MEDIA_BUNDLEFILTER_H_
81