#include <page_export_stills.h>
Inheritance diagram for ExportStills:


Public Member Functions | |
| ExportStills (PageExport *, KinoCommon *) | |
| Constructor for page. | |
| virtual | ~ExportStills () |
| Destructor for page. | |
Private Member Functions | |
| enum export_result | doExport (PlayList *playlist, int begin, int end, int every, bool preview) |
| start exporting still frames | |
Private Attributes | |
| GtkRange * | qualityScale |
| GtkEntry * | fileEntry |
Definition at line 34 of file page_export_stills.h.
|
||||||||||||
|
Constructor for page.
Definition at line 46 of file page_export_stills.cc. References Export::common, fileEntry, KinoCommon::getWidget(), lookup_widget(), and qualityScale. 00046 : 00047 Export( _exportPage, _common ) 00048 { 00049 cerr << "> Creating ExportStills Page" << endl; 00050 00051 /* Get a pointer to the controls of this page */ 00052 qualityScale 00053 = GTK_RANGE( lookup_widget( common->getWidget(), "hscale_export_stills" ) ); 00054 00055 fileEntry 00056 = GTK_ENTRY( lookup_widget( common->getWidget(), "entry_export_stills_file" ) ); 00057 }
|
|
|
Destructor for page.
Definition at line 62 of file page_export_stills.cc. 00063 {
00064 cerr << "> Destroying ExportStills Page" << endl;
00065 }
|
|
||||||||||||||||||||||||
|
start exporting still frames
Implements Export. Definition at line 70 of file page_export_stills.cc. References Export::common, EXPORT_RESULT_ABORT, EXPORT_RESULT_FAILURE, EXPORT_RESULT_SUCCESS, Export::exportPage, fileEntry, FRAME_MAX_HEIGHT, FRAME_MAX_WIDTH, PlayList::GetFrame(), GetFramePool(), KinoCommon::getWidget(), AspectRatioCalculator::height, Export::innerLoopUpdate(), PageExport::isExporting, Frame::IsPAL(), lookup_widget(), modal_message(), pixels, qualityScale, and AspectRatioCalculator::width. 00072 {
00073 static unsigned char pixels[ FRAME_MAX_WIDTH * FRAME_MAX_HEIGHT * 4 ];
00074 GdkPixbuf *image = NULL;
00075 gchar *file = NULL;
00076 gchar *filename = NULL;
00077 gchar *extension = NULL;
00078 int i = -1;
00079 GError *gerror = NULL;
00080 char quality[ 8 ] = "75";
00081 int extractOption;
00082 bool isResample;
00083
00084 file = g_strdup( gtk_entry_get_text( fileEntry ) );
00085
00086 /* Check for a valid filename */
00087 if ( !strcmp( file, "" ) )
00088 {
00089 modal_message( _( "You must enter a filename." ) );
00090 g_free( file );
00091 return EXPORT_RESULT_FAILURE;
00092 }
00093
00094 /* Take care of the quality parameter */
00095 GtkAdjustment * adjust = gtk_range_get_adjustment( qualityScale );
00096 if ( adjust )
00097 snprintf( quality, 8, "%d", ( int ) adjust->value );
00098
00099 /* make sure a file extension is supplied */
00100 char *tmp = strrchr( file, '.' );
00101 if ( tmp == NULL )
00102 {
00103 modal_message( _( "You must enter a filename with an extension" ) );
00104 g_free( file );
00105 return EXPORT_RESULT_FAILURE;
00106 }
00107 else
00108 {
00109 extension = g_strdup( tmp );
00110 tmp[0] = '\0';
00111 }
00112
00113 /* get the frame extraction method */
00114 GtkWidget *widget = gtk_option_menu_get_menu( GTK_OPTION_MENU( lookup_widget( common->getWidget(),
00115 "optionmenu_export_stills_extract" ) ) );
00116 GtkWidget *active_item = gtk_menu_get_active( GTK_MENU( widget ) );
00117 extractOption = g_list_index( GTK_MENU_SHELL( widget )->children, active_item );
00118
00119 widget = lookup_widget( common->getWidget(), "checkbutton_export_stills_resample" );
00120 isResample = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) );
00121
00122 /* Iterate over all frames in selection */
00123 Frame &frame = *GetFramePool( ) ->GetFrame( );
00124 frame.decoder->quality = DV_QUALITY_BEST;
00125
00126 for ( i = begin; i <= end && exportPage->isExporting; i += every )
00127 {
00128
00129 /* Call innerLoopUpdate */
00130 innerLoopUpdate( i, begin, end, every );
00131
00132 // Extract pixel data
00133 playlist->GetFrame( i, frame );
00134 frame.ExtractRGB( pixels );
00135 switch ( extractOption )
00136 {
00137 case 1:
00138 frame.Deinterlace( ( uint8_t* ) pixels, ( uint8_t* ) pixels, frame.GetWidth() * 3, frame.GetHeight() );
00139 break;
00140 case 2:
00141 frame.GetLowerField( pixels, 3 );
00142 break;
00143 case 3:
00144 frame.GetUpperField( pixels, 3 );
00145 break;
00146 default:
00147 break;
00148 }
00149
00150 // Get gdk-pixbuf
00151 image = gdk_pixbuf_new_from_data( pixels, GDK_COLORSPACE_RGB, FALSE, 8,
00152 frame.GetWidth(), frame.GetHeight(), frame.GetWidth() * 3, NULL, NULL );
00153
00154 // Adjust pixel aspect
00155 if ( isResample )
00156 {
00157 int width = frame.GetWidth();
00158 if ( frame.IsWide() )
00159 width = frame.IsPAL() ? 1024 : 854;
00160 AspectRatioCalculator calc( width, frame.GetHeight(),
00161 frame.GetWidth(), frame.GetHeight(),
00162 frame.IsPAL(), frame.IsWide() );
00163 GdkPixbuf *scaled = gdk_pixbuf_scale_simple( image, calc.width, calc.height, GDK_INTERP_HYPER );
00164 g_object_unref( image );
00165 image = scaled;
00166 }
00167
00168 // save to image
00169 filename = g_strdup_printf( "%s_%06i%s", file, i + 1, extension );
00170 if ( strncasecmp( extension + 1, "png", 8 ) == 0 )
00171 gdk_pixbuf_save( image, filename, "png", &gerror, NULL );
00172 else
00173 gdk_pixbuf_save( image, filename, "jpeg", &gerror, "quality", quality, NULL );
00174
00175 if ( gerror != NULL )
00176 {
00177 modal_message( gerror->message );
00178 g_error_free( gerror );
00179 }
00180 g_object_unref( image );
00181 g_free( filename );
00182 }
00183
00184 GetFramePool( ) ->DoneWithFrame( &frame );
00185
00186 g_free( file );
00187 g_free( extension );
00188
00189 if ( !exportPage->isExporting )
00190 return EXPORT_RESULT_ABORT;
00191 else if ( i > end )
00192 return EXPORT_RESULT_SUCCESS;
00193 else
00194 return EXPORT_RESULT_FAILURE;
00195 }
|
|
|
Definition at line 38 of file page_export_stills.h. Referenced by doExport(), and ExportStills(). |
|
|
Definition at line 37 of file page_export_stills.h. Referenced by doExport(), and ExportStills(). |
1.4.2