まず、gstreamer 0.10 を使用していると仮定しています。gstreamer 0.10 は開発されていません。1.0 への移行を検討してください。
わかりました、答えに行きましょう: キャップは要素に関連付けられておらず、キャップはパッドに設定されています。したがって、ソース要素やその他の要素に対しては呼び出されません。何が起こるかというと、要素のパッドに設定されます。シンクパッド (または複数) を持つ要素には、上流要素のバッファーのメディア タイプから設定されたこのキャップがあります。バッファーがパッドを通過すると、パッドはバッファー キャップをチェックし、新しいキャップの場合はそれをパッドに設定します。この場合、パッドの set_caps コールバックが呼び出されます。また、要素がバッファーをプッシュする前にパッドで明示的に gst_pad_set_caps を呼び出すこともあり得ますが、どちらの方法でも正しいです。
通常の方法は、要素がそのシンク パッドで (上流で生成されたメディアから) いくつかのキャップを受け取り、その後、下流で何を生成する必要があるかについて何らかの変換/決定を行い、それをそのバッファーに置くか、そのソース パッドに設定することです。それらがバッファをプッシュすると、この上限がそのソース パッドと下流要素のシンク パッドに設定されます。このようにして、各要素の各パッドは「set_caps」が呼び出され、要素は処理しているメディア タイプを認識し、何を作成し、どのように構成するかを決定します。
ソース要素はパイプラインの上部にあり、パイプラインにデータを挿入し、シンク パッドはありません。そのため、get_caps 呼び出しを使用してダウンストリームが処理できるものを確認し、起動時にどのメディアを生成するかを決定できます (一時停止状態の変更の準備ができています)。キャップを決定すると、キャップがバッファー/パッドに設定され、set_caps が呼び出されます (ソース パッドと次の要素のシンク パッドに対して)。
v4l2src とその基本クラス (basesrc) をチェックして、この「キャップ ネゴシエーション」がどのように機能するかを理解してください。IIRCは、いくつかの「開始」関数コールバックから処理する必要があります。BaseSrc がどのように機能するかを理解するにはhttps://developer.gnome.org/gstreamer-libs/0.10/GstBaseSrc.htmlを参照してください。