Add function frameFromBufferYUV420p to the new pel fmt api

This commit is contained in:
jfmcarreira committed 2014-11-04 01:22:23 +00:00
1 parent ff50990742
commit eadc989e8a
3 files changed
+122 -127

No files matched your search

+7 -60
View File
@@ -208,6 +208,13 @@ UInt PlaYUVerFrame::getChromaLength() const
return getChromaWidth() * getChromaHeight();
}
Void PlaYUVerFrame::FrameFromBuffer( Pel *input_buffer, Int pel_format )
{
if( m_iPixelFormat != pel_format )
return;
m_pcPelFormat->frameFromBuffer( input_buffer, m_pppcInputPel, m_uiWidth, m_uiHeight );
}
template<typename T>
Void yuvToRgb( T iY, T iU, T iV, T &iR, T &iG, T &iB )
{
@@ -395,66 +402,6 @@ Void PlaYUVerFrame::FrametoRGB8()
}
}
Void PlaYUVerFrame::FrameFromBuffer( Pel *input_buffer, Int pel_format )
{
if( m_iPixelFormat != pel_format )
{
return;
}
Pel* pcRGBPelInterlaced = m_pcRGBPelInterlaced;
Pel* pInputPelY = m_pppcInputPel[LUMA][0];
Pel *pInputPelU = NULL, *pInputPelV = NULL;
if( m_pppcInputPel[CHROMA_U] )
{
pInputPelU = m_pppcInputPel[CHROMA_U][0];
pInputPelV = m_pppcInputPel[CHROMA_V][0];
}
m_bHasRGBPel = false;
UInt64 frame_bytes_input = m_uiWidth * m_uiHeight;
switch( m_iPixelFormat )
{
case YUV420p:
memcpy( &m_pppcInputPel[LUMA][0][0], input_buffer + frame_bytes_input * 0, frame_bytes_input * sizeof(Pel) );
memcpy( &m_pppcInputPel[CHROMA_U][0][0], input_buffer + frame_bytes_input * 1, frame_bytes_input / 4 * sizeof(Pel) );
memcpy( &m_pppcInputPel[CHROMA_V][0][0], input_buffer + frame_bytes_input * 5 / 4, frame_bytes_input / 4 * sizeof(Pel) );
break;
case YUV444p:
memcpy( &m_pppcInputPel[LUMA][0][0], input_buffer + frame_bytes_input * 0, frame_bytes_input * sizeof(Pel) );
memcpy( &m_pppcInputPel[CHROMA_U][0][0], input_buffer + frame_bytes_input * 1, frame_bytes_input * sizeof(Pel) );
memcpy( &m_pppcInputPel[CHROMA_V][0][0], input_buffer + frame_bytes_input * 2, frame_bytes_input * sizeof(Pel) );
break;
case YUV422p:
memcpy( &m_pppcInputPel[LUMA][0][0], input_buffer + frame_bytes_input * 0, frame_bytes_input * sizeof(Pel) );
memcpy( &m_pppcInputPel[CHROMA_U][0][0], input_buffer + frame_bytes_input * 1, frame_bytes_input / 2 * sizeof(Pel) );
memcpy( &m_pppcInputPel[CHROMA_V][0][0], input_buffer + frame_bytes_input * 3 / 2, frame_bytes_input / 2 * sizeof(Pel) );
break;
case YUYV422:
for( UInt i = 0; i < m_uiHeight * m_uiWidth / 2; i++ )
{
*pInputPelY++ = *input_buffer++;
*pInputPelU++ = *input_buffer++;
*pInputPelY++ = *input_buffer++;
*pInputPelV++ = *input_buffer++;
}
break;
case GRAY:
memcpy( &m_pppcInputPel[LUMA][0][0], input_buffer + frame_bytes_input * 0, frame_bytes_input * sizeof(Pel) );
break;
case RGB8:
memcpy( pcRGBPelInterlaced, input_buffer, frame_bytes_input * sizeof(Pel) * 3 );
for( UInt i = 0; i < m_uiHeight * m_uiWidth; i++ )
{
*pInputPelY++ = *pcRGBPelInterlaced++;
*pInputPelU++ = *pcRGBPelInterlaced++;
*pInputPelV++ = *pcRGBPelInterlaced++;
}
m_bHasRGBPel = true;
break;
}
}
Void PlaYUVerFrame::FrameToBuffer( Pel *output_buffer )
{
+3 -3
View File
@@ -51,9 +51,9 @@ typedef struct
Int ratioChromaWidth;
Int ratioChromaHeight;
Pixel (*getPixelValue)( Pel ***Img, Int xPos, Int yPos );
Void (*frameFromBuffer)( Pel *in, Pel*** out );
Void (*bufferFromFrame)( Pel ***in, Pel* out );
Void (*fillRGBbuffer)( Pel*** in, UChar* out );
Void (*frameFromBuffer)( Pel *in, Pel*** out, UInt width, UInt height );
Void (*bufferFromFrame)( Pel ***in, Pel* out, UInt width, UInt height );
Void (*fillRGBbuffer)( Pel*** in, UChar* out, UInt width, UInt height );
Int ffmpegPelFormat;
} PlaYUVerFramePelFormat;
+112 -64
View File
@@ -40,18 +40,18 @@ namespace plaYUVer
#endif
Void frameFromBuffer_yuv420p( Pel *in, Pel*** out )
Void bufferFromFrame_yuv420p( Pel ***in, Pel* out, UInt width, UInt height )
{
}
Void bufferFromFrame_yuv420p( Pel ***in, Pel* out )
Void fillRGBbuffer_yuv420p( Pel*** in, UChar* out, UInt width, UInt height )
{
}
Void fillRGBbuffer_yuv420p( Pel*** in, UChar* out )
{
}
Pixel getPixelValueYUV420p( Pel ***Img, Int xPos, Int yPos )
{
Pixel pixel_value;
@@ -61,7 +61,12 @@ Pixel getPixelValueYUV420p( Pel ***Img, Int xPos, Int yPos )
pixel_value.ChromaV = Img[CHROMA_V][yPos >> 1][xPos >> 1];
return pixel_value;
}
Void frameFromBufferYUV420p( Pel *in, Pel*** out, UInt width, UInt height )
{
memcpy( &out[LUMA][0][0], in + width * height * 0, width * height * sizeof(Pel) );
memcpy( &out[CHROMA_U][0][0], in + width * height * 1, width * height / 4 * sizeof(Pel) );
memcpy( &out[CHROMA_V][0][0], in + width * height * 5 / 4, width * height / 4 * sizeof(Pel) );
}
PlaYUVerFramePelFormat yuv420p =
{
"YUV420p",
@@ -70,12 +75,19 @@ PlaYUVerFramePelFormat yuv420p =
2,
2,
getPixelValueYUV420p,
frameFromBuffer_yuv420p,
frameFromBufferYUV420p,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV420P ),
};
Void frameFromBufferYUV444p( Pel *in, Pel*** out, UInt width, UInt height )
{
memcpy( &out[LUMA][0][0], in + width * height * 0, width * height * sizeof(Pel) );
memcpy( &out[CHROMA_U][0][0], in + width * height * 1, width * height * sizeof(Pel) );
memcpy( &out[CHROMA_V][0][0], in + width * height * 2, width * height * sizeof(Pel) );
}
Pixel getPixelValueYUV444p( Pel ***Img, Int xPos, Int yPos )
{
Pixel pixel_value;
@@ -85,7 +97,27 @@ Pixel getPixelValueYUV444p( Pel ***Img, Int xPos, Int yPos )
pixel_value.ChromaV = Img[CHROMA_V][yPos][xPos];
return pixel_value;
}
PlaYUVerFramePelFormat yuv444p =
{
"YUV444p",
PlaYUVerFrame::COLOR_YUV,
3,
1,
1,
getPixelValueYUV444p,
frameFromBufferYUV444p,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV444P ),
};
Void frameFromBufferYUV422p( Pel *in, Pel*** out, UInt width, UInt height )
{
memcpy( &out[LUMA][0][0], in + width * height * 0, width * height * sizeof(Pel) );
memcpy( &out[CHROMA_U][0][0], in + width * height * 1, width * height / 2 * sizeof(Pel) );
memcpy( &out[CHROMA_V][0][0], in + width * height * 3 / 2, width * height / 2 * sizeof(Pel) );
}
Pixel getPixelValueYUV422( Pel ***Img, Int xPos, Int yPos )
{
Pixel pixel_value;
@@ -95,6 +127,48 @@ Pixel getPixelValueYUV422( Pel ***Img, Int xPos, Int yPos )
pixel_value.ChromaV = Img[CHROMA_V][yPos][xPos >> 1];
return pixel_value;
}
PlaYUVerFramePelFormat yuv422p =
{
"YUV422p",
PlaYUVerFrame::COLOR_YUV,
3,
2,
1,
getPixelValueYUV422,
frameFromBufferYUV422p,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV422P ),
};
Void frameFromBufferYUV422( Pel *in, Pel*** out, UInt width, UInt height )
{
Pel* pY = out[LUMA][0];
Pel* pU = out[CHROMA_U][0];
Pel* pV = out[CHROMA_V][0];
for( UInt i = 0; i < width * height / 2; i++ )
{
*pY++ = *in++;
*pU++ = *in++;
*pY++ = *in++;
*pV++ = *in++;
}
}
PlaYUVerFramePelFormat yuv422 =
{
"YUV422",
PlaYUVerFrame::COLOR_YUV,
3,
2,
1,
getPixelValueYUV422,
frameFromBufferYUV422,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUYV422 ),
};
Pixel getPixelValueGray( Pel ***Img, Int xPos, Int yPos )
{
@@ -105,6 +179,24 @@ Pixel getPixelValueGray( Pel ***Img, Int xPos, Int yPos )
pixel_value.ChromaV = 0;
return pixel_value;
}
Void frameFromBufferGray( Pel *in, Pel*** out, UInt width, UInt height )
{
memcpy( &out[LUMA][0][0], in, width * height * sizeof(Pel) );
}
PlaYUVerFramePelFormat gray =
{
"GRAY",
PlaYUVerFrame::COLOR_GRAY,
1,
0,
0,
getPixelValueGray,
frameFromBufferGray,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_GRAY8 ),
};
Pixel getPixelValueRGB8( Pel ***Img, Int xPos, Int yPos )
{
@@ -115,63 +207,18 @@ Pixel getPixelValueRGB8( Pel ***Img, Int xPos, Int yPos )
pixel_value.ColorB = Img[COLOR_B][yPos][xPos];
return pixel_value;
}
PlaYUVerFramePelFormat yuv444p =
Void frameFromBufferRGB8( Pel *in, Pel*** out, UInt width, UInt height )
{
"YUV444p",
PlaYUVerFrame::COLOR_YUV,
3,
1,
1,
getPixelValueYUV444p,
frameFromBuffer_yuv420p,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV444P ),
};
PlaYUVerFramePelFormat yuv422p =
{
"YUV422p",
PlaYUVerFrame::COLOR_YUV,
3,
2,
1,
getPixelValueYUV422,
frameFromBuffer_yuv420p,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV422P ),
};
PlaYUVerFramePelFormat yuv422 =
{
"YUV422",
PlaYUVerFrame::COLOR_YUV,
3,
2,
1,
getPixelValueYUV422,
frameFromBuffer_yuv420p,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUYV422 ),
};
PlaYUVerFramePelFormat gray =
{
"GRAY",
PlaYUVerFrame::COLOR_GRAY,
1,
0,
0,
getPixelValueGray,
frameFromBuffer_yuv420p,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_GRAY8 ),
};
Pel* pR = out[COLOR_R][0];
Pel* pG = out[COLOR_G][0];
Pel* pB = out[COLOR_B][0];
for( UInt i = 0; i < width * height; i++ )
{
*pR++ = *in++;
*pG++ = *in++;
*pB++ = *in++;
}
}
PlaYUVerFramePelFormat rgb8 =
{
"RGB8",
@@ -180,12 +227,13 @@ PlaYUVerFramePelFormat rgb8 =
1,
1,
getPixelValueRGB8,
frameFromBuffer_yuv420p,
frameFromBufferRGB8,
bufferFromFrame_yuv420p,
fillRGBbuffer_yuv420p,
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_RGB24 ),
};
extern PlaYUVerFramePelFormat g_PlaYUVerFramePelFormatsList[PLAYUVER_NUMBER_FORMATS] =
{
yuv420p,