Have ViE sender also use the last encoded frame timestamp when determining if the video stream is paused/muted, for purposes of padding.

Without this, external encoders with internal sources (i.e. don't use the normal camera path) won't trigger ViEEncoder::DeliverFrame, so time_of_last_incoming_frame_ms_ will always be 0.

BUG=
R=stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/44099004

Cr-Commit-Position: refs/heads/master@{#9010}
This commit is contained in:
Noah Richards 2015-04-15 09:14:12 -07:00
parent 352b2d7a19
commit 099323e39b
2 changed files with 15 additions and 7 deletions

View File

@ -122,7 +122,7 @@ ViEEncoder::ViEEncoder(int32_t channel_id,
pacer_(pacer),
bitrate_allocator_(bitrate_allocator),
bitrate_controller_(bitrate_controller),
time_of_last_incoming_frame_ms_(0),
time_of_last_frame_activity_ms_(0),
send_padding_(false),
min_transmit_bitrate_kbps_(0),
last_observed_bitrate_bps_(0),
@ -398,7 +398,7 @@ int32_t ViEEncoder::ScaleInputImage(bool enable) {
}
int ViEEncoder::GetPaddingNeededBps(int bitrate_bps) const {
int64_t time_of_last_incoming_frame_ms;
int64_t time_of_last_frame_activity_ms;
int min_transmit_bitrate_bps;
{
CriticalSectionScoped cs(data_cs_.get());
@ -406,7 +406,7 @@ int ViEEncoder::GetPaddingNeededBps(int bitrate_bps) const {
send_padding_ || video_suspended_ || min_transmit_bitrate_kbps_ > 0;
if (!send_padding)
return 0;
time_of_last_incoming_frame_ms = time_of_last_incoming_frame_ms_;
time_of_last_frame_activity_ms = time_of_last_frame_activity_ms_;
min_transmit_bitrate_bps = 1000 * min_transmit_bitrate_kbps_;
}
@ -441,9 +441,9 @@ int ViEEncoder::GetPaddingNeededBps(int bitrate_bps) const {
pad_up_to_bitrate_bps = 0;
// The amount of padding should decay to zero if no frames are being
// captured unless a min-transmit bitrate is used.
// captured/encoded unless a min-transmit bitrate is used.
int64_t now_ms = TickTime::MillisecondTimestamp();
if (now_ms - time_of_last_incoming_frame_ms > kStopPaddingThresholdMs)
if (now_ms - time_of_last_frame_activity_ms > kStopPaddingThresholdMs)
pad_up_to_bitrate_bps = 0;
// Pad up to min bitrate.
@ -508,7 +508,7 @@ void ViEEncoder::DeliverFrame(int id,
}
{
CriticalSectionScoped cs(data_cs_.get());
time_of_last_incoming_frame_ms_ = TickTime::MillisecondTimestamp();
time_of_last_frame_activity_ms_ = TickTime::MillisecondTimestamp();
if (EncoderPaused()) {
TraceFrameDropStart();
return;
@ -712,6 +712,11 @@ int32_t ViEEncoder::SendData(
const RTPVideoHeader* rtp_video_hdr) {
DCHECK(send_payload_router_ != NULL);
{
CriticalSectionScoped cs(data_cs_.get());
time_of_last_frame_activity_ms_ = TickTime::MillisecondTimestamp();
}
{
CriticalSectionScoped cs(callback_cs_.get());
if (send_statistics_proxy_ != NULL)

View File

@ -210,7 +210,10 @@ class ViEEncoder
BitrateAllocator* const bitrate_allocator_;
BitrateController* const bitrate_controller_;
int64_t time_of_last_incoming_frame_ms_ GUARDED_BY(data_cs_);
// The time we last received an input frame or encoded frame. This is used to
// track when video is stopped long enough that we also want to stop sending
// padding.
int64_t time_of_last_frame_activity_ms_ GUARDED_BY(data_cs_);
bool send_padding_ GUARDED_BY(data_cs_);
int min_transmit_bitrate_kbps_ GUARDED_BY(data_cs_);
uint32_t last_observed_bitrate_bps_ GUARDED_BY(data_cs_);