Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h" | 11 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h" |
| 12 | 12 |
| 13 #include <assert.h> | 13 #include <assert.h> |
| 14 | 14 |
| 15 #include "webrtc/base/array_view.h" | 15 #include "webrtc/base/array_view.h" |
| 16 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
| 17 #include "webrtc/base/sanitizer.h" | 17 #include "webrtc/base/sanitizer.h" |
| 18 #include "webrtc/base/trace_event.h" | 18 #include "webrtc/base/trace_event.h" |
| 19 | 19 |
| 20 namespace webrtc { | 20 namespace webrtc { |
| 21 | 21 |
| 22 namespace { | 22 namespace { |
| 23 class LegacyFrame : public AudioDecoder::Frame { | 23 class LegacyFrame : public AudioDecoder::Frame { |
| 24 public: | 24 public: |
| 25 LegacyFrame(AudioDecoder* decoder, | 25 LegacyFrame(AudioDecoder* decoder, |
| 26 rtc::Buffer* payload, | 26 rtc::Buffer&& payload, |
| 27 bool is_primary_payload) | 27 bool is_primary_payload) |
| 28 : decoder_(decoder), is_primary_payload_(is_primary_payload) { | 28 : decoder_(decoder), is_primary_payload_(is_primary_payload) { |
| 29 using std::swap; | 29 using std::swap; |
| 30 swap(this->payload_, *payload); | 30 swap(this->payload_, payload); |
| 31 } | 31 } |
| 32 | 32 |
| 33 size_t Duration() const override { | 33 size_t Duration() const override { |
| 34 int ret; | 34 int ret; |
| 35 if (is_primary_payload_) { | 35 if (is_primary_payload_) { |
| 36 ret = decoder_->PacketDuration(payload_.data(), payload_.size()); | 36 ret = decoder_->PacketDuration(payload_.data(), payload_.size()); |
| 37 } else { | 37 } else { |
| 38 ret = decoder_->PacketDurationRedundant(payload_.data(), | 38 ret = decoder_->PacketDurationRedundant(payload_.data(), |
| 39 payload_.size()); | 39 payload_.size()); |
| 40 } | 40 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 78 AudioDecoder::ParseResult::~ParseResult() = default; | 78 AudioDecoder::ParseResult::~ParseResult() = default; |
| 79 | 79 |
| 80 AudioDecoder::ParseResult& AudioDecoder::ParseResult::operator=( | 80 AudioDecoder::ParseResult& AudioDecoder::ParseResult::operator=( |
| 81 ParseResult&& b) = default; | 81 ParseResult&& b) = default; |
| 82 | 82 |
| 83 std::vector<AudioDecoder::ParseResult> AudioDecoder::ParsePayload( | 83 std::vector<AudioDecoder::ParseResult> AudioDecoder::ParsePayload( |
| 84 rtc::Buffer* payload, | 84 rtc::Buffer* payload, |
| 85 uint32_t timestamp, | 85 uint32_t timestamp, |
| 86 bool is_primary) { | 86 bool is_primary) { |
| 87 std::vector<ParseResult> results; | 87 std::vector<ParseResult> results; |
| 88 std::unique_ptr<Frame> frame( | 88 std::vector<PacketSplit> splits = SplitPacket(*payload); |
| 89 new LegacyFrame(this, payload, is_primary)); | 89 |
| 90 results.emplace_back(timestamp, is_primary, std::move(frame)); | 90 // Just take the payload if we don't have to split. |
| 91 if (splits.size() == 1 && | |
| 92 splits[0].byte_offset == 0 && | |
| 93 splits[0].num_bytes == payload->size() && | |
| 94 splits[0].timestamp_offset == 0) { | |
| 95 std::unique_ptr<Frame> frame( | |
| 96 new LegacyFrame(this, std::move(*payload), is_primary)); | |
| 97 results.emplace_back(timestamp + splits[0].timestamp_offset, is_primary, | |
| 98 std::move(frame)); | |
| 99 } else { | |
| 100 for (const auto& split : splits) { | |
| 101 RTC_CHECK(split.byte_offset + split.num_bytes <= payload->size()); | |
|
hlundin-webrtc
2016/09/09 12:52:52
RTC_CHECK_LE
ossu
2016/09/12 11:26:37
Acknowledged.
| |
| 102 rtc::Buffer new_payload(payload->data() + split.byte_offset, | |
| 103 split.num_bytes); | |
| 104 std::unique_ptr<Frame> frame( | |
| 105 new LegacyFrame(this, std::move(new_payload), is_primary)); | |
| 106 results.emplace_back(timestamp + split.timestamp_offset, is_primary, | |
| 107 std::move(frame)); | |
| 108 } | |
| 109 } | |
|
kwiberg-webrtc
2016/09/12 02:11:01
If you processed the pieces in the reverse order,
ossu
2016/09/12 11:26:37
It doesn't really matter which of the packets get
kwiberg-webrtc
2016/09/13 12:23:37
Well, if the first one gets it, you won't have to
| |
| 110 | |
| 91 return results; | 111 return results; |
| 92 } | 112 } |
| 93 | 113 |
| 94 int AudioDecoder::Decode(const uint8_t* encoded, size_t encoded_len, | 114 int AudioDecoder::Decode(const uint8_t* encoded, size_t encoded_len, |
| 95 int sample_rate_hz, size_t max_decoded_bytes, | 115 int sample_rate_hz, size_t max_decoded_bytes, |
| 96 int16_t* decoded, SpeechType* speech_type) { | 116 int16_t* decoded, SpeechType* speech_type) { |
| 97 TRACE_EVENT0("webrtc", "AudioDecoder::Decode"); | 117 TRACE_EVENT0("webrtc", "AudioDecoder::Decode"); |
| 98 rtc::MsanCheckInitialized(rtc::MakeArrayView(encoded, encoded_len)); | 118 rtc::MsanCheckInitialized(rtc::MakeArrayView(encoded, encoded_len)); |
| 99 int duration = PacketDuration(encoded, encoded_len); | 119 int duration = PacketDuration(encoded, encoded_len); |
| 100 if (duration >= 0 && | 120 if (duration >= 0 && |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 134 } | 154 } |
| 135 | 155 |
| 136 int AudioDecoder::IncomingPacket(const uint8_t* payload, | 156 int AudioDecoder::IncomingPacket(const uint8_t* payload, |
| 137 size_t payload_len, | 157 size_t payload_len, |
| 138 uint16_t rtp_sequence_number, | 158 uint16_t rtp_sequence_number, |
| 139 uint32_t rtp_timestamp, | 159 uint32_t rtp_timestamp, |
| 140 uint32_t arrival_timestamp) { | 160 uint32_t arrival_timestamp) { |
| 141 return 0; | 161 return 0; |
| 142 } | 162 } |
| 143 | 163 |
| 164 std::vector<AudioDecoder::PacketSplit> AudioDecoder::SplitPacket( | |
| 165 rtc::ArrayView<const uint8_t> payload) const { | |
| 166 return {PacketSplit{0, payload.size(), 0}}; | |
| 167 } | |
| 168 | |
| 144 int AudioDecoder::ErrorCode() { return 0; } | 169 int AudioDecoder::ErrorCode() { return 0; } |
| 145 | 170 |
| 146 int AudioDecoder::PacketDuration(const uint8_t* encoded, | 171 int AudioDecoder::PacketDuration(const uint8_t* encoded, |
| 147 size_t encoded_len) const { | 172 size_t encoded_len) const { |
| 148 return kNotImplemented; | 173 return kNotImplemented; |
| 149 } | 174 } |
| 150 | 175 |
| 151 int AudioDecoder::PacketDurationRedundant(const uint8_t* encoded, | 176 int AudioDecoder::PacketDurationRedundant(const uint8_t* encoded, |
| 152 size_t encoded_len) const { | 177 size_t encoded_len) const { |
| 153 return kNotImplemented; | 178 return kNotImplemented; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 165 return kSpeech; | 190 return kSpeech; |
| 166 case 2: | 191 case 2: |
| 167 return kComfortNoise; | 192 return kComfortNoise; |
| 168 default: | 193 default: |
| 169 assert(false); | 194 assert(false); |
| 170 return kSpeech; | 195 return kSpeech; |
| 171 } | 196 } |
| 172 } | 197 } |
| 173 | 198 |
| 174 } // namespace webrtc | 199 } // namespace webrtc |
| OLD | NEW |