Remove expensive and unnecessary memory alloc for sending black frames on video
mute.
Remove old crusty is_black_ member var in webrtcvideoengine which was not adding value.
R=henrike@webrtc.org, tpsiaki@google.com
Review URL: https://webrtc-codereview.appspot.com/26229004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7731 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc
index 1e8c43b..3bcec4d 100644
--- a/talk/media/webrtc/webrtcvideoengine.cc
+++ b/talk/media/webrtc/webrtcvideoengine.cc
@@ -927,15 +927,20 @@
void ProcessFrame(const VideoFrame& original_frame, bool mute,
VideoFrame** processed_frame) {
if (!mute) {
- *processed_frame = original_frame.Copy();
+ *processed_frame = original_frame.Copy(); // Shallow copy.
} else {
- WebRtcVideoFrame* black_frame = new WebRtcVideoFrame();
- black_frame->InitToBlack(static_cast<int>(original_frame.GetWidth()),
- static_cast<int>(original_frame.GetHeight()),
- 1, 1,
- original_frame.GetElapsedTime(),
- original_frame.GetTimeStamp());
- *processed_frame = black_frame;
+ // Cache a black frame of the same dimensions as original_frame.
+ if (black_frame_.GetWidth() != original_frame.GetWidth() ||
+ black_frame_.GetHeight() != original_frame.GetHeight()) {
+ black_frame_.InitToBlack(static_cast<int>(original_frame.GetWidth()),
+ static_cast<int>(original_frame.GetHeight()),
+ 1, 1,
+ original_frame.GetElapsedTime(),
+ original_frame.GetTimeStamp());
+ }
+ *processed_frame = black_frame_.Copy(); // Shallow copy.
+ (*processed_frame)->SetElapsedTime(original_frame.GetElapsedTime());
+ (*processed_frame)->SetTimeStamp(original_frame.GetTimeStamp());
}
local_stream_info_.UpdateFrame(*processed_frame);
}
@@ -979,6 +984,7 @@
VideoFormat adapt_format_;
AdaptFormatType adapt_format_type_;
+ WebRtcVideoFrame black_frame_; // Cached frame for mute.
};
static bool GetCpuOveruseOptions(const VideoOptions& options,
diff --git a/talk/media/webrtc/webrtcvideoframe.cc b/talk/media/webrtc/webrtcvideoframe.cc
index 9986cbe..30d705c 100644
--- a/talk/media/webrtc/webrtcvideoframe.cc
+++ b/talk/media/webrtc/webrtcvideoframe.cc
@@ -106,7 +106,7 @@
}
WebRtcVideoFrame::WebRtcVideoFrame()
- : video_buffer_(new RefCountedBuffer()), is_black_(false) {}
+ : video_buffer_(new RefCountedBuffer()) {}
WebRtcVideoFrame::~WebRtcVideoFrame() {}
@@ -148,10 +148,7 @@
size_t pixel_height, int64 elapsed_time,
int64 time_stamp) {
InitToEmptyBuffer(w, h, pixel_width, pixel_height, elapsed_time, time_stamp);
- if (!is_black_) {
- return SetToBlack();
- }
- return true;
+ return SetToBlack();
}
void WebRtcVideoFrame::Alias(
@@ -261,7 +258,6 @@
if (video_buffer_.get() == video_buffer) {
return;
}
- is_black_ = false;
video_buffer_ = video_buffer;
frame()->SetWidth(w);
frame()->SetHeight(h);
diff --git a/talk/media/webrtc/webrtcvideoframe.h b/talk/media/webrtc/webrtcvideoframe.h
index c492ff1..8b1ae60 100644
--- a/talk/media/webrtc/webrtcvideoframe.h
+++ b/talk/media/webrtc/webrtcvideoframe.h
@@ -121,7 +121,6 @@
int64 elapsed_time, int64 time_stamp);
rtc::scoped_refptr<RefCountedBuffer> video_buffer_;
- bool is_black_;
size_t pixel_width_;
size_t pixel_height_;
int64 elapsed_time_;