Yucom/jxrlib/jxrtestlib/JXRTest.c
2020-09-29 14:29:06 -05:00

315 lines
9 KiB
C

//*@@@+++@@@@******************************************************************
//
// Copyright © Microsoft Corp.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// • Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// • Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
//*@@@---@@@@******************************************************************
#include <JXRTest.h>
//================================================================
const PKIID IID_PKImagePnmEncode = 102;
const PKIID IID_PKImageBmpEncode = 103;
const PKIID IID_PKImageTifEncode = 104;
const PKIID IID_PKImageHdrEncode = 105;
const PKIID IID_PKImageIyuvEncode = 106;
const PKIID IID_PKImageYuv422Encode = 107;
const PKIID IID_PKImageYuv444Encode = 108;
const PKIID IID_PKImageBmpDecode = 202;
const PKIID IID_PKImagePnmDecode = 203;
const PKIID IID_PKImageTifDecode = 204;
const PKIID IID_PKImageHdrDecode = 205;
const PKIID IID_PKImageIyuvDecode = 206;
const PKIID IID_PKImageYuv422Decode = 207;
const PKIID IID_PKImageYuv444Decode = 208;
//================================================================
// Misc supporting functions
//================================================================
extern int PKStrnicmp(const char* s1, const char* s2, size_t c);
//----------------------------------------------------------------
typedef struct tagPKIIDInfo
{
const char* szExt;
const PKIID* pIIDEnc;
const PKIID* pIIDDec;
} PKIIDInfo;
static ERR GetTestInfo(const char* szExt, const PKIIDInfo** ppInfo)
{
ERR err = WMP_errSuccess;
static PKIIDInfo iidInfo[] = {
{".bmp", &IID_PKImageBmpEncode, &IID_PKImageBmpDecode},
{".ppm", &IID_PKImagePnmEncode, &IID_PKImagePnmDecode},
{".pgm", &IID_PKImagePnmEncode, &IID_PKImagePnmDecode},
{".pnm", &IID_PKImagePnmEncode, &IID_PKImagePnmDecode},
{".pfm", &IID_PKImagePnmEncode, &IID_PKImagePnmDecode},
{".tif", &IID_PKImageTifEncode, &IID_PKImageTifDecode},
{".hdr", &IID_PKImageHdrEncode, &IID_PKImageHdrDecode},
{".iyuv", &IID_PKImageIyuvEncode, &IID_PKImageIyuvDecode},
{".yuv422", &IID_PKImageYuv422Encode, &IID_PKImageYuv422Decode},
{".yuv444", &IID_PKImageYuv444Encode, &IID_PKImageYuv444Decode},
};
size_t i = 0;
*ppInfo = NULL;
for (i = 0; i < sizeof2(iidInfo); ++i)
{
if (0 == PKStrnicmp(szExt, iidInfo[i].szExt, strlen(iidInfo[i].szExt)))
{
*ppInfo = &iidInfo[i];
goto Cleanup;
}
}
Call(WMP_errUnsupportedFormat);
Cleanup:
return err;
}
ERR GetTestEncodeIID(const char* szExt, const PKIID** ppIID)
{
ERR err = WMP_errSuccess;
const PKIIDInfo* pInfo = NULL;
Call(GetTestInfo(szExt, &pInfo));
*ppIID = pInfo->pIIDEnc;
Cleanup:
return err;
}
ERR GetTestDecodeIID(const char* szExt, const PKIID** ppIID)
{
ERR err = WMP_errSuccess;
const PKIIDInfo* pInfo = NULL;
Call(GetTestInfo(szExt, &pInfo));
*ppIID = pInfo->pIIDDec;
Cleanup:
return err;
}
//================================================================
// PKTestFactory
//================================================================
ERR PKTestFactory_CreateCodec(const PKIID* iid, void** ppv)
{
ERR err = WMP_errSuccess;
if (IID_PKImageBmpEncode == *iid)
{
Call(PKImageEncode_Create_BMP((PKImageEncode**)ppv));
}
else if (IID_PKImagePnmEncode == *iid)
{
Call(PKImageEncode_Create_PNM((PKImageEncode**)ppv));
}
else if (IID_PKImageTifEncode == *iid)
{
Call(PKImageEncode_Create_TIF((PKImageEncode**)ppv));
}
else if (IID_PKImageHdrEncode == *iid)
{
Call(PKImageEncode_Create_HDR((PKImageEncode**)ppv));
}
else if (IID_PKImageIyuvEncode == *iid)
{
Call(PKImageEncode_Create_IYUV((PKImageEncode**)ppv));
}
else if (IID_PKImageYuv422Encode == *iid)
{
Call(PKImageEncode_Create_YUV422((PKImageEncode**)ppv));
}
else if (IID_PKImageYuv444Encode == *iid)
{
Call(PKImageEncode_Create_YUV444((PKImageEncode**)ppv));
}
else if (IID_PKImageBmpDecode == *iid)
{
Call(PKImageDecode_Create_BMP((PKTestDecode**)ppv));
}
else if (IID_PKImagePnmDecode == *iid)
{
Call(PKImageDecode_Create_PNM((PKTestDecode**)ppv));
}
else if (IID_PKImageTifDecode == *iid)
{
Call(PKImageDecode_Create_TIF((PKTestDecode**)ppv));
}
else if (IID_PKImageHdrDecode == *iid)
{
Call(PKImageDecode_Create_HDR((PKTestDecode**)ppv));
}
else if (IID_PKImageIyuvDecode == *iid)
{
Call(PKImageDecode_Create_IYUV((PKTestDecode**)ppv));
}
else if (IID_PKImageYuv422Decode == *iid)
{
Call(PKImageDecode_Create_YUV422((PKTestDecode**)ppv));
}
else if (IID_PKImageYuv444Decode == *iid)
{
Call(PKImageDecode_Create_YUV444((PKTestDecode**)ppv));
}
else
{
Call(WMP_errUnsupportedFormat);
}
Cleanup:
return err;
}
ERR PKTestFactory_CreateDecoderFromFile(const char* szFilename, PKImageDecode** ppDecoder)
{
ERR err = WMP_errSuccess;
char *pExt = NULL;
PKIID* pIID = NULL;
struct WMPStream* pStream = NULL;
PKImageDecode* pDecoder = NULL;
// get file extension
pExt = strrchr(szFilename, '.');
FailIf(NULL == pExt, WMP_errUnsupportedFormat);
// get decode PKIID
Call(GetTestDecodeIID(pExt, &pIID));
// create stream
Call(CreateWS_File(&pStream, szFilename, "rb"));
// Create decoder
Call(PKTestFactory_CreateCodec(pIID, ppDecoder));
pDecoder = *ppDecoder;
// attach stream to decoder
Call(pDecoder->Initialize(pDecoder, pStream));
pDecoder->fStreamOwner = !0;
Cleanup:
return err;
}
ERR PKCreateTestFactory(PKCodecFactory** ppCFactory, U32 uVersion)
{
ERR err = WMP_errSuccess;
PKCodecFactory* pCFactory = NULL;
UNREFERENCED_PARAMETER( uVersion );
Call(PKAlloc(ppCFactory, sizeof(**ppCFactory)));
pCFactory = *ppCFactory;
pCFactory->CreateCodec = PKTestFactory_CreateCodec;
pCFactory->CreateDecoderFromFile = PKTestFactory_CreateDecoderFromFile;
pCFactory->CreateFormatConverter = PKCodecFactory_CreateFormatConverter;
pCFactory->Release = PKCreateCodecFactory_Release;
Cleanup:
return err;
}
//================================================================
// PKTestDecode
//================================================================
ERR PKTestDecode_Initialize(
PKTestDecode* pID,
struct WMPStream* pStream)
{
ERR err = WMP_errSuccess;
pID->pStream = pStream;
pID->guidPixFormat = GUID_PKPixelFormatDontCare;
pID->fResX = 96;
pID->fResY = 96;
pID->cFrame = 1;
Call(pID->pStream->GetPos(pID->pStream, &pID->offStart));
Cleanup:
return WMP_errSuccess;
}
ERR PKTestDecode_Copy(
PKTestDecode* pID,
const PKRect* pRect,
U8* pb,
U32 cbStride)
{
UNREFERENCED_PARAMETER( pID );
UNREFERENCED_PARAMETER( pRect );
UNREFERENCED_PARAMETER( pb );
UNREFERENCED_PARAMETER( cbStride );
return WMP_errAbstractMethod;
}
ERR PKTestDecode_Release(
PKTestDecode** ppID)
{
PKTestDecode* pID = *ppID;
pID->fStreamOwner && pID->pStream->Close(&pID->pStream);
return PKFree(ppID);
}
ERR PKTestDecode_Create(
PKTestDecode** ppID)
{
ERR err = WMP_errSuccess;
PKTestDecode* pID = NULL;
Call(PKAlloc(ppID, sizeof(**ppID)));
pID = *ppID;
pID->Initialize = PKTestDecode_Initialize;
pID->GetPixelFormat = PKImageDecode_GetPixelFormat;
pID->GetSize = PKImageDecode_GetSize;
pID->GetResolution = PKImageDecode_GetResolution;
pID->GetColorContext = PKImageDecode_GetColorContext;
pID->GetDescriptiveMetadata = PKImageDecode_GetDescriptiveMetadata;
pID->Copy = PKTestDecode_Copy;
pID->GetFrameCount = PKImageDecode_GetFrameCount;
pID->SelectFrame = PKImageDecode_SelectFrame;
pID->Release = PKTestDecode_Release;
Cleanup:
return err;
}