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); } } |
|