summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorUoti Urpala <uau@mplayer2.org>2011-08-20 20:25:43 +0300
committerUoti Urpala <uau@mplayer2.org>2011-08-20 20:25:43 +0300
commit9c7c4e5b7dd7745ad071ec330abab49a8f4e314b (patch)
treefefbae9c04f401be71f363129bbc30783c19f8f6 /libmpdemux
parente2ca8853a6a26ca1afcababea0e4a743b525daa2 (diff)
downloadmpv-9c7c4e5b7dd7745ad071ec330abab49a8f4e314b.tar.bz2
mpv-9c7c4e5b7dd7745ad071ec330abab49a8f4e314b.tar.xz
core, demux, vd_ffmpeg: pass side data from demux_lavf to vd_ffmpeg
Pass the libavformat packet side_data field from demux_lavf to vd_ffmpeg. Libavcodec/libavformat use this field for palette data, and passing it is required for the playback of some paletted video codecs. The implementation works by giving vd_ffmpeg a copy of the struct demux_packet used to store the video packet (from which it can access the avpacket field). The definition of struct demux_packet is moved to new file demux_packet.h so that vd_ffmpeg.c can use it without including all of demuxer.h.
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_packet.h39
-rw-r--r--libmpdemux/demuxer.c10
-rw-r--r--libmpdemux/demuxer.h17
3 files changed, 51 insertions, 15 deletions
diff --git a/libmpdemux/demux_packet.h b/libmpdemux/demux_packet.h
new file mode 100644
index 0000000000..30cd0010f5
--- /dev/null
+++ b/libmpdemux/demux_packet.h
@@ -0,0 +1,39 @@
+/*
+ * This file is part of mplayer2.
+ *
+ * mplayer2 is free software; you can redistribute it and/or modify
+ * 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.
+ *
+ * mplayer2 is distributed in the hope that it will be useful,
+ * 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
+ * with mplayer2; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef MPLAYER_DEMUX_PACKET_H
+#define MPLAYER_DEMUX_PACKET_H
+
+#include <sys/types.h>
+
+// Holds one packet/frame/whatever
+typedef struct demux_packet {
+ int len;
+ double pts;
+ double duration;
+ double stream_pts;
+ off_t pos; // position in index (AVI) or file (MPG)
+ unsigned char *buffer;
+ int flags; // keyframe, etc
+ int refcount; // counter for the master packet, if 0, buffer can be free()d
+ struct demux_packet *master; //in clones, pointer to the master packet
+ struct demux_packet *next;
+ struct AVPacket *avpacket; // original libavformat packet (demux_lavf)
+} demux_packet_t;
+
+#endif /* MPLAYER_DEMUX_PACKET_H */
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index d4c43ad657..6ae2ca8b7f 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include <unistd.h>
#include <sys/types.h>
@@ -846,6 +847,15 @@ int ds_get_packet_sub(demux_stream_t *ds, unsigned char **start)
return len;
}
+struct demux_packet *ds_get_packet2(struct demux_stream *ds)
+{
+ // This shouldn't get used together with partial reads
+ assert(ds->buffer_pos >= ds->buffer_size);
+ ds_fill_buffer(ds);
+ ds->buffer_pos = ds->buffer_size;
+ return ds->current;
+}
+
double ds_get_next_pts(demux_stream_t *ds)
{
demuxer_t *demux = ds->demuxer;
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 5585cf73ed..1b885f28d3 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -27,6 +27,7 @@
#include "bstr.h"
#include "mpcommon.h"
+#include "demux_packet.h"
struct MPOpts;
@@ -124,21 +125,6 @@ enum timestamp_type {
// demux_lavf can pass lavf buffers using FF_INPUT_BUFFER_PADDING_SIZE instead
#define MP_INPUT_BUFFER_PADDING_SIZE 8
-// Holds one packet/frame/whatever
-typedef struct demux_packet {
- int len;
- double pts;
- double duration;
- double stream_pts;
- off_t pos; // position in index (AVI) or file (MPG)
- unsigned char *buffer;
- int flags; // keyframe, etc
- int refcount; // counter for the master packet, if 0, buffer can be free()d
- struct demux_packet *master; //in clones, pointer to the master packet
- struct demux_packet *next;
- struct AVPacket *avpacket; // original libavformat packet (demux_lavf)
-} demux_packet_t;
-
typedef struct demux_stream {
int buffer_pos; // current buffer position
int buffer_size; // current buffer size
@@ -360,6 +346,7 @@ int ds_get_packet(struct demux_stream *ds, unsigned char **start);
int ds_get_packet_pts(struct demux_stream *ds, unsigned char **start,
double *pts);
int ds_get_packet_sub(struct demux_stream *ds, unsigned char **start);
+struct demux_packet *ds_get_packet2(struct demux_stream *ds);
double ds_get_next_pts(struct demux_stream *ds);
int ds_parse(struct demux_stream *sh, uint8_t **buffer, int *len, double pts,
off_t pos);