[vlc-devel] [PATCH] Significant changes to ATSC and DVB-S processing which now work.
Jean-Baptiste Kempf
jb at videolan.org
Mon Dec 15 17:54:18 CET 2008
Applied, with very small modifications.
On Sun, Dec 14, 2008 at 10:04:24PM +1100, Ken Self wrote :
> From: kenself <kenself at optusnet.com.au>
>
> ---
> modules/access/bda/bdagraph.cpp | 307 ++++++++++++++++++++++++++++++++++-----
> 1 files changed, 273 insertions(+), 34 deletions(-)
>
> diff --git a/modules/access/bda/bdagraph.cpp b/modules/access/bda/bdagraph.cpp
> index c60be0a..302a8fa 100644
> --- a/modules/access/bda/bdagraph.cpp
> +++ b/modules/access/bda/bdagraph.cpp
> @@ -141,13 +141,14 @@ int BDAGraph::SubmitATSCTuneRequest()
> }
> } l;
> long l_major_channel, l_minor_channel, l_physical_channel;
> + long l_frequency;
>
> l_major_channel = l_minor_channel = l_physical_channel = -1;
> -/*
> + l_frequency = -1;
> l_major_channel = var_GetInteger( p_access, "dvb-major-channel" );
> l_minor_channel = var_GetInteger( p_access, "dvb-minor-channel" );
> l_physical_channel = var_GetInteger( p_access, "dvb-physical-channel" );
> -*/
> + l_frequency = var_GetInteger( p_access, "dvb-frequency" );
>
> guid_network_type = CLSID_ATSCNetworkProvider;
> hr = CreateTuneRequest();
> @@ -176,6 +177,8 @@ int BDAGraph::SubmitATSCTuneRequest()
> }
>
> hr = S_OK;
> + if( l_frequency > 0 )
> + hr = l.p_atsc_locator->put_CarrierFrequency( l_frequency );
> if( l_major_channel > 0 )
> hr = l.p_atsc_tune_request->put_Channel( l_major_channel );
> if( SUCCEEDED( hr ) && l_minor_channel > 0 )
> @@ -506,8 +509,12 @@ int BDAGraph::SubmitDVBSTuneRequest()
> IDVBTuneRequest* p_dvbs_tune_request;
> IDVBSLocator* p_dvbs_locator;
> IDVBSTuningSpace* p_dvbs_tuning_space;
> + BSTR bstr_input_range;
> + WCHAR* pwsz_input_range;
> + int i_range_len;
> localComPtr(): p_dvbs_tune_request(NULL), p_dvbs_locator(NULL),
> - p_dvbs_tuning_space(NULL) {};
> + p_dvbs_tuning_space(NULL), bstr_input_range(NULL),
> + pwsz_input_range(NULL), i_range_len(NULL) {};
> ~localComPtr()
> {
> if( p_dvbs_tuning_space )
> @@ -516,17 +523,26 @@ int BDAGraph::SubmitDVBSTuneRequest()
> p_dvbs_tune_request->Release();
> if( p_dvbs_locator )
> p_dvbs_locator->Release();
> + SysFreeString( bstr_input_range );
> + if( pwsz_input_range )
> + delete pwsz_input_range;
> }
> } l;
> long l_frequency, l_symbolrate, l_azimuth, l_elevation, l_longitude;
> long l_lnb_lof1, l_lnb_lof2, l_lnb_slof, l_inversion, l_network_id;
> - char* psz_polarisation;
> + long l_input_range, l_hp_fec;
> + int i_mod;
> + char* psz_polarisation = NULL;
> + char* psz_input_range = NULL;
> Polarisation i_polar;
> SpectralInversion i_inversion;
> VARIANT_BOOL b_west;
> + BinaryConvolutionCodeRate i_hp_fec;
> + ModulationType i_mod_typ;
>
> l_frequency = l_symbolrate = l_azimuth = l_elevation = l_longitude = -1;
> l_lnb_lof1 = l_lnb_lof2 = l_lnb_slof = l_inversion = l_network_id = -1;
> + l_input_range = l_hp_fec = i_mod = -1;
> l_frequency = var_GetInteger( p_access, "dvb-frequency" );
> l_symbolrate = var_GetInteger( p_access, "dvb-srate" );
> l_azimuth = var_GetInteger( p_access, "dvb-azimuth" );
> @@ -536,8 +552,11 @@ int BDAGraph::SubmitDVBSTuneRequest()
> l_lnb_lof2 = var_GetInteger( p_access, "dvb-lnb-lof2" );
> l_lnb_slof = var_GetInteger( p_access, "dvb-lnb-slof" );
> psz_polarisation = var_GetNonEmptyString( p_access, "dvb-polarisation" );
> + i_mod = var_GetInteger( p_access, "dvb-modulation" );
> + l_hp_fec = var_GetInteger( p_access, "dvb-code-rate-hp" );
> l_inversion = var_GetInteger( p_access, "dvb-inversion" );
> - l_network_id = var_GetInteger( p_access, "dvb-network_id" );
> + l_network_id = var_GetInteger( p_access, "dvb-network-id" );
> + psz_input_range = var_GetNonEmptyString( p_access, "dvb-range" );
>
> b_west = ( l_longitude < 0 ) ? TRUE : FALSE;
>
> @@ -567,6 +586,38 @@ int BDAGraph::SubmitDVBSTuneRequest()
> if( l_inversion == 2 )
> i_inversion = BDA_SPECTRAL_INVERSION_AUTOMATIC;
>
> + i_mod_typ = BDA_MOD_NOT_SET;
> + if( i_mod == 16 )
> + i_mod_typ = BDA_MOD_16QAM;
> + if( i_mod == 128 )
> + i_mod_typ = BDA_MOD_128QAM;
> + if( i_mod == 256 )
> + i_mod_typ = BDA_MOD_256QAM;
> + if( i_mod == 10004 )
> + i_mod_typ = BDA_MOD_QPSK;
> +
> + i_hp_fec = BDA_BCC_RATE_NOT_SET;
> + if( l_hp_fec == 1 )
> + i_hp_fec = BDA_BCC_RATE_1_2;
> + if( l_hp_fec == 2 )
> + i_hp_fec = BDA_BCC_RATE_2_3;
> + if( l_hp_fec == 3 )
> + i_hp_fec = BDA_BCC_RATE_3_4;
> + if( l_hp_fec == 4 )
> + i_hp_fec = BDA_BCC_RATE_5_6;
> + if( l_hp_fec == 5 )
> + i_hp_fec = BDA_BCC_RATE_7_8;
> +
> + l.i_range_len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
> + psz_input_range, -1, l.pwsz_input_range, 0 );
> + if( l.i_range_len > 0 )
> + {
> + l.pwsz_input_range = new WCHAR[l.i_range_len];
> + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
> + psz_input_range, -1, l.pwsz_input_range, l.i_range_len );
> + l.bstr_input_range=SysAllocString( l.pwsz_input_range );
> + }
> +
> guid_network_type = CLSID_DVBSNetworkProvider;
> hr = CreateTuneRequest();
> if( FAILED( hr ) )
> @@ -606,31 +657,57 @@ int BDAGraph::SubmitDVBSTuneRequest()
> return VLC_EGENERIC;
> }
>
> +/*****************************************************************************/
> +/* More traces */
> + long l_tmp_lof1, l_tmp_lof2, l_tmp_slof;
> + BSTR bstr_tmp_range;
> + HRESULT hr2;
> + l_tmp_lof1 = l_tmp_lof2 = l_tmp_slof = -1;
> + hr2 = l.p_dvbs_tuning_space->get_LNBSwitch( &l_tmp_slof );
> + msg_Dbg( p_access, "get_LNBSwitch: %d", l_tmp_slof );
> + hr2 = l.p_dvbs_tuning_space->get_LowOscillator( &l_tmp_lof1 );
> + msg_Dbg( p_access, "get_LowOscillator: %d", l_tmp_lof1 );
> + hr2 = l.p_dvbs_tuning_space->get_HighOscillator( &l_tmp_lof2 );
> + msg_Dbg( p_access, "get_HighOscillator: %d", l_tmp_lof2 );
> + hr2 = l.p_dvbs_tuning_space->get_InputRange( &bstr_tmp_range );
> + msg_Dbg( p_access, "get_InputRange: %S", bstr_tmp_range );
> + SysFreeString( bstr_tmp_range );
> +
> +/*****************************************************************************/
> +
> hr = S_OK;
> - if( l_frequency > 0 )
> + if( l_lnb_lof1 > 0 )
> + hr = l.p_dvbs_tuning_space->put_LowOscillator( l_lnb_lof1 );
> + if( SUCCEEDED( hr ) && l_lnb_slof > 0 )
> + hr = l.p_dvbs_tuning_space->put_LNBSwitch( l_lnb_slof );
> + if( SUCCEEDED( hr ) && l_lnb_lof2 > 0 )
> + hr = l.p_dvbs_tuning_space->put_HighOscillator( l_lnb_lof2 );
> + if( SUCCEEDED( hr ) && i_inversion != BDA_SPECTRAL_INVERSION_NOT_SET )
> + hr = l.p_dvbs_tuning_space->put_SpectralInversion( i_inversion );
> + if( SUCCEEDED( hr ) && l_network_id > 0 )
> + hr = l.p_dvbs_tuning_space->put_NetworkID( l_network_id );
> + if( SUCCEEDED( hr ) && l.i_range_len > 0 )
> + hr = l.p_dvbs_tuning_space->put_InputRange( l.bstr_input_range );
> +
> + if( SUCCEEDED( hr ) && l_frequency > 0 )
> hr = l.p_dvbs_locator->put_CarrierFrequency( l_frequency );
> if( SUCCEEDED( hr ) && l_symbolrate > 0 )
> hr = l.p_dvbs_locator->put_SymbolRate( l_symbolrate );
> + if( SUCCEEDED( hr ) && i_polar != BDA_POLARISATION_NOT_SET )
> + hr = l.p_dvbs_locator->put_SignalPolarisation( i_polar );
> + if( SUCCEEDED( hr ) && i_mod_typ != BDA_MOD_NOT_SET )
> + hr = l.p_dvbs_locator->put_Modulation( i_mod_typ );
> + if( SUCCEEDED( hr ) && i_hp_fec != BDA_BCC_RATE_NOT_SET )
> + hr = l.p_dvbs_locator->put_InnerFECRate( i_hp_fec );
> +
> if( SUCCEEDED( hr ) && l_azimuth > 0 )
> hr = l.p_dvbs_locator->put_Azimuth( l_azimuth );
> if( SUCCEEDED( hr ) && l_elevation > 0 )
> hr = l.p_dvbs_locator->put_Elevation( l_elevation );
> if( SUCCEEDED( hr ) )
> - hr = l.p_dvbs_locator->put_OrbitalPosition( labs( l_longitude ) );
> - if( SUCCEEDED( hr ) )
> hr = l.p_dvbs_locator->put_WestPosition( b_west );
> - if( SUCCEEDED( hr ) && i_polar != BDA_POLARISATION_NOT_SET )
> - hr = l.p_dvbs_locator->put_SignalPolarisation( i_polar );
> - if( SUCCEEDED( hr ) && l_lnb_lof1 > 0 )
> - hr = l.p_dvbs_tuning_space->put_LowOscillator( l_lnb_lof1 );
> - if( SUCCEEDED( hr ) && l_lnb_lof2 > 0 )
> - hr = l.p_dvbs_tuning_space->put_HighOscillator( l_lnb_lof2 );
> - if( SUCCEEDED( hr ) && l_lnb_slof > 0 )
> - hr = l.p_dvbs_tuning_space->put_LNBSwitch( l_lnb_slof );
> - if( SUCCEEDED( hr ) && i_inversion != BDA_SPECTRAL_INVERSION_NOT_SET )
> - hr = l.p_dvbs_tuning_space->put_SpectralInversion( i_inversion );
> - if( SUCCEEDED( hr ) && l_network_id > 0 )
> - hr = l.p_dvbs_tuning_space->put_NetworkID( l_network_id );
> + if( SUCCEEDED( hr ) )
> + hr = l.p_dvbs_locator->put_OrbitalPosition( labs( l_longitude ) );
> if( FAILED( hr ) )
> {
> msg_Warn( p_access, "SubmitDVBSTuneRequest: "\
> @@ -679,8 +756,14 @@ HRESULT BDAGraph::CreateTuneRequest()
> ITuningSpaceContainer* p_tuning_space_container;
> IEnumTuningSpaces* p_tuning_space_enum;
> ITuningSpace* p_this_tuning_space;
> + BSTR bstr_name;
> + char * psz_network_name;
> + WCHAR * wpsz_network_name;
> + int i_name_len;
> localComPtr(): p_tuning_space_container(NULL),
> - p_tuning_space_enum(NULL), p_this_tuning_space(NULL) {};
> + p_tuning_space_enum(NULL), p_this_tuning_space(NULL),
> + i_name_len(0), psz_network_name(NULL), wpsz_network_name(NULL),
> + bstr_name(NULL) {};
> ~localComPtr()
> {
> if( p_tuning_space_container )
> @@ -689,9 +772,31 @@ HRESULT BDAGraph::CreateTuneRequest()
> p_tuning_space_enum->Release();
> if( p_this_tuning_space )
> p_this_tuning_space->Release();
> + SysFreeString( bstr_name );
> + if( wpsz_network_name ) delete wpsz_network_name;
> }
> } l;
>
> + /* We shall test for a specific Tuning space name supplied on the command
> + * line as dvb-networkname=xxx.
> + * For some users with multiple cards and/or multiple networks this could
> + * be useful. This allows us to reasonably safely apply updates to the
> + * System Tuning Space in the registry without disrupting other streams. */
> + l.psz_network_name = var_GetNonEmptyString( p_access, "dvb-network-name" );
> + if( l.psz_network_name )
> + {
> + l.i_name_len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
> + l.psz_network_name, -1, l.wpsz_network_name, 0 );
> + if( l.i_name_len > 0 )
> + {
> + l.wpsz_network_name = new WCHAR[l.i_name_len];
> + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, l.psz_network_name, -1,
> + l.wpsz_network_name, l.i_name_len );
> + msg_Dbg( p_access, "CreateTuneRequest: Find Tuning Space: %S",
> + l.wpsz_network_name );
> + }
> + }
> +
> /* A Tuning Space may already have been set up. If it is for the same
> * network type then all is well. Otherwise, reset the Tuning Space and get
> * a new one */
> @@ -701,13 +806,26 @@ HRESULT BDAGraph::CreateTuneRequest()
> if( FAILED( hr ) ) guid_this_network_type = GUID_NULL;
> if( guid_this_network_type == guid_network_type )
> {
> - return S_OK;
> - }
> - else
> - {
> - p_tuning_space->Release();
> - p_tuning_space = NULL;
> + hr = p_tuning_space->get_UniqueName( &l.bstr_name );
> + if( FAILED( hr ) )
> + {
> + msg_Warn( p_access, "CreateTuneRequest: "\
> + "Cannot get UniqueName for Tuning Space: hr=0x%8lx", hr );
> + return hr;
> + }
> + /* Test for a specific Tuning space name supplied on the command
> + * line as dvb-networkname=xxx */
> + if( l.i_name_len == 0 ||
> + lstrcmpW( l.wpsz_network_name, l.bstr_name ) == 0 )
> + {
> + msg_Dbg( p_access, "CreateTuneRequest: Using Tuning Space: %S",
> + l.bstr_name );
> + return S_OK;
> + }
> }
> + /* else */
> + p_tuning_space->Release();
> + p_tuning_space = NULL;
> }
>
> /* Force use of the first available Tuner Device during Build */
> @@ -736,7 +854,7 @@ HRESULT BDAGraph::CreateTuneRequest()
> while( l.p_tuning_space_enum->Next( 1, &l.p_this_tuning_space, NULL ) ==
> S_OK )
> {
> - hr = l.p_this_tuning_space->get__NetworkType( &guid_this_network_type );
> + hr = l.p_this_tuning_space->get__NetworkType( &guid_this_network_type );
>
> /* GUID_NULL means a non-BDA network was found e.g analog
> * Ignore failures and non-BDA networks and keep looking */
> @@ -752,23 +870,102 @@ HRESULT BDAGraph::CreateTuneRequest()
> "Cannot QI Tuning Space: hr=0x%8lx", hr );
> return hr;
> }
> - hr = p_tuning_space->CreateTuneRequest( &p_tune_request );
> + hr = p_tuning_space->get_UniqueName( &l.bstr_name );
> if( FAILED( hr ) )
> {
> msg_Warn( p_access, "CreateTuneRequest: "\
> - "Cannot Create Tune Request: hr=0x%8lx", hr );
> + "Cannot get UniqueName for Tuning Space: hr=0x%8lx", hr );
> + return hr;
> + }
> +
> + /* Test for a specific Tuning space name supplied on the command
> + * line as dvb-networkname=xxx */
> + if( l.i_name_len == 0 ||
> + lstrcmpW( l.wpsz_network_name, l.bstr_name ) == 0 )
> + {
> + msg_Dbg( p_access, "CreateTuneRequest: Using Tuning Space: %S",
> + l.bstr_name );
> + hr = p_tuning_space->CreateTuneRequest( &p_tune_request );
> + if( FAILED( hr ) )
> + msg_Warn( p_access, "CreateTuneRequest: "\
> + "Cannot Create Tune Request: hr=0x%8lx", hr );
> return hr;
> }
> - return hr;
> }
> }
> - hr = E_FAIL;
> - if( FAILED( hr ) )
> + /* No tune request was found. If the create-name parameter was set then
> + * create a tuning space. By rights should use the same name used in
> + * network-name
> + * Also would be nice to copy a tuning space but we only come here if we do
> + * not find any. */
> + l.psz_network_name = var_GetNonEmptyString( p_access, "dvb-create-name" );
> + if( !l.psz_network_name )
> {
> + hr = E_FAIL;
> msg_Warn( p_access, "CreateTuneRequest: "\
> "Cannot find a suitable System Tuning Space: hr=0x%8lx", hr );
> return hr;
> }
> +
> + /* Need to use DVBSTuningSpace for DVB-S and ATSCTuningSpace for ATSC */
> + VARIANT var_id;
> + CLSID cls_tuning_space;
> +
> + if( IsEqualCLSID( guid_network_type, CLSID_ATSCNetworkProvider ) )
> + cls_tuning_space = CLSID_ATSCTuningSpace;
> + if( IsEqualCLSID( guid_network_type, CLSID_DVBTNetworkProvider ) )
> + cls_tuning_space = CLSID_DVBTuningSpace;
> + if( IsEqualCLSID( guid_network_type, CLSID_DVBCNetworkProvider ) )
> + cls_tuning_space = CLSID_DVBTuningSpace;
> + if( IsEqualCLSID( guid_network_type, CLSID_DVBSNetworkProvider ) )
> + cls_tuning_space = CLSID_DVBSTuningSpace;
> +
> + if( l.wpsz_network_name ) delete l.wpsz_network_name;
> + l.i_name_len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
> + l.psz_network_name, -1, l.wpsz_network_name, 0 );
> + if( l.i_name_len > 0 )
> + {
> + l.wpsz_network_name = new WCHAR[l.i_name_len];
> + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, l.psz_network_name, -1,
> + l.wpsz_network_name, l.i_name_len );
> + if( l.bstr_name )
> + SysFreeString( l.bstr_name );
> + l.bstr_name = SysAllocString( l.wpsz_network_name );
> + msg_Dbg( p_access, "CreateTuneRequest: Create Tuning Space: %S",
> + l.bstr_name );
> + }
> + hr = ::CoCreateInstance( cls_tuning_space, 0, CLSCTX_INPROC,
> + IID_ITuningSpace, (void**)&p_tuning_space );
> + if( FAILED( hr ) )
> + msg_Warn( p_access, "CreateTuneRequest: "\
> + "Cannot CoCreate new TuningSpace: hr=0x%8lx", hr );
> + if( SUCCEEDED( hr ) )
> + hr = p_tuning_space->put__NetworkType( guid_network_type );
> + if( FAILED( hr ) )
> + msg_Warn( p_access, "CreateTuneRequest: "\
> + "Cannot Put Network Type: hr=0x%8lx", hr );
> + if( SUCCEEDED( hr ) )
> + hr = p_tuning_space->put_UniqueName( l.bstr_name );
> + if( FAILED( hr ) )
> + msg_Warn( p_access, "CreateTuneRequest: "\
> + "Cannot Put Unique Name: hr=0x%8lx", hr );
> + if( SUCCEEDED( hr ) )
> + hr = p_tuning_space->put_FriendlyName( l.bstr_name );
> + if( FAILED( hr ) )
> + msg_Warn( p_access, "CreateTuneRequest: "\
> + "Cannot Put Friendly Name: hr=0x%8lx", hr );
> + if( SUCCEEDED( hr ) )
> + hr = l.p_tuning_space_container->Add( p_tuning_space, &var_id );
> + if( FAILED( hr ) )
> + {
> + msg_Warn( p_access, "CreateTuneRequest: "\
> + "Cannot Create new TuningSpace: hr=0x%8lx", hr );
> + return hr;
> + }
> + hr = p_tuning_space->CreateTuneRequest( &p_tune_request );
> + if( FAILED( hr ) )
> + msg_Warn( p_access, "CreateTuneRequest: "\
> + "Cannot Create Tune Request: hr=0x%8lx", hr );
> return hr;
> }
>
> @@ -781,7 +978,49 @@ HRESULT BDAGraph::Build()
> {
> HRESULT hr = S_OK;
> long l_capture_used, l_tif_used;
> + VARIANT l_tuning_space_id;
> AM_MEDIA_TYPE grabber_media_type;
> + class localComPtr
> + {
> + public:
> + ITuningSpaceContainer* p_tuning_space_container;
> + localComPtr(): p_tuning_space_container(NULL) {};
> + ~localComPtr()
> + {
> + if( p_tuning_space_container )
> + p_tuning_space_container->Release();
> + }
> + } l;
> +
> + /* Get the SystemTuningSpaces container to save the Tuning space */
> + l_tuning_space_id.vt = VT_I4;
> + l_tuning_space_id.lVal = 0L;
> + hr = ::CoCreateInstance( CLSID_SystemTuningSpaces, 0, CLSCTX_INPROC,
> + IID_ITuningSpaceContainer, (void**)&l.p_tuning_space_container );
> + if( FAILED( hr ) )
> + {
> + msg_Warn( p_access, "Build: "\
> + "Cannot CoCreate SystemTuningSpaces: hr=0x%8lx", hr );
> + return hr;
> + }
> + hr = l.p_tuning_space_container->FindID( p_tuning_space,
> + &l_tuning_space_id.lVal );
> + if( FAILED( hr ) )
> + {
> + msg_Warn( p_access, "Build: "\
> + "Cannot Find Tuning Space ID: hr=0x%8lx", hr );
> + return hr;
> + }
> + msg_Dbg( p_access, "Build: Using Tuning Space ID %d",
> + l_tuning_space_id.lVal );
> + hr = l.p_tuning_space_container->put_Item( l_tuning_space_id,
> + p_tuning_space );
> + if( FAILED( hr ) )
> + {
> + msg_Warn( p_access, "Build: "\
> + "Cannot save Tuning Space: hr=0x%8lx", hr );
> + return hr;
> + }
>
> /* If we have already have a filter graph, rebuild it*/
> Destroy();
> @@ -994,7 +1233,7 @@ HRESULT BDAGraph::Build()
> * On subsequent calls, this can be used to start from that point to find
> * another match.
> * This is used when the graph does not run because a tuner device is in use so
> -* another one needs to be slected.
> +* another one needs to be selected.
> ******************************************************************************/
> HRESULT BDAGraph::FindFilter( REFCLSID clsid, long* i_moniker_used,
> IBaseFilter* p_upstream, IBaseFilter** p_p_downstream )
> --
> 1.5.4.3
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel
--
Best Regards,
--
Jean-Baptiste Kempf
http://www.jbkempf.com/
More information about the vlc-devel
mailing list