summaryrefslogtreecommitdiffstats
path: root/src/rip/videodvd/k3bvideodvdrippingwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rip/videodvd/k3bvideodvdrippingwidget.cpp')
-rw-r--r--src/rip/videodvd/k3bvideodvdrippingwidget.cpp375
1 files changed, 375 insertions, 0 deletions
diff --git a/src/rip/videodvd/k3bvideodvdrippingwidget.cpp b/src/rip/videodvd/k3bvideodvdrippingwidget.cpp
new file mode 100644
index 0000000..721d191
--- /dev/null
+++ b/src/rip/videodvd/k3bvideodvdrippingwidget.cpp
@@ -0,0 +1,375 @@
+/*
+ *
+ * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $
+ * Copyright (C) 2006 Sebastian Trueg <trueg@k3b.org>
+ *
+ * This file is part of the K3b project.
+ * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
+ *
+ * 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 <k3bvideodvdtitletranscodingjob.h>
+#include <k3bglobals.h>
+#include <k3brichtextlabel.h>
+#include <k3bintmapcombobox.h>
+
+#include <klistview.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+#include <kio/global.h>
+#include <kurllabel.h>
+#include <kdialogbase.h>
+#include <klineedit.h>
+
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qtimer.h>
+#include <qwhatsthis.h>
+#include <qwidgetstack.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qlayout.h>
+
+
+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( QWidget* parent )
+ : base_K3bVideoDVDRippingWidget( parent )
+{
+ 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( QString( "%b - %1 %t (%n %a %c)" ).arg(i18n("Title") ) );
+ m_comboFilenamePattern->insertItem( QString( "%{volumeid} (%{title})" ) );
+
+
+ //
+ // Add the Audio bitrates
+ //
+ for( int i = 0; s_mp3Bitrates[i]; ++i )
+ m_comboAudioBitrate->insertItem( i18n("%1 kbps" ).arg(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, SIGNAL(textChanged(const QString&)),
+ this, SIGNAL(changed()) );
+ connect( m_spinVideoBitrate, SIGNAL(valueChanged(int)),
+ this, SIGNAL(changed()) );
+ connect( m_checkBlankReplace, SIGNAL(toggled(bool)),
+ this, SIGNAL(changed()) );
+ connect( m_editBlankReplace, SIGNAL(textChanged(const QString&)),
+ this, SIGNAL(changed()) );
+ connect( m_comboFilenamePattern, SIGNAL(textChanged(const QString&)),
+ this, SIGNAL(changed()) );
+ connect( m_editBaseDir, SIGNAL(textChanged(const QString&)),
+ this, SIGNAL(changed()) );
+
+ connect( m_comboAudioCodec, SIGNAL(valueChanged(int)),
+ this, SLOT(slotAudioCodecChanged(int)) );
+ connect( m_specialStringsLabel, SIGNAL(leftClickedURL()),
+ this, SLOT(slotSeeSpecialStrings()) );
+ connect( m_buttonCustomPictureSize, SIGNAL(clicked()),
+ this, SLOT(slotCustomPictureSize()) );
+ connect( m_comboVideoSize, SIGNAL(activated(int)),
+ this, SLOT(slotVideoSizeChanged(int)) );
+
+ // refresh every 2 seconds
+ m_freeSpaceUpdateTimer = new QTimer( this );
+ connect( m_freeSpaceUpdateTimer, SIGNAL(timeout()),
+ this, SLOT(slotUpdateFreeTempSpace()) );
+ m_freeSpaceUpdateTimer->start(2000);
+ slotUpdateFreeTempSpace();
+}
+
+
+K3bVideoDVDRippingWidget::~K3bVideoDVDRippingWidget()
+{
+}
+
+
+K3bVideoDVDTitleTranscodingJob::VideoCodec K3bVideoDVDRippingWidget::selectedVideoCodec() const
+{
+ return (K3bVideoDVDTitleTranscodingJob::VideoCodec)m_comboVideoCodec->selectedValue();
+}
+
+
+QSize K3bVideoDVDRippingWidget::selectedPictureSize() const
+{
+ switch( m_comboVideoSize->currentItem() ) {
+ case PICTURE_SIZE_ORIGINAL:
+ return QSize(0,0);
+ case PICTURE_SIZE_640:
+ return QSize(640,0);
+ case PICTURE_SIZE_320:
+ return QSize(320,0);
+ default:
+ return m_customVideoSize;
+ }
+}
+
+
+void K3bVideoDVDRippingWidget::setSelectedPictureSize( const QSize& size )
+{
+ m_customVideoSize = size;
+ if( size == QSize(0,0) )
+ m_comboVideoSize->setCurrentItem( PICTURE_SIZE_ORIGINAL );
+ else if( size == QSize(640,0) )
+ m_comboVideoSize->setCurrentItem( PICTURE_SIZE_640 );
+ else if( size == QSize(320,0) )
+ m_comboVideoSize->setCurrentItem( PICTURE_SIZE_320 );
+ else {
+ m_comboVideoSize->changeItem( i18n(s_pictureSizeNames[PICTURE_SIZE_CUSTOM])
+ + QString(" (%1x%2)")
+ .arg(size.width() == 0 ? i18n("auto") : QString::number(size.width()))
+ .arg(size.height() == 0 ? i18n("auto") : QString::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()
+{
+ QString path = m_editBaseDir->url();
+
+ if( !QFile::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( Qt::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()
+{
+ QWhatsThis::display( i18n( "<p><b>Pattern special strings:</b>"
+ "<p>The following strings will be replaced with their respective meaning in every "
+ "track name.<br>"
+ "<p><table border=\"0\">"
+ "<tr><td></td><td><em>Meaning</em></td><td><em>Alternatives</em></td></tr>"
+ "<tr><td>%t</td><td>title number</td><td>%{t} or %{title_number}</td></tr>"
+ "<tr><td>%i</td><td>volume id (mostly the name of the Video DVD)</td><td>%{i} or %{volume_id}</td></tr>"
+ "<tr><td>%b</td><td>beautified volume id</td><td>%{b} or %{beautified_volume_id}</td></tr>"
+ "<tr><td>%l</td><td>two chars language code</td><td>%{l} or %{lang_code}</td></tr>"
+ "<tr><td>%n</td><td>language name</td><td>%{n} or %{lang_name}</td></tr>"
+ "<tr><td>%a</td><td>audio format (on the Video DVD)</td><td>%{a} or %{audio_format}</td></tr>"
+ "<tr><td>%c</td><td>number of audio channels (on the Video DVD)</td><td>%{c} or %{channels}</td></tr>"
+ "<tr><td>%v</td><td>size of the original video</td><td>%{v} or %{orig_video_size}</td></tr>"
+ "<tr><td>%s</td><td>size of the resulting video (<em>Caution: auto-clipping values are not taken into account!</em>)</td><td>%{s} or %{video_size}</td></tr>"
+ "<tr><td>%r</td><td>aspect ratio of the original video</td><td>%{r} or %{aspect_ratio}</td></tr>"
+ "<tr><td>%d</td><td>current date</td><td>%{d} or %{date}</td></tr>"
+ "</table>"
+ "<p><em>Hint: K3b also accepts slight variations of the long special strings. "
+ "One can, for example, leave out the underscores.</em>") );
+}
+
+
+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("<p>Please choose the width and height of the resulting video. "
+ "If one value is set to <em>Auto</em> K3b will choose this value "
+ "depending on the aspect ratio of the video picture.<br>"
+ "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() );
+ QSpinBox* spinWidth = new QSpinBox( 0, 20000, 16, dlg.plainPage() );
+ QSpinBox* spinHeight = new QSpinBox( 0, 20000, 16, dlg.plainPage() );
+ spinWidth->setSpecialValueText( i18n("Auto") );
+ spinHeight->setSpecialValueText( i18n("Auto") );
+ QLabel* labelW = new QLabel( spinWidth, i18n("Width") + ':', dlg.plainPage() );
+ QLabel* labelH = new QLabel( spinHeight, i18n("Height") + ':', dlg.plainPage() );
+ labelW->setAlignment( Qt::AlignRight|Qt::AlignVCenter );
+ labelH->setAlignment( Qt::AlignRight|Qt::AlignVCenter );
+
+ QGridLayout* grid = new QGridLayout( 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( QSize( spinWidth->value(), spinHeight->value() ) );
+ emit changed();
+ }
+}
+
+#include "k3bvideodvdrippingwidget.moc"