view loader/dshow/cmediasample.c @ 980:e9dedf1e544e

-framedrop fixed for VfW (I hope :))
author arpi_esp
date Sun, 03 Jun 2001 23:54:41 +0000
parents 9355b2ae634e
children da26060c81ef
line wrap: on
line source

#include <stdio.h>
#include <string.h>
#include "cmediasample.h"
//#define E_NOTIMPL 0x80004003
CMediaSample::CMediaSample(IMemAllocator* allocator, long _size):refcount(0)
{
    vt=new IMediaSample_vt;
    
    vt->QueryInterface=QueryInterface;
    vt->AddRef=AddRef;
    vt->Release=Release;
    vt->GetPointer=GetPointer ; 
    vt->GetSize=GetSize ; 
    vt->GetTime=GetTime ; 
    vt->SetTime=SetTime ; 
    vt->IsSyncPoint=IsSyncPoint ; 
    vt->SetSyncPoint=SetSyncPoint; 
    vt->IsPreroll=IsPreroll; 
    vt->SetPreroll=SetPreroll; 
    vt->GetActualDataLength=GetActualDataLength; 
    vt->SetActualDataLength=SetActualDataLength; 
    vt->GetMediaType=GetMediaType; 
    vt->SetMediaType=SetMediaType; 
    vt->IsDiscontinuity=IsDiscontinuity; 
    vt->SetDiscontinuity=SetDiscontinuity; 
    vt->GetMediaTime=GetMediaTime; 
    vt->SetMediaTime=SetMediaTime; 
    
    all=allocator;
    size=_size;
    actual_size=0;
    media_type.pbFormat=0;
    isPreroll=0;
    type_valid=0;
    block=new char[size];    
    old_block=0;
    Debug printf("%x: Creating media sample with size %d, buffer 0x%x\n", this, _size, block);
}
CMediaSample::~CMediaSample()
{
    Debug printf("%x: CMediaSample::~CMediaSample() called\n", this);
    delete vt;
    if(old_block)
	block=old_block;
    delete[] block;
    if(media_type.pbFormat)
	CoTaskMemFree(media_type.pbFormat);
}

long STDCALL CMediaSample::QueryInterface ( 
    IUnknown * This,
    /* [in] */ IID* iid,
    /* [iid_is][out] */ void **ppv)
{
    Debug printf("CMediaSample::QueryInterface() called\n");
    if(!ppv)return 0x80004003;
    if(!memcmp(iid, &IID_IUnknown, 16))
    {
	*ppv=(void*)This;
	This->vt->AddRef(This);
	return 0;
    }
    if(!memcmp(iid, &IID_IMediaSample, 16))
    {
	*ppv=(void*)This;
	This->vt->AddRef(This);
	return 0;
    }
    return 0x80004002;
}

long STDCALL CMediaSample::AddRef ( 
    IUnknown * This)
{
    Debug printf("CMediaSample::AddRef() called\n");
    ((CMediaSample*)This)->refcount++;
    return 0;
}
        
long STDCALL CMediaSample::Release ( 
    IUnknown * This)
{
    Debug printf("%x: CMediaSample::Release() called, new refcount %d\n", This, 
	((CMediaSample*)This)->refcount-1);
    CMediaSample* parent=(CMediaSample*)This;
    if(--((CMediaSample*)This)->refcount==0)
	parent->
	    all->
		vt->
		    ReleaseBuffer(
			(IMemAllocator*)(parent->all), 
			    (IMediaSample*)This);
    return 0;
}
HRESULT STDCALL CMediaSample::GetPointer ( 
    IMediaSample * This,
    /* [out] */ BYTE **ppBuffer)
{
    Debug printf("%x: CMediaSample::GetPointer() called\n", This);
    if(!ppBuffer)return 0x80004003;
    *ppBuffer=(BYTE *)((CMediaSample*)This)->block;
    return 0;
}

long STDCALL CMediaSample::GetSize ( 
    IMediaSample * This)
{
    Debug printf("%x: CMediaSample::GetSize() called -> %d\n", This, ((CMediaSample*)This)->size);
    return ((CMediaSample*)This)->size;
}

HRESULT STDCALL CMediaSample::GetTime ( 
    IMediaSample * This,
    /* [out] */ REFERENCE_TIME *pTimeStart,
    /* [out] */ REFERENCE_TIME *pTimeEnd)
{
    Debug printf("%x: CMediaSample::GetTime() called\n", This);
    return E_NOTIMPL;
}

HRESULT STDCALL CMediaSample::SetTime ( 
    IMediaSample * This,
    /* [in] */ REFERENCE_TIME *pTimeStart,
    /* [in] */ REFERENCE_TIME *pTimeEnd)
{
    Debug printf("%x: CMediaSample::SetTime() called\n", This);
    return E_NOTIMPL;
}

HRESULT STDCALL CMediaSample::IsSyncPoint ( 
    IMediaSample * This)
{
    Debug printf("%x: CMediaSample::IsSyncPoint() called\n", This);
    if(((CMediaSample*)This)->isSyncPoint)return 0;
    return 1;
}

HRESULT STDCALL CMediaSample::SetSyncPoint ( 
    IMediaSample * This,
    long bIsSyncPoint)
{
    Debug printf("%x: CMediaSample::SetSyncPoint() called\n", This);
    ((CMediaSample*)This)->isSyncPoint=bIsSyncPoint;
    return 0;
}

HRESULT STDCALL CMediaSample::IsPreroll ( 
    IMediaSample * This)
{
    Debug printf("%x: CMediaSample::IsPreroll() called\n", This);
    if(((CMediaSample*)This)->isPreroll==0)
	return 1;//S_FALSE
    else
	return 0;//S_OK
}

HRESULT STDCALL CMediaSample::SetPreroll ( 
    IMediaSample * This,
    long bIsPreroll)
{
    Debug printf("%x: CMediaSample::SetPreroll() called\n", This);
    ((CMediaSample*)This)->isPreroll=bIsPreroll;
    return 0;
}

long STDCALL CMediaSample::GetActualDataLength ( 
    IMediaSample * This)
{
    Debug printf("%x: CMediaSample::GetActualDataLength() called -> %d\n", This, ((CMediaSample*)This)->actual_size);
    return ((CMediaSample*)This)->actual_size;
}

HRESULT STDCALL CMediaSample::SetActualDataLength ( 
    IMediaSample * This,
    long __MIDL_0010)
{
    Debug printf("%x: CMediaSample::SetActualDataLength(%d) called\n", This, __MIDL_0010);
    if(__MIDL_0010>((CMediaSample*)This)->size)
    {
	printf("%x: ERROR: CMediaSample buffer overflow\n", This);
    }
    ((CMediaSample*)This)->actual_size=__MIDL_0010;
    return 0;
}

HRESULT STDCALL CMediaSample::GetMediaType ( 
    IMediaSample * This,
    AM_MEDIA_TYPE **ppMediaType)
{
    Debug printf("%x: CMediaSample::GetMediaType() called\n", This);
    if(!ppMediaType)
	return 0x80004003;
    if(!((CMediaSample*)This)->type_valid)
    {
	*ppMediaType=0;
	return 1;
    }
    AM_MEDIA_TYPE& t=((CMediaSample*)This)->media_type;
//    if(t.pbFormat)CoTaskMemFree(t.pbFormat);
    (*ppMediaType)=(AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
    memcpy(*ppMediaType, &t, sizeof(AM_MEDIA_TYPE));
    (*ppMediaType)->pbFormat=(char*)CoTaskMemAlloc(t.cbFormat);
    memcpy((*ppMediaType)->pbFormat, t.pbFormat, t.cbFormat);    
//    *ppMediaType=0; //media type was not changed
    return 0;    
}

HRESULT STDCALL CMediaSample::SetMediaType ( 
    IMediaSample * This,
    AM_MEDIA_TYPE *pMediaType)
{
    Debug printf("%x: CMediaSample::SetMediaType() called\n", This);
    if(!pMediaType)return 0x80004003;
    AM_MEDIA_TYPE& t=((CMediaSample*)This)->media_type;
    if(t.pbFormat)CoTaskMemFree(t.pbFormat);
    t=*pMediaType;
    t.pbFormat=(char*)CoTaskMemAlloc(t.cbFormat);
    memcpy(t.pbFormat, pMediaType->pbFormat, t.cbFormat);     
    ((CMediaSample*)This)->type_valid=1;
    return 0;
}

HRESULT STDCALL CMediaSample::IsDiscontinuity ( 
    IMediaSample * This)
{
    Debug printf("%x: CMediaSample::IsDiscontinuity() called\n", This);
    return 1;
}

HRESULT STDCALL CMediaSample::SetDiscontinuity ( 
    IMediaSample * This,
    long bDiscontinuity)
{
    Debug printf("%x: CMediaSample::SetDiscontinuity() called\n", This);
    return E_NOTIMPL;
}

HRESULT STDCALL CMediaSample::GetMediaTime ( 
    IMediaSample * This,
    /* [out] */ LONGLONG *pTimeStart,
    /* [out] */ LONGLONG *pTimeEnd)
{
    Debug printf("%x: CMediaSample::GetMediaTime() called\n", This);
    return E_NOTIMPL;
}

HRESULT STDCALL CMediaSample::SetMediaTime ( 
    IMediaSample * This,
    /* [in] */ LONGLONG *pTimeStart,
    /* [in] */ LONGLONG *pTimeEnd)    
{
    Debug printf("%x: CMediaSample::SetMediaTime() called\n", This);
    return E_NOTIMPL;
}