private:
std::string audiolang;
bool original;
- bool preferexternal;
public:
/** \brief The class' operator() decides if the given (subtitle) SelectionStream is relevant wrt.
* preferred subtitle language and audio language. If the subtitle is relevant <B>false</B> false is returned.
*
* A subtitle is relevant if
* - it was previously selected, or
- * - it's an external sub and "prefer external subs was selected", or
+ * - it's an external sub, or
* - it's a forced sub and "original stream's language" was selected, or
* - it's a forced sub and its language matches the audio's language, or
* - it's a default sub, or
*/
PredicateSubtitleFilter(std::string& lang)
: audiolang(lang),
- original(StringUtils::EqualsNoCase(CSettings::Get().GetString("locale.subtitlelanguage"), "original")),
- preferexternal(CSettings::Get().GetBool("subtitles.preferexternal"))
+ original(StringUtils::EqualsNoCase(CSettings::Get().GetString("locale.subtitlelanguage"), "original"))
{
};
-
+
bool operator()(const OMXSelectionStream& ss) const
{
if (ss.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream)
return false;
- if (preferexternal)
- {
- if(ss.source == STREAM_SOURCE_DEMUX_SUB || ss.source == STREAM_SOURCE_TEXT)
- return false;
- }
+ if(STREAM_SOURCE_MASK(ss.source) == STREAM_SOURCE_DEMUX_SUB || STREAM_SOURCE_MASK(ss.source) == STREAM_SOURCE_TEXT)
+ return false;
if ((ss.flags & CDemuxStream::FLAG_FORCED) && (original || g_LangCodeExpander.CompareLangCodes(ss.language, audiolang)))
return false;
*
* A subtitle lh is 'better than' a subtitle rh (in evaluation order) if
* - lh was previously selected, or
-* - lh is an external sub and "prefer external subs was selected" and rh not, or
+* - lh is an external sub and rh not, or
* - lh is a forced sub and ("original stream's language" was selected or subtitles are off) and rh not, or
* - lh is an external sub and its language matches the preferred subtitle's language (unequal to "original stream's language") and rh not, or
-* - lh is an external sub and rh not, or
* - lh is language matches the preferred subtitle's language (unequal to "original stream's language") and rh not, or
* - lh is a default sub and rh not
*/
private:
std::string audiolang;
bool original;
- bool preferextsubs;
bool subson;
+ PredicateSubtitleFilter filter;
public:
PredicateSubtitlePriority(std::string& lang)
: audiolang(lang),
original(StringUtils::EqualsNoCase(CSettings::Get().GetString("locale.subtitlelanguage"), "original")),
- preferextsubs(CSettings::Get().GetBool("subtitles.preferexternal")),
- subson(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn)
+ subson(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn),
+ filter(lang)
{
};
+ bool relevant(const OMXSelectionStream& ss) const
+ {
+ return !filter(ss);
+ }
+
bool operator()(const OMXSelectionStream& lh, const OMXSelectionStream& rh) const
{
+ PREDICATE_RETURN(relevant(lh)
+ , relevant(rh));
+
PREDICATE_RETURN(lh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream
, rh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream);
- if (preferextsubs)
- {
- PREDICATE_RETURN(lh.source == STREAM_SOURCE_DEMUX_SUB
- , rh.source == STREAM_SOURCE_DEMUX_SUB);
+ // prefer external subs
+ PREDICATE_RETURN(STREAM_SOURCE_MASK(lh.source) == STREAM_SOURCE_DEMUX_SUB
+ , STREAM_SOURCE_MASK(rh.source) == STREAM_SOURCE_DEMUX_SUB);
- PREDICATE_RETURN(lh.source == STREAM_SOURCE_TEXT
- , rh.source == STREAM_SOURCE_TEXT);
- }
+ PREDICATE_RETURN(STREAM_SOURCE_MASK(lh.source) == STREAM_SOURCE_TEXT
+ , STREAM_SOURCE_MASK(rh.source) == STREAM_SOURCE_TEXT);
if(!subson || original)
{
CStdString subtitle_language = g_langInfo.GetSubtitleLanguage();
if(!original)
{
- PREDICATE_RETURN((lh.source == STREAM_SOURCE_DEMUX_SUB || lh.source == STREAM_SOURCE_TEXT) && g_LangCodeExpander.CompareLangCodes(subtitle_language, lh.language)
- , (rh.source == STREAM_SOURCE_DEMUX_SUB || rh.source == STREAM_SOURCE_TEXT) && g_LangCodeExpander.CompareLangCodes(subtitle_language, rh.language));
+ PREDICATE_RETURN((STREAM_SOURCE_MASK(lh.source) == STREAM_SOURCE_DEMUX_SUB || STREAM_SOURCE_MASK(lh.source) == STREAM_SOURCE_TEXT) && g_LangCodeExpander.CompareLangCodes(subtitle_language, lh.language)
+ , (STREAM_SOURCE_MASK(rh.source) == STREAM_SOURCE_DEMUX_SUB || STREAM_SOURCE_MASK(rh.source) == STREAM_SOURCE_TEXT) && g_LangCodeExpander.CompareLangCodes(subtitle_language, rh.language));
}
- PREDICATE_RETURN(lh.source == STREAM_SOURCE_DEMUX_SUB
- , rh.source == STREAM_SOURCE_DEMUX_SUB);
-
- PREDICATE_RETURN(lh.source == STREAM_SOURCE_TEXT
- , rh.source == STREAM_SOURCE_TEXT);
-
if(!original)
{
PREDICATE_RETURN(g_LangCodeExpander.CompareLangCodes(subtitle_language, lh.language)
#endif
Create();
- if(!m_ready.WaitMSec(g_advancedSettings.m_videoBusyDialogDelay_ms))
- {
- CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY);
- if(dialog)
- {
- dialog->Show();
- while(!m_ready.WaitMSec(1))
- g_windowManager.ProcessRenderLoop(false);
- dialog->Close();
- }
- }
+
+ // wait for the ready event
+ CGUIDialogBusy::WaitOnEvent(m_ready, g_advancedSettings.m_videoBusyDialogDelay_ms, false);
// Playback might have been stopped due to some error
if (m_bStop || m_bAbortRequest)
CloseAudioStream(true);
// enable or disable subtitles
- SetSubtitleVisible(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn);
+ bool visible = CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn;
// open subtitle stream
OMXSelectionStream as = m_SelectionStreams.Get(STREAM_AUDIO, GetAudioStream());
- PredicateSubtitleFilter psf(as.language);
- streams = m_SelectionStreams.RemoveIf(STREAM_SUBTITLE, psf);
PredicateSubtitlePriority psp(as.language);
- std::stable_sort(streams.begin(), streams.end(), psp);
+ streams = m_SelectionStreams.Get(STREAM_SUBTITLE, psp);
valid = false;
for(OMXSelectionStreams::iterator it = streams.begin(); it != streams.end() && !valid; ++it)
{
if(OpenSubtitleStream(it->id, it->source))
{
valid = true;
- if(it->flags & CDemuxStream::FLAG_FORCED)
- m_omxPlayerVideo.EnableSubtitle(true);
+ if(!psp.relevant(*it))
+ visible = false;
+ else if(it->flags & CDemuxStream::FLAG_FORCED)
+ visible = true;
}
}
if(!valid)
- {
CloseSubtitleStream(true);
- if (m_pInputStream && !(m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD) || m_pInputStream->IsStreamType(DVDSTREAM_TYPE_BLURAY)))
- {
- SetSubtitleVisible(false);
- if (GetSubtitleCount() > 0 && CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream == -1)
- CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream = 0;
- }
- }
+
+ SetSubtitleVisibleInternal(visible);
// open teletext stream
streams = m_SelectionStreams.Get(STREAM_TELETEXT);
if (CDVDInputStream::IMenus* ptr = dynamic_cast<CDVDInputStream::IMenus*>(m_pInputStream))
{
CLog::Log(LOGNOTICE, "OMXPlayer: playing a file with menu's");
- if(CDVDInputStreamNavigator* nav = dynamic_cast<CDVDInputStreamNavigator*>(m_pInputStream))
+ if(dynamic_cast<CDVDInputStreamNavigator*>(m_pInputStream))
m_PlayerOptions.starttime = 0;
if(m_PlayerOptions.state.size() > 0)
m_bAbortRequest = true;
return;
}
- if(CSettings::Get().GetBool("videoplayer.adjustrefreshrate"))
+ if(CSettings::Get().GetInt("videoplayer.adjustrefreshrate") != ADJUST_REFRESHRATE_OFF)
m_av_clock.HDMIClockSync();
m_av_clock.OMXStateIdle();
m_av_clock.OMXStop();
UpdateApplication(1000);
// make sure we run subtitle process here
- m_dvdPlayerSubtitle.Process(m_clock.GetClock() - m_omxPlayerVideo.GetSubtitleDelay());
+ m_dvdPlayerSubtitle.Process(m_clock.GetClock() + m_State.time_offset - m_omxPlayerVideo.GetSubtitleDelay(), m_State.time_offset);
// OMX emergency exit
if(HasAudio() && m_omxPlayerAudio.BadState())
else if (pMsg->IsType(CDVDMsg::PLAYER_SET_SUBTITLESTREAM_VISIBLE))
{
CDVDMsgBool* pValue = (CDVDMsgBool*)pMsg;
-
- m_omxPlayerVideo.EnableSubtitle(pValue->m_value);
-
- if (m_pInputStream && m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD))
- static_cast<CDVDInputStreamNavigator*>(m_pInputStream)->EnableSubtitleStream(pValue->m_value);
+ SetSubtitleVisibleInternal(pValue->m_value);
}
else if (pMsg->IsType(CDVDMsg::PLAYER_SET_STATE))
{
m_messenger.Put(new CDVDMsgBool(CDVDMsg::PLAYER_SET_SUBTITLESTREAM_VISIBLE, bVisible));
}
+void COMXPlayer::SetSubtitleVisibleInternal(bool bVisible)
+{
+ CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn = bVisible;
+ m_omxPlayerVideo.EnableSubtitle(bVisible);
+
+ if (m_pInputStream && m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD))
+ static_cast<CDVDInputStreamNavigator*>(m_pInputStream)->EnableSubtitleStream(bVisible);
+}
+
int COMXPlayer::GetAudioStreamCount()
{
return m_SelectionStreams.Count(STREAM_AUDIO);
if(m_CurrentVideo.id < 0
|| m_CurrentVideo.hint != hint)
{
- if (!m_omxPlayerVideo.OpenStream(hint))
+ // discard if it's a picture attachment (e.g. album art embedded in MP3 or AAC)
+ if ((pStream->flags & AV_DISPOSITION_ATTACHED_PIC) || !m_omxPlayerVideo.OpenStream(hint))
{
/* mark stream as disabled, to disallaw further attempts */
CLog::Log(LOGWARNING, "%s - Unsupported stream %d. Stream disabled.", __FUNCTION__, iStream);
if(OpenSubtitleStream(it->id, it->source))
{
valid = true;
- SetSubtitleVisible(true);
+ SetSubtitleVisibleInternal(true);
}
}
}
if(!valid)
{
CloseSubtitleStream(true);
- SetSubtitleVisible(false);
+ SetSubtitleVisibleInternal(false);
}
}
return valid;
m_dvd.iDVDStillTime, time / 1000);
}
}
+ else if (iMessage == 6)
+ {
+ m_dvd.state = DVDSTATE_NORMAL;
+ CLog::Log(LOGDEBUG, "COMXPlayer::OnDVDNavResult - libbluray read error (DVDSTATE_NORMAL)");
+ CGUIDialogKaiToast::QueueNotification(g_localizeStrings.Get(25008), g_localizeStrings.Get(25009));
+ }
return 0;
}
int iStream = event->physical_wide;
bool visible = !(iStream & 0x80);
- SetSubtitleVisible(visible);
+ SetSubtitleVisibleInternal(visible);
if (iStream >= 0)
m_dvd.iSelectedSPUStream = (iStream & ~0x80);
{
CLog::Log(LOGDEBUG, "DVDNAV_STOP");
m_dvd.state = DVDSTATE_NORMAL;
+ CGUIDialogKaiToast::QueueNotification(g_localizeStrings.Get(16026), g_localizeStrings.Get(16029));
}
break;
default:
pt.y *= rs.Height() / rd.Height();
pt += CPoint(rs.x1, rs.y1);
if (action.GetID() == ACTION_MOUSE_LEFT_CLICK)
- return pMenus->OnMouseClick(pt);
+ {
+ if (pMenus->OnMouseClick(pt))
+ return true;
+ else
+ {
+ CApplicationMessenger::Get().SendAction(CAction(ACTION_TRIGGER_OSD), WINDOW_INVALID, false); // Trigger the osd
+ return false;
+ }
+ }
return pMenus->OnMouseMove(pt);
}
break;
{
CDVDInputStream::IMenus* pStream = dynamic_cast<CDVDInputStream::IMenus*>(m_pInputStream);
if (pStream)
- return true;
+ return pStream->HasMenu();
else
return false;
}
state.dts = m_CurrentVideo.dts;
else if(m_CurrentAudio.dts != DVD_NOPTS_VALUE)
state.dts = m_CurrentAudio.dts;
+ else if(m_CurrentVideo.startpts != DVD_NOPTS_VALUE)
+ state.dts = m_CurrentVideo.startpts;
+ else if(m_CurrentAudio.startpts != DVD_NOPTS_VALUE)
+ state.dts = m_CurrentAudio.startpts;
if(m_pDemuxer)
{