1
0
mirror of https://github.com/mpv-player/mpv synced 2025-01-18 13:14:36 +00:00

stream_bluray: add unencrypted Blu-ray playback

Support for unencrypted Blu-ray playback through libbluray.
Use it through: mplayer br:////path/to/disc

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31631 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
ben 2010-07-05 17:04:46 +00:00 committed by Uoti Urpala
parent 95751ea3e4
commit 6704008a46
8 changed files with 318 additions and 5 deletions

View File

@ -29,6 +29,10 @@ MPlayer (1.0)
* remove vf_yuy2, functionality is replaced by -vf format=yuv2
* remove vf_rgb2bgr, functionality is replaced by sws and vf_format
Streaming:
* Support for unencrypted Blu-ray playback through libbluray.
Use it through: mplayer br:////path/to/disc
Drivers:
* X11: Window manager choses Window position by default.
Add geometry=50%:50% to your configuration to get the old behaviour.

View File

@ -61,6 +61,11 @@ mencoder \- movie encoder
.
.br
.B mplayer
[br]://[title][/device]
[options]
.
.br
.B mplayer
[dvd|dvdnav]://[title|[start_title]\-end_title][/device]
[options]
.
@ -146,7 +151,7 @@ architectures, see the documentation).
It plays most MPEG/\:VOB, AVI, ASF/\:WMA/\:WMV, RM, QT/\:MOV/\:MP4, Ogg/\:OGM,
MKV, VIVO, FLI, NuppelVideo, yuv4mpeg, FILM and RoQ files, supported by many
native and binary codecs.
You can watch VCD, SVCD, DVD, 3ivx, DivX 3/4/5, WMV and even H.264 movies,
You can watch VCD, SVCD, DVD, Blu\-ray, 3ivx, DivX 3/4/5, WMV and even H.264 movies,
too.
.PP
MPlayer supports a wide range of video and audio output drivers.
@ -241,7 +246,7 @@ Adjust audio balance in favor of left/\:right channel.
Mute sound.
.IPs "_ (MPEG-TS, AVI and libavformat only)"
Cycle through the available video tracks.
.IPs "# (DVD, MPEG, Matroska, AVI and libavformat only)"
.IPs "# (DVD, Blu-ray, MPEG, Matroska, AVI and libavformat only)"
Cycle through the available audio tracks.
.IPs "TAB (MPEG-TS and libavformat only)"
Cycle through the available programs.
@ -898,8 +903,8 @@ Show file parameters in an easily parseable format.
Also prints more detailed information about subtitle and audio
track languages and IDs.
In some cases you can get more information by using \-msglevel identify=6.
For example, for a DVD it will list the chapters and time length of each title,
as well as a disk ID.
For example, for a DVD or Blu\-ray it will list the chapters and time length
of each title, as well as a disk ID.
Combine this with \-frames 0 to suppress all video output.
The wrapper script TOOLS/\:midentify.sh suppresses the other MPlayer output and
(hopefully) shellescapes the filenames.
@ -1210,6 +1215,19 @@ With Real RTSP streaming, it is also used to set the maximum delivery
bandwidth allowing faster cache filling and stream dumping.
.
.TP
.B \-bluray\-angle <angle ID> (Blu\-ray only)
Some Blu\-ray discs contain scenes that can be viewed from multiple angles.
Here you can tell MPlayer which angles to use (default: 1).
.
.TP
.B \-bluray\-chapter <chapter ID> (Blu\-ray only)
Tells MPlayer which Blu\-ray chapter to start the current title from (default: 1).
.
.TP
.B \-bluray\-device <path to disc> (Blu\-ray only)
Specify the Blu\-ray disc location. Must be a directory with Blu\-ray structure.
.
.TP
.B \-cache <kBytes>
This option specifies how much memory (in kBytes) to use when precaching a
file or URL.
@ -11430,6 +11448,13 @@ in this order:
.SH EXAMPLES OF MPLAYER USAGE
.
.PP
.B Quickstart Blu\-ray playing:
.nf
mplayer br:////path/to/disc
mplayer br:// \-bluray\-device /path/to/disc
.fi
.
.PP
.B Quickstart DVD playing:
.nf
mplayer dvd://1

View File

@ -129,6 +129,7 @@ SRCS_COMMON-$(LIBAVCODEC_INTERNALS) += libmpcodecs/vf_fspp.c \
SRCS_COMMON-$(LIBAVFORMAT) += libmpdemux/demux_lavf.c \
stream/stream_ffmpeg.c \
SRCS_COMMON-$(LIBBLURAY) += stream/stream_bluray.c
SRCS_COMMON-$(LIBBS2B) += libaf/af_bs2b.c
SRCS_COMMON-$(LIBDCA) += libmpcodecs/ad_libdca.c
SRCS_COMMON-$(LIBDV) += libmpcodecs/ad_libdv.c \

View File

@ -412,6 +412,15 @@ const m_option_t common_opts[] = {
#endif /* CONFIG_DVDREAD */
OPT_INTPAIR("chapter", chapterrange, 0),
OPT_INTRANGE("edition", edition_id, 0, -1, 8190),
#ifdef CONFIG_LIBBLURAY
{"bluray-device", &bluray_device, CONF_TYPE_STRING, 0, 0, 0, NULL},
{"bluray-angle", &bluray_angle, CONF_TYPE_INT, CONF_RANGE, 0, 999, NULL},
{"bluray-chapter", &bluray_chapter, CONF_TYPE_INT, CONF_RANGE, 0, 999, NULL},
#else
{"bluray-device", "MPlayer was compiled without libbluray support.\n", CONF_TYPE_PRINT, 0, 0, 0, NULL},
{"bluray-angle", "MPlayer was compiled without libbluray support.\n", CONF_TYPE_PRINT, 0, 0, 0, NULL},
{"bluray-chapter", "MPlayer was compiled without libbluray support.\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
#endif /* CONFIG_LIBBLURAY */
{"dvdauth", "libcss is obsolete. Try libdvdread instead.\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
{"dvdkey", "libcss is obsolete. Try libdvdread instead.\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},

32
configure vendored
View File

@ -279,6 +279,7 @@ Optional features:
--enable-live enable LIVE555 Streaming Media [autodetect]
--enable-nemesi enable Nemesi Streaming Media [autodetect]
--disable-vcd disable VCD support [autodetect]
--disable-bluray disable Blu-ray support [autodetect]
--disable-dvdnav disable libdvdnav [autodetect]
--disable-dvdread disable libdvdread [autodetect]
--disable-dvdread-internal disable internal libdvdread [autodetect]
@ -616,6 +617,7 @@ _ladspa=auto
_libbs2b=auto
_xmms=no
_vcd=auto
_bluray=auto
_dvdnav=auto
_dvdnavconfig=dvdnav-config
_dvdreadconfig=dvdread-config
@ -1015,6 +1017,8 @@ for ac_option do
--disable-xmms) _xmms=no ;;
--enable-vcd) _vcd=yes ;;
--disable-vcd) _vcd=no ;;
--enable-bluray) _bluray=yes ;;
--disable-bluray) _bluray=no ;;
--enable-dvdread) _dvdread=yes ;;
--disable-dvdread) _dvdread=no ;;
--enable-dvdread-internal) _dvdread_internal=yes ;;
@ -5780,6 +5784,30 @@ echores "$_vcd"
echocheck "Blu-ray support"
if test "$_bluray" = auto ; then
_bluray=no
cat > $TMPC << EOF
#include <stdlib.h>
#include <libbluray/bluray.h>
int main(void) {
BLURAY_TITLE_INFO *i = bd_get_title_info(NULL, 0);
return 0;
}
EOF
compile_check $TMPC -lbluray && _bluray=yes
fi
if test "$_bluray" = yes ; then
def_bluray='#define CONFIG_LIBBLURAY 1'
extra_ldflags="$extra_ldflags -lbluray"
inputmodules="bluray $inputmodules"
else
def_bluray='#undef CONFIG_LIBBLURAY'
noinputmodules="bluray $noinputmodules"
fi
echores "$_bluray"
echocheck "dvdread"
if test "$_dvdread_internal" = auto && test ! -f "libdvdread4/dvd_reader.c" ; then
_dvdread_internal=no
@ -7819,6 +7847,7 @@ KVA = $_kva
LADSPA = $_ladspa
LIBA52 = $_liba52
LIBASS = $_ass
LIBBLURAY = $_bluray
LIBBS2B = $_libbs2b
LIBDCA = $_libdca
LIBDV = $_libdv
@ -8123,9 +8152,10 @@ $(ff_config_enable "$subarch_all" "$subarch" "ARCH")
$(ff_config_enable "$cpuexts_all" "$cpuexts" "HAVE")
/* DVD/VCD/CD */
/* Blu-ray/DVD/VCD/CD */
#define DEFAULT_CDROM_DEVICE "$default_cdrom_device"
#define DEFAULT_DVD_DEVICE "$default_dvd_device"
$def_bluray
$def_bsdi_dvd
$def_cddb
$def_cdio

View File

@ -80,6 +80,7 @@ extern const stream_info_t stream_info_ffmpeg;
extern const stream_info_t stream_info_file;
extern const stream_info_t stream_info_ifo;
extern const stream_info_t stream_info_dvd;
extern const stream_info_t stream_info_bluray;
static const stream_info_t* const auto_open_streams[] = {
#ifdef CONFIG_VCD
@ -131,6 +132,9 @@ static const stream_info_t* const auto_open_streams[] = {
#ifdef CONFIG_DVDNAV
&stream_info_dvdnav,
#endif
#ifdef CONFIG_LIBBLURAY
&stream_info_bluray,
#endif
#ifdef CONFIG_LIBAVFORMAT
&stream_info_ffmpeg,
#endif

View File

@ -50,6 +50,7 @@
#define STREAMTYPE_TV 17
#define STREAMTYPE_MF 18
#define STREAMTYPE_RADIO 19
#define STREAMTYPE_BLURAY 20
#define STREAM_BUFFER_SIZE 2048
@ -340,9 +341,12 @@ void stream_set_interrupt_callback(int (*cb)(struct input_ctx*, int),
/// wait for time milliseconds
int stream_check_interrupt(int time);
extern int bluray_angle;
extern int bluray_chapter;
extern int dvd_title;
extern int dvd_angle;
extern char *bluray_device;
extern char * audio_stream;
typedef struct {

236
stream/stream_bluray.c Normal file
View File

@ -0,0 +1,236 @@
/*
* Copyright (C) 2010 Benjamin Zores <ben@geexbox.org>
*
* This file is part of MPlayer.
*
* MPlayer 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 of the License, or
* (at your option) any later version.
*
* MPlayer 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 MPlayer; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/*
* Blu-ray parser/reader using libbluray
* Use 'git clone git://git.videolan.org/libbluray' to get it.
*
* TODO:
* - Add libbdnav support for menus navigation
* - Add AACS/BD+ protection detection
* - Add descrambled keys database support (KEYDB.cfg)
*
*/
#include <libbluray/bluray.h>
#include "config.h"
#include "libavutil/common.h"
#include "libmpdemux/demuxer.h"
#include "mp_msg.h"
#include "m_struct.h"
#include "m_option.h"
#include "stream.h"
#define BLURAY_SECTOR_SIZE 6144
#define BLURAY_DEFAULT_ANGLE 0
#define BLURAY_DEFAULT_CHAPTER 0
#define BLURAY_DEFAULT_TITLE 0
char *bluray_device = NULL;
int bluray_angle = 0;
int bluray_chapter = 0;
static struct stream_priv_s {
int title;
char *device;
} bluray_stream_priv_dflts = {
BLURAY_DEFAULT_TITLE,
NULL
};
#define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
static const m_option_t bluray_stream_opts_fields[] = {
{ "hostname", ST_OFF(title), CONF_TYPE_INT, M_OPT_RANGE, 0, 99999, NULL},
{ "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL},
{ NULL, NULL, 0, 0, 0, 0, NULL }
};
static const struct m_struct_st bluray_stream_opts = {
"bluray",
sizeof(struct stream_priv_s),
&bluray_stream_priv_dflts,
bluray_stream_opts_fields
};
static void bluray_stream_close(stream_t *s)
{
bd_close(s->priv);
s->priv = NULL;
}
static int bluray_stream_seek(stream_t *s, off_t pos)
{
off_t p;
p = bd_seek(s->priv, pos);
if (p == -1)
return 0;
s->pos = p;
return 1;
}
static int bluray_stream_fill_buffer(stream_t *s, char *buf, int len)
{
return bd_read(s->priv, buf, len);
}
static int bluray_stream_open(stream_t *s, int mode,
void *opts, int *file_format)
{
struct stream_priv_s *p = opts;
BLURAY_TITLE_INFO *info = NULL;
BLURAY *bd;
int title, title_guess, title_count;
uint64_t title_size;
unsigned int chapter, angle;
uint64_t max_duration = 0;
int64_t chapter_pos = 0;
char *device = NULL;
int i;
/* find the requested device */
if (p->device)
device = p->device;
else if (bluray_device)
device = bluray_device;
if (!device) {
mp_tmsg(MSGT_OPEN, MSGL_ERR,
"No Blu-ray device/location was specified ...\n");
return STREAM_UNSUPPORTED;
}
/* open device */
bd = bd_open(device, NULL);
if (!bd) {
mp_tmsg(MSGT_OPEN, MSGL_ERR, "Couldn't open Blu-ray device: %s\n",
device);
return STREAM_UNSUPPORTED;
}
/* check for available titles on disc */
title_count = bd_get_titles(bd, TITLES_RELEVANT);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_BLURAY_TITLES=%d\n", title_count);
if (!title_count) {
mp_msg(MSGT_OPEN, MSGL_ERR,
"Can't find any Blu-ray-compatible title here.\n");
bd_close(bd);
return STREAM_UNSUPPORTED;
}
/* parse titles information */
title_guess = BLURAY_DEFAULT_TITLE;
for (i = 0; i < title_count; i++) {
BLURAY_TITLE_INFO *ti;
int sec, msec;
ti = bd_get_title_info(bd, i);
if (!ti)
continue;
sec = ti->duration / 90000;
msec = (ti->duration - sec) % 1000;
mp_msg(MSGT_IDENTIFY, MSGL_INFO,
"ID_BLURAY_TITLE_%d_CHAPTERS=%d\n", i + 1, ti->chapter_count);
mp_msg(MSGT_IDENTIFY, MSGL_INFO,
"ID_BLURAY_TITLE_%d_ANGLE=%d\n", i + 1, ti->angle_count);
mp_msg(MSGT_IDENTIFY, MSGL_V,
"ID_BLURAY_TITLE_%d_LENGTH=%d.%03d\n", i + 1, sec, msec);
/* try to guess which title may contain the main movie */
if (ti->duration > max_duration) {
max_duration = ti->duration;
title_guess = i;
}
bd_free_title_info(ti);
}
/* Select current title */
title = p->title ? p->title - 1: title_guess;
title = FFMIN(title, title_count - 1);
bd_select_title(bd, title);
title_size = bd_get_title_size(bd);
mp_msg(MSGT_IDENTIFY, MSGL_INFO,
"ID_BLURAY_CURRENT_TITLE=%d\n", title + 1);
/* Get current title information */
info = bd_get_title_info(bd, title);
if (!info)
goto err_no_info;
/* Select chapter */
chapter = bluray_chapter ? bluray_chapter : BLURAY_DEFAULT_CHAPTER;
chapter = FFMIN(chapter, info->chapter_count);
if (chapter)
chapter_pos = bd_chapter_pos(bd, chapter);
mp_msg(MSGT_IDENTIFY, MSGL_INFO,
"ID_BLURAY_CURRENT_CHAPTER=%d\n", chapter + 1);
/* Select angle */
angle = bluray_angle ? bluray_angle : BLURAY_DEFAULT_ANGLE;
angle = FFMIN(angle, info->angle_count);
if (angle)
bd_select_angle(bd, angle);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_BLURAY_CURRENT_ANGLE=%d\n", angle + 1);
bd_free_title_info(info);
err_no_info:
s->fill_buffer = bluray_stream_fill_buffer;
s->seek = bluray_stream_seek;
s->close = bluray_stream_close;
s->start_pos = chapter_pos;
s->end_pos = title_size;
s->sector_size = BLURAY_SECTOR_SIZE;
s->flags = mode | MP_STREAM_SEEK;
s->priv = bd;
s->type = STREAMTYPE_BLURAY;
s->url = strdup("br://");
mp_tmsg(MSGT_OPEN, MSGL_V, "Blu-ray successfully opened.\n");
return STREAM_OK;
}
const stream_info_t stream_info_bluray = {
"Blu-ray Disc",
"bd",
"Benjamin Zores",
"Play Blu-ray discs through external libbluray",
bluray_stream_open,
{ "br", "bluray", NULL },
&bluray_stream_opts,
1
};