mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
2214 lines
74 KiB
C++
2214 lines
74 KiB
C++
// AVSVideoFrameTransform.cpp : Implementation of CAVSVideoFrameTransform
|
|
|
|
#include "stdafx.h"
|
|
#include "AVSVideoFrameTransform.h"
|
|
#include <math.h>
|
|
|
|
|
|
// CAVSVideoFrameTransform
|
|
BOOL __fastcall CAVSVideoFrameTransform::IsChangeArrayFormat(CAVSUncompressedVideoFrame* pVideoFrame)
|
|
{
|
|
if (pVideoFrame->m_oVideoFrame.Width!=m_oSrcFormat.Width)
|
|
return true;
|
|
if (pVideoFrame->m_oVideoFrame.Height!=m_oSrcFormat.Height)
|
|
return true;
|
|
if (pVideoFrame->m_oVideoFrame.ColorSpace!=m_oSrcFormat.ColorSpace)
|
|
return true;
|
|
BOOL m_bInReaspect = ((0!=pVideoFrame->m_oVideoFrame.AspectX)&&(0!=pVideoFrame->m_oVideoFrame.AspectY));
|
|
BOOL m_bOutReaspect = ((0!=m_oSrcFormat.AspectX)&&(0!=m_oSrcFormat.AspectY));
|
|
if (m_bInReaspect!=m_bOutReaspect)
|
|
return TRUE;
|
|
if (m_bInReaspect)
|
|
{
|
|
if ((pVideoFrame->m_oVideoFrame.AspectX != m_oSrcFormat.AspectX)||
|
|
(pVideoFrame->m_oVideoFrame.AspectY != m_oSrcFormat.AspectY))
|
|
return TRUE;
|
|
}
|
|
if (pVideoFrame->m_oVideoFrame.Interlaced != m_oSrcFormat.Interlaced)
|
|
return TRUE;
|
|
if (pVideoFrame->m_oVideoFrame.Stride[0] != m_oSrcFormat.Stride[0])
|
|
return TRUE;
|
|
|
|
switch (m_oSrcFormat.ColorSpace & CSP_COLOR_MASK)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
if (pVideoFrame->m_oVideoFrame.Stride[1] != m_oSrcFormat.Stride[1])
|
|
return TRUE;
|
|
if (pVideoFrame->m_oVideoFrame.Stride[2] != m_oSrcFormat.Stride[2])
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void __fastcall CAVSVideoFrameTransform::ApplySettings()
|
|
{
|
|
/*
|
|
double dRealWidth;
|
|
double dRealHeight;
|
|
|
|
if ((0==m_oSrcFormat.AspectX)||(0==m_oSrcFormat.AspectY)||(0==m_oDstFormat.AspectX)||(0==m_oDstFormat.AspectY))
|
|
{
|
|
//Ïðåîáðàçîâàíèå ê ïðàâèëüíîìó ðàçðåøåíèþ
|
|
dRealWidth = m_oDstFormat.Width;
|
|
dRealHeight = m_oDstFormat.Height;
|
|
m_bFillBackground = FALSE;
|
|
}
|
|
else
|
|
{
|
|
double dInpRate = (double)m_oSrcFormat.AspectX/m_oSrcFormat.AspectY;
|
|
double dOutRate = (double)m_oDstFormat.AspectX/m_oDstFormat.AspectY;
|
|
|
|
dRealWidth = m_oSrcFormat.Height * dInpRate;
|
|
dRealHeight = m_oSrcFormat.Height;
|
|
|
|
double KX = ((double)m_oDstFormat.Height*dOutRate)/dRealWidth;
|
|
double KY = (double)m_oDstFormat.Width/(dRealHeight*dOutRate);
|
|
|
|
|
|
m_lCropScale = (m_lCropScale<0||m_lCropScale>100) ? 0 : m_lCropScale;
|
|
if ((dRealHeight*KX) > m_oDstFormat.Height)
|
|
{
|
|
//dRealWidth*KY ìîæåò áûòü ðàâíî íóëþ?
|
|
dRealHeight = m_oDstFormat.Height*((m_oDstFormat.Width - dRealWidth*KY) * m_lCropScale/100.0 + dRealWidth*KY)/(dRealWidth*KY);
|
|
dRealWidth = dRealWidth*KY+(m_oDstFormat.Width - dRealWidth*KY)*m_lCropScale/100.0;
|
|
}
|
|
else
|
|
{
|
|
dRealWidth = m_oDstFormat.Width*((m_oDstFormat.Height - dRealHeight*KX) *m_lCropScale/100.0 + dRealHeight*KX)/(dRealHeight*KX);
|
|
dRealHeight = dRealHeight*KX+(m_oDstFormat.Height - dRealHeight*KX) * m_lCropScale/100.0;
|
|
}
|
|
if (m_lCropScale!=100)
|
|
{
|
|
if ((dRealWidth==m_oDstFormat.Width)&&(dRealHeight==m_oDstFormat.Height))
|
|
m_bFillBackground=FALSE;
|
|
else
|
|
m_bFillBackground=TRUE;
|
|
}
|
|
else
|
|
m_bFillBackground=FALSE;
|
|
}
|
|
|
|
m_oDstFormat.kx = (double)dRealWidth/m_oSrcFormat.Width;
|
|
m_oDstFormat.ky = (double)dRealHeight/m_oSrcFormat.Height;
|
|
*/
|
|
|
|
if ((0==m_oDstFormat.AspectX)&&(1==m_oDstFormat.AspectY))
|
|
{
|
|
m_oDstFormat.kx = (double)m_oDstFormat.Width/(double)m_oSrcFormat.Width;
|
|
m_oDstFormat.ky = (double)m_oDstFormat.Height/(double)m_oSrcFormat.Height;
|
|
m_bFillBackground = TRUE;//
|
|
}
|
|
else
|
|
{
|
|
long lSrcAspectX = m_oSrcFormat.AspectX;
|
|
long lSrcAspectY = m_oSrcFormat.AspectY;
|
|
long lDstAspectX = m_oDstFormat.AspectX;
|
|
long lDstAspectY = m_oDstFormat.AspectY;
|
|
if ((0>=m_oSrcFormat.AspectX)||(0>=m_oSrcFormat.AspectY))
|
|
{
|
|
lSrcAspectX = m_oSrcFormat.Width;
|
|
lSrcAspectY = m_oSrcFormat.Height;
|
|
}
|
|
if ((0>=m_oDstFormat.AspectX)||(0>=m_oDstFormat.AspectY))
|
|
{
|
|
lDstAspectX = m_oDstFormat.Width;
|
|
lDstAspectY = m_oDstFormat.Height;
|
|
}
|
|
|
|
m_lCropScale = (m_lCropScale<0||m_lCropScale>100) ? 0 : m_lCropScale;
|
|
|
|
double dGenKoef = (1.0 - (double)m_lCropScale/100.0)*min((double)lDstAspectX/(double)lSrcAspectX, (double)lDstAspectY/(double)lSrcAspectY);
|
|
dGenKoef += (double)m_lCropScale/100.0*max((double)lDstAspectX/(double)lSrcAspectX, (double)lDstAspectY/(double)lSrcAspectY);
|
|
|
|
m_oDstFormat.kx = (double)lSrcAspectX/(double)m_oSrcFormat.Width * dGenKoef * (double)m_oDstFormat.Width/(double)lDstAspectX;
|
|
m_oDstFormat.ky = (double)lSrcAspectY/(double)m_oSrcFormat.Height * dGenKoef * (double)m_oDstFormat.Height/(double)lDstAspectY;
|
|
|
|
m_bFillBackground = (0 != abs(m_oDstFormat.Width - m_oDstFormat.kx * m_oSrcFormat.Width))||
|
|
(0 != abs(m_oDstFormat.Height - m_oDstFormat.ky * m_oSrcFormat.Height));
|
|
}
|
|
//äâà äåéñòâèòåëüíûõ ÷èñëà ñðàâíèâàåì íà òî÷íîå ðàâåíñòâî?
|
|
BOOL bReSizeNeed = ((abs(1.0 - m_oDstFormat.kx)>0.01)|| (abs(1.0 - m_oDstFormat.ky)>0.01)||
|
|
(m_oSrcFormat.Width!=m_oDstFormat.Width)||(m_oSrcFormat.Height!=m_oDstFormat.Height));
|
|
|
|
m_lInpColorSpace = m_oSrcFormat.ColorSpace & CSP_COLOR_MASK;
|
|
m_lOutColorSpace = m_oDstFormat.ColorSpace & CSP_COLOR_MASK;
|
|
m_bMirror = (0!=((m_oSrcFormat.ColorSpace & CSP_VFLIP) ^ (m_oDstFormat.ColorSpace & CSP_VFLIP)));
|
|
|
|
m_bRealNeedDeinterlace = FALSE;
|
|
m_bRealNeedDeinterlace = m_bDeinterlaceEnabled && m_oSrcFormat.Interlaced;
|
|
if (m_bRealNeedDeinterlace)
|
|
m_oDstFormat.Interlaced = FALSE;
|
|
else
|
|
m_oDstFormat.Interlaced = m_oSrcFormat.Interlaced;
|
|
|
|
FreeBuffers();
|
|
|
|
if (m_bRealNeedDeinterlace)
|
|
{
|
|
if (bReSizeNeed)
|
|
{
|
|
m_nTransformType = ttResizeDeinterlaceTransform;
|
|
ResizeDeinterlaceAlloc();
|
|
}
|
|
else
|
|
{
|
|
m_nTransformType = ttDeinterlaceTransform;
|
|
DeinterlaceAlloc();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (bReSizeNeed)
|
|
{
|
|
m_nTransformType = ttResizeTransform;
|
|
ResizeAlloc();
|
|
}
|
|
else
|
|
{
|
|
m_nTransformType = ttSimpleTransform;
|
|
SimpleAlloc();
|
|
}
|
|
}
|
|
|
|
m_bIsNeedTransform = FALSE;
|
|
if (bReSizeNeed)
|
|
m_bIsNeedTransform = TRUE;
|
|
if (m_oSrcFormat.ColorSpace != m_oDstFormat.ColorSpace)
|
|
m_bIsNeedTransform = TRUE;
|
|
if (m_bRealNeedDeinterlace)
|
|
m_bIsNeedTransform = TRUE;
|
|
if ((m_oSrcFormat.Stride[0] != m_oDstFormat.Stride[0]))
|
|
m_bIsNeedTransform = TRUE;
|
|
|
|
|
|
switch (m_oSrcFormat.ColorSpace&CSP_COLOR_MASK)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
if (m_oSrcFormat.Stride[1]!=m_oDstFormat.Stride[1])
|
|
m_bIsNeedTransform = TRUE;
|
|
if (m_oSrcFormat.Stride[2]!=m_oDstFormat.Stride[2])
|
|
m_bIsNeedTransform = TRUE;
|
|
}
|
|
|
|
m_bIsNeedAplly = FALSE;
|
|
}
|
|
|
|
void __fastcall CAVSVideoFrameTransform::FillBuffer(SUncompressedVideoFrame* pVideoFrame, BYTE* pBuffer)
|
|
{
|
|
switch (pVideoFrame->ColorSpace & CSP_COLOR_MASK)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
pVideoFrame->Plane[0] = pBuffer;
|
|
pVideoFrame->Plane[1] = (BYTE*)pBuffer + pVideoFrame->Stride[0]*pVideoFrame->Height;
|
|
pVideoFrame->Plane[2] = (BYTE*)pBuffer + pVideoFrame->Stride[0]*pVideoFrame->Height + pVideoFrame->Stride[1]*pVideoFrame->Height/2;
|
|
break;
|
|
//case CSP_YV12:
|
|
// pVideoFrame->Plane[0] = pBuffer;
|
|
// pVideoFrame->Plane[1] = (BYTE*)pBuffer + pVideoFrame->Stride[0]*pVideoFrame->Height + pVideoFrame->Stride[1]*pVideoFrame->Height/2;
|
|
// pVideoFrame->Plane[2] = (BYTE*)pBuffer + pVideoFrame->Stride[0]*pVideoFrame->Height;
|
|
// break;
|
|
case CSP_YUY2:
|
|
case CSP_UYVY:
|
|
case CSP_YVYU:
|
|
|
|
case CSP_RGB555:
|
|
case CSP_RGB565:
|
|
|
|
case CSP_BGR:
|
|
|
|
case CSP_BGRA:
|
|
case CSP_ABGR:
|
|
case CSP_RGBA:
|
|
case CSP_ARGB:
|
|
pVideoFrame->Plane[0] = pBuffer;
|
|
break;
|
|
}
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::AllocBuffer(SUncompressedVideoFrame* pVideoFrame, SUncompressedVideoFrame* pFrame, long lColorSpace)
|
|
{
|
|
*pVideoFrame = *pFrame;
|
|
pVideoFrame->ColorSpace = lColorSpace;
|
|
SetDefaultStride(pVideoFrame);
|
|
int nDataSize = pVideoFrame->Stride[0] * pVideoFrame->Height;
|
|
|
|
switch (lColorSpace & CSP_COLOR_MASK)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
FillBuffer(pVideoFrame, (BYTE*)::HeapAlloc(GetProcessHeap(), NULL, nDataSize + (pVideoFrame->Stride[1] + pVideoFrame->Stride[2])*pVideoFrame->Height/2));
|
|
break;
|
|
case CSP_YUY2:
|
|
case CSP_UYVY:
|
|
case CSP_YVYU:
|
|
|
|
case CSP_RGB555:
|
|
case CSP_RGB565:
|
|
|
|
case CSP_BGR:
|
|
|
|
case CSP_BGRA:
|
|
case CSP_ABGR:
|
|
case CSP_RGBA:
|
|
case CSP_ARGB:
|
|
FillBuffer(pVideoFrame, (BYTE*)::HeapAlloc(GetProcessHeap(), NULL, nDataSize));
|
|
break;
|
|
}
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::FreeBuffer(SUncompressedVideoFrame *pVideoFrame)
|
|
{
|
|
if (NULL!=pVideoFrame->Plane[0])
|
|
{
|
|
::HeapFree(GetProcessHeap(), NULL, pVideoFrame->Plane[0]);
|
|
pVideoFrame->Plane[0] = NULL;
|
|
}
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::FreeBuffers()
|
|
{
|
|
if (NULL!=m_oVideoBuffer1.Plane[0])
|
|
FreeBuffer(&m_oVideoBuffer1);
|
|
if (m_oVideoBuffer2.Plane[0]!=NULL)
|
|
FreeBuffer(&m_oVideoBuffer2);
|
|
if (m_oVideoBuffer3.Plane[0]!=NULL)
|
|
FreeBuffer(&m_oVideoBuffer3);
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::SetDefaultStride(SUncompressedVideoFrame* pVideoFrame)
|
|
{
|
|
switch (pVideoFrame->ColorSpace & CSP_COLOR_MASK)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
pVideoFrame->Stride[0] = pVideoFrame->Width;
|
|
pVideoFrame->Stride[1] = pVideoFrame->Width/2;
|
|
pVideoFrame->Stride[2] = pVideoFrame->Width/2;
|
|
break;
|
|
case CSP_YUY2:
|
|
case CSP_UYVY:
|
|
case CSP_YVYU:
|
|
|
|
case CSP_RGB555:
|
|
case CSP_RGB565:
|
|
pVideoFrame->Stride[0] = 2*pVideoFrame->Width;
|
|
break;
|
|
case CSP_BGR:
|
|
pVideoFrame->Stride[0] = 3*pVideoFrame->Width;
|
|
break;
|
|
case CSP_BGRA:
|
|
case CSP_ABGR:
|
|
case CSP_RGBA:
|
|
case CSP_ARGB:
|
|
pVideoFrame->Stride[0] = 4*pVideoFrame->Width;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
void CAVSVideoFrameTransform::ErrorTransform()
|
|
{
|
|
throw("Method 'ApllySettings' must be called\n");
|
|
}
|
|
void CAVSVideoFrameTransform::SimpleTransform()
|
|
{
|
|
switch (m_lOutColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
fastconvert_yv12_to_yv12(m_oDstFormat.Plane[0], m_oDstFormat.Plane[1], m_oDstFormat.Plane[2], m_oDstFormat.Stride[0], m_oDstFormat.Stride[1],
|
|
m_oSrcFormat.Plane[0], m_oSrcFormat.Plane[1], m_oSrcFormat.Plane[2], m_oSrcFormat.Stride[0], m_oSrcFormat.Stride[1],
|
|
m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_YUY2:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oDstFormat.Plane[0], m_oDstFormat.Plane[1], m_oDstFormat.Plane[2], m_oDstFormat.Stride[0], m_oDstFormat.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_BGRA:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oDstFormat.Plane[0], m_oDstFormat.Plane[1], m_oDstFormat.Plane[2], m_oDstFormat.Stride[0], m_oDstFormat.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgra_to_yv12, fastconvert_bgra_to_yv12_c, 4);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_BGR:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oDstFormat.Plane[0], m_oDstFormat.Plane[1], m_oDstFormat.Plane[2], m_oDstFormat.Stride[0], m_oDstFormat.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgr_to_yv12, fastconvert_bgr_to_yv12_c, 3);
|
|
fastconvert_emms();
|
|
break;
|
|
}
|
|
break;
|
|
case CSP_YUY2:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oSrcFormat.Plane[0], m_oSrcFormat.Plane[1], m_oSrcFormat.Plane[2],
|
|
m_oSrcFormat.Stride[0], m_oSrcFormat.Stride[1],
|
|
m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
fastconvert_YUY2CopyMem(&m_oSrcFormat, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgra_to_yv12, fastconvert_bgra_to_yv12_c, 4);
|
|
fastconvert_emms();
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, false,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_BGR:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgr_to_yv12, fastconvert_bgr_to_yv12_c, 3);
|
|
fastconvert_emms();
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, false,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
}
|
|
break;
|
|
case CSP_BGRA:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oSrcFormat.Plane[0], m_oSrcFormat.Plane[1], m_oSrcFormat.Plane[2],
|
|
m_oSrcFormat.Stride[0], m_oSrcFormat.Stride[1],
|
|
m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_yv12_to_bgra, fastconvert_yv12_to_bgra_c, 4);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_YUY2:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, false,
|
|
fastconvert_yv12_to_bgra, fastconvert_yv12_to_bgra_c, 4);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_BGRA:
|
|
fastconvert_RGB32CopyMem(&m_oSrcFormat, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
case CSP_BGR:
|
|
RGB24ToRGB32(&m_oSrcFormat, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
case CSP_RGB8:
|
|
RGB8ToRGB32(&m_oSrcFormat, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
case CSP_RGB16:
|
|
//RGB16ToRGB32(&m_oSrcFormat, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGR:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oSrcFormat.Plane[0], m_oSrcFormat.Plane[1], m_oSrcFormat.Plane[2], m_oSrcFormat.Stride[0], m_oSrcFormat.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_yv12_to_bgr, fastconvert_yv12_to_bgr_c, 3);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_YUY2:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, false,
|
|
fastconvert_yv12_to_bgr, fastconvert_yv12_to_bgr_c, 3);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_BGRA:
|
|
RGB32ToRGB24(&m_oSrcFormat, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
case CSP_BGR:
|
|
fastconvert_RGB24CopyMem(&m_oSrcFormat, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
case CSP_RGB8:
|
|
RGB8ToRGB24(&m_oSrcFormat, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
case CSP_RGB16:
|
|
//RGB16ToRGB24(&m_oSrcFormat, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
void CAVSVideoFrameTransform::ResizeTransform()
|
|
{
|
|
switch (m_lOutColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
if (m_bMirror)
|
|
{
|
|
fastconvert_yv12_to_yv12(m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oSrcFormat.Plane[0], m_oSrcFormat.Plane[1], m_oSrcFormat.Plane[2], m_oSrcFormat.Stride[0], m_oSrcFormat.Stride[1],
|
|
m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror);
|
|
fastconvert_emms();
|
|
YV12Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
} else
|
|
YV12Resize(&m_oSrcFormat, &m_oDstFormat);
|
|
break;
|
|
case CSP_YUY2:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
fastconvert_emms();
|
|
YV12Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGRA:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgra_to_yv12, fastconvert_bgra_to_yv12_c, 4);
|
|
fastconvert_emms();
|
|
YV12Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGR:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgr_to_yv12, fastconvert_bgr_to_yv12_c, 3);
|
|
fastconvert_emms();
|
|
YV12Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Resize(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_YUY2:
|
|
if (m_bMirror)
|
|
{
|
|
fastconvert_YUY2CopyMem(&m_oSrcFormat, &m_oVideoBuffer1, m_bMirror);
|
|
YUY2Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
}
|
|
else
|
|
{
|
|
YUY2Resize(&m_oSrcFormat, &m_oDstFormat);
|
|
}
|
|
break;
|
|
case CSP_BGRA:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_bgra_to_yv12, fastconvert_bgra_to_yv12_c, 4);
|
|
fastconvert_emms();
|
|
YV12Resize(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, false,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
|
|
break;
|
|
case CSP_BGR:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_bgr_to_yv12, fastconvert_bgr_to_yv12_c, 3);
|
|
fastconvert_emms();
|
|
|
|
YV12Resize(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, false,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Resize(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yv12_to_bgra, fastconvert_yv12_to_bgra_c, 4);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_YUY2:
|
|
YUY2Resize(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
|
|
fastconvert_safe_packed_conv(m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, false,
|
|
fastconvert_yv12_to_bgra, fastconvert_yv12_to_bgra_c, 4);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
if (m_bMirror)
|
|
{
|
|
fastconvert_RGB32CopyMem(&m_oSrcFormat, &m_oVideoBuffer1, m_bMirror);
|
|
RGB32Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
}
|
|
else
|
|
RGB32Resize(&m_oSrcFormat, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGR:
|
|
RGB24Resize(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
RGB24ToRGB32(&m_oVideoBuffer1, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGR:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Resize(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yv12_to_bgr, fastconvert_yv12_to_bgr_c, 3);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
YUY2Resize(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
|
|
fastconvert_safe_packed_conv(m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, false,
|
|
fastconvert_yv12_to_bgr, fastconvert_yv12_to_bgr_c, 3);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
RGB32ToRGB24(&m_oSrcFormat, &m_oVideoBuffer1, m_bMirror);
|
|
RGB24Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGR:
|
|
if (m_bMirror)
|
|
{
|
|
fastconvert_RGB24CopyMem(&m_oSrcFormat, &m_oVideoBuffer1, m_bMirror);
|
|
RGB24Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
}
|
|
else
|
|
RGB24Resize(&m_oSrcFormat, &m_oDstFormat);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
void CAVSVideoFrameTransform::DeinterlaceTransform()
|
|
{
|
|
switch (m_lOutColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
if (m_bMirror)
|
|
{
|
|
YV12Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
fastconvert_yv12_to_yv12(m_oDstFormat.Plane[0], m_oDstFormat.Plane[1], m_oDstFormat.Plane[2], m_oDstFormat.Stride[0], m_oDstFormat.Stride[1],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror);
|
|
fastconvert_emms();
|
|
} else
|
|
YV12Deinterlace(&m_oSrcFormat, &m_oDstFormat);
|
|
break;
|
|
case CSP_YUY2:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
fastconvert_emms();
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGRA:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgra_to_yv12, fastconvert_bgra_to_yv12_c, 4);
|
|
fastconvert_emms();
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGR:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgr_to_yv12, fastconvert_bgr_to_yv12_c, 3);
|
|
fastconvert_emms();
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
if (m_bMirror)
|
|
{
|
|
fastconvert_YUY2CopyMem(&m_oSrcFormat, &m_oVideoBuffer1, m_bMirror);
|
|
YUY2Deinterlace(&m_oVideoBuffer1, &m_oDstFormat);
|
|
}
|
|
else
|
|
{
|
|
YUY2Deinterlace(&m_oSrcFormat, &m_oDstFormat);
|
|
}
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_bgra_to_yv12, fastconvert_bgra_to_yv12_c, 4);
|
|
fastconvert_emms();
|
|
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, false,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_BGR:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_bgr_to_yv12, fastconvert_bgr_to_yv12_c, 3);
|
|
fastconvert_emms();
|
|
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, false,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yv12_to_bgra, fastconvert_yv12_to_bgra_c, 4);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_YUY2:
|
|
YUY2Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
|
|
fastconvert_safe_packed_conv(m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, false,
|
|
fastconvert_yv12_to_bgra, fastconvert_yv12_to_bgra_c, 4);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
if (m_bMirror)
|
|
{
|
|
RGB32Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
fastconvert_RGB32CopyMem(&m_oVideoBuffer1, &m_oDstFormat, m_bMirror);
|
|
} else
|
|
RGB32Deinterlace(&m_oSrcFormat, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGR:
|
|
RGB24Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
RGB24ToRGB32(&m_oVideoBuffer1, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGR:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yv12_to_bgr, fastconvert_yv12_to_bgr_c, 3);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
YUY2Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
|
|
fastconvert_safe_packed_conv(m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, false,
|
|
fastconvert_yv12_to_bgr, fastconvert_yv12_to_bgr_c, 3);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
RGB32Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
RGB32ToRGB24(&m_oVideoBuffer1, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
case CSP_BGR:
|
|
if (m_bMirror)
|
|
{
|
|
RGB24Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
fastconvert_RGB24CopyMem(&m_oVideoBuffer1, &m_oDstFormat, m_bMirror);
|
|
} else
|
|
RGB24Deinterlace(&m_oSrcFormat, &m_oDstFormat);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CAVSVideoFrameTransform::ResizeDeinterlaceTransform()
|
|
{
|
|
switch (m_lOutColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
if (m_bMirror)
|
|
{
|
|
fastconvert_yv12_to_yv12(m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2], m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror);
|
|
fastconvert_emms();
|
|
YV12Resize(&m_oVideoBuffer2, &m_oDstFormat);
|
|
} else
|
|
YV12Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
case CSP_YUY2:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
fastconvert_emms();
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
YV12Resize(&m_oVideoBuffer2, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGRA:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgra_to_yv12, fastconvert_bgra_to_yv12_c, 4);
|
|
fastconvert_emms();
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
YV12Resize(&m_oVideoBuffer2, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGR:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2], m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1], m_oSrcFormat.Width, m_oSrcFormat.Height, m_bMirror,
|
|
fastconvert_bgr_to_yv12, fastconvert_bgr_to_yv12_c, 4);
|
|
fastconvert_emms();
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
YV12Resize(&m_oVideoBuffer2, &m_oDstFormat);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
YV12Resize(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2],
|
|
m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, m_bMirror,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
case CSP_YUY2:
|
|
if (m_bMirror)
|
|
{
|
|
fastconvert_YUY2CopyMem(&m_oSrcFormat, &m_oVideoBuffer1, m_bMirror);
|
|
YUY2Deinterlace(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
YUY2Resize(&m_oVideoBuffer2, &m_oDstFormat);
|
|
}
|
|
else
|
|
{
|
|
YUY2Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
YUY2Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
}
|
|
break;
|
|
case CSP_BGRA:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_bgra_to_yv12, fastconvert_bgra_to_yv12_c, 4);
|
|
fastconvert_emms();
|
|
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
YV12Resize(&m_oVideoBuffer2, &m_oVideoBuffer3);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer3.Plane[0], m_oVideoBuffer3.Plane[1], m_oVideoBuffer3.Plane[2],
|
|
m_oVideoBuffer3.Stride[0], m_oVideoBuffer3.Stride[1],
|
|
m_oVideoBuffer3.Width, m_oVideoBuffer3.Height, false,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
|
|
break;
|
|
case CSP_BGR:
|
|
fastconvert_safe_packed_conv(m_oSrcFormat.Plane[0], m_oSrcFormat.Stride[0],
|
|
m_oVideoBuffer1.Plane[0], m_oVideoBuffer1.Plane[1], m_oVideoBuffer1.Plane[2],
|
|
m_oVideoBuffer1.Stride[0], m_oVideoBuffer1.Stride[1],
|
|
m_oVideoBuffer1.Width, m_oVideoBuffer1.Height, m_bMirror,
|
|
fastconvert_bgr_to_yv12, fastconvert_bgr_to_yv12_c, 3);
|
|
fastconvert_emms();
|
|
|
|
YV12Deinterlace(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
YV12Resize(&m_oVideoBuffer2, &m_oVideoBuffer3);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer3.Plane[0], m_oVideoBuffer3.Plane[1], m_oVideoBuffer3.Plane[2],
|
|
m_oVideoBuffer3.Stride[0], m_oVideoBuffer3.Stride[1],
|
|
m_oVideoBuffer3.Width, m_oVideoBuffer3.Height, false,
|
|
fastconvert_yv12_to_yuyv, fastconvert_yv12_to_yuyv_c, 2);
|
|
fastconvert_emms();
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
YV12Resize(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2], m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1], m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, m_bMirror,
|
|
fastconvert_yv12_to_bgra, fastconvert_yv12_to_bgra_c, 4);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
YUY2Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
YUY2Resize(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
|
|
fastconvert_safe_packed_conv(m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Stride[0],
|
|
m_oVideoBuffer3.Plane[0], m_oVideoBuffer3.Plane[1], m_oVideoBuffer3.Plane[2],
|
|
m_oVideoBuffer3.Stride[0], m_oVideoBuffer3.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer3.Plane[0], m_oVideoBuffer3.Plane[1], m_oVideoBuffer3.Plane[2],
|
|
m_oVideoBuffer3.Stride[0], m_oVideoBuffer3.Stride[1],
|
|
m_oVideoBuffer3.Width, m_oVideoBuffer3.Height, false,
|
|
fastconvert_yv12_to_bgra, fastconvert_yv12_to_bgra_c, 4);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
RGB32Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
if (m_bMirror)
|
|
{
|
|
fastconvert_RGB32CopyMem(&m_oVideoBuffer1, &m_oVideoBuffer2, m_bMirror);
|
|
RGB32Resize(&m_oVideoBuffer2, &m_oDstFormat);
|
|
} else
|
|
RGB32Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGR:
|
|
RGB24Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
RGB24Resize(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
RGB24ToRGB32(&m_oVideoBuffer2, &m_oDstFormat, m_bMirror);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGR:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
YV12Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
YV12Resize(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Plane[1], m_oVideoBuffer2.Plane[2], m_oVideoBuffer2.Stride[0], m_oVideoBuffer2.Stride[1], m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, m_bMirror,
|
|
fastconvert_yv12_to_bgr, fastconvert_yv12_to_bgr_c, 3);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
YUY2Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
YUY2Resize(&m_oVideoBuffer1, &m_oVideoBuffer2);
|
|
|
|
fastconvert_safe_packed_conv(m_oVideoBuffer2.Plane[0], m_oVideoBuffer2.Stride[0],
|
|
m_oVideoBuffer3.Plane[0], m_oVideoBuffer3.Plane[1], m_oVideoBuffer3.Plane[2],
|
|
m_oVideoBuffer3.Stride[0], m_oVideoBuffer3.Stride[1],
|
|
m_oVideoBuffer2.Width, m_oVideoBuffer2.Height, m_bMirror,
|
|
fastconvert_yuyv_to_yv12, fastconvert_yuyv_to_yv12_c, 2);
|
|
|
|
fastconvert_safe_packed_conv(m_oDstFormat.Plane[0], m_oDstFormat.Stride[0],
|
|
m_oVideoBuffer3.Plane[0], m_oVideoBuffer3.Plane[1], m_oVideoBuffer3.Plane[2],
|
|
m_oVideoBuffer3.Stride[0], m_oVideoBuffer3.Stride[1],
|
|
m_oVideoBuffer3.Width, m_oVideoBuffer3.Height, false,
|
|
fastconvert_yv12_to_bgr, fastconvert_yv12_to_bgr_c, 3);
|
|
fastconvert_emms();
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
RGB32Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
RGB32ToRGB24(&m_oVideoBuffer1, &m_oVideoBuffer2, m_bMirror);
|
|
RGB24Resize(&m_oVideoBuffer2, &m_oDstFormat);
|
|
break;
|
|
case CSP_BGR:
|
|
RGB24Deinterlace(&m_oSrcFormat, &m_oVideoBuffer1);
|
|
if (m_bMirror)
|
|
{
|
|
fastconvert_RGB24CopyMem(&m_oVideoBuffer1, &m_oVideoBuffer2, m_bMirror);
|
|
RGB24Resize(&m_oVideoBuffer2, &m_oDstFormat);
|
|
} else
|
|
RGB24Resize(&m_oVideoBuffer1, &m_oDstFormat);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
//
|
|
void CAVSVideoFrameTransform::ResizeDeinterlaceAlloc()
|
|
{
|
|
switch (m_lOutColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGRA:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
}
|
|
break;
|
|
case CSP_YUY2:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
case CSP_YUY2:
|
|
if (m_bMirror)
|
|
{
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
}
|
|
else
|
|
{
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
}
|
|
break;
|
|
case CSP_BGRA:
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, CSP_YV12);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oSrcFormat, CSP_YV12);
|
|
AllocBuffer(&m_oVideoBuffer3, &m_oDstFormat, CSP_YV12);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGR:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer3, &m_oDstFormat, CSP_YV12);
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer3, &m_oDstFormat, CSP_YV12);
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CAVSVideoFrameTransform::DeinterlaceAlloc()
|
|
{
|
|
switch (m_lOutColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_YV12:
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGRA:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer( &m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace );
|
|
break;
|
|
case CSP_YUY2:
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGRA:
|
|
case CSP_BGR:
|
|
AllocBuffer( &m_oVideoBuffer1, &m_oSrcFormat, CSP_YV12 );
|
|
AllocBuffer( &m_oVideoBuffer2, &m_oSrcFormat, CSP_YV12 );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGR:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, CSP_YV12);
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGR:
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, CSP_YV12);
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
void CAVSVideoFrameTransform::ResizeAlloc()
|
|
{
|
|
switch (m_lOutColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGRA:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
}
|
|
break;
|
|
case CSP_YUY2:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oDstFormat, CSP_YV12);
|
|
break;
|
|
case CSP_YUY2:
|
|
if(m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGRA:
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, CSP_YV12);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, CSP_YV12);
|
|
break;
|
|
}
|
|
break;
|
|
case CSP_BGR:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, CSP_YV12);
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGR:
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
AllocBuffer(&m_oVideoBuffer2, &m_oDstFormat, CSP_YV12);
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
if (m_bMirror)
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, m_oDstFormat.ColorSpace);
|
|
break;
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oDstFormat, m_oSrcFormat.ColorSpace);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
void CAVSVideoFrameTransform::SimpleAlloc()
|
|
{
|
|
switch (m_lOutColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
break;
|
|
case CSP_YUY2:
|
|
break;
|
|
case CSP_BGRA:
|
|
break;
|
|
case CSP_BGR:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_YUY2:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_YUY2:
|
|
break;
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
case CSP_BGRA:
|
|
case CSP_BGR:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, CSP_YV12);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGR:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
break;
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, CSP_I420);
|
|
break;
|
|
case CSP_BGRA:
|
|
break;
|
|
case CSP_BGR:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CSP_BGRA:
|
|
switch(m_lInpColorSpace)
|
|
{
|
|
case CSP_I420:
|
|
case CSP_YV12:
|
|
break;
|
|
case CSP_YUY2:
|
|
AllocBuffer(&m_oVideoBuffer1, &m_oSrcFormat, CSP_I420);
|
|
break;
|
|
case CSP_BGRA:
|
|
break;
|
|
case CSP_BGR:
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
void CAVSVideoFrameTransform::ErrorAlloc()
|
|
{
|
|
//TODO îòñóòñòâóåò â Äèìèíîì êîäå
|
|
}
|
|
|
|
//
|
|
void __fastcall CAVSVideoFrameTransform::RGB32Resize(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame)
|
|
{
|
|
long lDstWidth = (long)(pInpFrame->Width*pOutFrame->kx);
|
|
long lDstHeight = (long)(pInpFrame->Height*pOutFrame->ky);
|
|
long lDstLeft = (pOutFrame->Width - lDstWidth)/2;
|
|
long lDstTop = (pOutFrame->Height - lDstHeight)/2;
|
|
|
|
if (m_bFillBackground)
|
|
{
|
|
//TODO íàäî ïîïðàâèòü àíàëîãè÷íî òîìó êàê ñäåëàíî YUV
|
|
//m_dwBGRDstBorderColor
|
|
long lStride = pOutFrame->Stride[0];
|
|
LPBYTE pTemp = new BYTE[lStride];
|
|
if (NULL!=pTemp)
|
|
{
|
|
long lColCount = pOutFrame->Stride[0]/4;
|
|
LPDWORD pTempPtr = (LPDWORD)pTemp;
|
|
DWORD dwTemp = (0xFF & (m_dwBGRDstBorderColor>>16)) |
|
|
(0x00FF00 & m_dwBGRDstBorderColor) |
|
|
((0xFF & m_dwBGRDstBorderColor)<<16) |
|
|
0xFF000000;//Äîáàâëåíî ïî ïðèêàçó ÑÀ
|
|
for (long lCol = 0; lCol < lColCount; lCol++, pTempPtr++)
|
|
{
|
|
*pTempPtr = dwTemp;
|
|
}
|
|
|
|
LPBYTE pRowPtr = pOutFrame->Plane[0];
|
|
for (long lRow = 0; lRow < pOutFrame->Height; lRow++, pRowPtr += lStride)
|
|
{
|
|
memcpy(pRowPtr, pTemp, lStride);
|
|
}
|
|
delete []pTemp;
|
|
}
|
|
}
|
|
|
|
IppiSize SizeIn={pInpFrame->Width, pInpFrame->Height};
|
|
IppiSize DstROI={min(lDstWidth, pOutFrame->Width), min(lDstHeight, pOutFrame->Height)};
|
|
IppiRect SrcROI={0, 0, pInpFrame->Width, pInpFrame->Height};
|
|
|
|
Ipp8u* pDst = (Ipp8u*)pOutFrame->Plane[0];
|
|
Ipp8u* pSrc = (Ipp8u*)pInpFrame->Plane[0];
|
|
if (lDstLeft>0)
|
|
pDst += 4*lDstLeft;
|
|
else
|
|
pSrc += 4*((long)((double)-lDstLeft/pOutFrame->kx));
|
|
if (lDstTop>0)
|
|
pDst += lDstTop*pOutFrame->Stride[0];
|
|
else
|
|
pSrc += ((((long)((double)-lDstTop/pOutFrame->ky))>>1)<<1)*pInpFrame->Stride[0];
|
|
|
|
const bool cbSizeUp = (pOutFrame->Width > pInpFrame->Width) || (pOutFrame->Height > pInpFrame->Height);
|
|
|
|
if (IPPI_INTER_SUPER == m_arlResizeModes[m_lResizeMode] && cbSizeUp)
|
|
{
|
|
ippiResize_8u_C4R( (Ipp8u*)pInpFrame->Plane[0], SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
pDst, pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, IPPI_INTER_CUBIC);
|
|
}
|
|
else
|
|
{
|
|
|
|
ippiResize_8u_C4R( (Ipp8u*)pInpFrame->Plane[0], SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
pDst, pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, m_arlResizeModes[m_lResizeMode]);
|
|
|
|
}
|
|
|
|
return;
|
|
/*
|
|
if (m_bFillBackground)
|
|
{
|
|
//TODO íàäî ïîïðàâèòü àíàëîãè÷íî òîìó êàê ñäåëàíî YUV
|
|
//m_dwBGRDstBorderColor
|
|
long lStride = pOutFrame->Stride[0];
|
|
LPBYTE pTemp = new BYTE[lStride];
|
|
if (NULL!=pTemp)
|
|
{
|
|
long lColCount = pOutFrame->Stride[0]/4;
|
|
LPDWORD pTempPtr = (LPDWORD)pTemp;
|
|
DWORD dwTemp = (0xFF & (m_dwBGRDstBorderColor>>16)) |
|
|
(0x00FF00 & m_dwBGRDstBorderColor) |
|
|
((0xFF & m_dwBGRDstBorderColor)<<16);
|
|
for (long lCol = 0; lCol < lColCount; lCol++, pTempPtr++)
|
|
{
|
|
*pTempPtr = dwTemp;
|
|
}
|
|
|
|
LPBYTE pRowPtr = pOutFrame->Plane[0];
|
|
for (long lRow = 0; lRow < pOutFrame->Height; lRow++, pRowPtr += lStride)
|
|
{
|
|
memcpy(pRowPtr, pTemp, lStride);
|
|
}
|
|
delete []pTemp;
|
|
}
|
|
//memset(pOutFrame->Plane[0], m_nRGBDstBorderGrayScale, pOutFrame->Stride[0]*pOutFrame->Height);
|
|
}
|
|
|
|
IppiRect SrcROI={0, 0, pInpFrame->Width, pInpFrame->Height};
|
|
IppiSize SizeIn={pInpFrame->Width, pInpFrame->Height};
|
|
IppiSize DstROI={pOutFrame->Width, pOutFrame->Height};
|
|
|
|
ippiResizeCenter_8u_AC4R((Ipp8u*)pInpFrame->Plane[0], SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
(Ipp8u*)pOutFrame->Plane[0], pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky,
|
|
(double)pInpFrame->Width/2, (double)pInpFrame->Height/2, m_arlResizeModes[m_lResizeMode]);
|
|
*/
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::RGB24Resize(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame)
|
|
{
|
|
long lDstWidth = (long)(pInpFrame->Width*pOutFrame->kx);
|
|
long lDstHeight = (long)(pInpFrame->Height*pOutFrame->ky);
|
|
long lDstLeft = (pOutFrame->Width - lDstWidth)/2;
|
|
long lDstTop = (pOutFrame->Height - lDstHeight)/2;
|
|
|
|
if (m_bFillBackground)
|
|
{
|
|
//TODO íàäî ïîïðàâèòü àíàëîãè÷íî òîìó êàê ñäåëàíî YUV
|
|
//m_dwBGRDstBorderColor
|
|
BYTE nB = (BYTE)((m_dwBGRDstBorderColor>>16) & 0xFF);
|
|
BYTE nG = (BYTE)((m_dwBGRDstBorderColor>>8) & 0xFF);
|
|
BYTE nR = (BYTE)((m_dwBGRDstBorderColor) & 0xFF);
|
|
long lStride = pOutFrame->Stride[0];
|
|
LPBYTE pTemp = new BYTE[lStride];
|
|
if (NULL!=pTemp)
|
|
{
|
|
long lColCount = pOutFrame->Stride[0]/3;
|
|
LPBYTE pTempPtr = (LPBYTE)pTemp;
|
|
for (long lCol = 0; lCol < lColCount; lCol++)
|
|
{
|
|
*pTempPtr = nB; pTempPtr++;
|
|
*pTempPtr = nG; pTempPtr++;
|
|
*pTempPtr = nR; pTempPtr++;
|
|
}
|
|
|
|
LPBYTE pRowPtr = pOutFrame->Plane[0];
|
|
for (long lRow = 0; lRow < pOutFrame->Height; lRow++, pRowPtr += lStride)
|
|
{
|
|
memcpy(pRowPtr, pTemp, lStride);
|
|
}
|
|
delete []pTemp;
|
|
}
|
|
}
|
|
|
|
IppiSize SizeIn={pInpFrame->Width, pInpFrame->Height};
|
|
IppiSize DstROI={min(lDstWidth, pOutFrame->Width), min(lDstHeight, pOutFrame->Height)};
|
|
IppiRect SrcROI={0, 0, pInpFrame->Width, pInpFrame->Height};
|
|
|
|
Ipp8u* pDst = (Ipp8u*)pOutFrame->Plane[0];
|
|
Ipp8u* pSrc = (Ipp8u*)pInpFrame->Plane[0];
|
|
if (lDstLeft>0)
|
|
pDst += 3*lDstLeft;
|
|
else
|
|
pSrc += 3*((long)((double)-lDstLeft/pOutFrame->kx));
|
|
if (lDstTop>0)
|
|
pDst += lDstTop*pOutFrame->Stride[0];
|
|
else
|
|
pSrc += ((((long)((double)-lDstTop/pOutFrame->ky))>>1)<<1)*pInpFrame->Stride[0];
|
|
|
|
|
|
|
|
const bool cbSizeUp = (pOutFrame->Width > pInpFrame->Width) || (pOutFrame->Height > pInpFrame->Height);
|
|
|
|
if (IPPI_INTER_SUPER == m_arlResizeModes[m_lResizeMode] && cbSizeUp)
|
|
{
|
|
ippiResize_8u_C3R( pSrc, SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
pDst, pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, IPPI_INTER_CUBIC);
|
|
}
|
|
else
|
|
{
|
|
ippiResize_8u_C3R( pSrc, SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
pDst, pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, m_arlResizeModes[m_lResizeMode]);
|
|
|
|
}
|
|
|
|
return;
|
|
/*
|
|
if (m_bFillBackground)
|
|
{
|
|
//TODO íàäî ïîïðàâèòü àíàëîãè÷íî òîìó êàê ñäåëàíî YUV
|
|
//m_dwBGRDstBorderColor
|
|
long lStride = pOutFrame->Stride[0];
|
|
LPBYTE pTemp = new BYTE[lStride];
|
|
if (NULL!=pTemp)
|
|
{
|
|
long lColCount = pOutFrame->Stride[0]/3;
|
|
LPBYTE pTempPtr = pTemp;
|
|
BYTE nRColor = (BYTE)(0xFF & m_dwBGRDstBorderColor);
|
|
BYTE nGColor = (BYTE)(0xFF & (m_dwBGRDstBorderColor >> 8));
|
|
BYTE nBColor = (BYTE)(0xFF & (m_dwBGRDstBorderColor >> 16));
|
|
for (long lCol = 0; lCol < lColCount; lCol++)
|
|
{
|
|
*pTempPtr = nBColor; pTempPtr++;
|
|
*pTempPtr = nGColor; pTempPtr++;
|
|
*pTempPtr = nRColor; pTempPtr++;
|
|
}
|
|
|
|
LPBYTE pRowPtr = pOutFrame->Plane[0];
|
|
for (long lRow = 0; lRow < pOutFrame->Height; lRow++, pRowPtr += lStride)
|
|
{
|
|
memcpy(pRowPtr, pTemp, lStride);
|
|
}
|
|
delete []pTemp;
|
|
}
|
|
|
|
//memset(pOutFrame->Plane[0], m_nRGBDstBorderGrayScale, pOutFrame->Stride[0]*pOutFrame->Height);
|
|
}
|
|
|
|
IppiRect SrcROI={0, 0, pInpFrame->Width, pInpFrame->Height};
|
|
IppiSize SizeIn={pInpFrame->Width, pInpFrame->Height};
|
|
IppiSize DstROI={pOutFrame->Width, pOutFrame->Height};
|
|
|
|
//ATLTRACE("InpFramePtr: 0x%08X, InpFrameW: %d, InpFrameH: %d, InpFrameStride: %d\n",
|
|
// pInpFrame->Plane[0], pInpFrame->Width, pInpFrame->Height, pInpFrame->Stride[0]);
|
|
//ATLTRACE("OutFramePtr: 0x%08X, OutFrameW: %d, OutFrameH: %d, OutFrameStride: %d\n",
|
|
// pOutFrame->Plane[0], pOutFrame->Width, pOutFrame->Height, pOutFrame->Stride[0]);
|
|
//ATLTRACE("OutFrameKX: %f, OutFrameKY: %f\n", pOutFrame->kx, pOutFrame->ky);
|
|
|
|
ippiResizeCenter_8u_C3R((Ipp8u*)pInpFrame->Plane[0], SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
(Ipp8u*)pOutFrame->Plane[0], pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky,
|
|
(double)pInpFrame->Width/2, (double)pInpFrame->Height/2, m_arlResizeModes[m_lResizeMode]);
|
|
*/
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::YV12Resize(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame)
|
|
{
|
|
long lYDstWidth = (((long)(pInpFrame->Width*pOutFrame->kx))>>1)<<1;
|
|
long lYDstHeight = (((long)(pInpFrame->Height*pOutFrame->ky))>>1)<<1;
|
|
long lYDstLeft = (((pOutFrame->Width - lYDstWidth)/2)>>1)<<1;
|
|
long lYDstTop = (((pOutFrame->Height - lYDstHeight)/2)>>1)<<1;
|
|
|
|
long lUVDstLeft = lYDstLeft/2;
|
|
long lUVDstWidth = lYDstWidth/2;
|
|
long lUVDstTop = lYDstTop/2;
|
|
long lUVDstHeight = lYDstHeight/2;
|
|
|
|
if (m_bFillBackground)
|
|
{
|
|
if (lYDstTop>0)
|
|
{
|
|
//memset(pOutFrame->Plane[0], m_nYDstBorderGrayScale, pOutFrame->Stride[0]*lYDstTop);
|
|
//memset(pOutFrame->Plane[1], m_nUDstBorderGrayScale, pOutFrame->Stride[1]*lUVDstTop);
|
|
//memset(pOutFrame->Plane[2], m_nVDstBorderGrayScale, pOutFrame->Stride[2]*lUVDstTop);
|
|
memset(pOutFrame->Plane[0], m_nYDstBorderColor, pOutFrame->Stride[0]*lYDstTop);
|
|
memset(pOutFrame->Plane[1], m_nUDstBorderColor, pOutFrame->Stride[1]*lUVDstTop);
|
|
memset(pOutFrame->Plane[2], m_nVDstBorderColor, pOutFrame->Stride[2]*lUVDstTop);
|
|
}
|
|
if (lYDstTop+lYDstHeight<pOutFrame->Height)
|
|
{
|
|
memset( pOutFrame->Plane[0] + (lYDstTop+lYDstHeight)*pOutFrame->Stride[0],
|
|
//m_nYDstBorderGrayScale,
|
|
m_nYDstBorderColor,
|
|
pOutFrame->Stride[0]*(pOutFrame->Height - lYDstTop - lYDstHeight));
|
|
memset( pOutFrame->Plane[1] + (lUVDstTop+lUVDstHeight)*pOutFrame->Stride[1],
|
|
//m_nUDstBorderGrayScale,
|
|
m_nUDstBorderColor,
|
|
pOutFrame->Stride[1]*(pOutFrame->Height/2 - lUVDstTop - lUVDstHeight));
|
|
memset( pOutFrame->Plane[2] + (lUVDstTop+lUVDstHeight)*pOutFrame->Stride[2],
|
|
//m_nVDstBorderGrayScale,
|
|
m_nVDstBorderColor,
|
|
pOutFrame->Stride[2]*(pOutFrame->Height/2 - lUVDstTop - lUVDstHeight));
|
|
}
|
|
if (lYDstLeft>0)
|
|
{
|
|
LPBYTE pDstY = pOutFrame->Plane[0];
|
|
if (lYDstTop>0)
|
|
pDstY += lYDstTop * pOutFrame->Stride[0];
|
|
long lTemp = min(lYDstHeight, pOutFrame->Height);
|
|
for (long lRow = 0; lRow<lTemp; lRow++, pDstY+=pOutFrame->Stride[0])
|
|
{
|
|
//memset(pDstY, m_nYDstBorderGrayScale, lYDstLeft);
|
|
memset(pDstY, m_nYDstBorderColor, lYDstLeft);
|
|
}
|
|
LPBYTE pDstU = pOutFrame->Plane[1];
|
|
LPBYTE pDstV = pOutFrame->Plane[2];
|
|
if (lUVDstTop>0)
|
|
{
|
|
pDstU += lUVDstTop * pOutFrame->Stride[1];
|
|
pDstV += lUVDstTop * pOutFrame->Stride[2];
|
|
}
|
|
lTemp = min(lUVDstHeight, pOutFrame->Height/2);
|
|
for (long lRow = 0; lRow<lTemp ; lRow++, pDstU+=pOutFrame->Stride[1], pDstV+=pOutFrame->Stride[2])
|
|
{
|
|
//memset(pDstU, m_nUDstBorderGrayScale, lUVDstLeft);
|
|
//memset(pDstV, m_nVDstBorderGrayScale, lUVDstLeft);
|
|
memset(pDstU, m_nUDstBorderColor, lUVDstLeft);
|
|
memset(pDstV, m_nVDstBorderColor, lUVDstLeft);
|
|
}
|
|
}
|
|
if (lYDstLeft + lYDstWidth<pOutFrame->Width)
|
|
{
|
|
LPBYTE pDstY = pOutFrame->Plane[0] + lYDstLeft + lYDstWidth;
|
|
if (lYDstTop>0)
|
|
pDstY += lYDstTop * pOutFrame->Stride[0];
|
|
long lSize = pOutFrame->Width - (lYDstLeft + lYDstWidth);
|
|
long lTemp = min(lYDstHeight, pOutFrame->Height);
|
|
for (long lRow = 0; lRow<lTemp; lRow++, pDstY+=pOutFrame->Stride[0])
|
|
{
|
|
//memset(pDstY, m_nYDstBorderGrayScale, lSize);
|
|
memset(pDstY, m_nYDstBorderColor, lSize);
|
|
}
|
|
LPBYTE pDstU = pOutFrame->Plane[1] + lUVDstLeft + lUVDstWidth;
|
|
LPBYTE pDstV = pOutFrame->Plane[2] + lUVDstLeft + lUVDstWidth;
|
|
if (lUVDstTop>0)
|
|
{
|
|
pDstU += lUVDstTop * pOutFrame->Stride[1];
|
|
pDstV += lUVDstTop * pOutFrame->Stride[2];
|
|
}
|
|
lSize = pOutFrame->Width/2 - (lUVDstLeft + lUVDstWidth);
|
|
lTemp = min(lUVDstHeight, pOutFrame->Height/2);
|
|
for (long lRow = 0; lRow<lTemp; lRow++, pDstU+=pOutFrame->Stride[1], pDstV+=pOutFrame->Stride[2])
|
|
{
|
|
//memset(pDstU, m_nUDstBorderGrayScale, lSize);
|
|
//memset(pDstV, m_nVDstBorderGrayScale, lSize);
|
|
memset(pDstU, m_nUDstBorderColor, lSize);
|
|
memset(pDstV, m_nVDstBorderColor, lSize);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
IppiSize SizeIn={pInpFrame->Width, pInpFrame->Height};
|
|
IppiSize DstROI={min(lYDstWidth, pOutFrame->Width), min(lYDstHeight, pOutFrame->Height)};
|
|
IppiRect SrcROI={0, 0, pInpFrame->Width, pInpFrame->Height};
|
|
|
|
Ipp8u* pDst = (Ipp8u*)pOutFrame->Plane[0];
|
|
Ipp8u* pSrc = (Ipp8u*)pInpFrame->Plane[0];
|
|
|
|
if (lYDstLeft>0)
|
|
pDst += lYDstLeft;
|
|
else
|
|
pSrc += (((long)((double)-lYDstLeft/pOutFrame->kx))>>1)<<1;
|
|
if (lYDstTop>0)
|
|
pDst += lYDstTop*pOutFrame->Stride[0];
|
|
else
|
|
pSrc += ((((long)((double)-lYDstTop/pOutFrame->ky))>>1)<<1)*pInpFrame->Stride[0];
|
|
if ((0==SrcROI.width) || (0==SrcROI.height))
|
|
return;
|
|
|
|
const bool cbSizeUp = (pOutFrame->Width > pInpFrame->Width) || (pOutFrame->Height > pInpFrame->Height);
|
|
|
|
if (IPPI_INTER_SUPER == m_arlResizeModes[m_lResizeMode] && cbSizeUp)
|
|
{
|
|
ippiResize_8u_C1R( pSrc, SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
pDst, pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, IPPI_INTER_CUBIC);
|
|
}
|
|
else
|
|
{
|
|
ippiResize_8u_C1R( pSrc, SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
pDst, pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, m_arlResizeModes[m_lResizeMode]);
|
|
|
|
}
|
|
|
|
|
|
|
|
SrcROI.x/=2;
|
|
SrcROI.y/=2;
|
|
SrcROI.width/=2;
|
|
SrcROI.height/=2;
|
|
SizeIn.width/=2;
|
|
SizeIn.height/=2;
|
|
DstROI.width/=2;
|
|
DstROI.height/=2;
|
|
|
|
if ((0==SrcROI.width) || (0==SrcROI.height))
|
|
return;
|
|
pDst = (Ipp8u*)pOutFrame->Plane[1];
|
|
pSrc = (Ipp8u*)pInpFrame->Plane[1];
|
|
if (lUVDstLeft>0)
|
|
pDst += (lYDstLeft/2);
|
|
else
|
|
pSrc += (((long)((double)-lYDstLeft/pOutFrame->kx))>>1);
|
|
if (lUVDstTop>0)
|
|
pDst += (lYDstTop/2)*pOutFrame->Stride[1];
|
|
else
|
|
pSrc += ((((long)((double)-lYDstTop/pOutFrame->ky))>>1) * pInpFrame->Stride[1]);
|
|
|
|
if (IPPI_INTER_SUPER == m_arlResizeModes[m_lResizeMode] && cbSizeUp)
|
|
{
|
|
ippiResize_8u_C1R( pSrc, SizeIn, pInpFrame->Stride[1], SrcROI,
|
|
pDst, pOutFrame->Stride[1], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, IPPI_INTER_CUBIC);
|
|
}
|
|
else
|
|
{
|
|
ippiResize_8u_C1R( pSrc, SizeIn, pInpFrame->Stride[1], SrcROI,
|
|
pDst, pOutFrame->Stride[1], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, m_arlResizeModes[m_lResizeMode]);
|
|
}
|
|
|
|
pDst = (Ipp8u*)pOutFrame->Plane[2];
|
|
pSrc = (Ipp8u*)pInpFrame->Plane[2];
|
|
if (lUVDstLeft>0)
|
|
pDst += lUVDstLeft;
|
|
else
|
|
pSrc += (((long)((double)-lYDstLeft/pOutFrame->kx))>>1);
|
|
if (lUVDstTop>0)
|
|
pDst += lUVDstTop*pOutFrame->Stride[2];
|
|
else
|
|
pSrc += (((long)((double)-lYDstTop/pOutFrame->ky))>>1) * pInpFrame->Stride[2];
|
|
|
|
|
|
if (IPPI_INTER_SUPER == m_arlResizeModes[m_lResizeMode] && cbSizeUp)
|
|
{
|
|
ippiResize_8u_C1R( pSrc, SizeIn, pInpFrame->Stride[2], SrcROI,
|
|
pDst, pOutFrame->Stride[2], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, IPPI_INTER_CUBIC);
|
|
}
|
|
else
|
|
{
|
|
ippiResize_8u_C1R( pSrc, SizeIn, pInpFrame->Stride[2], SrcROI,
|
|
pDst, pOutFrame->Stride[2], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky, m_arlResizeModes[m_lResizeMode]);
|
|
}
|
|
/*
|
|
if (m_bFillBackground)
|
|
{
|
|
memset(pOutFrame->Plane[0], m_nYDstBorderGrayScale, pOutFrame->Stride[0]*pOutFrame->Height);
|
|
memset(pOutFrame->Plane[1], m_nUDstBorderGrayScale, pOutFrame->Stride[1]*pOutFrame->Height/2);
|
|
memset(pOutFrame->Plane[2], m_nVDstBorderGrayScale, pOutFrame->Stride[2]*pOutFrame->Height/2);
|
|
}
|
|
|
|
IppiRect SrcROI={0, 0, pInpFrame->Width, pInpFrame->Height};
|
|
IppiSize SizeIn={pInpFrame->Width, pInpFrame->Height};
|
|
IppiSize DstROI={pOutFrame->Width, pOutFrame->Height};
|
|
|
|
ippiResizeCenter_8u_C1R((Ipp8u*)pInpFrame->Plane[0], SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
(Ipp8u*)pOutFrame->Plane[0], pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky,
|
|
(double)pInpFrame->Width/2, (double)pInpFrame->Height/2, m_arlResizeModes[m_lResizeMode]);
|
|
SrcROI.width/=2;
|
|
SrcROI.height/=2;
|
|
SizeIn.width/=2;
|
|
SizeIn.height/=2;
|
|
DstROI.width/=2;
|
|
DstROI.height/=2;
|
|
|
|
ippiResizeCenter_8u_C1R((Ipp8u*)pInpFrame->Plane[1], SizeIn, pInpFrame->Stride[1], SrcROI,
|
|
(Ipp8u*)pOutFrame->Plane[1], pOutFrame->Stride[1], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky,
|
|
(double)pInpFrame->Width/4, (double)pInpFrame->Height/4, m_arlResizeModes[m_lResizeMode]);
|
|
|
|
ippiResizeCenter_8u_C1R((Ipp8u*)pInpFrame->Plane[2], SizeIn, pInpFrame->Stride[2], SrcROI,
|
|
(Ipp8u*)pOutFrame->Plane[2], pOutFrame->Stride[2], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky,
|
|
(double)pInpFrame->Width/4, (double)pInpFrame->Height/4, m_arlResizeModes[m_lResizeMode]);
|
|
|
|
*/
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::YUY2Resize(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame)
|
|
{
|
|
if (m_bFillBackground)
|
|
{
|
|
//memset(pOutFrame->Plane[0], m_nRGBDstBorderGrayScale, pOutFrame->Stride[0]*pOutFrame->Height);
|
|
//TODO íàäî ïîïðàâèòü àíàëîãè÷íî òîìó êàê ñäåëàíî YUV
|
|
long lColCount = pOutFrame->Width/2;
|
|
long lRowCount = pOutFrame->Height;
|
|
long lPitch = pOutFrame->Stride[0] - pOutFrame->Width*2;
|
|
LPBYTE pTemp = pOutFrame->Plane[0];
|
|
for (long lRowIndex = 0; lRowIndex<lRowCount; lRowIndex++)
|
|
{
|
|
for (long lColIndex = 0; lColIndex<lColCount; lColIndex++)
|
|
{
|
|
*pTemp = m_nYDstBorderColor; pTemp++;
|
|
*pTemp = m_nUDstBorderColor; pTemp++;
|
|
*pTemp = m_nYDstBorderColor; pTemp++;
|
|
*pTemp = m_nVDstBorderColor; pTemp++;
|
|
}
|
|
pTemp += lPitch;
|
|
}
|
|
}
|
|
|
|
IppiRect SrcROI={0, 0, pInpFrame->Width/2, pInpFrame->Height};
|
|
IppiSize SizeIn={pInpFrame->Width/2, pInpFrame->Height};
|
|
IppiSize DstROI={pOutFrame->Width/2, pOutFrame->Height};
|
|
|
|
const bool cbSizeUp = (pOutFrame->Width > pInpFrame->Width) || (pOutFrame->Height > pInpFrame->Height);
|
|
|
|
if (IPPI_INTER_SUPER == m_arlResizeModes[m_lResizeMode] && cbSizeUp)
|
|
{
|
|
ippiResizeCenter_8u_C4R((Ipp8u*)pInpFrame->Plane[0], SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
(Ipp8u*)pOutFrame->Plane[0], pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky,
|
|
(double)pInpFrame->Width/4, (double)pInpFrame->Height/2, IPPI_INTER_CUBIC);
|
|
}
|
|
else
|
|
{
|
|
ippiResizeCenter_8u_C4R((Ipp8u*)pInpFrame->Plane[0], SizeIn, pInpFrame->Stride[0], SrcROI,
|
|
(Ipp8u*)pOutFrame->Plane[0], pOutFrame->Stride[0], DstROI,
|
|
pOutFrame->kx, pOutFrame->ky,
|
|
(double)pInpFrame->Width/4, (double)pInpFrame->Height/2, m_arlResizeModes[m_lResizeMode]);
|
|
}
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
void __fastcall CAVSVideoFrameTransform::RGB32ToRGB24(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame, bool m_bMirror)
|
|
{
|
|
BYTE* pDst=(BYTE*)pOutFrame->Plane[0];
|
|
BYTE* pSrc=(BYTE*)pInpFrame->Plane[0];
|
|
|
|
BYTE* pDstPos;
|
|
BYTE* pSrcPos;
|
|
|
|
if (m_bMirror)
|
|
{
|
|
pDst+=(pOutFrame->Height-1)*pOutFrame->Stride[0];
|
|
for (int i=0; i<pOutFrame->Height;i++)
|
|
{
|
|
pDstPos = pDst;
|
|
pSrcPos = pSrc;
|
|
for (int j=0; j<pOutFrame->Width-1; j++)
|
|
{
|
|
*(DWORD*)pDstPos=*(DWORD*)pSrcPos;
|
|
pSrcPos+=4;
|
|
pDstPos+=3;
|
|
}
|
|
*pDstPos=*pSrcPos;
|
|
*(pDstPos+1)=*(pSrcPos+1);
|
|
*(pDstPos+2)=*(pSrcPos+2);
|
|
pSrc += pInpFrame->Stride[0];
|
|
pDst -= pOutFrame->Stride[0];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i=0; i<pOutFrame->Height;i++)
|
|
{
|
|
pDstPos = pDst;
|
|
pSrcPos = pSrc;
|
|
for (int j=0; j<pOutFrame->Width-1; j++)
|
|
{
|
|
*(DWORD*)pDstPos=*(DWORD*)pSrcPos;
|
|
pSrcPos+=4;
|
|
pDstPos+=3;
|
|
}
|
|
*pDstPos=*pSrcPos;
|
|
*(pDstPos+1) = *(pSrcPos+1);
|
|
*(pDstPos+2) = *(pSrcPos+2);
|
|
pSrc+= pInpFrame->Stride[0];
|
|
pDst+= pOutFrame->Stride[0];
|
|
}
|
|
}
|
|
}
|
|
|
|
static _inline int GetBitValue( int n, int bitPosition )
|
|
{
|
|
return ((n >> bitPosition) & 1);
|
|
}
|
|
|
|
void __fastcall CAVSVideoFrameTransform::RGB8ToRGB24(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame, bool m_bMirror)
|
|
{
|
|
//Bit 7 6 5 4 3 2 1 0
|
|
//Data R R R G G G B B
|
|
|
|
BYTE* pDst=(BYTE*)pOutFrame->Plane[0];
|
|
BYTE* pSrc=(BYTE*)pInpFrame->Plane[0];
|
|
|
|
BYTE* pDstPos;
|
|
BYTE* pSrcPos;
|
|
if (m_bMirror)
|
|
{
|
|
pDst+=(pOutFrame->Height-1)*pOutFrame->Stride[0];
|
|
for (int i=0; i<pOutFrame->Height;i++)
|
|
{
|
|
pDstPos = pDst;
|
|
pSrcPos = pSrc;
|
|
for (int j=0; j<pOutFrame->Width/*-1*/; j++)
|
|
{
|
|
pDstPos[0] = ((*pSrcPos) >> 5) * 32;
|
|
pDstPos[1] = (((*pSrcPos) >> 2) << 3) * 32;
|
|
pDstPos[2] = ((*pSrcPos) << 6) * 64;
|
|
|
|
pSrcPos+=1;
|
|
pDstPos+=3;
|
|
}
|
|
//*pDstPos = *pSrcPos;
|
|
//*(pDstPos+1) = *(pSrcPos+1);
|
|
//*(pDstPos+2) = *(pSrcPos+2);
|
|
//*(pDstPos+3) = 0;
|
|
pSrc += pInpFrame->Stride[0];
|
|
pDst -= pOutFrame->Stride[0];
|
|
}
|
|
} else
|
|
{
|
|
for (int i=0; i<pOutFrame->Height;i++)
|
|
{
|
|
pDstPos = pDst;
|
|
pSrcPos = pSrc;
|
|
for (int j=0; j<pOutFrame->Width/*-1*/; j++)
|
|
{
|
|
pDstPos[0] = ((*pSrcPos) >> 5) * 32;
|
|
pDstPos[1] = (((*pSrcPos) >> 2) << 3) * 32;
|
|
pDstPos[2] = ((*pSrcPos) << 6) * 64;
|
|
|
|
pSrcPos+=1;
|
|
pDstPos+=3;
|
|
}
|
|
//*pDstPos=*pSrcPos;
|
|
//*(pDstPos+1)=*(pSrcPos+1);
|
|
//*(pDstPos+2)=*(pSrcPos+2);
|
|
//*(pDstPos+3)=0;
|
|
pSrc+=pInpFrame->Stride[0];
|
|
pDst+=pOutFrame->Stride[0];
|
|
}
|
|
}
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::RGB8ToRGB32(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame, bool m_bMirror)
|
|
{
|
|
BYTE* pDst=(BYTE*)pOutFrame->Plane[0];
|
|
BYTE* pSrc=(BYTE*)pInpFrame->Plane[0];
|
|
|
|
BYTE* pDstPos;
|
|
BYTE* pSrcPos;
|
|
if (m_bMirror)
|
|
{
|
|
pDst+=(pOutFrame->Height-1)*pOutFrame->Stride[0];
|
|
for (int i=0; i<pOutFrame->Height;i++)
|
|
{
|
|
pDstPos = pDst;
|
|
pSrcPos = pSrc;
|
|
for (int j=0; j<pOutFrame->Width/*-1*/; j++)
|
|
{
|
|
pDstPos[0] = ((*pSrcPos) >> 5) * 32;
|
|
pDstPos[1] = (((*pSrcPos) >> 2) << 3) * 32;
|
|
pDstPos[2] = ((*pSrcPos) << 6) * 64;
|
|
|
|
pSrcPos+=1;
|
|
pDstPos+=4;
|
|
}
|
|
//*pDstPos = *pSrcPos;
|
|
//*(pDstPos+1) = *(pSrcPos+1);
|
|
//*(pDstPos+2) = *(pSrcPos+2);
|
|
//*(pDstPos+3) = 0;
|
|
pSrc += pInpFrame->Stride[0];
|
|
pDst -= pOutFrame->Stride[0];
|
|
}
|
|
} else
|
|
{
|
|
for (int i=0; i<pOutFrame->Height;i++)
|
|
{
|
|
pDstPos = pDst;
|
|
pSrcPos = pSrc;
|
|
for (int j=0; j<pOutFrame->Width/*-1*/; j++)
|
|
{
|
|
pDstPos[0] = ((*pSrcPos) >> 5) * 32;
|
|
pDstPos[1] = (((*pSrcPos) >> 2) << 3) * 32;
|
|
pDstPos[2] = ((*pSrcPos) << 6) * 64;
|
|
|
|
pSrcPos+=1;
|
|
pDstPos+=4;
|
|
}
|
|
//*pDstPos=*pSrcPos;
|
|
//*(pDstPos+1)=*(pSrcPos+1);
|
|
//*(pDstPos+2)=*(pSrcPos+2);
|
|
//*(pDstPos+3)=0;
|
|
pSrc+=pInpFrame->Stride[0];
|
|
pDst+=pOutFrame->Stride[0];
|
|
}
|
|
}
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::RGB24ToRGB32(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame, bool m_bMirror)
|
|
{
|
|
BYTE* pDst=(BYTE*)pOutFrame->Plane[0];
|
|
BYTE* pSrc=(BYTE*)pInpFrame->Plane[0];
|
|
|
|
BYTE* pDstPos;
|
|
BYTE* pSrcPos;
|
|
if (m_bMirror)
|
|
{
|
|
pDst+=(pOutFrame->Height-1)*pOutFrame->Stride[0];
|
|
for (int i=0; i<pOutFrame->Height;i++)
|
|
{
|
|
pDstPos = pDst;
|
|
pSrcPos = pSrc;
|
|
for (int j=0; j<pOutFrame->Width-1; j++)
|
|
{
|
|
*(DWORD*)pDstPos=*(DWORD*)pSrcPos;
|
|
*(DWORD*)pDstPos&=0x00FFFFFF;
|
|
pSrcPos+=3;
|
|
pDstPos+=4;
|
|
}
|
|
*pDstPos = *pSrcPos;
|
|
*(pDstPos+1) = *(pSrcPos+1);
|
|
*(pDstPos+2) = *(pSrcPos+2);
|
|
*(pDstPos+3) = 0;
|
|
pSrc += pInpFrame->Stride[0];
|
|
pDst -= pOutFrame->Stride[0];
|
|
}
|
|
} else
|
|
{
|
|
for (int i=0; i<pOutFrame->Height;i++)
|
|
{
|
|
pDstPos = pDst;
|
|
pSrcPos = pSrc;
|
|
for (int j=0; j<pOutFrame->Width-1; j++)
|
|
{
|
|
*(DWORD*)pDstPos=*(DWORD*)pSrcPos;
|
|
*(DWORD*)pDstPos&=0x00FFFFFF;
|
|
pSrcPos+=3;
|
|
pDstPos+=4;
|
|
}
|
|
*pDstPos=*pSrcPos;
|
|
*(pDstPos+1)=*(pSrcPos+1);
|
|
*(pDstPos+2)=*(pSrcPos+2);
|
|
*(pDstPos+3)=0;
|
|
pSrc+=pInpFrame->Stride[0];
|
|
pDst+=pOutFrame->Stride[0];
|
|
}
|
|
}
|
|
}
|
|
//
|
|
void __fastcall CAVSVideoFrameTransform::RGB32Deinterlace(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame)
|
|
{
|
|
switch (m_lDeinterlaceMethod)
|
|
{
|
|
case DEINTERLACE_METHOD_BLEND:
|
|
fastconvert_RGB32BlendDeinterlace(pInpFrame, pOutFrame);
|
|
break;
|
|
case DEINTERLACE_METHOD_MIDDLE:
|
|
fastconvert_RGB32MiddleDeinterlace(pInpFrame, pOutFrame);
|
|
break;
|
|
}
|
|
fastconvert_emms();
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::RGB24Deinterlace(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame)
|
|
{
|
|
switch (m_lDeinterlaceMethod)
|
|
{
|
|
case DEINTERLACE_METHOD_BLEND:
|
|
fastconvert_RGB24BlendDeinterlace(pInpFrame, pOutFrame);
|
|
break;
|
|
case DEINTERLACE_METHOD_MIDDLE:
|
|
fastconvert_RGB24MiddleDeinterlace(pInpFrame, pOutFrame);
|
|
break;
|
|
}
|
|
fastconvert_emms();
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::YV12Deinterlace(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame)
|
|
{
|
|
switch (m_lDeinterlaceMethod)
|
|
{
|
|
case DEINTERLACE_METHOD_BLEND:
|
|
fastconvert_YV12BlendDeinterlace(pInpFrame, pOutFrame);
|
|
break;
|
|
case DEINTERLACE_METHOD_MIDDLE:
|
|
fastconvert_YV12MiddleDeinterlace(pInpFrame, pOutFrame);
|
|
break;
|
|
}
|
|
fastconvert_emms();
|
|
}
|
|
void __fastcall CAVSVideoFrameTransform::YUY2Deinterlace(SUncompressedVideoFrame* pInpFrame, SUncompressedVideoFrame* pOutFrame)
|
|
{
|
|
switch (m_lDeinterlaceMethod)
|
|
{
|
|
case DEINTERLACE_METHOD_BLEND:
|
|
fastconvert_YUY2BlendDeinterlace(pInpFrame, pOutFrame);
|
|
break;
|
|
case DEINTERLACE_METHOD_MIDDLE:
|
|
fastconvert_YUY2MiddleDeinterlace(pInpFrame, pOutFrame);
|
|
break;
|
|
}
|
|
fastconvert_emms();
|
|
}
|