Expose VideoCodingModule's decoder stats up the stack from VCMTiming to chrome://webrtc-internals.

R=juberti@google.com, mikhal@webrtc.org, stefan@webrtc.org, wu@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5027 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
fischman@webrtc.org
2013-10-23 23:59:45 +00:00
parent d371a29227
commit 37bb4974e7
13 changed files with 189 additions and 10 deletions

View File

@ -36,6 +36,7 @@ VCMTiming::VCMTiming(Clock* clock,
min_playout_delay_ms_(0),
jitter_delay_ms_(0),
current_delay_ms_(0),
last_decode_ms_(0),
prev_frame_timestamp_(0) {
if (master_timing == NULL) {
master_ = true;
@ -158,7 +159,7 @@ int32_t VCMTiming::StopDecodeTimer(uint32_t time_stamp,
timing_id_), "Codec timer error: %d", time_diff_ms);
assert(false);
}
last_decode_ms_ = time_diff_ms;
if (master_) {
WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding, VCMId(vcm_id_,
timing_id_),
@ -262,4 +263,21 @@ uint32_t VCMTiming::TargetDelayInternal() const {
jitter_delay_ms_ + MaxDecodeTimeMs() + render_delay_ms_);
}
void VCMTiming::GetTimings(int* decode_ms,
int* max_decode_ms,
int* current_delay_ms,
int* target_delay_ms,
int* jitter_buffer_ms,
int* min_playout_delay_ms,
int* render_delay_ms) const {
CriticalSectionScoped cs(crit_sect_);
*decode_ms = last_decode_ms_;
*max_decode_ms = MaxDecodeTimeMs();
*current_delay_ms = current_delay_ms_;
*target_delay_ms = TargetDelayInternal();
*jitter_buffer_ms = jitter_delay_ms_;
*min_playout_delay_ms = min_playout_delay_ms_;
*render_delay_ms = render_delay_ms_;
}
} // namespace webrtc

View File

@ -82,6 +82,15 @@ class VCMTiming {
// certain amount of processing time.
bool EnoughTimeToDecode(uint32_t available_processing_time_ms) const;
// Return current timing information.
void GetTimings(int* decode_ms,
int* max_decode_ms,
int* current_delay_ms,
int* target_delay_ms,
int* jitter_buffer_ms,
int* min_playout_delay_ms,
int* render_delay_ms) const;
enum { kDefaultRenderDelayMs = 10 };
enum { kDelayMaxChangeMsPerS = 100 };
@ -102,6 +111,7 @@ class VCMTiming {
uint32_t min_playout_delay_ms_;
uint32_t jitter_delay_ms_;
uint32_t current_delay_ms_;
int last_decode_ms_;
uint32_t prev_frame_timestamp_;
};
} // namespace webrtc

View File

@ -237,6 +237,11 @@ class VideoCodingModuleImpl : public VideoCodingModule {
return receiver_->RegisterReceiveStatisticsCallback(receiveStats);
}
virtual int32_t RegisterDecoderTimingCallback(
VCMDecoderTimingCallback* decoderTiming) OVERRIDE {
return receiver_->RegisterDecoderTimingCallback(decoderTiming);
}
virtual int32_t RegisterFrameTypeCallback(
VCMFrameTypeCallback* frameTypeCallback) OVERRIDE {
return receiver_->RegisterFrameTypeCallback(frameTypeCallback);

View File

@ -137,6 +137,8 @@ class VideoReceiver {
int32_t RegisterReceiveCallback(VCMReceiveCallback* receiveCallback);
int32_t RegisterReceiveStatisticsCallback(
VCMReceiveStatisticsCallback* receiveStats);
int32_t RegisterDecoderTimingCallback(
VCMDecoderTimingCallback* decoderTiming);
int32_t RegisterFrameTypeCallback(VCMFrameTypeCallback* frameTypeCallback);
int32_t RegisterPacketRequestCallback(VCMPacketRequestCallback* callback);
int RegisterRenderBufferSizeCallback(VCMRenderBufferSizeCallback* callback);
@ -200,6 +202,7 @@ class VideoReceiver {
VCMDecodedFrameCallback _dualDecodedFrameCallback;
VCMFrameTypeCallback* _frameTypeCallback;
VCMReceiveStatisticsCallback* _receiveStatsCallback;
VCMDecoderTimingCallback* _decoderTimingCallback;
VCMPacketRequestCallback* _packetRequestCallback;
VCMRenderBufferSizeCallback* render_buffer_callback_;
VCMGenericDecoder* _decoder;

View File

@ -40,6 +40,7 @@ VideoReceiver::VideoReceiver(const int32_t id,
_dualDecodedFrameCallback(_dualTiming, clock_),
_frameTypeCallback(NULL),
_receiveStatsCallback(NULL),
_decoderTimingCallback(NULL),
_packetRequestCallback(NULL),
render_buffer_callback_(NULL),
_decoder(NULL),
@ -85,6 +86,30 @@ int32_t VideoReceiver::Process() {
_receiveStatsCallback->OnReceiveStatisticsUpdate(bitRate, frameRate);
}
if (_decoderTimingCallback != NULL) {
int decode_ms;
int max_decode_ms;
int current_delay_ms;
int target_delay_ms;
int jitter_buffer_ms;
int min_playout_delay_ms;
int render_delay_ms;
_timing.GetTimings(&decode_ms,
&max_decode_ms,
&current_delay_ms,
&target_delay_ms,
&jitter_buffer_ms,
&min_playout_delay_ms,
&render_delay_ms);
_decoderTimingCallback->OnDecoderTiming(decode_ms,
max_decode_ms,
current_delay_ms,
target_delay_ms,
jitter_buffer_ms,
min_playout_delay_ms,
render_delay_ms);
}
// Size of render buffer.
if (render_buffer_callback_) {
int buffer_size_ms = _receiver.RenderBufferSizeMs();
@ -255,6 +280,7 @@ int32_t VideoReceiver::InitializeReceiver() {
_receiverInited = true;
_frameTypeCallback = NULL;
_receiveStatsCallback = NULL;
_decoderTimingCallback = NULL;
_packetRequestCallback = NULL;
_keyRequestMode = kKeyOnError;
_scheduleKeyRequest = false;
@ -278,6 +304,13 @@ int32_t VideoReceiver::RegisterReceiveStatisticsCallback(
return VCM_OK;
}
int32_t VideoReceiver::RegisterDecoderTimingCallback(
VCMDecoderTimingCallback* decoderTiming) {
CriticalSectionScoped cs(process_crit_sect_.get());
_decoderTimingCallback = decoderTiming;
return VCM_OK;
}
// Register an externally defined decoder/render object.
// Can be a decoder only or a decoder coupled with a renderer.
int32_t VideoReceiver::RegisterExternalDecoder(VideoDecoder* externalDecoder,