libavformat/dvdvideo: add DVD-Video demuxer, powered by libdvdread and libdvdnav
Signed-off-by: Marth64 <marth64@proxyid.net> Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:
parent
b95c0d93ff
commit
a1304272c3
@ -29,6 +29,7 @@ version <next>:
|
|||||||
build environment if it lacks C17 support
|
build environment if it lacks C17 support
|
||||||
- Change the default bitrate control method from VBR to CQP for QSV encoders.
|
- Change the default bitrate control method from VBR to CQP for QSV encoders.
|
||||||
- removed deprecated ffmpeg CLI options -psnr and -map_channel
|
- removed deprecated ffmpeg CLI options -psnr and -map_channel
|
||||||
|
- DVD-Video demuxer, powered by libdvdnav and libdvdread
|
||||||
|
|
||||||
version 6.1:
|
version 6.1:
|
||||||
- libaribcaption decoder
|
- libaribcaption decoder
|
||||||
|
8
configure
vendored
8
configure
vendored
@ -227,6 +227,8 @@ External library support:
|
|||||||
--enable-libdavs2 enable AVS2 decoding via libdavs2 [no]
|
--enable-libdavs2 enable AVS2 decoding via libdavs2 [no]
|
||||||
--enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
|
--enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
|
||||||
and libraw1394 [no]
|
and libraw1394 [no]
|
||||||
|
--enable-libdvdnav enable libdvdnav, needed for DVD demuxing [no]
|
||||||
|
--enable-libdvdread enable libdvdread, needed for DVD demuxing [no]
|
||||||
--enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no]
|
--enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no]
|
||||||
--enable-libflite enable flite (voice synthesis) support via libflite [no]
|
--enable-libflite enable flite (voice synthesis) support via libflite [no]
|
||||||
--enable-libfontconfig enable libfontconfig, useful for drawtext filter [no]
|
--enable-libfontconfig enable libfontconfig, useful for drawtext filter [no]
|
||||||
@ -1806,6 +1808,8 @@ EXTERNAL_LIBRARY_GPL_LIST="
|
|||||||
frei0r
|
frei0r
|
||||||
libcdio
|
libcdio
|
||||||
libdavs2
|
libdavs2
|
||||||
|
libdvdnav
|
||||||
|
libdvdread
|
||||||
librubberband
|
librubberband
|
||||||
libvidstab
|
libvidstab
|
||||||
libx264
|
libx264
|
||||||
@ -3526,6 +3530,8 @@ dts_demuxer_select="dca_parser"
|
|||||||
dtshd_demuxer_select="dca_parser"
|
dtshd_demuxer_select="dca_parser"
|
||||||
dv_demuxer_select="dvprofile"
|
dv_demuxer_select="dvprofile"
|
||||||
dv_muxer_select="dvprofile"
|
dv_muxer_select="dvprofile"
|
||||||
|
dvdvideo_demuxer_select="mpegps_demuxer"
|
||||||
|
dvdvideo_demuxer_deps="libdvdnav libdvdread"
|
||||||
dxa_demuxer_select="riffdec"
|
dxa_demuxer_select="riffdec"
|
||||||
eac3_demuxer_select="ac3_parser"
|
eac3_demuxer_select="ac3_parser"
|
||||||
evc_demuxer_select="evc_frame_merge_bsf evc_parser"
|
evc_demuxer_select="evc_frame_merge_bsf evc_parser"
|
||||||
@ -6775,6 +6781,8 @@ 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 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 libdc1394 && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
|
||||||
enabled libdrm && check_pkg_config libdrm libdrm xf86drm.h drmGetVersion
|
enabled libdrm && check_pkg_config libdrm libdrm xf86drm.h drmGetVersion
|
||||||
|
enabled libdvdnav && require_pkg_config libdvdnav "dvdnav >= 6.1.1" dvdnav/dvdnav.h dvdnav_open2
|
||||||
|
enabled libdvdread && require_pkg_config libdvdread "dvdread >= 6.1.2" dvdread/dvd_reader.h DVDOpen2 -ldvdread
|
||||||
enabled libfdk_aac && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
|
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 &&
|
{ require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
|
||||||
warn "using libfdk without pkg-config"; } }
|
warn "using libfdk without pkg-config"; } }
|
||||||
|
@ -285,6 +285,136 @@ This demuxer accepts the following option:
|
|||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@section dvdvideo
|
||||||
|
|
||||||
|
DVD-Video demuxer, powered by libdvdnav and libdvdread.
|
||||||
|
|
||||||
|
Can directly ingest DVD titles, specifically sequential PGCs,
|
||||||
|
into a conversion pipeline. Menus and seeking are not supported at this time.
|
||||||
|
|
||||||
|
Block devices (DVD drives), ISO files, and directory structures are accepted.
|
||||||
|
Activate with @code{-f dvdvideo} in front of one of these inputs.
|
||||||
|
|
||||||
|
Underlying playback is handled by libdvdnav, and structure parsing by libdvdread.
|
||||||
|
FFmpeg must be built with GPL library support available as well as the
|
||||||
|
configure switches @code{--enable-libdvdnav} and @code{--enable-libdvdread}.
|
||||||
|
|
||||||
|
You will need to provide either the desired "title number" or exact PGC/PG coordinates.
|
||||||
|
Many open-source DVD players and tools can aid in providing this information.
|
||||||
|
If not specified, the demuxer will default to title 1 which works for many discs.
|
||||||
|
However, due to the flexibility of the format, it is recommended to check manually.
|
||||||
|
There are many discs that are authored strangely or with invalid headers.
|
||||||
|
|
||||||
|
If the input is a real DVD drive, please note that there are some drives which may
|
||||||
|
silently fail on reading bad sectors from the disc, returning random bits instead
|
||||||
|
which is effectively corrupt data. This is especially prominent on aging or rotting discs.
|
||||||
|
A second pass and integrity checks would be needed to detect the corruption.
|
||||||
|
This is not an FFmpeg issue.
|
||||||
|
|
||||||
|
@subsection Background
|
||||||
|
|
||||||
|
DVD-Video is not a directly accessible, linear container format in the
|
||||||
|
traditional sense. Instead, it allows for complex and programmatic playback of
|
||||||
|
carefully muxed MPEG-PS streams that are stored in headerless VOB files.
|
||||||
|
To the end-user, these streams are known simply as "titles", but the actual
|
||||||
|
logical playback sequence is defined by one or more "PGCs", or Program Group Chains,
|
||||||
|
within the title. The PGC is in turn comprised of multiple "PGs", or Programs",
|
||||||
|
which are the actual video segments (and for a typical video feature, sequentially
|
||||||
|
ordered). The PGC structure, along with stream layout and metadata, are stored in
|
||||||
|
IFO files that need to be parsed. PGCs can be thought of as playlists in easier terms.
|
||||||
|
|
||||||
|
An actual DVD player relies on user GUI interaction via menus and an internal VM
|
||||||
|
to drive the direction of demuxing. Generally, the user would either navigate (via menus)
|
||||||
|
or automatically be redirected to the PGC of their choice. During this process and
|
||||||
|
the subsequent playback, the DVD player's internal VM also maintains a state and
|
||||||
|
executes instructions that can create jumps to different sectors during playback.
|
||||||
|
This is why libdvdnav is involved, as a linear read of the MPEG-PS blobs on the
|
||||||
|
disc (VOBs) is not enough to produce the right sequence in many cases.
|
||||||
|
|
||||||
|
There are many other DVD structures (a long subject) that will not be discussed here.
|
||||||
|
NAV packets, in particular, are handled by this demuxer to build accurate timing
|
||||||
|
but not emitted as a stream. For a good high-level understanding, refer to:
|
||||||
|
@url{https://code.videolan.org/videolan/libdvdnav/-/blob/master/doc/dvd_structures}
|
||||||
|
|
||||||
|
@subsection Options
|
||||||
|
|
||||||
|
This demuxer accepts the following options:
|
||||||
|
|
||||||
|
@table @option
|
||||||
|
|
||||||
|
@item title @var{int}
|
||||||
|
The title number to play. Must be set if @option{pgc} and @option{pg} are not set.
|
||||||
|
Default is 0 (auto), which currently only selects the first available title (title 1)
|
||||||
|
and notifies the user about the implications.
|
||||||
|
|
||||||
|
@item chapter_start @var{int}
|
||||||
|
The chapter, or PTT (part-of-title), number to start at. Default is 1.
|
||||||
|
|
||||||
|
@item chapter_end @var{int}
|
||||||
|
The chapter, or PTT (part-of-title), number to end at. Default is 0,
|
||||||
|
which is a special value to signal end at the last possible chapter.
|
||||||
|
|
||||||
|
@item angle @var{int}
|
||||||
|
The video angle number, referring to what is essentially an additional
|
||||||
|
video stream that is composed from alternate frames interleaved in the VOBs.
|
||||||
|
Default is 1.
|
||||||
|
|
||||||
|
@item region @var{int}
|
||||||
|
The region code to use for playback. Some discs may use this to default playback
|
||||||
|
at a particular angle in different regions. This option will not affect the region code
|
||||||
|
of a real DVD drive, if used as an input. Default is 0, "world".
|
||||||
|
|
||||||
|
@item pgc @var{int}
|
||||||
|
The entry PGC to start playback, in conjunction with @option{pg}.
|
||||||
|
Alternative to setting @option{title}.
|
||||||
|
Chapter markers are not supported at this time.
|
||||||
|
Default is 0, automatically resolve from value of @option{title}.
|
||||||
|
|
||||||
|
@item pg @var{int}
|
||||||
|
The entry PG to start playback, in conjunction with @option{pgc}.
|
||||||
|
Alternative to setting @option{title}.
|
||||||
|
Chapter markers are not supported at this time.
|
||||||
|
Default is 0, automatically resolve from value of @option{title}.
|
||||||
|
|
||||||
|
@item preindex @var{bool}
|
||||||
|
Enable this to have accurate chapter (PTT) markers and duration measurement,
|
||||||
|
which requires a slow second pass read in order to index the chapter marker
|
||||||
|
timestamps from NAV packets. This is non-ideal extra work for real optical drives.
|
||||||
|
It is recommended and faster to use this option with a backup of the DVD structure
|
||||||
|
stored on a hard drive. Not compatible with @option{pgc} and @option{pg}.
|
||||||
|
Default is 0, false.
|
||||||
|
|
||||||
|
@item trim @var{bool}
|
||||||
|
Skip padding cells (i.e. cells shorter than 1 second) from the beginning.
|
||||||
|
There exist many discs with filler segments at the beginning of the PGC,
|
||||||
|
often with junk data intended for controlling a real DVD player's
|
||||||
|
buffering speed and with no other material data value.
|
||||||
|
Default is 1, true.
|
||||||
|
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@subsection Examples
|
||||||
|
|
||||||
|
@itemize
|
||||||
|
@item
|
||||||
|
Open title 3 from a given DVD structure:
|
||||||
|
@example
|
||||||
|
ffmpeg -f dvdvideo -title 3 -i <path to DVD> ...
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@item
|
||||||
|
Open chapters 3-6 from title 1 from a given DVD structure:
|
||||||
|
@example
|
||||||
|
ffmpeg -f dvdvideo -chapter_start 3 -chapter_end 6 -title 1 -i <path to DVD> ...
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@item
|
||||||
|
Open only chapter 5 from title 1 from a given DVD structure:
|
||||||
|
@example
|
||||||
|
ffmpeg -f dvdvideo -chapter_start 5 -chapter_end 5 -title 1 -i <path to DVD> ...
|
||||||
|
@end example
|
||||||
|
@end itemize
|
||||||
|
|
||||||
@section ea
|
@section ea
|
||||||
|
|
||||||
Electronic Arts Multimedia format demuxer.
|
Electronic Arts Multimedia format demuxer.
|
||||||
|
@ -194,6 +194,7 @@ OBJS-$(CONFIG_DTS_MUXER) += rawenc.o
|
|||||||
OBJS-$(CONFIG_DV_MUXER) += dvenc.o
|
OBJS-$(CONFIG_DV_MUXER) += dvenc.o
|
||||||
OBJS-$(CONFIG_DVBSUB_DEMUXER) += dvbsub.o rawdec.o
|
OBJS-$(CONFIG_DVBSUB_DEMUXER) += dvbsub.o rawdec.o
|
||||||
OBJS-$(CONFIG_DVBTXT_DEMUXER) += dvbtxt.o rawdec.o
|
OBJS-$(CONFIG_DVBTXT_DEMUXER) += dvbtxt.o rawdec.o
|
||||||
|
OBJS-$(CONFIG_DVDVIDEO_DEMUXER) += dvdvideodec.o
|
||||||
OBJS-$(CONFIG_DXA_DEMUXER) += dxa.o
|
OBJS-$(CONFIG_DXA_DEMUXER) += dxa.o
|
||||||
OBJS-$(CONFIG_EA_CDATA_DEMUXER) += eacdata.o
|
OBJS-$(CONFIG_EA_CDATA_DEMUXER) += eacdata.o
|
||||||
OBJS-$(CONFIG_EA_DEMUXER) += electronicarts.o
|
OBJS-$(CONFIG_EA_DEMUXER) += electronicarts.o
|
||||||
|
@ -150,6 +150,7 @@ extern const AVInputFormat ff_dv_demuxer;
|
|||||||
extern const FFOutputFormat ff_dv_muxer;
|
extern const FFOutputFormat ff_dv_muxer;
|
||||||
extern const AVInputFormat ff_dvbsub_demuxer;
|
extern const AVInputFormat ff_dvbsub_demuxer;
|
||||||
extern const AVInputFormat ff_dvbtxt_demuxer;
|
extern const AVInputFormat ff_dvbtxt_demuxer;
|
||||||
|
extern const AVInputFormat ff_dvdvideo_demuxer;
|
||||||
extern const AVInputFormat ff_dxa_demuxer;
|
extern const AVInputFormat ff_dxa_demuxer;
|
||||||
extern const AVInputFormat ff_ea_demuxer;
|
extern const AVInputFormat ff_ea_demuxer;
|
||||||
extern const AVInputFormat ff_ea_cdata_demuxer;
|
extern const AVInputFormat ff_ea_cdata_demuxer;
|
||||||
|
1411
libavformat/dvdvideodec.c
Normal file
1411
libavformat/dvdvideodec.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user