29 case PhysConn_Video_Tuner:
return "Video Tuner";
30 case PhysConn_Video_Composite:
return "Video Composite";
31 case PhysConn_Video_SVideo:
return "S-Video";
32 case PhysConn_Video_RGB:
return "Video RGB";
33 case PhysConn_Video_YRYBY:
return "Video YRYBY";
34 case PhysConn_Video_SerialDigital:
return "Video Serial Digital";
35 case PhysConn_Video_ParallelDigital:
return "Video Parallel Digital";
36 case PhysConn_Video_SCSI:
return "Video SCSI";
37 case PhysConn_Video_AUX:
return "Video AUX";
38 case PhysConn_Video_1394:
return "Video 1394";
39 case PhysConn_Video_USB:
return "Video USB";
40 case PhysConn_Video_VideoDecoder:
return "Video Decoder";
41 case PhysConn_Video_VideoEncoder:
return "Video Encoder";
43 case PhysConn_Audio_Tuner:
return "Audio Tuner";
44 case PhysConn_Audio_Line:
return "Audio Line";
45 case PhysConn_Audio_Mic:
return "Audio Microphone";
46 case PhysConn_Audio_AESDigital:
return "Audio AES/EBU Digital";
47 case PhysConn_Audio_SPDIFDigital:
return "Audio S/PDIF";
48 case PhysConn_Audio_SCSI:
return "Audio SCSI";
49 case PhysConn_Audio_AUX:
return "Audio AUX";
50 case PhysConn_Audio_1394:
return "Audio 1394";
51 case PhysConn_Audio_USB:
return "Audio USB";
52 case PhysConn_Audio_AudioDecoder:
return "Audio Decoder";
53 default:
return "Unknown Crossbar Pin Type—Please report!";
61 long count_output_pins, count_input_pins;
69 av_log(avctx, log_level,
"Crossbar Switching Information for %s:\n", device_name);
70 hr = IAMCrossbar_get_PinCounts(cross_bar, &count_output_pins, &count_input_pins);
76 for (i = 0; i < count_output_pins; i++)
79 long related_pin, pin_type, route_to_pin;
80 hr = IAMCrossbar_get_CrossbarPinInfo(cross_bar, FALSE, i, &related_pin, &pin_type);
81 if (pin_type == PhysConn_Video_VideoDecoder) {
83 if (video_input_pin != -1) {
84 av_log(avctx, log_level,
"Routing video input from pin %d\n", video_input_pin);
85 hr = IAMCrossbar_Route(cross_bar, i, video_input_pin);
87 av_log(avctx,
AV_LOG_ERROR,
"Unable to route video input from pin %d\n", video_input_pin);
91 }
else if (pin_type == PhysConn_Audio_AudioDecoder) {
92 if (audio_input_pin != -1) {
93 av_log(avctx, log_level,
"Routing audio input from pin %d\n", audio_input_pin);
94 hr = IAMCrossbar_Route(cross_bar, i, audio_input_pin);
96 av_log(avctx,
AV_LOG_ERROR,
"Unable to route audio input from pin %d\n", audio_input_pin);
104 hr = IAMCrossbar_get_IsRoutedTo(cross_bar, i, &route_to_pin);
109 av_log(avctx, log_level,
" Crossbar Output pin %d: \"%s\" related output pin: %ld ", i,
GetPhysicalPinName(pin_type), related_pin);
110 av_log(avctx, log_level,
"current input pin: %ld ", route_to_pin);
111 av_log(avctx, log_level,
"compatible input pins: ");
113 for (j = 0; j < count_input_pins; j++)
115 hr = IAMCrossbar_CanRoute(cross_bar, i, j);
117 av_log(avctx, log_level ,
"%d ", j);
119 av_log(avctx, log_level,
"\n");
122 for (i = 0; i < count_input_pins; i++)
124 long related_pin, pin_type;
125 hr = IAMCrossbar_get_CrossbarPinInfo(cross_bar, TRUE, i, &related_pin, &pin_type);
127 av_log(avctx,
AV_LOG_ERROR,
"unable to get crossbar info audio input from pin %d\n", i);
131 av_log(avctx, log_level,
"related input pin: %ld\n", related_pin);
144 IAMCrossbar *cross_bar =
NULL;
145 IBaseFilter *cross_bar_base_filter =
NULL;
146 IAMTVTuner *tv_tuner_filter =
NULL;
147 IBaseFilter *tv_tuner_base_filter =
NULL;
148 IAMAudioInputMixer *tv_audio_filter =
NULL;
149 IBaseFilter *tv_audio_base_filter =
NULL;
152 hr = ICaptureGraphBuilder2_FindInterface(graph_builder2, &LOOK_UPSTREAM_ONLY, (
const GUID *)
NULL,
153 device_filter, &IID_IAMCrossbar, (
void**) &cross_bar);
163 hr = IAMCrossbar_QueryInterface(cross_bar, &IID_IBaseFilter, (
void **) &cross_bar_base_filter);
170 hr = ICaptureGraphBuilder2_FindInterface(graph_builder2, &LOOK_UPSTREAM_ONLY,
NULL,
171 device_filter, &IID_IAMTVTuner, (
void**) &tv_tuner_filter);
173 hr = IAMCrossbar_QueryInterface(tv_tuner_filter, &IID_IBaseFilter, (
void **) &tv_tuner_base_filter);
182 hr = ICaptureGraphBuilder2_FindInterface(graph_builder2, &LOOK_UPSTREAM_ONLY,
NULL,
183 device_filter, &IID_IAMTVAudio, (
void**) &tv_audio_filter);
185 hr = IAMCrossbar_QueryInterface(tv_audio_filter, &IID_IBaseFilter, (
void **) &tv_audio_base_filter);
200 IAMCrossbar_Release(cross_bar);
201 if (cross_bar_base_filter)
202 IBaseFilter_Release(cross_bar_base_filter);
204 IAMTVTuner_Release(tv_tuner_filter);
205 if (tv_tuner_base_filter)
206 IBaseFilter_Release(tv_tuner_base_filter);
void ff_dshow_show_filter_properties(IBaseFilter *device_filter, AVFormatContext *avctx)
Pops up a user dialog allowing them to adjust properties for the given filter, if possible...
#define AV_LOG_WARNING
Something somehow does not look correct.
int show_analog_tv_tuner_audio_dialog
int show_audio_crossbar_connection_dialog
IBaseFilter * device_filter[2]
static av_cold int end(AVCodecContext *avctx)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_INFO
Standard information.
int crossbar_audio_input_pin_number
static HRESULT setup_crossbar_options(IAMCrossbar *cross_bar, enum dshowDeviceType devtype, AVFormatContext *avctx)
int crossbar_video_input_pin_number
void * priv_data
Format private data.
HRESULT ff_dshow_try_setup_crossbar_options(ICaptureGraphBuilder2 *graph_builder2, IBaseFilter *device_filter, enum dshowDeviceType devtype, AVFormatContext *avctx)
Given a fully constructed graph, check if there is a cross bar filter, and configure its pins if so...
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
int show_video_crossbar_connection_dialog
static const char * GetPhysicalPinName(long pin_type)
int show_analog_tv_tuner_dialog