Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(528)

Unified Diff: webrtc/modules/audio_coding/codecs/audio_decoder.cc

Issue 2326003002: Moved codec-specific audio packet splitting into decoders. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/audio_coding/codecs/audio_decoder.cc
diff --git a/webrtc/modules/audio_coding/codecs/audio_decoder.cc b/webrtc/modules/audio_coding/codecs/audio_decoder.cc
index 468af72894357ef75559add84781a3b522e117cf..86fb991db8f3225981db95ddb4f64a7db770d830 100644
--- a/webrtc/modules/audio_coding/codecs/audio_decoder.cc
+++ b/webrtc/modules/audio_coding/codecs/audio_decoder.cc
@@ -23,11 +23,11 @@ namespace {
class LegacyFrame : public AudioDecoder::Frame {
public:
LegacyFrame(AudioDecoder* decoder,
- rtc::Buffer* payload,
+ rtc::Buffer&& payload,
bool is_primary_payload)
: decoder_(decoder), is_primary_payload_(is_primary_payload) {
using std::swap;
- swap(this->payload_, *payload);
+ swap(this->payload_, payload);
}
size_t Duration() const override {
@@ -85,9 +85,29 @@ std::vector<AudioDecoder::ParseResult> AudioDecoder::ParsePayload(
uint32_t timestamp,
bool is_primary) {
std::vector<ParseResult> results;
- std::unique_ptr<Frame> frame(
- new LegacyFrame(this, payload, is_primary));
- results.emplace_back(timestamp, is_primary, std::move(frame));
+ std::vector<PacketSplit> splits = SplitPacket(*payload);
+
+ // Just take the payload if we don't have to split.
+ if (splits.size() == 1 &&
+ splits[0].byte_offset == 0 &&
+ splits[0].num_bytes == payload->size() &&
+ splits[0].timestamp_offset == 0) {
+ std::unique_ptr<Frame> frame(
+ new LegacyFrame(this, std::move(*payload), is_primary));
+ results.emplace_back(timestamp + splits[0].timestamp_offset, is_primary,
+ std::move(frame));
+ } else {
+ for (const auto& split : splits) {
+ 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.
+ rtc::Buffer new_payload(payload->data() + split.byte_offset,
+ split.num_bytes);
+ std::unique_ptr<Frame> frame(
+ new LegacyFrame(this, std::move(new_payload), is_primary));
+ results.emplace_back(timestamp + split.timestamp_offset, is_primary,
+ std::move(frame));
+ }
+ }
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
+
return results;
}
@@ -141,6 +161,11 @@ int AudioDecoder::IncomingPacket(const uint8_t* payload,
return 0;
}
+std::vector<AudioDecoder::PacketSplit> AudioDecoder::SplitPacket(
+ rtc::ArrayView<const uint8_t> payload) const {
+ return {PacketSplit{0, payload.size(), 0}};
+}
+
int AudioDecoder::ErrorCode() { return 0; }
int AudioDecoder::PacketDuration(const uint8_t* encoded,

Powered by Google App Engine
This is Rietveld 408576698