Mypal/media/webrtc/trunk/webrtc/modules/video_capture/windows/MediaType.cpp

178 lines
3.3 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "MediaType.h"
namespace mozilla {
namespace media {
MediaType::MediaType()
{
// Zero out our memory. We do it here, rather than in operator new,
// in case this is allocated on the stack.
memset(this, 0, sizeof(MediaType));
lSampleSize = 1;
bFixedSizeSamples = TRUE;
}
MediaType::MediaType(const MediaType& aMediaType)
{
memset(this, 0, sizeof(MediaType));
Assign(aMediaType);
}
MediaType::MediaType(const AM_MEDIA_TYPE* aMediaType)
{
memset(this, 0, sizeof(MediaType));
Assign(aMediaType);
}
MediaType::~MediaType()
{
Clear();
}
void
MediaType::operator delete(void* ptr)
{
CoTaskMemFree((void*)ptr);
}
void*
MediaType::operator new(size_t sz) throw()
{
return CoTaskMemAlloc(sz);
}
void
MediaType::Clear()
{
if (cbFormat) {
CoTaskMemFree(pbFormat);
cbFormat = 0;
pbFormat = NULL;
}
if (pUnk) {
pUnk->Release();
pUnk = NULL;
}
memset(this, 0, sizeof(MediaType));
}
HRESULT
MediaType::Assign(const AM_MEDIA_TYPE* aMediaType)
{
if (!aMediaType)
return E_POINTER;
if (aMediaType == this)
return S_OK;
// Release old data...
Clear();
// Shallow copy.
memcpy(static_cast<AM_MEDIA_TYPE*>(this), aMediaType, sizeof(AM_MEDIA_TYPE));
if (pUnk)
pUnk->AddRef();
// Create deep copy of incoming data...
if (cbFormat) {
pbFormat = (BYTE*)CoTaskMemAlloc(cbFormat);
if (!pbFormat)
return E_OUTOFMEMORY;
memcpy(pbFormat, aMediaType->pbFormat, cbFormat);
}
return S_OK;
}
void
MediaType::Forget()
{
cbFormat = 0;
pbFormat = NULL;
pUnk = NULL;
}
bool
MediaType::IsEqual(const AM_MEDIA_TYPE* aMediaType)
{
if (!aMediaType)
return false;
if (aMediaType == this)
return true;
return IsEqualGUID(majortype, aMediaType->majortype) &&
IsEqualGUID(subtype, aMediaType->subtype) &&
IsEqualGUID(formattype, aMediaType->formattype) &&
(cbFormat == aMediaType->cbFormat) &&
((cbFormat == 0) ||
(pbFormat != NULL &&
aMediaType->pbFormat != NULL &&
(memcmp(pbFormat, aMediaType->pbFormat, cbFormat) == 0)));
}
bool
MediaType::MatchesPartial(const AM_MEDIA_TYPE* aMediaType) const
{
if (!aMediaType)
return false;
if ((aMediaType->majortype != GUID_NULL) &&
(majortype != aMediaType->majortype))
return false;
if ((aMediaType->subtype != GUID_NULL) &&
(subtype != aMediaType->subtype))
return false;
if (aMediaType->formattype != GUID_NULL) {
if (formattype != aMediaType->formattype)
return false;
if (cbFormat != aMediaType->cbFormat)
return false;
if ((cbFormat != 0) &&
(memcmp(pbFormat, aMediaType->pbFormat, cbFormat) != 0))
return false;
}
return true;
}
bool
MediaType::IsPartiallySpecified() const
{
return (majortype == GUID_NULL) || (formattype == GUID_NULL);
}
BYTE*
MediaType::AllocFormatBuffer(SIZE_T aSize)
{
pbFormat = static_cast<BYTE*>(CoTaskMemAlloc(aSize));
return pbFormat;
}
}
}