From nobody@FreeBSD.org  Wed Feb 26 21:50:05 2014
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115])
	(using TLSv1 with cipher ADH-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by hub.freebsd.org (Postfix) with ESMTPS id 2F327BED
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 26 Feb 2014 21:50:05 +0000 (UTC)
Received: from newred.freebsd.org (cgiserv.freebsd.org [IPv6:2001:1900:2254:206a::50:4])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mx1.freebsd.org (Postfix) with ESMTPS id 193F810E5
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 26 Feb 2014 21:50:05 +0000 (UTC)
Received: from cgiserv.freebsd.org ([127.0.1.6])
	by newred.freebsd.org (8.14.7/8.14.7) with ESMTP id s1QLo4um087696
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 26 Feb 2014 21:50:04 GMT
	(envelope-from nobody@cgiserv.freebsd.org)
Received: (from nobody@localhost)
	by cgiserv.freebsd.org (8.14.7/8.14.7/Submit) id s1QLo4Eq087693;
	Wed, 26 Feb 2014 21:50:04 GMT
	(envelope-from nobody)
Message-Id: <201402262150.s1QLo4Eq087693@cgiserv.freebsd.org>
Date: Wed, 26 Feb 2014 21:50:04 GMT
From: Igor Steuck Lopes <igorstklps@gmail.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: XMMS2 Compile problem on Conky port install
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         187100
>Category:       ports
>Synopsis:       audio/xmms2 Compile problem on Conky port install
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    madpilot
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Feb 26 22:00:01 UTC 2014
>Closed-Date:    Thu Feb 27 19:53:07 UTC 2014
>Last-Modified:  Thu Feb 27 20:00:00 UTC 2014
>Originator:     Igor Steuck Lopes
>Release:        FreeBSD 10.0 - CURRENT
>Organization:
>Environment:
FreeBSD 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16 22:34:59 UTC 2014     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64

>Description:
On the Conky install via ports after fetching all the packages, during the compile stage the following appears:

3 warnings and 3 errors generated.
1 warning generated.
Waf: Leaving directory `/usr/ports/audio/xmms2/work/xmms2-0.8DrO_o/_build_'
Build failed
 -> task failed (exit status 1): 
	{task 34462400144: c avcodec.c -> avcodec.c.1.o}
['cc', '-I/usr/local/include', '-O2', '-pipe', '-fno-strict-aliasing', '-Wall', '-Wempty-body', '-Wformat=2', '-Wformat-nonliteral', '-Wformat-security', '-Wignored-qualifiers', '-Wmissing-prototypes', '-Wstrict-prototypes', '-Wtype-limits', '-Wwrite-strings', '-Wno-format-extra-args', '-Wno-format-zero-length', '-fdiagnostics-show-option', '-Werror=implicit-function-declaration', '-fPIC', '-I/usr/ports/audio/xmms2/work/xmms2-0.8DrO_o/_build_', '-I/usr/ports/audio/xmms2/work/xmms2-0.8DrO_o', '-I/usr/ports/audio/xmms2/work/xmms2-0.8DrO_o/_build_/src/include', '-I/usr/ports/audio/xmms2/work/xmms2-0.8DrO_o/src/include', '-I/usr/local/include/glib-2.0', '-I/usr/local/include', '../src/plugins/avcodec/avcodec.c', '-c', '-o', 'src/plugins/avcodec/avcodec.c.1.o']
*** Error code 1

Stop.
make[3]: stopped in /usr/ports/audio/xmms2
*** Error code 1

Stop.
make[2]: stopped in /usr/ports/audio/xmms2
*** Error code 1

Stop.
make[1]: stopped in /usr/ports/sysutils/conky
*** Error code 1


>How-To-Repeat:
cd /user/ports/sysutils/conky/
make install clean
>Fix:


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-ports-bugs->madpilot 
Responsible-Changed-By: edwin 
Responsible-Changed-When: Thu Feb 27 02:15:17 UTC 2014 
Responsible-Changed-Why:  
Over to maintainer (via the GNATS Auto Assign Tool) 

http://www.freebsd.org/cgi/query-pr.cgi?pr=187100 

From: Guido Falsi <madpilot@FreeBSD.org>
To: bug-followup@FreeBSD.org, igorstklps@gmail.com
Cc:  
Subject: Re: ports/187100: audio/xmms2 Compile problem on Conky port install
Date: Thu, 27 Feb 2014 09:46:11 +0100

 Hi,
 
 Thanks for the report.
 
 The actual error message is further up the error log than what you sent
 in the PR.
 
 Can you send me the whole build log?
 
 Thanks in advance.
 
 -- 
 Guido Falsi <madpilot@FreeBSD.org>

From: Guido Falsi <madpilot@FreeBSD.org>
To: bug-followup@FreeBSD.org, igorstklps@gmail.com
Cc:  
Subject: Re: ports/187100: audio/xmms2 Compile problem on Conky port install
Date: Thu, 27 Feb 2014 09:47:41 +0100

 On 02/27/14 09:46, Guido Falsi wrote:
 > Hi,
 > 
 > Thanks for the report.
 > 
 > The actual error message is further up the error log than what you sent
 > in the PR.
 > 
 > Can you send me the whole build log?
 > 
 > Thanks in advance.
 > 
 
 I forgot, please also report if you changed any of the options in the
 xmms2 port when compiling it.
 
 Thanks again.
 
 -- 
 Guido Falsi <madpilot@FreeBSD.org>
State-Changed-From-To: open->closed 
State-Changed-By: madpilot 
State-Changed-When: Thu Feb 27 19:53:06 UTC 2014 
State-Changed-Why:  
Fix committed. Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=187100 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: ports/187100: commit references a PR
Date: Thu, 27 Feb 2014 19:52:20 +0000 (UTC)

 Author: madpilot
 Date: Thu Feb 27 19:52:11 2014
 New Revision: 346384
 URL: http://svnweb.freebsd.org/changeset/ports/346384
 QAT: https://qat.redports.org/buildarchive/r346384/
 
 Log:
   - Fix build with AVCODEC option [1]
   - Fix build with when both VISUAL and VORBIS options are on
   - While here, make portlint happier
   
   PR:		ports/187100 [1]
   Submitted by:	Igor Steuck Lopes <igorstklps@gmail.com>
   Obtained from:	Upstream [1]
 
 Added:
   head/audio/xmms2/files/patch-src_plugins_avcodec_avcodec__compat.h   (contents, props changed)
 Modified:
   head/audio/xmms2/Makefile
   head/audio/xmms2/files/patch-src_plugins_avcodec_avcodec.c
 
 Modified: head/audio/xmms2/Makefile
 ==============================================================================
 --- head/audio/xmms2/Makefile	Thu Feb 27 18:10:04 2014	(r346383)
 +++ head/audio/xmms2/Makefile	Thu Feb 27 19:52:11 2014	(r346384)
 @@ -3,8 +3,8 @@
  
  PORTNAME?=	xmms2
  PORTVERSION=	0.8
 -PORTREVISION?=	5
  DISTVERSIONSUFFIX=DrO_o
 +PORTREVISION?=	5
  CATEGORIES?=	audio
  MASTER_SITES=	SF/${PORTNAME}/${PORTNAME}/${PORTVERSION}%20${DISTVERSIONSUFFIX}
  
 @@ -372,6 +372,10 @@ PLIST_SUB+=	ET="@comment "
  
  post-patch:
  	@${REINPLACE_CMD} -e "s|%%WRKSRC%%|${WRKSRC}|" ${WRKSRC}/wscript
 +.if ${PORT_OPTIONS:MVISUAL} && ${PORT_OPTIONS:MVORBIS}
 +	@${REINPLACE_CMD} -e "s|'vorbisenc',|'vorbisenc vorbis ogg',|" \
 +		${WRKSRC}/src/clients/vistest/wscript
 +.endif
  
  do-configure:
  	cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ${PYTHON_CMD} waf ${_MAKE_JOBS} configure \
 
 Modified: head/audio/xmms2/files/patch-src_plugins_avcodec_avcodec.c
 ==============================================================================
 --- head/audio/xmms2/files/patch-src_plugins_avcodec_avcodec.c	Thu Feb 27 18:10:04 2014	(r346383)
 +++ head/audio/xmms2/files/patch-src_plugins_avcodec_avcodec.c	Thu Feb 27 19:52:11 2014	(r346384)
 @@ -1,13 +1,527 @@
 ---- src/plugins/avcodec/avcodec.c.orig	2013-10-25 14:04:33.493859184 -0200
 -+++ src/plugins/avcodec/avcodec.c	2013-10-25 14:08:39.342858585 -0200
 -@@ -28,6 +28,10 @@
 - 
 - #define AVCODEC_BUFFER_SIZE 16384
 - 
 -+#ifndef AVCODEC_MAX_AUDIO_FRAME_SIZE
 -+#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
 -+#endif
 +--- src/plugins/avcodec/avcodec.c.orig	2011-10-20 21:26:08.000000000 +0200
 ++++ src/plugins/avcodec/avcodec.c	2014-02-27 18:55:51.060717698 +0100
 +@@ -1,7 +1,7 @@
 + /** @file avcodec.c
 +  *  Decoder plugin for ffmpeg avcodec formats
 +  *
 +- *  Copyright (C) 2006-2011 XMMS2 Team
 ++ *  Copyright (C) 2006-2014 XMMS2 Team
 +  *
 +  *  This library is free software; you can redistribute it and/or
 +  *  modify it under the terms of the GNU Lesser General Public
 +@@ -14,15 +14,16 @@
 +  *  Lesser General Public License for more details.
 +  */
 + 
 +-#include "xmms_configuration.h"
 +-#include "xmms/xmms_xformplugin.h"
 +-#include "xmms/xmms_sample.h"
 +-#include "xmms/xmms_log.h"
 ++#include <xmms_configuration.h>
 ++#include <xmms/xmms_xformplugin.h>
 ++#include <xmms/xmms_sample.h>
 ++#include <xmms/xmms_log.h>
 + 
 + #include <stdio.h>
 + #include <stdlib.h>
 + #include <string.h>
 + #include <glib.h>
 ++#include <libavutil/mem.h>
 + 
 + #include "avcodec_compat.h"
 + 
 +@@ -36,6 +37,8 @@
 + 	guint buffer_size;
 + 	gboolean no_demuxer;
 + 
 ++	AVFrame *read_out_frame;
 ++
 + 	guint channels;
 + 	guint samplerate;
 + 	xmms_sample_format_t sampleformat;
 +@@ -53,10 +56,14 @@
 + static gboolean xmms_avcodec_plugin_setup (xmms_xform_plugin_t *xform_plugin);
 + static gboolean xmms_avcodec_init (xmms_xform_t *xform);
 + static void xmms_avcodec_destroy (xmms_xform_t *xform);
 ++static gint xmms_avcodec_internal_read_some (xmms_xform_t *xform, xmms_avcodec_data_t *data, xmms_error_t *error);
 ++static gint xmms_avcodec_internal_decode_some (xmms_avcodec_data_t *data);
 ++static void xmms_avcodec_internal_append (xmms_avcodec_data_t *data);
 + static gint xmms_avcodec_read (xmms_xform_t *xform, xmms_sample_t *buf, gint len,
 +                                xmms_error_t *error);
 + static gint64 xmms_avcodec_seek (xmms_xform_t *xform, gint64 samples,
 +                                  xmms_xform_seek_mode_t whence, xmms_error_t *err);
 ++static xmms_sample_format_t xmms_avcodec_translate_sample_format (enum AVSampleFormat av_sample_format);
 + 
 + /*
 +  * Plugin header
 +@@ -85,13 +92,23 @@
 + 	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); 
 ++	                "0 belong 0x7ffe8001", NULL);
 + 
 + 	xmms_xform_plugin_indata_add (xform_plugin,
 + 	                              XMMS_STREAM_TYPE_MIMETYPE,
 + 	                              "audio/x-ffmpeg-*",
 + 	                              NULL);
 + 
 ++	XMMS_DBG ("avcodec version at build time is %d.%d.%d",
 ++	          (LIBAVCODEC_VERSION_INT >> 16),
 ++	          (LIBAVCODEC_VERSION_INT >> 8) & 0xff,
 ++	          LIBAVCODEC_VERSION_INT & 0xff);
 ++	XMMS_DBG ("avcodec version at run time is %d.%d.%d",
 ++	          (avcodec_version() >> 16),
 ++	          (avcodec_version() >> 8) & 0xff,
 ++	          avcodec_version() & 0xff);
 ++	XMMS_DBG ("avcodec configuration is %s", avcodec_configuration());
 ++
 + 	return TRUE;
 + }
 + 
 +@@ -107,6 +124,7 @@
 + 
 + 	avcodec_close (data->codecctx);
 + 	av_free (data->codecctx);
 ++	av_frame_free (&data->read_out_frame);
 + 
 + 	g_string_free (data->outbuf, TRUE);
 + 	g_free (data->buffer);
 +@@ -132,9 +150,10 @@
 + 	data->buffer_size = AVCODEC_BUFFER_SIZE;
 + 	data->codecctx = NULL;
 + 
 ++	data->read_out_frame = av_frame_alloc ();
  +
 - typedef struct {
 - 	AVCodecContext *codecctx;
 + 	xmms_xform_private_data_set (xform, data);
 + 
 +-	avcodec_init ();
 + 	avcodec_register_all ();
 + 
 + 	mimetype = xmms_xform_indata_get_str (xform,
 +@@ -161,12 +180,12 @@
 + 		data->channels = ret;
 + 	}
 + 
 +-	/* bitrate required for WMA files */
 ++	/* Required by WMA xform. */
 + 	xmms_xform_auxdata_get_int (xform,
 + 	                            "bitrate",
 + 	                            &data->bitrate);
 + 
 +-	/* ALAC and MAC require bits per sample field to be 16 */
 ++	/* Required by tta and apefile xforms. */
 + 	xmms_xform_auxdata_get_int (xform,
 + 	                            "samplebits",
 + 	                            &data->samplebits);
 +@@ -188,7 +207,8 @@
 + 		    !strcmp (data->codec_id, "adpcm_swf") ||
 + 		    !strcmp (data->codec_id, "pcm_s16le") ||
 + 		    !strcmp (data->codec_id, "ac3") ||
 +-		    !strcmp (data->codec_id, "dca")) {
 ++		    !strcmp (data->codec_id, "dca") ||
 ++		    !strcmp (data->codec_id, "nellymoser")) {
 + 			/* number 1024 taken from libavformat raw.c RAW_PACKET_SIZE */
 + 			data->extradata = g_malloc0 (1024);
 + 			data->extradata_size = 1024;
 +@@ -196,22 +216,22 @@
 + 		} else {
 + 			/* A demuxer plugin forgot to give decoder config? */
 + 			xmms_log_error ("Decoder config data not found!");
 +-			return FALSE;
 ++			goto err;
 + 		}
 + 	}
 + 
 +-	data->codecctx = avcodec_alloc_context ();
 ++	data->codecctx = avcodec_alloc_context3 (codec);
 + 	data->codecctx->sample_rate = data->samplerate;
 + 	data->codecctx->channels = data->channels;
 + 	data->codecctx->bit_rate = data->bitrate;
 +-	CONTEXT_BPS (data->codecctx) = data->samplebits;
 ++	data->codecctx->bits_per_coded_sample = data->samplebits;
 + 	data->codecctx->block_align = data->block_align;
 + 	data->codecctx->extradata = data->extradata;
 + 	data->codecctx->extradata_size = data->extradata_size;
 + 	data->codecctx->codec_id = codec->id;
 + 	data->codecctx->codec_type = codec->type;
 + 
 +-	if (avcodec_open (data->codecctx, codec) < 0) {
 ++	if (avcodec_open2 (data->codecctx, codec, NULL) < 0) {
 + 		XMMS_DBG ("Opening decoder '%s' failed", codec->name);
 + 		goto err;
 + 	} else {
 +@@ -220,7 +240,7 @@
 + 
 + 		/* some codecs need to have something read before they set
 + 		 * the samplerate and channels correctly, unfortunately... */
 +-		if ((ret = xmms_avcodec_read (xform, buf, 42, &error)) > 0) {
 ++		if ((ret = xmms_avcodec_read (xform, buf, sizeof (buf), &error)) > 0) {
 + 			g_string_insert_len (data->outbuf, 0, buf, ret);
 + 		} else {
 + 			XMMS_DBG ("First read failed, codec is not working...");
 +@@ -231,19 +251,27 @@
 + 
 + 	data->samplerate = data->codecctx->sample_rate;
 + 	data->channels = data->codecctx->channels;
 ++	data->sampleformat = xmms_avcodec_translate_sample_format (data->codecctx->sample_fmt);
 ++	if (data->sampleformat == XMMS_SAMPLE_FORMAT_UNKNOWN) {
 ++		avcodec_close (data->codecctx);
 ++		goto err;
 ++	}
 + 
 + 	xmms_xform_outdata_type_add (xform,
 + 	                             XMMS_STREAM_TYPE_MIMETYPE,
 + 	                             "audio/pcm",
 + 	                             XMMS_STREAM_TYPE_FMT_FORMAT,
 +-	                             XMMS_SAMPLE_FORMAT_S16,
 ++	                             data->sampleformat,
 + 	                             XMMS_STREAM_TYPE_FMT_CHANNELS,
 + 	                             data->channels,
 + 	                             XMMS_STREAM_TYPE_FMT_SAMPLERATE,
 + 	                             data->samplerate,
 + 	                             XMMS_STREAM_TYPE_END);
 + 
 +-	XMMS_DBG ("Decoder '%s' initialized successfully!", codec->name);
 ++	XMMS_DBG ("Decoder %s at rate %d with %d channels of format %s initialized",
 ++	          codec->name, data->codecctx->sample_rate,
 ++	          data->codecctx->channels,
 ++	          av_get_sample_fmt_name (data->codecctx->sample_fmt));
 + 
 + 	return TRUE;
 + 
 +@@ -251,6 +279,9 @@
 + 	if (data->codecctx) {
 + 		av_free (data->codecctx);
 + 	}
 ++	if (data->read_out_frame) {
 ++		avcodec_free_frame (&data->read_out_frame);
 ++	}
 + 	g_string_free (data->outbuf, TRUE);
 + 	g_free (data->extradata);
 + 	g_free (data);
 +@@ -263,102 +294,24 @@
 +                    xmms_error_t *error)
 + {
 + 	xmms_avcodec_data_t *data;
 +-	char outbuf[AVCODEC_MAX_AUDIO_FRAME_SIZE];
 +-	gint outbufsize, bytes_read = 0;
 + 	guint size;
 + 
 + 	data = xmms_xform_private_data_get (xform);
 + 	g_return_val_if_fail (data, -1);
 + 
 +-	size = MIN (data->outbuf->len, len);
 +-	while (size == 0) {
 +-		AVPacket packet;
 +-		av_init_packet (&packet);
 ++	while (0 == (size = MIN (data->outbuf->len, len))) {
 ++		gint res;
 + 
 + 		if (data->no_demuxer || data->buffer_length == 0) {
 +-			gint read_total;
 +-
 +-			bytes_read = xmms_xform_read (xform,
 +-			                              (gchar *) (data->buffer + data->buffer_length),
 +-			                              data->buffer_size - data->buffer_length,
 +-			                              error);
 +-
 +-			if (bytes_read < 0) {
 +-				XMMS_DBG ("Error while reading data");
 +-				return bytes_read;
 +-			} else if (bytes_read == 0) {
 +-				XMMS_DBG ("EOF");
 +-				return 0;
 +-			}
 ++			gint bytes_read;
 + 
 +-			read_total = bytes_read;
 +-
 +-			/* If we have a demuxer plugin, make sure we read the whole packet */
 +-			while (read_total == data->buffer_size && !data->no_demuxer) {
 +-				/* multiply the buffer size and try to read again */
 +-				data->buffer = g_realloc (data->buffer, data->buffer_size * 2);
 +-				bytes_read = xmms_xform_read (xform,
 +-				                              (gchar *) data->buffer +
 +-				                                data->buffer_size,
 +-				                              data->buffer_size,
 +-				                              error);
 +-				data->buffer_size *= 2;
 +-
 +-				if (bytes_read < 0) {
 +-					XMMS_DBG ("Error while reading data");
 +-					return bytes_read;
 +-				}
 +-
 +-				read_total += bytes_read;
 +-
 +-				if (read_total < data->buffer_size) {
 +-					/* finally double the buffer size for performance reasons, the
 +-					 * hotspot handling likes to fit two frames in the buffer */
 +-					data->buffer = g_realloc (data->buffer, data->buffer_size * 2);
 +-					data->buffer_size *= 2;
 +-					XMMS_DBG ("Reallocated avcodec internal buffer to be %d bytes",
 +-					          data->buffer_size);
 +-
 +-					break;
 +-				}
 +-			}
 +-
 +-			/* Update the buffer length */
 +-			data->buffer_length += read_total;
 ++			bytes_read = xmms_avcodec_internal_read_some (xform, data, error);
 ++			if (bytes_read <= 0) { return bytes_read; }
 + 		}
 + 
 +-		packet.data = data->buffer;
 +-		packet.size = data->buffer_length;
 +-
 +-		outbufsize = sizeof (outbuf);
 +-		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_length -= bytes_read;
 +-
 +-		if (outbufsize > 0) {
 +-			g_string_append_len (data->outbuf, outbuf, outbufsize);
 +-		}
 +-
 +-		size = MIN (data->outbuf->len, len);
 ++		res = xmms_avcodec_internal_decode_some (data);
 ++		if (res < 0) { return res; }
 ++		if (res > 0) { xmms_avcodec_internal_append (data); }
 + 	}
   
 + 	memcpy (buf, data->outbuf->str, size);
 +@@ -371,8 +324,6 @@
 + xmms_avcodec_seek (xmms_xform_t *xform, gint64 samples, xmms_xform_seek_mode_t whence, xmms_error_t *err)
 + {
 + 	xmms_avcodec_data_t *data;
 +-	char outbuf[AVCODEC_MAX_AUDIO_FRAME_SIZE];
 +-	gint outbufsize, bytes_read = 0;
 + 	gint64 ret = -1;
 + 
 + 	g_return_val_if_fail (xform, -1);
 +@@ -390,23 +341,11 @@
 + 
 + 	/* The buggy ape decoder doesn't flush buffers, so we need to finish decoding
 + 	 * the frame before seeking to avoid segfaults... this hack sucks */
 ++	/* FIXME: Is ^^^ still true? */
 + 	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_audio3 (data->codecctx, (short *) outbuf,
 +-		                                    &outbufsize, &packet);
 +-
 +-		if (bytes_read < 0 || bytes_read > data->buffer_length) {
 +-			XMMS_DBG ("Error decoding data!");
 ++		if (xmms_avcodec_internal_decode_some (data) < 0) {
 + 			return -1;
 + 		}
 +-
 +-		data->buffer_length -= bytes_read;
 +-		g_memmove (data->buffer, data->buffer + bytes_read, data->buffer_length);
 + 	}
 + 
 + 	ret = xmms_xform_seek (xform, samples, whence, err);
 +@@ -420,3 +359,178 @@
 + 
 + 	return ret;
 + }
 ++
 ++static xmms_sample_format_t
 ++xmms_avcodec_translate_sample_format (enum AVSampleFormat av_sample_format)
 ++{
 ++	switch (av_sample_format) {
 ++	case AV_SAMPLE_FMT_U8:
 ++	case AV_SAMPLE_FMT_U8P:
 ++		return XMMS_SAMPLE_FORMAT_U8;
 ++	case AV_SAMPLE_FMT_S16:
 ++	case AV_SAMPLE_FMT_S16P:
 ++		return XMMS_SAMPLE_FORMAT_S16;
 ++	case AV_SAMPLE_FMT_S32:
 ++	case AV_SAMPLE_FMT_S32P:
 ++		return XMMS_SAMPLE_FORMAT_S32;
 ++	case AV_SAMPLE_FMT_FLT:
 ++	case AV_SAMPLE_FMT_FLTP:
 ++		return XMMS_SAMPLE_FORMAT_FLOAT;
 ++	case AV_SAMPLE_FMT_DBL:
 ++	case AV_SAMPLE_FMT_DBLP:
 ++		return XMMS_SAMPLE_FORMAT_DOUBLE;
 ++	default:
 ++		XMMS_DBG ("AVSampleFormat (%i: %s) not supported.", av_sample_format,
 ++		          av_get_sample_fmt_name (av_sample_format));
 ++		return XMMS_SAMPLE_FORMAT_UNKNOWN;
 ++	}
 ++}
 ++
 ++/*
 ++Read some data from our source of data to data->buffer, updating buffer_length
 ++and buffer_size as needed.
 ++
 ++Returns: on error: negative
 ++         on EOF: zero
 ++         otherwise: number of bytes read.
 ++*/
 ++static gint
 ++xmms_avcodec_internal_read_some (xmms_xform_t *xform,
 ++                                 xmms_avcodec_data_t *data,
 ++                                 xmms_error_t *error)
 ++{
 ++	gint bytes_read, read_total;
 ++
 ++	bytes_read = xmms_xform_read (xform,
 ++	                              (gchar *) (data->buffer + data->buffer_length),
 ++	                              data->buffer_size - data->buffer_length,
 ++	                              error);
 ++
 ++	if (bytes_read < 0) {
 ++		XMMS_DBG ("Error while reading data");
 ++		return bytes_read;
 ++	} else if (bytes_read == 0) {
 ++		XMMS_DBG ("EOF");
 ++		return 0;
 ++	}
 ++
 ++	read_total = bytes_read;
 ++
 ++	/* If we have a demuxer plugin, make sure we read the whole packet */
 ++	while (read_total == data->buffer_size && !data->no_demuxer) {
 ++		/* multiply the buffer size and try to read again */
 ++		data->buffer = g_realloc (data->buffer, data->buffer_size * 2);
 ++		bytes_read = xmms_xform_read (xform,
 ++		                              (gchar *) data->buffer +
 ++		                                data->buffer_size,
 ++		                              data->buffer_size,
 ++		                              error);
 ++		data->buffer_size *= 2;
 ++
 ++		if (bytes_read < 0) {
 ++			XMMS_DBG ("Error while reading data");
 ++			return bytes_read;
 ++		}
 ++
 ++		read_total += bytes_read;
 ++
 ++		if (read_total < data->buffer_size) {
 ++			/* finally double the buffer size for performance reasons, the
 ++			 * hotspot handling likes to fit two frames in the buffer */
 ++			data->buffer = g_realloc (data->buffer, data->buffer_size * 2);
 ++			data->buffer_size *= 2;
 ++			XMMS_DBG ("Reallocated avcodec internal buffer to be %d bytes",
 ++			          data->buffer_size);
 ++
 ++			break;
 ++		}
 ++	}
 ++
 ++	/* Update the buffer length */
 ++	data->buffer_length += read_total;
 ++
 ++	return read_total;
 ++}
 ++
 ++/*
 ++Decode some data from data->buffer[0..data->buffer_length-1] to
 ++data->read_out_frame
 ++
 ++Returns: on error: negative
 ++         on no new data produced: zero
 ++         otherwise: positive
 ++
 ++FIXME: data->buffer should be at least data->buffer_length +
 ++FF_INPUT_BUFFER_PADDING_SIZE long.
 ++*/
 ++static gint
 ++xmms_avcodec_internal_decode_some (xmms_avcodec_data_t *data)
 ++{
 ++	int got_frame = 0;
 ++	gint bytes_read = 0;
 ++	AVPacket packet;
 ++
 ++	av_init_packet (&packet);
 ++	packet.data = data->buffer;
 ++	packet.size = data->buffer_length;
 ++
 ++	/* clear buffers and reset fields to defaults */
 ++	av_frame_unref (data->read_out_frame);
 ++
 ++	bytes_read = avcodec_decode_audio4 (
 ++		data->codecctx, data->read_out_frame, &got_frame, &packet);
 ++
 ++	/* The DTS decoder of ffmpeg is buggy and always returns
 ++	 * the input buffer length, get frame length from header */
 ++	/* FIXME: Is ^^^^ still true? */
 ++	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;
 ++	}
 ++
 ++	if (bytes_read < data->buffer_length) {
 ++		data->buffer_length -= bytes_read;
 ++		g_memmove (data->buffer,
 ++		           data->buffer + bytes_read,
 ++		           data->buffer_length);
 ++	} else {
 ++		data->buffer_length = 0;
 ++	}
 ++
 ++	return got_frame ? 1 : 0;
 ++}
 ++
 ++static void
 ++xmms_avcodec_internal_append (xmms_avcodec_data_t *data)
 ++{
 ++	enum AVSampleFormat fmt = (enum AVSampleFormat) data->read_out_frame->format;
 ++	int samples = data->read_out_frame->nb_samples;
 ++	int channels = data->codecctx->channels;
 ++	int bps = av_get_bytes_per_sample (fmt);
 ++
 ++	if (av_sample_fmt_is_planar (fmt)) {
 ++		/* Convert from planar to packed format */
 ++		gint i, j;
 ++
 ++		for (i = 0; i < samples; i++) {
 ++			for (j = 0; j < channels; j++) {
 ++				g_string_append_len (
 ++					data->outbuf,
 ++					(gchar *) (data->read_out_frame->extended_data[j] + i*bps),
 ++					bps
 ++				);
 ++			}
 ++		}
 ++	} else {
 ++		g_string_append_len (data->outbuf,
 ++		                     (gchar *) data->read_out_frame->extended_data[0],
 ++		                     samples * channels * bps);
 ++	}
 ++}
 
 Added: head/audio/xmms2/files/patch-src_plugins_avcodec_avcodec__compat.h
 ==============================================================================
 --- /dev/null	00:00:00 1970	(empty, because file is newly added)
 +++ head/audio/xmms2/files/patch-src_plugins_avcodec_avcodec__compat.h	Thu Feb 27 19:52:11 2014	(r346384)
 @@ -0,0 +1,69 @@
 +--- src/plugins/avcodec/avcodec_compat.h.orig	2011-10-20 21:26:08.000000000 +0200
 ++++ src/plugins/avcodec/avcodec_compat.h	2014-02-27 18:38:22.000000000 +0100
 +@@ -1,7 +1,7 @@
 + /** @file avcodec_compat.h
 +  *  Compatibility header for libavcodec backwards compatibility
 +  *
 +- *  Copyright (C) 2011 XMMS2 Team
 ++ *  Copyright (C) 2011-2014 XMMS2 Team
 +  *
 +  *  This library is free software; you can redistribute it and/or
 +  *  modify it under the terms of the GNU Lesser General Public
 +@@ -21,47 +21,16 @@
 + # 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
 ++/* Map avcodec_free_frame to av_freep if the former doesn't exist.
 ++ * (This is in versions earlier than 54.28.0 (libav) or 54.59.100 (ffmpeg)) */
 ++#if ! HAVE_AVCODEC_FREE_FRAME
 ++# define avcodec_free_frame av_freep
 + #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)
 ++/* Map av_frame_alloc, av_frame_unref, av_frame_free into their
 ++ * deprecated versions in versions earlier than 55.28.1 */
 ++#if LIBAVCODEC_VERSION_INT < 0x371c01
 ++# define av_frame_alloc avcodec_alloc_frame
 ++# define av_frame_unref avcodec_get_frame_defaults
 ++# define av_frame_free avcodec_free_frame
 + #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
 +-
 _______________________________________________
 svn-ports-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-ports-all
 To unsubscribe, send any mail to "svn-ports-all-unsubscribe@freebsd.org"
 
>Unformatted:
