static int planarToNv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dstParam[], int dstStride[]) { uint8_t *dst = dstParam[1] + dstStride[1]*srcSliceY/2; copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->srcW, dstParam[0], dstStride[0]); if (c->dstFormat == PIX_FMT_NV12) interleaveBytes(src[1], src[2], dst, c->srcW/2, srcSliceH/2, srcStride[1], srcStride[2], dstStride[0]); else interleaveBytes(src[2], src[1], dst, c->srcW/2, srcSliceH/2, srcStride[2], srcStride[1], dstStride[0]); return srcSliceH; }
void CVideoRendererDX9::RenderFrame( void* pData ) { if ( pData ) { // if no img then frame was dropped #if defined(USE_SEPERATEMEMORY) vpx_image_t* img = ( vpx_image_t* )pData; SAlphaGenParam ap; YV12_2_TEX( img->planes[VPX_PLANE_Y], img->planes[VPX_PLANE_U], img->planes[VPX_PLANE_V], NULL, m_nSourceWidth, m_nSourceHeight, ( uint32_t* ) m_pData, m_nSourceWidth, img->stride[VPX_PLANE_Y], img->stride[VPX_PLANE_V], img->stride[VPX_PLANE_U], 0, ap ); //YV12_2_TEX( img->planes[VPX_PLANE_Y], img->planes[VPX_PLANE_U], img->planes[VPX_PLANE_V], img->planes[VPX_PLANE_Y], m_nSourceWidth, m_nSourceHeight, ( uint32_t* ) m_pData, m_nSourceWidth, img->stride[VPX_PLANE_Y], img->stride[VPX_PLANE_V], img->stride[VPX_PLANE_U], img->stride[VPX_PLANE_Y], ap ); m_bDirty = true; #else D3DLOCKED_RECT LockedRect; memset( &LockedRect, 0, sizeof( LockedRect ) ); if ( m_pTex ) { // Rendertarget is present IDirect3DSurface9* surfaceTemp = NULL; HRESULT hr = m_pTex->GetSurfaceLevel( 0, &surfaceTemp ); if ( SUCCEEDED( hr ) && surfaceTemp ) { if ( m_pSurfaceYUV ) { // Hardware YUV Conversion: // YV12 source -> copyPlane -> YV12 surface -> StretchRect -> X8R8G8B8 render target surface hr = m_pSurfaceYUV->LockRect( &LockedRect, NULL, USE_DISCARD ); if ( SUCCEEDED( hr ) ) { unsigned char* pPict = ( unsigned char* ) LockedRect.pBits; // Pointer to the locked bits. if ( pPict ) { vpx_image_t* img = ( vpx_image_t* )pData; // divisible by RESBASE (ATI YUV hardware conversion compatible) unsigned int w = ( img->d_w >> RESBASE ) << RESBASE; unsigned int h = ( img->d_h >> RESBASE ) << RESBASE; unsigned int w2 = w >> 1; unsigned int h2 = h >> 1; pPict = copyPlane( w, h, pPict, LockedRect.Pitch, img->planes[VPX_PLANE_Y], img->stride[VPX_PLANE_Y] ); pPict = copyPlane( w2, h2, pPict, LockedRect.Pitch >> 1, img->planes[VPX_PLANE_V], img->stride[VPX_PLANE_V] ); pPict = copyPlane( w2, h2, pPict, LockedRect.Pitch >> 1, img->planes[VPX_PLANE_U], img->stride[VPX_PLANE_U] ); } m_pSurfaceYUV->UnlockRect(); if ( pPict ) { hr = m_pD3DDevice->StretchRect( m_pSurfaceYUV, NULL, surfaceTemp, NULL, D3DTEXF_POINT ); } } } else if ( m_pStagingSurface ) { hr = m_pStagingSurface->LockRect( &LockedRect, NULL, USE_DISCARD ); if ( SUCCEEDED( hr ) ) { unsigned char* pPict = ( unsigned char* ) LockedRect.pBits; // Pointer to the locked bits. if ( pPict ) { vpx_image_t* img = ( vpx_image_t* )pData; // divisible by RESBASE (ATI YUV hardware conversion compatible) unsigned int w = ( img->d_w >> RESBASE ) << RESBASE; unsigned int h = ( img->d_h >> RESBASE ) << RESBASE; SAlphaGenParam ap; YV12_2_TEX( img->planes[VPX_PLANE_Y], img->planes[VPX_PLANE_U], img->planes[VPX_PLANE_V], NULL, w, h, ( uint32_t* ) pPict, LockedRect.Pitch >> 2, img->stride[VPX_PLANE_Y], img->stride[VPX_PLANE_V], img->stride[VPX_PLANE_U], 0, ap ); } m_pStagingSurface->UnlockRect(); if ( pPict ) { #if defined(USE_UPDATE_SURFACE) hr = m_pD3DDevice->UpdateSurface( m_pStagingSurface, NULL, surfaceTemp, NULL ); #else hr = m_pD3DDevice->StretchRect( m_pStagingSurface, NULL, surfaceTemp, NULL, D3DTEXF_POINT ); #endif } } } } if ( FAILED( hr ) ) { outputError( hr ); } SAFE_RELEASE( surfaceTemp ); } #endif }
int testPlane() { int numErr = 0; logMessage(_T("TESTING - class GM_3dPlane ...\n\n")); // Default constructor, plane must be invalid GM_3dPlane p; if (p.isValid()) { logMessage(_T("\tERROR - Default constructor creates valid plane\n")); numErr++; } else { logMessage(_T("\tOK - Default constructor creates invalid plane\n")); } // Constructor (coeff) GM_3dPlane p1(getRandomDouble(), getRandomDouble(), getRandomDouble(), getRandomDouble()); GM_3dPlane pNull(0.0, 0.0, 0.0, getRandomDouble()); if (!p1.isValid() || pNull.isValid()) { logMessage(_T("\tERROR - Coeff. constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Coeff. constructor working\n")); } // Copy constructor GM_3dPlane copyPlane(p1); if (!copyPlane.isValid() || copyPlane != p1) { logMessage(_T("\tERROR - Copy constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Copy constructor working\n")); } // Constructor (coeff vector) double pointsVect[4]; for (int i = 0 ; i < 4 ; i++) { pointsVect[i] = getRandomDouble(); } GM_3dPlane p2(pointsVect); if (!p2.isValid()) { logMessage(_T("\tERROR - Coeff. vector constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Coeff. vector constructor working\n")); } // Constructor (points) GM_3dPoint pt1(getRandomDouble(), getRandomDouble(), getRandomDouble()); GM_3dPoint pt2(getRandomDouble(), getRandomDouble(), getRandomDouble()); GM_3dPoint pt3(getRandomDouble(), getRandomDouble(), getRandomDouble()); GM_3dLine ln(getRandomDouble(), getRandomDouble(), getRandomDouble(),getRandomDouble(), getRandomDouble(), getRandomDouble()); GM_3dPoint ptLn1 = ln.begin(); GM_3dPoint ptLn2 = ln.center(); GM_3dPoint ptLn3 = ln.end(); GM_3dPlane p3(pt1, pt2, pt3); GM_3dPlane pLine(ptLn2, ptLn2, ptLn3); double distPt1 = pt1.x()*p3[0] + pt1.y()*p3[1] + pt1.z()*p3[2] + p3[3]; double distPt2 = pt2.x()*p3[0] + pt2.y()*p3[1] + pt2.z()*p3[2] + p3[3]; double distPt3 = pt3.x()*p3[0] + pt3.y()*p3[1] + pt3.z()*p3[2] + p3[3]; if (!p3.isValid() || pLine.isValid() || fabs(distPt1) > GM_NULL_TOLERANCE || fabs(distPt2) > GM_NULL_TOLERANCE || fabs(distPt3) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Points constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Points constructor working\n")); } // Point distance GM_3dPlane p4(getRandomDouble(), getRandomDouble(), getRandomDouble(),getRandomDouble()); GM_3dPoint checkPoint(getRandomDouble(), getRandomDouble(), getRandomDouble()); if (fabs(p4[0]) > GM_NULL_TOLERANCE) { checkPoint.x(-(checkPoint.y()*p4[1] + checkPoint.z()*p4[2] + p4[3]) / p4[0]); } else if (fabs(p4[1]) > GM_NULL_TOLERANCE) { checkPoint.y(-(checkPoint.x()*p4[0] + checkPoint.z()*p4[2] + p4[3]) / p4[1]); } else if (fabs(p4[2]) > GM_NULL_TOLERANCE) { checkPoint.z(-(checkPoint.x()*p4[0] + checkPoint.y()*p4[1] + p4[3]) / p4[2]); } else { p4.invalidate(); } double checkSignedDist = getRandomDouble(); double checkDist = fabs(checkSignedDist); GM_3dVector p4Norm = p4.normalVector(); checkPoint = (GM_3dVector)checkPoint + (p4Norm * checkSignedDist); GM_3dPoint checkPointOnPlane1; GM_3dPoint checkPointOnPlane2; double dist = p4.pointDistance(checkPoint); double signedDist = p4.pointDistanceSgn(checkPoint); double signedDistOnPlane = p4.pointDistanceSgn(checkPoint, checkPointOnPlane1); double distOnPlane = p4.pointDistance(checkPoint, checkPointOnPlane2); distPt1 = checkPointOnPlane1.x()*p4[0] + checkPointOnPlane1.y()*p4[1] + checkPointOnPlane1.z()*p4[2] + p4[3]; distPt2 = checkPointOnPlane2.x()*p4[0] + checkPointOnPlane2.y()*p4[1] + checkPointOnPlane2.z()*p4[2] + p4[3]; if (!p4.isValid() || !checkPointOnPlane1.isValid() || !checkPointOnPlane2.isValid() || fabs(distPt1) > GM_NULL_TOLERANCE || fabs(distPt2) > GM_NULL_TOLERANCE || fabs(distOnPlane - checkDist) > GM_NULL_TOLERANCE || fabs(signedDistOnPlane - checkSignedDist) > GM_NULL_TOLERANCE || fabs(dist - checkDist) > GM_NULL_TOLERANCE || fabs(signedDist - checkSignedDist) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Point distance computation not working\n")); numErr++; } else { logMessage(_T("\tOK - Point distance computation working\n")); } // XY Angle double angle = ((((double)rand()) / ((double)RAND_MAX)) * GM_PI) - (GM_PI / 2.0); GM_3dVector normVector(angle/* + GM_HALFPI*/); normVector.z(normVector.y()); normVector.y(0.0); GM_3dPlane angleP(normVector, GM_3dPoint(getRandomDouble(), getRandomDouble(), getRandomDouble())); double checkAngle = angleP.xyAngle(); if (checkAngle > GM_PI) { checkAngle -= 2.0 * GM_PI; } if (!angleP.isValid() || fabs(angle - checkAngle) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - XY angle computation not working\n")); numErr++; } else { logMessage(_T("\tOK - XY angle computation working\n")); } return numErr; }