ReactOS 0.4.16-dev-1067-ge98bba2
decoder.c File Reference
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "objbase.h"
#include "wincodecs_private.h"
#include "wine/debug.h"
Include dependency graph for decoder.c:

Go to the source code of this file.

Classes

struct  CommonDecoder
 
struct  CommonDecoderFrame
 

Macros

#define COBJMACROS
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (wincodecs)
 
static CommonDecoderimpl_from_IWICBitmapDecoder (IWICBitmapDecoder *iface)
 
static HRESULT WINAPI CommonDecoder_QueryInterface (IWICBitmapDecoder *iface, REFIID iid, void **ppv)
 
static ULONG WINAPI CommonDecoder_AddRef (IWICBitmapDecoder *iface)
 
static ULONG WINAPI CommonDecoder_Release (IWICBitmapDecoder *iface)
 
static HRESULT WINAPI CommonDecoder_QueryCapability (IWICBitmapDecoder *iface, IStream *stream, DWORD *capability)
 
static HRESULT WINAPI CommonDecoder_Initialize (IWICBitmapDecoder *iface, IStream *pIStream, WICDecodeOptions cacheOptions)
 
static HRESULT WINAPI CommonDecoder_GetContainerFormat (IWICBitmapDecoder *iface, GUID *pguidContainerFormat)
 
static HRESULT WINAPI CommonDecoder_GetDecoderInfo (IWICBitmapDecoder *iface, IWICBitmapDecoderInfo **ppIDecoderInfo)
 
static HRESULT WINAPI CommonDecoder_CopyPalette (IWICBitmapDecoder *iface, IWICPalette *palette)
 
static HRESULT WINAPI CommonDecoder_GetMetadataQueryReader (IWICBitmapDecoder *iface, IWICMetadataQueryReader **reader)
 
static HRESULT WINAPI CommonDecoder_GetPreview (IWICBitmapDecoder *iface, IWICBitmapSource **ppIBitmapSource)
 
static HRESULT WINAPI CommonDecoder_GetColorContexts (IWICBitmapDecoder *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
 
static HRESULT WINAPI CommonDecoder_GetThumbnail (IWICBitmapDecoder *iface, IWICBitmapSource **ppIThumbnail)
 
static HRESULT WINAPI CommonDecoder_GetFrameCount (IWICBitmapDecoder *iface, UINT *pCount)
 
static HRESULT WINAPI CommonDecoder_GetFrame (IWICBitmapDecoder *iface, UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
 
static CommonDecoderFrameimpl_from_IWICBitmapFrameDecode (IWICBitmapFrameDecode *iface)
 
static CommonDecoderFrameimpl_from_IWICMetadataBlockReader (IWICMetadataBlockReader *iface)
 
static HRESULT WINAPI CommonDecoderFrame_QueryInterface (IWICBitmapFrameDecode *iface, REFIID iid, void **ppv)
 
static ULONG WINAPI CommonDecoderFrame_AddRef (IWICBitmapFrameDecode *iface)
 
static ULONG WINAPI CommonDecoderFrame_Release (IWICBitmapFrameDecode *iface)
 
static HRESULT WINAPI CommonDecoderFrame_GetSize (IWICBitmapFrameDecode *iface, UINT *puiWidth, UINT *puiHeight)
 
static HRESULT WINAPI CommonDecoderFrame_GetPixelFormat (IWICBitmapFrameDecode *iface, WICPixelFormatGUID *pPixelFormat)
 
static HRESULT WINAPI CommonDecoderFrame_GetResolution (IWICBitmapFrameDecode *iface, double *pDpiX, double *pDpiY)
 
static HRESULT WINAPI CommonDecoderFrame_CopyPalette (IWICBitmapFrameDecode *iface, IWICPalette *pIPalette)
 
static HRESULT WINAPI CommonDecoderFrame_CopyPixels (IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
 
static HRESULT WINAPI CommonDecoderFrame_GetMetadataQueryReader (IWICBitmapFrameDecode *iface, IWICMetadataQueryReader **ppIMetadataQueryReader)
 
static HRESULT WINAPI CommonDecoderFrame_GetColorContexts (IWICBitmapFrameDecode *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
 
static HRESULT WINAPI CommonDecoderFrame_GetThumbnail (IWICBitmapFrameDecode *iface, IWICBitmapSource **ppIThumbnail)
 
static HRESULT WINAPI CommonDecoderFrame_Block_QueryInterface (IWICMetadataBlockReader *iface, REFIID iid, void **ppv)
 
static ULONG WINAPI CommonDecoderFrame_Block_AddRef (IWICMetadataBlockReader *iface)
 
static ULONG WINAPI CommonDecoderFrame_Block_Release (IWICMetadataBlockReader *iface)
 
static HRESULT WINAPI CommonDecoderFrame_Block_GetContainerFormat (IWICMetadataBlockReader *iface, GUID *pguidContainerFormat)
 
static HRESULT CommonDecoderFrame_InitializeMetadata (CommonDecoderFrame *This)
 
static HRESULT WINAPI CommonDecoderFrame_Block_GetCount (IWICMetadataBlockReader *iface, UINT *pcCount)
 
static HRESULT WINAPI CommonDecoderFrame_Block_GetReaderByIndex (IWICMetadataBlockReader *iface, UINT nIndex, IWICMetadataReader **ppIMetadataReader)
 
static HRESULT WINAPI CommonDecoderFrame_Block_GetEnumerator (IWICMetadataBlockReader *iface, IEnumUnknown **ppIEnumMetadata)
 
HRESULT CommonDecoder_CreateInstance (struct decoder *decoder, const struct decoder_info *decoder_info, REFIID iid, void **ppv)
 

Variables

static const IWICBitmapDecoderVtbl CommonDecoder_Vtbl
 
static const IWICBitmapFrameDecodeVtbl CommonDecoderFrameVtbl
 
static const IWICMetadataBlockReaderVtbl CommonDecoderFrame_BlockVtbl
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 21 of file decoder.c.

Function Documentation

◆ CommonDecoder_AddRef()

static ULONG WINAPI CommonDecoder_AddRef ( IWICBitmapDecoder iface)
static

Definition at line 71 of file decoder.c.

72{
75
76 TRACE("(%p) refcount=%lu\n", iface, ref);
77
78 return ref;
79}
#define InterlockedIncrement
Definition: armddk.h:53
static CommonDecoder * impl_from_IWICBitmapDecoder(IWICBitmapDecoder *iface)
Definition: decoder.c:44
#define TRACE(s)
Definition: solgame.cpp:4
Definition: send.c:48
uint32_t ULONG
Definition: typedefs.h:59

◆ CommonDecoder_CopyPalette()

static HRESULT WINAPI CommonDecoder_CopyPalette ( IWICBitmapDecoder iface,
IWICPalette palette 
)
static

Definition at line 163 of file decoder.c.

165{
166 TRACE("(%p,%p)\n", iface, palette);
168}
static HPALETTE palette
Definition: clipboard.c:1345
#define WINCODEC_ERR_PALETTEUNAVAILABLE
Definition: winerror.h:3292

◆ CommonDecoder_CreateInstance()

HRESULT CommonDecoder_CreateInstance ( struct decoder decoder,
const struct decoder_info decoder_info,
REFIID  iid,
void **  ppv 
)

Definition at line 780 of file decoder.c.

782{
784 HRESULT hr;
785
786 TRACE("(%s,%s,%p)\n", debugstr_guid(&decoder_info->clsid), debugstr_guid(iid), ppv);
787
788 This = malloc(sizeof(*This));
789 if (!This)
790 {
792 return E_OUTOFMEMORY;
793 }
794
795 This->IWICBitmapDecoder_iface.lpVtbl = &CommonDecoder_Vtbl;
796 This->ref = 1;
797 This->stream = NULL;
798 This->decoder = decoder;
799 This->decoder_info = *decoder_info;
800#ifdef __REACTOS__
802#else
804#endif
805 This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": CommonDecoder.lock");
806
807 hr = IWICBitmapDecoder_QueryInterface(&This->IWICBitmapDecoder_iface, iid, ppv);
808 IWICBitmapDecoder_Release(&This->IWICBitmapDecoder_iface);
809
810 return hr;
811}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define malloc
Definition: debug_ros.c:4
static const IWICBitmapDecoderVtbl CommonDecoder_Vtbl
Definition: decoder.c:227
#define NULL
Definition: types.h:112
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define debugstr_guid
Definition: kernel32.h:35
HRESULT hr
Definition: shlfolder.c:183
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
#define DWORD_PTR
Definition: treelist.c:76
void CDECL decoder_destroy(struct decoder *decoder)
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1116

Referenced by JpegDecoder_CreateInstance(), PngDecoder_CreateInstance(), and TiffDecoder_CreateInstance().

◆ CommonDecoder_GetColorContexts()

static HRESULT WINAPI CommonDecoder_GetColorContexts ( IWICBitmapDecoder iface,
UINT  cCount,
IWICColorContext **  ppIColorContexts,
UINT pcActualCount 
)
static

Definition at line 192 of file decoder.c.

194{
195 TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
197}
#define WINCODEC_ERR_UNSUPPORTEDOPERATION
Definition: winerror.h:3308

◆ CommonDecoder_GetContainerFormat()

static HRESULT WINAPI CommonDecoder_GetContainerFormat ( IWICBitmapDecoder iface,
GUID pguidContainerFormat 
)
static

Definition at line 146 of file decoder.c.

148{
150 memcpy(pguidContainerFormat, &This->decoder_info.container_format, sizeof(GUID));
151 return S_OK;
152}
#define S_OK
Definition: intsafe.h:52
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878

◆ CommonDecoder_GetDecoderInfo()

static HRESULT WINAPI CommonDecoder_GetDecoderInfo ( IWICBitmapDecoder iface,
IWICBitmapDecoderInfo **  ppIDecoderInfo 
)
static

Definition at line 154 of file decoder.c.

156{
158 TRACE("(%p,%p)\n", iface, ppIDecoderInfo);
159
160 return get_decoder_info(&This->decoder_info.clsid, ppIDecoderInfo);
161}
static GpStatus get_decoder_info(IStream *stream, const struct image_codec **result)
Definition: image.c:4285

◆ CommonDecoder_GetFrame()

static HRESULT WINAPI CommonDecoder_GetFrame ( IWICBitmapDecoder iface,
UINT  index,
IWICBitmapFrameDecode **  ppIBitmapFrame 
)
static

Definition at line 716 of file decoder.c.

718{
722
723 TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame);
724
725 if (!ppIBitmapFrame)
726 return E_INVALIDARG;
727
729
730 if (!This->stream || index >= This->file_info.frame_count)
732
733 if (SUCCEEDED(hr))
734 {
735 result = malloc(sizeof(*result));
736 if (!result)
738 }
739
740 if (SUCCEEDED(hr))
741 {
742 result->IWICBitmapFrameDecode_iface.lpVtbl = &CommonDecoderFrameVtbl;
743 result->IWICMetadataBlockReader_iface.lpVtbl = &CommonDecoderFrame_BlockVtbl;
744 result->ref = 1;
745 result->parent = This;
746 result->frame = index;
747 result->metadata_initialized = FALSE;
748 result->metadata_count = 0;
749 result->metadata_blocks = NULL;
750
751 hr = decoder_get_frame_info(This->decoder, index, &result->decoder_frame);
752
753 if (SUCCEEDED(hr) && This->cache_options == WICDecodeMetadataCacheOnLoad)
755
756 if (FAILED(hr))
757 free(result);
758 }
759
761
762 if (SUCCEEDED(hr))
763 {
764 TRACE("-> %ux%u, %u-bit pixelformat=%s res=%f,%f colors=%lu contexts=%lu\n",
765 result->decoder_frame.width, result->decoder_frame.height,
766 result->decoder_frame.bpp, wine_dbgstr_guid(&result->decoder_frame.pixel_format),
767 result->decoder_frame.dpix, result->decoder_frame.dpiy,
768 result->decoder_frame.num_colors, result->decoder_frame.num_color_contexts);
769 IWICBitmapDecoder_AddRef(&This->IWICBitmapDecoder_iface);
770 *ppIBitmapFrame = &result->IWICBitmapFrameDecode_iface;
771 }
772 else
773 {
774 *ppIBitmapFrame = NULL;
775 }
776
777 return hr;
778}
#define index(s, c)
Definition: various.h:29
#define E_INVALIDARG
Definition: ddrawi.h:101
#define free
Definition: debug_ros.c:5
static HRESULT CommonDecoderFrame_InitializeMetadata(CommonDecoderFrame *This)
Definition: decoder.c:567
static const IWICBitmapFrameDecodeVtbl CommonDecoderFrameVtbl
Definition: decoder.c:525
static const IWICMetadataBlockReaderVtbl CommonDecoderFrame_BlockVtbl
Definition: decoder.c:706
#define FALSE
Definition: types.h:117
GLuint index
Definition: glext.h:6031
GLuint64EXT * result
Definition: glext.h:11304
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
@ WICDecodeMetadataCacheOnLoad
Definition: wincodec.idl:30
HRESULT CDECL decoder_get_frame_info(struct decoder *decoder, UINT frame, struct decoder_frame *info)
#define WINCODEC_ERR_FRAMEMISSING
Definition: winerror.h:3301

◆ CommonDecoder_GetFrameCount()

static HRESULT WINAPI CommonDecoder_GetFrameCount ( IWICBitmapDecoder iface,
UINT pCount 
)
static

Definition at line 210 of file decoder.c.

212{
214 if (!pCount) return E_INVALIDARG;
215
216 if (This->stream)
217 *pCount = This->file_info.frame_count;
218 else
219 *pCount = 0;
220
221 return S_OK;
222}

◆ CommonDecoder_GetMetadataQueryReader()

static HRESULT WINAPI CommonDecoder_GetMetadataQueryReader ( IWICBitmapDecoder iface,
IWICMetadataQueryReader **  reader 
)
static

Definition at line 170 of file decoder.c.

172{
173 TRACE("(%p,%p)\n", iface, reader);
174
175 if (!reader) return E_INVALIDARG;
176
177 *reader = NULL;
179}
Definition: reader.h:84

◆ CommonDecoder_GetPreview()

static HRESULT WINAPI CommonDecoder_GetPreview ( IWICBitmapDecoder iface,
IWICBitmapSource **  ppIBitmapSource 
)
static

Definition at line 181 of file decoder.c.

183{
184 TRACE("(%p,%p)\n", iface, ppIBitmapSource);
185
186 if (!ppIBitmapSource) return E_INVALIDARG;
187
188 *ppIBitmapSource = NULL;
190}

◆ CommonDecoder_GetThumbnail()

static HRESULT WINAPI CommonDecoder_GetThumbnail ( IWICBitmapDecoder iface,
IWICBitmapSource **  ppIThumbnail 
)
static

Definition at line 199 of file decoder.c.

201{
202 TRACE("(%p,%p)\n", iface, ppIThumbnail);
203
204 if (!ppIThumbnail) return E_INVALIDARG;
205
206 *ppIThumbnail = NULL;
208}
#define WINCODEC_ERR_CODECNOTHUMBNAIL
Definition: winerror.h:3291

◆ CommonDecoder_Initialize()

static HRESULT WINAPI CommonDecoder_Initialize ( IWICBitmapDecoder iface,
IStream pIStream,
WICDecodeOptions  cacheOptions 
)
static

Definition at line 118 of file decoder.c.

120{
123
124 TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions);
125
127
128 if (This->stream)
130
131 if (SUCCEEDED(hr))
132 hr = decoder_initialize(This->decoder, pIStream, &This->file_info);
133
134 if (SUCCEEDED(hr))
135 {
136 This->cache_options = cacheOptions;
137 This->stream = pIStream;
138 IStream_AddRef(This->stream);
139 }
140
142
143 return hr;
144}
HRESULT CDECL decoder_initialize(struct decoder *decoder, IStream *stream, struct decoder_stat *st)
#define WINCODEC_ERR_WRONGSTATE
Definition: winerror.h:3281

◆ CommonDecoder_QueryCapability()

static HRESULT WINAPI CommonDecoder_QueryCapability ( IWICBitmapDecoder iface,
IStream stream,
DWORD capability 
)
static

Definition at line 101 of file decoder.c.

103{
105 HRESULT hr;
106
107 TRACE("(%p,%p,%p)\n", iface, stream, capability);
108
109 if (!stream || !capability) return E_INVALIDARG;
110
111 hr = IWICBitmapDecoder_Initialize(iface, stream, WICDecodeMetadataCacheOnDemand);
112 if (hr != S_OK) return hr;
113
114 *capability = (This->file_info.flags & DECODER_FLAGS_CAPABILITY_MASK);
115 return S_OK;
116}
Definition: parse.h:23
@ WICDecodeMetadataCacheOnDemand
Definition: wincodec.idl:29
#define DECODER_FLAGS_CAPABILITY_MASK

◆ CommonDecoder_QueryInterface()

static HRESULT WINAPI CommonDecoder_QueryInterface ( IWICBitmapDecoder iface,
REFIID  iid,
void **  ppv 
)
static

Definition at line 49 of file decoder.c.

51{
53 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
54
55 if (!ppv) return E_INVALIDARG;
56
57 if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid))
58 {
59 *ppv = &This->IWICBitmapDecoder_iface;
60 }
61 else
62 {
63 *ppv = NULL;
64 return E_NOINTERFACE;
65 }
66
67 IUnknown_AddRef((IUnknown*)*ppv);
68 return S_OK;
69}
const GUID IID_IUnknown
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ CommonDecoder_Release()

static ULONG WINAPI CommonDecoder_Release ( IWICBitmapDecoder iface)
static

Definition at line 81 of file decoder.c.

82{
85
86 TRACE("(%p) refcount=%lu\n", iface, ref);
87
88 if (ref == 0)
89 {
90 if (This->stream)
91 IStream_Release(This->stream);
92 This->lock.DebugInfo->Spare[0] = 0;
94 decoder_destroy(This->decoder);
95 free(This);
96 }
97
98 return ref;
99}
#define InterlockedDecrement
Definition: armddk.h:52
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)

◆ CommonDecoderFrame_AddRef()

static ULONG WINAPI CommonDecoderFrame_AddRef ( IWICBitmapFrameDecode iface)
static

Definition at line 293 of file decoder.c.

294{
297
298 TRACE("(%p) refcount=%lu\n", iface, ref);
299
300 return ref;
301}
static CommonDecoderFrame * impl_from_IWICBitmapFrameDecode(IWICBitmapFrameDecode *iface)
Definition: decoder.c:256

◆ CommonDecoderFrame_Block_AddRef()

static ULONG WINAPI CommonDecoderFrame_Block_AddRef ( IWICMetadataBlockReader iface)
static

Definition at line 546 of file decoder.c.

547{
549 return IWICBitmapFrameDecode_AddRef(&This->IWICBitmapFrameDecode_iface);
550}
static CommonDecoderFrame * impl_from_IWICMetadataBlockReader(IWICMetadataBlockReader *iface)
Definition: decoder.c:261

◆ CommonDecoderFrame_Block_GetContainerFormat()

static HRESULT WINAPI CommonDecoderFrame_Block_GetContainerFormat ( IWICMetadataBlockReader iface,
GUID pguidContainerFormat 
)
static

Definition at line 558 of file decoder.c.

560{
562 if (!pguidContainerFormat) return E_INVALIDARG;
563 *pguidContainerFormat = This->parent->decoder_info.block_format;
564 return S_OK;
565}

◆ CommonDecoderFrame_Block_GetCount()

static HRESULT WINAPI CommonDecoderFrame_Block_GetCount ( IWICMetadataBlockReader iface,
UINT pcCount 
)
static

Definition at line 588 of file decoder.c.

590{
592 HRESULT hr;
593
594 TRACE("%p,%p\n", iface, pcCount);
595
596 if (!pcCount) return E_INVALIDARG;
597
599 if (SUCCEEDED(hr))
600 *pcCount = This->metadata_count;
601
602 return hr;
603}

◆ CommonDecoderFrame_Block_GetEnumerator()

static HRESULT WINAPI CommonDecoderFrame_Block_GetEnumerator ( IWICMetadataBlockReader iface,
IEnumUnknown **  ppIEnumMetadata 
)
static

Definition at line 699 of file decoder.c.

701{
702 FIXME("%p,%p\n", iface, ppIEnumMetadata);
703 return E_NOTIMPL;
704}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ CommonDecoderFrame_Block_GetReaderByIndex()

static HRESULT WINAPI CommonDecoderFrame_Block_GetReaderByIndex ( IWICMetadataBlockReader iface,
UINT  nIndex,
IWICMetadataReader **  ppIMetadataReader 
)
static

Definition at line 605 of file decoder.c.

607{
609 HRESULT hr;
612
613 TRACE("%p,%d,%p\n", iface, nIndex, ppIMetadataReader);
614
615 if (!ppIMetadataReader)
616 return E_INVALIDARG;
617
619
620 if (SUCCEEDED(hr) && nIndex >= This->metadata_count)
622
623 if (SUCCEEDED(hr))
624 hr = create_instance(&CLSID_WICImagingFactory, &IID_IWICComponentFactory, (void**)&factory);
625
626 if (SUCCEEDED(hr))
627 hr = IWICComponentFactory_CreateStream(factory, &stream);
628
629 if (SUCCEEDED(hr))
630 {
631 if (This->metadata_blocks[nIndex].options & DECODER_BLOCK_FULL_STREAM)
632 {
634 offset.QuadPart = This->metadata_blocks[nIndex].offset;
635
636 hr = IWICStream_InitializeFromIStream(stream, This->parent->stream);
637
638 if (SUCCEEDED(hr))
639 hr = IWICStream_Seek(stream, offset, STREAM_SEEK_SET, NULL);
640 }
641 else
642 {
644
645 offset.QuadPart = This->metadata_blocks[nIndex].offset;
646 length.QuadPart = This->metadata_blocks[nIndex].length;
647
648 hr = IWICStream_InitializeFromIStreamRegion(stream, This->parent->stream,
649 offset, length);
650 }
651
652 if (This->metadata_blocks[nIndex].options & DECODER_BLOCK_READER_CLSID)
653 {
655 IWICPersistStream *persist;
656 if (SUCCEEDED(hr))
657 {
658 hr = create_instance(&This->metadata_blocks[nIndex].reader_clsid,
659 &IID_IWICMetadataReader, (void**)&reader);
660 }
661
662 if (SUCCEEDED(hr))
663 {
664 hr = IWICMetadataReader_QueryInterface(reader, &IID_IWICPersistStream, (void**)&persist);
665
666 if (SUCCEEDED(hr))
667 {
668 hr = IWICPersistStream_LoadEx(persist, (IStream*)stream, NULL,
669 This->metadata_blocks[nIndex].options & DECODER_BLOCK_OPTION_MASK);
670
671 IWICPersistStream_Release(persist);
672 }
673
674 if (SUCCEEDED(hr))
675 *ppIMetadataReader = reader;
676 else
677 IWICMetadataReader_Release(reader);
678 }
679 }
680 else
681 {
682 hr = IWICComponentFactory_CreateMetadataReaderFromContainer(factory,
683 &This->parent->decoder_info.block_format, NULL,
684 This->metadata_blocks[nIndex].options & DECODER_BLOCK_OPTION_MASK,
685 (IStream*)stream, ppIMetadataReader);
686 }
687
688 IWICStream_Release(stream);
689 }
690
691 if (factory) IWICComponentFactory_Release(factory);
692
693 if (FAILED(hr))
694 *ppIMetadataReader = NULL;
695
696 return S_OK;
697}
HRESULT create_instance(const CLSID *clsid, const IID *iid, void **ppv)
Definition: clsfactory.c:212
GLintptr offset
Definition: glext.h:5920
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
Definition: main.c:439
#define DECODER_BLOCK_READER_CLSID
#define DECODER_BLOCK_OPTION_MASK
#define DECODER_BLOCK_FULL_STREAM

◆ CommonDecoderFrame_Block_QueryInterface()

static HRESULT WINAPI CommonDecoderFrame_Block_QueryInterface ( IWICMetadataBlockReader iface,
REFIID  iid,
void **  ppv 
)
static

Definition at line 539 of file decoder.c.

541{
543 return IWICBitmapFrameDecode_QueryInterface(&This->IWICBitmapFrameDecode_iface, iid, ppv);
544}

◆ CommonDecoderFrame_Block_Release()

static ULONG WINAPI CommonDecoderFrame_Block_Release ( IWICMetadataBlockReader iface)
static

Definition at line 552 of file decoder.c.

553{
555 return IWICBitmapFrameDecode_Release(&This->IWICBitmapFrameDecode_iface);
556}

◆ CommonDecoderFrame_CopyPalette()

static HRESULT WINAPI CommonDecoderFrame_CopyPalette ( IWICBitmapFrameDecode iface,
IWICPalette pIPalette 
)
static

Definition at line 364 of file decoder.c.

366{
369
370 TRACE("(%p,%p)\n", iface, pIPalette);
371
372 if (This->decoder_frame.num_colors)
373 {
374 hr = IWICPalette_InitializeCustom(pIPalette, This->decoder_frame.palette, This->decoder_frame.num_colors);
375 }
376 else
377 {
379 }
380
381 return hr;
382}

◆ CommonDecoderFrame_CopyPixels()

static HRESULT WINAPI CommonDecoderFrame_CopyPixels ( IWICBitmapFrameDecode iface,
const WICRect prc,
UINT  cbStride,
UINT  cbBufferSize,
BYTE pbBuffer 
)
static

Definition at line 384 of file decoder.c.

386{
388 HRESULT hr;
389 UINT bytesperrow;
391
392 TRACE("(%p,%s,%u,%u,%p)\n", iface, debug_wic_rect(prc), cbStride, cbBufferSize, pbBuffer);
393
394 if (!pbBuffer)
395 return E_POINTER;
396
397 if (!prc)
398 {
399 rect.X = 0;
400 rect.Y = 0;
401 rect.Width = This->decoder_frame.width;
402 rect.Height = This->decoder_frame.height;
403 prc = &rect;
404 }
405 else
406 {
407 if (prc->X < 0 || prc->Y < 0 ||
408 prc->X+prc->Width > This->decoder_frame.width ||
409 prc->Y+prc->Height > This->decoder_frame.height)
410 return E_INVALIDARG;
411 }
412
413 bytesperrow = ((This->decoder_frame.bpp * prc->Width)+7)/8;
414
415 if (cbStride < bytesperrow)
416 return E_INVALIDARG;
417
418 if ((cbStride * (prc->Height-1)) + bytesperrow > cbBufferSize)
419 return E_INVALIDARG;
420
421 EnterCriticalSection(&This->parent->lock);
422
423 hr = decoder_copy_pixels(This->parent->decoder, This->frame,
424 prc, cbStride, cbBufferSize, pbBuffer);
425
426 LeaveCriticalSection(&This->parent->lock);
427
428 return hr;
429}
unsigned int UINT
Definition: ndis.h:50
_Out_ LPRECT prc
Definition: ntgdi.h:1658
& rect
Definition: startmenu.cpp:1413
HRESULT CDECL decoder_copy_pixels(struct decoder *decoder, UINT frame, const WICRect *prc, UINT stride, UINT buffersize, BYTE *buffer)
static const char * debug_wic_rect(const WICRect *rect)
#define E_POINTER
Definition: winerror.h:2365

◆ CommonDecoderFrame_GetColorContexts()

static HRESULT WINAPI CommonDecoderFrame_GetColorContexts ( IWICBitmapFrameDecode iface,
UINT  cCount,
IWICColorContext **  ppIColorContexts,
UINT pcActualCount 
)
static

Definition at line 460 of file decoder.c.

462{
465 UINT i;
466 BYTE *profile;
467 DWORD profile_len;
468
469 TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
470
471 if (!pcActualCount) return E_INVALIDARG;
472
473 if (This->parent->file_info.flags & DECODER_FLAGS_UNSUPPORTED_COLOR_CONTEXT)
474 {
475 FIXME("not supported for %s\n", wine_dbgstr_guid(&This->parent->decoder_info.clsid));
476 *pcActualCount = 0;
478 }
479
480 *pcActualCount = This->decoder_frame.num_color_contexts;
481
482 if (This->decoder_frame.num_color_contexts && cCount && ppIColorContexts)
483 {
484 if (cCount >= This->decoder_frame.num_color_contexts)
485 {
486 EnterCriticalSection(&This->parent->lock);
487
488 for (i=0; i<This->decoder_frame.num_color_contexts; i++)
489 {
490 hr = decoder_get_color_context(This->parent->decoder, This->frame, i,
491 &profile, &profile_len);
492 if (SUCCEEDED(hr))
493 {
494 hr = IWICColorContext_InitializeFromMemory(ppIColorContexts[i], profile, profile_len);
495
496 free(profile);
497 }
498
499 if (FAILED(hr))
500 break;
501 }
502
503 LeaveCriticalSection(&This->parent->lock);
504 }
505 else
506 {
508 }
509 }
510
511 return hr;
512}
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define profile
Definition: kernel32.h:12
HRESULT CDECL decoder_get_color_context(struct decoder *decoder, UINT frame, UINT num, BYTE **data, DWORD *datasize)
#define DECODER_FLAGS_UNSUPPORTED_COLOR_CONTEXT
unsigned char BYTE
Definition: xxhash.c:193

◆ CommonDecoderFrame_GetMetadataQueryReader()

static HRESULT WINAPI CommonDecoderFrame_GetMetadataQueryReader ( IWICBitmapFrameDecode iface,
IWICMetadataQueryReader **  ppIMetadataQueryReader 
)
static

Definition at line 431 of file decoder.c.

433{
436 HRESULT hr;
437
438 TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
439
440 if (!ppIMetadataQueryReader)
441 return E_INVALIDARG;
442
443 if (!(This->parent->file_info.flags & WICBitmapDecoderCapabilityCanEnumerateMetadata))
445
446 hr = create_instance(&CLSID_WICImagingFactory, &IID_IWICComponentFactory, (void**)&factory);
447
448 if (SUCCEEDED(hr))
449 {
450 hr = IWICComponentFactory_CreateQueryReaderFromBlockReader(factory, &This->IWICMetadataBlockReader_iface, ppIMetadataQueryReader);
451 IWICComponentFactory_Release(factory);
452 }
453
454 if (FAILED(hr))
455 *ppIMetadataQueryReader = NULL;
456
457 return hr;
458}
@ WICBitmapDecoderCapabilityCanEnumerateMetadata
Definition: wincodec.idl:52

◆ CommonDecoderFrame_GetPixelFormat()

static HRESULT WINAPI CommonDecoderFrame_GetPixelFormat ( IWICBitmapFrameDecode iface,
WICPixelFormatGUID pPixelFormat 
)
static

Definition at line 335 of file decoder.c.

337{
339
340 TRACE("(%p,%p)\n", This, pPixelFormat);
341
342 if (!pPixelFormat)
343 return E_POINTER;
344
345 *pPixelFormat = This->decoder_frame.pixel_format;
346 return S_OK;
347}

◆ CommonDecoderFrame_GetResolution()

static HRESULT WINAPI CommonDecoderFrame_GetResolution ( IWICBitmapFrameDecode iface,
double pDpiX,
double pDpiY 
)
static

Definition at line 349 of file decoder.c.

351{
353
354 TRACE("(%p,%p,%p)\n", This, pDpiX, pDpiY);
355
356 if (!pDpiX || !pDpiY)
357 return E_POINTER;
358
359 *pDpiX = This->decoder_frame.dpix;
360 *pDpiY = This->decoder_frame.dpiy;
361 return S_OK;
362}

◆ CommonDecoderFrame_GetSize()

static HRESULT WINAPI CommonDecoderFrame_GetSize ( IWICBitmapFrameDecode iface,
UINT puiWidth,
UINT puiHeight 
)
static

Definition at line 320 of file decoder.c.

322{
324
325 TRACE("(%p,%p,%p)\n", This, puiWidth, puiHeight);
326
327 if (!puiWidth || !puiHeight)
328 return E_POINTER;
329
330 *puiWidth = This->decoder_frame.width;
331 *puiHeight = This->decoder_frame.height;
332 return S_OK;
333}

◆ CommonDecoderFrame_GetThumbnail()

static HRESULT WINAPI CommonDecoderFrame_GetThumbnail ( IWICBitmapFrameDecode iface,
IWICBitmapSource **  ppIThumbnail 
)
static

Definition at line 514 of file decoder.c.

516{
517 TRACE("(%p,%p)\n", iface, ppIThumbnail);
518
519 if (!ppIThumbnail) return E_INVALIDARG;
520
521 *ppIThumbnail = NULL;
523}

◆ CommonDecoderFrame_InitializeMetadata()

static HRESULT CommonDecoderFrame_InitializeMetadata ( CommonDecoderFrame This)
static

Definition at line 567 of file decoder.c.

568{
570
571 if (This->metadata_initialized)
572 return S_OK;
573
574 EnterCriticalSection(&This->parent->lock);
575
576 if (!This->metadata_initialized)
577 {
578 hr = decoder_get_metadata_blocks(This->parent->decoder, This->frame, &This->metadata_count, &This->metadata_blocks);
579 if (SUCCEEDED(hr))
580 This->metadata_initialized = TRUE;
581 }
582
583 LeaveCriticalSection(&This->parent->lock);
584
585 return hr;
586}
#define TRUE
Definition: types.h:120
HRESULT CDECL decoder_get_metadata_blocks(struct decoder *decoder, UINT frame, UINT *count, struct decoder_block **blocks)

Referenced by CommonDecoder_GetFrame(), CommonDecoderFrame_Block_GetCount(), and CommonDecoderFrame_Block_GetReaderByIndex().

◆ CommonDecoderFrame_QueryInterface()

static HRESULT WINAPI CommonDecoderFrame_QueryInterface ( IWICBitmapFrameDecode iface,
REFIID  iid,
void **  ppv 
)
static

Definition at line 266 of file decoder.c.

268{
270 if (!ppv) return E_INVALIDARG;
271
272 if (IsEqualIID(&IID_IUnknown, iid) ||
273 IsEqualIID(&IID_IWICBitmapSource, iid) ||
274 IsEqualIID(&IID_IWICBitmapFrameDecode, iid))
275 {
276 *ppv = &This->IWICBitmapFrameDecode_iface;
277 }
278 else if (IsEqualIID(&IID_IWICMetadataBlockReader, iid) &&
279 (This->parent->file_info.flags & WICBitmapDecoderCapabilityCanEnumerateMetadata))
280 {
281 *ppv = &This->IWICMetadataBlockReader_iface;
282 }
283 else
284 {
285 *ppv = NULL;
286 return E_NOINTERFACE;
287 }
288
289 IUnknown_AddRef((IUnknown*)*ppv);
290 return S_OK;
291}

◆ CommonDecoderFrame_Release()

static ULONG WINAPI CommonDecoderFrame_Release ( IWICBitmapFrameDecode iface)
static

Definition at line 303 of file decoder.c.

304{
307
308 TRACE("(%p) refcount=%lu\n", iface, ref);
309
310 if (ref == 0)
311 {
312 IWICBitmapDecoder_Release(&This->parent->IWICBitmapDecoder_iface);
313 free(This->metadata_blocks);
314 free(This);
315 }
316
317 return ref;
318}

◆ impl_from_IWICBitmapDecoder()

static CommonDecoder * impl_from_IWICBitmapDecoder ( IWICBitmapDecoder iface)
inlinestatic

◆ impl_from_IWICBitmapFrameDecode()

◆ impl_from_IWICMetadataBlockReader()

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( wincodecs  )

Variable Documentation

◆ CommonDecoder_Vtbl

const IWICBitmapDecoderVtbl CommonDecoder_Vtbl
static
Initial value:
= {
}
static ULONG WINAPI CommonDecoder_AddRef(IWICBitmapDecoder *iface)
Definition: decoder.c:71
static HRESULT WINAPI CommonDecoder_GetColorContexts(IWICBitmapDecoder *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
Definition: decoder.c:192
static HRESULT WINAPI CommonDecoder_GetFrameCount(IWICBitmapDecoder *iface, UINT *pCount)
Definition: decoder.c:210
static HRESULT WINAPI CommonDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *stream, DWORD *capability)
Definition: decoder.c:101
static HRESULT WINAPI CommonDecoder_GetDecoderInfo(IWICBitmapDecoder *iface, IWICBitmapDecoderInfo **ppIDecoderInfo)
Definition: decoder.c:154
static ULONG WINAPI CommonDecoder_Release(IWICBitmapDecoder *iface)
Definition: decoder.c:81
static HRESULT WINAPI CommonDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid, void **ppv)
Definition: decoder.c:49
static HRESULT WINAPI CommonDecoder_GetThumbnail(IWICBitmapDecoder *iface, IWICBitmapSource **ppIThumbnail)
Definition: decoder.c:199
static HRESULT WINAPI CommonDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface, IWICMetadataQueryReader **reader)
Definition: decoder.c:170
static HRESULT WINAPI CommonDecoder_GetContainerFormat(IWICBitmapDecoder *iface, GUID *pguidContainerFormat)
Definition: decoder.c:146
static HRESULT WINAPI CommonDecoder_GetFrame(IWICBitmapDecoder *iface, UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
Definition: decoder.c:716
static HRESULT WINAPI CommonDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream, WICDecodeOptions cacheOptions)
Definition: decoder.c:118
static HRESULT WINAPI CommonDecoder_CopyPalette(IWICBitmapDecoder *iface, IWICPalette *palette)
Definition: decoder.c:163
static HRESULT WINAPI CommonDecoder_GetPreview(IWICBitmapDecoder *iface, IWICBitmapSource **ppIBitmapSource)
Definition: decoder.c:181

Definition at line 227 of file decoder.c.

Referenced by CommonDecoder_CreateInstance().

◆ CommonDecoderFrame_BlockVtbl

const IWICMetadataBlockReaderVtbl CommonDecoderFrame_BlockVtbl
static
Initial value:
= {
}
static ULONG WINAPI CommonDecoderFrame_Block_AddRef(IWICMetadataBlockReader *iface)
Definition: decoder.c:546
static HRESULT WINAPI CommonDecoderFrame_Block_GetCount(IWICMetadataBlockReader *iface, UINT *pcCount)
Definition: decoder.c:588
static HRESULT WINAPI CommonDecoderFrame_Block_GetEnumerator(IWICMetadataBlockReader *iface, IEnumUnknown **ppIEnumMetadata)
Definition: decoder.c:699
static HRESULT WINAPI CommonDecoderFrame_Block_GetReaderByIndex(IWICMetadataBlockReader *iface, UINT nIndex, IWICMetadataReader **ppIMetadataReader)
Definition: decoder.c:605
static ULONG WINAPI CommonDecoderFrame_Block_Release(IWICMetadataBlockReader *iface)
Definition: decoder.c:552
static HRESULT WINAPI CommonDecoderFrame_Block_QueryInterface(IWICMetadataBlockReader *iface, REFIID iid, void **ppv)
Definition: decoder.c:539
static HRESULT WINAPI CommonDecoderFrame_Block_GetContainerFormat(IWICMetadataBlockReader *iface, GUID *pguidContainerFormat)
Definition: decoder.c:558

Definition at line 706 of file decoder.c.

Referenced by CommonDecoder_GetFrame().

◆ CommonDecoderFrameVtbl

const IWICBitmapFrameDecodeVtbl CommonDecoderFrameVtbl
static
Initial value:
= {
}
static HRESULT WINAPI CommonDecoderFrame_GetThumbnail(IWICBitmapFrameDecode *iface, IWICBitmapSource **ppIThumbnail)
Definition: decoder.c:514
static HRESULT WINAPI CommonDecoderFrame_GetMetadataQueryReader(IWICBitmapFrameDecode *iface, IWICMetadataQueryReader **ppIMetadataQueryReader)
Definition: decoder.c:431
static HRESULT WINAPI CommonDecoderFrame_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, void **ppv)
Definition: decoder.c:266
static HRESULT WINAPI CommonDecoderFrame_GetPixelFormat(IWICBitmapFrameDecode *iface, WICPixelFormatGUID *pPixelFormat)
Definition: decoder.c:335
static HRESULT WINAPI CommonDecoderFrame_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette)
Definition: decoder.c:364
static HRESULT WINAPI CommonDecoderFrame_GetResolution(IWICBitmapFrameDecode *iface, double *pDpiX, double *pDpiY)
Definition: decoder.c:349
static HRESULT WINAPI CommonDecoderFrame_GetSize(IWICBitmapFrameDecode *iface, UINT *puiWidth, UINT *puiHeight)
Definition: decoder.c:320
static HRESULT WINAPI CommonDecoderFrame_GetColorContexts(IWICBitmapFrameDecode *iface, UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
Definition: decoder.c:460
static ULONG WINAPI CommonDecoderFrame_AddRef(IWICBitmapFrameDecode *iface)
Definition: decoder.c:293
static ULONG WINAPI CommonDecoderFrame_Release(IWICBitmapFrameDecode *iface)
Definition: decoder.c:303
static HRESULT WINAPI CommonDecoderFrame_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
Definition: decoder.c:384

Definition at line 525 of file decoder.c.

Referenced by CommonDecoder_GetFrame().