summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
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 /libmpcodecs
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 'libmpcodecs')
-rw-r--r--libmpcodecs/dec_video.c5
-rw-r--r--libmpcodecs/dec_video.h5
-rw-r--r--libmpcodecs/vd.h17
-rw-r--r--libmpcodecs/vd_ffmpeg.c12
4 files changed, 27 insertions, 12 deletions
diff --git a/libmpcodecs/dec_video.c b/libmpcodecs/dec_video.c
index f49eb79218..8dbd733fd7 100644
--- a/libmpcodecs/dec_video.c
+++ b/libmpcodecs/dec_video.c
@@ -393,7 +393,8 @@ int init_best_video_codec(sh_video_t *sh_video, char **video_codec_list,
return 1; // success
}
-void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
+void *decode_video(sh_video_t *sh_video, struct demux_packet *packet,
+ unsigned char *start, int in_size,
int drop_frame, double pts)
{
mp_image_t *mpi = NULL;
@@ -433,7 +434,7 @@ void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
}
if (sh_video->vd_driver->decode2) {
- mpi = sh_video->vd_driver->decode2(sh_video, start, in_size,
+ mpi = sh_video->vd_driver->decode2(sh_video, packet, start, in_size,
drop_frame, &pts);
} else {
mpi = sh_video->vd_driver->decode(sh_video, start, in_size,
diff --git a/libmpcodecs/dec_video.h b/libmpcodecs/dec_video.h
index f4b72a7d3f..be087d09b9 100644
--- a/libmpcodecs/dec_video.h
+++ b/libmpcodecs/dec_video.h
@@ -29,7 +29,10 @@ void vfm_help(void);
int init_best_video_codec(sh_video_t *sh_video, char** video_codec_list, char** video_fm_list);
void uninit_video(sh_video_t *sh_video);
-void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size, int drop_frame, double pts);
+struct demux_packet;
+void *decode_video(sh_video_t *sh_video, struct demux_packet *packet,
+ unsigned char *start, int in_size, int drop_frame,
+ double pts);
int filter_video(sh_video_t *sh_video, void *frame, double pts);
int get_video_quality_max(sh_video_t *sh_video);
diff --git a/libmpcodecs/vd.h b/libmpcodecs/vd.h
index 76f3d00553..88837188f6 100644
--- a/libmpcodecs/vd.h
+++ b/libmpcodecs/vd.h
@@ -25,16 +25,19 @@
typedef mp_codec_info_t vd_info_t;
+struct demux_packet;
+
/* interface of video decoder drivers */
typedef struct vd_functions
{
- const vd_info_t *info;
- int (*init)(sh_video_t *sh);
- void (*uninit)(sh_video_t *sh);
- int (*control)(sh_video_t *sh,int cmd,void* arg, ...);
- mp_image_t* (*decode)(sh_video_t *sh,void* data,int len,int flags);
- struct mp_image *(*decode2)(struct sh_video *sh, void *data, int len,
- int flags, double *reordered_pts);
+ const vd_info_t *info;
+ int (*init)(sh_video_t *sh);
+ void (*uninit)(sh_video_t *sh);
+ int (*control)(sh_video_t *sh,int cmd,void* arg, ...);
+ mp_image_t* (*decode)(sh_video_t *sh,void* data,int len,int flags);
+ struct mp_image *(*decode2)(struct sh_video *sh, struct demux_packet *pkt,
+ void *data, int len, int flags,
+ double *reordered_pts);
} vd_functions_t;
// NULL terminated array of all drivers
diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c
index 9d33d5d963..f67db0692b 100644
--- a/libmpcodecs/vd_ffmpeg.c
+++ b/libmpcodecs/vd_ffmpeg.c
@@ -36,6 +36,7 @@
#include "vd.h"
#include "img_format.h"
#include "libmpdemux/stheader.h"
+#include "libmpdemux/demux_packet.h"
#include "codec-cfg.h"
#include "osdep/numcores.h"
@@ -713,8 +714,9 @@ static av_unused void swap_palette(void *pal)
}
// decode a frame
-static struct mp_image *decode(struct sh_video *sh, void *data, int len,
- int flags, double *reordered_pts)
+static struct mp_image *decode(struct sh_video *sh, struct demux_packet *packet,
+ void *data, int len, int flags,
+ double *reordered_pts)
{
int got_picture=0;
int ret;
@@ -755,6 +757,12 @@ static struct mp_image *decode(struct sh_video *sh, void *data, int len,
pkt.size = len;
// HACK: make PNGs decode normally instead of as CorePNG delta frames
pkt.flags = AV_PKT_FLAG_KEY;
+#if LIBAVCODEC_VERSION_MAJOR >= 53
+ if (packet && packet->avpacket) {
+ pkt.side_data = packet->avpacket->side_data;
+ pkt.side_data_elems = packet->avpacket->side_data_elems;
+ }
+#endif
// The avcodec opaque field stupidly supports only int64_t type
union pts { int64_t i; double d; };
avctx->reordered_opaque = (union pts){.d = *reordered_pts}.i;