/* * * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ * Copyright (C) 2006 Sebastian Trueg * * This file is part of the K3b project. * Copyright (C) 1998-2007 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #include "k3bvideodvdrippingwidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static const int s_mp3Bitrates[] = { 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 // just used for the loops below }; static const int PICTURE_SIZE_ORIGINAL = 0; static const int PICTURE_SIZE_640 = 1; static const int PICTURE_SIZE_320 = 2; static const int PICTURE_SIZE_CUSTOM = 3; static const int PICTURE_SIZE_MAX = 4; static const char* s_pictureSizeNames[] = { I18N_NOOP("Keep original dimensions"), I18N_NOOP("640x? (automatic height)"), I18N_NOOP("320x? (automatic height)"), I18N_NOOP("Custom") }; K3bVideoDVDRippingWidget::K3bVideoDVDRippingWidget( TQWidget* tqparent ) : base_K3bVideoDVDRippingWidget( tqparent ) { m_editBaseDir->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly ); m_titleView->addColumn( i18n("Title") ); m_titleView->addColumn( i18n("Video Size") ); m_titleView->addColumn( i18n("File Size") ); m_titleView->addColumn( i18n("Filename") ); m_titleView->setSorting( -1 ); // // Example filename pattern // m_comboFilenamePattern->insertItem( TQString( "%b - %1 %t (%n %a %c)" ).tqarg(i18n("Title") ) ); m_comboFilenamePattern->insertItem( TQString( "%{volumeid} (%{title})" ) ); // // Add the Audio bitrates // for( int i = 0; s_mp3Bitrates[i]; ++i ) m_comboAudioBitrate->insertItem( i18n("%1 kbps" ).tqarg(s_mp3Bitrates[i]) ); for( int i = 0; i < K3bVideoDVDTitleTranscodingJob::VIDEO_CODEC_NUM_ENTRIES; ++i ) { K3bVideoDVDTitleTranscodingJob::VideoCodec codec( (K3bVideoDVDTitleTranscodingJob::VideoCodec)i ); if( K3bVideoDVDTitleTranscodingJob::transcodeBinaryHasSupportFor( codec ) ) m_comboVideoCodec->insertItem( i, K3bVideoDVDTitleTranscodingJob::videoCodecString( codec ), K3bVideoDVDTitleTranscodingJob::videoCodecDescription( codec ) ); } for( int i = 0; i < K3bVideoDVDTitleTranscodingJob::AUDIO_CODEC_NUM_ENTRIES; ++i ) { K3bVideoDVDTitleTranscodingJob::AudioCodec codec( (K3bVideoDVDTitleTranscodingJob::AudioCodec)i ); if( K3bVideoDVDTitleTranscodingJob::transcodeBinaryHasSupportFor( codec ) ) m_comboAudioCodec->insertItem( i, K3bVideoDVDTitleTranscodingJob::audioCodecString( codec ), K3bVideoDVDTitleTranscodingJob::audioCodecDescription( codec ) ); } for( int i = 0; i < PICTURE_SIZE_MAX; ++i ) { m_comboVideoSize->insertItem( i18n( s_pictureSizeNames[i] ) ); } slotAudioCodecChanged( m_comboAudioCodec->selectedValue() ); connect( m_comboAudioBitrate, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SIGNAL(changed()) ); connect( m_spinVideoBitrate, TQT_SIGNAL(valueChanged(int)), this, TQT_SIGNAL(changed()) ); connect( m_checkBlankReplace, TQT_SIGNAL(toggled(bool)), this, TQT_SIGNAL(changed()) ); connect( m_editBlankReplace, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SIGNAL(changed()) ); connect( m_comboFilenamePattern, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SIGNAL(changed()) ); connect( m_editBaseDir, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SIGNAL(changed()) ); connect( m_comboAudioCodec, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(slotAudioCodecChanged(int)) ); connect( m_specialStringsLabel, TQT_SIGNAL(leftClickedURL()), this, TQT_SLOT(slotSeeSpecialStrings()) ); connect( m_buttonCustomPictureSize, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotCustomPictureSize()) ); connect( m_comboVideoSize, TQT_SIGNAL(activated(int)), this, TQT_SLOT(slotVideoSizeChanged(int)) ); // refresh every 2 seconds m_freeSpaceUpdateTimer = new TQTimer( this ); connect( m_freeSpaceUpdateTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotUpdateFreeTempSpace()) ); m_freeSpaceUpdateTimer->start(2000); slotUpdateFreeTempSpace(); } K3bVideoDVDRippingWidget::~K3bVideoDVDRippingWidget() { } K3bVideoDVDTitleTranscodingJob::VideoCodec K3bVideoDVDRippingWidget::selectedVideoCodec() const { return (K3bVideoDVDTitleTranscodingJob::VideoCodec)m_comboVideoCodec->selectedValue(); } TQSize K3bVideoDVDRippingWidget::selectedPictureSize() const { switch( m_comboVideoSize->currentItem() ) { case PICTURE_SIZE_ORIGINAL: return TQSize(0,0); case PICTURE_SIZE_640: return TQSize(640,0); case PICTURE_SIZE_320: return TQSize(320,0); default: return m_customVideoSize; } } void K3bVideoDVDRippingWidget::setSelectedPictureSize( const TQSize& size ) { m_customVideoSize = size; if( size == TQSize(0,0) ) m_comboVideoSize->setCurrentItem( PICTURE_SIZE_ORIGINAL ); else if( size == TQSize(640,0) ) m_comboVideoSize->setCurrentItem( PICTURE_SIZE_640 ); else if( size == TQSize(320,0) ) m_comboVideoSize->setCurrentItem( PICTURE_SIZE_320 ); else { m_comboVideoSize->changeItem( i18n(s_pictureSizeNames[PICTURE_SIZE_CUSTOM]) + TQString(" (%1x%2)") .tqarg(size.width() == 0 ? i18n("auto") : TQString::number(size.width())) .tqarg(size.height() == 0 ? i18n("auto") : TQString::number(size.height())), PICTURE_SIZE_CUSTOM ); m_comboVideoSize->setCurrentItem( PICTURE_SIZE_CUSTOM ); } } void K3bVideoDVDRippingWidget::setSelectedVideoCodec( K3bVideoDVDTitleTranscodingJob::VideoCodec codec ) { m_comboVideoCodec->setSelectedValue( (int)codec ); } K3bVideoDVDTitleTranscodingJob::AudioCodec K3bVideoDVDRippingWidget::selectedAudioCodec() const { return (K3bVideoDVDTitleTranscodingJob::AudioCodec)m_comboAudioCodec->selectedValue(); } void K3bVideoDVDRippingWidget::setSelectedAudioCodec( K3bVideoDVDTitleTranscodingJob::AudioCodec codec ) { m_comboAudioCodec->setSelectedValue( (int)codec ); slotAudioCodecChanged( (int)codec ); } int K3bVideoDVDRippingWidget::selectedAudioBitrate() const { if( selectedAudioCodec() == K3bVideoDVDTitleTranscodingJob::AUDIO_CODEC_MP3 ) return s_mp3Bitrates[m_comboAudioBitrate->currentItem()]; else return m_spinAudioBitrate->value(); } void K3bVideoDVDRippingWidget::setSelectedAudioBitrate( int bitrate ) { m_spinAudioBitrate->setValue( bitrate ); // select the bitrate closest to "bitrate" int bi = 0; int diff = 1000; for( int i = 0; s_mp3Bitrates[i]; ++i ) { int newDiff = s_mp3Bitrates[i] - bitrate; if( newDiff < 0 ) newDiff = -1 * newDiff; if( newDiff < diff ) { diff = newDiff; bi = i; } } m_comboAudioBitrate->setCurrentItem( bi ); } void K3bVideoDVDRippingWidget::slotUpdateFreeTempSpace() { TQString path = m_editBaseDir->url(); if( !TQFile::exists( path ) ) path.truncate( path.findRev('/') ); unsigned long size, avail; if( K3b::kbFreeOnFs( path, size, avail ) ) { m_labelFreeSpace->setText( KIO::convertSizeFromKB(avail) ); if( avail < m_neededSize/1024 ) m_labelNeededSpace->setPaletteForegroundColor( TQt::red ); else m_labelNeededSpace->setPaletteForegroundColor( paletteForegroundColor() ); } else { m_labelFreeSpace->setText("-"); m_labelNeededSpace->setPaletteForegroundColor( paletteForegroundColor() ); } } void K3bVideoDVDRippingWidget::setNeededSize( KIO::filesize_t size ) { m_neededSize = size; if( size > 0 ) m_labelNeededSpace->setText( KIO::convertSize( size ) ); else m_labelNeededSpace->setText( i18n("unknown") ); slotUpdateFreeTempSpace(); } void K3bVideoDVDRippingWidget::slotSeeSpecialStrings() { TQWhatsThis::display( i18n( "

Pattern special strings:" "

The following strings will be replaced with their respective meaning in every " "track name.
" "

" "" "" "" "" "" "" "" "" "" "" "" "" "
MeaningAlternatives
%ttitle number%{t} or %{title_number}
%ivolume id (mostly the name of the Video DVD)%{i} or %{volume_id}
%bbeautified volume id%{b} or %{beautified_volume_id}
%ltwo chars language code%{l} or %{lang_code}
%nlanguage name%{n} or %{lang_name}
%aaudio format (on the Video DVD)%{a} or %{audio_format}
%cnumber of audio channels (on the Video DVD)%{c} or %{channels}
%vsize of the original video%{v} or %{orig_video_size}
%ssize of the resulting video (Caution: auto-clipping values are not taken into account!)%{s} or %{video_size}
%raspect ratio of the original video%{r} or %{aspect_ratio}
%dcurrent date%{d} or %{date}
" "

Hint: K3b also accepts slight variations of the long special strings. " "One can, for example, leave out the underscores.") ); } void K3bVideoDVDRippingWidget::slotAudioCodecChanged( int codec ) { switch( codec ) { case K3bVideoDVDTitleTranscodingJob::AUDIO_CODEC_MP3: m_stackAudioQuality->raiseWidget( m_stackPageAudioQualityMp3 ); break; case K3bVideoDVDTitleTranscodingJob::AUDIO_CODEC_AC3_STEREO: m_stackAudioQuality->raiseWidget( m_stackPageAudioQualityAC3 ); break; case K3bVideoDVDTitleTranscodingJob::AUDIO_CODEC_AC3_PASSTHROUGH: m_stackAudioQuality->raiseWidget( m_stackPageAudioQualityAC3Pt ); break; } emit changed(); } void K3bVideoDVDRippingWidget::slotVideoSizeChanged( int sizeIndex ) { if( sizeIndex == PICTURE_SIZE_CUSTOM ) slotCustomPictureSize(); else emit changed(); } void K3bVideoDVDRippingWidget::slotCustomPictureSize() { KDialogBase dlg( KDialogBase::Plain, i18n("Video Picture Size"), KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, this, 0, true, true ); K3bRichTextLabel* label = new K3bRichTextLabel( i18n("

Please choose the width and height of the resulting video. " "If one value is set to Auto K3b will choose this value " "depending on the aspect ratio of the video picture.
" "Be aware that setting both the width and the height to fixed values " "will result in no aspect ratio correction to be performed."), dlg.plainPage() ); TQSpinBox* spinWidth = new TQSpinBox( 0, 20000, 16, dlg.plainPage() ); TQSpinBox* spinHeight = new TQSpinBox( 0, 20000, 16, dlg.plainPage() ); spinWidth->setSpecialValueText( i18n("Auto") ); spinHeight->setSpecialValueText( i18n("Auto") ); TQLabel* labelW = new TQLabel( spinWidth, i18n("Width") + ':', dlg.plainPage() ); TQLabel* labelH = new TQLabel( spinHeight, i18n("Height") + ':', dlg.plainPage() ); labelW->tqsetAlignment( TQt::AlignRight|TQt::AlignVCenter ); labelH->tqsetAlignment( TQt::AlignRight|TQt::AlignVCenter ); TQGridLayout* grid = new TQGridLayout( dlg.plainPage() ); grid->setMargin( 0 ); grid->setSpacing( KDialog::spacingHint() ); grid->addMultiCellWidget( label, 0, 0, 0, 3 ); grid->addWidget( labelW, 1, 0 ); grid->addWidget( spinWidth, 1, 1 ); grid->addWidget( labelH, 1, 2 ); grid->addWidget( spinHeight, 1, 3 ); spinWidth->setValue( m_customVideoSize.width() ); spinHeight->setValue( m_customVideoSize.height() ); if( dlg.exec() ) { setSelectedPictureSize( TQSize( spinWidth->value(), spinHeight->value() ) ); emit changed(); } } #include "k3bvideodvdrippingwidget.moc"