Skip to content
This repository has been archived by the owner on Apr 15, 2023. It is now read-only.

Commit

Permalink
added: support for using libbluray to play bdmv files (index.bdmv or …
Browse files Browse the repository at this point in the history
…*.mpls)

git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@32232 568bbfeb-2a22-0410-94d2-cc84cf5bfa90
  • Loading branch information
elupus committed Jul 27, 2010
1 parent a94b0ce commit 8491e90
Show file tree
Hide file tree
Showing 11 changed files with 588 additions and 5 deletions.
11 changes: 9 additions & 2 deletions Makefile.in
Expand Up @@ -61,7 +61,11 @@ XBMCTEX_DIRS= \
DVDPCODECS_DIRS= \
xbmc/cores/dvdplayer/Codecs \
xbmc/cores/dvdplayer/Codecs/libdvd \
xbmc/cores/dvdplayer/Codecs/libbdnav

ifneq (@HAVE_LIBBLURAY@,1)
DVDPCODECS_DIRS+=xbmc/cores/dvdplayer/Codecs/libbdnav
endif

ifneq (@USE_EXTERNAL_LIBASS@,1)
DVDPCODECS_DIRS+=lib/libass/xbmc
endif
Expand Down Expand Up @@ -416,7 +420,6 @@ OBJSXBMC= \
xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxers.a \
xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreams.a \
xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitles.a \
xbmc/cores/dvdplayer/Codecs/libbdnav/src/libbdnav/.libs/libbdnav.a \
xbmc/cores/AudioRenderers/audiorenderers.a \
xbmc/cores/ExternalPlayer/ExternalPlayer.a \
xbmc/FileSystem/filesystem.a \
Expand All @@ -438,6 +441,10 @@ OBJSXBMC= \
lib/xbmc-dll-symbols/dll-symbols.a \
xbmc/settings/settings.a

ifneq (@HAVE_LIBBLURAY@,1)
OBJSXBMC+= xbmc/cores/dvdplayer/Codecs/libbdnav/src/libbdnav/.libs/libbdnav.a
endif

ifeq (@HAVE_XBMC_NONFREE@,1)
OBJSXBMC+= \
xbmc/lib/libXBMS/libxbms-@ARCH@.a \
Expand Down
33 changes: 33 additions & 0 deletions configure.in
Expand Up @@ -246,6 +246,12 @@ AC_ARG_ENABLE([liba52],
[use_liba52=$enableval],
[use_liba52=no])

AC_ARG_ENABLE([libbluray],
[AS_HELP_STRING([--enable-libbluray],
[enable libbluray support])],
[use_libbluray=$enableval],
[use_libbluray=auto])

AC_ARG_WITH([lirc-device],
[AS_HELP_STRING([--with-lirc-device=file],
[specify the default LIRC device (default is /dev/lircd)])],
Expand Down Expand Up @@ -519,6 +525,27 @@ PKG_CHECK_MODULES([VORBISENC], [vorbisenc],
[INCLUDES="$INCLUDES $VORBISENC_CFLAGS"; LIBS="$LIBS $VORBISENC_LIBS"],
AC_MSG_ERROR($missing_library))

# check for libbluray
AS_CASE([x$use_libbluray],
[xyes],[
PKG_CHECK_MODULES([LIBBLURAY],[libbluray],[use_libbluray="yes"], AC_MSG_ERROR($missing_library))
],
[xauto],[
PKG_CHECK_MODULES([LIBBLURAY],[libbluray],[use_libbluray="yes"], [use_libbluray="no"])
])

AS_CASE([x$use_libbluray],
[xyes],[
INCLUDES="$INCLUDES $LIBBLURAY_CFLAGS";
LIBS="$LIBS $LIBBLURAY_LIBS";
AC_DEFINE([HAVE_LIBBLURAY], 1, [System has libbluray library])
AC_SUBST([HAVE_LIBBLURAY], 1)
],[
# AC_DEFINE([HAVE_LIBBLURAY], 0, [System has libbluray library])
AC_SUBST([HAVE_LIBBLURAY], 0)
]
)

# platform dependent libraries
if test "$host_vendor" = "apple" ; then
AC_CHECK_LIB([iconv], [main],, AC_MSG_ERROR($missing_library))
Expand Down Expand Up @@ -1153,6 +1180,12 @@ else
final_message="$final_message\n GOOM:\t\tNo"
fi

if test "$use_libbluray" = "yes"; then
final_message="$final_message\n Bluray:\tYes"
else
final_message="$final_message\n Bluray:\tNo"
fi

if test "$use_mid" = "yes"; then
final_message="$final_message\n MID Support:\tYes"
SDL_DEFINES="$SDL_DEFINES -DMID"
Expand Down
6 changes: 6 additions & 0 deletions guilib/system.h
Expand Up @@ -224,6 +224,12 @@
#define HAS_GLES 1
#endif

// libbdnav conflicts with libbluray
#ifdef HAVE_LIBBLURAY
#undef HAS_LIBBDNAV
#endif


#ifdef HAS_GL
#ifdef _WIN32
#include "GL/glew.h"
Expand Down
2 changes: 1 addition & 1 deletion xbmc/Settings.cpp
Expand Up @@ -108,7 +108,7 @@ void CSettings::Initialize()

m_pictureExtensions = ".png|.jpg|.jpeg|.bmp|.gif|.ico|.tif|.tiff|.tga|.pcx|.cbz|.zip|.cbr|.rar|.m3u|.dng|.nef|.cr2|.crw|.orf|.arw|.erf|.3fr|.dcr|.x3f|.mef|.raf|.mrw|.pef|.sr2|.rss";
m_musicExtensions = ".nsv|.m4a|.flac|.aac|.strm|.pls|.rm|.rma|.mpa|.wav|.wma|.ogg|.mp3|.mp2|.m3u|.mod|.amf|.669|.dmf|.dsm|.far|.gdm|.imf|.it|.m15|.med|.okt|.s3m|.stm|.sfx|.ult|.uni|.xm|.sid|.ac3|.dts|.cue|.aif|.aiff|.wpl|.ape|.mac|.mpc|.mp+|.mpp|.shn|.zip|.rar|.wv|.nsf|.spc|.gym.adx|.dsp|.adp|.ymf|.ast|.afc|.hps|.xsp|.xwav|.waa|.wvs|.wam|.gcm|.idsp|.mpdsp|.mss|.spt|.rsd|.mid|.kar|.sap|.cmc|.cmr|.dmc|.mpt|.mpd|.rmt|.tmc|.tm8|.tm2|.oga|.url|.pxml|.tta|.rss|.cm3|.cms|.dlt|.brstm";
m_videoExtensions = ".m4v|.3g2|.3gp|.nsv|.tp|.ts|.ty|.strm|.pls|.rm|.rmvb|.m3u|.ifo|.mov|.qt|.divx|.xvid|.bivx|.vob|.nrg|.img|.iso|.pva|.wmv|.asf|.asx|.ogm|.m2v|.avi|.bin|.dat|.mpg|.mpeg|.mp4|.mkv|.avc|.vp3|.svq3|.nuv|.viv|.dv|.fli|.flv|.rar|.001|.wpl|.zip|.vdr|.dvr-ms|.xsp|.mts|.m2t|.m2ts|.evo|.ogv|.sdp|.avs|.rec|.url|.pxml|.vc1|.h264|.rcv|.rss|.mpls|.webm";
m_videoExtensions = ".m4v|.3g2|.3gp|.nsv|.tp|.ts|.ty|.strm|.pls|.rm|.rmvb|.m3u|.ifo|.mov|.qt|.divx|.xvid|.bivx|.vob|.nrg|.img|.iso|.pva|.wmv|.asf|.asx|.ogm|.m2v|.avi|.bin|.dat|.mpg|.mpeg|.mp4|.mkv|.avc|.vp3|.svq3|.nuv|.viv|.dv|.fli|.flv|.rar|.001|.wpl|.zip|.vdr|.dvr-ms|.xsp|.mts|.m2t|.m2ts|.evo|.ogv|.sdp|.avs|.rec|.url|.pxml|.vc1|.h264|.rcv|.rss|.mpls|.webm|.bdmv";
// internal music extensions
m_musicExtensions += "|.sidstream|.oggstream|.nsfstream|.asapstream|.cdda";

Expand Down
43 changes: 42 additions & 1 deletion xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
Expand Up @@ -32,6 +32,7 @@
#include "DVDDemuxFFmpeg.h"
#include "DVDInputStreams/DVDInputStream.h"
#include "DVDInputStreams/DVDInputStreamNavigator.h"
#include "DVDInputStreams/DVDInputStreamBluray.h"
#ifdef HAS_FILESYSTEM_MMS
#include "DVDInputStreams/DVDInputStreamMMS.h"
#endif
Expand Down Expand Up @@ -299,6 +300,11 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput)
m_ioContext->max_packet_size = FFMPEG_DVDNAV_BUFFER_SIZE;
m_ioContext->is_streamed = 1;
}
if (m_pInput->IsStreamType(DVDSTREAM_TYPE_BLURAY))
{
m_ioContext->max_packet_size = 6144;
m_ioContext->is_streamed = 1;
}
else if (m_pInput->IsStreamType(DVDSTREAM_TYPE_TV))
{
if(m_pInput->Seek(0, SEEK_POSSIBLE) == 0)
Expand Down Expand Up @@ -816,6 +822,18 @@ bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts)
return true;
}

if (m_pInput->IsStreamType(DVDSTREAM_TYPE_BLURAY))
{
if (!((CDVDInputStreamBluray*)m_pInput)->SeekTime(time))
return false;

if(startpts)
*startpts = DVD_NOPTS_VALUE;

Flush();
return true;
}

#ifdef HAS_FILESYSTEM_MMS
if (m_pInput->IsStreamType(DVDSTREAM_TYPE_MMS))
{
Expand Down Expand Up @@ -1088,6 +1106,9 @@ void CDVDDemuxFFmpeg::AddStream(int iId)
if( m_streams[iId]->codec == CODEC_ID_AC3 && (pStream->id >= 136 && pStream->id <= 143) )
m_streams[iId]->codec = CODEC_ID_DTS;

if( m_pInput->IsStreamType(DVDSTREAM_TYPE_BLURAY) )
static_cast<CDVDInputStreamBluray*>(m_pInput)->GetStreamInfo(pStream->id, m_streams[iId]->language);

if( m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD) )
{
// this stuff is really only valid for dvd's.
Expand Down Expand Up @@ -1133,6 +1154,9 @@ int CDVDDemuxFFmpeg::GetChapterCount()
if(m_pInput && m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD))
return ((CDVDInputStreamNavigator*)m_pInput)->GetChapterCount();

if(m_pInput && m_pInput->IsStreamType(DVDSTREAM_TYPE_BLURAY))
return ((CDVDInputStreamBluray*)m_pInput)->GetChapterCount();

if(m_pFormatContext == NULL)
return 0;
#if (LIBAVFORMAT_VERSION_MAJOR == 52) && (LIBAVFORMAT_VERSION_MINOR >= 14)
Expand All @@ -1147,6 +1171,9 @@ int CDVDDemuxFFmpeg::GetChapter()
if(m_pInput && m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD))
return ((CDVDInputStreamNavigator*)m_pInput)->GetChapter();

if(m_pInput && m_pInput->IsStreamType(DVDSTREAM_TYPE_BLURAY))
return ((CDVDInputStreamBluray*)m_pInput)->GetChapter();

if(m_pFormatContext == NULL
|| m_iCurrentPts == DVD_NOPTS_VALUE)
return 0;
Expand All @@ -1165,7 +1192,8 @@ int CDVDDemuxFFmpeg::GetChapter()

void CDVDDemuxFFmpeg::GetChapterName(std::string& strChapterName)
{
if(m_pInput && m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD))
if(m_pInput && ( m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD)
|| m_pInput->IsStreamType(DVDSTREAM_TYPE_BLURAY)) )
return;
else
{
Expand Down Expand Up @@ -1195,6 +1223,19 @@ bool CDVDDemuxFFmpeg::SeekChapter(int chapter, double* startpts)
return true;
}

if(m_pInput && m_pInput->IsStreamType(DVDSTREAM_TYPE_BLURAY))
{
CLog::Log(LOGDEBUG, "%s - chapter seeking using input stream", __FUNCTION__);
if(!((CDVDInputStreamBluray*)m_pInput)->SeekChapter(chapter))
return false;

if(startpts)
*startpts = DVD_NOPTS_VALUE;

Flush();
return true;
}

if(m_pFormatContext == NULL)
return false;

Expand Down
Expand Up @@ -28,7 +28,12 @@
#include "DVDInputStreamFFmpeg.h"
#include "DVDInputStreamTV.h"
#include "DVDInputStreamRTMP.h"
#ifdef HAS_LIBBDNAV
#include "DVDInputStreamMPLS.h"
#endif
#ifdef HAVE_LIBBLURAY
#include "DVDInputStreamBluray.h"
#endif
#ifdef HAS_FILESYSTEM_HTSP
#include "DVDInputStreamHTSP.h"
#endif
Expand All @@ -53,6 +58,10 @@ CDVDInputStream* CDVDFactoryInputStream::CreateInputStream(IDVDPlayer* pPlayer,
{
return (new CDVDInputStreamNavigator(pPlayer));
}
#ifdef HAVE_LIBBLURAY
else if (item.IsType(".bdmv") || item.IsType(".mpls"))
return new CDVDInputStreamBluray();
#endif
#ifdef HAS_LIBBDNAV
else if (item.IsType(".mpls"))
return new CDVDInputStreamMPLS;
Expand Down
3 changes: 2 additions & 1 deletion xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStream.h
Expand Up @@ -38,7 +38,8 @@ enum DVDStreamType
DVDSTREAM_TYPE_RTMP = 7,
DVDSTREAM_TYPE_HTSP = 8,
DVDSTREAM_TYPE_MMS = 9,
DVDSTREAM_TYPE_MPLS = 10
DVDSTREAM_TYPE_MPLS = 10,
DVDSTREAM_TYPE_BLURAY = 11,
};

#define DVDSTREAM_BLOCK_SIZE_FILE (2048 * 16)
Expand Down

0 comments on commit 8491e90

Please sign in to comment.