Avoid calling CCYUV422toYUV420::New() for each thumbnail
diff --git a/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_mio_video.cpp b/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_mio_video.cpp
index 9fb2b30..8801819 100644
--- a/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_mio_video.cpp
+++ b/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_mio_video.cpp
@@ -20,7 +20,6 @@
#include "pv_mime_string_utils.h"
#include "oscl_snprintf.h"
#include "cczoomrotationbase.h"
-#include "ccyuv422toyuv420.h"
PVFMVideoMIO::PVFMVideoMIO() :
OsclTimerObject(OsclActiveObject::EPriorityNominal, "PVFMVideoMIO")
@@ -78,6 +77,8 @@
iInputFormatCapability.push_back(PVMF_MIME_RGB12);
iInputFormatCapability.push_back(PVMF_MIME_RGB16);
iInputFormatCapability.push_back(PVMF_MIME_RGB24);
+
+ iYUV422toYUV420ColorConvert = NULL;
}
@@ -131,6 +132,11 @@
{
DestroyYUVToRGBColorConverter(iColorConverter, iCCRGBFormatType);
}
+
+ if (iYUV422toYUV420ColorConvert)
+ {
+ DestroyYUV422toYUV420ColorConvert();
+ }
}
void PVFMVideoMIO::setThumbnailDimensions(uint32 aWidth, uint32 aHeight)
@@ -827,58 +833,61 @@
if (aSrcBuffer == NULL || aSrcSize == 0 || aSrcFormat == PVMF_MIME_FORMAT_UNKNOWN ||
aDestBuffer == NULL || aDestSize == 0 || aDestFormat == PVMF_MIME_FORMAT_UNKNOWN)
{
- PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() Color converter instantiation did a leave"));
+ PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() bad input arguments."));
return PVMFErrArgument;
}
if ((iVideoSubFormat == PVMF_MIME_YUV422_INTERLEAVED_UYVY) &&
(aDestFormat == PVMF_MIME_YUV420))
{
- int32 leavecode = 0;
- CCYUV422toYUV420 *yuv_convert = NULL;
+ // Source is YUV 4:2:2 and dest is YUV 4:2:0
- OSCL_TRY(leavecode, yuv_convert = (CCYUV422toYUV420*) CCYUV422toYUV420::New());
-
- OSCL_FIRST_CATCH_ANY(leavecode,
- PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() YUV Color converter instantiation did a leave"));
- return PVMFErrNoResources;
- );
-
- if (!(yuv_convert->Init((aSrcWidth + 1)&(~1), (aSrcHeight + 1)&(~1), (aSrcWidth + 1)&(~1),
- (aSrcWidth + 1)&(~1), (aSrcHeight + 1)&(~1), (aSrcWidth + 1)&(~1),
- CCROTATE_NONE)))
+ PVMFStatus status;
+ uint32 yuvbufsize;
+ if (!iYUV422toYUV420ColorConvert)
{
- PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() YUV Color converter Init failed"));
- OSCL_DELETE(yuv_convert);
- return PVMFFailure;
+ status = CreateYUV422toYUV420ColorConvert();
+ if (status != PVMFSuccess)
+ {
+ // Failed to create the CC!
+ PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() Failed to create iYUV422toYUV420ColorConvert."));
+ return status;
+ }
}
- uint32 yuvbufsize = (uint32)(yuv_convert->GetOutputBufferSize());
+ // Init CC
+ status = InitYUV422toYUV420ColorConvert(aSrcWidth, aSrcHeight, aDestWidth, aDestHeight);
+ if (status != PVMFSuccess)
+ {
+ PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() iYUV422toYUV420ColorConvert Init failed"));
+ return status;
+ }
+
+ yuvbufsize = (uint32)(iYUV422toYUV420ColorConvert->GetOutputBufferSize());
+
+ // Is the CC destination buffer smaller that the expected destination buffer size?
if (yuvbufsize > aDestSize)
{
- PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() Specified output YUV buffer does not have enough space. Needed %d Available %d", yuvbufsize, aDestSize));
- // Specified buffer does not have enough space
- OSCL_DELETE(yuv_convert);
- return PVMFErrArgument;
+ PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() Specified output YUV buffer does not have enough space. Needed %d Available %d.", yuvbufsize, aDestSize));
+ return PVMFErrResource;
}
- if (yuv_convert->Convert(aSrcBuffer, aDestBuffer) == 0)
+ // Convert
+ if (iYUV422toYUV420ColorConvert->Convert(aSrcBuffer, aDestBuffer) == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() YUV Color conversion failed"));
- OSCL_DELETE(yuv_convert);
return PVMFErrResource;
}
// Save the YUV frame size
aDestSize = yuvbufsize;
- OSCL_DELETE(yuv_convert);
}
else if (aSrcFormat == aDestFormat)
{
// Same format so direct copy
if (aDestSize < aSrcSize)
{
- PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() Color converter instantiation did a leave"));
+ PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CopyVideoFrameData() destination and source size differ"));
return PVMFErrArgument;
}
@@ -1428,4 +1437,33 @@
while (--count);
}
+PVMFStatus PVFMVideoMIO::CreateYUV422toYUV420ColorConvert()
+{
+ int32 leavecode = 0;
+ OSCL_TRY(leavecode, iYUV422toYUV420ColorConvert = (CCYUV422toYUV420*) CCYUV422toYUV420::New());
+
+ OSCL_FIRST_CATCH_ANY(leavecode,
+ PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::CreateYUV422toYUV420ColorConvert() YUV Color converter instantiation did a leave"));
+ return PVMFErrNoResources;
+ );
+ return PVMFSuccess;
+}
+
+PVMFStatus PVFMVideoMIO::InitYUV422toYUV420ColorConvert(uint32 aSrcWidth, uint32 aSrcHeight, uint32 aDestWidth, uint32 aDestHeight)
+{
+ if (!(iYUV422toYUV420ColorConvert->Init((aSrcWidth + 1)&(~1), (aSrcHeight + 1)&(~1),
+ (aSrcWidth + 1)&(~1),(aDestWidth + 1)&(~1), (aDestHeight + 1)&(~1),
+ (aDestWidth + 1)&(~1), CCROTATE_NONE)))
+ {
+ PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "PVFMVideoMIO::InitYUV422toYUV420ColorConvert: YUV Color converter Init failed"));
+ return PVMFFailure;
+ }
+ return PVMFSuccess;
+}
+
+void PVFMVideoMIO::DestroyYUV422toYUV420ColorConvert()
+{
+ OSCL_DELETE(iYUV422toYUV420ColorConvert);
+ iYUV422toYUV420ColorConvert = NULL;
+}
diff --git a/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_mio_video.h b/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_mio_video.h
index 5cc3b4e..a9826f3 100644
--- a/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_mio_video.h
+++ b/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_mio_video.h
@@ -39,6 +39,9 @@
#ifndef PVMI_MEDIA_IO_CLOCK_EXTENSION_H_INCLUDED
#include "pvmi_media_io_clock_extension.h"
#endif
+#ifndef CCYUV422TOYUV420_H_INCLUDED
+#include "ccyuv422toyuv420.h"
+#endif
class PVLogger;
class PVMFMediaClock;
@@ -165,6 +168,11 @@
PVMFStatus DestroyYUVToRGBColorConverter(ColorConvertBase*& aCC, PVMFFormatType aRGBFormatType);
void convertYUV420SPtoYUV420(void* src, void* dst, uint32 len);
+ PVMFStatus CreateYUV422toYUV420ColorConvert();
+ PVMFStatus InitYUV422toYUV420ColorConvert(uint32 aSrcWidth, uint32 aSrcHeight,
+ uint32 aDestWidth, uint32 aDestHeight);
+ void DestroyYUV422toYUV420ColorConvert();
+
PvmiMediaTransfer* iPeer;
// The PvmiMIOControl class observer.
@@ -262,6 +270,8 @@
PVFMVideoMIOFrameRetrieval iFrameRetrievalInfo;
Oscl_Vector<PVMFFormatType, OsclMemAllocator> iInputFormatCapability;
+
+ CCYUV422toYUV420 *iYUV422toYUV420ColorConvert;
};
#endif // PV_FRAME_METADATA_MIO_VIDEO_H_INCLUDED