2

gstreamerソース要素を書いています。そのために、必要なものに似た v4l2src などのソースを調べました。通過した後、set_capsこの関数がいつ呼び出されるのか、その関数について疑問に思いますか? set_caps上流の要素が を実行するたびに呼び出されることは知ってgst_pad_set_capsいますが、sinkpad.

v4l2src では、幅、高さ、フレームレートなどのストリーム パラメータがこのset_caps関数から取得されるため、これに興味があります。だから私はこれらの値がどこに設定されているのか知りたいですか?

できるだけ早く対応してください。

4

1 に答える 1

4

まず、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を参照してください。

于 2013-09-24T18:12:35.623 に答える