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:
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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,
|
||||
¤t_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,
|
||||
|
||||
Reference in New Issue
Block a user