/src/freeimage-svn/FreeImage/trunk/Source/LibJXR/jxrgluelib/JXRGlue.c
Line  | Count  | Source  | 
1  |  | //*@@@+++@@@@******************************************************************  | 
2  |  | //  | 
3  |  | // Copyright © Microsoft Corp.  | 
4  |  | // All rights reserved.  | 
5  |  | //   | 
6  |  | // Redistribution and use in source and binary forms, with or without  | 
7  |  | // modification, are permitted provided that the following conditions are met:  | 
8  |  | //   | 
9  |  | // • Redistributions of source code must retain the above copyright notice,  | 
10  |  | //   this list of conditions and the following disclaimer.  | 
11  |  | // • Redistributions in binary form must reproduce the above copyright notice,  | 
12  |  | //   this list of conditions and the following disclaimer in the documentation  | 
13  |  | //   and/or other materials provided with the distribution.  | 
14  |  | //   | 
15  |  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  | 
16  |  | // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | 
17  |  | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  | 
18  |  | // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE  | 
19  |  | // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  | 
20  |  | // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  | 
21  |  | // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  | 
22  |  | // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  | 
23  |  | // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  | 
24  |  | // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  | 
25  |  | // POSSIBILITY OF SUCH DAMAGE.  | 
26  |  | //  | 
27  |  | //*@@@---@@@@******************************************************************  | 
28  |  | #include <stdlib.h>  | 
29  |  | #include <ctype.h>  | 
30  |  |  | 
31  |  | #define INITGUID  | 
32  |  | #include <JXRGlue.h>  | 
33  |  |  | 
34  |  | //================================================================  | 
35  |  | const PKIID IID_PKImageScanEncode = 1;  | 
36  |  | const PKIID IID_PKImageFrameEncode = 2;  | 
37  |  |  | 
38  |  | const PKIID IID_PKImageUnsupported = 100;  | 
39  |  | const PKIID IID_PKImageWmpEncode = 101;  | 
40  |  |  | 
41  |  | const PKIID IID_PKImageWmpDecode = 201;  | 
42  |  |  | 
43  |  | //================================================================  | 
44  |  | // Misc supporting functions  | 
45  |  | //================================================================  | 
46  |  | ERR PKAlloc(void** ppv, size_t cb)  | 
47  | 0  | { | 
48  | 0  |     *ppv = calloc(1, cb);  | 
49  | 0  |     return *ppv ? WMP_errSuccess : WMP_errOutOfMemory;  | 
50  | 0  | }  | 
51  |  |  | 
52  |  |  | 
53  |  | ERR PKFree(void** ppv)  | 
54  | 0  | { | 
55  | 0  |   if (ppv) { | 
56  | 0  |     free(*ppv);  | 
57  | 0  |     *ppv = NULL;  | 
58  | 0  |   }  | 
59  |  | 
  | 
60  | 0  |   return WMP_errSuccess;  | 
61  | 0  | }  | 
62  |  |  | 
63  |  | ERR PKAllocAligned(void** ppv, size_t cb, size_t iAlign)  | 
64  | 0  | { | 
65  | 0  |     U8          *pOrigPtr;  | 
66  | 0  |     U8          *pReturnedPtr;  | 
67  | 0  |     size_t       iAlignmentCorrection;  | 
68  | 0  |     const size_t c_cbBlockSize = cb + sizeof(void*) + iAlign - 1;  | 
69  |  | 
  | 
70  | 0  |     *ppv = NULL;  | 
71  | 0  |     pOrigPtr = calloc(1, c_cbBlockSize);  | 
72  | 0  |   if (NULL == pOrigPtr) { | 
73  | 0  |     return WMP_errOutOfMemory;  | 
74  | 0  |   }  | 
75  |  |  | 
76  | 0  |     iAlignmentCorrection = iAlign - ((size_t)pOrigPtr % iAlign);  | 
77  | 0  |   if (iAlignmentCorrection < sizeof(void*)) { | 
78  |  |     // Alignment correction won't leave us enough space to store pOrigPtr - advance to next block  | 
79  | 0  |     iAlignmentCorrection += iAlign;  | 
80  | 0  |   }  | 
81  |  | 
  | 
82  | 0  |     assert(iAlignmentCorrection >= sizeof(void*)); // Alignment correction must have space for pOrigPtr  | 
83  | 0  |     assert(iAlignmentCorrection + cb <= c_cbBlockSize); // Don't exceed right edge of memory block  | 
84  |  | 
  | 
85  | 0  |     pReturnedPtr = pOrigPtr + iAlignmentCorrection;  | 
86  | 0  |     *(void**)(pReturnedPtr - sizeof(void*)) = pOrigPtr;  | 
87  |  | 
  | 
88  | 0  |     assert(0 == ((size_t)pReturnedPtr % iAlign)); // Are we in fact aligned?  | 
89  | 0  |     *ppv = pReturnedPtr;  | 
90  | 0  |     return WMP_errSuccess;  | 
91  | 0  | }  | 
92  |  |  | 
93  |  | ERR PKFreeAligned(void** ppv)  | 
94  | 0  | { | 
95  | 0  |     if (ppv && *ppv) { | 
96  | 0  |         U8 **ppOrigPtr = (U8**)((U8*)(*ppv) - sizeof(void*));  | 
97  | 0  |         assert(*ppOrigPtr <= (U8*)ppOrigPtr); // Something's wrong if pOrigPtr points forward  | 
98  | 0  |         free(*ppOrigPtr);  | 
99  | 0  |         *ppv = NULL;  | 
100  | 0  |     }  | 
101  | 0  |     return WMP_errSuccess;  | 
102  | 0  | }  | 
103  |  |  | 
104  |  |  | 
105  |  |  | 
106  |  | int PKStrnicmp(const char* s1, const char* s2, size_t c)  | 
107  | 0  | { | 
108  | 0  |     for(; tolower(*s1) == tolower(*s2) && *s1 && *s2 && c; ++s1, ++s2, --c);  | 
109  | 0  |     return c ? *s1 - *s2 : 0;  | 
110  | 0  | }  | 
111  |  |  | 
112  |  | static const PKPixelInfo pixelInfo[] =  | 
113  |  | { | 
114  |  |     {&GUID_PKPixelFormatDontCare, 1, Y_ONLY, BD_8, 8, PK_pixfmtNul, 0, 0, 0, 0}, | 
115  |  |  | 
116  |  |     // Gray  | 
117  |  |     //{&GUID_PKPixelFormat2bppGray, 1, Y_ONLY, BD_8, 2, PK_pixfmtNul}, | 
118  |  |     //{&GUID_PKPixelFormat4bppGray, 1, Y_ONLY, BD_8, 4, PK_pixfmtNul}, | 
119  |  |  | 
120  |  |     {&GUID_PKPixelFormatBlackWhite, 1, Y_ONLY, BD_1, 1, PK_pixfmtNul,               1, 1, 1, 1},//BlackIsZero is default for GUID_PKPixelFormatBlackWhite | 
121  |  |     {&GUID_PKPixelFormatBlackWhite, 1, Y_ONLY, BD_1, 1, PK_pixfmtNul,               0, 1, 1, 1},//WhiteIsZero | 
122  |  |     {&GUID_PKPixelFormat8bppGray, 1, Y_ONLY, BD_8, 8, PK_pixfmtNul,                 1, 1, 8, 1}, | 
123  |  |     {&GUID_PKPixelFormat16bppGray, 1, Y_ONLY, BD_16, 16, PK_pixfmtNul,              1, 1, 16, 1}, | 
124  |  |     {&GUID_PKPixelFormat16bppGrayFixedPoint, 1, Y_ONLY, BD_16S, 16, PK_pixfmtNul,   1, 1, 16, 2}, | 
125  |  |     {&GUID_PKPixelFormat16bppGrayHalf, 1, Y_ONLY, BD_16F, 16, PK_pixfmtNul,         1, 1, 16, 3}, | 
126  |  |     //{&GUID_PKPixelFormat32bppGray, 1, Y_ONLY, BD_32, 32, PK_pixfmtNul,              1, 1, 32, 1}, | 
127  |  |     {&GUID_PKPixelFormat32bppGrayFixedPoint, 1, Y_ONLY, BD_32S, 32, PK_pixfmtNul,   1, 1, 32, 2}, | 
128  |  |     {&GUID_PKPixelFormat32bppGrayFloat, 1, Y_ONLY, BD_32F, 32, PK_pixfmtNul,        1, 1, 32, 3}, | 
129  |  |  | 
130  |  |     // RGB  | 
131  |  |     {&GUID_PKPixelFormat24bppRGB, 3, CF_RGB, BD_8, 24, PK_pixfmtNul,                2, 3, 8, 1}, | 
132  |  |     {&GUID_PKPixelFormat24bppBGR, 3, CF_RGB, BD_8, 24, PK_pixfmtBGR,                2, 3, 8, 1}, | 
133  |  |     {&GUID_PKPixelFormat32bppRGB, 3, CF_RGB, BD_8, 32, PK_pixfmtNul,                2, 3, 8, 1}, | 
134  |  |     {&GUID_PKPixelFormat32bppBGR, 3, CF_RGB, BD_8, 32, PK_pixfmtBGR,                2, 3, 8, 1}, | 
135  |  |     {&GUID_PKPixelFormat48bppRGB, 3, CF_RGB, BD_16, 48, PK_pixfmtNul,               2, 3, 16, 1}, | 
136  |  |     {&GUID_PKPixelFormat48bppRGBFixedPoint, 3, CF_RGB, BD_16S, 48, PK_pixfmtNul,    2, 3, 16, 2}, | 
137  |  |     {&GUID_PKPixelFormat48bppRGBHalf, 3, CF_RGB, BD_16F, 48, PK_pixfmtNul,          2, 3, 16, 3}, | 
138  |  |     {&GUID_PKPixelFormat64bppRGBFixedPoint, 3, CF_RGB, BD_16S, 64, PK_pixfmtNul,    2, 3, 16, 2}, | 
139  |  |     {&GUID_PKPixelFormat64bppRGBHalf, 3, CF_RGB, BD_16F, 64, PK_pixfmtNul,          2, 3, 16, 3}, | 
140  |  |     //{&GUID_PKPixelFormat96bppRGB, 3, CF_RGB, BD_32, 96, PK_pixfmtNul,               2, 3, 32, 1}, | 
141  |  |     {&GUID_PKPixelFormat96bppRGBFixedPoint, 3, CF_RGB, BD_32S, 96, PK_pixfmtNul,    2, 3, 32, 2}, | 
142  |  |     {&GUID_PKPixelFormat96bppRGBFloat, 3, CF_RGB, BD_32F, 96, PK_pixfmtNul,         2, 3, 32, 3}, | 
143  |  |     {&GUID_PKPixelFormat128bppRGBFixedPoint, 3, CF_RGB, BD_32S, 128, PK_pixfmtNul,  2, 3, 32, 2}, | 
144  |  |     {&GUID_PKPixelFormat128bppRGBFloat, 3, CF_RGB, BD_32F, 128, PK_pixfmtNul,       2, 3, 32, 3}, | 
145  |  |  | 
146  |  |     // RGBA  | 
147  |  |     {&GUID_PKPixelFormat32bppBGRA, 4, CF_RGB, BD_8, 32, PK_pixfmtHasAlpha | PK_pixfmtBGR,  2, 4, 8, 1}, | 
148  |  |     {&GUID_PKPixelFormat32bppRGBA, 4, CF_RGB, BD_8, 32, PK_pixfmtHasAlpha,                 2, 4, 8, 1}, | 
149  |  |     {&GUID_PKPixelFormat64bppRGBA, 4, CF_RGB, BD_16, 64, PK_pixfmtHasAlpha,                2, 4, 16, 1}, | 
150  |  |     {&GUID_PKPixelFormat64bppRGBAFixedPoint, 4, CF_RGB, BD_16S, 64, PK_pixfmtHasAlpha,     2, 4, 16, 2}, | 
151  |  |     {&GUID_PKPixelFormat64bppRGBAHalf, 4, CF_RGB, BD_16F, 64, PK_pixfmtHasAlpha,           2, 4, 16, 3}, | 
152  |  |     //{&GUID_PKPixelFormat128bppRGBA, 4, CF_RGB, BD_32, 128, PK_pixfmtHasAlpha,              2, 4, 32, 1}, | 
153  |  |     {&GUID_PKPixelFormat128bppRGBAFixedPoint, 4, CF_RGB, BD_32S, 128, PK_pixfmtHasAlpha,   2, 4, 32, 2}, | 
154  |  |     {&GUID_PKPixelFormat128bppRGBAFloat, 4, CF_RGB, BD_32F, 128, PK_pixfmtHasAlpha,        2, 4, 32, 3}, | 
155  |  |  | 
156  |  |     // PRGBA  | 
157  |  |     {&GUID_PKPixelFormat32bppPBGRA, 4, CF_RGB, BD_8, 32, PK_pixfmtHasAlpha | PK_pixfmtPreMul | PK_pixfmtBGR,   2, 4, 8, 1}, | 
158  |  |     {&GUID_PKPixelFormat32bppPRGBA, 4, CF_RGB, BD_8, 32, PK_pixfmtHasAlpha | PK_pixfmtPreMul,                  2, 4, 8, 1}, | 
159  |  |     {&GUID_PKPixelFormat64bppPRGBA, 4, CF_RGB, BD_16, 64, PK_pixfmtHasAlpha | PK_pixfmtPreMul,                 2, 4, 16, 1}, | 
160  |  |     //{&GUID_PKPixelFormat64bppPRGBAFixedPoint, 4, CF_RGB, BD_16S, 64, PK_pixfmtHasAlpha,      2, 4, 16, 2}, | 
161  |  |     //{&GUID_PKPixelFormat64bppPRGBAHalf, 4, CF_RGB, BD_16F, 64, PK_pixfmtHasAlpha,            2, 4, 16, 3}, | 
162  |  |     //{&GUID_PKPixelFormat128bppPRGBAFixedPoint, 4, CF_RGB, BD_32S, 128, PK_pixfmtHasAlpha,    2, 4, 32, 2}, | 
163  |  |     {&GUID_PKPixelFormat128bppPRGBAFloat, 4, CF_RGB, BD_32F, 128, PK_pixfmtHasAlpha | PK_pixfmtPreMul,         2, 4, 32, 3}, | 
164  |  |  | 
165  |  |     // Packed formats  | 
166  |  |     {&GUID_PKPixelFormat16bppRGB555, 3, CF_RGB,  BD_5, 16, PK_pixfmtNul,      2, 3, 5, 1}, | 
167  |  |     {&GUID_PKPixelFormat16bppRGB565, 3, CF_RGB, BD_565, 16, PK_pixfmtNul,     2, 3, 6, 1}, | 
168  |  |     {&GUID_PKPixelFormat32bppRGB101010, 3, CF_RGB, BD_10, 32, PK_pixfmtNul,   2, 3, 10, 1}, | 
169  |  |  | 
170  |  |     // CMYK  | 
171  |  |     {&GUID_PKPixelFormat32bppCMYK, 4, CMYK, BD_8, 32, PK_pixfmtNul,               5, 4, 8, 1}, | 
172  |  |     {&GUID_PKPixelFormat40bppCMYKAlpha, 5, CMYK, BD_8, 40, PK_pixfmtHasAlpha,     5, 5, 8, 1}, | 
173  |  |  | 
174  |  |     {&GUID_PKPixelFormat64bppCMYK, 4, CMYK, BD_16, 64, PK_pixfmtNul,              5, 4, 16, 1}, | 
175  |  |     {&GUID_PKPixelFormat80bppCMYKAlpha, 5, CMYK, BD_16, 80, PK_pixfmtHasAlpha,    5, 5, 16, 1}, | 
176  |  |  | 
177  |  |     // N_CHANNEL  | 
178  |  |     {&GUID_PKPixelFormat24bpp3Channels, 3, NCOMPONENT, BD_8, 24, PK_pixfmtNul, PK_PI_NCH, 3, 8, 1},//the N channel TIF by PS has PhotometricInterpretation of PK_PI_RGB | 
179  |  |     {&GUID_PKPixelFormat32bpp4Channels, 4, NCOMPONENT, BD_8, 32, PK_pixfmtNul, PK_PI_NCH, 4, 8, 1}, | 
180  |  |     {&GUID_PKPixelFormat40bpp5Channels, 5, NCOMPONENT, BD_8, 40, PK_pixfmtNul, PK_PI_NCH, 5, 8, 1}, | 
181  |  |     {&GUID_PKPixelFormat48bpp6Channels, 6, NCOMPONENT, BD_8, 48, PK_pixfmtNul, PK_PI_NCH, 6, 8, 1}, | 
182  |  |     {&GUID_PKPixelFormat56bpp7Channels, 7, NCOMPONENT, BD_8, 56, PK_pixfmtNul, PK_PI_NCH, 7, 8, 1}, | 
183  |  |     {&GUID_PKPixelFormat64bpp8Channels, 8, NCOMPONENT, BD_8, 64, PK_pixfmtNul, PK_PI_NCH, 8, 8, 1}, | 
184  |  |       | 
185  |  |     {&GUID_PKPixelFormat32bpp3ChannelsAlpha, 4, NCOMPONENT, BD_8, 32, PK_pixfmtHasAlpha, PK_PI_NCH, 4, 8, 1}, | 
186  |  |     {&GUID_PKPixelFormat40bpp4ChannelsAlpha, 5, NCOMPONENT, BD_8, 40, PK_pixfmtHasAlpha, PK_PI_NCH, 5, 8, 1}, | 
187  |  |     {&GUID_PKPixelFormat48bpp5ChannelsAlpha, 6, NCOMPONENT, BD_8, 48, PK_pixfmtHasAlpha, PK_PI_NCH, 6, 8, 1}, | 
188  |  |     {&GUID_PKPixelFormat56bpp6ChannelsAlpha, 7, NCOMPONENT, BD_8, 56, PK_pixfmtHasAlpha, PK_PI_NCH, 7, 8, 1}, | 
189  |  |     {&GUID_PKPixelFormat64bpp7ChannelsAlpha, 8, NCOMPONENT, BD_8, 64, PK_pixfmtHasAlpha, PK_PI_NCH, 8, 8, 1}, | 
190  |  |     {&GUID_PKPixelFormat72bpp8ChannelsAlpha, 9, NCOMPONENT, BD_8, 72, PK_pixfmtHasAlpha, PK_PI_NCH, 9, 8, 1}, | 
191  |  |  | 
192  |  |     {&GUID_PKPixelFormat48bpp3Channels, 3, NCOMPONENT, BD_16, 48, PK_pixfmtNul, PK_PI_NCH, 3, 16, 1}, | 
193  |  |     {&GUID_PKPixelFormat64bpp4Channels, 4, NCOMPONENT, BD_16, 64, PK_pixfmtNul, PK_PI_NCH, 4, 16, 1}, | 
194  |  |     {&GUID_PKPixelFormat80bpp5Channels, 5, NCOMPONENT, BD_16, 80, PK_pixfmtNul, PK_PI_NCH, 5, 16, 1}, | 
195  |  |     {&GUID_PKPixelFormat96bpp6Channels, 6, NCOMPONENT, BD_16, 96, PK_pixfmtNul, PK_PI_NCH, 6, 16, 1}, | 
196  |  |     {&GUID_PKPixelFormat112bpp7Channels, 7, NCOMPONENT, BD_16, 112, PK_pixfmtNul, PK_PI_NCH, 7, 16, 1}, | 
197  |  |     {&GUID_PKPixelFormat128bpp8Channels, 8, NCOMPONENT, BD_16, 128, PK_pixfmtNul, PK_PI_NCH, 8, 16, 1}, | 
198  |  |  | 
199  |  |     {&GUID_PKPixelFormat64bpp3ChannelsAlpha, 4, NCOMPONENT, BD_16, 64, PK_pixfmtHasAlpha, PK_PI_NCH, 4, 16, 1}, | 
200  |  |     {&GUID_PKPixelFormat80bpp4ChannelsAlpha, 5, NCOMPONENT, BD_16, 80, PK_pixfmtHasAlpha, PK_PI_NCH, 5, 16, 1}, | 
201  |  |     {&GUID_PKPixelFormat96bpp5ChannelsAlpha, 6, NCOMPONENT, BD_16, 96, PK_pixfmtHasAlpha, PK_PI_NCH, 6, 16, 1}, | 
202  |  |     {&GUID_PKPixelFormat112bpp6ChannelsAlpha, 7, NCOMPONENT, BD_16, 112, PK_pixfmtHasAlpha, PK_PI_NCH, 7, 16, 1}, | 
203  |  |     {&GUID_PKPixelFormat128bpp7ChannelsAlpha, 8, NCOMPONENT, BD_16, 128, PK_pixfmtHasAlpha, PK_PI_NCH, 8, 16, 1}, | 
204  |  |     {&GUID_PKPixelFormat144bpp8ChannelsAlpha, 9, NCOMPONENT, BD_16, 144, PK_pixfmtHasAlpha, PK_PI_NCH, 9, 16, 1}, | 
205  |  |  | 
206  |  |     //RGBE  | 
207  |  |     {&GUID_PKPixelFormat32bppRGBE, 4, CF_RGBE, BD_8, 32, PK_pixfmtNul, PK_PI_RGBE, 4, 8, 1}, | 
208  |  |  | 
209  |  |     //YUV  | 
210  |  |     {&GUID_PKPixelFormat12bppYUV420, 3, YUV_420, BD_8, 48, PK_pixfmtNul}, | 
211  |  |     {&GUID_PKPixelFormat16bppYUV422, 3, YUV_422, BD_8, 32, PK_pixfmtNul}, | 
212  |  |     {&GUID_PKPixelFormat24bppYUV444, 3, YUV_444, BD_8, 24, PK_pixfmtNul}, | 
213  |  | };  | 
214  |  |  | 
215  |  | //----------------------------------------------------------------  | 
216  |  | //ERR GetPixelInfo(PKPixelFormatGUID enPixelFormat, const PKPixelInfo** ppPI)  | 
217  |  | ERR PixelFormatLookup(PKPixelInfo* pPI, U8 uLookupType)  | 
218  | 0  | { | 
219  | 0  |   ERR err = WMP_errSuccess;  | 
220  | 0  |   size_t i;  | 
221  |  | 
  | 
222  | 0  |   for (i = 0; i < sizeof2(pixelInfo); ++i) { | 
223  | 0  |     if (LOOKUP_FORWARD == uLookupType) { | 
224  | 0  |       if (IsEqualGUID(pPI->pGUIDPixFmt, pixelInfo[i].pGUIDPixFmt)) { | 
225  | 0  |         *pPI = pixelInfo[i];  | 
226  | 0  |         goto Cleanup;  | 
227  | 0  |       }  | 
228  | 0  |     }  | 
229  | 0  |     else if (LOOKUP_BACKWARD_TIF == uLookupType) { | 
230  | 0  |       if (pPI->uSamplePerPixel == pixelInfo[i].uSamplePerPixel &&  | 
231  | 0  |         pPI->uBitsPerSample == pixelInfo[i].uBitsPerSample &&  | 
232  | 0  |         pPI->uSampleFormat == pixelInfo[i].uSampleFormat &&  | 
233  | 0  |         pPI->uInterpretation == pixelInfo[i].uInterpretation) { | 
234  |  |         // match alpha & premult  | 
235  | 0  |         if ((pPI->grBit & (PK_pixfmtHasAlpha | PK_pixfmtPreMul)) ==  | 
236  | 0  |           (pixelInfo[i].grBit & (PK_pixfmtHasAlpha | PK_pixfmtPreMul))) { | 
237  | 0  |           *pPI = pixelInfo[i];  | 
238  | 0  |           goto Cleanup;  | 
239  | 0  |         }  | 
240  | 0  |       }  | 
241  | 0  |     }  | 
242  | 0  |   }  | 
243  | 0  |   Call(WMP_errUnsupportedFormat);  | 
244  |  |  | 
245  | 0  | Cleanup:  | 
246  | 0  |   return err;  | 
247  | 0  | }  | 
248  |  |  | 
249  |  |  | 
250  |  | const PKPixelFormatGUID* GetPixelFormatFromHash(const U8 uPFHash)  | 
251  | 0  | { | 
252  | 0  |   int i;  | 
253  |  | 
  | 
254  | 0  |   for (i = 0; i < sizeof2(pixelInfo); i++) { | 
255  | 0  |     if (pixelInfo[i].pGUIDPixFmt->Data4[7] == uPFHash) { | 
256  | 0  |       return pixelInfo[i].pGUIDPixFmt;  | 
257  | 0  |     }  | 
258  | 0  |   }  | 
259  |  |  | 
260  |  |   // If we reached this point, we did not find anything which matched the hash  | 
261  | 0  |   return NULL;  | 
262  | 0  | }  | 
263  |  |  | 
264  |  | //----------------------------------------------------------------  | 
265  |  | typedef struct tagPKIIDInfo  | 
266  |  | { | 
267  |  |     const char* szExt;  | 
268  |  |     const PKIID* pIIDEnc;  | 
269  |  |     const PKIID* pIIDDec;  | 
270  |  | } PKIIDInfo;  | 
271  |  |  | 
272  |  | static ERR GetIIDInfo(const char* szExt, const PKIIDInfo** ppInfo)  | 
273  | 0  | { | 
274  | 0  |   ERR err = WMP_errSuccess;  | 
275  |  | 
  | 
276  | 0  |   static PKIIDInfo iidInfo[] = { | 
277  | 0  |     {".jxr", &IID_PKImageWmpEncode, &IID_PKImageWmpDecode}, | 
278  | 0  |     {".wdp", &IID_PKImageUnsupported, &IID_PKImageWmpDecode}, | 
279  | 0  |     {".hdp", &IID_PKImageUnsupported, &IID_PKImageWmpDecode}, | 
280  | 0  |   };  | 
281  | 0  |   size_t i = 0;  | 
282  |  | 
  | 
283  | 0  |   *ppInfo = NULL;  | 
284  | 0  |   for (i = 0; i < sizeof2(iidInfo); ++i) { | 
285  | 0  |     if (0 == PKStrnicmp(szExt, iidInfo[i].szExt, strlen(iidInfo[i].szExt))) { | 
286  | 0  |       *ppInfo = &iidInfo[i];  | 
287  | 0  |       goto Cleanup;  | 
288  | 0  |     }  | 
289  | 0  |   }  | 
290  |  |  | 
291  | 0  |   Call(WMP_errUnsupportedFormat);  | 
292  |  |  | 
293  | 0  | Cleanup:  | 
294  | 0  |   return err;  | 
295  | 0  | }  | 
296  |  |  | 
297  |  | ERR GetImageEncodeIID(const char* szExt, const PKIID** ppIID)  | 
298  | 0  | { | 
299  | 0  |     ERR err = WMP_errSuccess;  | 
300  |  | 
  | 
301  | 0  |     const PKIIDInfo* pInfo = NULL;  | 
302  |  | 
  | 
303  | 0  |     Call(GetIIDInfo(szExt, &pInfo));  | 
304  | 0  |     *ppIID = pInfo->pIIDEnc;  | 
305  |  | 
  | 
306  | 0  | Cleanup:  | 
307  | 0  |     return err;  | 
308  | 0  | }  | 
309  |  |  | 
310  |  | ERR GetImageDecodeIID(const char* szExt, const PKIID** ppIID)  | 
311  | 0  | { | 
312  | 0  |     ERR err = WMP_errSuccess;  | 
313  |  | 
  | 
314  | 0  |     const PKIIDInfo* pInfo = NULL;  | 
315  |  | 
  | 
316  | 0  |     Call(GetIIDInfo(szExt, &pInfo));  | 
317  | 0  |     *ppIID = pInfo->pIIDDec;  | 
318  |  | 
  | 
319  | 0  | Cleanup:  | 
320  | 0  |     return err;  | 
321  | 0  | }  | 
322  |  |  | 
323  |  | //================================================================  | 
324  |  | // PKFactory  | 
325  |  | //================================================================  | 
326  |  | ERR PKCreateFactory_CreateStream(PKStream** ppStream)  | 
327  | 0  | { | 
328  | 0  |     ERR err = WMP_errSuccess;  | 
329  |  | 
  | 
330  | 0  |     Call(PKAlloc((void **) ppStream, sizeof(**ppStream)));  | 
331  |  |  | 
332  | 0  | Cleanup:  | 
333  | 0  |     return err;  | 
334  | 0  | }  | 
335  |  |  | 
336  |  | ERR PKCreateFactory_Release(PKFactory** ppFactory)  | 
337  | 0  | { | 
338  | 0  |     ERR err = WMP_errSuccess;  | 
339  |  | 
  | 
340  | 0  |     Call(PKFree((void **) ppFactory));  | 
341  |  |  | 
342  | 0  | Cleanup:   | 
343  | 0  |     return err;  | 
344  | 0  | }  | 
345  |  |  | 
346  |  | //----------------------------------------------------------------  | 
347  |  | ERR PKCreateFactory(PKFactory** ppFactory, U32 uVersion)  | 
348  | 0  | { | 
349  | 0  |     ERR err = WMP_errSuccess;  | 
350  | 0  |     PKFactory* pFactory = NULL;  | 
351  |  | 
  | 
352  | 0  |     UNREFERENCED_PARAMETER( uVersion );  | 
353  |  | 
  | 
354  | 0  |     Call(PKAlloc((void **) ppFactory, sizeof(**ppFactory)));  | 
355  | 0  |     pFactory = *ppFactory;  | 
356  |  | 
  | 
357  | 0  |     pFactory->CreateStream = PKCreateFactory_CreateStream;  | 
358  |  | 
  | 
359  | 0  |     pFactory->CreateStreamFromFilename = CreateWS_File;  | 
360  | 0  |     pFactory->CreateStreamFromMemory = CreateWS_Memory;  | 
361  |  |       | 
362  | 0  |     pFactory->Release = PKCreateFactory_Release;  | 
363  |  | 
  | 
364  | 0  | Cleanup:  | 
365  | 0  |     return err;  | 
366  | 0  | }  | 
367  |  |  | 
368  |  |  | 
369  |  | //================================================================  | 
370  |  | // PKCodecFactory  | 
371  |  | //================================================================  | 
372  |  | ERR PKCodecFactory_CreateCodec(const PKIID* iid, void** ppv)  | 
373  | 0  | { | 
374  | 0  |   ERR err = WMP_errSuccess;  | 
375  |  | 
  | 
376  | 0  |   if (IID_PKImageWmpEncode == *iid) { | 
377  | 0  |     Call(PKImageEncode_Create_WMP((PKImageEncode**)ppv));  | 
378  | 0  |   }  | 
379  | 0  |   else if (IID_PKImageWmpDecode == *iid) { | 
380  | 0  |     Call(PKImageDecode_Create_WMP((PKImageDecode**)ppv));  | 
381  | 0  |   }  | 
382  | 0  |   else { | 
383  | 0  |     Call(WMP_errUnsupportedFormat);  | 
384  | 0  |   }  | 
385  |  |  | 
386  | 0  | Cleanup:  | 
387  | 0  |   return err;  | 
388  | 0  | }  | 
389  |  |  | 
390  |  | ERR PKCodecFactory_CreateDecoderFromFile(const char* szFilename, PKImageDecode** ppDecoder)  | 
391  | 0  | { | 
392  | 0  |     ERR err = WMP_errSuccess;  | 
393  |  | 
  | 
394  | 0  |     char *pExt = NULL;  | 
395  | 0  |     const PKIID* pIID = NULL;  | 
396  |  | 
  | 
397  | 0  |     struct WMPStream* pStream = NULL;  | 
398  | 0  |     PKImageDecode* pDecoder = NULL;  | 
399  |  |  | 
400  |  |     // get file extension  | 
401  | 0  |     pExt = strrchr(szFilename, '.');  | 
402  | 0  |     FailIf(NULL == pExt, WMP_errUnsupportedFormat);  | 
403  |  |  | 
404  |  |     // get decode PKIID  | 
405  | 0  |     Call(GetImageDecodeIID(pExt, &pIID));  | 
406  |  |  | 
407  |  |     // create stream  | 
408  | 0  |     Call(CreateWS_File(&pStream, szFilename, "rb"));  | 
409  |  |  | 
410  |  |     // Create decoder  | 
411  | 0  |     Call(PKCodecFactory_CreateCodec(pIID, (void **) ppDecoder));  | 
412  | 0  |     pDecoder = *ppDecoder;  | 
413  |  |  | 
414  |  |     // attach stream to decoder  | 
415  | 0  |     Call(pDecoder->Initialize(pDecoder, pStream));  | 
416  | 0  |     pDecoder->fStreamOwner = !0;  | 
417  |  | 
  | 
418  | 0  | Cleanup:  | 
419  | 0  |     return err;  | 
420  | 0  | }  | 
421  |  |  | 
422  |  | ERR PKCodecFactory_CreateFormatConverter(PKFormatConverter** ppFConverter)  | 
423  | 0  | { | 
424  | 0  |     ERR err = WMP_errSuccess;  | 
425  | 0  |     PKFormatConverter* pFC = NULL;  | 
426  |  | 
  | 
427  | 0  |     Call(PKAlloc((void **) ppFConverter, sizeof(**ppFConverter)));  | 
428  | 0  |     pFC = *ppFConverter;  | 
429  |  | 
  | 
430  | 0  |     pFC->Initialize = PKFormatConverter_Initialize;  | 
431  | 0  |     pFC->InitializeConvert = PKFormatConverter_InitializeConvert;  | 
432  | 0  |     pFC->GetPixelFormat = PKFormatConverter_GetPixelFormat;  | 
433  | 0  |     pFC->GetSourcePixelFormat = PKFormatConverter_GetSourcePixelFormat;  | 
434  | 0  |     pFC->GetSize = PKFormatConverter_GetSize;  | 
435  | 0  |     pFC->GetResolution = PKFormatConverter_GetResolution;  | 
436  | 0  |     pFC->Copy = PKFormatConverter_Copy;  | 
437  | 0  |     pFC->Convert = PKFormatConverter_Convert;  | 
438  | 0  |     pFC->Release = PKFormatConverter_Release;  | 
439  |  | 
  | 
440  | 0  | Cleanup:  | 
441  | 0  |     return err;  | 
442  | 0  | }  | 
443  |  |  | 
444  |  | ERR PKCreateCodecFactory_Release(PKCodecFactory** ppCFactory)  | 
445  | 0  | { | 
446  | 0  |     ERR err = WMP_errSuccess;  | 
447  |  | 
  | 
448  | 0  |     Call(PKFree((void **) ppCFactory));  | 
449  |  |  | 
450  | 0  | Cleanup:  | 
451  | 0  |     return err;  | 
452  | 0  | }  | 
453  |  |  | 
454  |  | ERR PKCreateCodecFactory(PKCodecFactory** ppCFactory, U32 uVersion)  | 
455  | 0  | { | 
456  | 0  |     ERR err = WMP_errSuccess;  | 
457  | 0  |     PKCodecFactory* pCFactory = NULL;  | 
458  |  | 
  | 
459  | 0  |     UNREFERENCED_PARAMETER( uVersion );  | 
460  |  | 
  | 
461  | 0  |     Call(PKAlloc((void **) ppCFactory, sizeof(**ppCFactory)));  | 
462  | 0  |     pCFactory = *ppCFactory;  | 
463  |  | 
  | 
464  | 0  |     pCFactory->CreateCodec = PKCodecFactory_CreateCodec;  | 
465  | 0  |     pCFactory->CreateDecoderFromFile = PKCodecFactory_CreateDecoderFromFile;  | 
466  | 0  |     pCFactory->CreateFormatConverter = PKCodecFactory_CreateFormatConverter;  | 
467  | 0  |     pCFactory->Release = PKCreateCodecFactory_Release;  | 
468  |  | 
  | 
469  | 0  | Cleanup:  | 
470  | 0  |     return err;  | 
471  | 0  | }  | 
472  |  |  | 
473  |  |  | 
474  |  | //================================================================  | 
475  |  | // PKImageEncode  | 
476  |  | //================================================================  | 
477  |  | ERR PKImageEncode_Initialize(PKImageEncode* pIE, struct WMPStream* pStream, void* pvParam, size_t cbParam)  | 
478  | 0  | { | 
479  | 0  |     ERR err = WMP_errSuccess;  | 
480  |  | 
  | 
481  | 0  |     UNREFERENCED_PARAMETER( pIE );  | 
482  | 0  |     UNREFERENCED_PARAMETER( pvParam );  | 
483  | 0  |     UNREFERENCED_PARAMETER( cbParam );  | 
484  |  | 
  | 
485  | 0  |     pIE->pStream = pStream;  | 
486  | 0  |     pIE->guidPixFormat = GUID_PKPixelFormatDontCare;  | 
487  | 0  |     pIE->fResX = 96;  | 
488  | 0  |     pIE->fResY = 96;  | 
489  | 0  |     pIE->cFrame = 1;  | 
490  |  | 
  | 
491  | 0  |     Call(pIE->pStream->GetPos(pIE->pStream, &pIE->offStart));  | 
492  |  |  | 
493  | 0  | Cleanup:  | 
494  | 0  |     return err;  | 
495  | 0  | }  | 
496  |  |  | 
497  |  | ERR PKImageEncode_Terminate(PKImageEncode* pIE)  | 
498  | 0  | { | 
499  | 0  |     UNREFERENCED_PARAMETER( pIE );  | 
500  | 0  |     return WMP_errSuccess;  | 
501  | 0  | }  | 
502  |  |  | 
503  |  | ERR PKImageEncode_SetPixelFormat(PKImageEncode* pIE, PKPixelFormatGUID enPixelFormat)  | 
504  | 0  | { | 
505  | 0  |     pIE->guidPixFormat = enPixelFormat;  | 
506  |  | 
  | 
507  | 0  |     return WMP_errSuccess;  | 
508  | 0  | }  | 
509  |  |  | 
510  |  | ERR PKImageEncode_SetSize(PKImageEncode* pIE, I32 iWidth, I32 iHeight)  | 
511  | 0  | { | 
512  | 0  |     ERR err = WMP_errSuccess;  | 
513  |  | 
  | 
514  | 0  |     pIE->uWidth = (U32)iWidth;  | 
515  | 0  |     pIE->uHeight = (U32)iHeight;  | 
516  |  | 
  | 
517  | 0  |     return err;  | 
518  | 0  | }  | 
519  |  |  | 
520  |  | ERR PKImageEncode_SetResolution(PKImageEncode* pIE, Float fResX, Float fResY)  | 
521  | 0  | { | 
522  | 0  |     pIE->fResX = fResX;  | 
523  | 0  |     pIE->fResY = fResY;  | 
524  |  | 
  | 
525  | 0  |     return WMP_errSuccess;  | 
526  | 0  | }  | 
527  |  |  | 
528  |  | ERR PKImageEncode_SetColorContext(PKImageEncode *pIE, const U8 *pbColorContext, U32 cbColorContext)  | 
529  | 0  | { | 
530  | 0  |     UNREFERENCED_PARAMETER( pIE );  | 
531  | 0  |     UNREFERENCED_PARAMETER( pbColorContext );  | 
532  | 0  |     UNREFERENCED_PARAMETER( cbColorContext );  | 
533  | 0  |     return WMP_errNotYetImplemented;  | 
534  | 0  | }  | 
535  |  |  | 
536  |  |  | 
537  |  | ERR PKImageEncode_SetDescriptiveMetadata(PKImageEncode *pIE, const DESCRIPTIVEMETADATA *pDescMetadata)  | 
538  | 0  | { | 
539  | 0  |     UNREFERENCED_PARAMETER( pIE );  | 
540  | 0  |     UNREFERENCED_PARAMETER( pDescMetadata );  | 
541  | 0  |     return WMP_errNotYetImplemented;  | 
542  | 0  | }  | 
543  |  |  | 
544  |  | ERR PKImageEncode_WritePixels(PKImageEncode* pIE, U32 cLine, U8* pbPixels, U32 cbStride)  | 
545  | 0  | { | 
546  | 0  |     UNREFERENCED_PARAMETER( pIE );  | 
547  | 0  |     UNREFERENCED_PARAMETER( cLine );  | 
548  | 0  |     UNREFERENCED_PARAMETER( pbPixels );  | 
549  | 0  |     UNREFERENCED_PARAMETER( cbStride );  | 
550  | 0  |     return WMP_errAbstractMethod;  | 
551  | 0  | }  | 
552  |  |  | 
553  |  | ERR PKImageEncode_WriteSource(PKImageEncode* pIE, PKFormatConverter* pFC, PKRect* pRect)  | 
554  | 0  | { | 
555  | 0  |     ERR err = WMP_errSuccess;  | 
556  |  | 
  | 
557  | 0  |     PKPixelFormatGUID enPFFrom = GUID_PKPixelFormatDontCare;  | 
558  | 0  |     PKPixelFormatGUID enPFTo = GUID_PKPixelFormatDontCare;  | 
559  |  | 
  | 
560  | 0  |     PKPixelInfo pPIFrom;  | 
561  | 0  |     PKPixelInfo pPITo;  | 
562  |  | 
  | 
563  | 0  |     U32 cbStrideTo = 0;  | 
564  | 0  |     U32 cbStrideFrom = 0;  | 
565  | 0  |     U32 cbStride = 0;  | 
566  |  | 
  | 
567  | 0  |     U8* pb = NULL;  | 
568  |  |  | 
569  |  |   // CWMTranscodingParam* pParam = NULL;   | 
570  |  |  | 
571  |  |     // get pixel format  | 
572  | 0  |     Call(pFC->GetSourcePixelFormat(pFC, &enPFFrom));  | 
573  | 0  |     Call(pFC->GetPixelFormat(pFC, &enPFTo));  | 
574  | 0  |     FailIf(!IsEqualGUID(&pIE->guidPixFormat, &enPFTo), WMP_errUnsupportedFormat);  | 
575  |  |  | 
576  |  |     // calc common stride  | 
577  |  | //    Call(GetPixelInfo(enPFFrom, &pPIFrom));  | 
578  | 0  |     pPIFrom.pGUIDPixFmt = &enPFFrom;  | 
579  | 0  |     PixelFormatLookup(&pPIFrom, LOOKUP_FORWARD);  | 
580  |  |  | 
581  |  | //    Call(GetPixelInfo(enPFTo, &pPITo));  | 
582  | 0  |     pPITo.pGUIDPixFmt = &enPFTo;  | 
583  | 0  |     PixelFormatLookup(&pPITo, LOOKUP_FORWARD);  | 
584  |  |  | 
585  |  | //    cbStrideFrom = (pPIFrom->cbPixel * pRect->Width + pPIFrom->cbPixelDenom - 1) / pPIFrom->cbPixelDenom;  | 
586  | 0  |     cbStrideFrom = (BD_1 == pPIFrom.bdBitDepth ? ((pPIFrom.cbitUnit * pRect->Width + 7) >> 3) : (((pPIFrom.cbitUnit + 7) >> 3) * pRect->Width));   | 
587  | 0  |     if (&GUID_PKPixelFormat12bppYUV420 == pPIFrom.pGUIDPixFmt   | 
588  | 0  |         || &GUID_PKPixelFormat16bppYUV422 == pPIFrom.pGUIDPixFmt)   | 
589  | 0  |         cbStrideFrom >>= 1;  | 
590  |  |  | 
591  |  | //    cbStrideTo = (pPITo->cbPixel * pIE->uWidth + pPITo->cbPixelDenom - 1) / pPITo->cbPixelDenom;  | 
592  | 0  |     cbStrideTo = (BD_1 == pPITo.bdBitDepth ? ((pPITo.cbitUnit * pIE->uWidth + 7) >> 3) : (((pPITo.cbitUnit + 7) >> 3) * pIE->uWidth));   | 
593  | 0  |     if (&GUID_PKPixelFormat12bppYUV420 == pPITo.pGUIDPixFmt  | 
594  | 0  |         || &GUID_PKPixelFormat16bppYUV422 == pPITo.pGUIDPixFmt)   | 
595  | 0  |         cbStrideTo >>= 1;  | 
596  |  | 
  | 
597  | 0  |     cbStride = max(cbStrideFrom, cbStrideTo);  | 
598  |  |  | 
599  |  |     // actual dec/enc with local buffer  | 
600  | 0  |     Call(PKAllocAligned((void **) &pb, cbStride * pRect->Height, 128));  | 
601  |  |  | 
602  | 0  |     Call(pFC->Copy(pFC, pRect, pb, cbStride));  | 
603  |  |  | 
604  | 0  |   Call(pIE->WritePixels(pIE, pRect->Height, pb, cbStride));  | 
605  |  |  | 
606  | 0  | Cleanup:  | 
607  | 0  |     PKFreeAligned((void **) &pb);  | 
608  | 0  |     return err;  | 
609  | 0  | }  | 
610  |  |  | 
611  |  | ERR PKImageEncode_WritePixelsBandedBegin(PKImageEncode* pEncoder, struct WMPStream *pPATempFile)  | 
612  | 0  | { | 
613  | 0  |     UNREFERENCED_PARAMETER( pEncoder );  | 
614  | 0  |     UNREFERENCED_PARAMETER( pPATempFile );  | 
615  | 0  |     return WMP_errAbstractMethod;  | 
616  | 0  | }  | 
617  |  |  | 
618  |  | ERR PKImageEncode_WritePixelsBanded(PKImageEncode* pEncoder, U32 cLines, U8* pbPixels, U32 cbStride, Bool fLastCall)  | 
619  | 0  | { | 
620  | 0  |     UNREFERENCED_PARAMETER( pEncoder );  | 
621  | 0  |     UNREFERENCED_PARAMETER( cLines );  | 
622  | 0  |     UNREFERENCED_PARAMETER( pbPixels );  | 
623  | 0  |     UNREFERENCED_PARAMETER( cbStride );  | 
624  | 0  |     UNREFERENCED_PARAMETER( fLastCall );  | 
625  | 0  |     return WMP_errAbstractMethod;  | 
626  | 0  | }  | 
627  |  |  | 
628  |  | ERR PKImageEncode_WritePixelsBandedEnd(PKImageEncode* pEncoder)  | 
629  | 0  | { | 
630  | 0  |     UNREFERENCED_PARAMETER( pEncoder );  | 
631  | 0  |     return WMP_errAbstractMethod;  | 
632  | 0  | }  | 
633  |  |  | 
634  |  |  | 
635  |  | ERR PKImageEncode_Transcode(PKImageEncode* pIE, PKFormatConverter* pFC, PKRect* pRect)  | 
636  | 0  | { | 
637  | 0  |     ERR err = WMP_errSuccess;  | 
638  |  | 
  | 
639  | 0  |     PKPixelFormatGUID enPFFrom = GUID_PKPixelFormatDontCare;  | 
640  | 0  |     PKPixelFormatGUID enPFTo = GUID_PKPixelFormatDontCare;  | 
641  |  | 
  | 
642  | 0  |     PKPixelInfo pPIFrom;  | 
643  | 0  |     PKPixelInfo pPITo;  | 
644  |  | 
  | 
645  | 0  |     U32 cbStrideTo = 0;  | 
646  | 0  |     U32 cbStrideFrom = 0;  | 
647  | 0  |     U32 cbStride = 0;  | 
648  |  | 
  | 
649  | 0  |     U8* pb = NULL;  | 
650  |  | 
  | 
651  | 0  |     CWMTranscodingParam cParam = {0};  | 
652  |  |  | 
653  |  |     // get pixel format  | 
654  | 0  |     Call(pFC->GetSourcePixelFormat(pFC, &enPFFrom));  | 
655  | 0  |     Call(pFC->GetPixelFormat(pFC, &enPFTo));  | 
656  | 0  |     FailIf(!IsEqualGUID(&pIE->guidPixFormat, &enPFTo), WMP_errUnsupportedFormat);  | 
657  |  |  | 
658  |  |     // calc common stride  | 
659  |  | //    Call(GetPixelInfo(enPFFrom, &pPIFrom));  | 
660  | 0  |     pPIFrom.pGUIDPixFmt = &enPFFrom;  | 
661  | 0  |     PixelFormatLookup(&pPIFrom, LOOKUP_FORWARD);  | 
662  |  |  | 
663  |  | //    Call(GetPixelInfo(enPFTo, &pPITo));  | 
664  | 0  |     pPITo.pGUIDPixFmt = &enPFTo;  | 
665  | 0  |     PixelFormatLookup(&pPITo, LOOKUP_FORWARD);  | 
666  |  |  | 
667  |  | //    cbStrideFrom = (pPIFrom->cbPixel * pRect->Width + pPIFrom->cbPixelDenom - 1) / pPIFrom->cbPixelDenom;  | 
668  | 0  |     cbStrideFrom = (BD_1 == pPIFrom.bdBitDepth ? ((pPIFrom.cbitUnit * pRect->Width + 7) >> 3) : (((pPIFrom.cbitUnit + 7) >> 3) * pRect->Width));   | 
669  | 0  |     if (&GUID_PKPixelFormat12bppYUV420 == pPIFrom.pGUIDPixFmt   | 
670  | 0  |         || &GUID_PKPixelFormat16bppYUV422 == pPIFrom.pGUIDPixFmt)   | 
671  | 0  |         cbStrideFrom >>= 1;  | 
672  |  |  | 
673  |  | //    cbStrideTo = (pPITo->cbPixel * pIE->uWidth + pPITo->cbPixelDenom - 1) / pPITo->cbPixelDenom;  | 
674  | 0  |     cbStrideTo = (BD_1 == pPITo.bdBitDepth ? ((pPITo.cbitUnit * pIE->uWidth + 7) >> 3) : (((pPITo.cbitUnit + 7) >> 3) * pIE->uWidth));   | 
675  | 0  |     if (&GUID_PKPixelFormat12bppYUV420 == pPITo.pGUIDPixFmt  | 
676  | 0  |         || &GUID_PKPixelFormat16bppYUV422 == pPITo.pGUIDPixFmt)   | 
677  | 0  |         cbStrideTo >>= 1;  | 
678  |  | 
  | 
679  | 0  |     cbStride = max(cbStrideFrom, cbStrideTo);  | 
680  |  | 
  | 
681  | 0  |     if(pIE->bWMP){ | 
682  | 0  |         cParam.cLeftX = pFC->pDecoder->WMP.wmiI.cROILeftX;  | 
683  | 0  |         cParam.cTopY = pFC->pDecoder->WMP.wmiI.cROITopY;  | 
684  | 0  |         cParam.cWidth = pFC->pDecoder->WMP.wmiI.cROIWidth;  | 
685  | 0  |         cParam.cHeight = pFC->pDecoder->WMP.wmiI.cROIHeight;  | 
686  | 0  |         cParam.oOrientation = pFC->pDecoder->WMP.wmiI.oOrientation;  | 
687  |  | //        cParam.cfColorFormat = pFC->pDecoder->WMP.wmiI.cfColorFormat;  | 
688  | 0  |         cParam.uAlphaMode = pFC->pDecoder->WMP.wmiSCP.uAlphaMode;  | 
689  | 0  |         cParam.bfBitstreamFormat = pFC->pDecoder->WMP.wmiSCP.bfBitstreamFormat;  | 
690  | 0  |         cParam.sbSubband = pFC->pDecoder->WMP.wmiSCP.sbSubband;  | 
691  | 0  |         cParam.bIgnoreOverlap = pFC->pDecoder->WMP.bIgnoreOverlap;  | 
692  |  |           | 
693  | 0  |         Call(pIE->Transcode(pIE, pFC->pDecoder, &cParam));  | 
694  | 0  |     }  | 
695  | 0  |   else   | 
696  | 0  |   { | 
697  |  |     // actual dec/enc with local buffer  | 
698  | 0  |       Call(PKAllocAligned((void **) &pb, cbStride * pRect->Height, 128));  | 
699  | 0  |     Call(pFC->Copy(pFC, pRect, pb, cbStride));  | 
700  | 0  |     Call(pIE->WritePixels(pIE, pRect->Height, pb, cbStride));  | 
701  | 0  |   }  | 
702  |  |  | 
703  | 0  | Cleanup:  | 
704  | 0  |     PKFreeAligned((void **) &pb);  | 
705  | 0  |     return err;  | 
706  | 0  | }  | 
707  |  |  | 
708  |  | ERR PKImageEncode_CreateNewFrame(PKImageEncode* pIE, void* pvParam, size_t cbParam)  | 
709  | 0  | { | 
710  | 0  |     UNREFERENCED_PARAMETER( pIE );  | 
711  | 0  |     UNREFERENCED_PARAMETER( pvParam );  | 
712  | 0  |     UNREFERENCED_PARAMETER( cbParam );  | 
713  |  |     // NYI  | 
714  | 0  |     return WMP_errSuccess;  | 
715  | 0  | }  | 
716  |  |  | 
717  |  | ERR PKImageEncode_Release(PKImageEncode** ppIE)  | 
718  | 0  | { | 
719  | 0  |     PKImageEncode *pIE = *ppIE;  | 
720  | 0  |     pIE->pStream->Close(&pIE->pStream);  | 
721  |  | 
  | 
722  | 0  |     return PKFree((void **) ppIE);  | 
723  | 0  | }  | 
724  |  |  | 
725  |  | ERR PKImageEncode_Create(PKImageEncode** ppIE)  | 
726  | 0  | { | 
727  | 0  |     ERR err = WMP_errSuccess;  | 
728  | 0  |     PKImageEncode* pIE = NULL;  | 
729  |  | 
  | 
730  | 0  |     Call(PKAlloc((void **) ppIE, sizeof(**ppIE)));  | 
731  |  |  | 
732  | 0  |     pIE = *ppIE;  | 
733  | 0  |     pIE->Initialize = PKImageEncode_Initialize;  | 
734  | 0  |     pIE->Terminate = PKImageEncode_Terminate;  | 
735  | 0  |     pIE->SetPixelFormat = PKImageEncode_SetPixelFormat;  | 
736  | 0  |     pIE->SetSize = PKImageEncode_SetSize;  | 
737  | 0  |     pIE->SetResolution = PKImageEncode_SetResolution;  | 
738  | 0  |     pIE->SetColorContext = PKImageEncode_SetColorContext;  | 
739  | 0  |     pIE->SetDescriptiveMetadata = PKImageEncode_SetDescriptiveMetadata;  | 
740  | 0  |     pIE->WritePixels = PKImageEncode_WritePixels;  | 
741  |  | //    pIE->WriteSource = PKImageEncode_WriteSource;  | 
742  |  | 
  | 
743  | 0  |     pIE->WritePixelsBandedBegin = PKImageEncode_WritePixelsBandedBegin;  | 
744  | 0  |     pIE->WritePixelsBanded = PKImageEncode_WritePixelsBanded;  | 
745  | 0  |     pIE->WritePixelsBandedEnd = PKImageEncode_WritePixelsBandedEnd;  | 
746  |  | 
  | 
747  | 0  |     pIE->CreateNewFrame = PKImageEncode_CreateNewFrame;  | 
748  | 0  |     pIE->Release = PKImageEncode_Release;  | 
749  | 0  |   pIE->bWMP = FALSE;   | 
750  |  | 
  | 
751  | 0  | Cleanup:  | 
752  | 0  |     return err;  | 
753  | 0  | }  | 
754  |  |     | 
755  |  |  | 
756  |  | //================================================================  | 
757  |  | // PKImageDecode  | 
758  |  | //================================================================  | 
759  |  | ERR PKImageDecode_Initialize(PKImageDecode* pID, struct WMPStream* pStream)  | 
760  | 0  | { | 
761  | 0  |     ERR err = WMP_errSuccess;  | 
762  |  | 
  | 
763  | 0  |     pID->pStream = pStream;  | 
764  | 0  |     pID->guidPixFormat = GUID_PKPixelFormatDontCare;  | 
765  | 0  |     pID->fResX = 96;  | 
766  | 0  |     pID->fResY = 96;  | 
767  | 0  |     pID->cFrame = 1;  | 
768  |  | 
  | 
769  | 0  |     Call(pID->pStream->GetPos(pID->pStream, &pID->offStart));  | 
770  |  |  | 
771  | 0  |     memset(&pID->WMP.wmiDEMisc, 0, sizeof(pID->WMP.wmiDEMisc));  | 
772  |  | 
  | 
773  | 0  | Cleanup:  | 
774  | 0  |     return WMP_errSuccess;  | 
775  | 0  | }  | 
776  |  |  | 
777  |  | ERR PKImageDecode_GetPixelFormat(PKImageDecode* pID, PKPixelFormatGUID* pPF)  | 
778  | 0  | { | 
779  | 0  |     *pPF = pID->guidPixFormat;  | 
780  |  | 
  | 
781  | 0  |     return WMP_errSuccess;  | 
782  | 0  | }  | 
783  |  |  | 
784  |  | ERR PKImageDecode_GetSize(PKImageDecode* pID, I32* piWidth, I32* piHeight)  | 
785  | 0  | { | 
786  | 0  |     *piWidth = (I32)pID->uWidth;  | 
787  | 0  |     *piHeight = (I32)pID->uHeight;  | 
788  |  | 
  | 
789  | 0  |     return WMP_errSuccess;  | 
790  | 0  | }  | 
791  |  |  | 
792  |  | ERR PKImageDecode_GetResolution(PKImageDecode* pID, Float* pfResX, Float* pfResY)  | 
793  | 0  | { | 
794  | 0  |     *pfResX = pID->fResX;  | 
795  | 0  |     *pfResY = pID->fResY;  | 
796  |  | 
  | 
797  | 0  |     return WMP_errSuccess;  | 
798  | 0  | }  | 
799  |  |  | 
800  |  | ERR PKImageDecode_GetColorContext(PKImageDecode *pID, U8 *pbColorContext, U32 *pcbColorContext)  | 
801  | 0  | { | 
802  | 0  |     UNREFERENCED_PARAMETER( pID );  | 
803  | 0  |     UNREFERENCED_PARAMETER( pbColorContext );  | 
804  | 0  |     UNREFERENCED_PARAMETER( pcbColorContext );  | 
805  | 0  |     return WMP_errNotYetImplemented;  | 
806  | 0  | }  | 
807  |  |  | 
808  |  | ERR PKImageDecode_GetDescriptiveMetadata(PKImageDecode *pIE, DESCRIPTIVEMETADATA *pDescMetadata)  | 
809  | 0  | { | 
810  | 0  |     UNREFERENCED_PARAMETER( pIE );  | 
811  | 0  |     UNREFERENCED_PARAMETER( pDescMetadata );  | 
812  | 0  |     return WMP_errNotYetImplemented;  | 
813  | 0  | }  | 
814  |  |  | 
815  |  | ERR PKImageDecode_Copy(PKImageDecode* pID, const PKRect* pRect, U8* pb, U32 cbStride)  | 
816  | 0  | { | 
817  | 0  |     UNREFERENCED_PARAMETER( pID );  | 
818  | 0  |     UNREFERENCED_PARAMETER( pRect );  | 
819  | 0  |     UNREFERENCED_PARAMETER( pb );  | 
820  | 0  |     UNREFERENCED_PARAMETER( cbStride );  | 
821  | 0  |     return WMP_errAbstractMethod;  | 
822  | 0  | }  | 
823  |  |  | 
824  |  | ERR PKImageDecode_GetFrameCount(PKImageDecode* pID, U32* puCount)  | 
825  | 0  | { | 
826  | 0  |     *puCount = pID->cFrame;  | 
827  |  | 
  | 
828  | 0  |     return WMP_errSuccess;  | 
829  | 0  | }  | 
830  |  |  | 
831  |  | ERR PKImageDecode_SelectFrame(PKImageDecode* pID, U32 uFrame)  | 
832  | 0  | { | 
833  | 0  |     UNREFERENCED_PARAMETER( pID );  | 
834  | 0  |     UNREFERENCED_PARAMETER( uFrame );  | 
835  |  |     // NYI  | 
836  | 0  |     return WMP_errSuccess;  | 
837  | 0  | }  | 
838  |  |  | 
839  |  | ERR PKImageDecode_Release(PKImageDecode** ppID)  | 
840  | 0  | { | 
841  | 0  |     PKImageDecode* pID = *ppID;  | 
842  |  | 
  | 
843  | 0  |     pID->fStreamOwner && pID->pStream->Close(&pID->pStream);  | 
844  |  | 
  | 
845  | 0  |     return PKFree((void **) ppID);  | 
846  | 0  | }  | 
847  |  |  | 
848  |  | ERR PKImageDecode_Create(PKImageDecode** ppID)  | 
849  | 0  | { | 
850  | 0  |     ERR err = WMP_errSuccess;  | 
851  | 0  |     PKImageDecode* pID = NULL;  | 
852  |  | 
  | 
853  | 0  |     Call(PKAlloc((void **) ppID, sizeof(**ppID)));  | 
854  |  |  | 
855  | 0  |     pID = *ppID;  | 
856  | 0  |     pID->Initialize = PKImageDecode_Initialize;  | 
857  | 0  |     pID->GetPixelFormat = PKImageDecode_GetPixelFormat;  | 
858  | 0  |     pID->GetSize = PKImageDecode_GetSize;  | 
859  | 0  |     pID->GetResolution = PKImageDecode_GetResolution;  | 
860  | 0  |     pID->GetColorContext = PKImageDecode_GetColorContext;  | 
861  | 0  |     pID->GetDescriptiveMetadata = PKImageDecode_GetDescriptiveMetadata;  | 
862  | 0  |     pID->Copy = PKImageDecode_Copy;  | 
863  | 0  |     pID->GetFrameCount = PKImageDecode_GetFrameCount;  | 
864  | 0  |     pID->SelectFrame = PKImageDecode_SelectFrame;  | 
865  | 0  |     pID->Release = PKImageDecode_Release;  | 
866  |  | 
  | 
867  | 0  | Cleanup:  | 
868  | 0  |     return err;  | 
869  | 0  | }  | 
870  |  |  |