#include "cores/dvdplayer/DVDInputStreams/DVDFactoryInputStream.h"
#include "cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.h"
#include "cores/dvdplayer/DVDDemuxers/DVDDemuxUtils.h"
-#include "cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h"
#include "cores/dvdplayer/DVDStreamInfo.h"
#include "cores/dvdplayer/DVDCodecs/DVDFactoryCodec.h"
#include "music/tags/TagLoaderTagLib.h"
bool DVDPlayerCodec::Init(const CStdString &strFile, unsigned int filecache)
{
- if (!m_dllAvUtil.Load())
- {
- CLog::Log(LOGERROR, "DVDPlayerCodec::Init - failed to load avutil");
- return false;
- }
-
// take precaution if Init()ialized earlier
if (m_bInited)
{
return false;
}
- m_nDecodedLen = 0;
+ // test if seeking is supported
+ m_bCanSeek = false;
+ if (m_pInputStream->Seek(0, SEEK_POSSIBLE))
+ {
+ // reset eof flag of stream, with eof set seek returns always success
+ m_pInputStream->Seek(0, SEEK_SET);
+ if (Seek(1) != DVD_NOPTS_VALUE)
+ {
+ // rewind stream to beginning
+ Seek(0);
+ }
+ else
+ {
+ m_pInputStream->Seek(0, SEEK_SET);
+ m_pDemuxer->Reset();
+ }
+ }
if (m_Channels == 0) // no data - just guess and hope for the best
m_Channels = 2;
m_pAudioCodec = NULL;
}
- m_dllAvUtil.Unload();
-
// cleanup format information
m_TotalTime = 0;
m_SampleRate = 0;
CDVDDemuxUtils::FreeDemuxPacket(m_pPacket);
m_pPacket = NULL;
- CDVDDemuxFFmpeg *ffmpegDemuxer = dynamic_cast<CDVDDemuxFFmpeg*>(m_pDemuxer);
- if (ffmpegDemuxer)
- ffmpegDemuxer->SeekByte(m_dllAvUtil.av_rescale_rnd(iSeekTime, m_pInputStream->GetLength(), m_TotalTime, AV_ROUND_NEAR_INF));
- else
- m_pDemuxer->SeekTime((int)iSeekTime, false);
+ bool ret = m_pDemuxer->SeekTime((int)iSeekTime, false);
m_pAudioCodec->Reset();
m_decoded = NULL;
m_nDecodedLen = 0;
+ if (!ret)
+ return DVD_NOPTS_VALUE;
+
return iSeekTime;
}
bool DVDPlayerCodec::CanSeek()
{
- return true;
+ return m_bCanSeek;
}