2014-08-17 23:08:47 +00:00
|
|
|
This file intends to give a big picture overview of how mpv is structured.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2013-12-17 02:35:43 +00:00
|
|
|
player/*.c:
|
2013-10-30 21:35:48 +00:00
|
|
|
Essentially makes up the player applications, including the main() function
|
|
|
|
and the playback loop.
|
|
|
|
|
|
|
|
Generally, it accesses all other subsystems, initializes them, and pushes
|
|
|
|
data between them during playback.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
|
|
|
The structure is as follows (as of commit e13c05366557cb):
|
|
|
|
* main():
|
|
|
|
* basic initializations (e.g. init_libav() and more)
|
|
|
|
* pre-parse command line (verbosity level, config file locations)
|
|
|
|
* load config files (parse_cfgfiles())
|
|
|
|
* parse command line, add files from the command line to playlist
|
|
|
|
(m_config_parse_mp_command_line())
|
|
|
|
* check help options etc. (call handle_help_options()), possibly exit
|
|
|
|
* call play_files() function that works down the playlist:
|
|
|
|
* run idle loop (idle_loop()), until there are files in the
|
2014-07-09 00:14:23 +00:00
|
|
|
playlist or an exit command was given (only if --idle it set)
|
2012-08-26 00:17:11 +00:00
|
|
|
* actually load and play a file in play_current_file():
|
|
|
|
* run all the dozens of functions to load the file and
|
|
|
|
initialize playback
|
|
|
|
* run a small loop that does normal playback, until the file is
|
2014-07-09 00:14:23 +00:00
|
|
|
done or a command terminates playback
|
2012-08-26 00:17:11 +00:00
|
|
|
(on each iteration, run_playloop() is called, which is rather
|
|
|
|
big and complicated - it decodes some audio and video on
|
|
|
|
each frame, waits for input, etc.)
|
|
|
|
* uninitialize playback
|
|
|
|
* determine next entry on the playlist to play
|
|
|
|
* loop, or exit if no next file or quit is requested
|
|
|
|
(see enum stop_play_reason)
|
|
|
|
* call exit_player_with_rc()
|
2014-08-17 23:08:47 +00:00
|
|
|
* run_playloop():
|
|
|
|
* calls fill_audio_out_buffers()
|
|
|
|
This checks whether new audio needs to be decoded, and pushes it
|
|
|
|
to the AO.
|
|
|
|
* calls write_video()
|
|
|
|
Decode new video, and push it to the VO.
|
|
|
|
* determines whether playback of the current file has ended
|
|
|
|
* determines when to start playback after seeks
|
|
|
|
* and calls a whole lot of other stuff
|
|
|
|
(Really, this function does everything.)
|
2012-08-26 00:17:11 +00:00
|
|
|
|
|
|
|
Things worth saying about the playback core:
|
2014-08-17 23:08:47 +00:00
|
|
|
- most state is in MPContext (core.h), which is not available to the
|
|
|
|
subsystems
|
|
|
|
- the currently played tracks are in mpctx->current_tracks, and decoder
|
2017-06-29 15:28:04 +00:00
|
|
|
state in track.d_video/d_audio/d_sub
|
2012-08-26 00:17:11 +00:00
|
|
|
- the other subsystems rarely call back into the frontend, and the frontend
|
|
|
|
polls them instead (probably a good thing)
|
2014-08-17 23:08:47 +00:00
|
|
|
- one exceptions are wakeup callbacks, which notify a "higher" component
|
|
|
|
of a changed situation in a subsystem
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2013-10-30 21:35:48 +00:00
|
|
|
I like to call the player/*.c files the "frontend".
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2017-06-29 15:28:04 +00:00
|
|
|
ta.h & ta.c:
|
|
|
|
Hierarchical memory manager inspired by talloc from Samba. It's like a
|
|
|
|
malloc() with more features. Most importantly, each talloc allocation can
|
|
|
|
have a parent, and if the parent is free'd, all children will be free'd as
|
|
|
|
well. The parent is an arbitrary talloc allocation. It's either set by the
|
|
|
|
allocation call by passing a talloc parent, usually as first argument to the
|
|
|
|
allocation function. It can also be set or reset later by other calls (at
|
|
|
|
least talloc_steal()). A talloc allocation that is used as parent is often
|
|
|
|
called a talloc context.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
|
|
|
One very useful feature of talloc is fast tracking of memory leaks. ("Fast"
|
2015-05-02 17:03:28 +00:00
|
|
|
as in it doesn't require valgrind.) You can enable it by setting the
|
2012-10-11 00:04:08 +00:00
|
|
|
MPV_LEAK_REPORT environment variable to "1":
|
|
|
|
export MPV_LEAK_REPORT=1
|
2012-08-26 00:17:11 +00:00
|
|
|
This will list all unfree'd allocations on exit.
|
|
|
|
|
|
|
|
Documentation can be found here:
|
|
|
|
http://git.samba.org/?p=samba.git;a=blob;f=lib/talloc/talloc.h;hb=HEAD
|
|
|
|
|
2017-06-29 15:28:04 +00:00
|
|
|
For some reason, we're still using API-compatible wrappers instead of TA
|
|
|
|
directly. The talloc wrapper has only a subset of the functionality, and
|
|
|
|
in particular the wrappers abort() on memory allocation failure.
|
|
|
|
|
2013-07-12 23:15:36 +00:00
|
|
|
Note: unlike tcmalloc, jemalloc, etc., talloc() is not actually a malloc
|
|
|
|
replacement. It works on top of system malloc and provides additional
|
|
|
|
features that are supposed to make memory management easier.
|
|
|
|
|
2013-12-17 02:35:43 +00:00
|
|
|
player/command.c:
|
2014-07-09 00:14:23 +00:00
|
|
|
This contains the implementation for client API commands and properties.
|
2013-10-30 21:35:48 +00:00
|
|
|
Properties are essentially dynamic variables changed by certain commands.
|
|
|
|
This is basically responsible for all user commands, like initiating
|
|
|
|
seeking, switching tracks, etc. It calls into other player/*.c files,
|
|
|
|
where most of the work is done, but also calls other parts of mpv.
|
|
|
|
|
2013-12-17 02:35:43 +00:00
|
|
|
player/core.h:
|
2013-10-30 21:35:48 +00:00
|
|
|
Data structures and function prototypes for most of player/*.c. They are
|
|
|
|
usually not accessed by other parts of mpv for the sake of modularization.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2014-07-09 00:14:23 +00:00
|
|
|
player/client.c:
|
|
|
|
This implements the client API (libmpv/client.h). For the most part, this
|
|
|
|
just calls into other parts of the player. This also manages a ringbuffer
|
|
|
|
of events from player to clients.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2013-12-17 02:35:43 +00:00
|
|
|
options/options.h, options/options.c
|
2013-10-30 21:35:48 +00:00
|
|
|
options.h contains the global option struct MPOpts. The option declarations
|
|
|
|
(option names, types, and MPOpts offsets for the option parser) are in
|
|
|
|
options.c. Most default values for options and MPOpts are in
|
|
|
|
mp_default_opts at the end of options.c.
|
|
|
|
|
2014-08-17 23:08:47 +00:00
|
|
|
MPOpts is unfortunately quite monolithic, and virtually accessed by
|
2013-10-30 21:35:48 +00:00
|
|
|
everything.But some components (like video outputs and video filters) have
|
|
|
|
their own sub-option tables separate from MPOpts.
|
|
|
|
|
|
|
|
The actual option parser is spread over m_option.c, m_config.c, and
|
2017-06-29 15:28:04 +00:00
|
|
|
parse_commandline.c, and uses the option table in options.c.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2013-12-17 02:35:43 +00:00
|
|
|
input/input.c:
|
2016-06-25 18:07:38 +00:00
|
|
|
This translates keyboard input coming from VOs and other sources (such
|
2014-07-09 00:14:23 +00:00
|
|
|
as remote control devices like Apple IR or client API commands) to the
|
2012-08-26 00:17:11 +00:00
|
|
|
key bindings listed in the user's (or the builtin) input.conf and turns
|
|
|
|
them into items of type struct mp_cmd. These commands are queued, and read
|
2013-10-30 21:35:48 +00:00
|
|
|
by playloop.c. They get pushed with run_command() to command.c.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2014-07-09 00:14:23 +00:00
|
|
|
Note that keyboard input and commands used by the client API are the same.
|
|
|
|
The client API only uses the command parser though, and has its own queue
|
|
|
|
of input commands somewhere else.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2013-12-17 02:35:43 +00:00
|
|
|
common/msg.h:
|
2014-08-17 23:08:47 +00:00
|
|
|
All terminal output must go through mp_msg().
|
2012-08-26 00:17:11 +00:00
|
|
|
|
|
|
|
stream/*:
|
|
|
|
File input is implemented here. stream.h/.c provides a simple stream based
|
2013-07-12 23:15:36 +00:00
|
|
|
interface (like reading a number of bytes at a given offset). mpv can
|
2012-08-26 00:17:11 +00:00
|
|
|
also play from http streams and such, which is implemented here.
|
|
|
|
|
2013-07-12 23:15:36 +00:00
|
|
|
E.g. if mpv sees "http://something" on the command line, it will pick
|
|
|
|
stream_lavf.c based on the prefix, and pass the rest of the filename to it.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
|
|
|
Some stream inputs are quite special: stream_dvd.c turns DVDs into mpeg
|
|
|
|
streams (DVDs are actually a bunch of vob files etc. on a filesystem),
|
|
|
|
stream_tv.c provides TV input including channel switching.
|
|
|
|
|
|
|
|
Some stream inputs are just there to invoke special demuxers, like
|
|
|
|
stream_mf.c. (Basically to make the prefix "mf://" do something special.)
|
|
|
|
|
2012-11-09 00:06:43 +00:00
|
|
|
demux/:
|
2012-08-26 00:17:11 +00:00
|
|
|
Demuxers split data streams into audio/video/sub streams, which in turn
|
2013-07-12 23:15:36 +00:00
|
|
|
are split in packets. Packets (see demux_packet.h) are mostly byte chunks
|
|
|
|
tagged with a playback time (PTS). These packets are passed to the decoders.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
|
|
|
Most demuxers have been removed from this fork, and the only important and
|
|
|
|
"actual" demuxers left are demux_mkv.c and demux_lavf.c (uses libavformat).
|
2017-06-29 15:28:04 +00:00
|
|
|
There are some pseudo demuxers like demux_cue.c.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2013-07-12 23:15:36 +00:00
|
|
|
The main interface is in demux.h. The stream headers are in stheader.h.
|
|
|
|
There is a stream header for each audio/video/sub stream, and each of them
|
|
|
|
holds codec information about the stream and other information.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2019-10-02 17:20:51 +00:00
|
|
|
demux.c is a bit big, the main reason being that it contains the demuxer
|
|
|
|
cache, which is implemented as a list of packets. The cache is complex
|
|
|
|
because it support seeking, multiple ranges, prefetching, and so on.
|
|
|
|
|
2012-11-09 00:06:43 +00:00
|
|
|
video/:
|
2013-07-12 23:15:36 +00:00
|
|
|
This contains several things related to audio/video decoding, as well as
|
2012-08-26 00:17:11 +00:00
|
|
|
video filters.
|
|
|
|
|
2013-07-12 23:15:36 +00:00
|
|
|
mp_image.h and img_format.h define how mpv stores decoded video frames
|
2012-08-26 00:17:11 +00:00
|
|
|
internally.
|
|
|
|
|
2012-11-09 00:06:43 +00:00
|
|
|
video/decode/:
|
2017-06-29 15:28:04 +00:00
|
|
|
vd_*.c are video decoders. (There's only vd_lavc.c left.) dec_video.c
|
|
|
|
handles most of connecting the frontend with the actual decoder.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2012-11-09 00:06:43 +00:00
|
|
|
video/filter/:
|
2012-08-26 00:17:11 +00:00
|
|
|
vf_*.c and vf.c form the video filter chain. They are fed by the video
|
|
|
|
decoder, and output the filtered images to the VOs though vf_vo.c. By
|
2013-07-12 23:15:36 +00:00
|
|
|
default, no video filters (except vf_vo) are used. vf_scale is automatically
|
|
|
|
inserted if the video output can't handle the video format used by the
|
|
|
|
decoder.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2012-11-09 00:06:43 +00:00
|
|
|
video/out/:
|
2012-08-26 00:17:11 +00:00
|
|
|
Video output. They also create GUI windows and handle user input. In most
|
|
|
|
cases, the windowing code is shared among VOs, like x11_common.c for X11 and
|
|
|
|
w32_common.c for Windows. The VOs stand between frontend and windowing code.
|
2018-01-20 15:10:42 +00:00
|
|
|
vo_gpu can pick a windowing system at runtime, e.g. the same binary can
|
2012-08-26 00:17:11 +00:00
|
|
|
provide both X11 and Cocoa support on OSX.
|
|
|
|
|
2017-06-29 15:28:04 +00:00
|
|
|
VOs can be reconfigured at runtime. A vo_reconfig() call can change the video
|
2012-08-26 00:17:11 +00:00
|
|
|
resolution and format, without destroying the window.
|
|
|
|
|
2018-01-20 15:10:42 +00:00
|
|
|
vo_gpu should be taken as reference.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2012-11-09 00:06:43 +00:00
|
|
|
audio/:
|
2013-07-12 23:15:36 +00:00
|
|
|
format.h/format.c define the uncompressed audio formats. (As well as some
|
|
|
|
compressed formats used for spdif.)
|
2012-11-09 00:06:43 +00:00
|
|
|
|
|
|
|
audio/decode/:
|
2017-06-29 15:28:04 +00:00
|
|
|
ad_*.c and dec_audio.c handle audio decoding. ad_lavc.c is the
|
2013-07-12 23:15:36 +00:00
|
|
|
decoder using ffmpeg. ad_spdif.c is not really a decoder, but is used for
|
|
|
|
compressed audio passthrough.
|
2012-11-09 00:06:43 +00:00
|
|
|
|
|
|
|
audio/filter/:
|
2013-07-12 23:15:36 +00:00
|
|
|
Audio filter chain. af_lavrresample is inserted if any form of conversion
|
2017-06-29 15:28:04 +00:00
|
|
|
between audio formats is needed.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2012-11-09 00:06:43 +00:00
|
|
|
audio/out/:
|
|
|
|
Audio outputs.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2014-08-17 23:08:47 +00:00
|
|
|
Unlike VOs, AOs can't be reconfigured on a format change. On audio format
|
|
|
|
changes, the AO will simply be closed and re-opened.
|
|
|
|
|
|
|
|
There are wrappers to support for two types of audio APIs: push.c and
|
|
|
|
pull.c. ao.c calls into one of these. They contain generic code to deal
|
|
|
|
with the data flow these APIs impose.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
2013-07-12 23:15:36 +00:00
|
|
|
Note that mpv synchronizes the video to the audio. That's the reason
|
2012-08-26 00:17:11 +00:00
|
|
|
why buggy audio drivers can have a bad influence on playback quality.
|
|
|
|
|
|
|
|
sub/:
|
2013-06-24 22:32:38 +00:00
|
|
|
Contains subtitle and OSD rendering.
|
2013-06-04 22:28:15 +00:00
|
|
|
|
2014-07-09 00:14:23 +00:00
|
|
|
osd.c/.h is actually the OSD code. It queries dec_sub.c to retrieve
|
2013-06-04 22:28:15 +00:00
|
|
|
decoded/rendered subtitles. osd_libass.c is the actual implementation of
|
|
|
|
the OSD text renderer (which uses libass, and takes care of all the tricky
|
|
|
|
fontconfig/freetype API usage and text layouting).
|
|
|
|
|
2014-08-17 23:08:47 +00:00
|
|
|
The VOs call osd.c to render OSD and subtitle (via e.g. osd_draw()). osd.c
|
|
|
|
in turn asks dec_sub.c for subtitle overlay bitmaps, which relays the
|
|
|
|
request to one of the sd_*.c subtitle decoders/renderers.
|
|
|
|
|
|
|
|
Subtitle loading is in demux/. The MPlayer subreader.c is mostly gone - parts
|
|
|
|
of it survive in demux_subreader.c. It's used as last fallback, or to handle
|
|
|
|
some text subtitle types on Libav. It should go away eventually. Normally,
|
|
|
|
subtitles are loaded via demux_lavf.c.
|
2013-06-24 22:32:38 +00:00
|
|
|
|
|
|
|
The subtitles are passed to dec_sub.c and the subtitle decoders in sd_*.c
|
|
|
|
as they are demuxed. All text subtitles are rendered by sd_ass.c. If text
|
2017-06-29 15:28:04 +00:00
|
|
|
subtitles are not in the ASS format, the libavcodec subtitle converters are
|
|
|
|
used (lavc_conv.c).
|
2013-06-24 22:32:38 +00:00
|
|
|
|
|
|
|
Text subtitles can be preloaded, in which case they are read fully as soon
|
2017-06-29 15:28:04 +00:00
|
|
|
as the subtitle is selected. In this case, they are effectively stored in
|
|
|
|
sd_ass.c's internal state.
|
2012-08-26 00:17:11 +00:00
|
|
|
|
|
|
|
etc/:
|
core: redo how codecs are mapped, remove codecs.conf
Use codec names instead of FourCCs to identify codecs. Rewrite how
codecs are selected and initialized. Now each decoder exports a list
of decoders (and the codec it supports) via add_decoders(). The order
matters, and the first decoder for a given decoder is preferred over
the other decoders. E.g. all ad_mpg123 decoders are preferred over
ad_lavc, because it comes first in the mpcodecs_ad_drivers array.
Likewise, decoders within ad_lavc that are enumerated first by
libavcodec (using av_codec_next()) are preferred. (This is actually
critical to select h264 software decoding by default instead of vdpau.
libavcodec and ffmpeg/avconv use the same method to select decoders by
default, so we hope this is sane.)
The codec names follow libavcodec's codec names as defined by
AVCodecDescriptor.name (see libavcodec/codec_desc.c). Some decoders
have names different from the canonical codec name. The AVCodecDescriptor
API is relatively new, so we need a compatibility layer for older
libavcodec versions for codec names that are referenced internally,
and which are different from the decoder name. (Add a configure check
for that, because checking versions is getting way too messy.)
demux/codec_tags.c is generated from the former codecs.conf (minus
"special" decoders like vdpau, and excluding the mappings that are the
same as the mappings libavformat's exported RIFF tables). It contains
all the mappings from FourCCs to codec name. This is needed for
demux_mkv, demux_mpg, demux_avi and demux_asf. demux_lavf will set the
codec as determined by libavformat, while the other demuxers have to do
this on their own, using the mp_set_audio/video_codec_from_tag()
functions. Note that the sh_audio/video->format members don't uniquely
identify the codec anymore, and sh->codec takes over this role.
Replace the --ac/--vc/--afm/--vfm with new --vd/--ad options, which
provide cover the functionality of the removed switched.
Note: there's no CODECS_FLAG_FLIP flag anymore. This means some obscure
container/video combinations (e.g. the sample Film_200_zygo_pro.mov)
are played flipped. ffplay/avplay doesn't handle this properly either,
so we don't care and blame ffmeg/libav instead.
2013-02-09 14:15:19 +00:00
|
|
|
The file input.conf is actually integrated into the mpv binary by the
|
|
|
|
build system. It contains the default keybindings.
|