tags 638552 patch
thanks
On Sat, Aug 20, 2011 at 11:22:07AM +0200, Daniel Svensson wrote:
> On Fri, Aug 19, 2011 at 7:48 PM, Moritz Muehlenhoff <[email protected]> wrote:
> > Your package currently fails to build from source when built against
> > libav/0.7.1 and needs to be adapted. You can test this yourself by
> > building against the packages from experimental:
>
> The commits here:
>
> http://git.xmms.se/xmms2/xmms2-devel/log/src/plugins/avcodec
>
> ...between 2011-05-23 and 2011-06-01 could be included in the debian
> patches which ought to fix the problem.
Thanks! Here's that as a consolidated Debian patch, test-built on
Ubuntu Oneiric:
* Backport from upstream:
- Fix avcodec plugin to work with latest libavcodec (closes: #638552).
diff -Nru xmms2-0.7DrNo+dfsg/debian/patches/libav-0.7.patch
xmms2-0.7DrNo+dfsg/debian/patches/libav-0.7.patch
--- xmms2-0.7DrNo+dfsg/debian/patches/libav-0.7.patch 1970-01-01
01:00:00.000000000 +0100
+++ xmms2-0.7DrNo+dfsg/debian/patches/libav-0.7.patch 2011-09-01
11:35:43.000000000 +0100
@@ -0,0 +1,239 @@
+Description: Fix avcodec plugin to work with latest libavcodec
+Author: Juho Vähä-Herttua <[email protected]>
+Origin: upstream, http://git.xmms.se/xmms2/xmms2-devel/log/src/plugins/avcodec
+Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=638552
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/832769
+Forwarded: not-needed
+Last-Update: 2011-09-01
+
+Index: b/src/plugins/avcodec/avcodec.c
+===================================================================
+--- a/src/plugins/avcodec/avcodec.c
++++ b/src/plugins/avcodec/avcodec.c
+@@ -24,25 +24,7 @@
+ #include <string.h>
+ #include <glib.h>
+
+-#undef ABS
+-#ifdef HAVE_LIBAVCODEC_AVCODEC_H
+-# include "libavcodec/avcodec.h"
+-#else
+-# include "avcodec.h"
+-#endif
+-
+-/* Handle API change that happened in libavcodec 52.00 */
+-#if LIBAVCODEC_VERSION_INT < 0x340000
+-# define CONTEXT_BPS(codecctx) (codecctx)->bits_per_sample
+-#else
+-# define CONTEXT_BPS(codecctx) (codecctx)->bits_per_coded_sample
+-#endif
+-
+-/* Map avcodec_decode_audio2 into the deprecated version
+- * avcodec_decode_audio in versions earlier than 51.28 */
+-#if LIBAVCODEC_VERSION_INT < 0x331c00
+-# define avcodec_decode_audio2 avcodec_decode_audio
+-#endif
++#include "avcodec_compat.h"
+
+ #define AVCODEC_BUFFER_SIZE 16384
+
+@@ -50,7 +32,6 @@
+ AVCodecContext *codecctx;
+
+ guchar *buffer;
+- guchar *buffer_pos;
+ guint buffer_length;
+ guint buffer_size;
+ gboolean no_demuxer;
+@@ -101,6 +82,10 @@
+
+ xmms_magic_add ("Shorten header", "audio/x-ffmpeg-shorten",
+ "0 string ajkg", NULL);
++ xmms_magic_add ("A/52 (AC-3) header", "audio/x-ffmpeg-ac3",
++ "0 beshort 0x0b77", NULL);
++ xmms_magic_add ("DTS header", "audio/x-ffmpeg-dca",
++ "0 belong 0x7ffe8001", NULL);
+
+ xmms_xform_plugin_indata_add (xform_plugin,
+ XMMS_STREAM_TYPE_MIMETYPE,
+@@ -135,7 +120,7 @@
+ AVCodec *codec;
+ const gchar *mimetype;
+ const guchar *tmpbuf;
+- gssize tmpbuflen;
++ gsize tmpbuflen;
+ gint ret;
+
+ g_return_val_if_fail (xform, FALSE);
+@@ -160,7 +145,7 @@
+ goto err;
+ }
+
+- if (codec->type != CODEC_TYPE_AUDIO) {
++ if (codec->type != AVMEDIA_TYPE_AUDIO) {
+ XMMS_DBG ("Codec '%s' found but its type is not audio",
data->codec_id);
+ goto err;
+ }
+@@ -199,7 +184,9 @@
+ * demuxer so they will be handled slightly differently... */
+ if (!strcmp (data->codec_id, "shorten") ||
+ !strcmp (data->codec_id, "adpcm_swf") ||
+- !strcmp (data->codec_id, "pcm_s16le")) {
++ !strcmp (data->codec_id, "pcm_s16le") ||
++ !strcmp (data->codec_id, "ac3") ||
++ !strcmp (data->codec_id, "dca")) {
+ /* number 1024 taken from libavformat raw.c
RAW_PACKET_SIZE */
+ data->extradata = g_malloc0 (1024);
+ data->extradata_size = 1024;
+@@ -280,12 +267,15 @@
+
+ size = MIN (data->outbuf->len, len);
+ while (size == 0) {
+- if (data->buffer_length == 0) {
++ AVPacket packet;
++ av_init_packet (&packet);
++
++ if (data->no_demuxer || data->buffer_length == 0) {
+ gint read_total;
+
+ bytes_read = xmms_xform_read (xform,
+- (gchar *) data->buffer,
+- data->buffer_size,
++ (gchar *) (data->buffer +
data->buffer_length),
++ data->buffer_size -
data->buffer_length,
+ error);
+
+ if (bytes_read < 0) {
+@@ -328,22 +318,35 @@
+ }
+ }
+
+- /* Reset the buffer position to beginning and update
length */
+- data->buffer_pos = data->buffer;
+- data->buffer_length = read_total;
++ /* Update the buffer length */
++ data->buffer_length += read_total;
+ }
+
++ packet.data = data->buffer;
++ packet.size = data->buffer_length;
++
+ outbufsize = sizeof (outbuf);
+- bytes_read = avcodec_decode_audio2 (data->codecctx, (short *)
outbuf,
+- &outbufsize,
data->buffer_pos,
+- data->buffer_length);
++ bytes_read = avcodec_decode_audio3 (data->codecctx, (short *)
outbuf,
++ &outbufsize, &packet);
++
++ /* The DTS decoder of ffmpeg is buggy and always returns
++ * the input buffer length, get frame length from header */
++ if (!strcmp (data->codec_id, "dca") && bytes_read > 0) {
++ bytes_read = ((int)data->buffer[5] << 12) |
++ ((int)data->buffer[6] << 4) |
++ ((int)data->buffer[7] >> 4);
++ bytes_read = (bytes_read & 0x3fff) + 1;
++ }
+
+ if (bytes_read < 0 || bytes_read > data->buffer_length) {
+ XMMS_DBG ("Error decoding data!");
+ return -1;
++ } else if (bytes_read != data->buffer_length) {
++ g_memmove (data->buffer,
++ data->buffer + bytes_read,
++ data->buffer_length - bytes_read);
+ }
+
+- data->buffer_pos += bytes_read;
+ data->buffer_length -= bytes_read;
+
+ if (outbufsize > 0) {
+@@ -383,10 +386,14 @@
+ /* The buggy ape decoder doesn't flush buffers, so we need to finish
decoding
+ * the frame before seeking to avoid segfaults... this hack sucks */
+ while (data->buffer_length > 0) {
++ AVPacket packet;
++ av_init_packet (&packet);
++ packet.data = data->buffer;
++ packet.size = data->buffer_length;
++
+ outbufsize = sizeof (outbuf);
+- bytes_read = avcodec_decode_audio2 (data->codecctx, (short *)
outbuf,
+- &outbufsize, data->buffer,
+- data->buffer_length);
++ bytes_read = avcodec_decode_audio3 (data->codecctx, (short *)
outbuf,
++ &outbufsize, &packet);
+
+ if (bytes_read < 0 || bytes_read > data->buffer_length) {
+ XMMS_DBG ("Error decoding data!");
+Index: b/src/plugins/avcodec/avcodec_compat.h
+===================================================================
+--- /dev/null
++++ b/src/plugins/avcodec/avcodec_compat.h
+@@ -0,0 +1,67 @@
++/** @file avcodec_compat.h
++ * Compatibility header for libavcodec backwards compatibility
++ *
++ * Copyright (C) 2011 XMMS2 Team
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ */
++
++#undef ABS
++#ifdef HAVE_LIBAVCODEC_AVCODEC_H
++# include "libavcodec/avcodec.h"
++#else
++# include "avcodec.h"
++#endif
++
++/* Map avcodec_decode_audio2 into the deprecated version
++ * avcodec_decode_audio in versions earlier than 51.28 */
++#if LIBAVCODEC_VERSION_INT < 0x331c00
++# define avcodec_decode_audio2 avcodec_decode_audio
++#endif
++
++/* Handle API change that happened in libavcodec 52.00 */
++#if LIBAVCODEC_VERSION_INT < 0x340000
++# define CONTEXT_BPS(codecctx) (codecctx)->bits_per_sample
++#else
++# define CONTEXT_BPS(codecctx) (codecctx)->bits_per_coded_sample
++#endif
++
++/* Before 52.23 AVPacket was defined in avformat.h which we
++ * do not want to depend on, so we define part of it manually
++ * on versions smaller than 52.23 (this makes me cry) */
++#if LIBAVCODEC_VERSION_INT < 0x341700
++typedef struct AVPacket {
++ uint8_t *data;
++ int size;
++} AVPacket;
++#endif
++
++/* Same thing as above for av_init_packet and version 52.25 */
++#if LIBAVCODEC_VERSION_INT < 0x341900
++# define av_init_packet(pkt) do { \
++ (pkt)->data = NULL; \
++ (pkt)->size = 0; \
++ } while(0)
++#endif
++
++/* Map avcodec_decode_audio3 into the deprecated version
++ * avcodec_decode_audio2 in versions earlier than 52.26 */
++#if LIBAVCODEC_VERSION_INT < 0x341a00
++# define avcodec_decode_audio3(avctx, samples, frame_size_ptr, avpkt) \
++ avcodec_decode_audio2(avctx, samples, frame_size_ptr, \
++ (avpkt)->data, (avpkt)->size)
++#endif
++
++/* Handle API change that happened in libavcodec 52.64 */
++#if LIBAVCODEC_VERSION_INT < 0x344000
++# define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
++#endif
++
diff -Nru xmms2-0.7DrNo+dfsg/debian/patches/series
xmms2-0.7DrNo+dfsg/debian/patches/series
--- xmms2-0.7DrNo+dfsg/debian/patches/series 2010-08-02 22:32:27.000000000
+0100
+++ xmms2-0.7DrNo+dfsg/debian/patches/series 2011-09-01 11:25:49.000000000
+0100
@@ -13,3 +13,4 @@
bp-nycli-command-line-length.patch
plugin-tta-segment-with-startms.patch
bp-glib-version-check.patch
+libav-0.7.patch
Regards,
--
Colin Watson [[email protected]]
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]