kwiberg ee1879ca40 Make an enum class out of NetEqDecoder, and hide the neteq_decoders_ table
This operation was relatively simple, since no one was doing anything
fishy with this enum. A large number of lines had to be changed
because the enum values now live in their own namespace, but this is
arguably worth it since it is now much clearer what sort of constant
they are.

BUG=webrtc:5028

Review URL: https://codereview.webrtc.org/1424083002

Cr-Commit-Position: refs/heads/master@{#10449}
2015-10-29 13:20:33 +00:00

114 lines
3.6 KiB
C++

/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
#include "webrtc/modules/audio_coding/neteq/defines.h"
#include "webrtc/system_wrappers/include/logging.h"
namespace webrtc {
void TimestampScaler::Reset() {
first_packet_received_ = false;
}
void TimestampScaler::ToInternal(Packet* packet) {
if (!packet) {
return;
}
packet->header.timestamp = ToInternal(packet->header.timestamp,
packet->header.payloadType);
}
void TimestampScaler::ToInternal(PacketList* packet_list) {
PacketList::iterator it;
for (it = packet_list->begin(); it != packet_list->end(); ++it) {
ToInternal(*it);
}
}
uint32_t TimestampScaler::ToInternal(uint32_t external_timestamp,
uint8_t rtp_payload_type) {
const DecoderDatabase::DecoderInfo* info =
decoder_database_.GetDecoderInfo(rtp_payload_type);
if (!info) {
// Payload type is unknown. Do not scale.
return external_timestamp;
}
switch (info->codec_type) {
case NetEqDecoder::kDecoderG722:
case NetEqDecoder::kDecoderG722_2ch: {
// Use timestamp scaling with factor 2 (two output samples per RTP
// timestamp).
numerator_ = 2;
denominator_ = 1;
break;
}
case NetEqDecoder::kDecoderCNGswb48kHz: {
// Use timestamp scaling with factor 2/3 (32 kHz sample rate, but RTP
// timestamps run on 48 kHz).
// TODO(tlegrand): Remove scaling for kDecoderCNGswb48kHz once ACM has
// full 48 kHz support.
numerator_ = 2;
denominator_ = 3;
break;
}
case NetEqDecoder::kDecoderAVT:
case NetEqDecoder::kDecoderCNGnb:
case NetEqDecoder::kDecoderCNGwb:
case NetEqDecoder::kDecoderCNGswb32kHz: {
// Do not change the timestamp scaling settings for DTMF or CNG.
break;
}
default: {
// Do not use timestamp scaling for any other codec.
numerator_ = 1;
denominator_ = 1;
break;
}
}
if (!(numerator_ == 1 && denominator_ == 1)) {
// We have a scale factor != 1.
if (!first_packet_received_) {
external_ref_ = external_timestamp;
internal_ref_ = external_timestamp;
first_packet_received_ = true;
}
int32_t external_diff = external_timestamp - external_ref_;
assert(denominator_ > 0); // Should not be possible.
external_ref_ = external_timestamp;
internal_ref_ += (external_diff * numerator_) / denominator_;
LOG(LS_VERBOSE) << "Converting timestamp: " << external_timestamp <<
" -> " << internal_ref_;
return internal_ref_;
} else {
// No scaling.
return external_timestamp;
}
}
uint32_t TimestampScaler::ToExternal(uint32_t internal_timestamp) const {
if (!first_packet_received_ || (numerator_ == 1 && denominator_ == 1)) {
// Not initialized, or scale factor is 1.
return internal_timestamp;
} else {
int32_t internal_diff = internal_timestamp - internal_ref_;
assert(numerator_ > 0); // Should not be possible.
// Do not update references in this method.
// Switch |denominator_| and |numerator_| to convert the other way.
return external_ref_ + (internal_diff * denominator_) / numerator_;
}
}
} // namespace webrtc