diff --git a/source/lib/PlaYUVerFrame.cpp b/source/lib/PlaYUVerFrame.cpp index a68f797..3a88da7 100644 --- a/source/lib/PlaYUVerFrame.cpp +++ b/source/lib/PlaYUVerFrame.cpp @@ -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 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 ) { diff --git a/source/lib/PlaYUVerFrame.h b/source/lib/PlaYUVerFrame.h index e5fcd61..47f8798 100644 --- a/source/lib/PlaYUVerFrame.h +++ b/source/lib/PlaYUVerFrame.h @@ -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; diff --git a/source/lib/PlaYUVerFramePixelFormats.cpp b/source/lib/PlaYUVerFramePixelFormats.cpp index d256ea5..dcad864 100644 --- a/source/lib/PlaYUVerFramePixelFormats.cpp +++ b/source/lib/PlaYUVerFramePixelFormats.cpp @@ -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,