Convert StartDoc to Unicode.
[wine] / dlls / msdmo / dmort.c
1 /*
2  * Copyright (C) 2003 Michael Günnewig
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include <stdarg.h>
20
21 #define COBJMACROS
22 #define COM_NO_WINDOWS_H
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "objbase.h"
27 #include "mediaobj.h"
28 #include "dmort.h"
29
30 #include "wine/debug.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(msdmo);
33
34 /***********************************************************************
35  *              MoCreateMediaType       (MSDMO.@)
36  */
37 HRESULT WINAPI MoCreateMediaType(DMO_MEDIA_TYPE** ppmedia, DWORD cbFormat)
38 {
39   HRESULT hr;
40
41   TRACE("(%p,%lu)\n", ppmedia, cbFormat);
42
43   if (ppmedia == NULL)
44     return E_POINTER;
45
46   *ppmedia = CoTaskMemAlloc(sizeof(DMO_MEDIA_TYPE));
47   if (*ppmedia == NULL)
48     return E_OUTOFMEMORY;
49
50   hr = MoInitMediaType(*ppmedia, cbFormat);
51   if (FAILED(hr)) {
52     CoTaskMemFree(*ppmedia);
53     *ppmedia = NULL;
54   }
55
56   return hr;
57 }
58
59 /***********************************************************************
60  *              MoInitMediaType         (MSDMO.@)
61  */
62 HRESULT WINAPI MoInitMediaType(DMO_MEDIA_TYPE* pmedia, DWORD cbFormat)
63 {
64   TRACE("(%p,%lu)\n", pmedia,cbFormat);
65
66   if (pmedia == NULL)
67     return E_POINTER;
68
69   memset(pmedia, 0, sizeof(DMO_MEDIA_TYPE));
70
71   if (cbFormat > 0) {
72     pmedia->pbFormat = CoTaskMemAlloc(cbFormat);
73     if (pmedia->pbFormat == NULL)
74       return E_OUTOFMEMORY;
75
76     pmedia->cbFormat = cbFormat;
77   }
78
79   return S_OK;
80 }
81
82 /***********************************************************************
83  *              MoDeleteMediaType       (MSDMO.@)
84  */
85 HRESULT WINAPI MoDeleteMediaType(DMO_MEDIA_TYPE* pmedia)
86 {
87   TRACE("(%p)\n", pmedia);
88
89   if (pmedia == NULL)
90     return E_POINTER;
91
92   MoFreeMediaType(pmedia);
93   CoTaskMemFree(pmedia);
94
95   return S_OK;
96 }
97
98 /***********************************************************************
99  *              MoFreeMediaType         (MSDMO.@)
100  */
101 HRESULT WINAPI MoFreeMediaType(DMO_MEDIA_TYPE* pmedia)
102 {
103   TRACE("(%p)\n", pmedia);
104
105   if (pmedia == NULL)
106     return E_POINTER;
107
108   if (pmedia->pUnk != NULL) {
109     IUnknown_Release(pmedia->pUnk);
110     pmedia->pUnk = NULL;
111   }
112
113   if (pmedia->pbFormat != NULL) {
114     CoTaskMemFree(pmedia->pbFormat);
115     pmedia->pbFormat = NULL;
116   }
117
118   return S_OK;
119 }
120
121 /***********************************************************************
122  *              MoDuplicateMediaType    (MSDMO.@)
123  */
124 HRESULT WINAPI MoDuplicateMediaType(DMO_MEDIA_TYPE** ppdst,
125                                     const DMO_MEDIA_TYPE* psrc)
126 {
127   HRESULT hr;
128
129   TRACE("(%p,%p)\n", ppdst, psrc);
130
131   if (ppdst == NULL || psrc == NULL)
132     return E_POINTER;
133
134   *ppdst = CoTaskMemAlloc(sizeof(DMO_MEDIA_TYPE));
135   if (*ppdst == NULL)
136     return E_OUTOFMEMORY;
137
138   hr = MoCopyMediaType(*ppdst, psrc);
139   if (FAILED(hr)) {
140     MoFreeMediaType(*ppdst);
141     *ppdst = NULL;
142   }
143
144   return hr;
145 }
146
147 /***********************************************************************
148  *              MoCopyMediaType         (MSDMO.@)
149  */
150 HRESULT WINAPI MoCopyMediaType(DMO_MEDIA_TYPE* pdst,
151                                const DMO_MEDIA_TYPE* psrc)
152 {
153   TRACE("(%p,%p)\n", pdst, psrc);
154
155   if (pdst == NULL || psrc == NULL)
156     return E_POINTER;
157
158   memcpy(&pdst->majortype,  &psrc->majortype,  sizeof(psrc->majortype));
159   memcpy(&pdst->subtype,    &psrc->subtype,    sizeof(psrc->subtype));
160   memcpy(&pdst->formattype, &psrc->formattype, sizeof(psrc->formattype));
161
162   pdst->bFixedSizeSamples    = psrc->bFixedSizeSamples;
163   pdst->bTemporalCompression = psrc->bTemporalCompression;
164   pdst->lSampleSize          = psrc->lSampleSize;
165   pdst->cbFormat             = psrc->cbFormat;
166
167   if (psrc->pbFormat != NULL && psrc->cbFormat > 0) {
168     pdst->pbFormat = CoTaskMemAlloc(psrc->cbFormat);
169     if (pdst->pbFormat == NULL)
170       return E_OUTOFMEMORY;
171
172     memcpy(pdst->pbFormat, psrc->pbFormat, psrc->cbFormat);
173   } else
174     pdst->pbFormat = NULL;
175
176   if (psrc->pUnk != NULL) {
177     pdst->pUnk = psrc->pUnk;
178     IUnknown_AddRef(pdst->pUnk);
179   } else
180     pdst->pUnk = NULL;
181
182   return S_OK;
183 }