From 9c7c4e5b7dd7745ad071ec330abab49a8f4e314b Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Sat, 20 Aug 2011 20:25:43 +0300 Subject: 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. --- libmpcodecs/dec_video.c | 5 +++-- libmpcodecs/dec_video.h | 5 ++++- libmpcodecs/vd.h | 17 ++++++++++------- libmpcodecs/vd_ffmpeg.c | 12 ++++++++++-- 4 files changed, 27 insertions(+), 12 deletions(-) (limited to 'libmpcodecs') 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; -- cgit v1.2.3