⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smallapp.c

📁 unicap provides an uniform access to video capture devices. Currently you can access v4l, v4l2, IIDC
💻 C
字号:
#include <stdlib.h>#include <gtk/gtk.h>#include <unicap.h>#include <unicapgtk.h>#include <stdio.h>#include <string.h>static void save_image( UnicapgtkVideoDisplay *ugtk );static void show_property_dialog( UnicapgtkVideoDisplay *ugtk );static GtkItemFactoryEntry menu_entries[] = {   { "/_File", NULL, NULL, 0, "<Branch>" },    { "/_File/_Save Image", "<CTRL>Q", save_image, 1, "<Item>" },   { "/_File/_Quit", "<CTRL>Q", gtk_main_quit, 0 , "<StockItem>",GTK_STOCK_QUIT },   { "/_Device", NULL, NULL, 0, "<Branch>" },   { "/_Device/_Parameters", "<CTRL>P", show_property_dialog, 1, "<Item>"},};static gint nmenu_entries = sizeof (menu_entries) / sizeof (menu_entries[0]);/*  format_change_cb:   Callback called when the user selected a new video format*/static void format_change_cb( GtkWidget *ugtk, unicap_format_t *format, GtkWidget *ugtk_display ){   GtkWidget *property_dialog;   property_dialog = g_object_get_data( G_OBJECT( ugtk_display ), "property_dialog" );   g_assert( property_dialog );   unicapgtk_video_display_stop( UNICAPGTK_VIDEO_DISPLAY( ugtk_display ) );   unicapgtk_video_display_set_format( UNICAPGTK_VIDEO_DISPLAY( ugtk_display ), format );   unicapgtk_video_display_start( UNICAPGTK_VIDEO_DISPLAY( ugtk_display ) );   // reset the property dialog since some properties ( eg. frame rate ) might change when the format changes   unicapgtk_property_dialog_reset( UNICAPGTK_PROPERTY_DIALOG( property_dialog ) );	}/*  pause_toggle_cb:   Callback called when the user pressed the pause button*/static void pause_toggle_cb( GtkWidget *toggle_button, GtkWidget *ugtk_display ){   unicapgtk_video_display_set_pause( UNICAPGTK_VIDEO_DISPLAY( ugtk_display ), 				      gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( toggle_button ) ) );}/*  device_change_cb:   callback called when the user selected a video capture device*/static void device_change_cb( UnicapgtkDeviceSelection *selection, gchar *device_id, GtkWidget *ugtk_display ){   unicap_device_t device;   unicap_handle_t handle;   GtkWidget *property_dialog;   GtkWidget *format_selection;   GtkWidget *window;   property_dialog = g_object_get_data( G_OBJECT( ugtk_display ), "property_dialog" );   g_assert( property_dialog );   format_selection = g_object_get_data( G_OBJECT( ugtk_display ), "format_selection" );   g_assert( format_selection );   window = g_object_get_data( G_OBJECT( ugtk_display ), "app-window" );   g_assert( window );   unicap_void_device( &device );   strcpy( device.identifier, device_id );      if( !SUCCESS( unicap_enumerate_devices( &device, &device, 0 ) ) ||       !SUCCESS( unicap_open( &handle, &device ) ) )   {      // device is not available anymore      g_printerr( "*** TODO: device rescan*** device not available!\n" );      return;   }      if( unicap_is_stream_locked( &device ) )   {      // could not acquire lock      unicap_close( handle );      g_printerr( "*** TODO: device rescan*** device is locked\n" );      return;   }		   unicapgtk_video_display_set_handle( UNICAPGTK_VIDEO_DISPLAY( ugtk_display ), handle );   unicapgtk_property_dialog_set_handle( UNICAPGTK_PROPERTY_DIALOG( property_dialog ), handle );   unicapgtk_video_format_selection_set_handle( UNICAPGTK_VIDEO_FORMAT_SELECTION( format_selection ), handle );   unicap_close( handle );   gtk_window_set_title( GTK_WINDOW( window ), device.identifier );}static void show_property_dialog( UnicapgtkVideoDisplay *ugtk ){   GtkWidget *dialog;	   dialog = g_object_get_data( G_OBJECT( ugtk ), "property_dialog" );   g_assert( dialog );	   gtk_window_present( GTK_WINDOW( dialog ) );}static void save_image( UnicapgtkVideoDisplay *ugtk ){   GdkPixbuf *pixbuf;   GtkWidget *fsdialog;   GtkWidget *app_window;   gchar *filename;   gint response;   app_window = g_object_get_data( G_OBJECT( ugtk ), "app-window" );   g_assert( app_window );   pixbuf = unicapgtk_video_display_get_still_image( ugtk );   if( !pixbuf )   {      return;   }   fsdialog = gtk_file_chooser_dialog_new( "Save Still Image", 					   GTK_WINDOW( app_window ), 					   GTK_FILE_CHOOSER_ACTION_SAVE, 					   GTK_STOCK_SAVE, GTK_RESPONSE_OK, 					   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL );   gtk_file_chooser_set_current_name( GTK_FILE_CHOOSER( fsdialog ), "Image.jpg" );   response = gtk_dialog_run( GTK_DIALOG( fsdialog ) );	   if( response != GTK_RESPONSE_OK )   {      gtk_widget_destroy( fsdialog );      return;   }   filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( fsdialog ) );   gdk_pixbuf_save( pixbuf, filename, "jpeg", NULL, NULL );   g_object_unref( pixbuf );   gtk_widget_destroy( fsdialog );}/*  create_application_window - Creates the main application window  The window consists of a button bar ( containing a video format selector,   a pause button, a save still image button and the preferences button ).   Below the toolbar, place the video display widget*/GtkWidget *create_application_window( ){   GtkWidget *window;   GtkWidget *menu_bar;   GtkWidget *ugtk_display;   GtkWidget *ugtk_format_selection;   GtkWidget *widget;   GtkWidget *vbox;   GtkWidget *hbox;   GtkWidget *button_box;   GtkWidget *device_selection;   GtkWidget *scrolled_window;   GtkItemFactory *factory;   GtkAccelGroup *accel_group;	   window = gtk_window_new( GTK_WINDOW_TOPLEVEL );   g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( gtk_main_quit ), NULL);	   gtk_window_set_default_size( GTK_WINDOW( window ), 680, 560 );   vbox = gtk_vbox_new( 0,0 );   gtk_container_add( GTK_CONTAINER( window ), vbox );   ugtk_display = unicapgtk_video_display_new( );   g_object_set( G_OBJECT( ugtk_display ), "scale-to-fit", TRUE, NULL );   g_object_set_data( G_OBJECT( window ), "ugtk_display", ugtk_display );   g_object_set_data( G_OBJECT( ugtk_display ), "app-window", window );   accel_group = gtk_accel_group_new();   factory = gtk_item_factory_new( GTK_TYPE_MENU_BAR, "<UnicapgtkSmallappMain>", accel_group );   gtk_item_factory_create_items( factory, nmenu_entries, menu_entries, ugtk_display );   gtk_window_add_accel_group( GTK_WINDOW( window ), accel_group );   menu_bar = gtk_item_factory_get_widget( factory, "<UnicapgtkSmallappMain>" );   gtk_box_pack_start( GTK_BOX( vbox ), menu_bar, FALSE, TRUE, 0 );   hbox = gtk_hbox_new( 0, 0 );   gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );   device_selection = unicapgtk_device_selection_new(TRUE);   g_signal_connect( G_OBJECT( device_selection ), "unicapgtk_device_selection_changed", 		     (GCallback)device_change_cb, ugtk_display );   gtk_box_pack_start_defaults( GTK_BOX( hbox ), device_selection );   ugtk_format_selection = unicapgtk_video_format_selection_new( );   gtk_box_pack_start_defaults( GTK_BOX( hbox ), ugtk_format_selection );   g_signal_connect( G_OBJECT( ugtk_format_selection ), "unicapgtk_video_format_changed",		     G_CALLBACK( format_change_cb ), ugtk_display );   button_box = gtk_hbutton_box_new();   gtk_box_pack_start( GTK_BOX( hbox ), button_box, 0, 0, 0 );   widget = gtk_toggle_button_new_with_label( GTK_STOCK_MEDIA_PAUSE );   gtk_button_set_use_stock( GTK_BUTTON( widget ), TRUE );   gtk_container_add( GTK_CONTAINER( button_box ), widget );   g_signal_connect( G_OBJECT( widget ), "toggled", G_CALLBACK( pause_toggle_cb ), ugtk_display );   scrolled_window = gtk_scrolled_window_new( NULL, NULL );   gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scrolled_window ), 				   GTK_POLICY_AUTOMATIC, 				   GTK_POLICY_AUTOMATIC );   gtk_box_pack_start( GTK_BOX( vbox ), scrolled_window, TRUE, TRUE, 2 );   gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW( scrolled_window ), ugtk_display );   gtk_widget_show_all( window );   g_object_set_data( G_OBJECT( ugtk_display ), "format_selection", ugtk_format_selection );   g_object_set_data( G_OBJECT( ugtk_display ), "device_selection", device_selection );   return window;}int main( int argc, char *argv[] ){   GtkWidget *display_window;   GtkWidget *video_display;   GtkWidget *device_selection;   GtkWidget *widget;   gtk_init (&argc, &argv);   //   // Create the main application window   //    display_window  = create_application_window( );   video_display = g_object_get_data( G_OBJECT( display_window ), "ugtk_display" );   g_assert( video_display );   device_selection = g_object_get_data( G_OBJECT( video_display ), "device_selection" );   g_assert( device_selection );   //   // Create a window containing the properties for the    // video capture device and a device selection menu   //   widget = unicapgtk_property_dialog_new( );   gtk_widget_show_all( widget );   g_object_set_data( G_OBJECT( video_display ), "property_dialog", widget );   //   // Rescan devices and select first device   //   if( unicapgtk_device_selection_rescan( UNICAPGTK_DEVICE_SELECTION( device_selection ) ) > 0 )   {      gtk_combo_box_set_active (GTK_COMBO_BOX( device_selection ), 0);   }   gtk_main ();	   return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -