• 3747阅读
  • 0回复

请教qtopia在板子上流畅播放yuv文件的方法,知道的兄弟请提示 [复制链接]

上一主题 下一主题
离线zozowit
 

只看楼主 倒序阅读 楼主  发表于: 2007-10-22
请教qtopia在板子上流畅播放yuv文件的方法,知道的兄弟请提示
— 本帖被 XChinux 从 Qt Programming 移动到本区(2008-07-18) —
尝试将yuv转换成RGG后播放,但似乎不流畅
一帧一帧地转换,用timer控制,但播起来很慢
请问有什么优化的方法吗?
renderarea::renderarea(QWidget *parent):QMainWindow(parent)
{
 
        length =0;
        show_init();
        v_height = VIDEOHEIGHT;
        v_width = VIDEOWIDTH;
        RGBBufferSize = 4*v_height*v_width;
        RGBBuffer = (unsigned char*)malloc(RGBBufferSize*sizeof(unsigned char));
        img = new QImage ((uchar*)RGBBuffer,v_width,v_height,QImage::Format_RGB32);
        p = new QPainter();
        movieTimer = new QTimer( this ); // create internal timer
        movieTimer->start(40);
        connect(movieTimer, SIGNAL(timeout()), this, SLOT(timeover()))
        setGeometry (0,0,240,320);
}

void renderarea::timeover()
{

        static int display_num = 0;
        static int displaylen = 0;
        displaylen = 320 * 240 * 3 / 2 * display_num;
        if(displaylen >= length)
        {      movieTimer->stop();    //当没有新消息时,重新启动定时器
                return;
        }
        else
        {
        unsigned char * yuv_buffer;

//取出fdm中的一帧
        yuv_buffer = (unsigned char * )fdm + displaylen;
        display_num++;

//调用转换函数
                yuv420_toRGB(v_width, v_height, yuv_buffer, RGBBuffer);

//触发paintEvent
        update();
        }

}

void renderarea::paintEvent(QPaintEvent *)
{
                p->begin(this);
                p->drawImage(0,0,*img);
                p->end();
}

转换函数
void yuv420_toRGB(int width, int height, unsigned char *buf,unsigned char* RGBBuffer)
{
        unsigned char *YBuffer = buf;
        unsigned char *UBuffer = buf + height * width;
        unsigned char *VBuffer = buf + (int)(height*width*1.25);
        int Y, U, V, R, G, B;
        int writePos = 0;
        int i = 0, j = 0;
        int k = 0;
        for(i=0; i<height; i++)
        {
                for(j=0; j<width; j++)
                {
                        Y = YBuffer[j]-16;
                        k = (int)(j/2);
                        U = UBuffer[k]-128;
                        V = VBuffer[k]-128;
                        R = ((298*Y + 409*V + 128)>>8);
                        G = ((298*Y - 100*U - 208*V + 128)>>8);
                        B = ((298*Y + 516*U + 128)>>8);
                        RGBBuffer[writePos++] = (B<0) ? 0 : ((B>255) ? 255 : B);
                        RGBBuffer[writePos++] = (G<0) ? 0 : ((G>255) ? 255 : G);
                        RGBBuffer[writePos++] = (R<0) ? 0 : ((R>255) ? 255 : R);
                        RGBBuffer[writePos++] = 0xff;
                }

                YBuffer += width;
                if(i%2==1)
                {
                        UBuffer += width/2;
                        VBuffer += width/2;
                }
        }

}
快速回复
限100 字节
 
上一个 下一个