NMOSの動きを追っかけてみた② 制御編(IS-05)

以前のNMOS関連ブログ記事

「NMOSの動きを追っかけてみた」第二弾として今回は制御(IS-05)について前回同様パケットの流れを追っかけてみました。

制御の流れ

制御を行うのがNMOS controllerです。
NMOSとひとえにいっても検知・登録のregistryとこの制御のcontrollerとにわかれます。
(NMOS explorerはcontrollerの役割も担います。)

  1. NMOS cotrollerはsenderからSDP(Session Description Protocol)ファイルを取得する。
  2. 取得したSDPファイルの内容をNMOS controllerは変換してreceiverにjsonファイルとしてHTTP patchする。

SDPファイルの取得

NMOS registryにあったsendersの情報の中の"manifest_href"に記載されいているURLからNMOS controllerはHTTP GETでSDPファイルを取得します。

http://[senderのIP]:4003/sdp/[senderID]

取得したSDPファイルはこんな感じになっています。

v=0
o=- 1757655841660473605 0 IN IP4 [sender機器のred面のIP]
s=IPT 10G2 SDI Converter
t=0 0
a=group:DUP 1 2
m=video 10000 RTP/AVP 96
c=IN IP4 [senderのred面のマルチキャストアドレス]
a=source-filter: incl IN IP4 [senderのred面のマルチキャストアドレス] [sender機器のred面のIP]
a=rtpmap:96 raw/90000
a=fmtp:96 sampling=YCbCr-4:2:2; width=1920; height=1080; exactframerate=30000/1001; depth=10; TCS=SDR; colorimetry=BT709; PM=2110GPM; SSN=ST2110-20:2017; TP=2110TPN; interlace;
a=ts-refclk:ptp=IEEE1588-2008:00-90-56-ff-fe-08-81-29:1
a=mediaclk:direct=0
a=mid:1
m=video 10000 RTP/AVP 96
c=IN IP4 [senderのblue面のマルチキャストアドレス]
a=source-filter: incl IN IP4 [senderのblue面のマルチキャストアドレス] [sender機器のblue面のIP]
a=rtpmap:96 raw/90000
a=fmtp:96 sampling=YCbCr-4:2:2; width=1920; height=1080; exactframerate=30000/1001; depth=10; TCS=SDR; colorimetry=BT709; PM=2110GPM; SSN=ST2110-20:2017; TP=2110TPN; interlace;
a=ts-refclk:ptp=IEEE1588-2008:00-90-56-ff-fe-08-81-29:1
a=mediaclk:direct=0
a=mid:2

SMPTE 2022-7に対応していれば、このようにred面・blue面のsenderからでているflowの情報がSDPファイルには記載されています。

senderのactive状態の確認

NMOS explorerはsenderからSDPファイルを取得したあとactiveな情報を確認しています。

http://[sendeのIP]:4003/x-nmos/connection/v1.1/single/senders/[senderID]/active

これはNMOS explorerの仕様なのかどうか?この動きはなくてもいいように思いますが、よくわかりません。
ちなみに取得したjsonファイルは

{
  "activation": {
    "activation_time": null,
    "mode": null,
    "requested_time": null
  },
  "master_enable": true,
  "receiver_id": null,
  "transport_params": [
    {
      "destination_ip": "[senderのred面のマルチキャストアドレス]",
      "destination_port": 10000,
      "rtp_enabled": true,
      "source_ip": "[sender機器のred面のIP]",
      "source_port": 10000
    },
    {
      "destination_ip": "[senderのblue面のマルチキャストアドレス]",
      "destination_port": 10000,
      "rtp_enabled": true,
      "source_ip": "[sender機器のblue面のIP]",
      "source_port": 10000
    }
  ]
}

receiverの状態確認

次にこれもnmos explorerの仕様かもしれませんが、制御したいreceiver機器の状態の確認を行っています。

active状態の確認

http://[receiverのIP]/x-nmos/connection/v1.1/single/receivers/[receiverID]/active

こちらで現在のrecieverの状態を確認しています。

staged状態の確認

http://[receiverのIP]/x-nmos/connection/v1.1/single/receivers/[receiverID]/staged

こちらでstaged状態の確認もしています。

activeもstagedも返答されるjsonは一部をのぞいてほぼ同じでした。

{
    "master_enable": true,
    "sender_id": "f5524e1c-32af-3ad1-a313-b850412e4713",
    "transport_params": [
        {
            "source_ip": "[受信しているIPストリームのソースIP]",
            "interface_ip": "[receiverのred面のIP]",
            "multicast_ip": "[受信しているIPストリームのマルチキャストアドレス]",
            "destination_port": 10000,
            "rtp_enabled": true
        },
        {
            "source_ip": "[受信しているIPストリームのソースIP]",
            "interface_ip": "[receiverのblue面のIP]",
            "multicast_ip": "[受信しているIPストリームのマルチキャストアドレス]",
            "destination_port": 10000,
            "rtp_enabled": true
        }
    ],
    "activation": {
        "mode": "activate_immediate",
        "requested_time": null,
        "activation_time": "1757663728:972584247"
    },
    "transport_file": {
        "data": "v=0\no=- 1757655841660473605 0 IN IP4 [sourceIP]\ns=IPT 10G2 SDI Converter\nt=0 0\na=group:DUP 1 2\nm=video 10000 RTP/AVP 96\nc=IN IP4 [マルチキャストアドレス]\na=source-filter: incl IN IP4 [マルチキャストアドレス] [source IP]\na=rtpmap:96 raw/90000\na=fmtp:96 sampling=YCbCr-4:2:2; width=1920; height=1080; exactframerate=30000/1001; depth=10; TCS=SDR; colorimetry=BT709; PM=2110GPM; SSN=ST2110-20:2017; TP=2110TPN; interlace; \na=ts-refclk:ptp=IEEE1588-2008:00-90-56-ff-fe-08-81-29:1\na=mediaclk:direct=0\na=mid:1\nm=video 10000 RTP/AVP 96\nc=IN IP4 [マルチキャストアドレス]\na=source-filter: incl IN IP4 [マルチキャストアドレス] [source IP]\na=rtpmap:96 raw/90000\na=fmtp:96 sampling=YCbCr-4:2:2; width=1920; height=1080; exactframerate=30000/1001; depth=10; TCS=SDR; colorimetry=BT709; PM=2110GPM; SSN=ST2110-20:2017; TP=2110TPN; interlace; \na=ts-refclk:ptp=IEEE1588-2008:00-90-56-ff-fe-08-81-29:1\na=mediaclk:direct=0\na=mid:2\n",
        "type": "application/sdp"
    }
}

ちなみにこちらはactiveで取得した情報で、stagedの場合はactivationのmodeとactivation timeがともに"null"でした。

receiverへのpatch

上記の状態確認の後、NMOS controllerはreceiverに対して次のURLに対してHTTP PATCHを行いました。

    http://[receiverのIP]/x-nmos/connection/v1.1/single/receivers/[receiverID]/staged

以下のjsonファイルをPATCH

{
  "activation": {
    "mode": "activate_immediate"
  },
  "master_enable": true,
  "sender_id": "f5524e1c-32af-3ad1-a313-b850412e4713",
  "transport_file": {
    "data": "v=0\no=- 1757655841660473605 0 IN IP4 [senderのIP]\ns=IPT 10G2 SDI Converter\nt=0 0\na=group:DUP 1 2\nm=video 10000 RTP/AVP 96\nc=IN IP4 [マルチキャストアドレス]\na=source-filter: incl IN IP4 [マルチキャストアドレス][senderのIP]\na=rtpmap:96 raw/90000\na=fmtp:96 sampling=YCbCr-4:2:2; width=1920; height=1080; exactframerate=30000/1001; depth=10; TCS=SDR; colorimetry=BT709; PM=2110GPM; SSN=ST2110-20:2017; TP=2110TPN; interlace; \na=ts-refclk:ptp=IEEE1588-2008:00-90-56-ff-fe-08-81-29:1\na=mediaclk:direct=0\na=mid:1\nm=video 10000 RTP/AVP 96\nc=IN IP4 [マルチキャストアドレス]\na=source-filter: incl IN IP4 [マルチキャストアドレス][senderのIP]\na=rtpmap:96 raw/90000\na=fmtp:96 sampling=YCbCr-4:2:2; width=1920; height=1080; exactframerate=30000/1001; depth=10; TCS=SDR; colorimetry=BT709; PM=2110GPM; SSN=ST2110-20:2017; TP=2110TPN; interlace; \na=ts-refclk:ptp=IEEE1588-2008:00-90-56-ff-fe-08-81-29:1\na=mediaclk:direct=0\na=mid:2\n",
    "type": "application/sdp"
  },
  "transport_params": [
    {
      "destination_port": 10000,
      "multicast_ip": "[マルチキャストアドレス]",
      "rtp_enabled": true,
      "source_ip": "[senderのIP]"
    },
    {
      "destination_port": 10000,
      "multicast_ip": "[マルチキャストアドレス]",
      "rtp_enabled": true,
      "source_ip": "[senderのIP]"
    }
  ]
}

transport_fileのdataがまさにSDPファイルの情報となっているのがわかります。私はこの検証を行うまでSDPファイルをそのままreceiverに渡しているのかと思っていましたが、ほかにも情報を付加して渡しているんですね。

これでreceiverはsenderのもつ情報を受け取ることができて、フローの切り替えができました。

まとめ

いかがでしたでしょうか?私はこの2回のNMOS検証を通じて、いままでぼんやりとしか理解できていなかったNMOSの動きがだいぶクリアになったような気がします。
この動きが今回使用したNMOS explorer特有のものなのか、ほかのNMOS制御のブロードキャストコントローラーなどでも共通した動きなのか?そういったことも今後検証できればさらに理解が深まるかと思いますので、引き続き調査していこうと思います。
この記事を最後までお読みいただきありがとうございます。少しでもみなさまの知識の役にたてれば幸いです。

Previous Post