mshtml: Added nsIURI::Clone implementation.
[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  * Allocate a new media type structure
38  */
39 HRESULT WINAPI MoCreateMediaType(DMO_MEDIA_TYPE** ppmedia, DWORD cbFormat)
40 {
41     HRESULT r;
42
43     TRACE("%p %lu\n", ppmedia, cbFormat);
44
45     if (!ppmedia)
46         return E_POINTER;
47
48     *ppmedia = CoTaskMemAlloc(sizeof(DMO_MEDIA_TYPE));
49     if (!*ppmedia)
50         return E_OUTOFMEMORY;
51
52     r = MoInitMediaType(*ppmedia, cbFormat);
53     if (FAILED(r))
54     {
55         CoTaskMemFree(*ppmedia);
56         *ppmedia = NULL;
57     }
58
59     return r;
60 }
61
62 /***********************************************************************
63  *        MoInitMediaType        (MSDMO.@)
64  *
65  * Initialize media type structure
66  */
67 HRESULT WINAPI MoInitMediaType(DMO_MEDIA_TYPE* pmedia, DWORD cbFormat)
68 {
69     TRACE("%p %lu\n", pmedia, cbFormat);
70
71     if (!pmedia)
72         return E_POINTER;
73
74     memset(pmedia, 0, sizeof(DMO_MEDIA_TYPE));
75
76     if (cbFormat > 0)
77     {
78         pmedia->pbFormat = CoTaskMemAlloc(cbFormat);
79         if (!pmedia->pbFormat)
80             return E_OUTOFMEMORY;
81
82         pmedia->cbFormat = cbFormat;
83     }
84
85     return S_OK;
86 }
87
88 /***********************************************************************
89  *        MoDeleteMediaType    (MSDMO.@)
90  *
91  * Delete a media type structure
92  */
93 HRESULT WINAPI MoDeleteMediaType(DMO_MEDIA_TYPE* pmedia)
94 {
95     TRACE("%p\n", pmedia);
96
97     if (!pmedia)
98         return E_POINTER;
99
100     MoFreeMediaType(pmedia);
101     CoTaskMemFree(pmedia);
102
103     return S_OK;
104 }
105
106 /***********************************************************************
107  *        MoFreeMediaType        (MSDMO.@)
108  *
109  * Free allocated members of a media type structure
110  */
111 HRESULT WINAPI MoFreeMediaType(DMO_MEDIA_TYPE* pmedia)
112 {
113     TRACE("%p\n", pmedia);
114
115     if (!pmedia)
116         return E_POINTER;
117
118     if (pmedia->pUnk)
119     {
120         IUnknown_Release(pmedia->pUnk);
121         pmedia->pUnk = NULL;
122     }
123
124     if (pmedia->pbFormat)
125     {
126         CoTaskMemFree(pmedia->pbFormat);
127         pmedia->pbFormat = NULL;
128     }
129
130     return S_OK;
131 }
132
133 /***********************************************************************
134  *        MoDuplicateMediaType    (MSDMO.@)
135  *
136  * Duplicates a media type structure
137  */
138 HRESULT WINAPI MoDuplicateMediaType(DMO_MEDIA_TYPE** ppdst,
139                                     const DMO_MEDIA_TYPE* psrc)
140 {
141     HRESULT r;
142
143     TRACE("%p %p\n", ppdst, psrc);
144
145     if (!ppdst || !psrc)
146         return E_POINTER;
147
148     *ppdst = CoTaskMemAlloc(sizeof(DMO_MEDIA_TYPE));
149     if (!*ppdst)
150         return E_OUTOFMEMORY;
151
152     r = MoCopyMediaType(*ppdst, psrc);
153     if (FAILED(r))
154     {
155         MoFreeMediaType(*ppdst);
156         *ppdst = NULL;
157     }
158
159     return r;
160 }
161
162 /***********************************************************************
163  *        MoCopyMediaType        (MSDMO.@)
164  *
165  * Copy a new media type structure
166  */
167 HRESULT WINAPI MoCopyMediaType(DMO_MEDIA_TYPE* pdst,
168                                const DMO_MEDIA_TYPE* psrc)
169 {
170     TRACE("%p %p\n", pdst, psrc);
171
172     if (!pdst || !psrc)
173         return E_POINTER;
174
175     memcpy(&pdst->majortype,  &psrc->majortype,  sizeof(psrc->majortype));
176     memcpy(&pdst->subtype,    &psrc->subtype,    sizeof(psrc->subtype));
177     memcpy(&pdst->formattype, &psrc->formattype, sizeof(psrc->formattype));
178
179     pdst->bFixedSizeSamples    = psrc->bFixedSizeSamples;
180     pdst->bTemporalCompression = psrc->bTemporalCompression;
181     pdst->lSampleSize          = psrc->lSampleSize;
182     pdst->cbFormat             = psrc->cbFormat;
183
184     if (psrc->pbFormat && psrc->cbFormat > 0)
185     {
186         pdst->pbFormat = CoTaskMemAlloc(psrc->cbFormat);
187         if (!pdst->pbFormat)
188             return E_OUTOFMEMORY;
189
190         memcpy(pdst->pbFormat, psrc->pbFormat, psrc->cbFormat);
191     }
192     else
193         pdst->pbFormat = NULL;
194
195     if (psrc->pUnk)
196     {
197         pdst->pUnk = psrc->pUnk;
198         IUnknown_AddRef(pdst->pUnk);
199     }
200     else
201         pdst->pUnk = NULL;
202
203     return S_OK;
204 }