From ffca21f2743a7b367fa212799c6e2fea6190dd5d Mon Sep 17 00:00:00 2001 From: manuel Date: Tue, 3 Mar 2015 16:53:59 +0100 Subject: initial commit for kodi master --- .../dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp | 153 +++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp (limited to 'xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp') diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp new file mode 100644 index 0000000..f909c32 --- /dev/null +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "system.h" +#include "DVDFactoryDemuxer.h" + +#include "DVDInputStreams/DVDInputStream.h" +#include "DVDInputStreams/DVDInputStreamHttp.h" +#include "DVDInputStreams/DVDInputStreamPVRManager.h" + +#include "DVDDemuxFFmpeg.h" +#include "DVDDemuxShoutcast.h" +#ifdef HAS_FILESYSTEM_HTSP +#include "DVDDemuxHTSP.h" +#endif +#include "DVDDemuxBXA.h" +#include "DVDDemuxCDDA.h" +#include "DVDDemuxPVRClient.h" +#include "pvr/PVRManager.h" +#include "pvr/addons/PVRClients.h" + +using namespace std; +using namespace PVR; + +CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream, bool fileinfo) +{ + if (!pInputStream) + return NULL; + + // Try to open the AirTunes demuxer + if (pInputStream->IsStreamType(DVDSTREAM_TYPE_FILE) && pInputStream->GetContent().compare("audio/x-xbmc-pcm") == 0 ) + { + // audio/x-xbmc-pcm this is the used codec for AirTunes + // (apples audio only streaming) + unique_ptr demuxer(new CDVDDemuxBXA()); + if(demuxer->Open(pInputStream)) + return demuxer.release(); + else + return NULL; + } + + // Try to open CDDA demuxer + if (pInputStream->IsStreamType(DVDSTREAM_TYPE_FILE) && pInputStream->GetContent().compare("application/octet-stream") == 0) + { + std::string filename = pInputStream->GetFileName(); + if (filename.substr(0, 7) == "cdda://") + { + CLog::Log(LOGDEBUG, "DVDFactoryDemuxer: Stream is probably CD audio. Creating CDDA demuxer."); + + unique_ptr demuxer(new CDVDDemuxCDDA()); + if (demuxer->Open(pInputStream)) + { + return demuxer.release(); + } + } + } + + if (pInputStream->IsStreamType(DVDSTREAM_TYPE_HTTP)) + { + CDVDInputStreamHttp* pHttpStream = (CDVDInputStreamHttp*)pInputStream; + CHttpHeader *header = pHttpStream->GetHttpHeader(); + + /* check so we got the meta information as requested in our http header */ + if( header->GetValue("icy-metaint").length() > 0 ) + { + unique_ptr demuxer(new CDVDDemuxShoutcast()); + if(demuxer->Open(pInputStream)) + return demuxer.release(); + else + return NULL; + } + } + +#ifdef HAS_FILESYSTEM_HTSP + if (pInputStream->IsStreamType(DVDSTREAM_TYPE_HTSP)) + { + unique_ptr demuxer(new CDVDDemuxHTSP()); + if(demuxer->Open(pInputStream)) + return demuxer.release(); + else + return NULL; + } +#endif + + bool streaminfo = true; /* Look for streams before playback */ + if (pInputStream->IsStreamType(DVDSTREAM_TYPE_PVRMANAGER)) + { + CDVDInputStreamPVRManager* pInputStreamPVR = (CDVDInputStreamPVRManager*)pInputStream; + CDVDInputStream* pOtherStream = pInputStreamPVR->GetOtherStream(); + + /* Don't parse the streaminfo for some cases of streams to reduce the channel switch time */ + bool useFastswitch = URIUtils::IsUsingFastSwitch(pInputStream->GetFileName()); + streaminfo = !useFastswitch; + + if(pOtherStream) + { + /* Used for MediaPortal PVR addon (uses PVR otherstream for playback of rtsp streams) */ + if (pOtherStream->IsStreamType(DVDSTREAM_TYPE_FFMPEG)) + { + unique_ptr demuxer(new CDVDDemuxFFmpeg()); + if(demuxer->Open(pOtherStream, streaminfo)) + return demuxer.release(); + else + return NULL; + } + } + + /* Use PVR demuxer only for live streams */ + if (URIUtils::IsPVRChannel(pInputStream->GetFileName())) + { + std::shared_ptr client; + if (g_PVRClients->GetPlayingClient(client) && + client->HandlesDemuxing()) + { + unique_ptr demuxer(new CDVDDemuxPVRClient()); + if(demuxer->Open(pInputStream)) + return demuxer.release(); + else + return NULL; + } + } + } + + if (pInputStream->IsStreamType(DVDSTREAM_TYPE_FFMPEG)) + { + bool useFastswitch = URIUtils::IsUsingFastSwitch(pInputStream->GetFileName()); + streaminfo = !useFastswitch; + } + + unique_ptr demuxer(new CDVDDemuxFFmpeg()); + if(demuxer->Open(pInputStream, streaminfo, fileinfo)) + return demuxer.release(); + else + return NULL; +} + -- cgit v1.2.3