Author: sagitter
Update of /cvs/free/rpms/moc/devel
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv1492/devel
Modified Files:
.cvsignore sources
Added Files:
moc+warnings.patch moc-r2506+fsf_addr.patch
moc-r2506:2526-samplesize.patch moc.spec
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+fsf_addr.patch:
xing.c | 4 ++--
xing.h | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
--- NEW FILE moc-r2506+fsf_addr.patch ---
diff --git a/decoder_plugins/mp3/xing.c b/decoder_plugins/mp3/xing.c
index 743cc3d..68a01dc 100644
--- a/decoder_plugins/mp3/xing.c
+++ b/decoder_plugins/mp3/xing.c
@@ -13,8 +13,8 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $Id: xing.c,v 1.5 2002/11/18 16:32:21 daper Exp $
*/
diff --git a/decoder_plugins/mp3/xing.h b/decoder_plugins/mp3/xing.h
index 8cb1c2a..1f26e09 100644
--- a/decoder_plugins/mp3/xing.h
+++ b/decoder_plugins/mp3/xing.h
@@ -13,8 +13,8 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $Id: xing.h,v 1.3 2002/10/04 13:38:09 daper Exp $
*/
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:
--- NEW FILE moc.spec ---
# Set up a new macro to define MOC's 'mocp' executable
%global exec mocp
Name: moc
Summary: Music on Console - Console audio player for Linux/UNIX
Version: 2.5.0
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
## 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)
BuildRequires: pkgconfig(libcurl)
BuildRequires: pkgconfig(samplerate)
BuildRequires: ffmpeg-devel
BuildRequires: pkgconfig(taglib)
BuildRequires: pkgconfig(speex)
BuildRequires: libmad-devel
BuildRequires: pkgconfig(id3tag)
BuildRequires: pkgconfig(vorbis)
BuildRequires: pkgconfig(flac)
BuildRequires: pkgconfig(zlib)
BuildRequires: pkgconfig(sndfile)
BuildRequires: pkgconfig(libmodplug)
BuildRequires: pkgconfig(libtimidity)
BuildRequires: pkgconfig(wavpack)
BuildRequires: libdb-devel
BuildRequires: libtool-ltdl-devel
BuildRequires: gettext-devel
BuildRequires: pkgconfig(opus)
BuildRequires: libtool
BuildRequires: librcc-devel
## Source code configuring tools
BuildRequires: autoconf, automake >= 1.13
Requires: ffmpeg
Requires: opus
%description
MOC (music on console) is a console audio player for LINUX/UNIX designed to be
powerful and easy to use. You just need to select a file from some directory
using the menu similar to Midnight Commander, and MOC will start playing all
files in this directory beginning from the chosen file.
%prep
%setup -q -n %{name}-%{version}-beta1
%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 \
--with-sndfile --with-modplug --with-ffmpeg --with-speex \
--with-samplerate --with-curl
make %{?_smp_mflags}
%install
%make_install
rm -rf $RPM_BUILD_ROOT%{_datadir}/doc
rm -f $RPM_BUILD_ROOT%_libdir/*.la
rm -f $RPM_BUILD_ROOT%_libdir/moc/decoder_plugins/*.la
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%files
%doc README README_equalizer AUTHORS ChangeLog COPYING config.example keymap.example NEWS
%dir %{_datadir}/%{name}
%{_bindir}/%{exec}
%{_datadir}/%{name}/themes/*
%{_mandir}/man1/%{exec}.*
%dir %{_libdir}/%{name}
%{_libdir}/%{name}/decoder_plugins
%changelog
* Tue Jun 18 2013 Antonio Trande <sagitter(a)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(a)fedoraproject.org> 2.5.0-0.9.beta1
- Removed some explicit Requires (curl, jack-audio-connection-kit, ncurses, speex)
* Fri Jun 07 2013 Antonio Trande <sagitter(a)fedoraproject.org> 2.5.0-0.8.beta1
- Fixed Source0 line
- Package owns %%{_libdir}/%%{name} directory
* Mon May 20 2013 Antonio Trande <sagitter(a)fedoraproject.org> 2.5.0-0.7.beta1
- Dist tag changed to %%{?dist}
* Tue Apr 09 2013 Antonio Trande <sagitter(a)fedoraproject.org> 2.5.0-0.6.beta1
- Removed autoreconf task from %%build section
* Fri Apr 05 2013 Antonio Trande <sagitter(a)fedoraproject.org> 2.5.0-0.5.beta1
- Removed libRCC explicit require
* Sun Mar 03 2013 Antonio Trande <sagitter(a)fedoraproject.org> 2.5.0-0.4.beta1
- Removed DESTDIR from %%make_install
- Changed source link with a public one
- Set up a new macro to define MOC's 'mocp' executable
- Added %%{name} prefix to the patch
* Tue Dec 25 2012 Antonio Trande <sagitter(a)fedoraproject.org> 2.5.0-0.3.beta1
- Added librcc support (fixes encoding in broken mp3 tags)
* Mon Oct 22 2012 Antonio Trande <sagitter(a)fedoraproject.org> 2.5.0-0.2.beta1
- Added patch to fix FSF address
* Mon Oct 22 2012 Antonio Trande <sagitter(a)fedoraproject.org> 2.5.0-0.1.beta1
- 2.5.0-beta1
Index: .cvsignore
===================================================================
RCS file: /cvs/free/rpms/moc/devel/.cvsignore,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- .cvsignore 8 Jun 2013 14:24:00 -0000 1.1
+++ .cvsignore 19 Oct 2013 10:33:19 -0000 1.2
@@ -0,0 +1 @@
+moc-2.5.0-beta1.tar.bz2
Index: sources
===================================================================
RCS file: /cvs/free/rpms/moc/devel/sources,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- sources 8 Jun 2013 14:24:00 -0000 1.1
+++ sources 19 Oct 2013 10:33:19 -0000 1.2
@@ -0,0 +1 @@
+795ecba86847e082aa2f21937cc04804 moc-2.5.0-beta1.tar.bz2