Home | History | Annotate | Download | only in media
      1 /*
      2  * libjingle
      3  * Copyright 2010 Google Inc.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are met:
      7  *
      8  *  1. Redistributions of source code must retain the above copyright notice,
      9  *     this list of conditions and the following disclaimer.
     10  *  2. Redistributions in binary form must reproduce the above copyright notice,
     11  *     this list of conditions and the following disclaimer in the documentation
     12  *     and/or other materials provided with the distribution.
     13  *  3. The name of the author may not be used to endorse or promote products
     14  *     derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 /*
     29  * A collection of functions and types for serializing and
     30  * deserializing Jingle session messages related to media.
     31  * Specificially, the <notify> and <view> messages.  They are not yet
     32  * standardized, but their current documentation can be found at:
     33  * goto/jinglemuc
     34  */
     35 
     36 #ifndef TALK_SESSION_MEDIA_MEDIAMESSAGES_H_
     37 #define TALK_SESSION_MEDIA_MEDIAMESSAGES_H_
     38 
     39 #include <string>
     40 #include <vector>
     41 
     42 #include "talk/base/basictypes.h"
     43 #include "talk/media/base/mediachannel.h"  // For RtpHeaderExtension
     44 #include "talk/media/base/streamparams.h"
     45 #include "talk/p2p/base/parsing.h"
     46 #include "talk/p2p/base/sessiondescription.h"
     47 
     48 namespace cricket {
     49 
     50 // A collection of audio and video and data streams. Most of the
     51 // methods are merely for convenience. Many of these methods are keyed
     52 // by ssrc, which is the source identifier in the RTP spec
     53 // (http://tools.ietf.org/html/rfc3550).
     54 struct MediaStreams {
     55  public:
     56   MediaStreams() {}
     57   void CopyFrom(const MediaStreams& sources);
     58 
     59   bool empty() const {
     60     return audio_.empty() && video_.empty() && data_.empty();
     61   }
     62 
     63   std::vector<StreamParams>* mutable_audio() { return &audio_; }
     64   std::vector<StreamParams>* mutable_video() { return &video_; }
     65   std::vector<StreamParams>* mutable_data() { return &data_; }
     66   const std::vector<StreamParams>& audio() const { return audio_; }
     67   const std::vector<StreamParams>& video() const { return video_; }
     68   const std::vector<StreamParams>& data() const { return data_; }
     69 
     70   // Gets a stream, returning true if found.
     71   bool GetAudioStream(
     72       const StreamSelector& selector, StreamParams* stream);
     73   bool GetVideoStream(
     74       const StreamSelector& selector, StreamParams* stream);
     75   bool GetDataStream(
     76       const StreamSelector& selector, StreamParams* stream);
     77   // Adds a stream.
     78   void AddAudioStream(const StreamParams& stream);
     79   void AddVideoStream(const StreamParams& stream);
     80   void AddDataStream(const StreamParams& stream);
     81   // Removes a stream, returning true if found and removed.
     82   bool RemoveAudioStream(const StreamSelector& selector);
     83   bool RemoveVideoStream(const StreamSelector& selector);
     84   bool RemoveDataStream(const StreamSelector& selector);
     85 
     86  private:
     87   std::vector<StreamParams> audio_;
     88   std::vector<StreamParams> video_;
     89   std::vector<StreamParams> data_;
     90 
     91   DISALLOW_COPY_AND_ASSIGN(MediaStreams);
     92 };
     93 
     94 // In a <view> message, there are a number of views specified.  This
     95 // represents one such view.  We currently only support "static"
     96 // views.
     97 struct StaticVideoView {
     98   StaticVideoView(const StreamSelector& selector,
     99                   int width, int height, int framerate)
    100       : selector(selector),
    101         width(width),
    102         height(height),
    103         framerate(framerate),
    104         preference(0) {
    105   }
    106 
    107   StreamSelector selector;
    108   int width;
    109   int height;
    110   int framerate;
    111   int preference;
    112 };
    113 
    114 typedef std::vector<StaticVideoView> StaticVideoViews;
    115 
    116 // Represents a whole view request message, which contains many views.
    117 struct ViewRequest {
    118   StaticVideoViews static_video_views;
    119 };
    120 
    121 // If the parent element (usually <jingle>) is a jingle view.
    122 bool IsJingleViewRequest(const buzz::XmlElement* action_elem);
    123 
    124 // Parses a view request from the parent element (usually
    125 // <jingle>). If it fails, it returns false and fills an error
    126 // message.
    127 bool ParseJingleViewRequest(const buzz::XmlElement* action_elem,
    128                             ViewRequest* view_request,
    129                             ParseError* error);
    130 
    131 // Serializes a view request to XML.  If it fails, returns false and
    132 // fills in an error message.
    133 bool WriteJingleViewRequest(const std::string& content_name,
    134                             const ViewRequest& view,
    135                             XmlElements* elems,
    136                             WriteError* error);
    137 
    138 // TODO(pthatcher): Get rid of legacy source notify and replace with
    139 // description-info as soon as reflector is capable of sending it.
    140 bool IsSourcesNotify(const buzz::XmlElement* action_elem);
    141 
    142 // If the given elem has <streams>.
    143 bool HasJingleStreams(const buzz::XmlElement* desc_elem);
    144 
    145 // Parses streams from a jingle <description>.  If it fails, returns
    146 // false and fills an error message.
    147 bool ParseJingleStreams(const buzz::XmlElement* desc_elem,
    148                         std::vector<StreamParams>* streams,
    149                         ParseError* error);
    150 
    151 // Write a <streams> element to the parent_elem.
    152 void WriteJingleStreams(const std::vector<StreamParams>& streams,
    153                         buzz::XmlElement* parent_elem);
    154 
    155 // Parses rtp header extensions from a jingle <description>.  If it
    156 // fails, returns false and fills an error message.
    157 bool ParseJingleRtpHeaderExtensions(
    158     const buzz::XmlElement* desc_elem,
    159     std::vector<RtpHeaderExtension>* hdrexts,
    160     ParseError* error);
    161 
    162 // Writes <rtp-hdrext> elements to the parent_elem.
    163 void WriteJingleRtpHeaderExtensions(
    164     const std::vector<RtpHeaderExtension>& hdrexts,
    165     buzz::XmlElement* parent_elem);
    166 
    167 }  // namespace cricket
    168 
    169 #endif  // TALK_SESSION_MEDIA_MEDIAMESSAGES_H_
    170