[Ffmpeg-devel] Cook stereo (MONO_COOK2) bug and patch

Michael Niedermayer michaelni
Thu Jan 18 18:40:27 CET 2007


Hi

On Thu, Jan 18, 2007 at 04:06:11PM +0100, Ian Braithwaite wrote:
> Hi,
> 
> 
> There seems to be a problem with the real audio cook codec, in
> 2 channel MONO_COOK2 mode.
> This is generally the format of BBC streams and downloads.
> 
> The problem is that only the left channel is decoded, and sent out
> to both left and right.
> I've uploaded a short file that illustrates the problem to
> upload.mplayerhq.hu, /MPlayer/incoming/idb.
> 
> I've coded up a fix, patch attached.
> 
> 
> Cheers,
> Ian

> --- ffmpeg-export-2006-12-15/libavcodec/cook.c	2006-12-14 18:58:25.000000000 +0100
> +++ ffmpeg-idb/libavcodec/cook.c	2007-01-18 15:23:09.000000000 +0100
> @@ -277,30 +277,21 @@
>  /**
>   * Cook indata decoding, every 32 bits are XORed with 0x37c511f2.
>   * Why? No idea, some checksum/error detection method maybe.
> + * There's no guarantee that inbuffer is word aligned, nor that
> + * bytes is divisible by 4.
>   * Nice way to waste CPU cycles.
>   *
> - * @param in        pointer to 32bit array of indata
> - * @param bits      amount of bits
> - * @param out       pointer to 32bit array of outdata
> + * @param inbuffer  pointer to byte array of indata
> + * @param out       pointer to byte array of outdata
> + * @param bytes     number of bytes
>   */
>  
>  static inline void decode_bytes(uint8_t* inbuffer, uint8_t* out, int bytes){
>      int i;
> -    uint32_t* buf = (uint32_t*) inbuffer;
> -    uint32_t* obuf = (uint32_t*) out;
> -    /* FIXME: 64 bit platforms would be able to do 64 bits at a time.
> -     * I'm too lazy though, should be something like
> -     * for(i=0 ; i<bitamount/64 ; i++)
> -     *     (int64_t)out[i] = 0x37c511f237c511f2^be2me_64(int64_t)in[i]);
> -     * Buffer alignment needs to be checked. */
> +    static uint8_t x[4] = {0x37, 0xc5, 0x11, 0xf2};
>  
> -
> -    for(i=0 ; i<bytes/4 ; i++){
> -#ifdef WORDS_BIGENDIAN
> -        obuf[i] = 0x37c511f2^buf[i];
> -#else
> -        obuf[i] = 0xf211c537^buf[i];
> -#endif
> +    for(i=0 ; i<bytes ; i++){
> +        out[i] = x[i % 4] ^ inbuffer[i];
>      }

rejected, this is unrelated and a senseless deoptmization, fix the alignment
or change the code so it works with missaligned arrays


[...]
> @@ -1012,8 +1003,18 @@
>          memcpy(&q->gain_now, &q->gain_previous, sizeof(COOKgain));
>          memcpy(&q->gain_previous, &q->gain_current, sizeof(COOKgain));
>  
> +#ifdef COOKDEBUG
> +	if (get_bits_count(&q->gb) > q->bits_per_subpacket)
> +	  av_log(NULL,AV_LOG_DEBUG,"bit overrun: %d out of %d\n",
> +		 get_bits_count(&q->gb), q->bits_per_subpacket);
> +#endif

tabs are forbidden in svn and
such debuging code should be in a seperate patch


[...]

>      } else {
> +        decode_bytes(inbuffer, q->decoded_bytes_buffer, sub_packet_size);
> +        init_get_bits(&q->gb, q->decoded_bytes_buffer, sub_packet_size*8);
> +        decode_gain_info(&q->gb, &q->gain_current);
> +

these 3 lines seem to be near duplicated all over the place, put them in a
function or otherwise factor them out, code duplication is not accpetable

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Everything should be made as simple as possible, but not simpler.
-- Albert Einstein
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20070118/3290a7a4/attachment.pgp>



More information about the ffmpeg-devel mailing list