void RecordVideo::run() { // Number of frames for user to know about. gui->reset_video(); // Wait for trigger trigger_lock->lock("RecordVideo::run"); while( !done && !write_result ) { if( recording_paused ) { pause_record_lock->unlock(); record_paused_lock->lock(); } if( done ) break; VideoDevice *vdevice = record->vdevice; VFrame *capture_frame = get_buffer(); vdevice->set_field_order(record->reverse_interlace); // Capture a frame grab_result = read_buffer(capture_frame); if( done ) break; if( vdevice->config_updated() ) { flush_buffer(); delete_buffer(); config_update(); gui->reset_video(); record->record_monitor->reconfig(); continue; } if( grab_result ) { Timer::delay(250); continue; } decompress_buffer(capture_frame); record->resync(); write_buffer(); if( record->monitor_video && capture_frame->get_data() ) if( !writing_file || !record->is_behind() ) record->record_monitor->update(capture_frame); if( writing_file && record->fill_underrun_frames ) { VFrame *last_frame = capture_frame; int fill = record->dropped; while( --fill >= 0 ) { capture_frame = get_buffer(); capture_frame->copy_from(last_frame); last_frame = capture_frame; write_buffer(); } } else record->written_frames += record->dropped; if( record->single_frame ) { record->single_frame = 0; record->stop_writing_file(); } if( done ) break; if( !done ) done = write_result; if( done ) break; record->check_batch_complete(); } SET_TRACE flush_buffer(); delete_buffer(); SET_TRACE //TRACE("RecordVideo::run 2"); if( write_result ) { ErrorBox error_box(PROGRAM_NAME ": Error", mwindow->gui->get_abs_cursor_x(1), mwindow->gui->get_abs_cursor_y(1)); error_box.create_objects(_("No space left on disk.")); error_box.run_window(); } SET_TRACE }