You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
376 lines
13 KiB
376 lines
13 KiB
/*
|
|
*
|
|
* $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 <tqcombobox.h>
|
|
#include <tqspinbox.h>
|
|
#include <tqlabel.h>
|
|
#include <tqtimer.h>
|
|
#include <tqwhatsthis.h>
|
|
#include <tqwidgetstack.h>
|
|
#include <tqpushbutton.h>
|
|
#include <tqcheckbox.h>
|
|
#include <tqlayout.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( TQWidget* 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( TQString( "%b - %1 %t (%n %a %c)" ).arg(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" ).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, 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)")
|
|
.arg(size.width() == 0 ? i18n("auto") : TQString::number(size.width()))
|
|
.arg(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( "<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() );
|
|
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->setAlignment( TQt::AlignRight|TQt::AlignVCenter );
|
|
labelH->setAlignment( 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"
|