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 ilPKCodecFactory_CreateDecoderFromFile(PKImageDecode** ppDecoder) { ERR err = WMP_errSuccess; char *pExt = ".wdp"; // We are loading a WDP file, so we have to tell the library that with this extension. PKIID* pIID = NULL; struct WMPStream* pStream = NULL; PKImageDecode* pDecoder = NULL; // get decode PKIID Call(GetImageDecodeIID(pExt, &pIID)); // create stream Call(ilCreateWS_File(&pStream, NULL, "rb")); // Create decoder Call(PKCodecFactory_CreateCodec(pIID, ppDecoder)); pDecoder = *ppDecoder; // attach stream to decoder Call(pDecoder->Initialize(pDecoder, pStream)); pDecoder->fStreamOwner = !0; Cleanup: return err; }
ERR PKCodecFactory_CreateDecoderFromFile(const char* szFilename, PKImageDecode** ppDecoder) { ERR err = WMP_errSuccess; char *pExt = NULL; const 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(GetImageDecodeIID(pExt, &pIID)); // create stream Call(CreateWS_File(&pStream, szFilename, "rb")); // Create decoder #if 0 Call(PKCodecFactory_CreateCodec(pIID, (void **) ppDecoder)); #else // We know we are creating a decoder here Call(PKImageDecode_Create_WMP(ppDecoder)); #endif pDecoder = *ppDecoder; // attach stream to decoder Call(pDecoder->Initialize(pDecoder, pStream)); pDecoder->fStreamOwner = !0; Cleanup: return err; }
//================================================================ // main function //================================================================ int #ifndef __ANSI__ __cdecl #endif // __ANSI__ main(int argc, char* argv[]) { if (argc != 5) { fprintf(stderr, "Required arguments:\n"); fprintf(stderr, "1. JPEG quality value, 0-100\n"); fprintf(stderr, "2. Image size (e.g. '512x512')\n"); fprintf(stderr, "3. Path to YUV input file\n"); fprintf(stderr, "4. Path to JXR output file\n"); return 1; } errno = 0; long quality = strtol(argv[1], NULL, 10); if (errno != 0 || quality < 0 || quality > 100) { fprintf(stderr, "Invalid JPEG quality value!\n"); return 1; } const char *size = argv[2]; const char *x = strchr(size, 'x'); if (!x && x != size && x != (x + strlen(x) - 1)) { fprintf(stderr, "Invalid image size input!\n"); return 1; } long width = strtol(size, NULL, 10); if (errno != 0) { fprintf(stderr, "Invalid image size input!\n"); return 1; } long height = strtol(x + 1, NULL, 10); if (errno != 0) { fprintf(stderr, "Invalid image size input!\n"); return 1; } /* Right now we only support dimensions that are multiples of 16. */ if ((width % 16) != 0 || (height % 16) != 0) { fprintf(stderr, "Image dimensions must be multiples of 16!\n"); return 1; } /* Will check these for validity when opening via 'fopen'. */ const char *yuv_path = argv[3]; const char *jxr_path = argv[4]; int yuv_size = width*height+2*(width>>1)*(height>>1); unsigned char *image_buffer = (unsigned char*)malloc(yuv_size); // set encoder parameters including quality { CWMIStrCodecParam params; init_encoder_params(¶ms, quality); // run encoder ERR err; PKFactory* pFactory = NULL; PKCodecFactory* pCodecFactory = NULL; struct WMPStream* pEncodeStream = NULL; PKImageEncode* pEncoder = NULL; const PKIID* pIID = NULL; struct WMPStream* pDecodeStream = NULL; PKImageDecode* pDecoder = NULL; Call( PKCreateFactory(&pFactory, PK_SDK_VERSION) ); Call( pFactory->CreateStreamFromFilename(&pEncodeStream, jxr_path, "wb") ); Call( pFactory->CreateStreamFromFilename(&pDecodeStream, yuv_path, "rb") ); // decode PKRect rc; rc.X = 0; rc.Y = 0; rc.Width = width; rc.Height = height; Call( GetTestDecodeIID(".iyuv", &pIID) ); Call( PKTestFactory_CreateCodec(pIID, (void **) &pDecoder) ); Call( pDecoder->Initialize(pDecoder, pDecodeStream) ); pDecoder->uWidth = width; pDecoder->uHeight = height; Call( pDecoder->Copy(pDecoder, &rc, (U8*)image_buffer, width) ); Call( PKCreateCodecFactory(&pCodecFactory, WMP_SDK_VERSION) ); Call( pCodecFactory->CreateCodec(&IID_PKImageWmpEncode, (void**)&pEncoder) ); Call( pEncoder->Initialize(pEncoder, pEncodeStream, ¶ms, sizeof(params)) ); Call( pEncoder->SetPixelFormat(pEncoder, GUID_PKPixelFormat12bppYCC420) ); Call( pEncoder->SetSize(pEncoder, width, height) ); Call( pEncoder->WritePixels(pEncoder, height, (U8*)image_buffer, width*3) ); Cleanup: if( pDecoder ) pDecoder->Release(&pDecoder); if( pEncoder ) pEncoder->Release(&pEncoder); if( pCodecFactory ) pCodecFactory->Release(&pCodecFactory); if( pFactory ) pFactory->Release(&pFactory); } free(image_buffer); return 0; }
static FIBITMAP * DLL_CALLCONV Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) { PKImageDecode *pDecoder = NULL; // decoder interface ERR error_code = 0; // error code as returned by the interface PKPixelFormatGUID guid_format; // loaded pixel format (== input file pixel format if no conversion needed) FREE_IMAGE_TYPE image_type = FIT_UNKNOWN; // input image type unsigned bpp = 0; // input image bit depth FIBITMAP *dib = NULL; // get the I/O stream wrapper WMPStream *pDecodeStream = (WMPStream*)data; if(!handle || !pDecodeStream) { return NULL; } BOOL header_only = (flags & FIF_LOAD_NOPIXELS) == FIF_LOAD_NOPIXELS; try { int width, height; // image dimensions (in pixels) // create a JXR decoder interface and initialize function pointers with *_WMP functions error_code = PKImageDecode_Create_WMP(&pDecoder); JXR_CHECK(error_code); // attach the stream to the decoder ... // ... then read the image container and the metadata error_code = pDecoder->Initialize(pDecoder, pDecodeStream); JXR_CHECK(error_code); // set decoder parameters SetDecoderParameters(pDecoder, flags); // get dst image format specifications unsigned red_mask = 0, green_mask = 0, blue_mask = 0; error_code = GetInputPixelFormat(pDecoder, &guid_format, &image_type, &bpp, &red_mask, &green_mask, &blue_mask); JXR_CHECK(error_code); // get image dimensions pDecoder->GetSize(pDecoder, &width, &height); // allocate dst image { dib = FreeImage_AllocateHeaderT(header_only, image_type, width, height, bpp, red_mask, green_mask, blue_mask); if(!dib) { throw FI_MSG_ERROR_DIB_MEMORY; } if(FreeImage_GetBPP(dib) == 1) { // BD_1 - build a FIC_MINISBLACK palette RGBQUAD *pal = FreeImage_GetPalette(dib); pal[0].rgbRed = pal[0].rgbGreen = pal[0].rgbBlue = 0; pal[1].rgbRed = pal[1].rgbGreen = pal[1].rgbBlue = 255; } } // get image resolution { float resX, resY; // image resolution (in dots per inch) // convert from English units, i.e. dots per inch to universal units, i.e. dots per meter pDecoder->GetResolution(pDecoder, &resX, &resY); FreeImage_SetDotsPerMeterX(dib, (unsigned)(resX / 0.0254F + 0.5F)); FreeImage_SetDotsPerMeterY(dib, (unsigned)(resY / 0.0254F + 0.5F)); } // get metadata & ICC profile error_code = ReadMetadata(pDecoder, dib); JXR_CHECK(error_code); if(header_only) { // header only mode ... // free the decoder pDecoder->Release(&pDecoder); assert(pDecoder == NULL); return dib; } // copy pixels into the dib, perform pixel conversion if needed error_code = CopyPixels(pDecoder, guid_format, dib, width, height); JXR_CHECK(error_code); // free the decoder pDecoder->Release(&pDecoder); assert(pDecoder == NULL); return dib; } catch (const char *message) { // unload the dib FreeImage_Unload(dib); // free the decoder pDecoder->Release(&pDecoder); if(NULL != message) { FreeImage_OutputMessageProc(s_format_id, message); } } return NULL; }