[108945] trunk/dports/multimedia/moc
devans at macports.org
devans at macports.org
Sun Aug 4 17:12:17 PDT 2013
Revision: 108945
https://trac.macports.org/changeset/108945
Author: devans at macports.org
Date: 2013-08-04 17:12:16 -0700 (Sun, 04 Aug 2013)
Log Message:
-----------
moc: update to 2.5.0-beta1 plus additional upstream ffmpeg patches, add license, livecheck, closes #37159, maintainer timeout.
Modified Paths:
--------------
trunk/dports/multimedia/moc/Portfile
Added Paths:
-----------
trunk/dports/multimedia/moc/files/patch-ffmpeg-r2529.diff
Modified: trunk/dports/multimedia/moc/Portfile
===================================================================
--- trunk/dports/multimedia/moc/Portfile 2013-08-04 23:26:16 UTC (rev 108944)
+++ trunk/dports/multimedia/moc/Portfile 2013-08-05 00:12:16 UTC (rev 108945)
@@ -3,8 +3,8 @@
PortSystem 1.0
name moc
-version 2.4.4
-revision 2
+version 2.5.0-beta1
+license GPL-2
categories multimedia
maintainers martinvazquez.net:eu
description MOC (music on console) is a console audio player for LINUX/UNIX
@@ -18,11 +18,11 @@
homepage http://moc.daper.net
platforms darwin
-master_sites ftp://ftp.daper.net/pub/soft/moc/stable/
+master_sites ftp://ftp.daper.net/pub/soft/moc/unstable/
-checksums md5 647c770a5542a4ae5437386807a89796 \
- sha1 e56ee13aa17c177f0afc42efe3804ebbbf46d4db \
- rmd160 d757650b3d8ed4f830212f41d12af7144ecba29b
+checksums md5 795ecba86847e082aa2f21937cc04804 \
+ sha1 4030a1fa5c7cfef06909c54d8c7a1fbb93f23caa \
+ rmd160 ca7095f71e5fe8155eda41e98547db541d6a4cab
use_bzip2 yes
@@ -38,18 +38,22 @@
port:jack \
port:curl
-patchfiles patch-configure.diff \
- patch-options.c.diff
+patchfiles patch-ffmpeg-r2529.diff
-configure.args --with-jack --without-vorbis
+use_autoreconf yes
+autoreconf.args -fvi
-default_variants +autojack
+configure.args --with-jack --without-vorbis --disable-cache
-variant autojack description {Autostart jack on mocp init and close it on server stop} {
- patchfiles-append patch-autojack.diff
-}
+#default_variants +autojack
+#variant autojack description {Autostart jack on mocp init and close it on server stop} {
+# patchfiles-append patch-autojack.diff
+#}
+
variant vorbis description {Add support for ogg files} {
depends_lib-append port:libvorbis
configure.args-delete --without-vorbis
}
+
+livecheck.regex <title>music on console (.*)</title>
Added: trunk/dports/multimedia/moc/files/patch-ffmpeg-r2529.diff
===================================================================
--- trunk/dports/multimedia/moc/files/patch-ffmpeg-r2529.diff (rev 0)
+++ trunk/dports/multimedia/moc/files/patch-ffmpeg-r2529.diff 2013-08-05 00:12:16 UTC (rev 108945)
@@ -0,0 +1,904 @@
+Index: THANKS
+===================================================================
+--- THANKS (revision 2506)
++++ THANKS (revision 2529)
+@@ -10,6 +10,9 @@
+ * Fixed miscellaneous coding errors.
+ * Assisted with testing.
+
++Gregory Maxwell:
++ * Provided patch for off_t in io_* functions.
++
+ Morten Grunnet Buhl:
+ * Provided Yellow/Red theme.
+
+@@ -44,6 +47,7 @@
+ * Headed the effort to port MOC to OpenWRT.
+ * Provided signficant information on DTS, AAC and other formats.
+ * Also contributed much time in the refinement of feature ideas.
++ * Provided 24-bit format conversion bug fixes.
+
+ Juho Hämäläinen:
+ * Added -Q (--format) FORMAT_STRING option to display file information.
+@@ -202,6 +206,9 @@
+ * Fixed segfault when trying to play a file using FFmpeg.
+ * Migrated to newer FFmpeg API.
+
++"firejox"
++ * Fixed screen upsets due to UTF-8 character handing.
++
+ "fluxid":
+ * Fixed incorrect setting for themes red channel value.
+
+Index: mocp.1
+===================================================================
+--- mocp.1 (revision 2506)
++++ mocp.1 (revision 2529)
+@@ -69,6 +69,11 @@
+ set in the configuration file as \fBStartInMusicDir\fP.
+ .LP
+ .TP
++\fB\-q\fP, \fB\-\-enqueue\fP
++Add files given after command line options to the queue. Don't start the
++interface.
++.LP
++.TP
+ \fB\-a\fP, \fB\-\-append\fP
+ Append files, directories (recursively) and playlists given after command
+ line options to the playlist. Don't start the interface.
+Index: menu.c
+===================================================================
+--- menu.c (revision 2506)
++++ menu.c (revision 2529)
+@@ -90,9 +90,14 @@
+ getyx (menu->win, y, x);
+ if (title_width <= title_space || mi->align == MENU_ALIGN_LEFT)
+ xwaddnstr (menu->win, mi->title, title_space);
+- else
+- xwaddstr (menu->win, mi->title + title_width - title_space);
++ else {
++ char *ptr;
+
++ ptr = xstrtail (mi->title, title_space);
++ xwaddstr (menu->win, ptr);
++ free (ptr);
++ }
++
+ /* Fill the remainder of the title field with spaces. */
+ if (mi == menu->selected) {
+ getyx (menu->win, y, ix);
+Index: configure.in
+===================================================================
+--- configure.in (revision 2506)
++++ configure.in (revision 2529)
+@@ -142,7 +142,7 @@
+
+ PKG_PROG_PKG_CONFIG([0.20])
+
+-if test "x$PKG_CONFIG" == "x"
++if test "x$PKG_CONFIG" = "x"
+ then
+ AC_MSG_WARN([No pkg-config utility found or it's too old, I will have trouble finding installed libraries.])
+ fi
+@@ -293,7 +293,6 @@
+
+ dnl optional functions
+ AC_CHECK_FUNCS([strcasestr strerror_r syslog])
+-AC_CHECK_FUNCS([getrlimit pthread_attr_getstacksize])
+ AX_CHECK_UNAME_SYSCALL
+
+ dnl MIME magic
+@@ -322,6 +321,7 @@
+ CC="$PTHREAD_CC"
+ CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
+ EXTRA_LIBS="$EXTRA_LIBS $PTHREAD_LIBS"
++AC_CHECK_FUNCS([getrlimit pthread_attr_getstacksize])
+
+ dnl __FUNCTION__
+ AC_TRY_COMPILE(,[printf(__FUNCTION__);], [AC_DEFINE([HAVE__FUNCTION__], 1,
+@@ -342,7 +342,7 @@
+ fi
+
+ dnl popt
+-AC_SEARCH_LIBS([poptGetContext], [popt], , [POPT_MISSING="yes"])
++AC_CHECK_LIB([popt], [poptGetContext], [true], [POPT_MISSING="yes"])
+
+ dnl getopt
+ AC_CHECK_FUNC(getopt_long,
+Index: utf8.c
+===================================================================
+--- utf8.c (revision 2506)
++++ utf8.c (revision 2529)
+@@ -199,47 +199,50 @@
+
+ int xwaddnstr (WINDOW *win, const char *str, const int n)
+ {
+- int res;
++ int res, width, inv_char;
++ wchar_t *ucs;
++ char *mstr, *lstr;
++ size_t size, num_chars;
+
+ assert (n > 0);
+ assert (str != NULL);
+
+- if (using_utf8) {
++ mstr = iconv_str (iconv_desc, str);
+
+- /* This nasty hack is because we need to count n in chars, but
+- * [w]addnstr() takes arguments in bytes (in UTF-8 a char can be
+- * longer than 1 byte). There are also problems with [w]addnwstr()
+- * (screen garbled). I have no better idea. */
++ size = xmbstowcs (NULL, mstr, -1, NULL) + 1;
++ ucs = (wchar_t *)xmalloc (sizeof(wchar_t) * size);
++ xmbstowcs (ucs, mstr, size, &inv_char);
++ width = wcswidth (ucs, WIDTH_MAX);
+
+- wchar_t *ucs;
+- size_t size;
+- size_t utf_num_chars;
+- int inv_char;
+-
+- size = xmbstowcs (NULL, str, -1, NULL) + 1;
+- ucs = (wchar_t *)xmalloc (sizeof(wchar_t) * size);
+- xmbstowcs (ucs, str, size, &inv_char);
+- if ((size_t)n < size - 1)
+- ucs[n] = L'\0';
+- utf_num_chars = wcstombs (NULL, ucs, 0);
+- if (inv_char) {
+- char *utf8 = (char *)xmalloc (utf_num_chars + 1);
+-
+- wcstombs (utf8, ucs, utf_num_chars + 1);
+- res = waddstr (win, utf8);
+- free (utf8);
++ if (width == -1) {
++ size_t clidx;
++ for (clidx = 0; clidx < size - 1; clidx++) {
++ if (wcwidth (ucs[clidx]) == -1)
++ ucs[clidx] = L'?';
+ }
+- else
+- res = waddnstr (win, str, utf_num_chars);
+- free (ucs);
++ width = wcswidth (ucs, WIDTH_MAX);
++ inv_char = 1;
+ }
+- else {
+- char *lstr = iconv_str (iconv_desc, str);
+
+- res = waddnstr (win, lstr, n);
+- free (lstr);
++ if (width > n) {
++ while (width > n)
++ width -= wcwidth (ucs[--size]);
++ ucs[size] = L'\0';
+ }
+
++ num_chars = wcstombs (NULL, ucs, 0);
++ lstr = (char *)xmalloc (num_chars + 1);
++
++ if (inv_char)
++ wcstombs (lstr, ucs, num_chars + 1);
++ else
++ snprintf (lstr, num_chars + 1, "%s", mstr);
++
++ res = waddstr (win, lstr);
++
++ free (ucs);
++ free (lstr);
++ free (mstr);
+ return res;
+ }
+
+Index: audio_conversion.c
+===================================================================
+--- audio_conversion.c (revision 2506)
++++ audio_conversion.c (revision 2529)
+@@ -189,7 +189,7 @@
+ size_t i;
+
+ /* maximum and minimum values of 32-bit samples */
+- const unsigned int U32_MAX = (1 << 24);
++ const unsigned int U32_MAX = (1 << 24) - 1;
+ const int S32_MAX = (1 << 23) - 1;
+ const int S32_MIN = -(1 << 23);
+
+@@ -201,7 +201,7 @@
+ float f = in[i] * S32_MAX;
+
+ if (f >= S32_MAX)
+- *out_val = U32_MAX;
++ *out_val = U32_MAX << 8;
+ else if (f <= S32_MIN)
+ *out_val = 0;
+ else {
+@@ -231,9 +231,9 @@
+ float f = in[i] * S32_MAX;
+
+ if (f >= S32_MAX)
+- *out_val = S32_MAX;
++ *out_val = S32_MAX << 8;
+ else if (f <= S32_MIN)
+- *out_val = S32_MIN;
++ *out_val = S32_MIN << 8;
+ else {
+ #ifdef HAVE_LRINTF
+ *out_val = lrintf(f) << 8;
+Index: io.c
+===================================================================
+--- io.c (revision 2506)
++++ io.c (revision 2529)
+@@ -141,20 +141,20 @@
+ }
+
+ #ifdef HAVE_MMAP
+-static off_t io_seek_mmap (struct io_stream *s, const long where)
++static off_t io_seek_mmap (struct io_stream *s, const off_t where)
+ {
+- assert (RANGE(0, where, (long)s->size));
++ assert (RANGE(0, where, (off_t)s->size));
+
+ return (s->mem_pos = where);
+ }
+ #endif
+
+-static off_t io_seek_fd (struct io_stream *s, const int where)
++static off_t io_seek_fd (struct io_stream *s, const off_t where)
+ {
+ return lseek (s->fd, where, SEEK_SET);
+ }
+
+-static off_t io_seek_buffered (struct io_stream *s, const long where)
++static off_t io_seek_buffered (struct io_stream *s, const off_t where)
+ {
+ off_t res = -1;
+
+@@ -180,7 +180,7 @@
+ return res;
+ }
+
+-static off_t io_seek_unbuffered (struct io_stream *s, const long where)
++static off_t io_seek_unbuffered (struct io_stream *s, const off_t where)
+ {
+ off_t res = -1;
+
+Index: decoder_plugins/mp3/mp3.c
+===================================================================
+--- decoder_plugins/mp3/mp3.c (revision 2506)
++++ decoder_plugins/mp3/mp3.c (revision 2529)
+@@ -696,17 +696,19 @@
+ {
+ char *ext;
+
++ strcpy (buf, "MPx");
++
+ ext = ext_pos (file);
+- if (!strcasecmp (ext, "mp3"))
+- strcpy (buf, "MP3");
+- else if (!strcasecmp (ext, "mp2"))
+- strcpy (buf, "MP2");
+- else if (!strcasecmp (ext, "mp1"))
+- strcpy (buf, "MP1");
+- else if (!strcasecmp (ext, "mpga"))
+- strcpy (buf, "MPG");
+- else
+- strcpy (buf, "MPx");
++ if (ext) {
++ if (!strcasecmp (ext, "mp3"))
++ strcpy (buf, "MP3");
++ else if (!strcasecmp (ext, "mp2"))
++ strcpy (buf, "MP2");
++ else if (!strcasecmp (ext, "mp1"))
++ strcpy (buf, "MP1");
++ else if (!strcasecmp (ext, "mpga"))
++ strcpy (buf, "MPG");
++ }
+ }
+
+ static int mp3_our_format_ext (const char *ext)
+Index: decoder_plugins/ffmpeg/ffmpeg.m4
+===================================================================
+--- decoder_plugins/ffmpeg/ffmpeg.m4 (revision 2506)
++++ decoder_plugins/ffmpeg/ffmpeg.m4 (revision 2529)
+@@ -88,6 +88,27 @@
+ [#include <libavcodec/avcodec.h>])
+ AC_CHECK_DECLS([AV_CODEC_ID_OPUS], , ,
+ [#include <libavcodec/avcodec.h>])
++ AC_SEARCH_LIBS(avcodec_free_frame, avcodec,
++ [AC_DEFINE([HAVE_AVCODEC_FREE_FRAME], 1,
++ [Define to 1 if you have the `avcodec_free_frame' function.])])
++ AC_CHECK_DECLS([CODEC_ID_PCM_S8_PLANAR], , ,
++ [#include <libavcodec/avcodec.h>])
++ AC_CHECK_DECLS([AV_SAMPLE_FMT_U8P], , ,
++ [#include <libavcodec/avcodec.h>])
++ AC_CHECK_DECLS([AV_SAMPLE_FMT_S16P], , ,
++ [#include <libavcodec/avcodec.h>])
++ AC_CHECK_DECLS([AV_SAMPLE_FMT_S32P], , ,
++ [#include <libavcodec/avcodec.h>])
++ AC_CHECK_DECLS([AV_SAMPLE_FMT_FLTP], , ,
++ [#include <libavcodec/avcodec.h>])
++ AC_CHECK_DECLS([CODEC_CAP_EXPERIMENTAL], , ,
++ [#include <libavcodec/avcodec.h>])
++ AC_SEARCH_LIBS(av_get_sample_fmt_name, avutil,
++ [AC_DEFINE([HAVE_AV_GET_SAMPLE_FMT_NAME], 1,
++ [Define to 1 if you have the `av_get_sample_fmt_name' function.])])
++ AC_SEARCH_LIBS(av_lockmgr_register, avcodec,
++ [AC_DEFINE([HAVE_LOCKMGR_REGISTER], 1,
++ [Define to 1 if you have the `av_lockmgr_register' function.])])
+ CPPFLAGS="$save_CPPFLAGS"
+ CFLAGS="$save_CFLAGS"
+ LIBS="$save_LIBS"
+Index: decoder_plugins/ffmpeg/ffmpeg.c
+===================================================================
+--- decoder_plugins/ffmpeg/ffmpeg.c (revision 2506)
++++ decoder_plugins/ffmpeg/ffmpeg.c (revision 2529)
+@@ -99,6 +99,7 @@
+ bool okay; /* was this stream successfully opened? */
+ struct decoder_error error;
+ long fmt;
++ int sample_width;
+ int bitrate; /* in bits per second */
+ int avg_bitrate; /* in bits per second */
+ #if SEEK_IN_DECODER
+@@ -106,6 +107,7 @@
+ int seek_sec; /* second to which to seek */
+ #endif
+ bool seek_broken; /* FFmpeg seeking is broken */
++ bool timing_broken; /* FFmpeg trashes duration and bit_rate */
+ #if SEEK_IN_DECODER && defined(DEBUG)
+ pthread_t thread_id;
+ #endif
+@@ -277,8 +279,72 @@
+ }
+ }
+
++/* Handle FFmpeg's locking requirements. */
++#ifdef HAVE_LOCKMGR_REGISTER
++static int locking_cb (void **mutex, enum AVLockOp op)
++{
++ int result;
++
++ switch (op) {
++ case AV_LOCK_CREATE:
++ *mutex = xmalloc (sizeof (pthread_mutex_t));
++ result = pthread_mutex_init (*mutex, NULL);
++ break;
++ case AV_LOCK_OBTAIN:
++ result = pthread_mutex_lock (*mutex);
++ break;
++ case AV_LOCK_RELEASE:
++ result = pthread_mutex_unlock (*mutex);
++ break;
++ case AV_LOCK_DESTROY:
++ result = pthread_mutex_destroy (*mutex);
++ free (*mutex);
++ *mutex = NULL;
++ break;
++ }
++
++ return result;
++}
++#endif
++
++/* Here we attempt to determine if FFmpeg/LibAV has trashed the 'duration'
++ * and 'bit_rate' fields in AVFormatContext for large files. Determining
++ * whether or not they are likely to be valid is imprecise and will vary
++ * depending (at least) on:
++ *
++ * - The file's size,
++ * - The file's codec,
++ * - The number and size of tags,
++ * - The version of FFmpeg/LibAV, and
++ * - Whether it's FFmpeg or LibAV.
++ *
++ * This function represents a best guess.
++*/
++static bool is_timing_broken (AVFormatContext *ic)
++{
++ int64_t file_size;
++
++ if (ic->duration < 0 || ic->bit_rate < 0)
++ return true;
++
++#ifdef HAVE_AVIO_SIZE
++ file_size = avio_size (ic->pb);
++#else
++ file_size = ic->file_size;
++#endif
++
++ if (file_size < UINT32_MAX)
++ return false;
++
++ return true;
++}
++
+ static void ffmpeg_init ()
+ {
++#ifdef HAVE_LOCKMGR_REGISTER
++ int rc;
++#endif
++
+ #ifdef DEBUG
+ av_log_set_level (AV_LOG_INFO);
+ #else
+@@ -291,10 +357,20 @@
+ supported_extns = lists_strs_new (16);
+ load_audio_extns (supported_extns);
+ load_video_extns (supported_extns);
++
++#ifdef HAVE_LOCKMGR_REGISTER
++ rc = av_lockmgr_register (locking_cb);
++ if (rc < 0)
++ fatal ("Lock manager initialisation failed");
++#endif
+ }
+
+ static void ffmpeg_destroy ()
+ {
++#ifdef HAVE_LOCKMGR_REGISTER
++ av_lockmgr_register (NULL);
++#endif
++
+ av_log_set_level (AV_LOG_QUIET);
+ ffmpeg_log_repeats (NULL);
+
+@@ -341,9 +417,9 @@
+ }
+ #endif
+
+- if (tags_sel & TAGS_TIME) {
++ if (!is_timing_broken (ic) && tags_sel & TAGS_TIME) {
+ info->time = -1;
+- if (ic->duration >= 0)
++ if (ic->duration != (int64_t)AV_NOPTS_VALUE && ic->duration >= 0)
+ info->time = ic->duration / AV_TIME_BASE;
+ }
+
+@@ -426,12 +502,6 @@
+
+ #endif
+
+- if (tags_sel & TAGS_TIME) {
+- info->time = -1;
+- if (ic->duration != (int64_t)AV_NOPTS_VALUE && ic->duration >= 0)
+- info->time = ic->duration / AV_TIME_BASE;
+- }
+-
+ end:
+ #ifdef HAVE_AVFORMAT_CLOSE_INPUT
+ avformat_close_input (&ic);
+@@ -450,6 +520,9 @@
+ if (!strcmp (data->ic->iformat->name, "wav")) {
+ switch (data->enc->codec_id) {
+ case CODEC_ID_PCM_S8:
++#if HAVE_DECL_CODEC_ID_PCM_S8_PLANAR
++ case CODEC_ID_PCM_S8_PLANAR:
++#endif
+ result = SFMT_S8;
+ break;
+ case CODEC_ID_PCM_U8:
+@@ -456,6 +529,7 @@
+ result = SFMT_U8;
+ break;
+ case CODEC_ID_PCM_S16LE:
++ case CODEC_ID_PCM_S16LE_PLANAR:
+ case CODEC_ID_PCM_S16BE:
+ result = SFMT_S16;
+ break;
+@@ -490,15 +564,27 @@
+
+ switch (data->enc->sample_fmt) {
+ case AV_SAMPLE_FMT_U8:
++#if HAVE_DECL_AV_SAMPLE_FMT_U8P
++ case AV_SAMPLE_FMT_U8P:
++#endif
+ result = SFMT_U8;
+ break;
+ case AV_SAMPLE_FMT_S16:
++#if HAVE_DECL_AV_SAMPLE_FMT_S16P
++ case AV_SAMPLE_FMT_S16P:
++#endif
+ result = SFMT_S16;
+ break;
+ case AV_SAMPLE_FMT_S32:
++#if HAVE_DECL_AV_SAMPLE_FMT_S32P
++ case AV_SAMPLE_FMT_S32P:
++#endif
+ result = SFMT_S32;
+ break;
+ case AV_SAMPLE_FMT_FLT:
++#if HAVE_DECL_AV_SAMPLE_FMT_FLTP
++ case AV_SAMPLE_FMT_FLTP:
++#endif
+ result = SFMT_FLOAT;
+ break;
+ default:
+@@ -597,6 +683,7 @@
+ data->stream = NULL;
+ data->enc = NULL;
+ data->codec = NULL;
++ data->sample_width = 0;
+ data->bitrate = 0;
+ data->avg_bitrate = 0;
+
+@@ -624,6 +711,7 @@
+ data->seek_sec = 0;
+ #endif
+ data->seek_broken = false;
++ data->timing_broken = false;
+
+ decoder_error_init (&data->error);
+
+@@ -655,6 +743,9 @@
+ err = av_find_stream_info (data->ic);
+ #endif
+ if (err < 0) {
++ /* Depending on the particular FFmpeg/LibAV version in use, this
++ * may misreport experimental codecs. Given we don't know the
++ * codec at this time, we will have to live with it. */
+ decoder_error (&data->error, ERROR_FATAL, 0,
+ "Could not find codec parameters (err %d)",
+ err);
+@@ -683,6 +774,19 @@
+ debug ("FFmpeg thinks '%s' is format(codec) '%s(%s)'",
+ fn, data->ic->iformat->name, data->codec->name);
+
++#if HAVE_DECL_CODEC_CAP_EXPERIMENTAL
++ /* This may or may not work depending on the particular version of
++ * FFmpeg/LibAV in use. For some versions this will be caught in
++ * *_find_stream_info() above and misreported as an unfound codec
++ * parameters error. */
++ if (data->codec->capabilities & CODEC_CAP_EXPERIMENTAL) {
++ decoder_error (&data->error, ERROR_FATAL, 0,
++ "The codec is experimental and may damage MOC: %s",
++ data->codec->name);
++ goto end;
++ }
++#endif
++
+ set_downmixing (data);
+ if (data->codec->capabilities & CODEC_CAP_TRUNCATED)
+ data->enc->flags |= CODEC_FLAG_TRUNCATED;
+@@ -702,27 +806,38 @@
+ if (data->fmt == 0)
+ data->fmt = fmt_from_sample_fmt (data);
+ if (data->fmt == 0) {
++#ifdef HAVE_AV_GET_SAMPLE_FMT_NAME
+ decoder_error (&data->error, ERROR_FATAL, 0,
++ "Cannot get sample size from unknown sample format: %s",
++ av_get_sample_fmt_name (data->enc->sample_fmt));
++#else
++ decoder_error (&data->error, ERROR_FATAL, 0,
+ "Unsupported sample size!");
++#endif
++ avcodec_close (data->enc);
+ goto end;
+ }
++ data->sample_width = sfmt_Bps (data->fmt);
+ if (data->codec->capabilities & CODEC_CAP_DELAY)
+ data->delay = true;
+ data->seek_broken = is_seek_broken (data);
++ data->timing_broken = is_timing_broken (data->ic);
+
+ data->okay = true;
+
+- if (data->ic->duration >= AV_TIME_BASE) {
++ if (!data->timing_broken && data->ic->duration >= AV_TIME_BASE) {
+ #ifdef HAVE_AVIO_SIZE
+ data->avg_bitrate = (int) (avio_size (data->ic->pb) /
+- (data->ic->duration / AV_TIME_BASE) * 8);
++ (data->ic->duration / AV_TIME_BASE) * 8);
+ #else
+ data->avg_bitrate = (int) (data->ic->file_size /
+- (data->ic->duration / AV_TIME_BASE) * 8);
++ (data->ic->duration / AV_TIME_BASE) * 8);
+ #endif
+ }
+- data->bitrate = data->ic->bit_rate;
+
++ if (!data->timing_broken && data->ic->bit_rate > 0)
++ data->bitrate = data->ic->bit_rate;
++
+ return data;
+
+ end:
+@@ -908,8 +1023,6 @@
+ &data_size, pkt->data, pkt->size);
+ #endif
+
+- debug ("Decoded %dB", data_size);
+-
+ if (len < 0) {
+ /* skip frame */
+ decoder_error (&data->error, ERROR_STREAM, 0, "Error in the stream!");
+@@ -916,14 +1029,16 @@
+ break;
+ }
+
++ debug ("Decoded %dB", data_size);
++
++ pkt->data += len;
++ pkt->size -= len;
++
+ if (data->eof && data_size == 0) {
+ data->eos = true;
+ break;
+ }
+
+- pkt->data += len;
+- pkt->size -= len;
+-
+ copied = copy_or_buffer (data, data->avbuf, data_size, buf, buf_len);
+
+ buf += copied;
+@@ -943,12 +1058,15 @@
+ char *buf, int buf_len)
+ {
+ int filled = 0;
++ char *packed;
++ AVFrame *frame;
+
++ frame = avcodec_alloc_frame ();
++
+ do {
+- int len, got_frame, is_planar, plane_size, data_size, copied;
+- AVFrame frame;
++ int len, got_frame, is_planar, packed_size, copied;
+
+- len = avcodec_decode_audio4 (data->enc, &frame, &got_frame, pkt);
++ len = avcodec_decode_audio4 (data->enc, frame, &got_frame, pkt);
+
+ if (len < 0) {
+ /* skip frame */
+@@ -956,45 +1074,56 @@
+ break;
+ }
+
+- if (!got_frame) {
+- data->eos = data->eof;
+- break;
+- }
+-
+ debug ("Decoded %dB", len);
+
+ pkt->data += len;
+ pkt->size -= len;
+
+- is_planar = av_sample_fmt_is_planar (data->enc->sample_fmt);
+- data_size = av_samples_get_buffer_size (&plane_size,
+- data->enc->channels, frame.nb_samples,
+- data->enc->sample_fmt, 1);
++ if (!got_frame) {
++ data->eos = data->eof && (pkt->size == 0);
++ continue;
++ }
+
+- if (data_size == 0)
++ if (frame->nb_samples == 0)
+ continue;
+
+- copied = copy_or_buffer (data, (char *)frame.extended_data[0],
+- plane_size, buf, buf_len);
++ is_planar = av_sample_fmt_is_planar (data->enc->sample_fmt);
++ packed = (char *)frame->extended_data[0];
++ packed_size = frame->nb_samples * data->sample_width
++ * data->enc->channels;
++
++ if (is_planar && data->enc->channels > 1) {
++ int sample, ch;
++
++ packed = xmalloc (packed_size);
++
++ for (sample = 0; sample < frame->nb_samples; sample += 1) {
++ for (ch = 0; ch < data->enc->channels; ch += 1)
++ memcpy (packed + (sample * data->enc->channels + ch)
++ * data->sample_width,
++ (char *)frame->extended_data[ch] + sample * data->sample_width,
++ data->sample_width);
++ }
++ }
++
++ copied = copy_or_buffer (data, packed, packed_size, buf, buf_len);
+ buf += copied;
+ filled += copied;
+ buf_len -= copied;
+
+- if (is_planar && data->enc->channels > 1) {
+- int ch;
++ debug ("Copying %dB (%dB filled)", packed_size, filled);
+
+- for (ch = 1; ch < data->enc->channels; ch += 1) {
+- copied = copy_or_buffer (data, (char *)frame.extended_data[ch],
+- plane_size, buf, buf_len);
+- buf += copied;
+- filled += copied;
+- buf_len -= copied;
+- }
+- }
+-
+- debug ("Copying %dB (%dB filled)", data_size, filled);
++ if (packed != (char *)frame->extended_data[0])
++ free (packed);
+ } while (pkt->size > 0);
+
++ avcodec_get_frame_defaults (frame);
++#ifdef HAVE_AVCODEC_FREE_FRAME
++ avcodec_free_frame (&frame);
++#else
++ av_freep (&frame);
++#endif
++
+ return filled;
+ }
+ #endif
+@@ -1122,9 +1251,10 @@
+ free_packet (pkt);
+ } while (!bytes_produced && !data->eos);
+
+- data->bitrate = compute_bitrate (sound_params, bytes_used,
+- bytes_produced + data->remain_buf_len,
+- data->bitrate);
++ if (!data->timing_broken)
++ data->bitrate = compute_bitrate (sound_params, bytes_used,
++ bytes_produced + data->remain_buf_len,
++ data->bitrate);
+
+ return bytes_produced;
+ }
+@@ -1185,7 +1315,7 @@
+ {
+ struct ffmpeg_data *data = (struct ffmpeg_data *)prv_data;
+
+- return data->bitrate / 1000;
++ return data->timing_broken ? -1 : data->bitrate / 1000;
+ }
+
+ static int ffmpeg_get_avg_bitrate (void *prv_data)
+@@ -1192,7 +1322,7 @@
+ {
+ struct ffmpeg_data *data = (struct ffmpeg_data *)prv_data;
+
+- return data->avg_bitrate / 1000;
++ return data->timing_broken ? -1 : data->avg_bitrate / 1000;
+ }
+
+ static int ffmpeg_get_duration (void *prv_data)
+@@ -1199,6 +1329,9 @@
+ {
+ struct ffmpeg_data *data = (struct ffmpeg_data *)prv_data;
+
++ if (data->timing_broken)
++ return -1;
++
+ if (!data->stream)
+ return -1;
+
+Index: decoder_plugins/vorbis/vorbis.c
+===================================================================
+--- decoder_plugins/vorbis/vorbis.c (revision 2506)
++++ decoder_plugins/vorbis/vorbis.c (revision 2529)
+@@ -47,9 +47,9 @@
+
+ /* Tremor defines time as 64-bit integer milliseconds. */
+ #ifndef HAVE_TREMOR
+-static const double time_scaler = 1;
++static const int64_t time_scaler = 1;
+ #else
+-static const ogg_int64_t time_scaler = 1000;
++static const int64_t time_scaler = 1000;
+ #endif
+
+ struct vorbis_data
+@@ -171,11 +171,11 @@
+ get_comment_tags (&vf, info);
+
+ if (tags_sel & TAGS_TIME) {
+- int vorbis_time;
++ int64_t vorbis_time;
+
+- vorbis_time = ov_time_total (&vf, -1) / time_scaler;
+- if (vorbis_time >= 0)
+- info->time = vorbis_time;
++ vorbis_time = ov_time_total (&vf, -1);
++ if (vorbis_time >= 0)
++ info->time = vorbis_time / time_scaler;
+ }
+
+ ov_clear (&vf);
+@@ -244,12 +244,15 @@
+ io_close (data->stream);
+ }
+ else {
++ int64_t duration;
++
+ data->last_section = -1;
+ data->avg_bitrate = ov_bitrate (&data->vf, -1) / 1000;
+ data->bitrate = data->avg_bitrate;
+- data->duration = ov_time_total (&data->vf, -1) / time_scaler;
+- if (data->duration == OV_EINVAL)
+- data->duration = -1;
++ data->duration = -1;
++ duration = ov_time_total (&data->vf, -1);
++ if (duration >= 0)
++ data->duration = duration / time_scaler;
+ data->ok = 1;
+ get_comment_tags (&data->vf, data->tags);
+ }
+@@ -280,9 +283,9 @@
+
+ static int vorbis_can_decode (struct io_stream *stream)
+ {
+- char buf[34];
++ char buf[35];
+
+- if (io_peek (stream, buf, 34) == 34 && !memcmp (buf, "OggS", 4)
++ if (io_peek (stream, buf, 35) == 35 && !memcmp (buf, "OggS", 4)
+ && !memcmp (buf + 28, "\01vorbis", 7))
+ return 1;
+
+Index: decoder_plugins/flac/flac.c
+===================================================================
+--- decoder_plugins/flac/flac.c (revision 2506)
++++ decoder_plugins/flac/flac.c (revision 2529)
+@@ -54,7 +54,7 @@
+ int abort; /* abort playing (due to an error) */
+
+ unsigned length;
+- unsigned total_samples;
++ FLAC__uint64 total_samples;
+
+ FLAC__byte sample_buffer[SAMPLE_BUFFER_SIZE];
+ unsigned sample_buffer_fill;
+@@ -156,11 +156,8 @@
+ if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {
+ debug ("Got metadata info");
+
+- data->total_samples =
+- (unsigned)(metadata->data.stream_info.total_samples
+- & 0xffffffff);
+- data->bits_per_sample =
+- metadata->data.stream_info.bits_per_sample;
++ data->total_samples = metadata->data.stream_info.total_samples;
++ data->bits_per_sample = metadata->data.stream_info.bits_per_sample;
+ data->channels = metadata->data.stream_info.channels;
+ data->sample_rate = metadata->data.stream_info.sample_rate;
+ data->length = data->total_samples / data->sample_rate;
+@@ -536,9 +533,10 @@
+ if ((unsigned)sec > data->length)
+ return -1;
+
+- target_sample = (FLAC__uint64)((sec/(double)data->length) *
+- (double)data->total_samples);
++ target_sample = (FLAC__uint64)(((double)sec / (double)data->length) *
++ (double)data->total_samples);
+
++
+ #ifdef LEGACY_FLAC
+ if (FLAC__seekable_stream_decoder_seek_absolute(data->decoder,
+ target_sample))
+Index: audio.c
+===================================================================
+--- audio.c (revision 2506)
++++ audio.c (revision 2529)
+@@ -169,7 +169,7 @@
+ if (fmt1 & (SFMT_S16 | SFMT_U16)
+ && fmt2 & (SFMT_S16 | SFMT_U16))
+ return 1;
+- if (fmt1 & (SFMT_S8 | SFMT_U8)
++ if (fmt1 & (SFMT_S32 | SFMT_U32)
+ && fmt2 & (SFMT_S32 | SFMT_U32))
+ return 1;
+ if (fmt1 & fmt2 & SFMT_FLOAT)
+Index: TODO
+===================================================================
+--- TODO (revision 2506)
++++ TODO (revision 2529)
+@@ -9,8 +9,6 @@
+ - Recognition of ID3 tags v1 is broken (example: small.mp3). [node/234]
+ - Perhaps MOC can add support for the frame field_type to differentiate
+ between ID3_FIELD_TYPE_LATIN1 and ID3_FIELD_TYPE_STRING. [node/234]
+- - Characters which are represented in more than one screen column cause
+- the text to overflow its field. [node/82, 99 and 788]
+ - Some Cyrillic characters in file and directory names don't get displayed
+ correctly.
+ * Program crashes:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20130804/69aa2799/attachment-0001.html>
More information about the macports-changes
mailing list