summaryrefslogtreecommitdiffstats
path: root/demux/demux.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-06-11 21:39:54 +0200
committerwm4 <wm4@nowhere>2013-06-23 22:33:59 +0200
commita70d575291d48289669ee8989e0597a94189dd8d (patch)
treefd2ddf88485e40e77183ac8aceb68a7557ddfa49 /demux/demux.c
parenta792f0d628ea6170ce351fc816a2d71e276a8c49 (diff)
downloadmpv-a70d575291d48289669ee8989e0597a94189dd8d.tar.bz2
mpv-a70d575291d48289669ee8989e0597a94189dd8d.tar.xz
sub: preload external text subtitles
If a subtitle is external, read it completely and add all subtitle events in advance when the subtitle track is selected. This is done for text subtitles only. (Note that subreader.c and subtitles loaded with libass are different and don't have anything to do with this commit.)
Diffstat (limited to 'demux/demux.c')
-rw-r--r--demux/demux.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/demux/demux.c b/demux/demux.c
index d9b41e2c99..23c4a28706 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -40,7 +40,8 @@
#include "audio/format.h"
-#include "libavcodec/avcodec.h"
+#include <libavcodec/avcodec.h>
+
#if MP_INPUT_BUFFER_PADDING_SIZE < FF_INPUT_BUFFER_PADDING_SIZE
#error MP_INPUT_BUFFER_PADDING_SIZE is too small!
#endif
@@ -183,6 +184,41 @@ void free_demux_packet(struct demux_packet *dp)
talloc_free(dp);
}
+static int destroy_avpacket(void *pkt)
+{
+ av_free_packet(pkt);
+ return 0;
+}
+
+struct demux_packet *demux_copy_packet(struct demux_packet *dp)
+{
+ struct demux_packet *new = NULL;
+ // No av_copy_packet() in Libav
+#if LIBAVCODEC_VERSION_MICRO >= 100
+ if (dp->avpacket) {
+ assert(dp->buffer == dp->avpacket->data);
+ assert(dp->len == dp->avpacket->size);
+ AVPacket *newavp = talloc_zero(NULL, AVPacket);
+ talloc_set_destructor(newavp, destroy_avpacket);
+ av_init_packet(newavp);
+ if (av_copy_packet(newavp, dp->avpacket) < 0)
+ abort();
+ new = new_demux_packet_fromdata(newavp->data, newavp->size);
+ new->avpacket = newavp;
+ }
+#endif
+ if (!new) {
+ new = new_demux_packet(dp->len);
+ memcpy(new->buffer, dp->buffer, new->len);
+ }
+ new->pts = dp->pts;
+ new->duration = dp->duration;
+ new->stream_pts = dp->stream_pts;
+ new->pos = dp->pos;
+ new->keyframe = dp->keyframe;
+ return new;
+}
+
static void free_demuxer_stream(struct demux_stream *ds)
{
ds_free_packs(ds);