diff options
author | Alexis Ballier <aballier@gentoo.org> | 2013-08-06 15:34:36 +0000 |
---|---|---|
committer | Alexis Ballier <aballier@gentoo.org> | 2013-08-06 15:34:36 +0000 |
commit | 035896f24321d7e221d5ecf47f895e68aebc1aa7 (patch) | |
tree | 71dabf74dca8fb9fcaf72e7ce5da512bdf13a47d /media-plugins/gst-plugins-ffmpeg | |
parent | version bump (diff) | |
download | gentoo-2-035896f24321d7e221d5ecf47f895e68aebc1aa7.tar.gz gentoo-2-035896f24321d7e221d5ecf47f895e68aebc1aa7.tar.bz2 gentoo-2-035896f24321d7e221d5ecf47f895e68aebc1aa7.zip |
Attempt to fix planar audio support. Fix build with FFmpeg 2.0, bug #476528.
(Portage version: 2.2.0_alpha194/cvs/Linux x86_64, signed Manifest commit with key 160F534A)
Diffstat (limited to 'media-plugins/gst-plugins-ffmpeg')
4 files changed, 411 insertions, 1 deletions
diff --git a/media-plugins/gst-plugins-ffmpeg/ChangeLog b/media-plugins/gst-plugins-ffmpeg/ChangeLog index ef8d6fa38962..a9bfee86afff 100644 --- a/media-plugins/gst-plugins-ffmpeg/ChangeLog +++ b/media-plugins/gst-plugins-ffmpeg/ChangeLog @@ -1,6 +1,14 @@ # ChangeLog for media-plugins/gst-plugins-ffmpeg # Copyright 1999-2013 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/media-plugins/gst-plugins-ffmpeg/ChangeLog,v 1.166 2013/07/28 17:35:50 aballier Exp $ +# $Header: /var/cvsroot/gentoo-x86/media-plugins/gst-plugins-ffmpeg/ChangeLog,v 1.167 2013/08/06 15:34:36 aballier Exp $ + +*gst-plugins-ffmpeg-0.10.13_p201211-r1 (06 Aug 2013) + + 06 Aug 2013; Alexis Ballier <aballier@gentoo.org> + +gst-plugins-ffmpeg-0.10.13_p201211-r1.ebuild, + +files/0.10.13_p201211-ffmpeg2.patch, + +files/0.10.13_p201211-planaraudio.patch: + Attempt to fix planar audio support. Fix build with FFmpeg 2.0, bug #476528. 28 Jul 2013; Alexis Ballier <aballier@gentoo.org> gst-plugins-ffmpeg-0.10.13_p201211.ebuild: diff --git a/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-ffmpeg2.patch b/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-ffmpeg2.patch new file mode 100644 index 000000000000..0ee39dac7f53 --- /dev/null +++ b/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-ffmpeg2.patch @@ -0,0 +1,139 @@ +Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcfg.c +=================================================================== +--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegcfg.c ++++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcfg.c +@@ -171,13 +171,10 @@ gst_ffmpeg_idct_algo_get_type (void) + {FF_IDCT_INT, "JPEG reference Integer", "int"}, + {FF_IDCT_SIMPLE, "Simple", "simple"}, + {FF_IDCT_SIMPLEMMX, "Simple MMX", "simplemmx"}, +- {FF_IDCT_LIBMPEG2MMX, "LIBMPEG2MMX", "libmpeg2mmx"}, + {FF_IDCT_ARM, "ARM", "arm"}, + {FF_IDCT_ALTIVEC, "ALTIVEC", "altivec"}, + {FF_IDCT_SH4, "SH4", "sh4"}, + {FF_IDCT_SIMPLEARM, "SIMPLEARM", "simplearm"}, +- {FF_IDCT_H264, "H264", "h264"}, +- {FF_IDCT_VP3, "VP3", "vp3"}, + {FF_IDCT_IPP, "IPP", "ipp"}, + {FF_IDCT_XVIDMMX, "XVIDMMX", "xvidmmx"}, + {0, NULL, NULL}, +@@ -274,9 +271,6 @@ gst_ffmpeg_flags_get_type (void) + "global-headers"}, + {CODEC_FLAG_AC_PRED, "H263 Advanced Intra Coding / MPEG4 AC prediction", + "aic"}, +- {CODEC_FLAG_CBP_RD, "Rate Distoration Optimization for CBP", "cbp-rd"}, +- {CODEC_FLAG_QP_RD, "Rate Distoration Optimization for QP selection", +- "qp-rd"}, + {CODEC_FLAG_CLOSED_GOP, "Closed GOP", "closedgop"}, + {0, NULL, NULL}, + }; +@@ -580,18 +574,6 @@ gst_ffmpeg_cfg_init (void) + -100, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + gst_ffmpeg_add_pspec (pspec, max_key_interval, FALSE, mpeg, NULL); + +- pspec = g_param_spec_int ("luma-elim-threshold", +- "Luma Elimination Threshold", +- "Luma Single Coefficient Elimination Threshold", +- -99, 99, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); +- gst_ffmpeg_add_pspec (pspec, config.luma_elim_threshold, FALSE, mpeg, NULL); +- +- pspec = g_param_spec_int ("chroma-elim-threshold", +- "Chroma Elimination Threshold", +- "Chroma Single Coefficient Elimination Threshold", +- -99, 99, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); +- gst_ffmpeg_add_pspec (pspec, config.chroma_elim_threshold, FALSE, mpeg, NULL); +- + pspec = g_param_spec_float ("lumi-masking", "Luminance Masking", + "Luminance Masking", -1.0f, 1.0f, 0.0f, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); +Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcodecmap.c +=================================================================== +--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegcodecmap.c ++++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcodecmap.c +@@ -572,13 +572,11 @@ gst_ffmpeg_codecid_to_caps (enum AVCodec + break; + } + +- /* FIXME: context->sub_id must be filled in during decoding */ + caps = + gst_ff_vid_caps_new (context, codec_id, encode, + "video/x-pn-realvideo", "systemstream", G_TYPE_BOOLEAN, FALSE, + "rmversion", G_TYPE_INT, version, NULL); + if (context) { +- gst_caps_set_simple (caps, "format", G_TYPE_INT, context->sub_id, NULL); + if (context->extradata_size >= 8) { + gst_caps_set_simple (caps, + "subformat", G_TYPE_INT, GST_READ_UINT32_BE (context->extradata), +@@ -2559,18 +2557,6 @@ gst_ffmpeg_caps_with_codecid (enum AVCod + } + break; + +- case AV_CODEC_ID_RV10: +- case AV_CODEC_ID_RV20: +- case AV_CODEC_ID_RV30: +- case AV_CODEC_ID_RV40: +- { +- gint format; +- +- if (gst_structure_get_int (str, "format", &format)) +- context->sub_id = format; +- +- break; +- } + case AV_CODEC_ID_COOK: + case AV_CODEC_ID_RA_288: + case AV_CODEC_ID_RA_144: +Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegenc.c +=================================================================== +--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegenc.c ++++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegenc.c +@@ -572,7 +572,6 @@ gst_ffmpegenc_setcaps (GstPad * pad, Gst + ffmpegenc->context->coder_type = 0; + ffmpegenc->context->context_model = 0; + ffmpegenc->context->scenechange_threshold = 0; +- ffmpegenc->context->inter_threshold = 0; + + /* and last but not least the pass; CBR, 2-pass, etc */ + ffmpegenc->context->flags |= ffmpegenc->pass; +Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegdec.c +=================================================================== +--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegdec.c ++++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegdec.c +@@ -2082,7 +2082,7 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec + const GstTSInfo * dec_info, GstBuffer ** outbuf, GstFlowReturn * ret) + { + gint len = -1, got_frame; +- gint have_data = AVCODEC_MAX_AUDIO_FRAME_SIZE; ++ gint have_data = 0; + GstClockTime out_timestamp, out_duration; + gint64 out_offset; + AVPacket packet; +@@ -2101,21 +2101,22 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec + goto beach; + } + +- *outbuf = +- new_aligned_buffer (AVCODEC_MAX_AUDIO_FRAME_SIZE, +- GST_PAD_CAPS (ffmpegdec->srcpad)); +- + gst_avpacket_init (&packet, data, size); + len = avcodec_decode_audio4 (ffmpegdec->context, frame, &got_frame, &packet); + GST_DEBUG_OBJECT (ffmpegdec, + "Decode audio: ret=%d, got_frame=%d", len, got_frame); + if (!got_frame) { +- gst_buffer_unref (*outbuf); +- *outbuf = NULL; + len = -1; + goto beach; + } +- if (len >= 0) have_data = copy_samples(ffmpegdec->context, frame, GST_BUFFER_DATA (*outbuf), AVCODEC_MAX_AUDIO_FRAME_SIZE); ++ ++ int obuf_size = av_samples_get_buffer_size(NULL, ffmpegdec->context->channels, frame->nb_samples, frame->format, 0); ++ ++ *outbuf= ++ new_aligned_buffer (obuf_size, ++ GST_PAD_CAPS (ffmpegdec->srcpad)); ++ ++ if (len >= 0) have_data = copy_samples(ffmpegdec->context, frame, GST_BUFFER_DATA (*outbuf), obuf_size); + + if (len >= 0 && have_data > 0) { + GST_DEBUG_OBJECT (ffmpegdec, "Creating output buffer"); diff --git a/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-planaraudio.patch b/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-planaraudio.patch new file mode 100644 index 000000000000..424bd0cc5c71 --- /dev/null +++ b/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-planaraudio.patch @@ -0,0 +1,187 @@ +Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcodecmap.c +=================================================================== +--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegcodecmap.c ++++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcodecmap.c +@@ -1925,6 +1925,10 @@ gst_ffmpeg_smpfmt_to_caps (enum AVSample + gboolean integer = TRUE; + gboolean signedness = FALSE; + ++#if LIBAVUTIL_VERSION_INT > AV_VERSION_INT(51,46,0) ++ sample_fmt = av_get_packed_sample_fmt (sample_fmt); ++#endif ++ + switch (sample_fmt) { + case AV_SAMPLE_FMT_S16: + signedness = TRUE; +@@ -2009,7 +2013,7 @@ gst_ffmpeg_codectype_to_audio_caps (AVCo + + ctx.channels = -1; + caps = gst_caps_new_empty (); +- for (i = 0; i <= AV_SAMPLE_FMT_DBL; i++) { ++ for (i = 0; i < AV_SAMPLE_FMT_NB; i++) { + temp = + gst_ffmpeg_smpfmt_to_caps (i, encode ? &ctx : NULL, codec_id, encode); + if (temp != NULL) { +Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegutils.c +=================================================================== +--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegutils.c ++++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegutils.c +@@ -47,6 +47,9 @@ gint + av_smp_format_depth (enum AVSampleFormat smp_fmt) + { + gint depth = -1; ++#if LIBAVUTIL_VERSION_INT > AV_VERSION_INT(51,46,0) ++ smp_fmt = av_get_packed_sample_fmt (smp_fmt); ++#endif + switch (smp_fmt) { + case AV_SAMPLE_FMT_U8: + depth = 1; +Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegdec.c +=================================================================== +--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegdec.c ++++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegdec.c +@@ -2044,16 +2044,49 @@ out_of_segment: + } + } + ++static void copy_samples_planar(unsigned bps, ++ unsigned nb_samples, ++ unsigned nb_channels, ++ unsigned char *dst, ++ unsigned char **src) ++{ ++ unsigned s, c, o = 0; ++ ++ for (s = 0; s < nb_samples; s++) { ++ for (c = 0; c < nb_channels; c++) { ++ memcpy(dst, src[c] + o, bps); ++ dst += bps; ++ } ++ o += bps; ++ } ++} ++ ++static int copy_samples(AVCodecContext *avc, AVFrame *frame, ++ unsigned char *buf, int max_size) ++{ ++ int channels = avc->channels; ++ int sample_size = av_get_bytes_per_sample(avc->sample_fmt); ++ int size = channels * sample_size * frame->nb_samples; ++ if (size > max_size) { ++ return -1; ++ } ++ if (av_sample_fmt_is_planar(avc->sample_fmt)) ++ copy_samples_planar(sample_size, frame->nb_samples, channels, buf, frame->extended_data); ++ else memcpy(buf, frame->data[0], size); ++ return size; ++} ++ + static gint + gst_ffmpegdec_audio_frame (GstFFMpegDec * ffmpegdec, + AVCodec * in_plugin, guint8 * data, guint size, + const GstTSInfo * dec_info, GstBuffer ** outbuf, GstFlowReturn * ret) + { +- gint len = -1; ++ gint len = -1, got_frame; + gint have_data = AVCODEC_MAX_AUDIO_FRAME_SIZE; + GstClockTime out_timestamp, out_duration; + gint64 out_offset; + AVPacket packet; ++ AVFrame *frame; + + GST_DEBUG_OBJECT (ffmpegdec, + "size:%d, offset:%" G_GINT64_FORMAT ", ts:%" GST_TIME_FORMAT ", dur:%" +@@ -2061,15 +2094,28 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec + dec_info->offset, GST_TIME_ARGS (dec_info->timestamp), + GST_TIME_ARGS (dec_info->duration), GST_TIME_ARGS (ffmpegdec->next_out)); + ++ frame = avcodec_alloc_frame(); ++ if (!frame) { ++ *outbuf = NULL; ++ len = -1; ++ goto beach; ++ } ++ + *outbuf = + new_aligned_buffer (AVCODEC_MAX_AUDIO_FRAME_SIZE, + GST_PAD_CAPS (ffmpegdec->srcpad)); + + gst_avpacket_init (&packet, data, size); +- len = avcodec_decode_audio3 (ffmpegdec->context, +- (int16_t *) GST_BUFFER_DATA (*outbuf), &have_data, &packet); ++ len = avcodec_decode_audio4 (ffmpegdec->context, frame, &got_frame, &packet); + GST_DEBUG_OBJECT (ffmpegdec, +- "Decode audio: len=%d, have_data=%d", len, have_data); ++ "Decode audio: ret=%d, got_frame=%d", len, got_frame); ++ if (!got_frame) { ++ gst_buffer_unref (*outbuf); ++ *outbuf = NULL; ++ len = -1; ++ goto beach; ++ } ++ if (len >= 0) have_data = copy_samples(ffmpegdec->context, frame, GST_BUFFER_DATA (*outbuf), AVCODEC_MAX_AUDIO_FRAME_SIZE); + + if (len >= 0 && have_data > 0) { + GST_DEBUG_OBJECT (ffmpegdec, "Creating output buffer"); +@@ -2145,6 +2191,7 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec + } + + beach: ++ av_free(frame); + GST_DEBUG_OBJECT (ffmpegdec, "return flow %d, out %p, len %d", + *ret, *outbuf, len); + return len; +Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegenc.c +=================================================================== +--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegenc.c ++++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegenc.c +@@ -843,12 +843,30 @@ gst_ffmpegenc_chain_video (GstPad * pad, + return gst_pad_push (ffmpegenc->srcpad, outbuf); + } + ++static void copy_samples_to_planar(unsigned bps, ++ unsigned nb_samples, ++ unsigned nb_channels, ++ unsigned char *dst, ++ unsigned char *src) ++{ ++ unsigned s, c, o = 0; ++ ++ for (s = 0; s < nb_samples; s++) { ++ for (c = 0; c < nb_channels; c++) { ++ memcpy(dst + nb_samples * c, src + o, bps); ++ o += bps; ++ } ++ dst += bps; ++ } ++} ++ + static GstFlowReturn + gst_ffmpegenc_encode_audio (GstFFMpegEnc * ffmpegenc, guint8 * audio_in, + guint in_size, guint max_size, GstClockTime timestamp, + GstClockTime duration, gboolean discont) + { + GstBuffer *outbuf; ++ GstBuffer *inbuf2; + AVCodecContext *ctx; + guint8 *audio_out; + gint res; +@@ -864,7 +882,18 @@ gst_ffmpegenc_encode_audio (GstFFMpegEnc + if (ffmpegenc->buffer_size != max_size) + ffmpegenc->buffer_size = max_size; + ++ if (av_sample_fmt_is_planar(ctx->sample_fmt)) { ++ guint8 * audio_in2; ++ inbuf2 = gst_buffer_new_and_alloc (in_size + FF_MIN_BUFFER_SIZE); ++ audio_in2 = GST_BUFFER_DATA (inbuf2); ++ copy_samples_to_planar(av_get_bytes_per_sample(ctx->sample_fmt), in_size / (av_get_bytes_per_sample(ctx->sample_fmt) * ctx->channels), ++ ctx->channels, audio_in2, audio_in); ++ audio_in = audio_in2; ++ } + res = avcodec_encode_audio (ctx, audio_out, max_size, (short *) audio_in); ++ if (av_sample_fmt_is_planar(ctx->sample_fmt)) { ++ gst_buffer_unref (inbuf2); ++ } + + if (res < 0) { + GST_ERROR_OBJECT (ffmpegenc, "Failed to encode buffer: %d", res); diff --git a/media-plugins/gst-plugins-ffmpeg/gst-plugins-ffmpeg-0.10.13_p201211-r1.ebuild b/media-plugins/gst-plugins-ffmpeg/gst-plugins-ffmpeg-0.10.13_p201211-r1.ebuild new file mode 100644 index 000000000000..0c71a785d98b --- /dev/null +++ b/media-plugins/gst-plugins-ffmpeg/gst-plugins-ffmpeg-0.10.13_p201211-r1.ebuild @@ -0,0 +1,76 @@ +# Copyright 1999-2013 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/media-plugins/gst-plugins-ffmpeg/gst-plugins-ffmpeg-0.10.13_p201211-r1.ebuild,v 1.1 2013/08/06 15:34:36 aballier Exp $ + +EAPI=5 + +inherit base eutils flag-o-matic + +MY_PN="gst-ffmpeg" +MY_P=${MY_PN}-${PV} + +# Create a major/minor combo for SLOT +PVP=(${PV//[-\._]/ }) +SLOT=${PVP[0]}.${PVP[1]} + +DESCRIPTION="FFmpeg based gstreamer plugin" +HOMEPAGE="http://gstreamer.freedesktop.org/modules/gst-ffmpeg.html" +#SRC_URI="http://gstreamer.freedesktop.org/src/${MY_PN}/${MY_P}.tar.bz2" +SRC_URI="http://dev.gentoo.org/~tetromino/distfiles/${PN}/${MY_P}.tar.xz + http://dev.gentoo.org/~tetromino/distfiles/${PN}/${MY_P}-libav-9-patches.tar.xz" + +LICENSE="GPL-2" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~sparc ~x86 ~amd64-fbsd ~x86-fbsd" +IUSE="+orc" + +S=${WORKDIR}/${MY_P} + +RDEPEND=">=media-libs/gstreamer-0.10.31:0.10 + >=media-libs/gst-plugins-base-0.10.31:0.10 + >=virtual/ffmpeg-0.10 + || ( media-video/ffmpeg media-libs/libpostproc ) + orc? ( >=dev-lang/orc-0.4.6 )" +DEPEND="${RDEPEND} + virtual/pkgconfig" + +src_prepare() { + sed -e 's/sleep 15//' -i configure.ac configure || die + + # libav-9 support backported from gst-plugins-libav-1.1.0 + epatch ../${MY_P}-libav-9-patches/*.patch + + # compat bits for older ffmpeg/libav releases + epatch "${FILESDIR}/${PV}-channel_layout.patch" \ + "${FILESDIR}/${PV}-iscodec.patch" \ + "${FILESDIR}/${PV}-coma.patch" \ + "${FILESDIR}/${PV}-gstffmpegpipe_redef.patch" + + # compatibility with recent releases + if has_version '>=media-video/ffmpeg-1.1' || has_version '>=media-video/libav-9' ; then + epatch "${FILESDIR}/${PV}-planaraudio.patch" + sed -i -e 's/ CODEC_ID/ AV_CODEC_ID/g' \ + -e 's/ CodecID/ AVCodecID/g' \ + ext/ffmpeg/*.{c,h} + epatch "${FILESDIR}/${PV}-ffmpeg2.patch" + fi +} + +src_configure() { + # always use system ffmpeg if possible + econf \ + --with-system-ffmpeg \ + $(use_enable orc) +} + +src_install() { + default + prune_libtool_files --modules +} + +pkg_postinst() { + if has_version "media-video/ffmpeg"; then + elog "Please note that upstream uses media-video/libav" + elog "rather than media-video/ffmpeg. If you encounter any" + elog "issues try to move from ffmpeg to libav." + fi +} |