Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(360)

Unified Diff: remoting/client/jni/jni_frame_consumer.cc

Issue 2101833002: [Remoting Android] DisplayUpdaterFactory cleanups (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reviewer's Feedback Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/client/jni/jni_frame_consumer.cc
diff --git a/remoting/client/jni/jni_frame_consumer.cc b/remoting/client/jni/jni_frame_consumer.cc
deleted file mode 100644
index f0f0e5eb000d313dd6e4dcd7c1806eb6fd59e51a..0000000000000000000000000000000000000000
--- a/remoting/client/jni/jni_frame_consumer.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "remoting/client/jni/jni_frame_consumer.h"
-
-#include <stdint.h>
-
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "remoting/base/util.h"
-#include "remoting/client/jni/chromoting_jni_instance.h"
-#include "remoting/client/jni/chromoting_jni_runtime.h"
-#include "remoting/client/jni/jni_client.h"
-#include "remoting/client/jni/jni_display_handler.h"
-#include "remoting/client/software_video_renderer.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
-#include "third_party/webrtc/modules/desktop_capture/desktop_region.h"
-#include "ui/gfx/android/java_bitmap.h"
-
-namespace remoting {
-
-class JniFrameConsumer::Renderer {
- public:
- Renderer(ChromotingJniRuntime* jni_runtime,
- base::WeakPtr<JniDisplayHandler> display)
- : jni_runtime_(jni_runtime), display_handler_(display) {}
- ~Renderer() {
- DCHECK(jni_runtime_->display_task_runner()->BelongsToCurrentThread());
- }
-
- void RenderFrame(std::unique_ptr<webrtc::DesktopFrame> frame);
-
- private:
- // Used to obtain task runner references and make calls to Java methods.
- ChromotingJniRuntime* jni_runtime_;
-
- base::WeakPtr<JniDisplayHandler> display_handler_;
-
- // This global reference is required, instead of a local reference, so it
- // remains valid for the lifetime of |bitmap_| - gfx::JavaBitmap does not
- // create its own global reference internally. And this global ref must be
- // destroyed (released) after |bitmap_| is destroyed.
- base::android::ScopedJavaGlobalRef<jobject> bitmap_global_ref_;
-
- // Reference to the frame bitmap that is passed to Java when the frame is
- // allocated. This provides easy access to the underlying pixels.
- std::unique_ptr<gfx::JavaBitmap> bitmap_;
-};
-
-// Function called on the display thread to render the frame.
-void JniFrameConsumer::Renderer::RenderFrame(
- std::unique_ptr<webrtc::DesktopFrame> frame) {
- DCHECK(jni_runtime_->display_task_runner()->BelongsToCurrentThread());
- if (!display_handler_) {
- return;
- }
-
- if (!bitmap_ || bitmap_->size().width() != frame->size().width() ||
- bitmap_->size().height() != frame->size().height()) {
- // Allocate a new Bitmap, store references here, and pass it to Java.
- JNIEnv* env = base::android::AttachCurrentThread();
-
- // |bitmap_| must be deleted before |bitmap_global_ref_| is released.
- bitmap_.reset();
- bitmap_global_ref_.Reset(
- env, display_handler_
- ->NewBitmap(frame->size().width(), frame->size().height())
- .obj());
- bitmap_.reset(new gfx::JavaBitmap(bitmap_global_ref_.obj()));
- display_handler_->UpdateFrameBitmap(bitmap_global_ref_);
- }
-
- // Copy pixels from |frame| into the Java Bitmap.
- // TODO(lambroslambrou): Optimize away this copy by having the VideoDecoder
- // decode directly into the Bitmap's pixel memory. This currently doesn't
- // work very well because the VideoDecoder writes the decoded data in BGRA,
- // and then the R/B channels are swapped in place (on the decoding thread).
- // If a repaint is triggered from a Java event handler, the unswapped pixels
- // can sometimes appear on the display.
- uint8_t* dest_buffer = static_cast<uint8_t*>(bitmap_->pixels());
- webrtc::DesktopRect buffer_rect =
- webrtc::DesktopRect::MakeSize(frame->size());
- for (webrtc::DesktopRegion::Iterator i(frame->updated_region()); !i.IsAtEnd();
- i.Advance()) {
- CopyRGB32Rect(frame->data(), frame->stride(), buffer_rect, dest_buffer,
- bitmap_->stride(), buffer_rect, i.rect());
- }
-
- display_handler_->RedrawCanvas();
-}
-
-JniFrameConsumer::JniFrameConsumer(
- ChromotingJniRuntime* jni_runtime,
- base::WeakPtr<JniDisplayHandler> display)
- : jni_runtime_(jni_runtime),
- renderer_(new Renderer(jni_runtime, display)),
- weak_factory_(this) {}
-
-JniFrameConsumer::~JniFrameConsumer() {
- jni_runtime_->display_task_runner()->DeleteSoon(FROM_HERE,
- renderer_.release());
-}
-
-std::unique_ptr<webrtc::DesktopFrame> JniFrameConsumer::AllocateFrame(
- const webrtc::DesktopSize& size) {
- return base::WrapUnique(new webrtc::BasicDesktopFrame(size));
-}
-
-void JniFrameConsumer::DrawFrame(std::unique_ptr<webrtc::DesktopFrame> frame,
- const base::Closure& done) {
- DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread());
-
- jni_runtime_->display_task_runner()->PostTaskAndReply(
- FROM_HERE,
- base::Bind(&Renderer::RenderFrame, base::Unretained(renderer_.get()),
- base::Passed(&frame)),
- base::Bind(&JniFrameConsumer::OnFrameRendered, weak_factory_.GetWeakPtr(),
- done));
-}
-
-void JniFrameConsumer::OnFrameRendered(const base::Closure& done) {
- DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread());
-
- if (!done.is_null())
- done.Run();
-}
-
-protocol::FrameConsumer::PixelFormat JniFrameConsumer::GetPixelFormat() {
- return FORMAT_RGBA;
-}
-
-void JniFrameConsumer::OnSessionConfig(const protocol::SessionConfig& config) {
- DCHECK(video_renderer_);
- return video_renderer_->OnSessionConfig(config);
-}
-
-protocol::VideoStub* JniFrameConsumer::GetVideoStub() {
- DCHECK(video_renderer_);
- return video_renderer_->GetVideoStub();
-}
-
-protocol::FrameConsumer* JniFrameConsumer::GetFrameConsumer() {
- DCHECK(video_renderer_);
- return video_renderer_->GetFrameConsumer();
-}
-
-void JniFrameConsumer::Initialize(
- scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner,
- protocol::PerformanceTracker* perf_tracker) {
- video_renderer_.reset(new SoftwareVideoRenderer(decode_task_runner, this,
- perf_tracker));
-}
-
-} // namespace remoting

Powered by Google App Engine
This is Rietveld 408576698