Skip to content

Commit

Permalink
Merge pull request #9276 from mapfau/inputstream.pts
Browse files Browse the repository at this point in the history
Implemented EnableStreamAtPTS to support enabling a separate stream w…
  • Loading branch information
FernetMenta committed Mar 6, 2016
2 parents 4ab20ac + 91fc765 commit f1599b5
Show file tree
Hide file tree
Showing 11 changed files with 81 additions and 3 deletions.
16 changes: 16 additions & 0 deletions xbmc/addons/InputStream.cpp
Expand Up @@ -344,6 +344,22 @@ void CInputStream::EnableStream(int iStreamId, bool enable)
}
}

void CInputStream::EnableStreamAtPTS(int iStreamId, uint64_t pts)
{
std::map<int, CDemuxStream*>::iterator it = m_streams.find(iStreamId);
if (it == m_streams.end())
return;

try
{
m_pStruct->EnableStreamAtPTS(it->second->iPhysicalId, pts);
}
catch (std::exception &e)
{
CLog::Log(LOGERROR, "CInputStream::EnableStreamAtPTS - error");;
}
}

DemuxPacket* CInputStream::ReadDemux()
{
DemuxPacket* pPacket = nullptr;
Expand Down
2 changes: 2 additions & 0 deletions xbmc/addons/InputStream.h
Expand Up @@ -53,6 +53,7 @@ namespace ADDON
bool HasDisplayTime() { return m_caps.m_supportsIDisplayTime; };
bool CanPause() { return m_caps.m_supportsPause; };
bool CanSeek() { return m_caps.m_supportsSeek; };
bool CanEnableAtPTS() { return m_caps.m_supportsEnableAtPTS; };

// IDisplayTime
int GetTotalTime();
Expand All @@ -71,6 +72,7 @@ namespace ADDON
void FlushDemux();
void SetSpeed(int iSpeed);
void EnableStream(int iStreamId, bool enable);
void EnableStreamAtPTS(int iStreamId, uint64_t pts);

// stream
int ReadStream(uint8_t* buf, unsigned int size);
Expand Down
Expand Up @@ -81,6 +81,14 @@ extern "C"
*/
void EnableStream(int streamid, bool enable);

/*!
* Enables a stream at the given PTS.
* @param streamId unique id of stream
* @param pts position in stream in microseconds
* @remarks will only be called if CAPABILITIES::m_supportsEnableAtPTS is set to true
*/
void EnableStreamAtPTS(int streamid, uint64_t pts);

/*!
* Reset the demultiplexer in the add-on.
* @remarks Required if bHandlesDemuxing is set to true.
Expand Down Expand Up @@ -223,6 +231,7 @@ extern "C"
pClient->GetStreamIds = GetStreamIds;
pClient->GetStream = GetStream;
pClient->EnableStream = EnableStream;
pClient->EnableStreamAtPTS = EnableStreamAtPTS;
pClient->DemuxReset = DemuxReset;
pClient->DemuxAbort = DemuxAbort;
pClient->DemuxFlush = DemuxFlush;
Expand Down
Expand Up @@ -49,6 +49,7 @@ extern "C" {
bool m_supportsIDisplayTime; /*!< @brief supports interface IDisplayTime */
bool m_supportsSeek; /*!< @brief supports seek */
bool m_supportsPause; /*!< @brief supports pause */
bool m_supportsEnableAtPTS; /*!< @brief supports enabling streams at a given PTS time */
} INPUTSTREAM_CAPABILITIES;

/*!
Expand Down Expand Up @@ -129,6 +130,7 @@ extern "C" {
struct INPUTSTREAM_IDS (__cdecl* GetStreamIds)();
struct INPUTSTREAM_INFO (__cdecl* GetStream)(int);
void (__cdecl* EnableStream)(int, bool);
void (__cdecl* EnableStreamAtPTS)(int, uint64_t);
void (__cdecl* DemuxReset)(void);
void (__cdecl* DemuxAbort)(void);
void (__cdecl* DemuxFlush)(void);
Expand Down
10 changes: 10 additions & 0 deletions xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.h
Expand Up @@ -330,11 +330,21 @@ class CDVDDemux
*/
virtual std::string GetStreamCodecName(int iStreamId) { return ""; };

/*
* return true if demuxer supports enabling at a specific PTS
*/
virtual bool SupportsEnableAtPTS() { return false; };

/*
* enable / disable demux stream
*/
virtual void EnableStream(int id, bool enable) {};

/*
* enable / disable demux stream at given PTS
*/
virtual void EnableStreamAtPTS(int id, uint64_t pts) {};

protected:
int GetNrOfStreams(StreamType streamType);
};
8 changes: 8 additions & 0 deletions xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp
Expand Up @@ -591,3 +591,11 @@ void CDVDDemuxClient::EnableStream(int id, bool enable)
m_IDemux->EnableStream(id, enable);
}
}

void CDVDDemuxClient::EnableStreamAtPTS(int id, uint64_t pts)
{
if (m_IDemux)
{
m_IDemux->EnableStreamAtPTS(id, pts);
}
}
2 changes: 2 additions & 0 deletions xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.h
Expand Up @@ -48,7 +48,9 @@ class CDVDDemuxClient : public CDVDDemux
int GetNrOfStreams() const override;
std::string GetFileName() override;
virtual std::string GetStreamCodecName(int iStreamId) override;
virtual bool SupportsEnableAtPTS() { return m_IDemux ? m_IDemux->SupportsEnableAtPTS():false; };
virtual void EnableStream(int id, bool enable) override;
virtual void EnableStreamAtPTS(int id, uint64_t pts) override;

protected:
void RequestStreams();
Expand Down
2 changes: 2 additions & 0 deletions xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStream.h
Expand Up @@ -121,7 +121,9 @@ class CDVDInputStream
virtual DemuxPacket* ReadDemux() = 0;
virtual CDemuxStream* GetStream(int iStreamId) const = 0;
virtual std::vector<CDemuxStream*> GetStreams() const = 0;
virtual bool SupportsEnableAtPTS() const { return false; };
virtual void EnableStream(int iStreamId, bool enable) = 0;
virtual void EnableStreamAtPTS(int iStreamId, uint64_t pts) {};
virtual int GetNrOfStreams() const = 0;
virtual void SetSpeed(int iSpeed) = 0;
virtual bool SeekTime(int time, bool backward = false, double* startpts = NULL) = 0;
Expand Down
9 changes: 9 additions & 0 deletions xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp
Expand Up @@ -47,6 +47,7 @@ bool CInputStreamAddon::Open()
m_hasPosTime = m_addon->HasPosTime();
m_canPause = m_addon->CanPause();
m_canSeek = m_addon->CanSeek();
m_canEnableAtPTS = m_addon->CanEnableAtPTS();
}
return ret;
}
Expand Down Expand Up @@ -204,6 +205,14 @@ void CInputStreamAddon::EnableStream(int iStreamId, bool enable)
return m_addon->EnableStream(iStreamId, enable);
}

void CInputStreamAddon::EnableStreamAtPTS(int iStreamId, uint64_t pts)
{
if (!m_addon)
return;

return m_addon->EnableStreamAtPTS(iStreamId, pts);
}

int CInputStreamAddon::GetNrOfStreams() const
{
if (!m_addon)
Expand Down
3 changes: 3 additions & 0 deletions xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.h
Expand Up @@ -75,7 +75,9 @@ class CInputStreamAddon :
virtual DemuxPacket* ReadDemux() override;
virtual CDemuxStream* GetStream(int iStreamId) const override;
virtual std::vector<CDemuxStream*> GetStreams() const override;
virtual bool SupportsEnableAtPTS() const override { return m_canEnableAtPTS; };
virtual void EnableStream(int iStreamId, bool enable) override;
virtual void EnableStreamAtPTS(int iStreamId, uint64_t pts) override;
virtual int GetNrOfStreams() const override;
virtual void SetSpeed(int iSpeed) override;
virtual bool SeekTime(int time, bool backward = false, double* startpts = NULL) override;
Expand All @@ -89,4 +91,5 @@ class CInputStreamAddon :
bool m_hasPosTime;
bool m_canPause;
bool m_canSeek;
bool m_canEnableAtPTS;
};
21 changes: 18 additions & 3 deletions xbmc/cores/VideoPlayer/VideoPlayer.cpp
Expand Up @@ -2537,7 +2537,11 @@ void CVideoPlayer::HandleMessages()
CloseStream(m_CurrentAudio, false);
OpenStream(m_CurrentAudio, st.id, st.source);
AdaptForcedSubtitles();
m_messenger.Put(new CDVDMsgPlayerSeek((int) GetTime(), true, true, true, true, true));

if (!m_pDemuxer || !m_pDemuxer->SupportsEnableAtPTS())
m_messenger.Put(new CDVDMsgPlayerSeek((int) GetTime(), true, true, true, true, true));
else
m_CurrentAudio.avsync = CCurrentStream::AV_SYNC_CONT;
}
}
}
Expand Down Expand Up @@ -3460,7 +3464,11 @@ bool CVideoPlayer::OpenStream(CCurrentStream& current, int iStream, int source,
stream = m_pSubtitleDemuxer->GetStream(iStream);
if(!stream || stream->disabled)
return false;
m_pSubtitleDemuxer->EnableStream(iStream, true);

if (!m_pSubtitleDemuxer->SupportsEnableAtPTS())
m_pSubtitleDemuxer->EnableStream(iStream, true);
else
m_pSubtitleDemuxer->EnableStreamAtPTS(iStream, DVD_MSEC_TO_TIME(GetTime()));

hint.Assign(*stream, true);
}
Expand All @@ -3483,7 +3491,11 @@ bool CVideoPlayer::OpenStream(CCurrentStream& current, int iStream, int source,
stream = m_pDemuxer->GetStream(iStream);
if(!stream || stream->disabled)
return false;
m_pDemuxer->EnableStream(iStream, true);

if (!m_pDemuxer->SupportsEnableAtPTS())
m_pDemuxer->EnableStream(iStream, true);
else
m_pDemuxer->EnableStreamAtPTS(iStream, DVD_MSEC_TO_TIME(GetTime()));

hint.Assign(*stream, true);

Expand Down Expand Up @@ -3762,6 +3774,9 @@ bool CVideoPlayer::CloseStream(CCurrentStream& current, bool bWaitForBuffers)
if(bWaitForBuffers)
SetCaching(CACHESTATE_DONE);

if (m_pDemuxer && STREAM_SOURCE_MASK(current.source) == STREAM_SOURCE_DEMUX)
m_pDemuxer->EnableStream(current.id, false);

IDVDStreamPlayer* player = GetStreamPlayer(current.player);
if(player)
{
Expand Down

0 comments on commit f1599b5

Please sign in to comment.