• 2005-01-08

    xvid 代码的几个小bug

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://ffmpeg.blogbus.com/logs/570942.html

    1. idct.c中void idct_int32(short *const block)函数

    定义了几个中间变量 X0,X1,X2,X3,X4,X5...X8
    变量类型使用了 static long

    结果虽然不会出错,但是影响性能,因为static 变量在退出函数后还需要保留该变量的值,增加了运算量,而非static变量,则可以通过编译

    器优化,能使该变量为寄存器变量,减少内存访问的时间。本人测试了2000帧QVGA(320x240)图像,其中static变量的idct耗时8.6s,而非

    static的只要5.3s,可见对效率影响挺大。

    不过,俺刚看了xvid 1.03版本已经将这个代码改过来了,xvid 1.01和0.91都是static的。

    2.xvid_decraw.c中main函数中
            if (already_in_buffer > 0)
                    memcpy(mp4_buffer, mp4_ptr, already_in_buffer);

            /* Update mp4_ptr */
            mp4_ptr = mp4_buffer;

            /* read new data */
            if(feof(in_file))
                    break;
    这段代码将导致,码流没有结束而提前退出程序的情况

    因为在读文件的时候,文件结束并不代表,缓冲区中的数据也被读完了,缓冲区大小为
    #define BUFFER_SIZE (2*1024*1024)  //2兆啊
    所以,即使遇到文件结束,也应该继续解码,直道already_in_buffer的值为0

    3.bitstream.h中的static void __inline BitstreamInit()函数
            ptr_t adjbitstream = (ptr_t)bitstream;

            /*
             * Start the stream on a uint32_t boundary, by rounding down to the
             * previous uint32_t and skipping the intervening bytes.
             */
            bitpos = ((sizeof(uint32_t)-1) & (size_t)bitstream);
            adjbitstream = adjbitstream - bitpos;
            bs->start = bs->tail = (uint32_t *) adjbitstream;
    该段代码,直接将位流指针设置成整型,在x86处理器下可以正常运行,而有些处理器是不支持在非32位对齐的地址做字(32bits)读取的,除非编译器做额外处理。

    可以做改动的是,在传入参数时,就将其设置为字对齐的。如果是一个地址为addr,将其改为 addr&-4,低两位强制设0。这在xvid_decraw.c里可以修改


    随机文章:


    收藏到:Del.icio.us




    评论

  • <a url='http://www.haha83.com'>阴历表</a>
  • http://www.haha83.com
  • ghghg