| Index: talk/media/devices/gtkvideorenderer.cc
|
| diff --git a/talk/media/devices/gtkvideorenderer.cc b/talk/media/devices/gtkvideorenderer.cc
|
| deleted file mode 100755
|
| index d389960e3daf853d2e6c5df0c9119369a596564b..0000000000000000000000000000000000000000
|
| --- a/talk/media/devices/gtkvideorenderer.cc
|
| +++ /dev/null
|
| @@ -1,179 +0,0 @@
|
| -/*
|
| - * libjingle
|
| - * Copyright 2004 Google Inc.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions are met:
|
| - *
|
| - * 1. Redistributions of source code must retain the above copyright notice,
|
| - * this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright notice,
|
| - * this list of conditions and the following disclaimer in the documentation
|
| - * and/or other materials provided with the distribution.
|
| - * 3. The name of the author may not be used to endorse or promote products
|
| - * derived from this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
| - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
| - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
| - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
| - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
| - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
| - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
| - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -// Implementation of GtkVideoRenderer
|
| -
|
| -#include "talk/media/devices/gtkvideorenderer.h"
|
| -
|
| -#include <gdk/gdk.h>
|
| -#include <glib.h>
|
| -#include <gtk/gtk.h>
|
| -
|
| -#include "talk/media/base/videocommon.h"
|
| -#include "talk/media/base/videoframe.h"
|
| -
|
| -namespace cricket {
|
| -
|
| -class ScopedGdkLock {
|
| - public:
|
| - ScopedGdkLock() {
|
| - gdk_threads_enter();
|
| - }
|
| -
|
| - ~ScopedGdkLock() {
|
| - gdk_threads_leave();
|
| - }
|
| -};
|
| -
|
| -GtkVideoRenderer::GtkVideoRenderer(int x, int y)
|
| - : window_(NULL),
|
| - draw_area_(NULL),
|
| - initial_x_(x),
|
| - initial_y_(y),
|
| - width_(0),
|
| - height_(0) {
|
| - g_type_init();
|
| - // g_thread_init API is deprecated since glib 2.31.0, see release note:
|
| - // http://mail.gnome.org/archives/gnome-announce-list/2011-October/msg00041.html
|
| -#if !GLIB_CHECK_VERSION(2, 31, 0)
|
| - g_thread_init(NULL);
|
| -#endif
|
| - gdk_threads_init();
|
| -}
|
| -
|
| -GtkVideoRenderer::~GtkVideoRenderer() {
|
| - if (window_) {
|
| - ScopedGdkLock lock;
|
| - gtk_widget_destroy(window_);
|
| - // Run the Gtk main loop to tear down the window.
|
| - Pump();
|
| - }
|
| - // Don't need to destroy draw_area_ because it is not top-level, so it is
|
| - // implicitly destroyed by the above.
|
| -}
|
| -
|
| -bool GtkVideoRenderer::SetSize(int width, int height, int reserved) {
|
| - ScopedGdkLock lock;
|
| -
|
| - // If the dimension is the same, no-op.
|
| - if (width_ == width && height_ == height) {
|
| - return true;
|
| - }
|
| -
|
| - // For the first frame, initialize the GTK window
|
| - if ((!window_ && !Initialize(width, height)) || IsClosed()) {
|
| - return false;
|
| - }
|
| -
|
| - image_.reset(new uint8_t[width * height * 4]);
|
| - gtk_widget_set_size_request(draw_area_, width, height);
|
| -
|
| - width_ = width;
|
| - height_ = height;
|
| - return true;
|
| -}
|
| -
|
| -bool GtkVideoRenderer::RenderFrame(const VideoFrame* video_frame) {
|
| - if (!video_frame) {
|
| - return false;
|
| - }
|
| -
|
| - const VideoFrame* frame = video_frame->GetCopyWithRotationApplied();
|
| -
|
| - // Need to set size as the frame might be rotated.
|
| - if (!SetSize(frame->GetWidth(), frame->GetHeight(), 0)) {
|
| - return false;
|
| - }
|
| -
|
| - // convert I420 frame to ABGR format, which is accepted by GTK
|
| - frame->ConvertToRgbBuffer(cricket::FOURCC_ABGR,
|
| - image_.get(),
|
| - frame->GetWidth() * frame->GetHeight() * 4,
|
| - frame->GetWidth() * 4);
|
| -
|
| - ScopedGdkLock lock;
|
| -
|
| - if (IsClosed()) {
|
| - return false;
|
| - }
|
| -
|
| - // draw the ABGR image
|
| - gdk_draw_rgb_32_image(draw_area_->window,
|
| - draw_area_->style->fg_gc[GTK_STATE_NORMAL],
|
| - 0,
|
| - 0,
|
| - frame->GetWidth(),
|
| - frame->GetHeight(),
|
| - GDK_RGB_DITHER_MAX,
|
| - image_.get(),
|
| - frame->GetWidth() * 4);
|
| -
|
| - // Run the Gtk main loop to refresh the window.
|
| - Pump();
|
| - return true;
|
| -}
|
| -
|
| -bool GtkVideoRenderer::Initialize(int width, int height) {
|
| - gtk_init(NULL, NULL);
|
| - window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
| - draw_area_ = gtk_drawing_area_new();
|
| - if (!window_ || !draw_area_) {
|
| - return false;
|
| - }
|
| -
|
| - gtk_window_set_position(GTK_WINDOW(window_), GTK_WIN_POS_CENTER);
|
| - gtk_window_set_title(GTK_WINDOW(window_), "Video Renderer");
|
| - gtk_window_set_resizable(GTK_WINDOW(window_), FALSE);
|
| - gtk_widget_set_size_request(draw_area_, width, height);
|
| - gtk_container_add(GTK_CONTAINER(window_), draw_area_);
|
| - gtk_widget_show_all(window_);
|
| - gtk_window_move(GTK_WINDOW(window_), initial_x_, initial_y_);
|
| -
|
| - image_.reset(new uint8_t[width * height * 4]);
|
| - return true;
|
| -}
|
| -
|
| -void GtkVideoRenderer::Pump() {
|
| - while (gtk_events_pending()) {
|
| - gtk_main_iteration();
|
| - }
|
| -}
|
| -
|
| -bool GtkVideoRenderer::IsClosed() const {
|
| - if (!window_) {
|
| - // Not initialized yet, so hasn't been closed.
|
| - return false;
|
| - }
|
| -
|
| - if (!GTK_IS_WINDOW(window_) || !GTK_IS_DRAWING_AREA(draw_area_)) {
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -} // namespace cricket
|
|
|