<html><head></head><body>Hello all.<div><br></div><div>I'm an Linux driver/software developer in a company producing custom video capture boards for PCIe.</div><div>Our drivers using v4l2 and alsa API, and some of our customers uses gstreamer to process video.</div><div>One of our customer requires to capture 16 audio channels (8 stereo pairs) from SDI and faced issue with simple pipeline:</div><blockquote><div>$ gst-launch-1.0 alsa-src device=hw:1,0 ! audio/x-raw,channels=16 ! fakesink</div><div>Setting pipeline to PAUSED ...<br>Pipeline is live and does not need PREROLL ...<br>Setting pipeline to PLAYING ...<br>New clock: GstAudioSrcClock<br>ERROR: from element /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0: Internal data stream error.<br>Additional debug info:<br>gstbasesrc.c(3055): gst_base_src_loop (): /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0:<br>streaming stopped, reason not-negotiated (-4)<br>Execution ended after 0:00:00.000081501<br>Setting pipeline to PAUSED ...<br>Setting pipeline to READY ...<br>Setting pipeline to NULL ...<br>Freeing pipeline ...</div><div>$</div></blockquote><div>same pipeline works with channels=4 and channels=8.</div><div>arecord captures 16 channels sucessfully.</div><div><br></div><div>After some investigation I've found this interesting code in gst-plugins-base/ext/alsa/gstalsa.c:</div><div><br><blockquote>/* we don't have channel mappings for more than this many channels */<br>#define GST_ALSA_MAX_CHANNELS 8<br><br>....<br><br>static GstCaps *<br>gst_alsa_detect_channels (GstObject * obj, snd_pcm_hw_params_t * hw_params,<br>    GstCaps * in_caps)<br>{<br><br>....<br><br>  if ((err = snd_pcm_hw_params_get_channels_min (hw_params, &min)) < 0)<br>    goto min_chan_error;<br><br>  if ((err = snd_pcm_hw_params_get_channels_max (hw_params, &max)) < 0)<br>    goto max_chan_error;<br>    <br>  min_chans = min;<br>  max_chans = max;<br><br>  if (min_chans < 0) {<br>    min_chans = 1;<br>    max_chans = GST_ALSA_MAX_CHANNELS;<br>  } else if (max_chans < 0) {<br>    max_chans = GST_ALSA_MAX_CHANNELS;<br>  }<br><br>....<br><br>  /* pro cards seem to return large numbers for min_channels */<br>  if (min_chans > GST_ALSA_MAX_CHANNELS) {<br>    GST_DEBUG_OBJECT (obj, "min_chans = %u, looks like a pro card", min_chans);<br>    if (max_chans < min_chans) {<br>      max_chans = min_chans;<br>    } else {<br>      /* only support [max_chans; max_chans] for these cards for now<br>       * to avoid inflating the source caps with loads of structures ... */<br>      min_chans = max_chans;<br>    }<br>  } else {<br>    min_chans = MAX (min_chans, 1);<br>    max_chans = MIN (GST_ALSA_MAX_CHANNELS, max_chans);<br>  }<br><br></blockquote>Our board returns min_chans=1, max_chans=16, so gstreamer limits it to 1-8</div><div><br></div><div>And now, some questions arising:</div><div><span style="white-space:pre;"></span><span style="white-space:pre;"><br></span></div><div><span style="white-space:pre;"></span>1) Why there is limit for 8 channels? <br></div><div><br></div><div>Yes, common 7.1 audio is maximum you can face in real video files. <br></div><div>But in case of SDI 16 channels is usually used as 8 stereo pairs for transferring 8 different languages at same time. <br></div><div>This 8 streams MUST be synchronous, so they are interleaved in one 16-channel stream.</div><div>I'm not a GStreamer expert, but it seems that it can support up to 64 channels at least (according to channel mask width), that "pro card" condition proves that.</div><div>Is that "caps inflating" is a real problem? <br></div><div><br></div><div>2) Ok, I can<span class="tlid-translation translation"><span title="" class=""> accept 8-channel limit, and that "</span></span><span class="tlid-translation translation"><span title="" class="">pro card" </span></span><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class="">term, but why </span></span></span></span><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class="">condition (</span></span></span></span></span></span><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class="">"min_chans > GST_ALSA_MAX_CHANNELS") is so strange?</span></span></span></span></span></span></div><div><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><br></span></span></span></span></span></span></div><div><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class="">For example, 1-32 card will be limited to 1-8 (gstreamer will generate 8 caps for 1-8 channels, as I understood), but,  if same card will report 16</span></span></span></span></span></span><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class="">-32 channels it will be limited to 32-32 (single cap).</span></span></span></span></span></span></span></span></span></span></span></span></div><div><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class="">Makes no sense for me. Condition "(</span></span></span></span></span></span></span></span></span></span></span></span><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class="">min_chans > GST_ALSA_MAX_CHANNELS) || </span></span></span></span></span></span></span></span></span></span></span></span><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class="">(</span></span></span></span></span></span></span></span></span></span></span></span><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class=""><span class="tlid-translation translation"><span title="" class="">max_chans > GST_ALSA_MAX_CHANNELS)" looks more correct, IMO.<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div><br></div><div><span class="tlid-translation translation"><span title="" class="">It would be nice if someone explained that to me</span></span>...</div><div><br><span class="pl-c1"></span></div></body></html>