Move src/ -> webrtc/
TBR=niklas.enbom@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/915006
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@2963 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/video_engine/vie_renderer.cc b/video_engine/vie_renderer.cc
new file mode 100644
index 0000000..588f8f6
--- /dev/null
+++ b/video_engine/vie_renderer.cc
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "video_engine/vie_renderer.h"
+
+#include "common_video/libyuv/include/webrtc_libyuv.h"
+#include "modules/video_render/main/interface/video_render.h"
+#include "modules/video_render/main/interface/video_render_defines.h"
+#include "video_engine/vie_render_manager.h"
+
+namespace webrtc {
+
+ViERenderer* ViERenderer::CreateViERenderer(const WebRtc_Word32 render_id,
+ const WebRtc_Word32 engine_id,
+ VideoRender& render_module,
+ ViERenderManager& render_manager,
+ const WebRtc_UWord32 z_order,
+ const float left,
+ const float top,
+ const float right,
+ const float bottom) {
+ ViERenderer* self = new ViERenderer(render_id, engine_id, render_module,
+ render_manager);
+ if (!self || self->Init(z_order, left, top, right, bottom) != 0) {
+ delete self;
+ self = NULL;
+ }
+ return self;
+}
+
+ViERenderer::~ViERenderer(void) {
+ if (render_callback_)
+ render_module_.DeleteIncomingRenderStream(render_id_);
+
+ if (incoming_external_callback_)
+ delete incoming_external_callback_;
+}
+
+WebRtc_Word32 ViERenderer::StartRender() {
+ return render_module_.StartRender(render_id_);
+}
+WebRtc_Word32 ViERenderer::StopRender() {
+ return render_module_.StopRender(render_id_);
+}
+
+WebRtc_Word32 ViERenderer::GetLastRenderedFrame(const WebRtc_Word32 renderID,
+ VideoFrame& video_frame) {
+ return render_module_.GetLastRenderedFrame(renderID, video_frame);
+}
+
+int ViERenderer::SetExpectedRenderDelay(int render_delay) {
+ return render_module_.SetExpectedRenderDelay(render_id_, render_delay);
+}
+
+WebRtc_Word32 ViERenderer::ConfigureRenderer(const unsigned int z_order,
+ const float left,
+ const float top,
+ const float right,
+ const float bottom) {
+ return render_module_.ConfigureRenderer(render_id_, z_order, left, top, right,
+ bottom);
+}
+
+VideoRender& ViERenderer::RenderModule() {
+ return render_module_;
+}
+
+WebRtc_Word32 ViERenderer::EnableMirroring(const WebRtc_Word32 render_id,
+ const bool enable,
+ const bool mirror_xaxis,
+ const bool mirror_yaxis) {
+ return render_module_.MirrorRenderStream(render_id, enable, mirror_xaxis,
+ mirror_yaxis);
+}
+
+WebRtc_Word32 ViERenderer::SetTimeoutImage(const VideoFrame& timeout_image,
+ const WebRtc_Word32 timeout_value) {
+ return render_module_.SetTimeoutImage(render_id_, timeout_image,
+ timeout_value);
+}
+
+WebRtc_Word32 ViERenderer::SetRenderStartImage(const VideoFrame& start_image) {
+ return render_module_.SetStartImage(render_id_, start_image);
+}
+
+WebRtc_Word32 ViERenderer::SetExternalRenderer(
+ const WebRtc_Word32 render_id,
+ RawVideoType video_input_format,
+ ExternalRenderer* external_renderer) {
+ if (!incoming_external_callback_)
+ return -1;
+
+ incoming_external_callback_->SetViEExternalRenderer(external_renderer,
+ video_input_format);
+ return render_module_.AddExternalRenderCallback(render_id,
+ incoming_external_callback_);
+}
+
+ViERenderer::ViERenderer(const WebRtc_Word32 render_id,
+ const WebRtc_Word32 engine_id,
+ VideoRender& render_module,
+ ViERenderManager& render_manager)
+ : render_id_(render_id),
+ render_module_(render_module),
+ render_manager_(render_manager),
+ render_callback_(NULL),
+ incoming_external_callback_(new ViEExternalRendererImpl()) {
+}
+
+WebRtc_Word32 ViERenderer::Init(const WebRtc_UWord32 z_order,
+ const float left,
+ const float top,
+ const float right,
+ const float bottom) {
+ render_callback_ =
+ static_cast<VideoRenderCallback*>(render_module_.AddIncomingRenderStream(
+ render_id_, z_order, left, top, right, bottom));
+ if (!render_callback_) {
+ // Logging done.
+ return -1;
+ }
+ return 0;
+}
+
+void ViERenderer::DeliverFrame(int id,
+ VideoFrame* video_frame,
+ int num_csrcs,
+ const WebRtc_UWord32 CSRC[kRtpCsrcSize]) {
+ render_callback_->RenderFrame(render_id_, *video_frame);
+}
+
+void ViERenderer::DelayChanged(int id, int frame_delay) {}
+
+int ViERenderer::GetPreferedFrameSettings(int* width,
+ int* height,
+ int* frame_rate) {
+ return -1;
+}
+
+void ViERenderer::ProviderDestroyed(int id) {
+ // Remove the render stream since the provider is destroyed.
+ render_manager_.RemoveRenderStream(render_id_);
+}
+
+ViEExternalRendererImpl::ViEExternalRendererImpl()
+ : external_renderer_(NULL),
+ external_renderer_format_(kVideoUnknown),
+ external_renderer_width_(0),
+ external_renderer_height_(0),
+ converted_frame_(new VideoFrame()) {
+}
+
+int ViEExternalRendererImpl::SetViEExternalRenderer(
+ ExternalRenderer* external_renderer,
+ RawVideoType video_input_format) {
+ external_renderer_ = external_renderer;
+ external_renderer_format_ = video_input_format;
+ return 0;
+}
+
+WebRtc_Word32 ViEExternalRendererImpl::RenderFrame(
+ const WebRtc_UWord32 stream_id,
+ VideoFrame& video_frame) {
+ VideoFrame* out_frame = converted_frame_.get();
+
+ // Convert to requested format.
+ VideoType type =
+ RawVideoTypeToCommonVideoVideoType(external_renderer_format_);
+ int buffer_size = CalcBufferSize(type, video_frame.Width(),
+ video_frame.Height());
+ if (buffer_size <= 0) {
+ // Unsupported video format.
+ assert(false);
+ return -1;
+ }
+ converted_frame_->VerifyAndAllocate(buffer_size);
+
+ switch (external_renderer_format_) {
+ case kVideoI420:
+ out_frame = &video_frame;
+ break;
+ case kVideoYV12:
+ case kVideoYUY2:
+ case kVideoUYVY:
+ case kVideoARGB:
+ case kVideoRGB24:
+ case kVideoRGB565:
+ case kVideoARGB4444:
+ case kVideoARGB1555 :
+ {
+ ConvertFromI420(video_frame, video_frame.Width(), type, 0,
+ converted_frame_->Buffer());
+ }
+ break;
+ case kVideoIYUV:
+ // no conversion available
+ break;
+ default:
+ assert(false);
+ out_frame = NULL;
+ break;
+ }
+
+ if (external_renderer_width_ != video_frame.Width() ||
+ external_renderer_height_ != video_frame.Height()) {
+ external_renderer_width_ = video_frame.Width();
+ external_renderer_height_ = video_frame.Height();
+ external_renderer_->FrameSizeChange(external_renderer_width_,
+ external_renderer_height_, stream_id);
+ }
+
+ if (out_frame) {
+ external_renderer_->DeliverFrame(out_frame->Buffer(),
+ out_frame->Length(),
+ video_frame.TimeStamp(),
+ video_frame.RenderTimeMs());
+ }
+ return 0;
+}
+
+} // namespace webrtc