ref: 7b49904805150793a0cb8a9219da60b1bb276877
parent: bf06c4f2ede23e23ff92ee9fb0fbedd84e69fb01
author: Timothy B. Terriberry <tterribe@xiph.org>
date: Fri Apr 5 17:06:28 EDT 2013
Small cleanups of the soft clipping code. - Made OP_SOFT_CLIP defined only when using floating point (libopus handles clipping when using the fixed-point API). - Struct rearrangement for theoretically better packing on some platforms. - Reset the state tracking channel count when re-initializing a decoder (and not the dither mute, because that gets reset for free).
--- a/src/internal.h
+++ b/src/internal.h
@@ -32,17 +32,22 @@
# include <opusfile.h>
typedef struct OggOpusLink OggOpusLink;
+
# if defined(OP_FIXED_POINT)
+
typedef opus_int16 op_sample;
+
# else
+
typedef float op_sample;
-# endif
/*We're using this define to test for libopus 1.1 or later until libopus
provides a better mechanism.*/
-# if defined(OPUS_GET_EXPERT_FRAME_DURATION_REQUEST)
+# if defined(OPUS_GET_EXPERT_FRAME_DURATION_REQUEST)
/*Enable soft clipping prevention in 16-bit decodes.*/
-# define OP_SOFT_CLIP (1)
+# define OP_SOFT_CLIP (1)
+# endif
+
# endif
# if OP_GNUC_PREREQ(4,2)
@@ -217,8 +222,8 @@
# endif
float dither_a[OP_NCHANNELS_MAX*4];
float dither_b[OP_NCHANNELS_MAX*4];
- int dither_mute;
opus_uint32 dither_seed;
+ int dither_mute;
/*The number of channels represented by the internal state.
This gets set to 0 whenever anything that would prevent state propagation
occurs (switching between the float/short APIs, or between the
--- a/src/opusfile.c
+++ b/src/opusfile.c
@@ -1333,7 +1333,7 @@
_of->bytes_tracked=0;
_of->samples_tracked=0;
#if !defined(OP_FIXED_POINT)
- _of->dither_mute=65;
+ _of->state_channel_count=0;
/*Use the serial number for the PRNG seed to get repeatable output for
straight play-throughs.*/
_of->dither_seed=_of->links[li].serialno;