diff options
author | Uoti Urpala <uau@mplayer2.org> | 2011-08-20 20:25:43 +0300 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2011-08-20 20:25:43 +0300 |
commit | 9c7c4e5b7dd7745ad071ec330abab49a8f4e314b (patch) | |
tree | fefbae9c04f401be71f363129bbc30783c19f8f6 /libmpdemux | |
parent | e2ca8853a6a26ca1afcababea0e4a743b525daa2 (diff) | |
download | mpv-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.h | 39 | ||||
-rw-r--r-- | libmpdemux/demuxer.c | 10 | ||||
-rw-r--r-- | libmpdemux/demuxer.h | 17 |
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); |