- Implemented Mo* methods.
[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 #define COM_NO_WINDOWS_H
20 #include "winbase.h"
21 #include "objbase.h"
22 #include "mediaobj.h"
23 #include "dmort.h"
24
25 #include "wine/debug.h"
26
27 WINE_DEFAULT_DEBUG_CHANNEL(msdmo);
28
29 /***********************************************************************
30  *              MoCreateMediaType       (MSDMO.@)
31  */
32 HRESULT WINAPI MoCreateMediaType(DMO_MEDIA_TYPE** ppmedia, DWORD cbFormat)
33 {
34   HRESULT hr;
35
36   TRACE("(%p,%lu)\n", ppmedia, cbFormat);
37
38   if (ppmedia == NULL)
39     return E_POINTER;
40
41   *ppmedia = CoTaskMemAlloc(sizeof(DMO_MEDIA_TYPE));
42   if (*ppmedia == NULL)
43     return E_OUTOFMEMORY;
44
45   hr = MoInitMediaType(*ppmedia, cbFormat);
46   if (FAILED(hr)) {
47     CoTaskMemFree(*ppmedia);
48     *ppmedia = NULL;
49   }
50
51   return hr;
52 }
53
54 /***********************************************************************
55  *              MoInitMediaType         (MSDMO.@)
56  */
57 HRESULT WINAPI MoInitMediaType(DMO_MEDIA_TYPE* pmedia, DWORD cbFormat)
58 {
59   TRACE("(%p,%lu)\n", pmedia,cbFormat);
60
61   if (pmedia == NULL)
62     return E_POINTER;
63
64   memset(pmedia, 0, sizeof(DMO_MEDIA_TYPE));
65
66   if (cbFormat > 0) {
67     pmedia->pbFormat = CoTaskMemAlloc(cbFormat);
68     if (pmedia->pbFormat == NULL)
69       return E_OUTOFMEMORY;
70
71     pmedia->cbFormat = cbFormat;
72   }
73
74   return S_OK;
75 }
76
77 /***********************************************************************
78  *              MoDeleteMediaType       (MSDMO.@)
79  */
80 HRESULT WINAPI MoDeleteMediaType(DMO_MEDIA_TYPE* pmedia)
81 {
82   TRACE("(%p)\n", pmedia);
83
84   if (pmedia == NULL)
85     return E_POINTER;
86
87   MoFreeMediaType(pmedia);
88   CoTaskMemFree(pmedia);
89
90   return S_OK;
91 }
92
93 /***********************************************************************
94  *              MoFreeMediaType         (MSDMO.@)
95  */
96 HRESULT WINAPI MoFreeMediaType(DMO_MEDIA_TYPE* pmedia)
97 {
98   TRACE("(%p)\n", pmedia);
99
100   if (pmedia == NULL)
101     return E_POINTER;
102
103   if (pmedia->pUnk != NULL) {
104     IUnknown_Release(pmedia->pUnk);
105     pmedia->pUnk = NULL;
106   }
107
108   if (pmedia->pbFormat != NULL) {
109     CoTaskMemFree(pmedia->pbFormat);
110     pmedia->pbFormat = NULL;
111   }
112
113   return S_OK;
114 }
115
116 /***********************************************************************
117  *              MoDuplicateMediaType    (MSDMO.@)
118  */
119 HRESULT WINAPI MoDuplicateMediaType(DMO_MEDIA_TYPE** ppdst,
120                                     const DMO_MEDIA_TYPE* psrc)
121 {
122   HRESULT hr;
123
124   TRACE("(%p,%p)\n", ppdst, psrc);
125
126   if (ppdst == NULL || psrc == NULL)
127     return E_POINTER;
128
129   *ppdst = CoTaskMemAlloc(sizeof(DMO_MEDIA_TYPE));
130   if (*ppdst == NULL)
131     return E_OUTOFMEMORY;
132
133   hr = MoCopyMediaType(*ppdst, psrc);
134   if (FAILED(hr)) {
135     MoFreeMediaType(*ppdst);
136     *ppdst = NULL;
137   }
138
139   return hr;
140 }
141
142 /***********************************************************************
143  *              MoCopyMediaType         (MSDMO.@)
144  */
145 HRESULT WINAPI MoCopyMediaType(DMO_MEDIA_TYPE* pdst,
146                                const DMO_MEDIA_TYPE* psrc)
147 {
148   TRACE("(%p,%p)\n", pdst, psrc);
149
150   if (pdst == NULL || psrc == NULL)
151     return E_POINTER;
152
153   memcpy(&pdst->majortype,  &psrc->majortype,  sizeof(psrc->majortype));
154   memcpy(&pdst->subtype,    &psrc->subtype,    sizeof(psrc->subtype));
155   memcpy(&pdst->formattype, &psrc->formattype, sizeof(psrc->formattype));
156
157   pdst->bFixedSizeSamples    = psrc->bFixedSizeSamples;
158   pdst->bTemporalCompression = psrc->bTemporalCompression;
159   pdst->lSampleSize          = psrc->lSampleSize;
160   pdst->cbFormat             = psrc->cbFormat;
161
162   if (psrc->pbFormat != NULL && psrc->cbFormat > 0) {
163     pdst->pbFormat = CoTaskMemAlloc(psrc->cbFormat);
164     if (pdst->pbFormat == NULL)
165       return E_OUTOFMEMORY;
166
167     memcpy(pdst->pbFormat, psrc->pbFormat, psrc->cbFormat);
168   } else
169     pdst->pbFormat = NULL;
170
171   if (psrc->pUnk != NULL) {
172     pdst->pUnk = psrc->pUnk;
173     IUnknown_AddRef(pdst->pUnk);
174   } else
175     pdst->pUnk = NULL;
176
177   return S_OK;
178 }