rpms/moc/F-19 moc+warnings.patch, NONE, 1.1 moc-r2506:2526-samplesize.patch, NONE, 1.1 moc.spec, 1.1, 1.2

Antonio sagitter at rpmfusion.org
Tue Jun 18 17:14:25 CEST 2013


Author: sagitter

Update of /cvs/free/rpms/moc/F-19
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv17395/F-19

Modified Files:
	moc.spec 
Added Files:
	moc+warnings.patch moc-r2506:2526-samplesize.patch 
Log Message:


moc+warnings.patch:
 audio.c                         |    2 +-
 decoder_plugins/ffmpeg/ffmpeg.c |    4 ++++
 2 files changed, 5 insertions(+), 1 deletion(-)

--- NEW FILE moc+warnings.patch ---
diff --git a/audio.c b/audio.c
index 5ae0e1e..863238f 100644
--- a/audio.c
+++ b/audio.c
@@ -883,7 +883,7 @@ static void find_working_driver (lists_t_strs *drivers, struct hw_funcs *funcs)
 {
 	int ix;
 
-	memset (funcs, 0, sizeof(funcs));
+	memset (funcs, 0, sizeof(*funcs));
 
 	for (ix = 0; ix < lists_strs_size (drivers); ix += 1) {
 		const char *name;
diff --git a/decoder_plugins/ffmpeg/ffmpeg.c b/decoder_plugins/ffmpeg/ffmpeg.c
index a85fd82..e8f0b91 100644
--- a/decoder_plugins/ffmpeg/ffmpeg.c
+++ b/decoder_plugins/ffmpeg/ffmpeg.c
@@ -301,6 +301,10 @@ static int locking_cb (void **mutex, enum AVLockOp op)
 		free (*mutex);
 		*mutex = NULL;
 		break;
+	default:
+		/* Catch any FFmpeg/LibAV API changes. */
+		assert (0);
+		result = 0;
 	}
 
 	return result;

moc-r2506:2526-samplesize.patch:
 THANKS                           |    7 +
 TODO                             |    2 
 audio.c                          |    2 
 audio_conversion.c               |    8 -
 configure.in                     |    6 -
 decoder_plugins/ffmpeg/ffmpeg.c  |  190 +++++++++++++++++++++++++++++++--------
 decoder_plugins/ffmpeg/ffmpeg.m4 |   19 +++
 decoder_plugins/flac/flac.c      |   14 +-
 decoder_plugins/mp3/mp3.c        |   22 ++--
 decoder_plugins/vorbis/vorbis.c  |   25 ++---
 io.c                             |   10 +-
 menu.c                           |    9 +
 mocp.1                           |    5 +
 utf8.c                           |   63 ++++++------
 14 files changed, 270 insertions(+), 112 deletions(-)

--- NEW FILE moc-r2506:2526-samplesize.patch ---
Index: THANKS
===================================================================
--- moc-2.5.0-beta1/THANKS	(revision 2506)
+++ moc-2.5.0-beta1/THANKS	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/mocp.1	(revision 2506)
+++ moc-2.5.0-beta1/mocp.1	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/menu.c	(revision 2506)
+++ moc-2.5.0-beta1/menu.c	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/configure.in	(revision 2506)
+++ moc-2.5.0-beta1/configure.in	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/utf8.c	(revision 2506)
+++ moc-2.5.0-beta1/utf8.c	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/audio_conversion.c	(revision 2506)
+++ moc-2.5.0-beta1/audio_conversion.c	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/io.c	(revision 2506)
+++ moc-2.5.0-beta1/io.c	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/decoder_plugins/mp3/mp3.c	(revision 2506)
+++ moc-2.5.0-beta1/decoder_plugins/mp3/mp3.c	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/decoder_plugins/ffmpeg/ffmpeg.m4	(revision 2506)
+++ moc-2.5.0-beta1/decoder_plugins/ffmpeg/ffmpeg.m4	(revision 2526)
@@ -88,6 +88,25 @@
 		                 [#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_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
===================================================================
--- moc-2.5.0-beta1/decoder_plugins/ffmpeg/ffmpeg.c	(revision 2506)
+++ moc-2.5.0-beta1/decoder_plugins/ffmpeg/ffmpeg.c	(revision 2526)
@@ -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,12 +520,16 @@
 		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:
 				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);
 
@@ -702,27 +790,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:
@@ -943,12 +1042,14 @@
                           char *buf, int buf_len)
 {
 	int filled = 0;
+	AVFrame *frame;
 
+	frame = avcodec_alloc_frame ();
+
 	do {
 		int len, got_frame, is_planar, plane_size, data_size, copied;
-		AVFrame frame;
 
-		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 */
@@ -968,33 +1069,46 @@
 
 		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->channels,
+		                                        frame->nb_samples,
 		                                        data->enc->sample_fmt, 1);
 
 		if (data_size == 0)
 			continue;
 
-		copied = copy_or_buffer (data, (char *)frame.extended_data[0],
-		                         plane_size, buf, buf_len);
-		buf += copied;
-		filled += copied;
-		buf_len -= copied;
+		if (is_planar && data->enc->channels > 1) {
+			int offset, ch;
 
-        if (is_planar && data->enc->channels > 1) {
-			int ch;
+			for (offset = 0; offset < plane_size; offset += data->sample_width) {
+				for (ch = 0; ch < data->enc->channels; ch += 1) {
+					copied = copy_or_buffer (data,
+					                         (char *)frame->extended_data[ch]
+					                                               + offset,
+				                             data->sample_width, buf, buf_len);
+					buf += copied;
+					filled += copied;
+					buf_len -= copied;
+				}
+			}
+		}
+		else {
+			copied = copy_or_buffer (data, (char *)frame->extended_data[0],
+		                             plane_size, buf, buf_len);
+			buf += copied;
+			filled += copied;
+			buf_len -= copied;
+		}
 
-            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);
 	} 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 +1236,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,20 +1300,23 @@
 {
 	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)
 {
 	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)
 {
 	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
===================================================================
--- moc-2.5.0-beta1/decoder_plugins/vorbis/vorbis.c	(revision 2506)
+++ moc-2.5.0-beta1/decoder_plugins/vorbis/vorbis.c	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/decoder_plugins/flac/flac.c	(revision 2506)
+++ moc-2.5.0-beta1/decoder_plugins/flac/flac.c	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/audio.c	(revision 2506)
+++ moc-2.5.0-beta1/audio.c	(revision 2526)
@@ -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
===================================================================
--- moc-2.5.0-beta1/TODO	(revision 2506)
+++ moc-2.5.0-beta1/TODO	(revision 2526)
@@ -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:


Index: moc.spec
===================================================================
RCS file: /cvs/free/rpms/moc/F-19/moc.spec,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- moc.spec	8 Jun 2013 18:47:21 -0000	1.1
+++ moc.spec	18 Jun 2013 15:14:24 -0000	1.2
@@ -4,7 +4,7 @@
 Name:    moc
 Summary: Music on Console - Console audio player for Linux/UNIX
 Version: 2.5.0
-Release: 0.9.beta1%{?dist}
+Release: 0.10.beta1%{?dist}
 License: GPLv2+ and GPLv3+
 URL:     http://www.moc.daper.net
 Source0: http://ftp.daper.net/pub/soft/moc/unstable/%{name}-%{version}-beta1.tar.bz2
@@ -12,6 +12,14 @@
 ## This patch corrects all outdated FSF address
 Patch0: %{name}-r2506+fsf_addr.patch
 
+## This patchset corrects "Unsupported sample size!" error
+## See http://moc.daper.net/node/862
+Patch1: %{name}-r2506:2526-samplesize.patch
+
+## This patch corrects 'sizeof' argument bug; 
+## directly provided from upstream 
+Patch2: %{name}+warnings.patch
+
 BuildRequires: pkgconfig(ncurses) 
 BuildRequires: pkgconfig(alsa) 
 BuildRequires: pkgconfig(jack)
@@ -36,6 +44,9 @@
 BuildRequires: libtool
 BuildRequires: librcc-devel
 
+## Source code configuring tools
+BuildRequires: autoconf, automake >= 1.13
+
 Requires: ffmpeg  
 Requires: opus
 
@@ -47,9 +58,19 @@
 
 %prep
 %setup -q -n %{name}-%{version}-beta1
-%patch0 -p1 -b %{name}-r2506+fsf_addr.patch
+%patch0 -p1
+%patch1 -p1
+%patch2 -p1
+
+## This renaming is requested by Automake-1.13
+mv configure.in configure.ac
 
 %build
+
+## Latest patchset changes ffmpeg.m4 file
+## Autoreconf is temporarily necessary
+autoreconf -i --force
+
 %configure --disable-static --with-rcc \
            --with-oss --with-alsa --with-jack --with-aac --with-mp3 \
            --with-musepack --with-vorbis --with-flac --with-wavpack  \
@@ -76,6 +97,13 @@
 %{_libdir}/%{name}/decoder_plugins
 
 %changelog
+* Tue Jun 18 2013 Antonio Trande <sagitter at fedoraproject.org> 2.5.0-0.10.beta1
+- Added patchset to fix "Unsupported sample size!" error
+  See http://moc.daper.net/node/862 for more details
+- Added patch for 'sizeof' argument bug
+- Added BR: Autoconf and Automake-1.13 (temporarily)
+- 'configure.in' renaming
+
 * Sat Jun 08 2013 Antonio Trande <sagitter at fedoraproject.org> 2.5.0-0.9.beta1
 - Removed some explicit Requires (curl, jack-audio-connection-kit, ncurses, speex)
 


More information about the rpmfusion-commits mailing list