Some calculations in the demuxer that are in principle integer
arithmetic use float divisions instead of 64-bit integer ones (as in
(int64_t)(x / 1000000.0) ). When compiled with -ffast-math gcc replaces
the division with multiplication by inverse. The calculation of the
inverse can introduce rounding error even for divisions that would
have been exact, and any rounding error down from an exact integer
result in the division makes the result after cast one smaller. This
caused some inaccuracy in seeking due to timecodes in the index not
quite matching those calculated for actual packets. Add 0.5 to such
expressions before casting to round instead of truncating, which
should be enough to avoid the problem. Also replace some
non-performance-critical use of float types by doubles.
Allow more fuzziness in treating timestamps as inaccurate attempts to
seek "exactly" to a keyframe. A seek forward can now actually go to a
keyframe 5 ms back from the timecode, and correspondingly for seeks
backwards. Before only 1 ms was allowed. This helps with some
files that have inaccurate chapter boundaries.
When seeking backward, after seeking to the file position specified by
an index entry skip packets until the timecode of that index entry.
The existence of the entry should guarantee a keyframe there before
the seek target time.
The first_tc code was used to force timestamps in the file to start
from 0. There should be no need to do this, and it would likely break
ordered chapter support for any files it affected (since the chapter
timecodes would refer to the original times, not the modified ones).
stop_timecode was used to implement end of playback at a specified
chapter. There is now common code which implements that and
demuxer-specific implementations are not needed.
Allow a seek to "time X or before" to match a keyframe at X plus 1 ms,
and correspondingly for seeks to "X or later". This allows seeks to a
known keyframe to succeed even if the time is not quite perfectly
exact.
The main motivation for this improvement was chapter seeking. Some
time ago things worked in practice because chapter times were slightly
below the exact target and demux_mkv seeked forward of the specified
position by default. Some commits ago demux_mkv started seeking
backward by default, which is generally a more desirable behavior, but
worked worse for the chapter times which happened to be slightly
behind a keyframe rather than ahead. After this commit chapter seeks
go to the desired keyframe again.
When the new mode is active relative seeks are converted to absolute
ones (current video pts + relative seek amount) and forward/backward
flag before being sent to the demuxer. This mode is used if the
demuxer has set the accurate_seek field in the demuxer struct and
there is a video stream. At the moment the mkv and lavf demuxers
enable the flag.
This change is useful for later Matroska ordered chapter support (and
for more general timelime editing), but also fixes problems in
existing functionality. The main problem with the old mode, where
relative seeks are passed directly to the demuxer, is that the user
wants to seek relative to the currently displayed position but the
demuxer does not know what that position is. There can be an arbitrary
amount of buffering between the demuxer read position and what is
displayed on the screen. In some situations this makes small seeks
fail to move backward at all (especially visible at high playback
speed, when audio needs to be demuxed and decoded further ahead to
fill the output buffers after resampling).
Some container formats that can be used with the lavf demuxer do not
always have reliable timestamps that could be used for unambiguous
absolute seeking. However I made the demuxer always enable the new
mode because it already converted all seeks to absolute ones before
sending them to libavformat, so cases without reliable absolute seeks
were failing already and this should only improve the working cases.
Clean up demux_mkv_read_info() and demux_mkv_read_chapters() somewhat.
(Why do the names of static functions have a stupid prefix like that?
Didn't remove it now however).
Demux_mkv_read_info() now delays printing duration information until
the end of the function where we hopefully have the correct timescale
for converting it to seconds. The code to calculate the duration had
been fixed for that earlier but the message had not.
see [MPlayer-dev-eng] [PATCH] cleanup/uniformize real video packetizing
patch blessed by Roberto
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28503 b3059339-0415-0410-9bf9-f77b7e298cf2
The following commits are reverted partially or completely:
"a valid ASS line contains 9 ',' before actual text"
"demux_mkv: output correctly formated ASS packets"
"libass: add a new ass_process_data() to process demuxed subtitle packets"
These commits converted the internal representation of SSA/ASS
subtitle packets from the format used by Matroska to a custom format
where each packet has contents exactly matching one line in complete
SSA script files. AFAIK no files natively use such a format for muxed
subtitles. The stated reason for this change was to use a format that
could in principle be muxed into a maximal number of containers. SSA
subtitles do not have an implicit duration so both start time and
duration or end time need to be specified explicitly; the new format
moved timing information inside the codec packet data so it could be
muxed without modification into containers that can represent only
start time at the container level. However such a change is wrong from
the viewpoint of program architecture. Timing information belongs to
the demuxer level, but these commits moved not only the duration but
also the authoritative value of the start time to inside the codec
data. Additionally the new format lost the value of the Matroska
ReadOrder field which is used by MPlayer.
This commit changes the internal packet format back to that used by
Matroska and makes the internal Matroska demuxer output that format
again. Libavformat still outputs the "new" format; it could be
converted back to the Matroska format in demux_lavf.c, but I'm not
adding that code at least yet. The current lavf code has similar
problems as the reverted code in MPlayer, and it also currently fails
to provide any way to access the value of the ReadOrder field. I hope
that the lavf side will be improved; if it isn't conversion can be
added later. For now I'll make MPlayer default to the internal Matroska
demuxer instead of the lavf one in a separate commit.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@27550 b3059339-0415-0410-9bf9-f77b7e298cf2
Replace all USE_ prefixes by CONFIG_ prefixes to indicate
options which are configurable.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@27373 b3059339-0415-0410-9bf9-f77b7e298cf2
libmpdemux/demux_mkv.c:2242: warning: 'demux_mkv_reverse_id' defined but not used
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@26784 b3059339-0415-0410-9bf9-f77b7e298cf2
* libmpdemux/demux_mkv.c:218: warning: passing argument 1 of ‘grow_array’ from incompatible pointer type
* libmpdemux/demux_mkv.c:1235: warning: passing argument 1 of ‘grow_array’ from incompatible pointer type
Change grow_array to return the reallocated pointer instead of setting
it through a void **.
* libmpdemux/demux_mkv.c:1396: warning: unused variable ‘mkv_d’
Remove.
* libmpdemux/demux_mkv.c:1740: warning: pointer of type ‘void *’ used in arithmetic
Change struct mkv_track->private_data from void * to unsigned char *.
* libmpdemux/demux_mkv.c:2693: warning: assignment from incompatible pointer type
Add a cast.
* libmpdemux/demux_mkv.c:2239: warning: ‘demux_mkv_reverse_id’ defined but not used
Remove the function (together with preceding useless advance
declaration of demux_mkv_seek).
Name the field "sub_id" as it's not specific to DVD subs.
Remove some other unused extern declarations together with dvdsub_id
from demux_mkv.c and demux_lavf.c.
The first default track is chosen for playback if language-based selection
failes. Additionally, for audio tracks, the first one is chosen if there are
no default tracks at all.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@26301 b3059339-0415-0410-9bf9-f77b7e298cf2
of letting individual demuxers and stream readers do their nasty job
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25987 b3059339-0415-0410-9bf9-f77b7e298cf2