1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
/*
*
* $Id: k3bffmpegdecoder.cpp 371113 2004-12-16 17:02:49Z trueg $
* Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
*
* This file is part of the K3b project.
* Copyright (C) 1998-2004 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 "k3bffmpegdecoder.h"
#include "k3bffmpegwrapper.h"
#include <kdebug.h>
#include <k3bpluginfactory.h>
#include <ffmpeg/avcodec.h>
#include <math.h>
K_EXPORT_COMPONENT_FACTORY( libk3bffmpegdecoder, K3bPluginFactory<K3bFFMpegDecoderFactory>( "k3bffmpegdecoder" ) )
K3bFFMpegDecoderFactory::K3bFFMpegDecoderFactory( QObject* parent, const char* name )
: K3bAudioDecoderFactory( parent, name )
{
}
K3bFFMpegDecoderFactory::~K3bFFMpegDecoderFactory()
{
}
K3bAudioDecoder* K3bFFMpegDecoderFactory::createDecoder( QObject* parent,
const char* name ) const
{
return new K3bFFMpegDecoder( parent, name );
}
bool K3bFFMpegDecoderFactory::canDecode( const KURL& url )
{
K3bFFMpegFile* file = K3bFFMpegWrapper::instance()->open( url.path() );
if( file ) {
delete file;
return true;
}
else {
return false;
}
}
K3bFFMpegDecoder::K3bFFMpegDecoder( QObject* parent, const char* name )
: K3bAudioDecoder( parent, name ),
m_file(0)
{
}
K3bFFMpegDecoder::~K3bFFMpegDecoder()
{
}
QString K3bFFMpegDecoder::fileType() const
{
return m_type;
}
bool K3bFFMpegDecoder::analyseFileInternal( K3b::Msf& frames, int& samplerate, int& ch )
{
m_file = K3bFFMpegWrapper::instance()->open( filename() );
if( m_file ) {
// TODO: call addTechnicalInfo
addMetaInfo( META_TITLE, m_file->title() );
addMetaInfo( META_ARTIST, m_file->author() );
addMetaInfo( META_COMMENT, m_file->comment() );
samplerate = m_file->sampleRate();
ch = m_file->channels();
m_type = m_file->typeComment();
// ffmpeg cannot handle vbr mp3 files properly (their length)
// so we have to decode the whole file in order to get the correct length
if( m_file->type() == CODEC_ID_MP3LAME ) {
kdDebug() << "(K3bFFMpegDecoder) mp3. Have to decode the hole file to get it's length." << endl;
char buffer[10*2048];
int len = 0;
unsigned long long bytes = 0;
while( ( len = m_file->read( buffer, 10*2048 ) ) > 0 )
bytes += len;
frames = (unsigned long)ceil((double)bytes/2048.0);
}
else
frames = m_file->length();
// cleanup;
delete m_file;
m_file = 0;
return true;
}
else
return false;
}
bool K3bFFMpegDecoder::initDecoderInternal()
{
if( !m_file )
m_file = K3bFFMpegWrapper::instance()->open( filename() );
return (m_file != 0);
}
void K3bFFMpegDecoder::cleanup()
{
delete m_file;
m_file = 0;
}
bool K3bFFMpegDecoder::seekInternal( const K3b::Msf& msf )
{
if( msf == 0 )
return initDecoderInternal();
else
return m_file->seek( msf );
}
int K3bFFMpegDecoder::decodeInternal( char* _data, int maxLen )
{
return m_file->read( _data, maxLen );
}
#include "k3bffmpegdecoder.moc"
|