Index: webrtc/common_video/incoming_video_stream.cc |
diff --git a/webrtc/common_video/incoming_video_stream.cc b/webrtc/common_video/incoming_video_stream.cc |
index 79bbb8a7b67732e9226f4740f0d73d6cfb0a2d30..a146d93ff71ca62db8b4b8aa17bdf345bd106013 100644 |
--- a/webrtc/common_video/incoming_video_stream.cc |
+++ b/webrtc/common_video/incoming_video_stream.cc |
@@ -22,7 +22,6 @@ |
#endif |
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
-#include "webrtc/common_video/video_render_frames.h" |
#include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
#include "webrtc/system_wrappers/include/event_wrapper.h" |
#include "webrtc/system_wrappers/include/thread_wrapper.h" |
@@ -35,13 +34,9 @@ IncomingVideoStream::IncomingVideoStream(uint32_t stream_id) |
: stream_id_(stream_id), |
stream_critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
thread_critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
- buffer_critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
- incoming_render_thread_(), |
- deliver_buffer_event_(EventTimerWrapper::Create()), |
running_(false), |
external_callback_(nullptr), |
render_callback_(nullptr), |
- render_buffers_(new VideoRenderFrames()), |
incoming_rate_(0), |
last_rate_calculation_time_ms_(0), |
num_frames_since_last_calculation_(0), |
@@ -64,7 +59,6 @@ VideoRenderCallback* IncomingVideoStream::ModuleCallback() { |
int32_t IncomingVideoStream::RenderFrame(const uint32_t stream_id, |
const VideoFrame& video_frame) { |
CriticalSectionScoped csS(stream_critsect_.get()); |
- |
if (!running_) { |
return -1; |
} |
@@ -80,10 +74,33 @@ int32_t IncomingVideoStream::RenderFrame(const uint32_t stream_id, |
last_rate_calculation_time_ms_ = now_ms; |
} |
- // Insert frame. |
- CriticalSectionScoped csB(buffer_critsect_.get()); |
- if (render_buffers_->AddFrame(video_frame) == 1) |
- deliver_buffer_event_->Set(); |
+ CriticalSectionScoped cs(thread_critsect_.get()); |
+ if (video_frame.IsZeroSize()) { |
+ if (render_callback_) { |
+ if (last_render_time_ms_ == 0 && !start_image_.IsZeroSize()) { |
+ // We have not rendered anything and have a start image. |
+ temp_frame_.CopyFrame(start_image_); |
+ render_callback_->RenderFrame(stream_id_, temp_frame_); |
+ } else if (!timeout_image_.IsZeroSize() && |
+ last_render_time_ms_ + timeout_time_ < |
+ TickTime::MillisecondTimestamp()) { |
+ // Render a timeout image. |
+ temp_frame_.CopyFrame(timeout_image_); |
+ render_callback_->RenderFrame(stream_id_, temp_frame_); |
+ } |
+ } |
+ |
+ // No frame. |
+ return 0; |
+ } |
+ |
+ // Send frame for rendering. |
+ if (external_callback_) { |
+ external_callback_->RenderFrame(stream_id_, video_frame); |
+ } else if (render_callback_) { |
+ render_callback_->RenderFrame(stream_id_, video_frame); |
+ } |
+ last_render_time_ms_ = video_frame.render_time_ms(); |
return 0; |
} |
@@ -112,8 +129,7 @@ int32_t IncomingVideoStream::SetExpectedRenderDelay( |
if (running_) { |
return -1; |
} |
- CriticalSectionScoped cs(buffer_critsect_.get()); |
- return render_buffers_->SetRenderDelay(delay_ms); |
+ return 0; |
} |
void IncomingVideoStream::SetExternalCallback( |
@@ -124,64 +140,17 @@ void IncomingVideoStream::SetExternalCallback( |
int32_t IncomingVideoStream::Start() { |
CriticalSectionScoped csS(stream_critsect_.get()); |
- if (running_) { |
- return 0; |
- } |
- |
- CriticalSectionScoped csT(thread_critsect_.get()); |
- assert(incoming_render_thread_ == NULL); |
- |
- incoming_render_thread_ = ThreadWrapper::CreateThread( |
- IncomingVideoStreamThreadFun, this, "IncomingVideoStreamThread"); |
- if (!incoming_render_thread_) { |
- return -1; |
- } |
- |
- if (incoming_render_thread_->Start()) { |
- } else { |
- return -1; |
- } |
- incoming_render_thread_->SetPriority(kRealtimePriority); |
- deliver_buffer_event_->StartTimer(false, kEventStartupTimeMs); |
- |
running_ = true; |
return 0; |
} |
int32_t IncomingVideoStream::Stop() { |
CriticalSectionScoped cs_stream(stream_critsect_.get()); |
- |
- if (!running_) { |
- return 0; |
- } |
- |
- ThreadWrapper* thread = NULL; |
- { |
- CriticalSectionScoped cs_thread(thread_critsect_.get()); |
- if (incoming_render_thread_) { |
- // Setting the incoming render thread to NULL marks that we're performing |
- // a shutdown and will make IncomingVideoStreamProcess abort after wakeup. |
- thread = incoming_render_thread_.release(); |
- deliver_buffer_event_->StopTimer(); |
- // Set the event to allow the thread to wake up and shut down without |
- // waiting for a timeout. |
- deliver_buffer_event_->Set(); |
- } |
- } |
- if (thread) { |
- if (thread->Stop()) { |
- delete thread; |
- } else { |
- assert(false); |
- } |
- } |
running_ = false; |
return 0; |
} |
int32_t IncomingVideoStream::Reset() { |
- CriticalSectionScoped cs_buffer(buffer_critsect_.get()); |
- render_buffers_->ReleaseAllFrames(); |
return 0; |
} |
@@ -194,63 +163,4 @@ uint32_t IncomingVideoStream::IncomingRate() const { |
return incoming_rate_; |
} |
-bool IncomingVideoStream::IncomingVideoStreamThreadFun(void* obj) { |
- return static_cast<IncomingVideoStream*>(obj)->IncomingVideoStreamProcess(); |
-} |
- |
-bool IncomingVideoStream::IncomingVideoStreamProcess() { |
- if (kEventError != deliver_buffer_event_->Wait(kEventMaxWaitTimeMs)) { |
- CriticalSectionScoped cs(thread_critsect_.get()); |
- if (incoming_render_thread_ == NULL) { |
- // Terminating |
- return false; |
- } |
- // Get a new frame to render and the time for the frame after this one. |
- VideoFrame frame_to_render; |
- uint32_t wait_time; |
- { |
- CriticalSectionScoped cs(buffer_critsect_.get()); |
- frame_to_render = render_buffers_->FrameToRender(); |
- wait_time = render_buffers_->TimeToNextFrameRelease(); |
- } |
- |
- // Set timer for next frame to render. |
- if (wait_time > kEventMaxWaitTimeMs) { |
- wait_time = kEventMaxWaitTimeMs; |
- } |
- deliver_buffer_event_->StartTimer(false, wait_time); |
- |
- if (frame_to_render.IsZeroSize()) { |
- if (render_callback_) { |
- if (last_render_time_ms_ == 0 && !start_image_.IsZeroSize()) { |
- // We have not rendered anything and have a start image. |
- temp_frame_.CopyFrame(start_image_); |
- render_callback_->RenderFrame(stream_id_, temp_frame_); |
- } else if (!timeout_image_.IsZeroSize() && |
- last_render_time_ms_ + timeout_time_ < |
- TickTime::MillisecondTimestamp()) { |
- // Render a timeout image. |
- temp_frame_.CopyFrame(timeout_image_); |
- render_callback_->RenderFrame(stream_id_, temp_frame_); |
- } |
- } |
- |
- // No frame. |
- return true; |
- } |
- |
- // Send frame for rendering. |
- if (external_callback_) { |
- external_callback_->RenderFrame(stream_id_, frame_to_render); |
- } else if (render_callback_) { |
- render_callback_->RenderFrame(stream_id_, frame_to_render); |
- } |
- |
- // We're done with this frame. |
- if (!frame_to_render.IsZeroSize()) |
- last_render_time_ms_ = frame_to_render.render_time_ms(); |
- } |
- return true; |
-} |
- |
} // namespace webrtc |