[FFmpeg-devel] [PATCH v2] Adds DVD protocol
James Almer
jamrial at gmail.com
Wed Jan 5 16:44:46 EET 2022
On 1/5/2022 11:04 AM, Lucien Murray-Pitts wrote:
> Copies the existing Bluray protocol format to add DVD protocol support
> using
> libdvdnav. Since title selection is mandatory ffprobe cant provide
> information
> for the complete disk but a single title only. Chapter information for
> probe
> will also be missing. To see a complete disk catalog of
> titles/chapters the
> tools/dvd2concat perl script should be used.
>
> Signed-off-by: Lucien Murray-Pitts <lucien.murraypitts at gmail.com>
> ---
> configure | 4 +
> libavformat/Makefile | 1 +
> libavformat/dvd.c | 264 ++++++++++++++++++++++++++++++++++++++++
> libavformat/protocols.c | 1 +
> 4 files changed, 270 insertions(+)
> create mode 100644 libavformat/dvd.c
>
> diff --git a/configure b/configure
> index 8392c26015..7f8b0046d2 100755
> --- a/configure
> +++ b/configure
> @@ -230,6 +230,7 @@ External library support:
> --enable-libdavs2 enable AVS2 decoding via libdavs2 [no]
> --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
> and libraw1394 [no]
> + --enable-libdvdnav enable DVD reading using libdvdnav [no]
> --enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no]
> --enable-libflite enable flite (voice synthesis) support via
> libflite [no]
> --enable-libfontconfig enable libfontconfig, useful for drawtext
> filter [no]
> @@ -1822,6 +1823,7 @@ EXTERNAL_LIBRARY_LIST="
> libdav1d
> libdc1394
> libdrm
> + libdvdnav
> libflite
> libfontconfig
> libfreetype
> @@ -3539,6 +3541,7 @@ xv_outdev_deps="xlib_xv xlib_x11 xlib_xext"
> # protocols
> async_protocol_deps="threads"
> bluray_protocol_deps="libbluray"
> +dvd_protocol_deps="libdvdnav"
> ffrtmpcrypt_protocol_conflict="librtmp_protocol"
> ffrtmpcrypt_protocol_deps_any="gcrypt gmp openssl mbedtls"
> ffrtmpcrypt_protocol_select="tcp_protocol"
> @@ -6526,6 +6529,7 @@ enabled libdav1d && require_pkg_config
> libdav1d "dav1d >= 0.5.0" "dav1d
> enabled libdavs2 && require_pkg_config libdavs2 "davs2 >=
> 1.6.0" davs2.h davs2_decoder_open
> enabled libdc1394 && require_pkg_config libdc1394 libdc1394-2
> dc1394/dc1394.h dc1394_new
> enabled libdrm && require_pkg_config libdrm libdrm
> xf86drm.h drmGetVersion
> +enabled libdvdnav && require_pkg_config libdvdnav dvdnav
> dvdnav/dvdnav.h dvdnav_open
> enabled libfdk_aac && { check_pkg_config libfdk_aac fdk-aac
> "fdk-aac/aacenc_lib.h" aacEncOpen ||
> { require libfdk_aac
> fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
> warn "using libfdk without
> pkg-config"; } }
> diff --git a/libavformat/Makefile b/libavformat/Makefile
> index c479ea998e..5fbba89e36 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
> @@ -627,6 +627,7 @@ OBJS-$(CONFIG_CONCAT_PROTOCOL) += concat.o
> OBJS-$(CONFIG_CONCATF_PROTOCOL) += concat.o
> OBJS-$(CONFIG_CRYPTO_PROTOCOL) += crypto.o
> OBJS-$(CONFIG_DATA_PROTOCOL) += data_uri.o
> +OBJS-$(CONFIG_DVD_PROTOCOL) += dvd.o
> OBJS-$(CONFIG_FFRTMPCRYPT_PROTOCOL) += rtmpcrypt.o rtmpdigest.o
> rtmpdh.o
> OBJS-$(CONFIG_FFRTMPHTTP_PROTOCOL) += rtmphttp.o
> OBJS-$(CONFIG_FILE_PROTOCOL) += file.o
> diff --git a/libavformat/dvd.c b/libavformat/dvd.c
> new file mode 100644
> index 0000000000..b3bc1b95e4
> --- /dev/null
> +++ b/libavformat/dvd.c
> @@ -0,0 +1,264 @@
> +/*
> + * DVD (libdvdnav) protocol based on BluRay (libbluray) protocol by
> Petri Hintukainen.
> + *
> + * Copyright (c) 2022 Lucien Murray-Pitts <lucien.murraypitts <at>
> gmail.com>
> + *
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg 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
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301 USA
> + */
> +
> +
> +/*
> + * REFERENCES:
> https://code.videolan.org/videolan/libdvdnav/-/blob/master/src/dvdnav/dvdnav.h
>
> + *
> https://code.videolan.org/videolan/libdvdnav/-/blob/master/examples/menus.c
> + *
> + * EXAMPLE USE:
> + * Choose Title 4, map 1/2/3 (video/audio/subtitles), copy the
> subtitles as is into mkv
> + * ./ffmpeg -playlist 4 -i dvd:"/mnt/MURDER_SHE_WROTE_TS.S10D1" -map
> 0:1 -map 0:2 -map 0:3 -vb 20M -codec:s copy remuxed-dvd.mkv
> + *
> + * Probe for info
> + * ./ffprobe -loglevel trace -fdebug 8 -playlist 19 -i
> dvd:"/mnt/MURDER_SHE_WROTE_TS.S10D1" -threads 0 -v warning -print_format
> json -show_streams -show_chapters -show_format
This should be added to doc/protocols.texi, not here.
> + */
> +#include <dvdnav/dvdnav.h>
> +
> +#include "libavutil/avstring.h"
> +#include "libavformat/avformat.h"
> +#include "libavformat/url.h"
> +#include "libavutil/opt.h"
> +
> +#define DVD_PROTO_PREFIX "dvd:"
> +
> +typedef struct {
> + const AVClass *class;
> +
> + dvdnav_t *dvdnav;
> +
> + int playlist;
> + int angle;
> + int chapter;
> + /*int region;*/
> +} DVDContext;
> +
> +#define OFFSET(x) offsetof(DVDContext, x)
> +static const AVOption options[] = {
> +{"playlist", "DVD title to play", OFFSET(playlist), AV_OPT_TYPE_INT, {
> .i64=-1 }, -1, 99999, AV_OPT_FLAG_DECODING_PARAM },
> +{"angle", "DVD Video stream angle", OFFSET(angle),
> AV_OPT_TYPE_INT, { .i64=0 }, 0, 0xfe, AV_OPT_FLAG_DECODING_PARAM },
> +{"chapter", "DVD Chapter to play", OFFSET(chapter), AV_OPT_TYPE_INT,
> { .i64=1 }, 1, 0xfffe, AV_OPT_FLAG_DECODING_PARAM },
> +/*{"region", "dvd player region code (1 = region A, 2 = region B, 4 =
> region C)", OFFSET(region), AV_OPT_TYPE_INT, { .i64=0 }, 0, 3,
> AV_OPT_FLAG_DECODING_PARAM },*/
Don't add commented out code, especially when the description doesn't
even apply to this protocol.
More information about the ffmpeg-devel
mailing list