TEST(TestStreamDetails, General) { CStreamDetails a; CStreamDetailVideo *video = new CStreamDetailVideo(); CStreamDetailAudio *audio = new CStreamDetailAudio(); CStreamDetailSubtitle *subtitle = new CStreamDetailSubtitle(); video->m_iWidth = 1920; video->m_iHeight = 1080; video->m_fAspect = 2.39f; video->m_iDuration = 30; video->m_strCodec = "h264"; video->m_strStereoMode = "left_right"; video->m_strLanguage = "eng"; audio->m_iChannels = 2; audio->m_strCodec = "aac"; audio->m_strLanguage = "eng"; subtitle->m_strLanguage = "eng"; a.AddStream(video); a.AddStream(audio); EXPECT_TRUE(a.HasItems()); EXPECT_EQ(1, a.GetStreamCount(CStreamDetail::VIDEO)); EXPECT_EQ(1, a.GetVideoStreamCount()); EXPECT_STREQ("", a.GetVideoCodec().c_str()); EXPECT_EQ(0.0f, a.GetVideoAspect()); EXPECT_EQ(0, a.GetVideoWidth()); EXPECT_EQ(0, a.GetVideoHeight()); EXPECT_EQ(0, a.GetVideoDuration()); EXPECT_STREQ("", a.GetStereoMode().c_str()); EXPECT_EQ(1, a.GetStreamCount(CStreamDetail::AUDIO)); EXPECT_EQ(1, a.GetAudioStreamCount()); EXPECT_EQ(0, a.GetStreamCount(CStreamDetail::SUBTITLE)); EXPECT_EQ(0, a.GetSubtitleStreamCount()); a.AddStream(subtitle); EXPECT_EQ(1, a.GetStreamCount(CStreamDetail::SUBTITLE)); EXPECT_EQ(1, a.GetSubtitleStreamCount()); a.DetermineBestStreams(); EXPECT_STREQ("h264", a.GetVideoCodec().c_str()); EXPECT_EQ(2.39f, a.GetVideoAspect()); EXPECT_EQ(1920, a.GetVideoWidth()); EXPECT_EQ(1080, a.GetVideoHeight()); EXPECT_EQ(30, a.GetVideoDuration()); EXPECT_STREQ("left_right", a.GetStereoMode().c_str()); }
void CPlayerSelectionRule::GetPlayers(const CFileItem& item, VECPLAYERCORES &vecCores) { CLog::Log(LOGDEBUG, "CPlayerSelectionRule::GetPlayers: considering rule: %s", m_name.c_str()); if (m_bStreamDetails && !item.HasVideoInfoTag()) return; if (m_tAudio >= 0 && (m_tAudio > 0) != item.IsAudio()) return; if (m_tVideo >= 0 && (m_tVideo > 0) != item.IsVideo()) return; if (m_tInternetStream >= 0 && (m_tInternetStream > 0) != item.IsInternetStream()) return; if (m_tRemote >= 0 && (m_tRemote > 0) != item.IsRemote()) return; if (m_tBD >= 0 && (m_tBD > 0) != (item.IsBDFile() && item.IsOnDVD())) return; if (m_tDVD >= 0 && (m_tDVD > 0) != item.IsDVD()) return; if (m_tDVDFile >= 0 && (m_tDVDFile > 0) != item.IsDVDFile()) return; if (m_tDVDImage >= 0 && (m_tDVDImage > 0) != item.IsDVDImage()) return; CRegExp regExp(false, CRegExp::autoUtf8); if (m_bStreamDetails) { if (!item.GetVideoInfoTag()->HasStreamDetails()) { CLog::Log(LOGDEBUG, "CPlayerSelectionRule::GetPlayers: cannot check rule: %s, no StreamDetails", m_name.c_str()); return; } CStreamDetails streamDetails = item.GetVideoInfoTag()->m_streamDetails; if (CompileRegExp(m_audioCodec, regExp) && !MatchesRegExp(streamDetails.GetAudioCodec(), regExp)) return; std::stringstream itoa; itoa << streamDetails.GetAudioChannels(); std::string audioChannelsstr = itoa.str(); if (CompileRegExp(m_audioChannels, regExp) && !MatchesRegExp(audioChannelsstr, regExp)) return; if (CompileRegExp(m_videoCodec, regExp) && !MatchesRegExp(streamDetails.GetVideoCodec(), regExp)) return; if (CompileRegExp(m_videoResolution, regExp) && !MatchesRegExp(CStreamDetails::VideoDimsToResolutionDescription(streamDetails.GetVideoWidth(), streamDetails.GetVideoHeight()), regExp)) return; if (CompileRegExp(m_videoAspect, regExp) && !MatchesRegExp(CStreamDetails::VideoAspectToAspectDescription(streamDetails.GetVideoAspect()), regExp)) return; } CURL url(item.GetPath()); if (CompileRegExp(m_fileTypes, regExp) && !MatchesRegExp(url.GetFileType(), regExp)) return; if (CompileRegExp(m_protocols, regExp) && !MatchesRegExp(url.GetProtocol(), regExp)) return; if (CompileRegExp(m_mimeTypes, regExp) && !MatchesRegExp(item.GetMimeType(), regExp)) return; if (CompileRegExp(m_fileName, regExp) && !MatchesRegExp(item.GetPath(), regExp)) return; CLog::Log(LOGDEBUG, "CPlayerSelectionRule::GetPlayers: matches rule: %s", m_name.c_str()); for (unsigned int i = 0; i < vecSubRules.size(); i++) vecSubRules[i]->GetPlayers(item, vecCores); PLAYERCOREID playerCoreId = GetPlayerCore(); if (playerCoreId != EPC_NONE) { CLog::Log(LOGDEBUG, "CPlayerSelectionRule::GetPlayers: adding player: %s (%d) for rule: %s", m_playerName.c_str(), playerCoreId, m_name.c_str()); vecCores.push_back(GetPlayerCore()); } }