Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon.

Pages: 1-

directshow

Name: Anonymous 2012-03-11 9:22

Hi

I'm trying to write program for capturing video from web cam.

I read manuals about directshow and understood some concepts of this framework

But now, i have a problem. when i trying to renderstream i get hresult e_invalidarg

this is full code:

#include <stdio.h>

#include <windows.h>
#include <dshow.h>



#pragma comment(lib, "strmiids")



    IBaseFilter *pMux;
    IGraphBuilder *pGraph = NULL;
    ICaptureGraphBuilder2 *pBuild = NULL;
    IMoniker *pMoniker = NULL;
    IBaseFilter *pCap;
    IFilterGraph *m_pGraph;
   

void DisplayDeviceInformation(IEnumMoniker *pEnum)
{
   

    while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
    {
        IPropertyBag *pPropBag;
        HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
        if (FAILED(hr))
        {
           // pMoniker->Release();
            continue;
        }

        VARIANT var;
        VariantInit(&var);

        // Get description or friendly name.
        hr = pPropBag->Read(L"Description", &var, 0);
        if (FAILED(hr))
        {
            hr = pPropBag->Read(L"FriendlyName", &var, 0);
        }
        if (SUCCEEDED(hr))
        {
            printf("%S\n", var.bstrVal);
            VariantClear(&var);
        }

        hr = pPropBag->Write(L"FriendlyName", &var);

        // WaveInID applies only to audio capture devices.
        hr = pPropBag->Read(L"WaveInID", &var, 0);
        if (SUCCEEDED(hr))
        {
            printf("WaveIn ID: %d\n", var.lVal);
            VariantClear(&var);
        }

        hr = pPropBag->Read(L"DevicePath", &var, 0);
        if (SUCCEEDED(hr))
        {
            // The device path is not intended for display.
            printf("Device path: %S\n", var.bstrVal);
            VariantClear(&var);
        }

        //pPropBag->Release();
        //pMoniker->Release();
    }
}
HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum)
{
    // Create the System Device Enumerator.
    ICreateDevEnum *pDevEnum;
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
        CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));

   

    if (SUCCEEDED(hr))
    {
        // Create an enumerator for the category.
        hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0);
        if (hr == S_FALSE)
        {
            hr = VFW_E_NOT_FOUND;  // The category is empty. Treat as an error.
        }
        //pDevEnum->Release();
    }
    return hr;
}
HRESULT InitCaptureGraphBuilder()
{
    // Create the Capture Graph Builder.
    HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
        CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );
    if (SUCCEEDED(hr))
    {
        // Create the Filter Graph Manager.
        hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,
            IID_IGraphBuilder, (void**)&pGraph);
        if (SUCCEEDED(hr))
        {
            // Initialize the Capture Graph Builder.
            pBuild->SetFiltergraph(pGraph);


            return S_OK;
        }
        else
        {
            //pBuild->Release();
        }
    }
    return hr; // Failed
}


int main()
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

    if (SUCCEEDED(hr))
    {
        IEnumMoniker *pEnum;

        hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
        if (SUCCEEDED(hr))
        {
            DisplayDeviceInformation(pEnum);
            pEnum->Release();
        }

        //CoUninitialize();
    }

    InitCaptureGraphBuilder();

    hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
                                  IID_IGraphBuilder, (LPVOID *)&m_pGraph);
        hr = m_pGraph->AddFilter(pCap, L"Capture Filter");
    }    

    hr = pBuild->SetOutputFileName(
    &MEDIASUBTYPE_Avi,  // Specifies AVI for the target file.
    L"C:\\Example.avi", // File name.
    &pMux,              // Receives a pointer to the mux.
    NULL);

/*    hr = pBuild->RenderStream(
    &PIN_CATEGORY_CAPTURE, // Pin category.
    &MEDIATYPE_Video,      // Media type.
    pCap,                  // Capture filter.
    NULL,                  // Intermediate filter (optional).
    pMux);                 // Mux or file sink filter.
    */


    // Release the mux filter.
//    pMux->Release();

    IConfigAviMux *pConfigMux = NULL;
    hr = pMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfigMux);
    if (SUCCEEDED(hr))
    {
        pConfigMux->SetMasterStream(1);
        pConfigMux->Release();
    }
    IConfigInterleaving *pInterleave = NULL;
    hr = pMux->QueryInterface(IID_IConfigInterleaving, (void**)&pInterleave);
    if (SUCCEEDED(hr))
    {
        pInterleave->put_Mode(INTERLEAVE_CAPTURE);
        pInterleave->Release();
    }

    IBaseFilter *pEncoder;
    /* Create the encoder filter . */
    hr = pMoniker->BindToObject( 0, 0, IID_IBaseFilter, (void**) &pEncoder );
    // Add it to the filter graph.
    pGraph->AddFilter(pEncoder, L"Encoder");

    // Render the stream.
    hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
        pCap,
    NULL, pMux);
    printf("%d",hr);
   
    pEncoder->Release();
}


hr has a value "e_invalidarg" in line:

hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
        pCap,
    NULL, pMux);

what's the problem?

Name: Anonymous 2012-03-11 9:37

`
>printf("%S\n",

stopped reading right here

Name: Anonymous 2012-03-11 18:50

no code tags
stopped reading right there

... but then read a little further ...

#include <windows.h>
stopped reading right there

Don't change these.
Name: Email:
Entire Thread Thread List