Merge commit 'fml/master'
authorAndre Noll <maan@systemlinux.org>
Mon, 1 Dec 2008 20:19:17 +0000 (21:19 +0100)
committerAndre Noll <maan@systemlinux.org>
Mon, 1 Dec 2008 20:19:17 +0000 (21:19 +0100)
1  2 
mp3dec_filter.c

diff --combined mp3dec_filter.c
index e9d84c1baf366ef4390082bca5e8f27c289e7008,5e5df865b50b17373c404a0fe494373b607dbde2..aa2ab510240e448c410dddc90fb445e471859445
@@@ -7,7 -7,6 +7,7 @@@
  /** \file mp3dec_filter.c Paraslash's mp3 decoder. */
  
  #include "para.h"
 +#include "mp3dec_filter.cmdline.h"
  #include "list.h"
  #include "sched.h"
  #include "filter.h"
@@@ -15,6 -14,9 +15,6 @@@
  #include <mad.h>
  #include "string.h"
  
 -/** The output buffer size. */
 -#define MP3_OUTBUF_SIZE (128 * 1024)
 -
  /** Convert a sample value from libmad to a signed short. */
  #define MAD_TO_SHORT(f) (f) >= MAD_F_ONE? SHRT_MAX :\
        (f) <= -MAD_F_ONE? -SHRT_MAX : (signed short) ((f) >> (MAD_F_FRACBITS - 15))
@@@ -33,9 -35,9 +33,9 @@@ static ssize_t mp3dec(char *inbuffer, s
  {
        int i, ret;
        struct private_mp3dec_data *pmd = fn->private_data;
-       size_t copy = PARA_MIN(len, 4096);
+       size_t copy = PARA_MIN(len, (size_t)4096);
  
 -      if (fn->loaded > fn->bufsize * 4 / 5)
 +      if (fn->loaded + 16384 > fn->bufsize)
                return 0;
        mad_stream_buffer(&pmd->stream, (unsigned char *) inbuffer, copy);
        pmd->stream.error = 0;
@@@ -78,7 -80,7 +78,7 @@@ next_frame
                PARA_ERROR_LOG("output buffer full: %zd\n", fn->loaded);
                        return -E_MP3DEC_OVERRUN;
        }
 -      if (fn->loaded <= fn->bufsize * 4 / 5)
 +      if (fn->loaded + 16384 <= fn->bufsize)
                goto next_frame;
  out:
        if (pmd->stream.next_frame) { /* we still have some data */
@@@ -107,38 -109,14 +107,38 @@@ static void mp3dec_close(struct filter_
  static void mp3dec_open(struct filter_node *fn)
  {
        struct private_mp3dec_data *pmd = para_calloc(sizeof(*pmd));
 +      struct mp3dec_filter_args_info *mp3_conf = fn->conf;
  
        fn->private_data = pmd;
        mad_stream_init(&pmd->stream);
        mad_frame_init(&pmd->frame);
        mad_synth_init(&pmd->synth);
        fn->loaded = 0;
 -      fn->bufsize = MP3_OUTBUF_SIZE;
 +      fn->bufsize = mp3_conf->bufsize_arg * 1024;
        fn->buf = para_calloc(fn->bufsize);
 +      if (mp3_conf->ignore_crc_given)
 +              mad_stream_options(&pmd->stream, MAD_OPTION_IGNORECRC);
 +}
 +
 +static int mp3dec_parse_config(int argc, char **argv, void **config)
 +{
 +      int ret;
 +      struct mp3dec_filter_args_info *mp3_conf;
 +
 +      mp3_conf = para_calloc(sizeof(*mp3_conf));
 +      ret = -E_MP3DEC_SYNTAX;
 +      if (mp3dec_cmdline_parser(argc, argv, mp3_conf))
 +              goto err;
 +      ret = -ERRNO_TO_PARA_ERROR(EINVAL);
 +      if (mp3_conf->bufsize_arg < 32)
 +              goto err;
 +      if (mp3_conf->bufsize_arg >= INT_MAX / 1024)
 +              goto err;
 +      *config = mp3_conf;
 +      return 1;
 +err:
 +      free(mp3_conf);
 +      return ret;
  }
  
  /**
@@@ -153,5 -131,4 +153,5 @@@ void mp3dec_filter_init(struct filter *
        f->open = mp3dec_open;
        f->convert = mp3dec;
        f->close = mp3dec_close;
 +      f->parse_config = mp3dec_parse_config;
  }