Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

ExportAVI Class Reference

This class represents the Export/AVI notebook page. More...

#include <page_export_avi.h>

Inheritance diagram for ExportAVI:

Inheritance graph
[legend]
Collaboration diagram for ExportAVI:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 ExportAVI (PageExport *, KinoCommon *)
 Constructor for page.
virtual ~ExportAVI ()
 Destructor for page.
void start ()
 Start of page.
void clean ()
 Leaving the page.

Private Member Functions

enum export_result doExport (PlayList *playlist, int begin, int end, int every, bool preview)
 start exporting an AVI

Private Attributes

FileHandlerwriter
GtkEntry * fileEntry
GtkToggleButton * formatDV1Toggle
GtkToggleButton * formatDV2Toggle
GtkToggleButton * formatRawDVToggle
GtkToggleButton * formatQtToggle
GtkToggleButton * autoSplitToggle
GtkToggleButton * timeStampToggle
GtkToggleButton * metadataToggle
GtkEntry * framesEntry
GtkEntry * sizeEntry
GtkToggleButton * OpenDMLToggle

Detailed Description

This class represents the Export/AVI notebook page.

Definition at line 35 of file page_export_avi.h.


Constructor & Destructor Documentation

ExportAVI::ExportAVI PageExport _exportPage,
KinoCommon _common
 

Constructor for page.

Parameters:
_exportPage the export page object to bind to
_common common object to which this page belongs

Definition at line 44 of file page_export_avi.cc.

References autoSplitToggle, Export::common, Export::exportPage, fileEntry, formatDV1Toggle, formatDV2Toggle, formatQtToggle, formatRawDVToggle, framesEntry, PageExport::getWidget(), KinoCommon::getWidget(), lookup_widget(), metadataToggle, OpenDMLToggle, sizeEntry, and timeStampToggle.

00044                                                                    :
00045         Export( _exportPage, _common ), writer( NULL )
00046 {
00047     cerr << "> Creating ExportAVI Page" << endl;
00048 
00049     /* Get pointers to our controls */
00050     fileEntry = GTK_ENTRY( lookup_widget( common->getWidget(), "entry_export_avi_file" ) );
00051 
00052     formatDV1Toggle
00053     = GTK_TOGGLE_BUTTON( lookup_widget( common->getWidget(),
00054                                         "radiobutton_export_avi_type1" ) );
00055     formatDV2Toggle
00056     = GTK_TOGGLE_BUTTON( lookup_widget( common->getWidget(),
00057                                         "radiobutton_export_avi_type2" ) );
00058     formatRawDVToggle
00059     = GTK_TOGGLE_BUTTON( lookup_widget( common->getWidget(),
00060                                         "radiobutton_export_rawdv" ) );
00061     formatQtToggle
00062     = GTK_TOGGLE_BUTTON( lookup_widget( common->getWidget(),
00063                                         "radiobutton_export_quicktime" ) );
00064 #ifdef HAVE_LIBQUICKTIME
00065     gtk_widget_show( GTK_WIDGET( formatQtToggle ) );
00066     gtk_widget_set_sensitive( GTK_WIDGET( formatQtToggle ), 1 );
00067 #endif
00068 
00069     autoSplitToggle
00070     = GTK_TOGGLE_BUTTON( lookup_widget( common->getWidget(),
00071                                         "checkbutton_export_avi_autosplit" ) );
00072     timeStampToggle
00073     = GTK_TOGGLE_BUTTON( lookup_widget( common->getWidget(),
00074                                         "checkbutton_export_avi_timestamp" ) );
00075     framesEntry
00076     = GTK_ENTRY( lookup_widget( exportPage->getWidget(),
00077                                 "entry_export_avi_frames" ) );
00078     metadataToggle
00079     = GTK_TOGGLE_BUTTON( lookup_widget( exportPage->getWidget(),
00080                                         "checkbutton_export_avi_metadata" ) );
00081     sizeEntry
00082     = GTK_ENTRY( lookup_widget( exportPage->getWidget(),
00083                                 "entry_export_avi_size" ) );
00084     OpenDMLToggle
00085     = GTK_TOGGLE_BUTTON( lookup_widget( common->getWidget(),
00086                                         "checkbutton_export_avi_opendml" ) );
00087 }

ExportAVI::~ExportAVI  )  [virtual]
 

Destructor for page.

Definition at line 92 of file page_export_avi.cc.

00093 {
00094     cerr << "> Destroying ExportAVI Page" << endl;
00095 }


Member Function Documentation

void ExportAVI::clean  )  [virtual]
 

Leaving the page.

Reimplemented from Export.

Definition at line 135 of file page_export_avi.cc.

00136 {
00137     cerr << ">> Leaving ExportAVI" << endl;
00138 }

enum export_result ExportAVI::doExport PlayList playlist,
int  begin,
int  end,
int  every,
bool  preview
[private, virtual]
 

start exporting an AVI

Implements Export.

Definition at line 144 of file page_export_avi.cc.

References AUDIO_RESAMPLE_SRC_SINC_BEST_QUALITY, autoSplitToggle, AVI_DV1_FORMAT, AVI_DV2_FORMAT, Export::calculateAdjustedRate(), AudioInfo::channels, FileHandler::Close(), Export::common, DV_AUDIO_MAX_SAMPLES, EXPORT_RESULT_ABORT, EXPORT_RESULT_FAILURE, EXPORT_RESULT_SUCCESS, Export::exportPage, fileEntry, FileHandler::FileIsOpen(), formatDV1Toggle, formatDV2Toggle, formatQtToggle, formatRawDVToggle, framesEntry, AudioInfo::frequency, Frame::GetAudioInfo(), AsyncAudioResample< input_t, output_t >::GetError(), PlayList::GetFrame(), GetFramePool(), Preferences::getInstance(), AsyncAudioResample< input_t, output_t >::GetOutput(), KinoCommon::getPageEditor(), KinoCommon::getWidget(), info, Export::innerLoopUpdate(), AsyncAudioResample< input_t, output_t >::IsError(), PageExport::isExporting, lookup_widget(), metadataToggle, modal_message(), OpenDMLToggle, AsyncAudioResample< input_t, output_t >::Process(), QT_FORMAT, RAW_FORMAT, PageExport::resetProgress(), AudioInfo::samples, FileHandler::SetAutoSplit(), FileHandler::SetBaseName(), FileHandler::SetEveryNthFrame(), FileHandler::SetMaxFileSize(), FileHandler::SetMaxFrameCount(), AVIHandler::SetOpenDML(), FileHandler::SetTimeStamp(), sizeEntry, timeStampToggle, FileHandler::WriteFrame(), and writer.

00146 {
00147     Frame& frame = *GetFramePool()->GetFrame();
00148     vector <int> scene = common->getPageEditor() ->GetScene();
00149     int sceneIndex = 0;
00150     enum export_result status = EXPORT_RESULT_SUCCESS;
00151 
00152     strcpy( Preferences::getInstance().file, gtk_entry_get_text( fileEntry ) );
00153 
00154     if ( !strcmp( Preferences::getInstance().file, "" ) )
00155     {
00156         modal_message( _( "You must enter a stem filename without an extension." ) );
00157         return EXPORT_RESULT_FAILURE;
00158     }
00159 
00160     bool updateMetadata = gtk_toggle_button_get_active( metadataToggle );
00161 
00162     if ( gtk_toggle_button_get_active( formatDV1Toggle ) )
00163         Preferences::getInstance().fileFormat = AVI_DV1_FORMAT;
00164     if ( gtk_toggle_button_get_active( formatDV2Toggle ) )
00165         Preferences::getInstance().fileFormat = AVI_DV2_FORMAT;
00166     if ( gtk_toggle_button_get_active( formatRawDVToggle ) )
00167         Preferences::getInstance().fileFormat = RAW_FORMAT;
00168     if ( gtk_toggle_button_get_active( formatQtToggle ) )
00169         Preferences::getInstance().fileFormat = QT_FORMAT;
00170     Preferences::getInstance().isOpenDML
00171     = gtk_toggle_button_get_active( OpenDMLToggle );
00172     Preferences::getInstance().autoSplit
00173     = gtk_toggle_button_get_active( autoSplitToggle );
00174     Preferences::getInstance().timeStamp
00175     = gtk_toggle_button_get_active( timeStampToggle );
00176     Preferences::getInstance().frames = atoi( gtk_entry_get_text( framesEntry ) );
00177     Preferences::getInstance().maxFileSize = atoi( gtk_entry_get_text( sizeEntry ) );
00178     exportPage->resetProgress();
00179 
00180     switch ( Preferences::getInstance().fileFormat )
00181     {
00182     case RAW_FORMAT:
00183         writer = new RawHandler();
00184         break;
00185 
00186 #ifdef HAVE_LIBQUICKTIME
00187     case QT_FORMAT:
00188         writer = new QtHandler();
00189         break;
00190 #endif
00191 
00192     case AVI_DV1_FORMAT:
00193     case AVI_DV2_FORMAT:
00194         AVIHandler *aviWriter = new AVIHandler( Preferences::getInstance().fileFormat );
00195         writer = aviWriter;
00196         aviWriter->SetOpenDML( Preferences::getInstance().isOpenDML ||
00197                                Preferences::getInstance().maxFileSize == 0 ||
00198                                Preferences::getInstance().maxFileSize > 1024 );
00199         break;
00200     }
00201     writer->SetMaxFrameCount( Preferences::getInstance().frames );
00202     writer->SetAutoSplit( false );
00203     writer->SetTimeStamp( Preferences::getInstance().timeStamp );
00204     // writer->SetEveryNthFrame( Preferences::getInstance().every );
00205     writer->SetEveryNthFrame( 1 );
00206     writer->SetMaxFileSize( ( off_t ) Preferences::getInstance().maxFileSize * ( off_t ) ( 1024 * 1024 ) );
00207     writer->SetBaseName( Preferences::getInstance().file );
00208 
00209     try
00210     {
00211         time_t datetime = time( NULL );
00212         int frameNum = 0;
00213         int i;
00214         bool resample = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(
00215                             lookup_widget( common->getWidget(), "checkbutton_export_avi_resample" ) ) );
00216         int16_le_t *audio_buffers[ 4 ];
00217         AudioInfo info;
00218         AsyncAudioResample<int16_ne_t,int16_le_t>* resampler = 0;
00219         double adjustedRate = 0;
00220 
00221         for ( i = 0; i < 4; i++ )
00222             audio_buffers[ i ] = ( int16_le_t * ) calloc( 2 * DV_AUDIO_MAX_SAMPLES, sizeof( int16_t ) );
00223 
00224         /* Iterate over all frames */
00225         for ( i = begin; i <= end && exportPage->isExporting; i += every, frameNum++ )
00226         {
00227             innerLoopUpdate( i, begin, end, every );
00228 
00229             // Check for split
00230             playlist->GetFrame( i, frame );
00231             if ( Preferences::getInstance().autoSplit && writer->FileIsOpen()
00232                     && ( i > 0 ) && ( i == scene[ sceneIndex ] ) )
00233             {
00234                 sceneIndex++;
00235                 writer->Close();
00236                 frameNum = 0;
00237                 delete resampler;
00238                 resampler = 0;
00239             }
00240 
00241             /* resample audio */
00242             if ( resample )
00243             {
00244                 if ( ! resampler )
00245                 {
00246                     frame.GetAudioInfo( info );
00247 
00248                     // Determine correct amount of audio for duration
00249                     adjustedRate = calculateAdjustedRate( playlist, info.frequency, i,
00250                         Preferences::getInstance().autoSplit ? ( scene[ sceneIndex ] - 1 ) : end, every );
00251                     if ( ! adjustedRate )
00252                     {
00253                         status = EXPORT_RESULT_ABORT;
00254                         break;
00255                     }
00256 
00257                     // Setup a resampler
00258                     resampler = new AsyncAudioResample<int16_ne_t,int16_le_t>(
00259                         AUDIO_RESAMPLE_SRC_SINC_BEST_QUALITY, playlist, info.frequency, i,
00260                         Preferences::getInstance().autoSplit ? ( scene[ sceneIndex ] - 1 ) : end, every );
00261                     if ( ! resampler )
00262                     {
00263                         status = EXPORT_RESULT_FAILURE;
00264                         break;
00265                     }
00266                     if ( resampler->IsError() )
00267                     {
00268                         status = EXPORT_RESULT_FAILURE;
00269                         throw string( _("Resampler Error: ") ) + resampler->GetError();
00270                     }
00271                 }
00272                 int requestedSamples = frame.CalculateNumberSamples( info.frequency, frameNum );
00273                 info.samples = resampler->Process( adjustedRate, requestedSamples );
00274                 int16_le_t *p = resampler->GetOutput();
00275                 for ( int s = 0; s < info.samples; s++ )
00276                     for ( int c = 0; c < info.channels; c++ )
00277                         audio_buffers[ c ][ s ] = *p++;
00278                 if ( info.samples )
00279                 {
00280                     frame.EncodeAudio( info, audio_buffers );
00281                     frame.ExtractHeader();
00282                 }
00283             }
00284 
00285             if ( updateMetadata )
00286             {
00287                 frame.SetRecordingDate( &datetime, i );
00288                 frame.SetTimeCode( frameNum );
00289             }
00290             if ( writer->WriteFrame( frame ) == false )
00291                 throw _( "Failed to write to file. Is file name OK?" );
00292         }
00293         writer->Close();
00294         if ( !exportPage->isExporting )
00295             status = EXPORT_RESULT_ABORT;
00296 
00297         for ( i = 0; i < 4; i++ )
00298             free( audio_buffers[ i ] );
00299         delete resampler;
00300         resampler = 0;
00301     }
00302     catch ( string s )
00303     {
00304         cerr << "Could not save AVI file "
00305         << Preferences::getInstance().file
00306         << ", because an exception has occurred: " << endl;
00307         cerr << s << endl;
00308         status = EXPORT_RESULT_FAILURE;
00309     }
00310     catch ( const char * exc )
00311     {
00312         modal_message( ( char * ) exc );
00313         status = EXPORT_RESULT_FAILURE;
00314     }
00315 
00316     delete writer;
00317     writer = NULL;
00318 
00319     GetFramePool()->DoneWithFrame( &frame );
00320     
00321     return status;
00322 }

void ExportAVI::start  )  [virtual]
 

Start of page.

Reimplemented from Export.

Definition at line 100 of file page_export_avi.cc.

References autoSplitToggle, AVI_DV1_FORMAT, AVI_DV2_FORMAT, fileEntry, formatDV1Toggle, formatDV2Toggle, formatQtToggle, formatRawDVToggle, framesEntry, Preferences::getInstance(), OpenDMLToggle, QT_FORMAT, sizeEntry, and timeStampToggle.

00101 {
00102     char s[ 20 ];
00103     cerr << ">> Starting ExportAVI" << endl;
00104 
00105     switch ( Preferences::getInstance().fileFormat )
00106     {
00107     case AVI_DV1_FORMAT:
00108         gtk_toggle_button_set_active( formatDV1Toggle, TRUE );
00109         break;
00110     case AVI_DV2_FORMAT:
00111         gtk_toggle_button_set_active( formatDV2Toggle, TRUE );
00112         break;
00113     case QT_FORMAT:
00114         gtk_toggle_button_set_active( formatQtToggle, TRUE );
00115         break;
00116     default:
00117         gtk_toggle_button_set_active( formatRawDVToggle, TRUE );
00118         break;
00119     }
00120     gtk_toggle_button_set_active( autoSplitToggle,
00121                                   Preferences::getInstance().autoSplit );
00122     gtk_toggle_button_set_active( timeStampToggle,
00123                                   Preferences::getInstance().timeStamp );
00124     gtk_entry_set_text( fileEntry, Preferences::getInstance().file );
00125     sprintf( s, "%d", Preferences::getInstance().frames );
00126     gtk_entry_set_text( framesEntry, s );
00127     sprintf( s, "%d", Preferences::getInstance().maxFileSize );
00128     gtk_entry_set_text( sizeEntry, s );
00129     gtk_toggle_button_set_active( OpenDMLToggle, Preferences::getInstance().isOpenDML );
00130 }


Member Data Documentation

GtkToggleButton* ExportAVI::autoSplitToggle [private]
 

Definition at line 46 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

GtkEntry* ExportAVI::fileEntry [private]
 

Definition at line 41 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

GtkToggleButton* ExportAVI::formatDV1Toggle [private]
 

Definition at line 42 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

GtkToggleButton* ExportAVI::formatDV2Toggle [private]
 

Definition at line 43 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

GtkToggleButton* ExportAVI::formatQtToggle [private]
 

Definition at line 45 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

GtkToggleButton* ExportAVI::formatRawDVToggle [private]
 

Definition at line 44 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

GtkEntry* ExportAVI::framesEntry [private]
 

Definition at line 49 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

GtkToggleButton* ExportAVI::metadataToggle [private]
 

Definition at line 48 of file page_export_avi.h.

Referenced by doExport(), and ExportAVI().

GtkToggleButton* ExportAVI::OpenDMLToggle [private]
 

Definition at line 51 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

GtkEntry* ExportAVI::sizeEntry [private]
 

Definition at line 50 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

GtkToggleButton* ExportAVI::timeStampToggle [private]
 

Definition at line 47 of file page_export_avi.h.

Referenced by doExport(), ExportAVI(), and start().

FileHandler* ExportAVI::writer [private]
 

Definition at line 38 of file page_export_avi.h.

Referenced by doExport().


The documentation for this class was generated from the following files:
Generated on Sun Mar 11 22:12:52 2007 for Kino by  doxygen 1.4.2