ReactOS 0.4.17-dev-923-g4c9a150
ddrawstream.c
Go to the documentation of this file.
1/*
2 * Primary DirectDraw video stream
3 *
4 * Copyright 2005, 2008, 2012 Christian Costa
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#define COBJMACROS
22#include "amstream_private.h"
23#include "wine/debug.h"
24#include "wine/list.h"
25#include "wine/strmbase.h"
26
28
29static const WCHAR sink_id[] = L"I{A35FF56A-9FDA-11D0-8FDF-00C04FD9189D}";
30
31struct format
32{
37};
38
40{
47
51 IDirectDraw *ddraw;
55
59 struct format format;
60 FILTER_STATE state;
64 CONDITION_VARIABLE update_queued_cv;
66};
67
69{
74 IDirectDrawSurface *surface;
79 CONDITION_VARIABLE update_cv;
81
82 struct list entry;
85};
86
87static HRESULT ddrawstreamsample_create(struct ddraw_stream *parent, IDirectDrawSurface *surface,
88 const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample);
89
91{
92 sample->busy = FALSE;
93 list_remove(&sample->entry);
94 WakeConditionVariable(&sample->update_cv);
95 if (sample->external_event)
96 SetEvent(sample->external_event);
97}
98
99static void flush_update_queue(struct ddraw_stream *stream, HRESULT update_hr)
100{
101 struct list *entry;
102 while ((entry = list_head(&stream->update_queue)))
103 {
105 sample->update_hr = update_hr;
107 }
108}
109
112{
114 DWORD row_size;
115 const BYTE *src_row;
116 BYTE *dst_row;
117 DWORD row;
118 HRESULT hr;
119
120 desc.dwSize = sizeof(desc);
121 hr = IDirectDrawSurface_Lock(sample->surface, &sample->rect, &desc, DDLOCK_WAIT, NULL);
122 if (FAILED(hr))
123 return hr;
124
125 row_size = (sample->rect.right - sample->rect.left) * desc.ddpfPixelFormat.dwRGBBitCount / 8;
126 src_row = pointer;
127 dst_row = desc.lpSurface;
128 for (row = sample->rect.top; row < sample->rect.bottom; ++row)
129 {
130 memcpy(dst_row, src_row, row_size);
131 src_row += stride;
132 dst_row += desc.lPitch;
133 }
134
135 hr = IDirectDrawSurface_Unlock(sample->surface, desc.lpSurface);
136 if (FAILED(hr))
137 return hr;
138
139 sample->start_time = start_time;
140 sample->end_time = end_time;
141
142 return S_OK;
143}
144
146 DWORD width, DWORD height, const DDPIXELFORMAT *connection_pf)
147{
148 if (stream->format.flags & DDSD_HEIGHT)
149 {
150 if (stream->format.width != width || stream->format.height != height)
151 return FALSE;
152 }
153 if (stream->format.flags & DDSD_PIXELFORMAT)
154 {
155 if (stream->format.pf.dwFlags & DDPF_FOURCC)
156 return FALSE;
157 if (stream->format.pf.dwRGBBitCount != connection_pf->dwRGBBitCount)
158 return FALSE;
159 if (stream->format.pf.dwRGBBitCount == 16 && stream->format.pf.dwGBitMask != connection_pf->dwGBitMask)
160 return FALSE;
161 }
162 return TRUE;
163}
164
166{
168}
169
170/*** IUnknown methods ***/
172 REFIID riid, void **ret_iface)
173{
175
176 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
177
179 IsEqualGUID(riid, &IID_IMediaStream) ||
180 IsEqualGUID(riid, &IID_IAMMediaStream))
181 {
182 IAMMediaStream_AddRef(iface);
183 *ret_iface = iface;
184 return S_OK;
185 }
186 else if (IsEqualGUID(riid, &IID_IDirectDrawMediaStream))
187 {
188 IAMMediaStream_AddRef(iface);
189 *ret_iface = &This->IDirectDrawMediaStream_iface;
190 return S_OK;
191 }
192 else if (IsEqualGUID(riid, &IID_IPin))
193 {
194 IAMMediaStream_AddRef(iface);
195 *ret_iface = &This->IPin_iface;
196 return S_OK;
197 }
198 else if (IsEqualGUID(riid, &IID_IMemInputPin))
199 {
200 IAMMediaStream_AddRef(iface);
201 *ret_iface = &This->IMemInputPin_iface;
202 return S_OK;
203 }
204
205 ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ret_iface);
206 return E_NOINTERFACE;
207}
208
210{
213
214 TRACE("(%p/%p)->(): new ref = %lu\n", iface, This, ref);
215
216 return ref;
217}
218
220{
223
224 TRACE("%p decreasing refcount to %lu.\n", stream, ref);
225
226 if (!ref)
227 {
229 if (stream->ddraw)
230 IDirectDraw_Release(stream->ddraw);
231 free(stream);
232 }
233
234 return ref;
235}
236
237/*** IMediaStream methods ***/
239 IMultiMediaStream **mmstream)
240{
242
243 TRACE("stream %p, mmstream %p.\n", stream, mmstream);
244
245 if (!mmstream)
246 return E_POINTER;
247
248 if (stream->parent)
249 IMultiMediaStream_AddRef(stream->parent);
250 *mmstream = stream->parent;
251 return S_OK;
252}
253
256{
258
259 TRACE("(%p/%p)->(%p,%p)\n", This, iface, purpose_id, type);
260
261 if (purpose_id)
262 *purpose_id = This->purpose_id;
263 if (type)
264 *type = This->stream_type;
265
266 return S_OK;
267}
268
270 IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
271{
273
274 FIXME("(%p/%p)->(%p,%lx) stub!\n", This, iface, pStreamThatHasDesiredFormat, flags);
275
276 return S_FALSE;
277}
278
281{
283
284 FIXME("(%p/%p)->(%lx,%p) stub!\n", This, iface, flags, sample);
285
286 return S_FALSE;
287}
288
290 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
291{
293
294 FIXME("(%p/%p)->(%p,%lx,%p) stub!\n", This, iface, existing_sample, flags, sample);
295
296 return S_FALSE;
297}
298
300{
302
303 FIXME("(%p/%p)->(%lx) stub!\n", This, iface, flags);
304
305 return S_FALSE;
306}
307
308/*** IAMMediaStream methods ***/
311{
313 HRESULT hr;
314
315 TRACE("stream %p, source_object %p, flags %lx, purpose_id %s, stream_type %u.\n", stream, source_object, flags,
317
318 if (!purpose_id)
319 return E_POINTER;
320
322 FIXME("AMMSF_CREATEPEER is not yet supported.\n");
323
324 stream->purpose_id = *purpose_id;
325 stream->stream_type = stream_type;
326
327 if (stream->ddraw)
328 IDirectDraw_Release(stream->ddraw);
329 stream->ddraw = NULL;
330
331 if (source_object
332 && FAILED(hr = IUnknown_QueryInterface(source_object, &IID_IDirectDraw, (void **)&stream->ddraw)))
333 FIXME("Stream object doesn't implement IDirectDraw interface, hr %#lx.\n", hr);
334
335 if (!source_object)
336 {
337 if (FAILED(hr = DirectDrawCreate(NULL, &stream->ddraw, NULL)))
338 return hr;
339 IDirectDraw_SetCooperativeLevel(stream->ddraw, NULL, DDSCL_NORMAL);
340 }
341
342 return S_OK;
343}
344
346{
348
349 TRACE("stream %p, state %u.\n", stream, state);
350
352
353 if (state == State_Stopped)
354 WakeConditionVariable(&stream->update_queued_cv);
355 if (stream->state == State_Stopped)
356 stream->eos = FALSE;
357
358 stream->state = state;
359
361
362 return S_OK;
363}
364
366{
368
369 TRACE("stream %p, mmstream %p.\n", stream, mmstream);
370
371 stream->parent = (IMultiMediaStream *)mmstream;
372
373 return S_OK;
374}
375
377{
379
380 TRACE("iface %p, filter %p.\n", iface, filter);
381
382 stream->filter = filter;
383
384 return S_OK;
385}
386
388{
390
391 TRACE("stream %p, filtergraph %p.\n", stream, filtergraph);
392
393 stream->graph = filtergraph;
394
395 return S_OK;
396}
397
398static const struct IAMMediaStreamVtbl ddraw_IAMMediaStream_vtbl =
399{
400 /*** IUnknown methods ***/
404 /*** IMediaStream methods ***/
411 /*** IAMMediaStream methods ***/
417};
418
420{
422}
423
424/*** IUnknown methods ***/
426 REFIID riid, void **ret_iface)
427{
429 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ret_iface);
430 return IAMMediaStream_QueryInterface(&This->IAMMediaStream_iface, riid, ret_iface);
431}
432
434{
436 TRACE("(%p/%p)\n", iface, This);
437 return IAMMediaStream_AddRef(&This->IAMMediaStream_iface);
438}
439
441{
443 TRACE("(%p/%p)\n", iface, This);
444 return IAMMediaStream_Release(&This->IAMMediaStream_iface);
445}
446
448 IMultiMediaStream **mmstream)
449{
451 return IAMMediaStream_GetMultiMediaStream(&stream->IAMMediaStream_iface, mmstream);
452}
453
456{
458 return IAMMediaStream_GetInformation(&stream->IAMMediaStream_iface, purpose_id, type);
459}
460
463{
465 return IAMMediaStream_SetSameFormat(&stream->IAMMediaStream_iface, other, flags);
466}
467
470{
472 return IAMMediaStream_AllocateSample(&stream->IAMMediaStream_iface, flags, sample);
473}
474
476 IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
477{
479 return IAMMediaStream_CreateSharedSample(&stream->IAMMediaStream_iface, existing_sample, flags, sample);
480}
481
483{
485 return IAMMediaStream_SendEndOfStream(&stream->IAMMediaStream_iface, flags);
486}
487
488/*** IDirectDrawMediaStream methods ***/
490 DDSURFACEDESC *current_format, IDirectDrawPalette **palette,
491 DDSURFACEDESC *desired_format, DWORD *flags)
492{
494
495 TRACE("stream %p, current_format %p, palette %p, desired_format %p, flags %p.\n", stream, current_format, palette,
496 desired_format, flags);
497
499
500 if (!stream->peer)
501 {
503 return MS_E_NOSTREAM;
504 }
505
506 if (current_format)
507 {
508 current_format->dwFlags = stream->format.flags | DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
509 current_format->dwWidth = stream->format.width;
510 current_format->dwHeight = stream->format.height;
511 current_format->ddpfPixelFormat = stream->format.pf;
512 current_format->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN;
513 }
514
515 if (palette)
516 *palette = NULL;
517
518 if (desired_format)
519 {
520 desired_format->dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
521 desired_format->dwWidth = stream->format.width;
522 desired_format->dwHeight = stream->format.height;
523 desired_format->ddpfPixelFormat = stream->format.pf;
524 desired_format->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN;
525 }
526
527 if (flags)
528 *flags = 0;
529
531
532 return S_OK;
533}
534
536 const DDSURFACEDESC *format, IDirectDrawPalette *palette)
537{
539 AM_MEDIA_TYPE old_media_type;
540 struct format old_format;
541 IPin *old_peer;
542 HRESULT hr;
543
544 TRACE("stream %p, format %p, palette %p.\n", stream, format, palette);
545
546 if (palette)
547 FIXME("Setting palette is not yet supported.\n");
548
549 if (!format)
550 return E_POINTER;
551
552 if (format->dwSize != sizeof(DDSURFACEDESC))
553 return E_INVALIDARG;
554
555 TRACE("flags %#lx, pixel format flags %#lx, bit count %lu, size %lux%lu.\n",
556 format->dwFlags, format->ddpfPixelFormat.dwFlags,
557 format->ddpfPixelFormat.dwRGBBitCount, format->dwWidth, format->dwHeight);
558
559 if (format->dwFlags & DDSD_PIXELFORMAT)
560 {
561 if (format->ddpfPixelFormat.dwSize != sizeof(DDPIXELFORMAT))
563
564 if (format->ddpfPixelFormat.dwFlags & DDPF_FOURCC)
565 {
566 if (!format->ddpfPixelFormat.dwRGBBitCount)
567 return E_INVALIDARG;
568 }
569 else
570 {
571 if (format->ddpfPixelFormat.dwFlags & (DDPF_YUV | DDPF_PALETTEINDEXED1 |
574
575 if (!(format->ddpfPixelFormat.dwFlags & DDPF_RGB))
577
578 switch (format->ddpfPixelFormat.dwRGBBitCount)
579 {
580 case 8:
581 if (!(format->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8))
583 break;
584 case 16:
585 if (format->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)
587 if ((format->ddpfPixelFormat.dwRBitMask != 0x7c00 ||
588 format->ddpfPixelFormat.dwGBitMask != 0x03e0 ||
589 format->ddpfPixelFormat.dwBBitMask != 0x001f) &&
590 (format->ddpfPixelFormat.dwRBitMask != 0xf800 ||
591 format->ddpfPixelFormat.dwGBitMask != 0x07e0 ||
592 format->ddpfPixelFormat.dwBBitMask != 0x001f))
594 break;
595 case 24:
596 case 32:
597 if (format->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)
599 if (format->ddpfPixelFormat.dwRBitMask != 0xff0000 ||
600 format->ddpfPixelFormat.dwGBitMask != 0x00ff00 ||
601 format->ddpfPixelFormat.dwBBitMask != 0x0000ff)
603 break;
604 default:
606 }
607 }
608 }
609
611
612 old_format = stream->format;
613 stream->format.flags = format->dwFlags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT);
614 if (format->dwFlags & (DDSD_WIDTH | DDSD_HEIGHT))
615 {
616 stream->format.width = format->dwWidth;
617 stream->format.height = format->dwHeight;
618 }
619 if (format->dwFlags & DDSD_PIXELFORMAT)
620 stream->format.pf = format->ddpfPixelFormat;
621
622 if (stream->peer && !is_format_compatible(stream, old_format.width, old_format.height, &old_format.pf))
623 {
624 hr = CopyMediaType(&old_media_type, &stream->mt);
625 if (FAILED(hr))
626 {
627 stream->format = old_format;
629 return hr;
630 }
631 old_peer = stream->peer;
632 IPin_AddRef(old_peer);
633
634 IFilterGraph_Disconnect(stream->graph, stream->peer);
635 IFilterGraph_Disconnect(stream->graph, &stream->IPin_iface);
636 hr = IFilterGraph_ConnectDirect(stream->graph, old_peer, &stream->IPin_iface, NULL);
637 if (FAILED(hr))
638 {
639 stream->format = old_format;
640 IFilterGraph_ConnectDirect(stream->graph, old_peer, &stream->IPin_iface, &old_media_type);
641 IPin_Release(old_peer);
642 FreeMediaType(&old_media_type);
645 }
646
647 IPin_Release(old_peer);
648 FreeMediaType(&old_media_type);
649 }
650
652
653 return S_OK;
654}
655
657 IDirectDraw **ddraw)
658{
660
661 TRACE("stream %p, ddraw %p.\n", stream, ddraw);
662
663 if (!ddraw)
664 return E_POINTER;
665
666 if (!stream->ddraw)
667 {
668 *ddraw = NULL;
669 return S_OK;
670 }
671
672 IDirectDraw_AddRef(stream->ddraw);
673 *ddraw = stream->ddraw;
674
675 return S_OK;
676}
677
679 IDirectDraw *ddraw)
680{
682
683 TRACE("stream %p, ddraw %p.\n", stream, ddraw);
684
686
687 if (stream->sample_refs)
688 {
689 HRESULT hr = (stream->ddraw == ddraw) ? S_OK : MS_E_SAMPLEALLOC;
691 return hr;
692 }
693
694 if (stream->ddraw)
695 IDirectDraw_Release(stream->ddraw);
696
697 if (ddraw)
698 {
699 IDirectDraw_AddRef(ddraw);
700 stream->ddraw = ddraw;
701 }
702 else
703 stream->ddraw = NULL;
704
706
707 return S_OK;
708}
709
711 IDirectDrawSurface *surface, const RECT *rect, DWORD flags,
713{
715 HRESULT hr;
716
717 TRACE("stream %p, surface %p, rect %s, flags %#lx, sample %p.\n",
719
720 if (!surface && rect)
721 return E_INVALIDARG;
722
726
727 return hr;
728}
729
731 STREAM_TIME *frame_time)
732{
734
735 TRACE("stream %p, frame_time %p.\n", stream, frame_time);
736
737 if (!frame_time)
738 return E_POINTER;
739
741
742 if (!stream->peer)
743 {
745 return MS_E_NOSTREAM;
746 }
747
748 *frame_time = ((VIDEOINFO *)stream->mt.pbFormat)->AvgTimePerFrame;
749
751
752 return S_OK;
753}
754
755static const struct IDirectDrawMediaStreamVtbl ddraw_IDirectDrawMediaStream_Vtbl =
756{
757 /*** IUnknown methods ***/
761 /*** IMediaStream methods ***/
768 /*** IDirectDrawMediaStream methods ***/
775};
776
777struct enum_media_types
778{
781 unsigned int index;
782};
783
784static const IEnumMediaTypesVtbl enum_media_types_vtbl;
785
787{
789}
790
792{
793 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
794
795 if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IEnumMediaTypes))
796 {
797 IEnumMediaTypes_AddRef(iface);
798 *out = iface;
799 return S_OK;
800 }
801
802 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
803 *out = NULL;
804 return E_NOINTERFACE;
805}
806
808{
811 TRACE("%p increasing refcount to %lu.\n", enum_media_types, refcount);
812 return refcount;
813}
814
816{
819 TRACE("%p decreasing refcount to %lu.\n", enum_media_types, refcount);
820 if (!refcount)
822 return refcount;
823}
824
826{
828
829 TRACE("iface %p, count %lu, mts %p, ret_count %p.\n", iface, count, mts, ret_count);
830
831 if (!ret_count)
832 return E_POINTER;
833
835 {
836 mts[0] = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
837 memset(mts[0], 0, sizeof(AM_MEDIA_TYPE));
838 mts[0]->majortype = MEDIATYPE_Video;
839 mts[0]->subtype = MEDIASUBTYPE_RGB8;
840 mts[0]->bFixedSizeSamples = TRUE;
841 mts[0]->lSampleSize = 10000;
843 *ret_count = 1;
844 return count == 1 ? S_OK : S_FALSE;
845 }
846
847 *ret_count = 0;
848 return count ? S_FALSE : S_OK;
849}
850
852{
854
855 TRACE("iface %p, count %lu.\n", iface, count);
856
858
859 return S_OK;
860}
861
863{
865
866 TRACE("iface %p.\n", iface);
867
869 return S_OK;
870}
871
873{
875 struct enum_media_types *object;
876
877 TRACE("iface %p, out %p.\n", iface, out);
878
879 if (!(object = calloc(1, sizeof(*object))))
880 return E_OUTOFMEMORY;
881
882 object->IEnumMediaTypes_iface.lpVtbl = &enum_media_types_vtbl;
883 object->refcount = 1;
884 object->index = enum_media_types->index;
885
886 *out = &object->IEnumMediaTypes_iface;
887 return S_OK;
888}
889
890static const IEnumMediaTypesVtbl enum_media_types_vtbl =
891{
899};
900
901static inline struct ddraw_stream *impl_from_IPin(IPin *iface)
902{
903 return CONTAINING_RECORD(iface, struct ddraw_stream, IPin_iface);
904}
905
907{
908 struct ddraw_stream *stream = impl_from_IPin(iface);
909 return IAMMediaStream_QueryInterface(&stream->IAMMediaStream_iface, iid, out);
910}
911
913{
914 struct ddraw_stream *stream = impl_from_IPin(iface);
915 return IAMMediaStream_AddRef(&stream->IAMMediaStream_iface);
916}
917
919{
920 struct ddraw_stream *stream = impl_from_IPin(iface);
921 return IAMMediaStream_Release(&stream->IAMMediaStream_iface);
922}
923
925{
926 WARN("iface %p, peer %p, mt %p, unexpected call!\n", iface, peer, mt);
927 return E_UNEXPECTED;
928}
929
931{
932 struct ddraw_stream *stream = impl_from_IPin(iface);
933 const VIDEOINFOHEADER *video_info;
935 DWORD width;
937 DDPIXELFORMAT pf = {sizeof(DDPIXELFORMAT)};
938
939 TRACE("stream %p, peer %p, mt %p.\n", stream, peer, mt);
940
942
943 if (stream->peer)
944 {
947 }
948
949 if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Video)
950 || !IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
951 {
954 }
955
956 video_info = (const VIDEOINFOHEADER *)mt->pbFormat;
957
958 width = video_info->bmiHeader.biWidth;
959 height = abs(video_info->bmiHeader.biHeight);
960 pf.dwFlags = DDPF_RGB;
961 if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB8))
962 {
964 pf.dwRGBBitCount = 8;
965 }
966 else if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB555))
967 {
968 pf.dwRGBBitCount = 16;
969 pf.dwRBitMask = 0x7c00;
970 pf.dwGBitMask = 0x03e0;
971 pf.dwBBitMask = 0x001f;
972 }
973 else if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB565))
974 {
975 pf.dwRGBBitCount = 16;
976 pf.dwRBitMask = 0xf800;
977 pf.dwGBitMask = 0x07e0;
978 pf.dwBBitMask = 0x001f;
979 }
980 else if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB24))
981 {
982 pf.dwRGBBitCount = 24;
983 pf.dwRBitMask = 0xff0000;
984 pf.dwGBitMask = 0x00ff00;
985 pf.dwBBitMask = 0x0000ff;
986 }
987 else if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB32))
988 {
989 pf.dwRGBBitCount = 32;
990 pf.dwRBitMask = 0xff0000;
991 pf.dwGBitMask = 0x00ff00;
992 pf.dwBBitMask = 0x0000ff;
993 }
994 else
995 {
998 }
999
1001 {
1004 }
1005
1006 IPin_QueryDirection(peer, &dir);
1007 if (dir != PINDIR_OUTPUT)
1008 {
1009 WARN("Rejecting connection from input pin.\n");
1012 }
1013
1014 CopyMediaType(&stream->mt, mt);
1015 IPin_AddRef(stream->peer = peer);
1016
1017 stream->format.width = width;
1018 stream->format.height = height;
1019 if (!(stream->format.flags & DDSD_PIXELFORMAT))
1020 stream->format.pf = pf;
1021
1023
1024 return S_OK;
1025}
1026
1028{
1029 struct ddraw_stream *stream = impl_from_IPin(iface);
1030
1031 TRACE("stream %p.\n", stream);
1032
1034
1035 if (!stream->peer)
1036 {
1038 return S_FALSE;
1039 }
1040
1041 IPin_Release(stream->peer);
1042 stream->peer = NULL;
1043 FreeMediaType(&stream->mt);
1044 memset(&stream->mt, 0, sizeof(AM_MEDIA_TYPE));
1045
1047
1048 return S_OK;
1049}
1050
1052{
1053 struct ddraw_stream *stream = impl_from_IPin(iface);
1054 HRESULT hr;
1055
1056 TRACE("stream %p, peer %p.\n", stream, peer);
1057
1059
1060 if (stream->peer)
1061 {
1062 IPin_AddRef(*peer = stream->peer);
1063 hr = S_OK;
1064 }
1065 else
1066 {
1067 *peer = NULL;
1069 }
1070
1072
1073 return hr;
1074}
1075
1077{
1078 struct ddraw_stream *stream = impl_from_IPin(iface);
1079 HRESULT hr;
1080
1081 TRACE("stream %p, mt %p.\n", stream, mt);
1082
1084
1085 if (stream->peer)
1086 {
1087 CopyMediaType(mt, &stream->mt);
1088 hr = S_OK;
1089 }
1090 else
1091 {
1092 memset(mt, 0, sizeof(AM_MEDIA_TYPE));
1094 }
1095
1097
1098 return hr;
1099}
1100
1102{
1103 struct ddraw_stream *stream = impl_from_IPin(iface);
1104
1105 TRACE("stream %p, info %p.\n", stream, info);
1106
1107 IBaseFilter_AddRef(info->pFilter = (IBaseFilter *)stream->filter);
1108 info->dir = PINDIR_INPUT;
1109 wcscpy(info->achName, sink_id);
1110
1111 return S_OK;
1112}
1113
1115{
1116 TRACE("iface %p, dir %p.\n", iface, dir);
1117 *dir = PINDIR_INPUT;
1118 return S_OK;
1119}
1120
1122{
1123 TRACE("iface %p, id %p.\n", iface, id);
1124
1125 if (!(*id = CoTaskMemAlloc(sizeof(sink_id))))
1126 return E_OUTOFMEMORY;
1127
1128 wcscpy(*id, sink_id);
1129
1130 return S_OK;
1131}
1132
1134{
1135 TRACE("iface %p, mt %p.\n", iface, mt);
1136
1137 if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Video)
1138 && IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB8)
1139 && IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
1140 return S_OK;
1141
1143}
1144
1146{
1147 struct enum_media_types *object;
1148
1149 TRACE("iface %p, enum_media_types %p.\n", iface, enum_media_types);
1150
1151 if (!enum_media_types)
1152 return E_POINTER;
1153
1154 if (!(object = calloc(1, sizeof(*object))))
1155 return E_OUTOFMEMORY;
1156
1157 object->IEnumMediaTypes_iface.lpVtbl = &enum_media_types_vtbl;
1158 object->refcount = 1;
1159 object->index = 0;
1160
1162 return S_OK;
1163}
1164
1166{
1167 TRACE("iface %p, pins %p, count %p.\n", iface, pins, count);
1168 return E_NOTIMPL;
1169}
1170
1172{
1173 struct ddraw_stream *stream = impl_from_IPin(iface);
1174
1175 TRACE("stream %p.\n", stream);
1176
1178
1179 if (stream->eos || stream->flushing)
1180 {
1182 return E_FAIL;
1183 }
1184
1185 stream->eos = TRUE;
1186
1187 flush_update_queue(stream, MS_S_ENDOFSTREAM);
1188
1190
1191 /* Calling IMediaStreamFilter::EndOfStream() inside the critical section
1192 * would invert the locking order, so we must leave it first to avoid
1193 * the streaming thread deadlocking on the filter's critical section. */
1194 IMediaStreamFilter_EndOfStream(stream->filter);
1195
1196 return S_OK;
1197}
1198
1200{
1201 struct ddraw_stream *stream = impl_from_IPin(iface);
1202 BOOL cancel_eos;
1203
1204 TRACE("stream %p.\n", stream);
1205
1207
1208 cancel_eos = stream->eos;
1209
1210 stream->flushing = TRUE;
1211 stream->eos = FALSE;
1212 WakeConditionVariable(&stream->update_queued_cv);
1213
1215
1216 /* Calling IMediaStreamFilter::Flush() inside the critical section would
1217 * invert the locking order, so we must leave it first to avoid the
1218 * application thread deadlocking on the filter's critical section. */
1219 IMediaStreamFilter_Flush(stream->filter, cancel_eos);
1220
1221 return S_OK;
1222}
1223
1225{
1226 struct ddraw_stream *stream = impl_from_IPin(iface);
1227
1228 TRACE("stream %p.\n", stream);
1229
1231
1232 stream->flushing = FALSE;
1233
1235
1236 return S_OK;
1237}
1238
1240{
1241 struct ddraw_stream *stream = impl_from_IPin(iface);
1242
1243 TRACE("stream %p, start %s, stop %s, rate %0.16e\n",
1245
1247
1248 stream->segment_start = start;
1249
1251
1252 return S_OK;
1253}
1254
1255static const IPinVtbl ddraw_sink_vtbl =
1256{
1275};
1276
1278{
1279 return CONTAINING_RECORD(iface, struct ddraw_stream, IMemInputPin_iface);
1280}
1281
1283{
1285 return IAMMediaStream_QueryInterface(&stream->IAMMediaStream_iface, iid, out);
1286}
1287
1289{
1291 return IAMMediaStream_AddRef(&stream->IAMMediaStream_iface);
1292}
1293
1295{
1297 return IAMMediaStream_Release(&stream->IAMMediaStream_iface);
1298}
1299
1301{
1303
1304 TRACE("stream %p, allocator %p.\n", stream, allocator);
1305
1306 if (stream->allocator)
1307 {
1308 IMemAllocator_AddRef(*allocator = stream->allocator);
1309 return S_OK;
1310 }
1311
1312 *allocator = NULL;
1313 return VFW_E_NO_ALLOCATOR;
1314}
1315
1317{
1319
1320 TRACE("stream %p, allocator %p, readonly %d.\n", stream, allocator, readonly);
1321
1322 if (!allocator)
1323 return E_POINTER;
1324
1325 if (allocator)
1326 IMemAllocator_AddRef(allocator);
1327 if (stream->allocator)
1328 IMemAllocator_Release(stream->allocator);
1329 stream->allocator = allocator;
1330
1331 return S_OK;
1332}
1333
1335{
1336 TRACE("iface %p, props %p.\n", iface, props);
1337 return E_NOTIMPL;
1338}
1339
1341{
1343 BITMAPINFOHEADER *bitmap_info;
1344 REFERENCE_TIME start_time = 0;
1345 REFERENCE_TIME end_time = 0;
1346 STREAM_TIME start_stream_time;
1347 STREAM_TIME end_stream_time;
1349 STREAM_TIME current_time;
1350 BYTE *top_down_pointer;
1351 int top_down_stride;
1352 BYTE *pointer;
1353 BOOL top_down;
1354 int stride;
1355 HRESULT hr;
1356
1357 TRACE("stream %p, sample %p.\n", stream, sample);
1358
1359 hr = IMediaSample_GetPointer(sample, &pointer);
1360 if (FAILED(hr))
1361 return hr;
1362
1363 IMediaSample_GetTime(sample, &start_time, &end_time);
1364
1366
1367 if (stream->state == State_Stopped)
1368 {
1370 return S_OK;
1371 }
1372 if (stream->flushing)
1373 {
1375 return S_FALSE;
1376 }
1377
1378 bitmap_info = &((VIDEOINFOHEADER *)stream->mt.pbFormat)->bmiHeader;
1379
1380 stride = ((bitmap_info->biWidth * bitmap_info->biBitCount + 31) & ~31) / 8;
1381 top_down = (bitmap_info->biHeight < 0);
1382
1383 top_down_stride = top_down ? stride : -stride;
1384 top_down_pointer = top_down ? pointer : pointer + stride * (bitmap_info->biHeight - 1);
1385
1386 start_stream_time = start_time + stream->segment_start;
1387 end_stream_time = end_time + stream->segment_start;
1388
1389 filter = stream->filter;
1390
1392 if (S_OK == IMediaStreamFilter_GetCurrentStreamTime(filter, &current_time)
1393 && start_time >= current_time + 10000)
1394 IMediaStreamFilter_WaitUntil(filter, start_time);
1396
1397 for (;;)
1398 {
1399 if (stream->state == State_Stopped)
1400 {
1402 return S_OK;
1403 }
1404 if (stream->flushing)
1405 {
1407 return S_FALSE;
1408 }
1409 if (!list_empty(&stream->update_queue))
1410 {
1411 struct ddraw_sample *sample = LIST_ENTRY(list_head(&stream->update_queue), struct ddraw_sample, entry);
1412 IQualityControl *qc;
1413
1414 sample->update_hr = process_update(sample, top_down_stride, top_down_pointer,
1415 start_stream_time, end_stream_time);
1416
1417 if (sample->continuous_update && SUCCEEDED(sample->update_hr))
1418 {
1419 list_remove(&sample->entry);
1420 list_add_tail(&sample->parent->update_queue, &sample->entry);
1421 }
1422 else
1423 {
1425 }
1426
1427 if (S_OK == IMediaStreamFilter_GetCurrentStreamTime(filter, &current_time)
1428 && SUCCEEDED(IPin_QueryInterface(stream->peer, &IID_IQualityControl, (void **)&qc)))
1429 {
1430 Quality q;
1431 q.Type = Famine;
1432 q.Proportion = 1000;
1433 q.Late = current_time - start_time;
1434 q.TimeStamp = start_time;
1435 IQualityControl_Notify(qc, (IBaseFilter *)stream->filter, q);
1436 IQualityControl_Release(qc);
1437 }
1438
1440 return S_OK;
1441 }
1442
1443 SleepConditionVariableCS(&stream->update_queued_cv, &stream->cs, INFINITE);
1444 }
1445}
1446
1449{
1450 FIXME("iface %p, samples %p, count %lu, processed %p, stub!\n", iface, samples, count, processed);
1451 return E_NOTIMPL;
1452}
1453
1455{
1456 TRACE("iface %p.\n", iface);
1457 return S_OK;
1458}
1459
1460static const IMemInputPinVtbl ddraw_meminput_vtbl =
1461{
1471};
1472
1474{
1475 struct ddraw_stream *object;
1476
1477 if (outer)
1478 return CLASS_E_NOAGGREGATION;
1479
1480 if (!(object = calloc(1, sizeof(*object))))
1481 return E_OUTOFMEMORY;
1482
1483 object->IAMMediaStream_iface.lpVtbl = &ddraw_IAMMediaStream_vtbl;
1484 object->IDirectDrawMediaStream_iface.lpVtbl = &ddraw_IDirectDrawMediaStream_Vtbl;
1485 object->IMemInputPin_iface.lpVtbl = &ddraw_meminput_vtbl;
1486 object->IPin_iface.lpVtbl = &ddraw_sink_vtbl;
1487 object->ref = 1;
1488
1489 object->format.width = 100;
1490 object->format.height = 100;
1491
1493 InitializeConditionVariable(&object->update_queued_cv);
1494 list_init(&object->update_queue);
1495
1496 TRACE("Created ddraw stream %p.\n", object);
1497
1498 *out = &object->IAMMediaStream_iface;
1499
1500 return S_OK;
1501}
1502
1504{
1506}
1507
1508/*** IUnknown methods ***/
1510 REFIID riid, void **ret_iface)
1511{
1512 TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ret_iface);
1513
1514 if (IsEqualGUID(riid, &IID_IUnknown) ||
1515 IsEqualGUID(riid, &IID_IStreamSample) ||
1516 IsEqualGUID(riid, &IID_IDirectDrawStreamSample))
1517 {
1518 IDirectDrawStreamSample_AddRef(iface);
1519 *ret_iface = iface;
1520 return S_OK;
1521 }
1522
1523 *ret_iface = NULL;
1524
1525 ERR("(%p)->(%s,%p),not found\n", iface, debugstr_guid(riid), ret_iface);
1526 return E_NOINTERFACE;
1527}
1528
1530{
1533
1534 TRACE("(%p)->(): new ref = %lu\n", iface, ref);
1535
1536 return ref;
1537}
1538
1540{
1543
1544 TRACE("(%p)->(): new ref = %lu\n", iface, ref);
1545
1546 if (!ref)
1547 {
1548 EnterCriticalSection(&sample->parent->cs);
1549 --sample->parent->sample_refs;
1550 LeaveCriticalSection(&sample->parent->cs);
1551
1552 if (sample->mmstream)
1553 IMultiMediaStream_Release(sample->mmstream);
1554 IAMMediaStream_Release(&sample->parent->IAMMediaStream_iface);
1555
1556 if (sample->surface)
1557 IDirectDrawSurface_Release(sample->surface);
1558 free(sample);
1559 }
1560
1561 return ref;
1562}
1563
1564/*** IStreamSample methods ***/
1566{
1568
1569 TRACE("sample %p, media_stream %p.\n", sample, media_stream);
1570
1571 if (!media_stream)
1572 return E_POINTER;
1573
1574 IAMMediaStream_AddRef(&sample->parent->IAMMediaStream_iface);
1575 *media_stream = (IMediaStream *)&sample->parent->IAMMediaStream_iface;
1576
1577 return S_OK;
1578}
1579
1581 STREAM_TIME *end_time, STREAM_TIME *current_time)
1582{
1584
1585 TRACE("sample %p, start_time %p, end_time %p, current_time %p.\n", sample, start_time, end_time, current_time);
1586
1587 if (current_time)
1588 IMediaStreamFilter_GetCurrentStreamTime(sample->parent->filter, current_time);
1589
1590 if (start_time)
1591 *start_time = sample->start_time;
1592 if (end_time)
1593 *end_time = sample->end_time;
1594
1595 return S_OK;
1596}
1597
1599 const STREAM_TIME *end_time)
1600{
1601 FIXME("(%p)->(%p,%p): stub\n", iface, start_time, end_time);
1602
1603 return E_NOTIMPL;
1604}
1605
1608{
1610
1611 TRACE("sample %p, flags %#lx, event %p, apc_func %p, apc_data %#lx.\n",
1612 sample, flags, event, apc_func, apc_data);
1613
1614 if (event && apc_func)
1615 return E_INVALIDARG;
1616
1617 if (apc_func)
1618 {
1619 FIXME("APC support is not implemented!\n");
1620 return E_NOTIMPL;
1621 }
1622
1623 EnterCriticalSection(&sample->parent->cs);
1624
1625 if (sample->parent->state != State_Running)
1626 {
1627 LeaveCriticalSection(&sample->parent->cs);
1628 return MS_E_NOTRUNNING;
1629 }
1630 if (!sample->parent->peer || sample->parent->eos)
1631 {
1632 sample->update_hr = MS_S_ENDOFSTREAM;
1633 LeaveCriticalSection(&sample->parent->cs);
1634 return MS_S_ENDOFSTREAM;
1635 }
1636 if (sample->busy)
1637 {
1638 LeaveCriticalSection(&sample->parent->cs);
1639 return MS_E_BUSY;
1640 }
1641
1642 sample->continuous_update = (flags & SSUPDATE_ASYNC) && (flags & SSUPDATE_CONTINUOUS);
1643
1644 sample->update_hr = MS_S_NOUPDATE;
1645 sample->busy = TRUE;
1646 sample->external_event = event;
1647 list_add_tail(&sample->parent->update_queue, &sample->entry);
1648 WakeConditionVariable(&sample->parent->update_queued_cv);
1649
1650 if ((flags & SSUPDATE_ASYNC) || event)
1651 {
1652 LeaveCriticalSection(&sample->parent->cs);
1653 return MS_S_PENDING;
1654 }
1655
1656 while (sample->busy)
1657 SleepConditionVariableCS(&sample->update_cv, &sample->parent->cs, INFINITE);
1658
1659 LeaveCriticalSection(&sample->parent->cs);
1660
1661 return sample->update_hr;
1662}
1663
1665{
1667 HRESULT hr;
1668
1669 TRACE("sample %p, flags %#lx, milliseconds %lu.\n", sample, flags, milliseconds);
1670
1671 EnterCriticalSection(&sample->parent->cs);
1672
1673 if (sample->busy)
1674 {
1676 {
1678 }
1679 else if (flags & COMPSTAT_WAIT)
1680 {
1682 DWORD elapsed = 0;
1683 sample->continuous_update = FALSE;
1684 while (sample->busy && elapsed < milliseconds)
1685 {
1686 DWORD sleep_time = milliseconds - elapsed;
1687 if (!SleepConditionVariableCS(&sample->update_cv, &sample->parent->cs, sleep_time))
1688 break;
1689 elapsed = GetTickCount() - start_time;
1690 }
1691 }
1692 }
1693
1694 hr = sample->busy ? MS_S_PENDING : sample->update_hr;
1695
1696 LeaveCriticalSection(&sample->parent->cs);
1697
1698 return hr;
1699}
1700
1701/*** IDirectDrawStreamSample methods ***/
1703 RECT *rect)
1704{
1706
1707 TRACE("(%p)->(%p,%p)\n", iface, ddraw_surface, rect);
1708
1709 if (ddraw_surface)
1710 {
1711 *ddraw_surface = sample->surface;
1712 if (*ddraw_surface)
1713 IDirectDrawSurface_AddRef(*ddraw_surface);
1714 }
1715
1716 if (rect)
1717 *rect = sample->rect;
1718
1719 return S_OK;
1720}
1721
1723{
1724 FIXME("(%p)->(%p): stub\n", iface, rect);
1725
1726 return E_NOTIMPL;
1727}
1728
1729static const struct IDirectDrawStreamSampleVtbl DirectDrawStreamSample_Vtbl =
1730{
1731 /*** IUnknown methods ***/
1735 /*** IStreamSample methods ***/
1741 /*** IDirectDrawStreamSample methods ***/
1744};
1745
1746static HRESULT ddrawstreamsample_create(struct ddraw_stream *parent, IDirectDrawSurface *surface,
1747 const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample)
1748{
1749 struct ddraw_sample *object;
1751 HRESULT hr;
1752
1753 TRACE("(%p)\n", ddraw_stream_sample);
1754
1755 if (!(object = calloc(1, sizeof(*object))))
1756 return E_OUTOFMEMORY;
1757
1758 object->IDirectDrawStreamSample_iface.lpVtbl = &DirectDrawStreamSample_Vtbl;
1759 object->ref = 1;
1760 object->parent = parent;
1761 object->mmstream = parent->parent;
1763 IAMMediaStream_AddRef(&parent->IAMMediaStream_iface);
1764 if (object->mmstream)
1765 IMultiMediaStream_AddRef(object->mmstream);
1766 ++parent->sample_refs;
1767
1768 if (surface)
1769 {
1770 object->surface = surface;
1771 IDirectDrawSurface_AddRef(surface);
1772 }
1773 else
1774 {
1775 IDirectDraw *ddraw;
1776
1777 hr = IDirectDrawMediaStream_GetDirectDraw(&parent->IDirectDrawMediaStream_iface, &ddraw);
1778 if (FAILED(hr))
1779 {
1780 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1781 return hr;
1782 }
1783
1784 desc.dwSize = sizeof(desc);
1786 desc.dwHeight = parent->format.height;
1787 desc.dwWidth = parent->format.width;
1788 if (parent->format.flags & DDSD_PIXELFORMAT)
1789 {
1790 desc.ddpfPixelFormat = parent->format.pf;
1791 }
1792 else
1793 {
1794 desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat);
1795 desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
1796 desc.ddpfPixelFormat.dwRGBBitCount = 32;
1797 desc.ddpfPixelFormat.dwRBitMask = 0xff0000;
1798 desc.ddpfPixelFormat.dwGBitMask = 0x00ff00;
1799 desc.ddpfPixelFormat.dwBBitMask = 0x0000ff;
1800 desc.ddpfPixelFormat.dwRGBAlphaBitMask = 0;
1801 }
1803 desc.lpSurface = NULL;
1804
1805 hr = IDirectDraw_CreateSurface(ddraw, &desc, &object->surface, NULL);
1806 IDirectDraw_Release(ddraw);
1807 if (FAILED(hr))
1808 {
1809 ERR("failed to create surface, 0x%08lx\n", hr);
1810 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1811 return hr;
1812 }
1813 }
1814
1815 desc.dwSize = sizeof(desc);
1816 hr = IDirectDrawSurface_GetSurfaceDesc(object->surface, &desc);
1817 if (FAILED(hr))
1818 {
1819 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1820 return hr;
1821 }
1822
1823 if (rect)
1824 {
1825 object->rect = *rect;
1826 desc.dwWidth = rect->right - rect->left;
1827 desc.dwHeight = rect->bottom - rect->top;
1828 }
1829 else
1830 {
1831 SetRect(&object->rect, 0, 0, desc.dwWidth, desc.dwHeight);
1832 }
1833
1834 hr = IDirectDrawMediaStream_SetFormat(&parent->IDirectDrawMediaStream_iface, &desc, NULL);
1835 if (FAILED(hr))
1836 {
1837 IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
1838 return hr;
1839 }
1840
1841 *ddraw_stream_sample = &object->IDirectDrawStreamSample_iface;
1842
1843 return S_OK;
1844}
static void CALLBACK apc_func(ULONG_PTR param)
Definition: amstream.c:4625
static int state
Definition: maze.c:121
unsigned int dir
Definition: maze.c:112
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
unsigned int rate
Definition: audiorecord.c:87
enum _PinDirection PIN_DIRECTION
@ PINDIR_OUTPUT
Definition: axcore.idl:42
@ PINDIR_INPUT
Definition: axcore.idl:41
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static int list_empty(struct list_entry *head)
Definition: list.h:58
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
Definition: list.h:39
RECT rect
Definition: combotst.c:67
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
static HRESULT WINAPI ddraw_sink_EnumMediaTypes(IPin *iface, IEnumMediaTypes **enum_media_types)
Definition: ddrawstream.c:1145
static HRESULT WINAPI ddraw_sample_QueryInterface(IDirectDrawStreamSample *iface, REFIID riid, void **ret_iface)
Definition: ddrawstream.c:1509
static struct enum_media_types * impl_from_IEnumMediaTypes(IEnumMediaTypes *iface)
Definition: ddrawstream.c:786
static HRESULT WINAPI ddraw_sink_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
Definition: ddrawstream.c:924
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_AllocateSample(IDirectDrawMediaStream *iface, DWORD flags, IStreamSample **sample)
Definition: ddrawstream.c:468
static HRESULT WINAPI ddraw_sample_SetRect(IDirectDrawStreamSample *iface, const RECT *rect)
Definition: ddrawstream.c:1722
static ULONG WINAPI enum_media_types_Release(IEnumMediaTypes *iface)
Definition: ddrawstream.c:815
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_CreateSharedSample(IDirectDrawMediaStream *iface, IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
Definition: ddrawstream.c:475
static void flush_update_queue(struct ddraw_stream *stream, HRESULT update_hr)
Definition: ddrawstream.c:99
static HRESULT WINAPI ddraw_IAMMediaStream_SendEndOfStream(IAMMediaStream *iface, DWORD flags)
Definition: ddrawstream.c:299
static HRESULT WINAPI ddraw_IAMMediaStream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *mmstream)
Definition: ddrawstream.c:365
static HRESULT WINAPI ddraw_IAMMediaStream_GetMultiMediaStream(IAMMediaStream *iface, IMultiMediaStream **mmstream)
Definition: ddrawstream.c:238
static HRESULT WINAPI ddraw_IAMMediaStream_QueryInterface(IAMMediaStream *iface, REFIID riid, void **ret_iface)
Definition: ddrawstream.c:171
static const IPinVtbl ddraw_sink_vtbl
Definition: ddrawstream.c:1255
static struct ddraw_stream * impl_from_IMemInputPin(IMemInputPin *iface)
Definition: ddrawstream.c:1277
static HRESULT WINAPI ddraw_sink_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *count)
Definition: ddrawstream.c:1165
static ULONG WINAPI ddraw_IDirectDrawMediaStream_Release(IDirectDrawMediaStream *iface)
Definition: ddrawstream.c:440
static HRESULT WINAPI ddraw_IAMMediaStream_Initialize(IAMMediaStream *iface, IUnknown *source_object, DWORD flags, REFMSPID purpose_id, const STREAM_TYPE stream_type)
Definition: ddrawstream.c:309
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetSameFormat(IDirectDrawMediaStream *iface, IMediaStream *other, DWORD flags)
Definition: ddrawstream.c:461
static HRESULT WINAPI ddraw_sink_EndOfStream(IPin *iface)
Definition: ddrawstream.c:1171
static struct ddraw_stream * impl_from_IAMMediaStream(IAMMediaStream *iface)
Definition: ddrawstream.c:165
static HRESULT WINAPI ddraw_sink_ConnectedTo(IPin *iface, IPin **peer)
Definition: ddrawstream.c:1051
static HRESULT WINAPI ddraw_meminput_GetAllocatorRequirements(IMemInputPin *iface, ALLOCATOR_PROPERTIES *props)
Definition: ddrawstream.c:1334
static HRESULT WINAPI ddraw_sample_Update(IDirectDrawStreamSample *iface, DWORD flags, HANDLE event, PAPCFUNC apc_func, DWORD apc_data)
Definition: ddrawstream.c:1606
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_GetInformation(IDirectDrawMediaStream *iface, MSPID *purpose_id, STREAM_TYPE *type)
Definition: ddrawstream.c:454
static HRESULT WINAPI ddraw_sink_QueryPinInfo(IPin *iface, PIN_INFO *info)
Definition: ddrawstream.c:1101
static HRESULT WINAPI enum_media_types_QueryInterface(IEnumMediaTypes *iface, REFIID iid, void **out)
Definition: ddrawstream.c:791
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SendEndOfStream(IDirectDrawMediaStream *iface, DWORD flags)
Definition: ddrawstream.c:482
static struct ddraw_sample * impl_from_IDirectDrawStreamSample(IDirectDrawStreamSample *iface)
Definition: ddrawstream.c:1503
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_GetDirectDraw(IDirectDrawMediaStream *iface, IDirectDraw **ddraw)
Definition: ddrawstream.c:656
static HRESULT WINAPI ddraw_IAMMediaStream_SetState(IAMMediaStream *iface, FILTER_STATE state)
Definition: ddrawstream.c:345
static HRESULT WINAPI ddraw_sink_QueryInterface(IPin *iface, REFIID iid, void **out)
Definition: ddrawstream.c:906
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_GetTimePerFrame(IDirectDrawMediaStream *iface, STREAM_TIME *frame_time)
Definition: ddrawstream.c:730
static ULONG WINAPI ddraw_IAMMediaStream_Release(IAMMediaStream *iface)
Definition: ddrawstream.c:219
static HRESULT WINAPI ddraw_sample_GetSurface(IDirectDrawStreamSample *iface, IDirectDrawSurface **ddraw_surface, RECT *rect)
Definition: ddrawstream.c:1702
static struct ddraw_stream * impl_from_IPin(IPin *iface)
Definition: ddrawstream.c:901
static HRESULT WINAPI ddraw_meminput_Receive(IMemInputPin *iface, IMediaSample *sample)
Definition: ddrawstream.c:1340
static ULONG WINAPI ddraw_IDirectDrawMediaStream_AddRef(IDirectDrawMediaStream *iface)
Definition: ddrawstream.c:433
static HRESULT WINAPI ddraw_IAMMediaStream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *filtergraph)
Definition: ddrawstream.c:387
static BOOL is_format_compatible(struct ddraw_stream *stream, DWORD width, DWORD height, const DDPIXELFORMAT *connection_pf)
Definition: ddrawstream.c:145
static HRESULT WINAPI enum_media_types_Reset(IEnumMediaTypes *iface)
Definition: ddrawstream.c:862
static const struct IDirectDrawMediaStreamVtbl ddraw_IDirectDrawMediaStream_Vtbl
Definition: ddrawstream.c:755
static HRESULT WINAPI ddraw_IAMMediaStream_AllocateSample(IAMMediaStream *iface, DWORD flags, IStreamSample **sample)
Definition: ddrawstream.c:279
static ULONG WINAPI enum_media_types_AddRef(IEnumMediaTypes *iface)
Definition: ddrawstream.c:807
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_QueryInterface(IDirectDrawMediaStream *iface, REFIID riid, void **ret_iface)
Definition: ddrawstream.c:425
static HRESULT WINAPI ddraw_sink_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *mt)
Definition: ddrawstream.c:1133
static ULONG WINAPI ddraw_sink_Release(IPin *iface)
Definition: ddrawstream.c:918
static HRESULT WINAPI ddraw_sink_QueryId(IPin *iface, WCHAR **id)
Definition: ddrawstream.c:1121
HRESULT ddraw_stream_create(IUnknown *outer, void **out)
Definition: ddrawstream.c:1473
static HRESULT WINAPI ddraw_sample_SetSampleTimes(IDirectDrawStreamSample *iface, const STREAM_TIME *start_time, const STREAM_TIME *end_time)
Definition: ddrawstream.c:1598
static HRESULT WINAPI ddraw_IAMMediaStream_SetSameFormat(IAMMediaStream *iface, IMediaStream *pStreamThatHasDesiredFormat, DWORD flags)
Definition: ddrawstream.c:269
static const struct IAMMediaStreamVtbl ddraw_IAMMediaStream_vtbl
Definition: ddrawstream.c:398
static HRESULT WINAPI ddraw_meminput_NotifyAllocator(IMemInputPin *iface, IMemAllocator *allocator, BOOL readonly)
Definition: ddrawstream.c:1316
static HRESULT WINAPI ddraw_sink_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *mt)
Definition: ddrawstream.c:1076
static HRESULT WINAPI ddraw_sink_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
Definition: ddrawstream.c:930
static HRESULT WINAPI ddraw_sink_EndFlush(IPin *iface)
Definition: ddrawstream.c:1224
static void remove_queued_update(struct ddraw_sample *sample)
Definition: ddrawstream.c:90
static HRESULT WINAPI ddraw_sample_CompletionStatus(IDirectDrawStreamSample *iface, DWORD flags, DWORD milliseconds)
Definition: ddrawstream.c:1664
static HRESULT ddrawstreamsample_create(struct ddraw_stream *parent, IDirectDrawSurface *surface, const RECT *rect, IDirectDrawStreamSample **ddraw_stream_sample)
Definition: ddrawstream.c:1746
static HRESULT process_update(struct ddraw_sample *sample, int stride, BYTE *pointer, STREAM_TIME start_time, STREAM_TIME end_time)
Definition: ddrawstream.c:110
static HRESULT WINAPI ddraw_sink_Disconnect(IPin *iface)
Definition: ddrawstream.c:1027
static HRESULT WINAPI ddraw_sink_NewSegment(IPin *iface, REFERENCE_TIME start, REFERENCE_TIME stop, double rate)
Definition: ddrawstream.c:1239
static ULONG WINAPI ddraw_meminput_Release(IMemInputPin *iface)
Definition: ddrawstream.c:1294
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetDirectDraw(IDirectDrawMediaStream *iface, IDirectDraw *ddraw)
Definition: ddrawstream.c:678
static HRESULT WINAPI ddraw_sample_GetSampleTimes(IDirectDrawStreamSample *iface, STREAM_TIME *start_time, STREAM_TIME *end_time, STREAM_TIME *current_time)
Definition: ddrawstream.c:1580
static ULONG WINAPI ddraw_sink_AddRef(IPin *iface)
Definition: ddrawstream.c:912
static HRESULT WINAPI enum_media_types_Next(IEnumMediaTypes *iface, ULONG count, AM_MEDIA_TYPE **mts, ULONG *ret_count)
Definition: ddrawstream.c:825
static HRESULT WINAPI enum_media_types_Clone(IEnumMediaTypes *iface, IEnumMediaTypes **out)
Definition: ddrawstream.c:872
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_CreateSample(IDirectDrawMediaStream *iface, IDirectDrawSurface *surface, const RECT *rect, DWORD flags, IDirectDrawStreamSample **sample)
Definition: ddrawstream.c:710
static HRESULT WINAPI ddraw_meminput_QueryInterface(IMemInputPin *iface, REFIID iid, void **out)
Definition: ddrawstream.c:1282
static HRESULT WINAPI ddraw_meminput_GetAllocator(IMemInputPin *iface, IMemAllocator **allocator)
Definition: ddrawstream.c:1300
static ULONG WINAPI ddraw_meminput_AddRef(IMemInputPin *iface)
Definition: ddrawstream.c:1288
static const IMemInputPinVtbl ddraw_meminput_vtbl
Definition: ddrawstream.c:1460
static ULONG WINAPI ddraw_sample_Release(IDirectDrawStreamSample *iface)
Definition: ddrawstream.c:1539
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_GetFormat(IDirectDrawMediaStream *iface, DDSURFACEDESC *current_format, IDirectDrawPalette **palette, DDSURFACEDESC *desired_format, DWORD *flags)
Definition: ddrawstream.c:489
static const struct IDirectDrawStreamSampleVtbl DirectDrawStreamSample_Vtbl
Definition: ddrawstream.c:1729
static HRESULT WINAPI ddraw_IAMMediaStream_GetInformation(IAMMediaStream *iface, MSPID *purpose_id, STREAM_TYPE *type)
Definition: ddrawstream.c:254
static HRESULT WINAPI ddraw_meminput_ReceiveMultiple(IMemInputPin *iface, IMediaSample **samples, LONG count, LONG *processed)
Definition: ddrawstream.c:1447
static const WCHAR sink_id[]
Definition: ddrawstream.c:29
static HRESULT WINAPI ddraw_IAMMediaStream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *filter)
Definition: ddrawstream.c:376
static HRESULT WINAPI ddraw_sink_BeginFlush(IPin *iface)
Definition: ddrawstream.c:1199
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_SetFormat(IDirectDrawMediaStream *iface, const DDSURFACEDESC *format, IDirectDrawPalette *palette)
Definition: ddrawstream.c:535
static HRESULT WINAPI enum_media_types_Skip(IEnumMediaTypes *iface, ULONG count)
Definition: ddrawstream.c:851
static const IEnumMediaTypesVtbl enum_media_types_vtbl
Definition: ddrawstream.c:784
static HRESULT WINAPI ddraw_meminput_ReceiveCanBlock(IMemInputPin *iface)
Definition: ddrawstream.c:1454
static HRESULT WINAPI ddraw_sample_GetMediaStream(IDirectDrawStreamSample *iface, IMediaStream **media_stream)
Definition: ddrawstream.c:1565
static HRESULT WINAPI ddraw_sink_QueryDirection(IPin *iface, PIN_DIRECTION *dir)
Definition: ddrawstream.c:1114
static HRESULT WINAPI ddraw_IDirectDrawMediaStream_GetMultiMediaStream(IDirectDrawMediaStream *iface, IMultiMediaStream **mmstream)
Definition: ddrawstream.c:447
static ULONG WINAPI ddraw_sample_AddRef(IDirectDrawStreamSample *iface)
Definition: ddrawstream.c:1529
static struct ddraw_stream * impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface)
Definition: ddrawstream.c:419
static HRESULT WINAPI ddraw_IAMMediaStream_CreateSharedSample(IAMMediaStream *iface, IStreamSample *existing_sample, DWORD flags, IStreamSample **sample)
Definition: ddrawstream.c:289
static ULONG WINAPI ddraw_IAMMediaStream_AddRef(IAMMediaStream *iface)
Definition: ddrawstream.c:209
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HRESULT WINAPI DirectDrawCreate(LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter)
Definition: main.c:86
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
BOOL WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
Definition: sync.c:59
VOID WINAPI InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
Definition: sync.c:22
VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
Definition: sync.c:98
ULONG WINAPI DECLSPEC_HOTPATCH GetTickCount(void)
Definition: sync.c:182
#define DDPF_FOURCC
Definition: ddsformat.c:58
#define DDPF_RGB
Definition: ddsformat.c:60
#define DDPF_PALETTEINDEXED8
Definition: ddsformat.c:59
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
Definition: typeof.h:78
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
#define L(x)
Definition: resources.c:13
r parent
Definition: btrfs.c:3010
#define INFINITE
Definition: serial.h:102
@ AMMSF_CREATEPEER
Definition: amstream.idl:46
#define abs(i)
Definition: fconv.c:206
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLint GLsizei width
Definition: gl.h:1546
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
GLsizei stride
Definition: glext.h:5848
GLsizei samples
Definition: glext.h:7006
GLsizei const GLvoid * pointer
Definition: glext.h:5848
GLbitfield flags
Definition: glext.h:7161
REFIID riid
Definition: atlbase.h:39
Definition: axcore.idl:92
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
#define debugstr_guid
Definition: kernel32.h:35
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
@ COMPSTAT_NOUPDATEOK
Definition: mmstream.idl:63
@ COMPSTAT_ABORT
Definition: mmstream.idl:65
@ COMPSTAT_WAIT
Definition: mmstream.idl:64
@ SSUPDATE_CONTINUOUS
Definition: mmstream.idl:76
@ SSUPDATE_ASYNC
Definition: mmstream.idl:75
LONGLONG STREAM_TIME
Definition: mmstream.idl:45
STREAM_TYPE
Definition: mmstream.idl:50
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
static IUnknown * outer
Definition: compobj.c:82
static HPALETTE palette
Definition: clipboard.c:1457
int other
Definition: msacm.c:1376
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
const GUID IID_IPin
Definition: pincontrol.cpp:15
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
#define calloc
Definition: rosglue.h:14
#define DDSD_WIDTH
Definition: ddraw.h:212
#define DDPF_PALETTEINDEXEDTO8
Definition: ddraw.h:507
#define DDPF_PALETTEINDEXED4
Definition: ddraw.h:506
#define DDSD_PIXELFORMAT
Definition: ddraw.h:218
#define DDSCL_NORMAL
Definition: ddraw.h:537
#define DDPF_PALETTEINDEXED2
Definition: ddraw.h:515
#define DDSD_HEIGHT
Definition: ddraw.h:211
struct _DDPIXELFORMAT DDPIXELFORMAT
#define DDPF_YUV
Definition: ddraw.h:512
#define DDSCAPS_OFFSCREENPLAIN
Definition: ddraw.h:257
#define DDPF_PALETTEINDEXED1
Definition: ddraw.h:514
#define DDSD_CAPS
Definition: ddraw.h:210
#define DDLOCK_WAIT
Definition: ddraw.h:624
#define DDSCAPS_SYSTEMMEMORY
Definition: ddraw.h:263
#define DDERR_INVALIDSURFACETYPE
Definition: ddraw.h:168
wcscpy
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE *pDest, const AM_MEDIA_TYPE *pSrc)
Definition: mediatype.c:150
void WINAPI FreeMediaType(AM_MEDIA_TYPE *pMediaType)
Definition: mediatype.c:165
Definition: dcommon.idl:28
long bottom
Definition: dcommon.idl:29
long right
Definition: dcommon.idl:29
long left
Definition: dcommon.idl:29
long top
Definition: dcommon.idl:29
DWORD dwBBitMask
Definition: ddraw.h:1108
DWORD dwRGBBitCount
Definition: ddraw.h:1077
DWORD dwRBitMask
Definition: ddraw.h:1087
DWORD dwGBitMask
Definition: ddraw.h:1096
DWORD dwFlags
Definition: ddraw.h:1073
Definition: scsiwmi.h:51
STREAM_TIME start_time
Definition: ddrawstream.c:76
STREAM_TIME end_time
Definition: ddrawstream.c:77
IDirectDrawStreamSample IDirectDrawStreamSample_iface
Definition: ddrawstream.c:70
IDirectDrawSurface * surface
Definition: ddrawstream.c:74
IMultiMediaStream * mmstream
Definition: ddrawstream.c:73
HRESULT update_hr
Definition: ddrawstream.c:83
struct list entry
Definition: ddrawstream.c:82
HANDLE external_event
Definition: ddrawstream.c:80
CONDITION_VARIABLE update_cv
Definition: ddrawstream.c:79
BOOL continuous_update
Definition: ddrawstream.c:78
struct ddraw_stream * parent
Definition: ddrawstream.c:72
LONG sample_refs
Definition: ddrawstream.c:46
STREAM_TYPE stream_type
Definition: ddrawstream.c:50
IMultiMediaStream * parent
Definition: ddrawstream.c:48
IDirectDrawMediaStream IDirectDrawMediaStream_iface
Definition: ddrawstream.c:42
IMemInputPin IMemInputPin_iface
Definition: ddrawstream.c:43
IPin * peer
Definition: ddrawstream.c:56
IAMMediaStream IAMMediaStream_iface
Definition: ddrawstream.c:41
MSPID purpose_id
Definition: ddrawstream.c:49
CONDITION_VARIABLE update_queued_cv
Definition: ddrawstream.c:64
IPin IPin_iface
Definition: ddrawstream.c:44
IMemAllocator * allocator
Definition: ddrawstream.c:57
CRITICAL_SECTION cs
Definition: ddrawstream.c:52
IDirectDraw * ddraw
Definition: ddrawstream.c:51
REFERENCE_TIME segment_start
Definition: ddrawstream.c:61
IFilterGraph * graph
Definition: ddrawstream.c:54
struct list update_queue
Definition: ddrawstream.c:65
AM_MEDIA_TYPE mt
Definition: ddrawstream.c:58
IMediaStreamFilter * filter
Definition: ddrawstream.c:53
FILTER_STATE state
Definition: ddrawstream.c:60
unsigned int index
Definition: audiostream.c:792
IEnumMediaTypes IEnumMediaTypes_iface
Definition: audiostream.c:790
Definition: filter.c:185
Definition: filter.c:165
DWORD width
Definition: ddrawstream.c:34
DDPIXELFORMAT pf
Definition: ddrawstream.c:36
DWORD height
Definition: ddrawstream.c:35
DWORD flags
Definition: ddrawstream.c:33
Definition: list.h:15
Definition: send.c:48
Definition: wave.c:25
Definition: parse.h:23
BITMAPINFOHEADER bmiHeader
Definition: amvideo.idl:189
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:687
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
#define LIST_ENTRY(type)
Definition: queue.h:175
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
static int processed(const type_t *type)
Definition: typegen.c:2524
#define VFW_E_ALREADY_CONNECTED
Definition: vfwmsgs.h:43
#define VFW_E_TYPE_NOT_ACCEPTED
Definition: vfwmsgs.h:81
#define VFW_E_INVALID_DIRECTION
Definition: vfwmsgs.h:47
#define VFW_E_NO_ALLOCATOR
Definition: vfwmsgs.h:49
#define VFW_E_NOT_CONNECTED
Definition: vfwmsgs.h:48
static const WCHAR props[]
Definition: wbemdisp.c:288
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
#define E_UNEXPECTED
Definition: winerror.h:3528
#define E_POINTER
Definition: winerror.h:3480
unsigned char BYTE
Definition: xxhash.c:193