2009-05-08 21:51:13 +00:00
|
|
|
/*
|
2015-04-13 07:36:54 +00:00
|
|
|
* This file is part of mpv.
|
2009-05-08 21:51:13 +00:00
|
|
|
*
|
2015-04-13 07:36:54 +00:00
|
|
|
* mpv is free software; you can redistribute it and/or modify
|
2009-05-08 21:51:13 +00:00
|
|
|
* 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.
|
|
|
|
*
|
2015-04-13 07:36:54 +00:00
|
|
|
* mpv is distributed in the hope that it will be useful,
|
2009-05-08 21:51:13 +00:00
|
|
|
* 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
|
2015-04-13 07:36:54 +00:00
|
|
|
* with mpv. If not, see <http://www.gnu.org/licenses/>.
|
2009-05-08 21:51:13 +00:00
|
|
|
*/
|
|
|
|
|
2008-02-22 09:09:46 +00:00
|
|
|
#ifndef MPLAYER_STHEADER_H
|
|
|
|
#define MPLAYER_STHEADER_H
|
2002-03-03 18:47:29 +00:00
|
|
|
|
2011-01-16 18:03:08 +00:00
|
|
|
#include <stdbool.h>
|
|
|
|
|
2013-12-17 01:39:45 +00:00
|
|
|
#include "common/common.h"
|
2013-04-06 20:43:12 +00:00
|
|
|
#include "audio/chmap.h"
|
2014-09-25 00:22:44 +00:00
|
|
|
|
2008-04-16 01:23:38 +00:00
|
|
|
struct MPOpts;
|
2009-04-19 14:37:03 +00:00
|
|
|
struct demuxer;
|
2002-09-22 00:43:14 +00:00
|
|
|
|
|
|
|
// Stream headers:
|
2002-01-16 12:24:36 +00:00
|
|
|
|
2012-08-03 10:24:55 +00:00
|
|
|
struct sh_stream {
|
|
|
|
enum stream_type type;
|
|
|
|
// Index into demuxer->streams.
|
|
|
|
int index;
|
2013-04-29 20:34:36 +00:00
|
|
|
// Demuxer/format specific ID. Corresponds to the stream IDs as encoded in
|
|
|
|
// some file formats (e.g. MPEG), or an index chosen by demux.c.
|
2012-08-03 10:24:55 +00:00
|
|
|
int demuxer_id;
|
2014-10-21 11:16:48 +00:00
|
|
|
// FFmpeg stream index (AVFormatContext.streams[index]), or equivalent.
|
|
|
|
int ff_index;
|
2012-08-03 10:24:55 +00:00
|
|
|
// One of these is non-NULL, the others are NULL, depending on the stream
|
|
|
|
// type.
|
|
|
|
struct sh_audio *audio;
|
|
|
|
struct sh_video *video;
|
|
|
|
struct sh_sub *sub;
|
|
|
|
|
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
|
|
|
// E.g. "h264" (usually corresponds to AVCodecDescriptor.name)
|
|
|
|
const char *codec;
|
|
|
|
|
2013-11-23 20:37:56 +00:00
|
|
|
// Usually a FourCC, exact meaning depends on codec.
|
|
|
|
unsigned int format;
|
|
|
|
|
2014-10-12 18:22:47 +00:00
|
|
|
// Codec specific header data (set by demux_lavf.c only)
|
demux_lavf, ad_lavc, vd_lavc: pass codec header data directly
Instead of putting codec header data into WAVEFORMATEX and
BITMAPINFOHEADER, pass it directly via AVCodecContext. To do this, we
add mp_copy_lav_codec_headers(), which copies the codec header data
from one AVCodecContext to another (originally, the plan was to use
avcodec_copy_context() for this, but it looks like this would turn
decoder initialization into an even worse mess).
Get rid of the silly CodecID <-> codec_tag mapping. This was originally
needed for codecs.conf: codec tags were used to identify codecs, but
libavformat didn't always return useful codec tags (different file
formats can have different, overlapping tag numbers). Since we don't
go through WAVEFORMATEX etc. and pass all header data directly via
AVCodecContext, we can be absolutely sure that the codec tag mapping is
not needed anymore.
Note that this also destroys the "standard" MPlayer method of exporting
codec header data. WAVEFORMATEX and BITMAPINFOHEADER made sure that
other non-libavcodec decoders could be initialized. However, all these
decoders have been removed, so this is just cruft full of old hacks that
are not needed anymore. There's still ad_spdif and ad_mpg123, bu neither
of these need codec header data. Should we ever add non-libavcodec
decoders, better data structures without the past hacks could be added
to export the headers.
2013-02-09 14:15:37 +00:00
|
|
|
struct AVCodecContext *lav_headers;
|
2012-10-28 23:06:51 +00:00
|
|
|
|
2012-08-03 10:24:55 +00:00
|
|
|
char *title;
|
2013-02-09 14:15:28 +00:00
|
|
|
char *lang; // language code
|
2012-12-10 17:52:06 +00:00
|
|
|
bool default_track; // container default track flag
|
2014-09-01 21:47:27 +00:00
|
|
|
int hls_bitrate;
|
core: completely change handling of attached picture pseudo video
Before this commit, we tried to play along with libavformat and tried
to pretend that attached pictures are video streams with a single
frame, and that the frame magically appeared at the seek position when
seeking. The playback core would then switch to a mode where the video
has ended, and the "remaining" audio is played.
This didn't work very well:
- we needed a hack in demux.c, because we tried to read more packets in
order to find the "next" video frame (libavformat doesn't tell us if
a stream has ended)
- switching the video stream didn't work, because we can't tell
libavformat to send the packet again
- seeking and resuming after was hacky (for some reason libavformat sets
the returned packet's PTS to that of the previously returned audio
packet in generic code not related to attached pictures, and this
happened to work)
- if the user did something stupid and e.g. inserted a deinterlacer by
default, a picture was never displayed, only an inactive VO window)
- same when using a command that reconfigured the VO (like switching
aspect or video filters)
- hr-seek didn't work
For this reason, handle attached pictures as separate case with a
separate video decoding function, which doesn't read packets. Also,
do not synchronize audio to video start in this case.
2013-07-11 17:23:56 +00:00
|
|
|
|
2015-03-20 21:07:26 +00:00
|
|
|
bool missing_timestamps;
|
|
|
|
|
core: completely change handling of attached picture pseudo video
Before this commit, we tried to play along with libavformat and tried
to pretend that attached pictures are video streams with a single
frame, and that the frame magically appeared at the seek position when
seeking. The playback core would then switch to a mode where the video
has ended, and the "remaining" audio is played.
This didn't work very well:
- we needed a hack in demux.c, because we tried to read more packets in
order to find the "next" video frame (libavformat doesn't tell us if
a stream has ended)
- switching the video stream didn't work, because we can't tell
libavformat to send the packet again
- seeking and resuming after was hacky (for some reason libavformat sets
the returned packet's PTS to that of the previously returned audio
packet in generic code not related to attached pictures, and this
happened to work)
- if the user did something stupid and e.g. inserted a deinterlacer by
default, a picture was never displayed, only an inactive VO window)
- same when using a command that reconfigured the VO (like switching
aspect or video filters)
- hr-seek didn't work
For this reason, handle attached pictures as separate case with a
separate video decoding function, which doesn't read packets. Also,
do not synchronize audio to video start in this case.
2013-07-11 17:23:56 +00:00
|
|
|
// stream is a picture (such as album art)
|
|
|
|
struct demux_packet *attached_picture;
|
2012-08-03 10:24:55 +00:00
|
|
|
|
2013-07-11 17:20:25 +00:00
|
|
|
// Internal to demux.c
|
|
|
|
struct demux_stream *ds;
|
2012-08-03 10:24:55 +00:00
|
|
|
};
|
|
|
|
|
2008-04-16 02:00:34 +00:00
|
|
|
typedef struct sh_audio {
|
2011-07-03 07:30:50 +00:00
|
|
|
int samplerate;
|
2013-04-06 20:43:12 +00:00
|
|
|
struct mp_chmap channels;
|
2014-09-24 20:55:50 +00:00
|
|
|
bool force_channels;
|
2014-05-26 22:15:41 +00:00
|
|
|
int bitrate; // compressed bits/sec
|
2014-09-24 23:56:51 +00:00
|
|
|
int block_align;
|
|
|
|
int bits_per_coded_sample;
|
2011-07-03 07:30:50 +00:00
|
|
|
unsigned char *codecdata;
|
|
|
|
int codecdata_len;
|
2014-07-05 14:45:41 +00:00
|
|
|
struct replaygain_data *replaygain_data;
|
2001-04-06 01:18:59 +00:00
|
|
|
} sh_audio_t;
|
|
|
|
|
2008-04-16 02:00:34 +00:00
|
|
|
typedef struct sh_video {
|
video: add insane hack to work around FFmpeg/Libav insanity
So, FFmpeg/Libav requires us to figure out video timestamps ourselves
(see last 10 commits or so), but the methods it provides for this aren't
even sufficient. In particular, everything that uses AVI-style DTS (avi,
vfw-muxed mkv, possibly mpeg4-in-ogm) with a codec that has an internal
frame delay is broken. In this case, libavcodec will shift the packet-
to-image correspondence by the codec delay, meaning that with a delay=1,
the first AVFrame.pkt_dts is not 0, but that of the second packet. All
timestamps will appear shifted. The start time (e.g. the time displayed
when doing "mpv file.avi --pause") will not be exactly 0.
(According to Libav developers, this is how it's supposed to work; just
that the first DTS values are normally negative with formats that use
DTS "properly". Who cares if it doesn't work at all with very common
video formats? There's no indication that they'll fix this soon,
either. An elegant workaround is missing too.)
Add a hack to re-enable the old PTS code for AVI and vfw-muxed MKV.
Since these timestamps are not reorderd, we wouldn't need to sort them,
but it's less code this way (and possibly more robust, should a demuxer
unexpectedly output PTS).
The original intention of all the timestamp changes recently was
actually to get rid of demuxer-specific hacks and the old timestamp
sorting code, but it looks like this didn't work out. Yet another case
where trying to replace native MPlayer functionality with FFmpeg/Libav
led to disadvantages and bugs. (Note that the old PTS sorting code
doesn't and can't handle frame dropping correctly, though.)
Bug reports:
https://trac.ffmpeg.org/ticket/3178
https://bugzilla.libav.org/show_bug.cgi?id=600
2013-11-28 14:10:45 +00:00
|
|
|
bool avi_dts; // use DTS timing; first frame and DTS is 0
|
2011-07-03 07:30:50 +00:00
|
|
|
float fps; // frames per second (set only if constant fps)
|
|
|
|
float aspect; // aspect ratio stored in the file (for prescaling)
|
2014-09-24 22:59:15 +00:00
|
|
|
int bits_per_coded_sample;
|
|
|
|
unsigned char *extradata;
|
|
|
|
int extradata_len;
|
2013-11-23 20:36:20 +00:00
|
|
|
int disp_w, disp_h; // display size
|
2014-04-20 19:29:22 +00:00
|
|
|
int rotate; // intended display rotation, in degrees, [0, 359]
|
2014-08-30 21:24:46 +00:00
|
|
|
int stereo_mode; // mp_stereo3d_mode (0 if none/unknown)
|
2001-04-06 01:18:59 +00:00
|
|
|
} sh_video_t;
|
|
|
|
|
2008-04-16 02:00:34 +00:00
|
|
|
typedef struct sh_sub {
|
2011-07-03 07:30:50 +00:00
|
|
|
unsigned char *extradata; // extra header data passed from demuxer
|
|
|
|
int extradata_len;
|
2014-03-03 23:28:10 +00:00
|
|
|
double frame_based; // timestamps are frame-based (and this is the
|
|
|
|
// fallback framerate used for timestamps)
|
2013-06-23 20:16:47 +00:00
|
|
|
bool is_utf8; // if false, subtitle packet charset is unknown
|
2013-06-01 17:54:18 +00:00
|
|
|
struct dec_sub *dec_sub; // decoder context
|
2006-11-13 18:38:29 +00:00
|
|
|
} sh_sub_t;
|
|
|
|
|
2008-02-22 09:09:46 +00:00
|
|
|
#endif /* MPLAYER_STHEADER_H */
|