Chromium Code Reviews| Index: webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc |
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc b/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc |
| index 3d2aad42a0160170b3e6be6cfe55dc05834bb213..9bbb1d273cc8d7d442e5217cf48ea8ec8287000e 100644 |
| --- a/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc |
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc |
| @@ -16,6 +16,7 @@ |
| #include "webrtc/base/logging.h" |
| #include "webrtc/base/stringutils.h" |
| #include "webrtc/common_types.h" |
| +#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h" |
| #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| namespace webrtc { |
| @@ -119,6 +120,56 @@ RTPPayloadRegistry::RTPPayloadRegistry() |
| RTPPayloadRegistry::~RTPPayloadRegistry() = default; |
| +bool RTPPayloadRegistry::SetAudioReceivePayloads( |
|
the sun
2017/03/14 20:07:01
Like with DecoderDatabase, we should be able to tr
kwiberg-webrtc
2017/03/16 10:24:12
Done.
|
| + std::map<int, SdpAudioFormat> codecs) { |
| + for (const auto& kv : codecs) { |
| + if (!IsPayloadTypeValid(kv.first)) { |
| + return false; |
| + } |
| + } |
| + |
| + // Make sure we have no collisions. |
| + auto existing_it = payload_type_map_.cbegin(); |
| + auto new_it = codecs.cbegin(); |
| + while (existing_it != payload_type_map_.cend() && new_it != codecs.cend()) { |
| + if (existing_it->second.audio) { |
| + ++existing_it; |
| + } else { |
| + if (existing_it->first == new_it->first) { |
| + return false; // Trying to overwrite a video PT with audio. |
|
the sun
2017/03/14 20:07:01
This should never happen, since we have an RTPPayl
kwiberg-webrtc
2017/03/16 10:24:12
Acknowledged. I'll try adding DCHECKs that verify
|
| + } |
| + if (existing_it->first < new_it->first) { |
| + ++existing_it; |
| + } else { |
| + ++new_it; |
| + } |
| + } |
| + } |
| + |
| + // Remove existing audio payload types. |
|
the sun
2017/03/14 20:07:01
This shouldn't be allowed.
kwiberg-webrtc
2017/03/16 10:24:12
In principle, yes. See other comments...
|
| + for (auto it = payload_type_map_.begin(); it != payload_type_map_.end();) { |
| + if (it->second.audio) { |
| + it = payload_type_map_.erase(it); |
| + } else { |
| + ++it; |
| + } |
| + } |
| + |
| + // Insert the new payload types. |
| + for (const auto& kv : codecs) { |
| + const int& rtp_payload_type = kv.first; |
| + const SdpAudioFormat& audio_format = kv.second; |
|
the sun
2017/03/14 20:07:01
I suggest you do this conversion in voe::Channel,
kwiberg-webrtc
2017/03/16 10:24:12
Well, yes... but I'm trying to reduce the use of C
|
| + const CodecInst ci = SdpToCodecInst(rtp_payload_type, audio_format); |
| + payload_type_map_[rtp_payload_type] = CreatePayloadType(ci); |
| + } |
| + |
| + // Clear the value of last received payload type since it might mean |
| + // something else now. |
| + last_received_payload_type_ = -1; |
| + last_received_media_payload_type_ = -1; |
| + return true; |
|
the sun
2017/03/14 20:07:01
If you address the above I don't think we even nee
kwiberg-webrtc
2017/03/16 10:24:12
Acknowledged.
|
| +} |
| + |
| int32_t RTPPayloadRegistry::RegisterReceivePayload(const CodecInst& audio_codec, |
| bool* created_new_payload) { |
| *created_new_payload = false; |