Commit af9c773d authored by Josh Coalson's avatar Josh Coalson
Browse files

add Brady's better write_sane_extended()

parent 9f88dc25
......@@ -632,27 +632,31 @@ FLAC__bool write_big_endian_uint32(FILE *f, FLAC__uint32 val)
}
FLAC__bool write_sane_extended(FILE *f, unsigned val)
/* Write to 'f' a SANE extended representation of 'val'. Return false if
* the write succeeds; return true otherwise.
*
* SANE extended is an 80-bit IEEE-754 representation with sign bit, 15 bits
* of exponent, and 64 bits of significand (mantissa). Unlike most IEEE-754
* representations, it does not imply a 1 above the MSB of the significand.
*
* Preconditions:
* val!=0U
*/
{
unsigned i, exponent;
unsigned int shift, exponent;
/* this reasonable limitation make the implementation simpler */
FLAC__ASSERT(val < 0x80000000);
FLAC__ASSERT(val!=0U); /* handling 0 would require a special case */
/* we'll use the denormalized form, with no implicit '1' (i bit == 0) */
for(i = val, exponent = 0; i; i >>= 1, exponent++)
for(shift= 0U; (val>>(31-shift))==0U; ++shift)
;
if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent + 16383)))
return false;
val<<= shift;
exponent= 63U-(shift+32U); /* add 32 for unused second word */
for(i = 32; i; i--) {
if(val & 0x40000000)
break;
val <<= 1;
}
if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent+0x3FFF)))
return false;
if(!write_big_endian_uint32(f, val))
return false;
if(!write_big_endian_uint32(f, 0))
if(!write_big_endian_uint32(f, 0)) /* unused second word */
return false;
return true;
......
......@@ -141,33 +141,36 @@ static FLAC__bool write_big_endian_int32(FILE *f, FLAC__int32 x)
#endif
static FLAC__bool write_sane_extended(FILE *f, unsigned val)
{
unsigned i, exponent;
/* this reasonable limitation make the implementation simpler */
FLAC__ASSERT(val < 0x80000000);
/* we'll use the denormalized form, with no implicit '1' (i bit == 0) */
for(i = val, exponent = 0; i; i >>= 1, exponent++)
/* Write to 'f' a SANE extended representation of 'val'. Return false if
* the write succeeds; return true otherwise.
*
* SANE extended is an 80-bit IEEE-754 representation with sign bit, 15 bits
* of exponent, and 64 bits of significand (mantissa). Unlike most IEEE-754
* representations, it does not imply a 1 above the MSB of the significand.
*
* Preconditions:
* val!=0U
*/
{
unsigned int shift, exponent;
FLAC__ASSERT(val!=0U); /* handling 0 would require a special case */
for(shift= 0U; (val>>(31-shift))==0U; ++shift)
;
if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent + 16383)))
return false;
val<<= shift;
exponent= 63U-(shift+32U); /* add 32 for unused second word */
for(i = 32; i; i--) {
if(val & 0x40000000)
break;
val <<= 1;
}
if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent+0x3FFF)))
return false;
if(!write_big_endian_uint32(f, val))
return false;
if(!write_big_endian_uint32(f, 0))
if(!write_big_endian_uint32(f, 0)) /* unused second word */
return false;
return true;
}
/* a mono one-sample 16bps stream */
static FLAC__bool generate_01()
{
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment