# HG changeset patch # User reimar # Date 1196103694 0 # Node ID 94e618df1deac9086209ed98b7c98d3f34957f21 # Parent d624c8409e8bfafee6001ce2b79c3504e7664dad Simplify convert_14bits_to_16bits function in ad_hwac3 diff -r d624c8409e8b -r 94e618df1dea libmpcodecs/ad_hwac3.c --- a/libmpcodecs/ad_hwac3.c Mon Nov 26 10:04:18 2007 +0000 +++ b/libmpcodecs/ad_hwac3.c Mon Nov 26 19:01:34 2007 +0000 @@ -424,35 +424,27 @@ int is_le) { uint16_t *p = (uint16_t *)dest; + uint16_t buf = 0; int spacebits = 16; - int leftbits; + if (len <= 0) return 0; while (len > 0) { uint16_t v; if (len == 1) v = is_le ? src[0] : src[0] << 8; else v = is_le ? src[1] << 8 | src[0] : src[0] << 8 | src[1]; - leftbits = 14; + v <<= 2; src += 2; len -= 2; - if (spacebits == 0) { - ++p; - spacebits = 16; + buf |= v >> (16 - spacebits); + spacebits -= 14; + if (spacebits < 0) { + *p++ = buf; + spacebits += 16; + buf = v << (spacebits - 2); } - if (spacebits == 16) - *p = 0; - if (spacebits < leftbits) { - leftbits -= spacebits; - *p |= (v & 0x3FFF) >> leftbits; - ++p; - *p = 0; - spacebits = 16; - } - *p |= ((v << (16 - leftbits)) & 0xFFFF) >> (16 - spacebits); - spacebits -= leftbits; } - if (spacebits < 16) - ++p; + *p++ = buf; return (unsigned char *)p - dest; }