summaryrefslogtreecommitdiffstats
path: root/demux
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
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')
-rw-r--r--demux/demux.c38
-rw-r--r--demux/demux.h1
2 files changed, 38 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);
diff --git a/demux/demux.h b/demux/demux.h
index 9ec6d0c6f0..a82fbea91a 100644
--- a/demux/demux.h
+++ b/demux/demux.h
@@ -291,6 +291,7 @@ struct demux_packet *new_demux_packet_fromdata(void *data, size_t len);
struct demux_packet *new_demux_packet_from(void *data, size_t len);
void resize_demux_packet(struct demux_packet *dp, size_t len);
void free_demux_packet(struct demux_packet *dp);
+struct demux_packet *demux_copy_packet(struct demux_packet *dp);
#ifndef SIZE_MAX
#define SIZE_MAX ((size_t)-1)