[109032] trunk/dports/audio/xmms2
devans at macports.org
devans at macports.org
Tue Aug 6 14:06:58 PDT 2013
Revision: 109032
https://trac.macports.org/changeset/109032
Author: devans at macports.org
Date: 2013-08-06 14:06:57 -0700 (Tue, 06 Aug 2013)
Log Message:
-----------
xmms2: patch to fix build with ffmpeg-devel, ffmpeg-2.0, add upstream nellymoser codec support.
Modified Paths:
--------------
trunk/dports/audio/xmms2/Portfile
Added Paths:
-----------
trunk/dports/audio/xmms2/files/patch-ffmpeg-2.0.diff
trunk/dports/audio/xmms2/files/patch-nellymoser.diff
Removed Paths:
-------------
trunk/dports/audio/xmms2/files/patch-src-plugins-avcodec-avcodec.c.diff
Modified: trunk/dports/audio/xmms2/Portfile
===================================================================
--- trunk/dports/audio/xmms2/Portfile 2013-08-06 21:01:30 UTC (rev 109031)
+++ trunk/dports/audio/xmms2/Portfile 2013-08-06 21:06:57 UTC (rev 109032)
@@ -5,7 +5,7 @@
name xmms2
version 0.8DrO_o
-revision 3
+revision 4
categories audio
# Mostly LGPL, some plugins and clients are GPL
license LGPL-2.1+ GPL-2+ GPL-2
@@ -23,6 +23,7 @@
depends_build port:python26 \
port:pkgconfig
+
depends_lib path:lib/pkgconfig/glib-2.0.pc:glib2 \
port:gettext \
port:libiconv \
@@ -50,7 +51,8 @@
path:lib/libspeex.dylib:speex \
port:wavpack
-patchfiles patch-src-plugins-avcodec-avcodec.c.diff
+patchfiles patch-ffmpeg-2.0.diff \
+ patch-nellymoser.diff
configure.python ${prefix}/bin/python2.6
Added: trunk/dports/audio/xmms2/files/patch-ffmpeg-2.0.diff
===================================================================
--- trunk/dports/audio/xmms2/files/patch-ffmpeg-2.0.diff (rev 0)
+++ trunk/dports/audio/xmms2/files/patch-ffmpeg-2.0.diff 2013-08-06 21:06:57 UTC (rev 109032)
@@ -0,0 +1,54 @@
+--- src/plugins/avcodec/avcodec.c.orig 2011-10-20 12:26:08.000000000 -0700
++++ src/plugins/avcodec/avcodec.c 2013-08-06 12:35:32.000000000 -0700
+@@ -27,6 +27,7 @@
+ #include "avcodec_compat.h"
+
+ #define AVCODEC_BUFFER_SIZE 16384
++#define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
+
+ typedef struct {
+ AVCodecContext *codecctx;
+@@ -134,7 +135,6 @@
+
+ xmms_xform_private_data_set (xform, data);
+
+- avcodec_init ();
+ avcodec_register_all ();
+
+ mimetype = xmms_xform_indata_get_str (xform,
+@@ -200,7 +200,7 @@
+ }
+ }
+
+- data->codecctx = avcodec_alloc_context ();
++ data->codecctx = avcodec_alloc_context3 (NULL);
+ data->codecctx->sample_rate = data->samplerate;
+ data->codecctx->channels = data->channels;
+ data->codecctx->bit_rate = data->bitrate;
+@@ -211,7 +211,7 @@
+ 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 {
+@@ -263,7 +263,7 @@
+ xmms_error_t *error)
+ {
+ xmms_avcodec_data_t *data;
+- char outbuf[AVCODEC_MAX_AUDIO_FRAME_SIZE];
++ char outbuf[MAX_AUDIO_FRAME_SIZE];
+ gint outbufsize, bytes_read = 0;
+ guint size;
+
+@@ -371,7 +371,7 @@
+ 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];
++ char outbuf[MAX_AUDIO_FRAME_SIZE];
+ gint outbufsize, bytes_read = 0;
+ gint64 ret = -1;
+
Added: trunk/dports/audio/xmms2/files/patch-nellymoser.diff
===================================================================
--- trunk/dports/audio/xmms2/files/patch-nellymoser.diff (rev 0)
+++ trunk/dports/audio/xmms2/files/patch-nellymoser.diff 2013-08-06 21:06:57 UTC (rev 109032)
@@ -0,0 +1,373 @@
+--- src/plugins/avcodec/avcodec.c.orig 2013-08-05 13:22:57.000000000 -0700
++++ src/plugins/avcodec/avcodec.c 2013-08-05 13:22:57.000000000 -0700
+@@ -86,7 +86,7 @@
+ 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,
+@@ -188,7 +188,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;
+--- src/plugins/flv/flv.c.orig
++++ src/plugins/flv/flv.c
+@@ -25,29 +25,41 @@
+ * and other info, then data
+ */
+ #define FLV_TAG_SIZE 11
+-/* random constant */
+ #define FLV_CHUNK_SIZE 4096
+
+-/* let libavcodec take care of swapping sample bytes */
+-static const gchar *mime_pcm_s16le = "audio/x-ffmpeg-pcm_s16le";
+-static const gchar *fmt_mime[11] = {
+- /* Supported when samples are 8 bit
+- * (otherwise there's no way of knowing endianness)
+- */
+- "audio/pcm",
+- "audio/x-ffmpeg-adpcm_swf",
+- "audio/mpeg",
+- /* if bps is 8 bit u8
+- * if bps is 16 bit sle16
+- */
+- "audio/pcm",
+- /* libavcodec can't handle nelly without dying yet */
+- /*"audio/x-ffmpeg-nellymoser",
+- "audio/x-ffmpeg-nellymoser",
+- "audio/x-ffmpeg-nellymoser",*/
+- "", "", "",
+- "", "", "",
+- "audio/aac"
++typedef enum {
++ /* Only u8 bit samples since
++ there's no way to determine endianness
++ */
++ CODEC_PCM_HOST,
++ CODEC_ADPCM,
++ CODEC_MP3,
++ /* 8 bps: unsigned
++ 16 bps: signed
++ */
++ CODEC_PCM_LE,
++ CODEC_NELLYMOSER_16K,
++ CODEC_NELLYMOSER_8K,
++ /* Uses the sample rate in
++ the tag as normal
++ */
++ CODEC_NELLYMOSER,
++ CODEC_AAC = 10
++} xmms_flv_codec_id;
++
++struct xmms_flv_codec_table {
++ xmms_flv_codec_id id;
++ const gchar *mime;
++} static flv_codecs[] = {
++ {CODEC_PCM_HOST, "audio/pcm"},
++ {CODEC_ADPCM, "audio/x-ffmpeg-adpcm_swf"},
++ {CODEC_MP3, "audio/mpeg"},
++ /* Will be audio/x-ffmpeg-pcm_s16le if bps is 16 */
++ {CODEC_PCM_LE, "audio/pcm"},
++ {CODEC_NELLYMOSER_16K, "audio/x-ffmpeg-nellymoser"},
++ {CODEC_NELLYMOSER_8K, "audio/x-ffmpeg-nellymoser"},
++ {CODEC_NELLYMOSER, "audio/x-ffmpeg-nellymoser"},
++ {CODEC_AAC, "audio/aac"}
+ };
+
+ typedef struct {
+@@ -111,23 +123,26 @@ static gboolean
+ xmms_flv_init (xmms_xform_t *xform)
+ {
+ xmms_sample_format_t bps;
+- gint readret;
++ gint readret, i;
+ guint8 channels, flags, format;
+- guint8 header[FLV_TAG_SIZE + 5];
+- const gchar *mime;
++ guint8 header[FLV_TAG_SIZE + 1];
+ guint32 dataoffset, samplerate;
+ xmms_error_t err;
+ xmms_flv_data_t *flvdata;
++ struct xmms_flv_codec_table *codec = NULL;
++
++ flvdata = g_new0 (xmms_flv_data_t, 1);
++ xmms_xform_private_data_set (xform, flvdata);
+
+ readret = xmms_xform_read (xform, header, FLV_HDR_SIZE, &err);
+ if (readret != FLV_HDR_SIZE) {
+ xmms_log_error ("Header read error");
+- return FALSE;
++ goto init_err;
+ }
+
+ if ((header[4] & HAS_AUDIO) != HAS_AUDIO) {
+ xmms_log_error ("FLV has no audio stream");
+- return FALSE;
++ goto init_err;
+ }
+
+ dataoffset = get_be32 (&header[5]) - FLV_HDR_SIZE;
+@@ -140,7 +155,7 @@ xmms_flv_init (xmms_xform_t *xform)
+ dataoffset : FLV_HDR_SIZE, &err);
+ if (readret <= 0) {
+ xmms_log_error ("Error reading header:tag body gap");
+- return FALSE;
++ goto init_err;
+ }
+
+ dataoffset -= readret;
+@@ -148,86 +163,99 @@ xmms_flv_init (xmms_xform_t *xform)
+
+ if (next_audio_tag (xform) <= 0) {
+ xmms_log_error ("Can't find first audio tag");
+- return FALSE;
++ goto init_err;
+ }
+
+- if (xmms_xform_peek (xform, header, FLV_TAG_SIZE + 5, &err) < FLV_TAG_SIZE + 5) {
++ if (xmms_xform_read (xform, header, FLV_TAG_SIZE + 1, &err) < FLV_TAG_SIZE + 1) {
+ xmms_log_error ("Can't read first audio tag");
+- return FALSE;
++ goto init_err;
+ }
+
+- flags = header[FLV_TAG_SIZE + 4];
++ flags = header[11];
+ XMMS_DBG ("Audio flags: %X", flags);
+
+- switch (flags&12) {
+- case 0: samplerate = 5512; break;
+- case 4: samplerate = 11025; break;
+- case 8: samplerate = 22050; break;
+- case 12: samplerate = 44100; break;
+- default: samplerate = 8000; break;
++ format = flags >> 4;
++ for (i = 0; i < G_N_ELEMENTS (flv_codecs); i++) {
++ if (flv_codecs[i].id == format) {
++ codec = &flv_codecs[i];
++ break;
++ }
+ }
+
+- if (flags&2) {
+- bps = XMMS_SAMPLE_FORMAT_S16;
++ if (flags & 1) {
++ channels = 2;
+ } else {
+- bps = XMMS_SAMPLE_FORMAT_U8;
++ channels = 1;
+ }
+
+- if (flags&1) {
+- channels = 2;
++ if (flags & 2) {
++ bps = XMMS_SAMPLE_FORMAT_S16;
+ } else {
+- channels = 1;
++ bps = XMMS_SAMPLE_FORMAT_U8;
+ }
+
+- format = flags >> 4;
+- mime = (format <= 10)? fmt_mime[format] : NULL;
+- switch (format) {
+- case 0:
+- /* If the flv has an HE PCM audio stream, the
+- * samples must be unsigned and 8 bits long
+- */
+- if (bps != XMMS_SAMPLE_FORMAT_U8) {
+- xmms_log_error ("Only u8 HE PCM is supported");
+- return FALSE;
+- }
+- break;
+- case 3:
+- if (bps == XMMS_SAMPLE_FORMAT_S16) {
+- mime = mime_pcm_s16le;
+- }
+- break;
++ switch ((flags & 12) >> 2) {
++ case 0: samplerate = 5512; break;
++ case 1: samplerate = 11025; break;
++ case 2: samplerate = 22050; break;
++ case 3: samplerate = 44100; break;
++ default: samplerate = 8000; break;
+ }
+
+- if (mime && *mime) {
+- flvdata = g_new0 (xmms_flv_data_t, 1);
++ if (codec) {
++ switch (codec->id) {
++ case CODEC_PCM_HOST:
++ if (bps != XMMS_SAMPLE_FORMAT_U8) {
++ xmms_log_error ("Only u8 HE PCM is supported");
++ goto init_err;
++ }
++ break;
++ case CODEC_PCM_LE:
++ if (bps == XMMS_SAMPLE_FORMAT_S16) {
++ codec->mime = "audio/x-ffmpeg-pcm_s16le";
++ }
++ break;
++ case CODEC_NELLYMOSER_16K:
++ samplerate = 16000;
++ break;
++ case CODEC_NELLYMOSER_8K:
++ samplerate = 8000;
++ break;
++ default:
++ break;
++ }
++
+ flvdata->format = format;
++ flvdata->last_datasize = get_be24 (&header[1]) - 1;
+
+ XMMS_DBG ("Rate: %d, bps: %d, channels: %d", samplerate,
+ bps, channels);
+
+- xmms_xform_private_data_set (xform, flvdata);
+ xmms_xform_outdata_type_add (xform,
+ XMMS_STREAM_TYPE_MIMETYPE,
+- mime,
+- XMMS_STREAM_TYPE_FMT_SAMPLERATE,
+- samplerate,
+- XMMS_STREAM_TYPE_FMT_FORMAT,
+- bps,
+- XMMS_STREAM_TYPE_FMT_CHANNELS,
+- channels,
+- XMMS_STREAM_TYPE_END);
++ codec->mime,
++ XMMS_STREAM_TYPE_FMT_SAMPLERATE,
++ samplerate,
++ XMMS_STREAM_TYPE_FMT_FORMAT,
++ bps,
++ XMMS_STREAM_TYPE_FMT_CHANNELS,
++ channels,
++ XMMS_STREAM_TYPE_END);
+ return TRUE;
+ } else {
+ xmms_log_error ("Unsupported audio format");
+- return FALSE;
+ }
++
++init_err:
++ g_free (flvdata);
++ return FALSE;
+ }
+
+ static gint
+ xmms_flv_read (xmms_xform_t *xform, xmms_sample_t *buf, gint len, xmms_error_t *err)
+ {
+- gint ret = 0, thismuch = FLV_TAG_SIZE + 5;
+- guint8 header[FLV_TAG_SIZE + 6], gap = 1;
++ gint ret = 0, thismuch = FLV_TAG_SIZE + 1;
++ guint8 header[FLV_TAG_SIZE + 1];
+ xmms_flv_data_t *data = NULL;
+
+ data = xmms_xform_private_data_get (xform);
+@@ -236,12 +264,8 @@ xmms_flv_read (xmms_xform_t *xform, xmms_sample_t *buf, gint len, xmms_error_t *
+ xmms_xform_auxdata_barrier (xform);
+ ret = next_audio_tag (xform);
+ if (ret > 0) {
+- if (data->format == 10) {
+- thismuch++;
+- gap++;
+- }
+ if (xmms_xform_read (xform, header, thismuch, err) == thismuch) {
+- data->last_datasize = get_be24 (&header[5]) - gap;
++ data->last_datasize = get_be24 (&header[1]) - 1;
+ } else {
+ xmms_log_error ("Need %d bytes", thismuch);
+ return -1;
+@@ -280,40 +304,51 @@ xmms_flv_destroy (xmms_xform_t *xform)
+ static gint
+ next_audio_tag (xmms_xform_t *xform)
+ {
+- guint8 header[FLV_TAG_SIZE + 4];
++ guint8 header[FLV_TAG_SIZE];
+ guint8 dumb[FLV_CHUNK_SIZE];
+ gint ret = 0;
+ xmms_error_t err;
+- guint32 datasize = 0;
++ xmms_flv_data_t *data;
++
++ data = xmms_xform_private_data_get (xform);
+
+ do {
+- /* there's a last 4 bytes at the end of an FLV giving the final
+- * tag's size, this isn't an error
+- */
+- ret = xmms_xform_peek (xform, header, FLV_TAG_SIZE + 4, &err);
+- if ((ret < FLV_TAG_SIZE) && (ret > -1)) {
+- ret = 0;
+- break;
+- } else if (ret == -1) {
+- xmms_log_error ("%s", xmms_error_message_get (&err));
+- break;
+- }
++ /* If > 0 assume we're in the middle of a tag's data */
++ if (!data->last_datasize) {
++ /* There are 4 bytes before an actual tag giving
++ the previous tag's size. The first size in an
++ flv is always 0.
++ */
++ if (xmms_xform_read (xform, header, 4, &err) != 4) {
++ xmms_log_error ("Couldn't read last tag size");
++ return -1;
++ }
+
+- if (header[4] == 8) {
+- /* woo audio tag! */
+- break;
+- }
++ ret = xmms_xform_peek (xform, header, FLV_TAG_SIZE, &err);
++ if ((ret < FLV_TAG_SIZE) && (ret > -1)) {
++ return 0;
++ } else if (ret == -1) {
++ xmms_log_error ("%s", xmms_error_message_get (&err));
++ return ret;
++ }
++
++ if (header[0] == 8) {
++ /* woo audio tag! */
++ break;
++ }
+
+- ret = xmms_xform_read (xform, header, FLV_TAG_SIZE + 4, &err);
+- if (ret <= 0) { return ret; }
++ if ((ret = xmms_xform_read (xform, header, FLV_TAG_SIZE, &err)) <= 0) {
++ return ret;
++ }
+
+- datasize = get_be24 (&header[5]);
++ data->last_datasize = get_be24 (&header[1]);
++ }
+
+- while (datasize) {
++ while (data->last_datasize) {
+ ret = xmms_xform_read (xform, dumb,
+- (datasize < FLV_CHUNK_SIZE) ?
+- datasize : FLV_CHUNK_SIZE,
+- &err);
++ (data->last_datasize < FLV_CHUNK_SIZE) ?
++ data->last_datasize : FLV_CHUNK_SIZE,
++ &err);
+ if (ret == 0) {
+ xmms_log_error ("Data field short!");
+ break;
+@@ -323,7 +358,7 @@ next_audio_tag (xmms_xform_t *xform)
+ break;
+ }
+
+- datasize -= ret;
++ data->last_datasize -= ret;
+ }
+
+ } while (ret);
Deleted: trunk/dports/audio/xmms2/files/patch-src-plugins-avcodec-avcodec.c.diff
===================================================================
--- trunk/dports/audio/xmms2/files/patch-src-plugins-avcodec-avcodec.c.diff 2013-08-06 21:01:30 UTC (rev 109031)
+++ trunk/dports/audio/xmms2/files/patch-src-plugins-avcodec-avcodec.c.diff 2013-08-06 21:06:57 UTC (rev 109032)
@@ -1,10 +0,0 @@
---- src/plugins/avcodec/avcodec.c.orig 2013-05-25 16:09:40.000000000 -0700
-+++ src/plugins/avcodec/avcodec.c 2013-05-25 16:10:44.000000000 -0700
-@@ -134,7 +134,6 @@
-
- xmms_xform_private_data_set (xform, data);
-
-- avcodec_init ();
- avcodec_register_all ();
-
- mimetype = xmms_xform_indata_get_str (xform,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20130806/9df3a1f2/attachment-0001.html>
More information about the macports-changes
mailing list