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

Side by Side Diff: webrtc/examples/peerconnection/client/linux/main_wnd.cc

Issue 2563203002: Add a gtk3 port of peerconnection_client on Linux (Closed)
Patch Set: Created 4 years 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 unified diff | Download patch
« no previous file with comments | « webrtc/examples/peerconnection/client/linux/main_wnd.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2012 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 delete cb_data; 111 delete cb_data;
112 return false; 112 return false;
113 } 113 }
114 114
115 gboolean Redraw(gpointer data) { 115 gboolean Redraw(gpointer data) {
116 GtkMainWnd* wnd = reinterpret_cast<GtkMainWnd*>(data); 116 GtkMainWnd* wnd = reinterpret_cast<GtkMainWnd*>(data);
117 wnd->OnRedraw(); 117 wnd->OnRedraw();
118 return false; 118 return false;
119 } 119 }
120 120
121 gboolean Draw(GtkWidget* widget, cairo_t* cr, gpointer data) {
122 GtkMainWnd* wnd = reinterpret_cast<GtkMainWnd*>(data);
123 wnd->Draw(widget, cr);
124 return false;
125 }
126
121 } // namespace 127 } // namespace
122 128
123 // 129 //
124 // GtkMainWnd implementation. 130 // GtkMainWnd implementation.
125 // 131 //
126 132
127 GtkMainWnd::GtkMainWnd(const char* server, int port, bool autoconnect, 133 GtkMainWnd::GtkMainWnd(const char* server, int port, bool autoconnect,
128 bool autocall) 134 bool autocall)
129 : window_(NULL), draw_area_(NULL), vbox_(NULL), server_edit_(NULL), 135 : window_(NULL), draw_area_(NULL), vbox_(NULL), server_edit_(NULL),
130 port_edit_(NULL), peer_list_(NULL), callback_(NULL), 136 port_edit_(NULL), peer_list_(NULL), callback_(NULL),
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 ASSERT(IsWindow()); 231 ASSERT(IsWindow());
226 ASSERT(vbox_ == NULL); 232 ASSERT(vbox_ == NULL);
227 233
228 gtk_container_set_border_width(GTK_CONTAINER(window_), 10); 234 gtk_container_set_border_width(GTK_CONTAINER(window_), 10);
229 235
230 if (peer_list_) { 236 if (peer_list_) {
231 gtk_widget_destroy(peer_list_); 237 gtk_widget_destroy(peer_list_);
232 peer_list_ = NULL; 238 peer_list_ = NULL;
233 } 239 }
234 240
241 #if GTK_MAJOR_VERSION == 2
235 vbox_ = gtk_vbox_new(FALSE, 5); 242 vbox_ = gtk_vbox_new(FALSE, 5);
243 #else
244 vbox_ = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
245 #endif
236 GtkWidget* valign = gtk_alignment_new(0, 1, 0, 0); 246 GtkWidget* valign = gtk_alignment_new(0, 1, 0, 0);
237 gtk_container_add(GTK_CONTAINER(vbox_), valign); 247 gtk_container_add(GTK_CONTAINER(vbox_), valign);
238 gtk_container_add(GTK_CONTAINER(window_), vbox_); 248 gtk_container_add(GTK_CONTAINER(window_), vbox_);
239 249
250 #if GTK_MAJOR_VERSION == 2
240 GtkWidget* hbox = gtk_hbox_new(FALSE, 5); 251 GtkWidget* hbox = gtk_hbox_new(FALSE, 5);
252 #else
253 GtkWidget* hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
254 #endif
241 255
242 GtkWidget* label = gtk_label_new("Server"); 256 GtkWidget* label = gtk_label_new("Server");
243 gtk_container_add(GTK_CONTAINER(hbox), label); 257 gtk_container_add(GTK_CONTAINER(hbox), label);
244 258
245 server_edit_ = gtk_entry_new(); 259 server_edit_ = gtk_entry_new();
246 gtk_entry_set_text(GTK_ENTRY(server_edit_), server_.c_str()); 260 gtk_entry_set_text(GTK_ENTRY(server_edit_), server_.c_str());
247 gtk_widget_set_size_request(server_edit_, 400, 30); 261 gtk_widget_set_size_request(server_edit_, 400, 30);
248 gtk_container_add(GTK_CONTAINER(hbox), server_edit_); 262 gtk_container_add(GTK_CONTAINER(hbox), server_edit_);
249 263
250 port_edit_ = gtk_entry_new(); 264 port_edit_ = gtk_entry_new();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 ASSERT(draw_area_ == NULL); 324 ASSERT(draw_area_ == NULL);
311 325
312 gtk_container_set_border_width(GTK_CONTAINER(window_), 0); 326 gtk_container_set_border_width(GTK_CONTAINER(window_), 0);
313 if (peer_list_) { 327 if (peer_list_) {
314 gtk_widget_destroy(peer_list_); 328 gtk_widget_destroy(peer_list_);
315 peer_list_ = NULL; 329 peer_list_ = NULL;
316 } 330 }
317 331
318 draw_area_ = gtk_drawing_area_new(); 332 draw_area_ = gtk_drawing_area_new();
319 gtk_container_add(GTK_CONTAINER(window_), draw_area_); 333 gtk_container_add(GTK_CONTAINER(window_), draw_area_);
334 g_signal_connect(G_OBJECT(draw_area_), "draw", G_CALLBACK(&::Draw), this);
320 335
321 gtk_widget_show_all(window_); 336 gtk_widget_show_all(window_);
322 } 337 }
323 338
324 void GtkMainWnd::OnDestroyed(GtkWidget* widget, GdkEvent* event) { 339 void GtkMainWnd::OnDestroyed(GtkWidget* widget, GdkEvent* event) {
325 callback_->Close(); 340 callback_->Close();
326 window_ = NULL; 341 window_ = NULL;
327 draw_area_ = NULL; 342 draw_area_ = NULL;
328 vbox_ = NULL; 343 vbox_ = NULL;
329 server_edit_ = NULL; 344 server_edit_ = NULL;
330 port_edit_ = NULL; 345 port_edit_ = NULL;
331 peer_list_ = NULL; 346 peer_list_ = NULL;
332 } 347 }
333 348
334 void GtkMainWnd::OnClicked(GtkWidget* widget) { 349 void GtkMainWnd::OnClicked(GtkWidget* widget) {
335 // Make the connect button insensitive, so that it cannot be clicked more than 350 // Make the connect button insensitive, so that it cannot be clicked more than
336 // once. Now that the connection includes auto-retry, it should not be 351 // once. Now that the connection includes auto-retry, it should not be
337 // necessary to click it more than once. 352 // necessary to click it more than once.
338 gtk_widget_set_sensitive(widget, false); 353 gtk_widget_set_sensitive(widget, false);
339 server_ = gtk_entry_get_text(GTK_ENTRY(server_edit_)); 354 server_ = gtk_entry_get_text(GTK_ENTRY(server_edit_));
340 port_ = gtk_entry_get_text(GTK_ENTRY(port_edit_)); 355 port_ = gtk_entry_get_text(GTK_ENTRY(port_edit_));
341 int port = port_.length() ? atoi(port_.c_str()) : 0; 356 int port = port_.length() ? atoi(port_.c_str()) : 0;
342 callback_->StartLogin(server_, port); 357 callback_->StartLogin(server_, port);
343 } 358 }
344 359
345 void GtkMainWnd::OnKeyPress(GtkWidget* widget, GdkEventKey* key) { 360 void GtkMainWnd::OnKeyPress(GtkWidget* widget, GdkEventKey* key) {
346 if (key->type == GDK_KEY_PRESS) { 361 if (key->type == GDK_KEY_PRESS) {
347 switch (key->keyval) { 362 switch (key->keyval) {
348 case GDK_Escape: 363 #if GTK_MAJOR_VERSION == 2
349 if (draw_area_) { 364 case GDK_Escape:
350 callback_->DisconnectFromCurrentPeer(); 365 #else
351 } else if (peer_list_) { 366 case GDK_KEY_Escape:
352 callback_->DisconnectFromServer(); 367 #endif
353 } 368 if (draw_area_) {
354 break; 369 callback_->DisconnectFromCurrentPeer();
370 } else if (peer_list_) {
371 callback_->DisconnectFromServer();
372 }
373 break;
355 374
356 case GDK_KP_Enter: 375 #if GTK_MAJOR_VERSION == 2
357 case GDK_Return: 376 case GDK_KP_Enter:
358 if (vbox_) { 377 case GDK_Return:
359 OnClicked(NULL); 378 #else
360 } else if (peer_list_) { 379 case GDK_KEY_KP_Enter:
361 // OnRowActivated will be called automatically when the user 380 case GDK_KEY_Return:
362 // presses enter. 381 #endif
363 } 382 if (vbox_) {
364 break; 383 OnClicked(NULL);
384 } else if (peer_list_) {
385 // OnRowActivated will be called automatically when the user
386 // presses enter.
387 }
388 break;
365 389
366 default: 390 default:
367 break; 391 break;
368 } 392 }
369 } 393 }
370 } 394 }
371 395
372 void GtkMainWnd::OnRowActivated(GtkTreeView* tree_view, GtkTreePath* path, 396 void GtkMainWnd::OnRowActivated(GtkTreeView* tree_view, GtkTreePath* path,
373 GtkTreeViewColumn* column) { 397 GtkTreeViewColumn* column) {
374 ASSERT(peer_list_ != NULL); 398 ASSERT(peer_list_ != NULL);
375 GtkTreeIter iter; 399 GtkTreeIter iter;
376 GtkTreeModel* model; 400 GtkTreeModel* model;
377 GtkTreeSelection* selection = 401 GtkTreeSelection* selection =
378 gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); 402 gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
379 if (gtk_tree_selection_get_selected(selection, &model, &iter)) { 403 if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
380 char* text; 404 char* text;
381 int id = -1; 405 int id = -1;
382 gtk_tree_model_get(model, &iter, 0, &text, 1, &id, -1); 406 gtk_tree_model_get(model, &iter, 0, &text, 1, &id, -1);
383 if (id != -1) 407 if (id != -1)
384 callback_->ConnectToPeer(id); 408 callback_->ConnectToPeer(id);
385 g_free(text); 409 g_free(text);
386 } 410 }
387 } 411 }
388 412
389 void GtkMainWnd::OnRedraw() { 413 void GtkMainWnd::OnRedraw() {
390 gdk_threads_enter(); 414 gdk_threads_enter();
391 415
392 VideoRenderer* remote_renderer = remote_renderer_.get(); 416 VideoRenderer* remote_renderer = remote_renderer_.get();
393 if (remote_renderer && remote_renderer->image() != NULL && 417 if (remote_renderer && remote_renderer->image() != NULL &&
394 draw_area_ != NULL) { 418 draw_area_ != NULL) {
395 int width = remote_renderer->width(); 419 width_ = remote_renderer->width();
396 int height = remote_renderer->height(); 420 height_ = remote_renderer->height();
397 421
398 if (!draw_buffer_.get()) { 422 if (!draw_buffer_.get()) {
399 draw_buffer_size_ = (width * height * 4) * 4; 423 draw_buffer_size_ = (width_ * height_ * 4) * 4;
400 draw_buffer_.reset(new uint8_t[draw_buffer_size_]); 424 draw_buffer_.reset(new uint8_t[draw_buffer_size_]);
401 gtk_widget_set_size_request(draw_area_, width * 2, height * 2); 425 gtk_widget_set_size_request(draw_area_, width_ * 2, height_ * 2);
402 } 426 }
403 427
404 const uint32_t* image = 428 const uint32_t* image =
405 reinterpret_cast<const uint32_t*>(remote_renderer->image()); 429 reinterpret_cast<const uint32_t*>(remote_renderer->image());
406 uint32_t* scaled = reinterpret_cast<uint32_t*>(draw_buffer_.get()); 430 uint32_t* scaled = reinterpret_cast<uint32_t*>(draw_buffer_.get());
407 for (int r = 0; r < height; ++r) { 431 for (int r = 0; r < height_; ++r) {
408 for (int c = 0; c < width; ++c) { 432 for (int c = 0; c < width_; ++c) {
409 int x = c * 2; 433 int x = c * 2;
410 scaled[x] = scaled[x + 1] = image[c]; 434 scaled[x] = scaled[x + 1] = image[c];
411 } 435 }
412 436
413 uint32_t* prev_line = scaled; 437 uint32_t* prev_line = scaled;
414 scaled += width * 2; 438 scaled += width_ * 2;
415 memcpy(scaled, prev_line, (width * 2) * 4); 439 memcpy(scaled, prev_line, (width_ * 2) * 4);
416 440
417 image += width; 441 image += width_;
418 scaled += width * 2; 442 scaled += width_ * 2;
419 } 443 }
420 444
421 VideoRenderer* local_renderer = local_renderer_.get(); 445 VideoRenderer* local_renderer = local_renderer_.get();
422 if (local_renderer && local_renderer->image()) { 446 if (local_renderer && local_renderer->image()) {
423 image = reinterpret_cast<const uint32_t*>(local_renderer->image()); 447 image = reinterpret_cast<const uint32_t*>(local_renderer->image());
424 scaled = reinterpret_cast<uint32_t*>(draw_buffer_.get()); 448 scaled = reinterpret_cast<uint32_t*>(draw_buffer_.get());
425 // Position the local preview on the right side. 449 // Position the local preview on the right side.
426 scaled += (width * 2) - (local_renderer->width() / 2); 450 scaled += (width_ * 2) - (local_renderer->width() / 2);
427 // right margin... 451 // right margin...
428 scaled -= 10; 452 scaled -= 10;
429 // ... towards the bottom. 453 // ... towards the bottom.
430 scaled += (height * width * 4) - 454 scaled += (height_ * width_ * 4) - ((local_renderer->height() / 2) *
431 ((local_renderer->height() / 2) * 455 (local_renderer->width() / 2) * 4);
432 (local_renderer->width() / 2) * 4);
433 // bottom margin... 456 // bottom margin...
434 scaled -= (width * 2) * 5; 457 scaled -= (width_ * 2) * 5;
435 for (int r = 0; r < local_renderer->height(); r += 2) { 458 for (int r = 0; r < local_renderer->height(); r += 2) {
436 for (int c = 0; c < local_renderer->width(); c += 2) { 459 for (int c = 0; c < local_renderer->width(); c += 2) {
437 scaled[c / 2] = image[c + r * local_renderer->width()]; 460 scaled[c / 2] = image[c + r * local_renderer->width()];
438 } 461 }
439 scaled += width * 2; 462 scaled += width_ * 2;
440 } 463 }
441 } 464 }
442 465
466 #if GTK_MAJOR_VERSION == 2
443 gdk_draw_rgb_32_image(draw_area_->window, 467 gdk_draw_rgb_32_image(draw_area_->window,
444 draw_area_->style->fg_gc[GTK_STATE_NORMAL], 468 draw_area_->style->fg_gc[GTK_STATE_NORMAL], 0, 0,
445 0, 469 width_ * 2, height_ * 2, GDK_RGB_DITHER_MAX,
446 0, 470 draw_buffer_.get(), (width_ * 2) * 4);
447 width * 2, 471 #else
448 height * 2, 472 gtk_widget_queue_draw(draw_area_);
449 GDK_RGB_DITHER_MAX, 473 #endif
450 draw_buffer_.get(),
451 (width * 2) * 4);
452 } 474 }
453 475
454 gdk_threads_leave(); 476 gdk_threads_leave();
455 } 477 }
456 478
479 void GtkMainWnd::Draw(GtkWidget* widget, cairo_t* cr) {
480 #if GTK_MAJOR_VERSION != 2
481 cairo_format_t format = CAIRO_FORMAT_RGB24;
482 cairo_surface_t* surface = cairo_image_surface_create_for_data(
483 draw_buffer_.get(), format, width_ * 2, height_ * 2,
484 cairo_format_stride_for_width(format, width_ * 2));
485 cairo_set_source_surface(cr, surface, 0, 0);
486 cairo_rectangle(cr, 0, 0, width_ * 2, height_ * 2);
487 cairo_fill(cr);
488 cairo_surface_destroy(surface);
489 #else
490 RTC_NOTREACHED();
491 #endif
492 }
493
457 GtkMainWnd::VideoRenderer::VideoRenderer( 494 GtkMainWnd::VideoRenderer::VideoRenderer(
458 GtkMainWnd* main_wnd, 495 GtkMainWnd* main_wnd,
459 webrtc::VideoTrackInterface* track_to_render) 496 webrtc::VideoTrackInterface* track_to_render)
460 : width_(0), 497 : width_(0),
461 height_(0), 498 height_(0),
462 main_wnd_(main_wnd), 499 main_wnd_(main_wnd),
463 rendered_track_(track_to_render) { 500 rendered_track_(track_to_render) {
464 rendered_track_->AddOrUpdateSink(this, rtc::VideoSinkWants()); 501 rendered_track_->AddOrUpdateSink(this, rtc::VideoSinkWants());
465 } 502 }
466 503
(...skipping 27 matching lines...) Expand all
494 libyuv::I420ToRGBA(buffer->DataY(), buffer->StrideY(), 531 libyuv::I420ToRGBA(buffer->DataY(), buffer->StrideY(),
495 buffer->DataU(), buffer->StrideU(), 532 buffer->DataU(), buffer->StrideU(),
496 buffer->DataV(), buffer->StrideV(), 533 buffer->DataV(), buffer->StrideV(),
497 image_.get(), width_ * 4, 534 image_.get(), width_ * 4,
498 buffer->width(), buffer->height()); 535 buffer->width(), buffer->height());
499 536
500 gdk_threads_leave(); 537 gdk_threads_leave();
501 538
502 g_idle_add(Redraw, main_wnd_); 539 g_idle_add(Redraw, main_wnd_);
503 } 540 }
OLDNEW
« no previous file with comments | « webrtc/examples/peerconnection/client/linux/main_wnd.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698