summaryrefslogtreecommitdiff
path: root/media-video/mplayer/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
committerV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
commit4f2d7949f03e1c198bc888f2d05f421d35c57e21 (patch)
treeba5f07bf3f9d22d82e54a462313f5d244036c768 /media-video/mplayer/files
reinit the tree, so we can have metadata
Diffstat (limited to 'media-video/mplayer/files')
-rw-r--r--media-video/mplayer/files/dump_ffmpeg.sh74
-rw-r--r--media-video/mplayer/files/mplayer-1.2-get_buffer.patch327
-rw-r--r--media-video/mplayer/files/mplayer-1.2_pre20150730-chan.patch25
-rw-r--r--media-video/mplayer/files/mplayer-1.2_pre20150730-encode.patch82
-rw-r--r--media-video/mplayer/files/mplayer-1.3-CVE-2016-4352.patch24
-rw-r--r--media-video/mplayer/files/prepare_mplayer.sh25
6 files changed, 557 insertions, 0 deletions
diff --git a/media-video/mplayer/files/dump_ffmpeg.sh b/media-video/mplayer/files/dump_ffmpeg.sh
new file mode 100644
index 000000000000..885946df8cc7
--- /dev/null
+++ b/media-video/mplayer/files/dump_ffmpeg.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+FFMPEG_DIR=ffmpeg
+FFMPEG_MOVED_DIR=ffmpeg_removed
+SYSTEM_FFMPEG_DIR=${EPREFIX}/usr/include
+
+# Move directories
+
+[ -d "${FFMPEG_DIR}" ] && mv "${FFMPEG_DIR}" "${FFMPEG_MOVED_DIR}"
+[ -d "${FFMPEG_MOVED_DIR}" ] || exit 1
+[ -d "${FFMPEG_DIR}" ] || mkdir "${FFMPEG_DIR}"
+
+# Keep required files and check them
+
+SANITIZED_REGEXP='^\#[[:space:]]*include.*\".*[.]h\"'
+sanitize_includes() {
+ sed -e "s/^\#[[:space:]]*include.*\"config[.]h\"/#include <config.h>/" \
+ -e "s/^\#[[:space:]]*include.*\"\(libav.*\/.*[.]h\)\"/#include \<\1\>/" \
+ -e "/${SANITIZED_REGEXP}/{s:\"\(.*\)\":\<${2}\/\1\>:}" ${1}
+}
+
+check_sanitized_includes() {
+ grep -q "${SANITIZED_REGEXP}" $1
+}
+
+get_header_deps() {
+ grep "^#[[:space:]]*include.*\<libav.*[.]h\>" ${1} | \
+ sed -e "s/^#[[:space:]]*include.*\<\(libav.*[.]h\)\>/\1/" | \
+ tr -d '<>' | tr '\n' ' '
+}
+
+check_header_deps() {
+ for i ; do
+ printf "Checking for the presence of ${i}...\n"
+ if [ ! -f "${SYSTEM_FFMPEG_DIR}/${i}" -a ! -f "${FFMPEG_DIR}/${i}" ] ; then
+ printf "Header depends on ${i}\n"
+ printf "... but that file cannot be found, aborting\n"
+ exit 1
+ fi
+ done
+}
+
+move_file() {
+ mydir="$(dirname $1)"
+ printf "Moving and checking file: ${1}\n"
+ [ -d "${FFMPEG_DIR}/${mydir}" ] || mkdir -p "${FFMPEG_DIR}/${mydir}"
+ if [ ! -f "${FFMPEG_DIR}/${1}" ] ; then
+ sanitize_includes "${FFMPEG_MOVED_DIR}/${1}" ${mydir} > "${FFMPEG_DIR}/${1}"
+ fi
+ if $(check_sanitized_includes "${FFMPEG_DIR}/${1}") ; then
+ printf "Error, found non sanitized file in ffmpeg:\n"
+ printf "${FFMPEG_DIR}/${1}\n"
+ printf "Please report it at bugs.gentoo.org\n"
+ exit 1
+ fi
+ if [ "${1%.h}" != "${1}" ] ; then
+ mydeps=$(get_header_deps "${FFMPEG_DIR}/${1}")
+ check_header_deps ${mydeps}
+ fi
+}
+
+# HEADERS (order matters for the consistency checks: leaves come first)
+FILES="libavutil/wchar_filename.h libavformat/os_support.h libavformat/internal.h libavutil/x86/asm.h"
+# Files that are sed'ed but not compiled, used to check for availability of
+# some codecs
+FILES="${FILES} libavcodec/allcodecs.c libavformat/allformats.c libavfilter/allfilters.c"
+
+for i in ${FILES} ; do
+ move_file $i
+done
+
+rm -rf "${FFMPEG_MOVED_DIR}"
+
+exit 0
diff --git a/media-video/mplayer/files/mplayer-1.2-get_buffer.patch b/media-video/mplayer/files/mplayer-1.2-get_buffer.patch
new file mode 100644
index 000000000000..3329b9803603
--- /dev/null
+++ b/media-video/mplayer/files/mplayer-1.2-get_buffer.patch
@@ -0,0 +1,327 @@
+r37476 | rtogni | 2015-09-05 18:20:27 +0200 (Sat, 05 Sep 2015) | 5 lines
+
+Replace deprecated get_buffer, buffer_hints, and others
+
+This is needed to compile with latest FFmpeg
+
+Index: libmpcodecs/vd_ffmpeg.c
+===================================================================
+--- libmpcodecs/vd_ffmpeg.c (revision 37475)
++++ libmpcodecs/vd_ffmpeg.c (revision 37476)
+@@ -40,6 +40,7 @@
+ #if CONFIG_VDPAU
+ #include "libavcodec/vdpau.h"
+ #endif
++#include "libavutil/pixdesc.h"
+
+ static const vd_info_t info = {
+ "FFmpeg's libavcodec codec family",
+@@ -95,8 +96,11 @@
+
+ #include "m_option.h"
+
+-static int get_buffer(AVCodecContext *avctx, AVFrame *pic);
++static int get_buffer(AVCodecContext *avctx, AVFrame *pic, int isreference);
++static int mpcodec_default_get_buffer(AVCodecContext *avctx, AVFrame *frame);
++static int get_buffer2(AVCodecContext *avctx, AVFrame *frame, int flags);
+ static void release_buffer(AVCodecContext *avctx, AVFrame *pic);
++static void mpcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic);
+ static void draw_slice(struct AVCodecContext *s, const AVFrame *src, int offset[4],
+ int y, int type, int height);
+
+@@ -269,19 +273,10 @@
+ if (lavc_param_vismv || (lavc_param_debug & (FF_DEBUG_VIS_MB_TYPE|FF_DEBUG_VIS_QP))) {
+ ctx->do_slices = ctx->do_dr1 = 0;
+ }
+-#ifndef CODEC_FLAG_EMU_EDGE
+-#define CODEC_FLAG_EMU_EDGE 0
+-#endif
+ if(ctx->do_dr1){
+- avctx->flags |= CODEC_FLAG_EMU_EDGE;
+- avctx-> reget_buffer =
+- avctx-> get_buffer = get_buffer;
+- avctx->release_buffer = release_buffer;
++ avctx->get_buffer2 = get_buffer2;
+ } else if (lavc_codec->capabilities & CODEC_CAP_DR1) {
+- avctx->flags &= ~CODEC_FLAG_EMU_EDGE;
+- avctx-> reget_buffer = avcodec_default_reget_buffer;
+- avctx-> get_buffer = avcodec_default_get_buffer;
+- avctx->release_buffer = avcodec_default_release_buffer;
++ avctx->get_buffer2 = avcodec_default_get_buffer2;
+ }
+ avctx->slice_flags = 0;
+ }
+@@ -309,9 +304,7 @@
+ if (IMGFMT_IS_HWACCEL(imgfmt)) {
+ ctx->do_dr1 = 1;
+ ctx->nonref_dr = 0;
+- avctx->get_buffer = get_buffer;
+- avctx->release_buffer = release_buffer;
+- avctx->reget_buffer = get_buffer;
++ avctx->get_buffer2 = get_buffer2;
+ mp_msg(MSGT_DECVIDEO, MSGL_V, IMGFMT_IS_XVMC(imgfmt) ?
+ MSGTR_MPCODECS_XVMCAcceleratedMPEG2 :
+ "[VD_FFMPEG] VDPAU accelerated decoding\n");
+@@ -384,7 +377,6 @@
+ #endif
+ avctx->flags2|= lavc_param_fast;
+ avctx->codec_tag= sh->format;
+- avctx->stream_codec_tag= sh->video.fccHandler;
+ avctx->idct_algo= lavc_param_idct_algo;
+ avctx->error_concealment= lavc_param_error_concealment;
+ avctx->debug= lavc_param_debug;
+@@ -668,7 +660,7 @@
+ return 0;
+ }
+
+-static int get_buffer(AVCodecContext *avctx, AVFrame *pic){
++static int get_buffer(AVCodecContext *avctx, AVFrame *pic, int isreference){
+ sh_video_t *sh = avctx->opaque;
+ vd_ffmpeg_ctx *ctx = sh->context;
+ mp_image_t *mpi=NULL;
+@@ -677,27 +669,12 @@
+ int width = FFMAX(avctx->width, -(-avctx->coded_width >> avctx->lowres));
+ int height= FFMAX(avctx->height, -(-avctx->coded_height >> avctx->lowres));
+ // special case to handle reget_buffer
+- if (pic->opaque && pic->data[0] && (!pic->buffer_hints || pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE))
++ if (pic->opaque && pic->data[0])
+ return 0;
+ avcodec_align_dimensions(avctx, &width, &height);
+ //printf("get_buffer %d %d %d\n", pic->reference, ctx->ip_count, ctx->b_count);
+
+- if (pic->buffer_hints) {
+- mp_msg(MSGT_DECVIDEO, MSGL_DBG2, "Buffer hints: %u\n", pic->buffer_hints);
+- type = MP_IMGTYPE_TEMP;
+- if (pic->buffer_hints & FF_BUFFER_HINTS_READABLE)
+- flags |= MP_IMGFLAG_READABLE;
+- if (pic->buffer_hints & FF_BUFFER_HINTS_PRESERVE ||
+- pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE) {
+- ctx->ip_count++;
+- type = MP_IMGTYPE_IP;
+- flags |= MP_IMGFLAG_PRESERVE;
+- }
+- flags|=(avctx->skip_idct<=AVDISCARD_DEFAULT && avctx->skip_frame<=AVDISCARD_DEFAULT && ctx->do_slices) ?
+- MP_IMGFLAG_DRAW_CALLBACK:0;
+- mp_msg(MSGT_DECVIDEO, MSGL_DBG2, type == MP_IMGTYPE_IP ? "using IP\n" : "using TEMP\n");
+- } else {
+- if(!pic->reference){
++ if(!isreference){
+ ctx->b_count++;
+ flags|=(avctx->skip_idct<=AVDISCARD_DEFAULT && avctx->skip_frame<=AVDISCARD_DEFAULT && ctx->do_slices) ?
+ MP_IMGFLAG_DRAW_CALLBACK:0;
+@@ -711,11 +688,10 @@
+ }else{
+ type= MP_IMGTYPE_IP;
+ }
+- }
+
+ if (ctx->nonref_dr) {
+ if (flags & MP_IMGFLAG_PRESERVE)
+- return avcodec_default_get_buffer(avctx, pic);
++ return mpcodec_default_get_buffer(avctx, pic);
+ // Use NUMBERED since for e.g. TEMP vos assume there will
+ // be no other frames between the get_image and matching put_image.
+ type = MP_IMGTYPE_NUMBERED;
+@@ -722,7 +698,6 @@
+ }
+
+ if(init_vo(sh, avctx->pix_fmt, 1) < 0){
+- avctx->release_buffer= avcodec_default_release_buffer;
+ goto disable_dr1;
+ }
+
+@@ -822,7 +797,6 @@
+ else
+ printf(".");
+ #endif
+- pic->type= FF_BUFFER_TYPE_USER;
+ return 0;
+
+ disable_dr1:
+@@ -829,13 +803,11 @@
+ ctx->do_dr1 = 0;
+ // For frame-multithreading these contexts aren't
+ // the same and must both be updated.
+- ctx->avctx->get_buffer =
+- avctx->get_buffer = avcodec_default_get_buffer;
+- ctx->avctx->reget_buffer =
+- avctx->reget_buffer = avcodec_default_reget_buffer;
++ ctx->avctx->get_buffer2 =
++ avctx->get_buffer2 = avcodec_default_get_buffer2;
+ if (pic->data[0])
+- release_buffer(avctx, pic);
+- return avctx->get_buffer(avctx, pic);
++ mpcodec_default_release_buffer(avctx, pic);
++ return avctx->get_buffer2(avctx, pic,0);
+ }
+
+ static void release_buffer(struct AVCodecContext *avctx, AVFrame *pic){
+@@ -843,8 +815,8 @@
+ sh_video_t *sh = avctx->opaque;
+ vd_ffmpeg_ctx *ctx = sh->context;
+ int i;
+- if (pic->type != FF_BUFFER_TYPE_USER) {
+- avcodec_default_release_buffer(avctx, pic);
++ if (pic->opaque == NULL) {
++ mpcodec_default_release_buffer(avctx, pic);
+ return;
+ }
+
+@@ -954,7 +926,7 @@
+ // even when we do dr we might actually get a buffer we had
+ // FFmpeg allocate - this mostly happens with nonref_dr.
+ // Ensure we treat it correctly.
+- dr1= ctx->do_dr1 && pic->type == FF_BUFFER_TYPE_USER;
++ dr1= ctx->do_dr1 && pic->opaque != NULL;
+ if(ret<0) mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Error while decoding frame!\n");
+ //printf("repeat: %d\n", pic->repeat_pict);
+ //-- vstats generation
+@@ -1128,3 +1100,148 @@
+ set_format_params(avctx, selected_format);
+ return selected_format;
+ }
++
++
++/*
++ FFWrapper
++*/
++static int mpcodec_default_get_buffer(AVCodecContext *avctx, AVFrame *frame)
++{
++ return avcodec_default_get_buffer2(avctx, frame, 0);
++}
++
++static void mpcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic)
++{
++ av_frame_unref(pic);
++}
++
++typedef struct CompatReleaseBufPriv {
++ AVCodecContext avctx;
++ AVFrame frame;
++ uint8_t avframe_padding[1024]; // hack to allow linking to a avutil with larger AVFrame
++} CompatReleaseBufPriv;
++
++static void compat_free_buffer(void *opaque, uint8_t *data)
++{
++ CompatReleaseBufPriv *priv = opaque;
++ release_buffer(&priv->avctx, &priv->frame);
++ av_freep(&priv);
++}
++
++static void compat_release_buffer(void *opaque, uint8_t *data)
++{
++ AVBufferRef *buf = opaque;
++ av_buffer_unref(&buf);
++}
++
++static int get_buffer2(AVCodecContext *avctx, AVFrame *frame, int flags)
++{
++ /*
++ * Wrap an old get_buffer()-allocated buffer in a bunch of AVBuffers.
++ * We wrap each plane in its own AVBuffer. Each of those has a reference to
++ * a dummy AVBuffer as its private data, unreffing it on free.
++ * When all the planes are freed, the dummy buffer's free callback calls
++ * release_buffer().
++ */
++ CompatReleaseBufPriv *priv = NULL;
++ AVBufferRef *dummy_buf = NULL;
++ int planes, i, ret;
++
++ ret = get_buffer(avctx, frame, flags & AV_GET_BUFFER_FLAG_REF);
++ if (ret < 0)
++ return ret;
++
++ /* return if the buffers are already set up
++ * this would happen e.g. when a custom get_buffer() calls
++ * avcodec_default_get_buffer
++ */
++ if (frame->buf[0])
++ goto end0;
++
++ priv = av_mallocz(sizeof(*priv));
++ if (!priv) {
++ ret = AVERROR(ENOMEM);
++ goto fail;
++ }
++ priv->avctx = *avctx;
++ priv->frame = *frame;
++
++ dummy_buf = av_buffer_create(NULL, 0, compat_free_buffer, priv, 0);
++ if (!dummy_buf) {
++ ret = AVERROR(ENOMEM);
++ goto fail;
++ }
++
++#define WRAP_PLANE(ref_out, data, data_size) \
++do { \
++ AVBufferRef *dummy_ref = av_buffer_ref(dummy_buf); \
++ if (!dummy_ref) { \
++ ret = AVERROR(ENOMEM); \
++ goto fail; \
++ } \
++ ref_out = av_buffer_create(data, data_size, compat_release_buffer, \
++ dummy_ref, 0); \
++ if (!ref_out) { \
++ av_buffer_unref(&dummy_ref); \
++ av_frame_unref(frame); \
++ ret = AVERROR(ENOMEM); \
++ goto fail; \
++ } \
++} while (0)
++
++ if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
++ const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
++
++ planes = av_pix_fmt_count_planes(frame->format);
++ /* workaround for AVHWAccel plane count of 0, buf[0] is used as
++ check for allocated buffers: make libavcodec happy */
++ if (desc && desc->flags & AV_PIX_FMT_FLAG_HWACCEL)
++ planes = 1;
++ if (!desc || planes <= 0) {
++ ret = AVERROR(EINVAL);
++ goto fail;
++ }
++
++ for (i = 0; i < planes; i++) {
++ int v_shift = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
++ int plane_size = (frame->height >> v_shift) * frame->linesize[i];
++
++ WRAP_PLANE(frame->buf[i], frame->data[i], plane_size);
++ }
++ } else {
++ int planar = av_sample_fmt_is_planar(frame->format);
++ planes = planar ? avctx->channels : 1;
++
++ if (planes > FF_ARRAY_ELEMS(frame->buf)) {
++ frame->nb_extended_buf = planes - FF_ARRAY_ELEMS(frame->buf);
++ frame->extended_buf = av_malloc_array(sizeof(*frame->extended_buf),
++ frame->nb_extended_buf);
++ if (!frame->extended_buf) {
++ ret = AVERROR(ENOMEM);
++ goto fail;
++ }
++ }
++
++ for (i = 0; i < FFMIN(planes, FF_ARRAY_ELEMS(frame->buf)); i++)
++ WRAP_PLANE(frame->buf[i], frame->extended_data[i], frame->linesize[0]);
++
++ for (i = 0; i < frame->nb_extended_buf; i++)
++ WRAP_PLANE(frame->extended_buf[i],
++ frame->extended_data[i + FF_ARRAY_ELEMS(frame->buf)],
++ frame->linesize[0]);
++ }
++
++ av_buffer_unref(&dummy_buf);
++
++end0:
++ frame->width = avctx->width;
++ frame->height = avctx->height;
++
++ return 0;
++
++fail:
++ release_buffer(avctx, frame);
++ av_freep(&priv);
++ av_buffer_unref(&dummy_buf);
++ return ret;
++}
diff --git a/media-video/mplayer/files/mplayer-1.2_pre20150730-chan.patch b/media-video/mplayer/files/mplayer-1.2_pre20150730-chan.patch
new file mode 100644
index 000000000000..a448d0849458
--- /dev/null
+++ b/media-video/mplayer/files/mplayer-1.2_pre20150730-chan.patch
@@ -0,0 +1,25 @@
+r37447 | rtogni | 2015-08-14 21:30:34 +0200 (Fri, 14 Aug 2015) | 3 lines
+
+Replace deprecated avctx->request_channels with request_channel_layout
+
+Index: libmpcodecs/ad_ffmpeg.c
+===================================================================
+--- libmpcodecs/ad_ffmpeg.c (revision 37446)
++++ libmpcodecs/ad_ffmpeg.c (revision 37447)
+@@ -46,6 +46,7 @@
+
+ #include "libavcodec/avcodec.h"
+ #include "libavutil/dict.h"
++#include "libavutil/channel_layout.h"
+
+ struct adctx {
+ int last_samplerate;
+@@ -127,7 +128,7 @@
+ lavc_context->bits_per_coded_sample = sh_audio->wf->wBitsPerSample;
+ }
+ lavc_context->channel_layout = sh_audio->channel_layout;
+- lavc_context->request_channels = audio_output_channels;
++ lavc_context->request_channel_layout = av_get_default_channel_layout(audio_output_channels);
+ lavc_context->codec_tag = sh_audio->format; //FOURCC
+ lavc_context->codec_id = lavc_codec->id; // not sure if required, imho not --A'rpi
+
diff --git a/media-video/mplayer/files/mplayer-1.2_pre20150730-encode.patch b/media-video/mplayer/files/mplayer-1.2_pre20150730-encode.patch
new file mode 100644
index 000000000000..06a33f832f07
--- /dev/null
+++ b/media-video/mplayer/files/mplayer-1.2_pre20150730-encode.patch
@@ -0,0 +1,82 @@
+r37453 | rtogni | 2015-08-23 22:32:50 +0200 (Sun, 23 Aug 2015) | 3 lines
+
+Replace deprecated av_encode_video() with av_encode_video2()
+
+Index: libmpcodecs/vf_uspp.c
+===================================================================
+--- libmpcodecs/vf_uspp.c (revision 37452)
++++ libmpcodecs/vf_uspp.c (revision 37453)
+@@ -177,11 +177,16 @@
+ const int x1= offset[i+count-1][0];
+ const int y1= offset[i+count-1][1];
+ int offset;
++ AVPacket pkt;
++ int ret, got_pkt;
+ p->frame->data[0]= p->src[0] + x1 + y1 * p->frame->linesize[0];
+ p->frame->data[1]= p->src[1] + x1/2 + y1/2 * p->frame->linesize[1];
+ p->frame->data[2]= p->src[2] + x1/2 + y1/2 * p->frame->linesize[2];
+
+- avcodec_encode_video(p->avctx_enc[i], p->outbuf, p->outbuf_size, p->frame);
++ av_init_packet(&pkt);
++ pkt.data = p->outbuf;
++ pkt.size = p->outbuf_size;
++ avcodec_encode_video2(p->avctx_enc[i], &pkt, p->frame, &got_pkt);
+ p->frame_dec = p->avctx_enc[i]->coded_frame;
+
+ offset= (BLOCK-x1) + (BLOCK-y1)*p->frame_dec->linesize[0];
+Index: libmpcodecs/vf_lavc.c
+===================================================================
+--- libmpcodecs/vf_lavc.c (revision 37452)
++++ libmpcodecs/vf_lavc.c (revision 37453)
+@@ -86,6 +86,8 @@
+ mp_image_t* dmpi;
+ int out_size;
+ AVFrame *pic= vf->priv->pic;
++ int ret, got_pkt;
++ AVPacket pkt;
+
+ pic->data[0]=mpi->planes[0];
+ pic->data[1]=mpi->planes[1];
+@@ -94,10 +96,14 @@
+ pic->linesize[1]=mpi->stride[1];
+ pic->linesize[2]=mpi->stride[2];
+
+- out_size = avcodec_encode_video(&lavc_venc_context,
+- vf->priv->outbuf, vf->priv->outbuf_size, pic);
++ av_init_packet(&pkt);
++ pkt.data = vf->priv->outbuf;
++ pkt.size = vf->priv->outbuf_size;
++ ret = avcodec_encode_video2(&lavc_venc_context, &pkt, pic, &got_pkt);
+
+- if(out_size<=0) return 1;
++ if(ret<=0) return 1;
++ if(!got_pkt) return 1;
++ out_size = pkt.size;
+
+ dmpi=vf_get_image(vf->next,IMGFMT_MPEGPES,
+ MP_IMGTYPE_EXPORT, 0,
+Index: libmpcodecs/vf_mcdeint.c
+===================================================================
+--- libmpcodecs/vf_mcdeint.c (revision 37452)
++++ libmpcodecs/vf_mcdeint.c (revision 37453)
+@@ -92,6 +92,8 @@
+
+ static void filter(struct vf_priv_s *p, uint8_t *dst[3], uint8_t *src[3], int dst_stride[3], int src_stride[3], int width, int height){
+ int x, y, i;
++ int got_pkt;
++ AVPacket pkt;
+
+ for(i=0; i<3; i++){
+ p->frame->data[i]= src[i];
+@@ -101,7 +103,10 @@
+ p->avctx_enc->me_cmp=
+ p->avctx_enc->me_sub_cmp= FF_CMP_SAD /*| (p->parity ? FF_CMP_ODD : FF_CMP_EVEN)*/;
+ p->frame->quality= p->qp*FF_QP2LAMBDA;
+- avcodec_encode_video(p->avctx_enc, p->outbuf, p->outbuf_size, p->frame);
++ av_init_packet(&pkt);
++ pkt.data = p->outbuf;
++ pkt.size = p->outbuf_size;
++ avcodec_encode_video2(p->avctx_enc, &pkt, p->frame, &got_pkt);
+ p->frame_dec = p->avctx_enc->coded_frame;
+
+ for(i=0; i<3; i++){
diff --git a/media-video/mplayer/files/mplayer-1.3-CVE-2016-4352.patch b/media-video/mplayer/files/mplayer-1.3-CVE-2016-4352.patch
new file mode 100644
index 000000000000..4eabf8b5f28c
--- /dev/null
+++ b/media-video/mplayer/files/mplayer-1.3-CVE-2016-4352.patch
@@ -0,0 +1,24 @@
+https://trac.mplayerhq.hu/ticket/2295
+
+r37857
+
+--- old/libmpdemux/demux_gif.c
++++ new/libmpdemux/demux_gif.c
+@@ -304,6 +304,17 @@
+ return NULL;
+ }
+
++ // Validate image size, most code in this demuxer assumes w*h <= INT_MAX
++ if ((int64_t)gif->SWidth * gif->SHeight > INT_MAX) {
++ mp_msg(MSGT_DEMUX, MSGL_ERR,
++ "[demux_gif] Unsupported picture size %dx%d.\n", gif->SWidth,
++ gif->SHeight);
++ if (DGifCloseFile(gif) == GIF_ERROR)
++ print_gif_error(NULL);
++ free(priv);
++ return NULL;
++ }
++
+ // create a new video stream header
+ sh_video = new_sh_video(demuxer, 0);
+
diff --git a/media-video/mplayer/files/prepare_mplayer.sh b/media-video/mplayer/files/prepare_mplayer.sh
new file mode 100644
index 000000000000..57d47425689f
--- /dev/null
+++ b/media-video/mplayer/files/prepare_mplayer.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+VERSION=$(date +%Y%m%d)
+PACKAGE="mplayer-1.2_pre${VERSION}"
+DUMP_FFMPEG="$(dirname $0)/dump_ffmpeg.sh"
+
+svn checkout svn://svn.mplayerhq.hu/mplayer/trunk ${PACKAGE}
+
+pushd ${PACKAGE} > /dev/null
+ # ffmpeg is in git now so no svn external anymore
+ rm -rf ffmpeg
+ git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg/
+ sh "$DUMP_FFMPEG"
+ STORE_VERSION=$(LC_ALL=C svn info 2> /dev/null | grep Revision | cut -d' ' -f2)
+ printf "$STORE_VERSION" > snapshot_version
+popd > /dev/null
+
+find "${PACKAGE}" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
+find "${PACKAGE}" -type d -name '.git' -prune -print0 | xargs -0 rm -rf
+
+tar cJf ${PACKAGE}.tar.xz ${PACKAGE}
+rm -rf ${PACKAGE}/
+
+echo "Tarball: \"${PACKAGE}.tar.xz\""
+
+echo "** all done **"