Merge pull request #4624 from FernetMenta/paplayer
[vuplus_xbmc] / xbmc / cores / paplayer / DVDPlayerCodec.cpp
index e1e8754..411d6bf 100644 (file)
@@ -24,7 +24,6 @@
 #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"
@@ -61,12 +60,6 @@ void DVDPlayerCodec::SetContentType(const CStdString &strContent)
 
 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)
   {
@@ -200,7 +193,23 @@ bool DVDPlayerCodec::Init(const CStdString &strFile, unsigned int filecache)
     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;
@@ -246,8 +255,6 @@ void DVDPlayerCodec::DeInit()
     m_pAudioCodec = NULL;
   }
 
-  m_dllAvUtil.Unload();
-
   // cleanup format information
   m_TotalTime = 0;
   m_SampleRate = 0;
@@ -271,16 +278,15 @@ int64_t DVDPlayerCodec::Seek(int64_t iSeekTime)
     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;
 }
 
@@ -362,5 +368,5 @@ bool DVDPlayerCodec::CanInit()
 
 bool DVDPlayerCodec::CanSeek()
 {
-  return true;
+  return m_bCanSeek;
 }