| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * libjingle | |
| 3 * Copyright 2004 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 #ifndef TALK_MEDIA_BASE_CODEC_H_ | |
| 29 #define TALK_MEDIA_BASE_CODEC_H_ | |
| 30 | |
| 31 #include <map> | |
| 32 #include <set> | |
| 33 #include <string> | |
| 34 #include <vector> | |
| 35 | |
| 36 #include "talk/media/base/constants.h" | |
| 37 | |
| 38 namespace cricket { | |
| 39 | |
| 40 typedef std::map<std::string, std::string> CodecParameterMap; | |
| 41 | |
| 42 extern const int kMaxPayloadId; | |
| 43 | |
| 44 class FeedbackParam { | |
| 45 public: | |
| 46 FeedbackParam(const std::string& id, const std::string& param) | |
| 47 : id_(id), | |
| 48 param_(param) { | |
| 49 } | |
| 50 explicit FeedbackParam(const std::string& id) | |
| 51 : id_(id), | |
| 52 param_(kParamValueEmpty) { | |
| 53 } | |
| 54 bool operator==(const FeedbackParam& other) const; | |
| 55 | |
| 56 const std::string& id() const { return id_; } | |
| 57 const std::string& param() const { return param_; } | |
| 58 | |
| 59 private: | |
| 60 std::string id_; // e.g. "nack", "ccm" | |
| 61 std::string param_; // e.g. "", "rpsi", "fir" | |
| 62 }; | |
| 63 | |
| 64 class FeedbackParams { | |
| 65 public: | |
| 66 bool operator==(const FeedbackParams& other) const; | |
| 67 | |
| 68 bool Has(const FeedbackParam& param) const; | |
| 69 void Add(const FeedbackParam& param); | |
| 70 | |
| 71 void Intersect(const FeedbackParams& from); | |
| 72 | |
| 73 const std::vector<FeedbackParam>& params() const { return params_; } | |
| 74 private: | |
| 75 bool HasDuplicateEntries() const; | |
| 76 | |
| 77 std::vector<FeedbackParam> params_; | |
| 78 }; | |
| 79 | |
| 80 struct Codec { | |
| 81 int id; | |
| 82 std::string name; | |
| 83 int clockrate; | |
| 84 int preference; | |
| 85 CodecParameterMap params; | |
| 86 FeedbackParams feedback_params; | |
| 87 | |
| 88 // Creates a codec with the given parameters. | |
| 89 Codec(int id, const std::string& name, int clockrate, int preference); | |
| 90 // Creates an empty codec. | |
| 91 Codec(); | |
| 92 Codec(const Codec& c); | |
| 93 ~Codec(); | |
| 94 | |
| 95 // Indicates if this codec is compatible with the specified codec. | |
| 96 bool Matches(const Codec& codec) const; | |
| 97 | |
| 98 // Find the parameter for |name| and write the value to |out|. | |
| 99 bool GetParam(const std::string& name, std::string* out) const; | |
| 100 bool GetParam(const std::string& name, int* out) const; | |
| 101 | |
| 102 void SetParam(const std::string& name, const std::string& value); | |
| 103 void SetParam(const std::string& name, int value); | |
| 104 | |
| 105 // It is safe to input a non-existent parameter. | |
| 106 // Returns true if the parameter existed, false if it did not exist. | |
| 107 bool RemoveParam(const std::string& name); | |
| 108 | |
| 109 bool HasFeedbackParam(const FeedbackParam& param) const; | |
| 110 void AddFeedbackParam(const FeedbackParam& param); | |
| 111 | |
| 112 static bool Preferable(const Codec& first, const Codec& other) { | |
| 113 return first.preference > other.preference; | |
| 114 } | |
| 115 | |
| 116 // Filter |this| feedbacks params such that only those shared by both |this| | |
| 117 // and |other| are kept. | |
| 118 void IntersectFeedbackParams(const Codec& other); | |
| 119 | |
| 120 Codec& operator=(const Codec& c); | |
| 121 | |
| 122 bool operator==(const Codec& c) const; | |
| 123 | |
| 124 bool operator!=(const Codec& c) const { | |
| 125 return !(*this == c); | |
| 126 } | |
| 127 }; | |
| 128 | |
| 129 struct AudioCodec : public Codec { | |
| 130 int bitrate; | |
| 131 size_t channels; | |
| 132 | |
| 133 // Creates a codec with the given parameters. | |
| 134 AudioCodec(int id, | |
| 135 const std::string& name, | |
| 136 int clockrate, | |
| 137 int bitrate, | |
| 138 size_t channels, | |
| 139 int preference); | |
| 140 // Creates an empty codec. | |
| 141 AudioCodec(); | |
| 142 AudioCodec(const AudioCodec& c); | |
| 143 ~AudioCodec() = default; | |
| 144 | |
| 145 // Indicates if this codec is compatible with the specified codec. | |
| 146 bool Matches(const AudioCodec& codec) const; | |
| 147 | |
| 148 static bool Preferable(const AudioCodec& first, const AudioCodec& other) { | |
| 149 return first.preference > other.preference; | |
| 150 } | |
| 151 | |
| 152 std::string ToString() const; | |
| 153 | |
| 154 AudioCodec& operator=(const AudioCodec& c); | |
| 155 | |
| 156 bool operator==(const AudioCodec& c) const; | |
| 157 | |
| 158 bool operator!=(const AudioCodec& c) const { | |
| 159 return !(*this == c); | |
| 160 } | |
| 161 }; | |
| 162 | |
| 163 struct VideoCodec : public Codec { | |
| 164 int width; | |
| 165 int height; | |
| 166 int framerate; | |
| 167 | |
| 168 // Creates a codec with the given parameters. | |
| 169 VideoCodec(int id, | |
| 170 const std::string& name, | |
| 171 int width, | |
| 172 int height, | |
| 173 int framerate, | |
| 174 int preference); | |
| 175 VideoCodec(int id, const std::string& name); | |
| 176 // Creates an empty codec. | |
| 177 VideoCodec(); | |
| 178 VideoCodec(const VideoCodec& c); | |
| 179 ~VideoCodec() = default; | |
| 180 | |
| 181 static bool Preferable(const VideoCodec& first, const VideoCodec& other) { | |
| 182 return first.preference > other.preference; | |
| 183 } | |
| 184 | |
| 185 std::string ToString() const; | |
| 186 | |
| 187 VideoCodec& operator=(const VideoCodec& c); | |
| 188 | |
| 189 bool operator==(const VideoCodec& c) const; | |
| 190 | |
| 191 bool operator!=(const VideoCodec& c) const { | |
| 192 return !(*this == c); | |
| 193 } | |
| 194 | |
| 195 static VideoCodec CreateRtxCodec(int rtx_payload_type, | |
| 196 int associated_payload_type); | |
| 197 | |
| 198 enum CodecType { | |
| 199 CODEC_VIDEO, | |
| 200 CODEC_RED, | |
| 201 CODEC_ULPFEC, | |
| 202 CODEC_RTX, | |
| 203 }; | |
| 204 | |
| 205 CodecType GetCodecType() const; | |
| 206 // Validates a VideoCodec's payload type, dimensions and bitrates etc. If they | |
| 207 // don't make sense (such as max < min bitrate), and error is logged and | |
| 208 // ValidateCodecFormat returns false. | |
| 209 bool ValidateCodecFormat() const; | |
| 210 }; | |
| 211 | |
| 212 struct DataCodec : public Codec { | |
| 213 DataCodec(int id, const std::string& name, int preference); | |
| 214 DataCodec(); | |
| 215 DataCodec(const DataCodec& c); | |
| 216 | |
| 217 DataCodec& operator=(const DataCodec& c); | |
| 218 | |
| 219 std::string ToString() const; | |
| 220 }; | |
| 221 | |
| 222 // Get the codec setting associated with |payload_type|. If there | |
| 223 // is no codec associated with that payload type it returns false. | |
| 224 template <class Codec> | |
| 225 bool FindCodecById(const std::vector<Codec>& codecs, | |
| 226 int payload_type, | |
| 227 Codec* codec_out) { | |
| 228 for (const auto& codec : codecs) { | |
| 229 if (codec.id == payload_type) { | |
| 230 *codec_out = codec; | |
| 231 return true; | |
| 232 } | |
| 233 } | |
| 234 return false; | |
| 235 } | |
| 236 | |
| 237 bool CodecNamesEq(const std::string& name1, const std::string& name2); | |
| 238 bool HasNack(const VideoCodec& codec); | |
| 239 bool HasRemb(const VideoCodec& codec); | |
| 240 bool HasTransportCc(const VideoCodec& codec); | |
| 241 | |
| 242 } // namespace cricket | |
| 243 | |
| 244 #endif // TALK_MEDIA_BASE_CODEC_H_ | |
| OLD | NEW |