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 |
|
69 |
68 |
70 /* unpack from float to float 64 (double) */ |
69 /* unpack from float to float 64 (double) */ |
71 #define MAKE_UNPACK_FUNC_FF(name, type, FUNC) \ |
70 #define MAKE_UNPACK_FUNC_FF(name, type, FUNC) \ |
72 static void \ |
71 static void \ |
73 MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s, \ |
72 MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s, \ |
416 |
415 |
417 |
416 |
418 |
417 |
419 gboolean |
418 gboolean |
420 audio_convert_prepare_context (AudioConvertCtx * ctx, AudioConvertFmt * in, |
419 audio_convert_prepare_context (AudioConvertCtx * ctx, AudioConvertFmt * in, |
421 AudioConvertFmt * out, DitherType dither, NoiseShapingType ns) |
420 AudioConvertFmt * out, GstAudioConvertDithering dither, |
|
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); |
431 |
434 |
432 ctx->in = *in; |
435 ctx->in = *in; |
433 ctx->out = *out; |
436 ctx->out = *out; |
434 |
437 |
435 /* Don't dither or apply noise shaping if out depth is bigger than 20 bits |
438 /* Don't dither or apply noise shaping if out depth is bigger than 20 bits |
532 |
535 |
533 gboolean |
536 gboolean |
534 audio_convert_convert (AudioConvertCtx * ctx, gpointer src, |
537 audio_convert_convert (AudioConvertCtx * ctx, gpointer src, |
535 gpointer dst, gint samples, gboolean src_writable) |
538 gpointer dst, gint samples, gboolean src_writable) |
536 { |
539 { |
537 gint insize, outsize, size; |
540 guint insize, outsize, size; |
538 gpointer outbuf, tmpbuf; |
541 gpointer outbuf, tmpbuf; |
539 gint intemp = 0, outtemp = 0, biggest; |
542 guint intemp = 0, outtemp = 0, biggest; |
540 |
543 |
541 g_return_val_if_fail (ctx != NULL, FALSE); |
544 g_return_val_if_fail (ctx != NULL, FALSE); |
542 g_return_val_if_fail (src != NULL, FALSE); |
545 g_return_val_if_fail (src != NULL, FALSE); |
543 g_return_val_if_fail (dst != NULL, FALSE); |
546 g_return_val_if_fail (dst != NULL, FALSE); |
544 g_return_val_if_fail (samples >= 0, FALSE); |
547 g_return_val_if_fail (samples >= 0, FALSE); |
552 /* find biggest temp buffer size */ |
555 /* find biggest temp buffer size */ |
553 size = (DOUBLE_INTERMEDIATE_FORMAT (ctx)) ? sizeof (gdouble) |
556 size = (DOUBLE_INTERMEDIATE_FORMAT (ctx)) ? sizeof (gdouble) |
554 : sizeof (gint32); |
557 : sizeof (gint32); |
555 |
558 |
556 if (!ctx->in_default) |
559 if (!ctx->in_default) |
557 intemp = insize * size * 8 / ctx->in.width; |
560 intemp = gst_util_uint64_scale (insize, size * 8, ctx->in.width); |
558 if (!ctx->mix_passthrough || !ctx->out_default) |
561 if (!ctx->mix_passthrough || !ctx->out_default) |
559 outtemp = outsize * size * 8 / ctx->out.width; |
562 outtemp = gst_util_uint64_scale (outsize, size * 8, ctx->out.width); |
560 biggest = MAX (intemp, outtemp); |
563 biggest = MAX (intemp, outtemp); |
561 |
564 |
562 /* see if one of the buffers can be used as temp */ |
565 /* see if one of the buffers can be used as temp */ |
563 if ((outsize >= biggest) && (ctx->out.unit_size <= size)) |
566 if ((outsize >= biggest) && (ctx->out.unit_size <= size)) |
564 tmpbuf = dst; |
567 tmpbuf = dst; |