gst_plugins_base/gst/audioconvert/audioconvert.c
branchRCL_3
changeset 30 7e817e7e631c
parent 29 567bb019e3e3
equal deleted inserted replaced
29:567bb019e3e3 30:7e817e7e631c
    63     /* blow up to 32 bit */                                                   \
    63     /* blow up to 32 bit */                                                   \
    64     temp = floor ((READ_FUNC (*src++) * 2147483647.0) + 0.5);                 \
    64     temp = floor ((READ_FUNC (*src++) * 2147483647.0) + 0.5);                 \
    65     *dst++ = (gint32) CLAMP (temp, G_MININT32, G_MAXINT32);                   \
    65     *dst++ = (gint32) CLAMP (temp, G_MININT32, G_MAXINT32);                   \
    66   }                                                                           \
    66   }                                                                           \
    67 }
    67 }
       
    68 
    68 
    69 
    69 /* unpack from float to float 64 (double) */
    70 /* unpack from float to float 64 (double) */
    70 #define MAKE_UNPACK_FUNC_FF(name, type, FUNC)                                 \
    71 #define MAKE_UNPACK_FUNC_FF(name, type, FUNC)                                 \
    71 static void                                                                   \
    72 static void                                                                   \
    72 MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s,              \
    73 MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s,              \
   415 
   416 
   416 
   417 
   417 
   418 
   418 gboolean
   419 gboolean
   419 audio_convert_prepare_context (AudioConvertCtx * ctx, AudioConvertFmt * in,
   420 audio_convert_prepare_context (AudioConvertCtx * ctx, AudioConvertFmt * in,
   420     AudioConvertFmt * out, GstAudioConvertDithering dither,
   421     AudioConvertFmt * out, DitherType dither, NoiseShapingType ns)
   421     GstAudioConvertNoiseShaping ns)
       
   422 {
   422 {
   423   gint idx_in, idx_out;
   423   gint idx_in, idx_out;
   424 
   424 
   425   g_return_val_if_fail (ctx != NULL, FALSE);
   425   g_return_val_if_fail (ctx != NULL, FALSE);
   426   g_return_val_if_fail (in != NULL, FALSE);
   426   g_return_val_if_fail (in != NULL, FALSE);
   427   g_return_val_if_fail (out != NULL, FALSE);
   427   g_return_val_if_fail (out != NULL, FALSE);
   428 
   428 
   429   /* first clean the existing context */
   429   /* first clean the existing context */
   430   audio_convert_clean_context (ctx);
   430   audio_convert_clean_context (ctx);
   431 
       
   432   g_return_val_if_fail (in->unpositioned_layout == out->unpositioned_layout,
       
   433       FALSE);
       
   434 
   431 
   435   ctx->in = *in;
   432   ctx->in = *in;
   436   ctx->out = *out;
   433   ctx->out = *out;
   437 
   434 
   438   /* Don't dither or apply noise shaping if out depth is bigger than 20 bits
   435   /* Don't dither or apply noise shaping if out depth is bigger than 20 bits
   535 
   532 
   536 gboolean
   533 gboolean
   537 audio_convert_convert (AudioConvertCtx * ctx, gpointer src,
   534 audio_convert_convert (AudioConvertCtx * ctx, gpointer src,
   538     gpointer dst, gint samples, gboolean src_writable)
   535     gpointer dst, gint samples, gboolean src_writable)
   539 {
   536 {
   540   guint insize, outsize, size;
   537   gint insize, outsize, size;
   541   gpointer outbuf, tmpbuf;
   538   gpointer outbuf, tmpbuf;
   542   guint intemp = 0, outtemp = 0, biggest;
   539   gint intemp = 0, outtemp = 0, biggest;
   543 
   540 
   544   g_return_val_if_fail (ctx != NULL, FALSE);
   541   g_return_val_if_fail (ctx != NULL, FALSE);
   545   g_return_val_if_fail (src != NULL, FALSE);
   542   g_return_val_if_fail (src != NULL, FALSE);
   546   g_return_val_if_fail (dst != NULL, FALSE);
   543   g_return_val_if_fail (dst != NULL, FALSE);
   547   g_return_val_if_fail (samples >= 0, FALSE);
   544   g_return_val_if_fail (samples >= 0, FALSE);
   555   /* find biggest temp buffer size */
   552   /* find biggest temp buffer size */
   556   size = (DOUBLE_INTERMEDIATE_FORMAT (ctx)) ? sizeof (gdouble)
   553   size = (DOUBLE_INTERMEDIATE_FORMAT (ctx)) ? sizeof (gdouble)
   557       : sizeof (gint32);
   554       : sizeof (gint32);
   558 
   555 
   559   if (!ctx->in_default)
   556   if (!ctx->in_default)
   560     intemp = gst_util_uint64_scale (insize, size * 8, ctx->in.width);
   557     intemp = insize * size * 8 / ctx->in.width;
   561   if (!ctx->mix_passthrough || !ctx->out_default)
   558   if (!ctx->mix_passthrough || !ctx->out_default)
   562     outtemp = gst_util_uint64_scale (outsize, size * 8, ctx->out.width);
   559     outtemp = outsize * size * 8 / ctx->out.width;
   563   biggest = MAX (intemp, outtemp);
   560   biggest = MAX (intemp, outtemp);
   564 
   561 
   565   /* see if one of the buffers can be used as temp */
   562   /* see if one of the buffers can be used as temp */
   566   if ((outsize >= biggest) && (ctx->out.unit_size <= size))
   563   if ((outsize >= biggest) && (ctx->out.unit_size <= size))
   567     tmpbuf = dst;
   564     tmpbuf = dst;