/*
* (c) 2005, 2008 Nico Pranke <Nico.Pranke@googlemail.com>, Robin Luedtke <RobinLu@gmx.de>
*
* This file is part of avcap.
*
* avcap is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* avcap is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with avcap. If not, see <http://www.gnu.org/licenses/>.
*/
/* avcap is free for non-commercial use.
* To use it in commercial endeavors, please contact Nico Pranke <Nico.Pranke@googlemail.com>.
*/
#ifndef CROSSBAR_H_
#define CROSSBAR_H_
#include <DShow.h>
#include "avcap-export.h"
namespace avcap
{
struct AVCAP_Export STConnector
{
std::string NameOfConnector;
LONG PhysicalType;
bool IsAudioConnector;
bool IsVideoConnector;
bool IsRouted;
IAMCrossbar *Crossbar;
long PinIndexOfCrossbar;
int AudioSet;
/* Video inputs correspond to zero or max. one audio input.
The pins are numbered from 0 to N-1, N <= 32.
Each bit set is the index of a audio pin on the
same crossbar corresponding to the selected video pin.
AudioSet only used for video input pins. */
int PinIndex; // Independent PinIndex
};
struct AVCAP_Export STRouting
{
long OutputPinIndex;
IPin *OutputPin;
long RelatedInPinIndex;
IPin *RelatedInputPin;
IAMCrossbar *Crossbar;
int CrossbarIndex; // Zero based index
bool HasConnector;
};
//! A class for controlling DirectShow video crossbars.
/*! This class creates a single object which encapsulates all connected
* crossbars, enumerates all unique inputs which can be reached from
* a given starting downstream filter.
*
* The class supports an arbitrarily complex graph of crossbars,
* which can be cascaded and disjoint, that is not all inputs need
* to traverse the same set of crossbars.
*
* Given a starting filter (typically the capture filter), the class
* recursively traces upstream searching for all viable inputs.
* An input is considered viable if it is either:
*
* - unconnected
* - connects to a DirectShow filter which does not support IAMCrossbar
* COM-Interface.
* */
class AVCAP_Export CCrossbar
{
public:
CCrossbar(ICaptureGraphBuilder2 *CaptureGraphBuilder);
~CCrossbar(void);
/*! Searches upstrean for all available crossbars in the filter graph,
* starting from a given filter.
* \param StartFilter Filter to start search from.
* \return The number of crossbars found in the filter graph, -1 else. */
int FindAllCrossbarsAndConnectors(IBaseFilter *StartFilter);
std::list<STConnector*>& GetInputConnectorList();
/*! Gets the currently selected video input connector.
* \param Connector Connector data */
bool GetCurrentVideoInput(STConnector *Connector);
/*! Gets the currently selected audio input connector.
* \param Connector Connector data */
bool GetCurrentAudioInput(STConnector *Connector);
/*! Sets the input connector.
* \param PinIndex Pin index */
bool SetInput(int PinIndex);
private:
QzCComPtr<ICaptureGraphBuilder2> m_CaptureBuilder;
std::list<IAMCrossbar*> m_CrossbarList;
std::list<STRouting*> m_RoutingList;
std::list<STConnector*> m_InputConnectorList;
HRESULT GetCrossbarIPinAtIndex(IAMCrossbar *pXbar, LONG PinIndex,
BOOL IsInputPin, IPin ** ppPin);
void StringFromPinType(std::string &PinName, long lType);
void DeleteAllLists();
};
}
#endif // CROSSBAR_H_