Page 4 of 5

Re: Camera Control needed for Tablet

PostPosted: Thu Aug 25, 2016 9:38 pm
by Antonio Linares
Tim, Gale,

Are you using different Windows builds ?

Re: Camera Control needed for Tablet

PostPosted: Thu Aug 25, 2016 9:45 pm
by Gale FORd
I am using Microsoft Windows 10 Pro
Version 10.0.10586 Build 10586
x64-based PC

I will try running it on our Panasonic Touphpad with Windows 10 Pro x86 version

Re: Camera Control needed for Tablet

PostPosted: Thu Aug 25, 2016 9:57 pm
by TimStone
Antonio,

On my Surface 3 ( not the pro model ), I just did a complete fresh re-install so it is the actual Anniversary release. I did it yesterday. It shows as Home: 14393.82

On my desktop, it is also working. This is an Insider Fast machine, build 14095.rs_prelease.160811-1739.

Re: Camera Control needed for Tablet

PostPosted: Thu Aug 25, 2016 10:00 pm
by Gale FORd
Works ok on Panasonic ToughPad
Windows 10 Pro 64bit
Same windows build as the one on my Surface Pro 3.
Dshow defaults to camera 2 that faces user.

Re: Camera Control needed for Tablet

PostPosted: Thu Aug 25, 2016 10:19 pm
by Antonio Linares
Gale,

Gale FORd wrote:On my Microsoft Surface Pro 3 with Windows 10 dshow.exe gets error.
"Could not render preview video stream"
dshow.exe was in the last .zip file you linked to.


After the error, is the app working fine ?

Re: Camera Control needed for Tablet

PostPosted: Thu Aug 25, 2016 10:38 pm
by Gale FORd
It shows a black square box inside the dialog. If I click on black square it creates another black square beside it.
It also creates a 352kb photo.bmp but the image seems to be empty.

Re: Camera Control needed for Tablet

PostPosted: Thu Aug 25, 2016 11:01 pm
by Antonio Linares
Gale,

Could you run this utility on your surface to see if it helps ?

http://error-toolkit.com/error.php?t=638

Re: Camera Control needed for Tablet

PostPosted: Mon Aug 29, 2016 9:23 pm
by TimStone
Antonio,

Looks like we have a start for a FWH camera control. You used a SaveToBMP( ) but actually we would benefit by saving pictures to an alternative file, ie. JPG.

Tim

Re: Camera Control needed for Tablet

PostPosted: Mon Aug 29, 2016 10:00 pm
by Antonio Linares
Tim,

A first version

tcamera.prg
Code: Select all  Expand view
#include "FiveWin.ch"

#define GWL_STYLE -16

function Main()

   local oWnd, oCamera

   DEFINE WINDOW oWnd

   oCamera = TCamera():New( oWnd )

   oCamera:bLClicked = { || oCamera:SaveToBmp( "photo.bmp" ),;
                            WinExec( "mspaint photo.bmp" ) }

   ACTIVATE WINDOW oWnd

return nil  

CLASS TCamera FROM TControl

   CLASSDATA lRegistered AS LOGICAL

   DATA pMediaControl

   METHOD New( oWndParent, nTop, nLeft, nBottom, nRight )

ENDCLASS

METHOD New( oWndParent, nTop, nLeft, nBottom, nRight ) CLASS TCamera

   DEFAULT nTop := 15, nLeft := 15, nBottom := 300, nRight := 300

   ::pMediaControl = DShowCamera()

   ::hWnd  = FindWindow( 0, "ActiveMovie Window" )
   ::oWnd  = oWndParent
   ::nTop  = nTop
   ::nLeft = nLeft
   ::nBottom = nBottom
   ::nRight  = nRight

   SetParent( ::hWnd, ::oWnd:hWnd )
   SetWindowLong( ::hWnd, GWL_STYLE, nOr( WS_CHILD, WS_VISIBLE ) )
   SetWindowPos( ::hWnd, 0, nTop, nLeft, nBottom, nRight )

   ::Register()
   ::Link()

return Self

#pragma BEGINDUMP

#pragma warning(disable:4996)

#include <hbapi.h>
#include <dshow.h>
#include <uuids.h>
#include <objbase.h>

#import "qedit.dll" raw_interfaces_only named_guids

EXTERN_C const CLSID CLSID_NullRenderer;
EXTERN_C const CLSID CLSID_SampleGrabber;

HB_FUNC( DSHOWPLAY )
{
   IMediaControl * pMediaControl = ( IMediaControl * ) hb_parnll( 1 );

   pMediaControl->Run();
}  

HB_FUNC( DSHOWSTOP )
{
   IMediaControl * pMediaControl = ( IMediaControl * ) hb_parnll( 1 );

   pMediaControl->Stop();
}  

HB_FUNC( DSHOWCAMERA )
{
   HRESULT hr;
   ICreateDevEnum *pDevEnum = NULL;
   IEnumMoniker *pEnum = NULL;
   IMoniker *pMoniker = NULL;
   IPropertyBag *pPropBag = NULL;
   IGraphBuilder *pGraph = NULL;
   ICaptureGraphBuilder2 *pBuilder = NULL;
   IBaseFilter *pCap = NULL;
   IBaseFilter *pSampleGrabberFilter = NULL;
   IBaseFilter *pNullRenderer = NULL;
   IMediaControl *pMediaControl = NULL;
   char *pBuffer = NULL;
   VARIANT var;
    int n = 0;
    int device_number = 0;
    char device_name[ 100 ];
   char char_buffer[100];
   DexterLib::ISampleGrabber *pSampleGrabber = NULL;

   strcpy( device_name, "" );

   hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );

   if( hr != S_OK )
      MessageBox( 0, "CoInitializeEx error", "ok", 0 );

   hr = CoCreateInstance( CLSID_FilterGraph, NULL,
              CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
              ( void ** ) &pGraph );
           
   if( hr != S_OK )
      MessageBox( 0, "CoCreateInstance error", "ok", 0 );
     
    hr = CoCreateInstance( CLSID_CaptureGraphBuilder2, NULL,
            CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
            ( void ** ) &pBuilder );      

   if( hr != S_OK )
      MessageBox( 0, "CoCreateInstance 2 error", "ok", 0 );

    hr = ( ( ICaptureGraphBuilder * ) pBuilder )->SetFiltergraph( pGraph );
   
    if( hr != S_OK )
        MessageBox( 0, "Could not attach capture graph builder to graph", "ok", 0 );
     
    hr = CoCreateInstance( CLSID_SystemDeviceEnum, NULL,
            CLSCTX_INPROC_SERVER, IID_PPV_ARGS( &pDevEnum ) );
         
    if( hr != S_OK )
        MessageBox( 0, "Could not crerate system device enumerator", "ok", 0 );
     
    hr = pDevEnum->CreateClassEnumerator(
                    CLSID_VideoInputDeviceCategory, &pEnum, 0 );
               
    if( hr != S_OK )
        MessageBox( 0, "No video devices found", "ok", 0 );      
     
    while(1)
    {
        // Access next device
        hr = pEnum->Next(1, &pMoniker, NULL);
        if( hr == S_OK )
            n++; // increment device count
      else  
         break;
       
        // If device was specified by name rather than number...
        if( device_number == 0 )
        {
            // Get video input device name
            hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
            if (hr == S_OK)
            {
                // Get current device name
                VariantInit(&var);
                hr = pPropBag->Read(L"FriendlyName", &var, 0);
               
                // Convert to a normal C string, i.e. char*
                sprintf(char_buffer, "%ls", var.bstrVal);
                VariantClear(&var);
                pPropBag->Release();
                pPropBag = NULL;
               
                // Exit loop if current device name matched devname
            // MessageBox( 0, char_buffer, "device_name", 0 );
           
                if (strcmp(device_name, char_buffer) == 0) break;
            }
            else
         {
                MessageBox( 0, "Error getting device names", "ok", 0 );
            break;
         }  
        }
        else if (n >= device_number) break;
    }  
   
    // Get video input device name
    hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
    VariantInit(&var);
    hr = pPropBag->Read(L"FriendlyName", &var, 0);
    // MessageBoxW( 0, L"Capture device", var.bstrVal, 0 );
    VariantClear(&var);  
   
    // Create capture filter and add to graph
    hr = pMoniker->BindToObject(0, 0,
                    IID_IBaseFilter, (void**)&pCap);
               
    if( hr != S_OK )
      MessageBox( 0, "Could not create capture filter", "ok", 0 );  

    // Add capture filter to graph
    hr = pGraph->AddFilter(pCap, L"Capture Filter");
   
    if( hr != S_OK )
      MessageBox( 0, "Could not add capture filter to graph", "ok", 0 );

    // Create sample grabber filter
    hr = CoCreateInstance(CLSID_SampleGrabber, NULL,
        CLSCTX_INPROC_SERVER, IID_IBaseFilter,
        (void**)&pSampleGrabberFilter);
     
    if( hr != S_OK )
        MessageBox( 0, "Could not create Sample Grabber filter", "ok", 0 );

    // Query the ISampleGrabber interface of the sample grabber filter
    hr = pSampleGrabberFilter->QueryInterface(
            DexterLib::IID_ISampleGrabber, (void**)&pSampleGrabber);
         
    if( hr != S_OK )
        MessageBox( 0, "Could not get ISampleGrabber interface to sample grabber filter", "ok", 0 );

    // Enable sample buffering in the sample grabber filter
    hr = pSampleGrabber->SetBufferSamples(TRUE);
   
    if( hr != S_OK )
        MessageBox( 0, "Could not enable sample buffering in the sample grabber", "ok", 0 );

    // Set media type in sample grabber filter
    AM_MEDIA_TYPE mt;
    ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
    mt.majortype = MEDIATYPE_Video;
    mt.subtype = MEDIASUBTYPE_RGB24;
    hr = pSampleGrabber->SetMediaType((DexterLib::_AMMediaType *)&mt);
   
    if( hr != S_OK )
        MessageBox( 0, "Could not set media type in sample grabber", "ok", 0 );

    // Add sample grabber filter to filter graph
    hr = pGraph->AddFilter(pSampleGrabberFilter, L"SampleGrab");
   
    if( hr != S_OK )
        MessageBox( 0, "Could not add Sample Grabber to filter graph", "ok", 0 );

    // Create Null Renderer filter
    hr = CoCreateInstance(CLSID_NullRenderer, NULL,
        CLSCTX_INPROC_SERVER, IID_IBaseFilter,
        (void**)&pNullRenderer);

   if( hr != S_OK )
        MessageBox( 0, "Could not create Null Renderer filter", "ok", 0 );

    // Add Null Renderer filter to filter graph
    hr = pGraph->AddFilter(pNullRenderer, L"NullRender");

   if( hr != S_OK )
        MessageBox( 0, "Could not add Null Renderer to filter graph", "ok", 0 );
     
   // Connect up the filter graph's capture stream
    hr = pBuilder->RenderStream(
        &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
        pCap,  pSampleGrabberFilter, pNullRenderer);
     
    if( hr != S_OK )
        MessageBox( 0, "Could not render capture video stream", "ok", 0 );

    hr = pBuilder->RenderStream(
                &PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
                pCap, NULL, NULL);
   
   if (hr != S_OK && hr != VFW_S_NOPREVIEWPIN)
            MessageBox( 0, "Could not render preview video stream", "ok", 0 );

    // Get media control interfaces to graph builder object
    hr = pGraph->QueryInterface(IID_IMediaControl,
                    (void**)&pMediaControl);

   if( hr != S_OK )
      MessageBox( 0, "Could not get media control interface", "ok", 0 );

    // Run graph
    while(1)
    {
        hr = pMediaControl->Run();
       
        // Hopefully, the return value was S_OK or S_FALSE
        if (hr == S_OK) break; // graph is now running
        if (hr == S_FALSE) continue; // graph still preparing to run
       
        // If the Run function returned something else,
        // there must be a problem
        // fprintf(stderr, "Error: %u\n", hr);
        MessageBox( 0, "Could not run filter graph", "ok", 0 );
    }
   
   hb_retnll( ( HB_LONGLONG ) pMediaControl );
}

#pragma ENDDUMP

Re: Camera Control needed for Tablet

PostPosted: Mon Aug 29, 2016 10:05 pm
by Antonio Linares
Methods Play and Stop:

Code: Select all  Expand view
CLASS TCamera FROM TControl

   CLASSDATA lRegistered AS LOGICAL

   DATA pMediaControl

   METHOD New( oWndParent, nTop, nLeft, nBottom, nRight )

   METHOD Play() INLINE DShowPlay( ::pMediaControl )

   METHOD Stop() INLINE DShowStop( ::pMediaControl )

ENDCLASS
 

Re: Camera Control needed for Tablet

PostPosted: Tue Aug 30, 2016 5:31 am
by HunterEC
Antonio:

I tried to compile tcamera.prg using FW 16.06 and BCC7 and I got the following errors:
Code: Select all  Expand view
Error E2342 TCAMERA.prg 239: Type mismatch in parameter 'rclsid' (wanted 'const_GUID * const', got '_GUID') in function HB_FUN_DSHOWCAMERA
Error E2451 TCAMERA.prg 245: Undefined symbol 'AddFilter' in function HB_FUN_DSHOWCAMERA
Error E2451 TCAMERA.prg 251: Undefined symbol 'RenderStream' in function HB_FUN_DSHOWCAMERA
Error E2451 TCAMERA.prg 258: Undefined symbol 'RenderStream' in function HB_FUN_DSHOWCAMERA
Error E2451 TCAMERA.prg 266: Undefined symbol 'QueryInterface' in function HB_FUN_DSHOWCAMERA
Error E2451 TCAMERA.prg 275: Undefined symbol 'Run' in function HB_FUN_DSHOWCAMERA
Warning W8004 TCAMERA.prg 288: 'pBuffer' is assigned a value that is never used in function HB_FUN_DSHOWCAMERA
Warning W8004 TCAMERA.prg 288: 'pCap' is assigned a value that is never used in function HB_FUN_DSHOWCAMERA
Warning W8004 TCAMERA.prg 288: 'pPropBag' is assigned a value that is never used in function HB_FUN_DSHOWCAMERA
Warning W8004 TCAMERA.prg 288: 'pMoniker' is assigned a value that is never used in function HB_FUN_DSHOWCAMERA
Warning W8004 TCAMERA.prg 288: 'pEnum' is assigned a value that is never used in function HB_FUN_DSHOWCAMERA
Warning W8004 TCAMERA.prg 288: 'pDevEnum' is assigned a value that is never used in function HB_FUN_DSHOWCAMERA
*** 35 errors in Compile ***
* Linking errors *


What I am missing ? Thank you very much !!!

Re: Camera Control needed for Tablet

PostPosted: Tue Aug 30, 2016 6:14 am
by Antonio Linares
Gustavo,

It only works with Microsoft Visual Studio Community 2015

Re: Camera Control needed for Tablet

PostPosted: Wed Jan 10, 2018 9:07 am
by Silvio.Falconi
Can you make a version to compile with harbour bcc7 for win10pro ?
or a version with a dll or lib we can use it
i have a tablet and i need it thanks

Re: Camera Control needed for Tablet

PostPosted: Wed Jan 10, 2018 9:50 am
by Silvio.Falconi
Dear Antonio

I found this http://www.rohitab.com/discuss/topic/34 ... e-class-c/

perhaps it can be usefull to use it for borland

Re: Camera Control needed for Tablet

PostPosted: Thu Jan 11, 2018 6:38 pm
by TimStone
Silvio,

The application requires files only available with the Microsoft Visual Studio Community edition. It will not work with the Pelles compiler ( xHarbour xBuilder ), or Borland. The resources are not available in those programs.

The program was developed using VSC 2015 but works fine with VSC 2017 also.

Tim