分享

yuv422与yuv420转换成RGB来显示

 海漩涡 2016-06-22
const int w = m_dwWidth, h = m_dwHeight;
        BYTE * const p = (BYTE *)ddsd.lpSurface;
        if (p == NULL) {
            m_MonDDrawList[i].pddsBackBuffer->Unlock(NULL);
            continue;
        }
         DDPIXELFORMAT ddpf = ddsd.ddpfPixelFormat;
        const int stride = ddsd.lPitch;
        
        //char *s = new char[2048*1536*5];
        //char peric[1024] = {0};
        //sprintf(peric,"pY:%u\n", (const char*)pFrame->pY);
        //OutputDebugString(peric);
#if 0
        /* yuv420 转RGB */
        int j = 0;
        int stride_uv;
        int c, d, e;
        unsigned char* cur;
        BYTE *line = (BYTE *)ddsd.lpSurface;
        int width = m_dwWidth, height = m_dwHeight, t_width;
        unsigned char* y = pFrame->pY;
        unsigned char* u = pFrame->pU;
        unsigned char* v = pFrame->pV;

        stride_uv = (width+1)>>1;

        for( j = 0 ; j < height ; j++ ){
            cur = line;
            for( i = 0 ; i < width ; i++ ){
                c = y[j*width+i] - 16;
                d = u[j*stride_uv+(i>>1)] - 128;
                e = v[j*stride_uv+(i>>1)] - 128;

                (*cur) = clip(( 298 * c           + 409 * e + 128) >> 8);cur++;
                (*cur) = clip(( 298 * c - 100 * d - 208 * e + 128) >> 8);cur++;
                (*cur) = clip(( 298 * c + 516 * d           + 128) >> 8);cur+=2;
            }
            line += t_width<<2;
        }
#else

        /* yuv422 转RGB */
        int j = 0;
        for(j = 0;j < h;j ++)
        {
            //memcpy(s + j * stride,(char*)pFrame->pY + j * w, w);
            memcpy(p + j * stride,(char*)pFrame->pY + j * w, w);
            //memmove(p + j * stride,(char*)pFrame->pY + j * w, w);
        }        


        for(j = 0;j < h/2;j++)
        {
            //memcpy(s + stride * h + j * stride / 2,  (char*)pFrame->pV + j * w / 2, w / 2);    
            memcpy(p + stride * h + j * stride / 2,  (char*)pFrame->pV + j * w / 2, w / 2);    
            //memmove(p + stride * h + j * stride / 2,  (char*)pFrame->pV + j * w / 2, w / 2);
        }

        for(j = 0;j < h/2;j ++)
        {            
            //memcpy(s + stride * h + stride * h / 4 + j* stride / 2, (char*)pFrame->pU + j * w / 2, w / 2);
            memcpy(p + stride * h + stride * h / 4 + j* stride / 2, (char*)pFrame->pU + j * w / 2, w / 2);
            //memmove(p + stride * h + stride * h / 4 + j* stride / 2, (char*)pFrame->pU + j * w / 2, w / 2);
        }
#endif




===================================================================



//m_pYUV2RGBFun(pFrame->pY, pFrame->uYStride, pFrame->pU, pFrame->pV, pFrame->uUVStride,
        //    (UCHAR *)ddsd.lpSurface, pFrame->uWidth, pFrame->uHeight, ddsd.lPitch);

        const int w = m_dwWidth, h = m_dwHeight;
        BYTE * p = (BYTE *)ddsd.lpSurface;
        if (p == NULL) {
            m_MonDDrawList[i].pddsBackBuffer->Unlock(NULL);
            continue;
        }
         DDPIXELFORMAT ddpf = ddsd.ddpfPixelFormat;
        const int stride = ddsd.lPitch;
        int j = 0;

        if(pFrame->uReserved == 1)
        {//  yuv422
            for(j = 0;j < h*w*2;j ++)
            {
                *p++=*pFrame->pU++;
                *p++=*pFrame->pY++;
                *p++=*pFrame->pV++;
                *p++=*pFrame->pY++;
            }   
        }

        else
        {
            // yuv420
            for(j = 0;j < h;j ++)
            {
                memcpy(p + j * stride,(char*)pFrame->pY + j * w, w);
            }       
   
   
            for(j = 0;j < h/2;j++)
            {
               memcpy(p + stride * h + j * stride / 2,    (char*)pFrame->pV + j * w / 2, w / 2);       
            }
   
            for(j = 0;j < h/2;j ++)
            {           
                memcpy(p + stride * h + stride * h / 4 + j* stride / 2, (char*)pFrame->pU + j * w / 2, w / 2);   
            }
        }
       
   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约