windows-nt/Source/XPSP1/NT/multimedia/dshow/vidctl/msvidctl/msvidsbesink.cpp
2020-09-26 16:20:57 +08:00

235 lines
6.5 KiB
C++

//==========================================================================;
//
// Copyright (c) Microsoft Corporation 1999-2000.
//
//--------------------------------------------------------------------------;
//
// MSVidStreamBufferSink.cpp : Implementation of CMSVidStreamBufferSink
//
#include "stdafx.h"
#ifndef TUNING_MODEL_ONLY
#include <encdec.h>
#include "MSVidCtl.h"
#include "MSVidSbeSink.h"
DEFINE_EXTERN_OBJECT_ENTRY(CLSID_MSVidStreamBufferSink, CMSVidStreamBufferSink)
/////////////////////////////////////////////////////////////////////////////
// CMSVidStreamBufferSink
STDMETHODIMP CMSVidStreamBufferSink::InterfaceSupportsErrorInfo(REFIID riid){
static const IID* arr[] =
{
&IID_IMSVidStreamBufferSink
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP CMSVidStreamBufferSink::get_SinkName(BSTR *pName){
try{
if(!pName){
return E_POINTER;
}
*pName = m_SinkName.Copy();
return S_OK;
}
catch(...){
return E_UNEXPECTED;
}
}
// This function has to be called before the graph is running
// so before or after build but before run is called
STDMETHODIMP CMSVidStreamBufferSink::put_SinkName(BSTR Name){
try{
if(!wcslen(Name)){
return E_INVALIDARG;
}
m_SinkName = Name;
m_bNameSet = FALSE;
CComQIPtr<IMSVidCtl> pq_vidCtl;
if(!m_pContainer){
return S_OK;
}
else{
HRESULT hr = m_pContainer->QueryInterface(IID_IMSVidCtl, reinterpret_cast<void**>(&pq_vidCtl));
if(FAILED(hr)){
return hr;
}
MSVidCtlStateList state;
hr = pq_vidCtl->get_State(&state);
if(FAILED(hr)){
return hr;
}
if(state == STATE_UNBUILT || state == STATE_STOP){
hr = m_ptsSink->IsProfileLocked();
if(FAILED(hr)){
return hr;
}
else if(hr != S_FALSE){
return E_FAIL; // should be called after run called on sink
}
}
else{
return E_FAIL; // should be called after run called on sink
}
}
return S_OK;
}
catch(...){
return E_UNEXPECTED;
}
}
void CMSVidStreamBufferSink::Expunge(){
if(!( !m_RecordObj)){// not not'ing smart pointer, they assert if p == 0
m_RecordObj.Release();
}
return;
}
HRESULT CMSVidStreamBufferSink::get_ContentRecorder(BSTR pszFilename, IMSVidStreamBufferRecordingControl ** ppRecording){
try{
if(!pszFilename || !ppRecording){
return E_POINTER;
}
if(!( !m_RecordObj)){// not not'ing smart pointer, they assert if p == 0
m_RecordObj.Release();
}
// Create the new recorder if needed and insert it
PUnknown tempUnknown;
if(!m_ptsSink){
//return not_init
return E_FAIL; // should be invalid state
}
CComBSTR val = pszFilename;
HRESULT hr = m_ptsSink->CreateRecorder(val, RECORDING_TYPE_CONTENT,&tempUnknown);
if(FAILED(hr)){
return hr;
}
pqSBERecControl newRec(tempUnknown);
if(!newRec){
return E_UNEXPECTED;
}
tempUnknown.Release();
m_RecordObj = new CMSVidStreamBufferRecordingControl(newRec.Detach(), val.Detach(), RECORDING_TYPE_CONTENT);
if(!m_RecordObj){
ASSERT(false);
return E_UNEXPECTED;
}
/*
CComQIPtr<IMSVidStreamBufferRecorder>retObj(m_RecordObj);
if(!retObj){
ASSERT(false);
return E_UNEXPECTED;
}
*ppRecording = retObj.Detach();
*/
//m_RecordObj->AddRef();
hr = m_RecordObj.CopyTo(ppRecording);
if(!ppRecording || FAILED(hr)){
ASSERT(false);
return E_UNEXPECTED;
}
}
catch(...){
return E_UNEXPECTED;
}
return S_OK;
}
HRESULT CMSVidStreamBufferSink::get_ReferenceRecorder(BSTR pszFilename, IMSVidStreamBufferRecordingControl ** ppRecording){
try{
if(!pszFilename || !ppRecording){
return E_POINTER;
}
if(!( !m_RecordObj)){// not not'ing smart pointer, they assert if p == 0
m_RecordObj.Release();
}
// Create the new recorder if needed and insert it
PUnknown tempUnknown;
if(!m_ptsSink){
//return not_init
return E_FAIL; // should be invalid state
}
CComBSTR val = pszFilename;
HRESULT hr = m_ptsSink->CreateRecorder(val, RECORDING_TYPE_REFERENCE, &tempUnknown);
if(FAILED(hr)){
return hr;
}
pqSBERecControl newRec(tempUnknown);
if(!newRec){
return E_UNEXPECTED;
}
tempUnknown.Release();
m_RecordObj = new CMSVidStreamBufferRecordingControl(newRec.Detach(), val.Detach(), RECORDING_TYPE_REFERENCE);
if(!m_RecordObj){
ASSERT(false);
return E_UNEXPECTED;
}
/*
CComQIPtr<IMSVidStreamBufferRecordingControl>retObj(m_RecordObj);
if(!retObj){
ASSERT(false);
return E_UNEXPECTED;
}
*ppRecording = retObj.Detach();
*/
//m_RecordObj->AddRef();
hr = m_RecordObj.CopyTo(ppRecording);
if(!ppRecording || FAILED(hr)){
ASSERT(false);
return E_UNEXPECTED;
}
}
catch(...){
return E_UNEXPECTED;
}
return S_OK;
}
HRESULT CMSVidStreamBufferSink::get_SBESink(IUnknown ** sbeConfig){
if(!sbeConfig){
return E_POINTER;
}
if(m_StreamBuffersink == -1){
return E_UNEXPECTED;
}
CComQIPtr<IBaseFilter> spSinkFilter(m_Filters[m_StreamBuffersink]);
CComPtr<IUnknown>spUnk;
spUnk = spSinkFilter;
if(!spUnk){
return E_UNEXPECTED;
}
*sbeConfig = spUnk.Detach();
return NOERROR;
}
HRESULT CMSVidStreamBufferSink::Fire(GUID gEventID) {
TRACELSM(TRACE_DETAIL, (dbgDump << "CMSVidStreamBufferSink::Fire() guid = " << GUID2(gEventID)), "");
if (gEventID == EVENTID_ETDTFilterLicenseFailure) {
Fire_CertificateFailure();
} else if (gEventID == EVENTID_ETDTFilterLicenseOK) {
TRACELSM(TRACE_ERROR, (dbgDump << "CMSVidStreamBufferSink::Fire() Certificate Success"), "");
Fire_CertificateSuccess();
}
return NOERROR;
}
#endif //TUNING_MODEL_ONLY
// end of file - MSVidStreamBufferSink.cpp