Fix the chain that propagates the audio frame's rtp and ntp timestamp including:
* In AudioCodingModuleImpl::PlayoutData10Ms, don't reset the timestamp got from GetAudio. * When there're more than one participant, set AudioFrame's RTP timestamp to 0. * Copy ntp_time_ms_ in AudioFrame::CopyFrom method. * In RemixAndResample, pass src frame's timestamp_ and ntp_time_ms_ to the dst frame. * Fix how |elapsed_time_ms| is computed in channel.cc by adding GetPlayoutFrequency. Tweaks on ntp_time_ms_: * Init ntp_time_ms_ to -1 in AudioFrame ctor. * When there're more than one participant, set AudioFrame's ntp_time_ms_ to an invalid value. I.e. we don't support ntp_time_ms_ in multiple participants case before the mixing is moved to chrome. Added elapsed_time_ms to AudioFrame and pass it to chrome, where we don't have the information about the rtp timestmp's sample rate, i.e. can't convert rtp timestamp to ms. BUG=3111 R=henrik.lundin@webrtc.org, turaj@webrtc.org, xians@webrtc.org TBR=andrew andrew to take another look on audio_conference_mixer_impl.cc Review URL: https://webrtc-codereview.appspot.com/14559004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6346 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@ -228,6 +228,8 @@ class NetEqDecodingTest : public ::testing::Test {
|
||||
|
||||
void DuplicateCng();
|
||||
|
||||
uint32_t PlayoutTimestamp();
|
||||
|
||||
NetEq* neteq_;
|
||||
FILE* rtp_fp_;
|
||||
unsigned int sim_clock_;
|
||||
@ -736,7 +738,7 @@ void NetEqDecodingTest::LongCngWithClockDrift(double drift_factor,
|
||||
}
|
||||
|
||||
EXPECT_EQ(kOutputNormal, type);
|
||||
int32_t delay_before = timestamp - neteq_->PlayoutTimestamp();
|
||||
int32_t delay_before = timestamp - PlayoutTimestamp();
|
||||
|
||||
// Insert CNG for 1 minute (= 60000 ms).
|
||||
const int kCngPeriodMs = 100;
|
||||
@ -829,7 +831,7 @@ void NetEqDecodingTest::LongCngWithClockDrift(double drift_factor,
|
||||
// Check that the speech starts again within reasonable time.
|
||||
double time_until_speech_returns_ms = t_ms - speech_restart_time_ms;
|
||||
EXPECT_LT(time_until_speech_returns_ms, max_time_to_speech_ms);
|
||||
int32_t delay_after = timestamp - neteq_->PlayoutTimestamp();
|
||||
int32_t delay_after = timestamp - PlayoutTimestamp();
|
||||
// Compare delay before and after, and make sure it differs less than 20 ms.
|
||||
EXPECT_LE(delay_after, delay_before + delay_tolerance_ms * 16);
|
||||
EXPECT_GE(delay_after, delay_before - delay_tolerance_ms * 16);
|
||||
@ -1310,7 +1312,7 @@ void NetEqDecodingTest::WrapTest(uint16_t start_seq_no,
|
||||
ASSERT_EQ(1, num_channels);
|
||||
|
||||
// Expect delay (in samples) to be less than 2 packets.
|
||||
EXPECT_LE(timestamp - neteq_->PlayoutTimestamp(),
|
||||
EXPECT_LE(timestamp - PlayoutTimestamp(),
|
||||
static_cast<uint32_t>(kSamples * 2));
|
||||
}
|
||||
// Make sure we have actually tested wrap-around.
|
||||
@ -1391,7 +1393,7 @@ void NetEqDecodingTest::DuplicateCng() {
|
||||
kMaxBlockSize, out_data_, &out_len, &num_channels, &type));
|
||||
ASSERT_EQ(kBlockSize16kHz, out_len);
|
||||
EXPECT_EQ(kOutputCNG, type);
|
||||
EXPECT_EQ(timestamp - algorithmic_delay_samples, neteq_->PlayoutTimestamp());
|
||||
EXPECT_EQ(timestamp - algorithmic_delay_samples, PlayoutTimestamp());
|
||||
|
||||
// Insert the same CNG packet again. Note that at this point it is old, since
|
||||
// we have already decoded the first copy of it.
|
||||
@ -1406,7 +1408,7 @@ void NetEqDecodingTest::DuplicateCng() {
|
||||
ASSERT_EQ(kBlockSize16kHz, out_len);
|
||||
EXPECT_EQ(kOutputCNG, type);
|
||||
EXPECT_EQ(timestamp - algorithmic_delay_samples,
|
||||
neteq_->PlayoutTimestamp());
|
||||
PlayoutTimestamp());
|
||||
}
|
||||
|
||||
// Insert speech again.
|
||||
@ -1422,7 +1424,13 @@ void NetEqDecodingTest::DuplicateCng() {
|
||||
ASSERT_EQ(kBlockSize16kHz, out_len);
|
||||
EXPECT_EQ(kOutputNormal, type);
|
||||
EXPECT_EQ(timestamp + kSamples - algorithmic_delay_samples,
|
||||
neteq_->PlayoutTimestamp());
|
||||
PlayoutTimestamp());
|
||||
}
|
||||
|
||||
uint32_t NetEqDecodingTest::PlayoutTimestamp() {
|
||||
uint32_t playout_timestamp = 0;
|
||||
EXPECT_TRUE(neteq_->GetPlayoutTimestamp(&playout_timestamp));
|
||||
return playout_timestamp;
|
||||
}
|
||||
|
||||
TEST_F(NetEqDecodingTest, DiscardDuplicateCng) { DuplicateCng(); }
|
||||
|
||||
Reference in New Issue
Block a user