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()); }
/* returns true if details have been added */ bool CDVDFileInfo::DemuxerToStreamDetails(CDVDInputStream *pInputStream, CDVDDemux *pDemux, CStreamDetails &details, const std::string &path) { bool retVal = false; details.Reset(); const CURL pathToUrl(path); for (int iStream=0; iStream<pDemux->GetNrOfStreams(); iStream++) { CDemuxStream *stream = pDemux->GetStream(iStream); if (stream->type == STREAM_VIDEO && !(stream->flags & AV_DISPOSITION_ATTACHED_PIC)) { CStreamDetailVideo *p = new CStreamDetailVideo(); p->m_iWidth = ((CDemuxStreamVideo *)stream)->iWidth; p->m_iHeight = ((CDemuxStreamVideo *)stream)->iHeight; p->m_fAspect = ((CDemuxStreamVideo *)stream)->fAspect; if (p->m_fAspect == 0.0f) p->m_fAspect = (float)p->m_iWidth / p->m_iHeight; pDemux->GetStreamCodecName(iStream, p->m_strCodec); p->m_iDuration = pDemux->GetStreamLength(); p->m_strStereoMode = ((CDemuxStreamVideo *)stream)->stereo_mode; // stack handling if (URIUtils::IsStack(path)) { CFileItemList files; XFILE::CStackDirectory stack; stack.GetDirectory(pathToUrl, files); // skip first path as we already know the duration for (int i = 1; i < files.Size(); i++) { int duration = 0; if (CDVDFileInfo::GetFileDuration(files[i]->GetPath(), duration)) p->m_iDuration = p->m_iDuration + duration; } } // finally, calculate seconds if (p->m_iDuration > 0) p->m_iDuration = p->m_iDuration / 1000; details.AddStream(p); retVal = true; } else if (stream->type == STREAM_AUDIO) { CStreamDetailAudio *p = new CStreamDetailAudio(); p->m_iChannels = ((CDemuxStreamAudio *)stream)->iChannels; p->m_strLanguage = stream->language; pDemux->GetStreamCodecName(iStream, p->m_strCodec); details.AddStream(p); retVal = true; } else if (stream->type == STREAM_SUBTITLE) { CStreamDetailSubtitle *p = new CStreamDetailSubtitle(); p->m_strLanguage = stream->language; details.AddStream(p); retVal = true; } } /* for iStream */ details.DetermineBestStreams(); #ifdef HAVE_LIBBLURAY // correct bluray runtime. we need the duration from the input stream, not the demuxer. if (pInputStream->IsStreamType(DVDSTREAM_TYPE_BLURAY)) { if(((CDVDInputStreamBluray*)pInputStream)->GetTotalTime() > 0) { CStreamDetailVideo* detailVideo = (CStreamDetailVideo*)details.GetNthStream(CStreamDetail::VIDEO, 0); if (detailVideo) detailVideo->m_iDuration = ((CDVDInputStreamBluray*)pInputStream)->GetTotalTime() / 1000; } } #endif return retVal; }