ストリームタイプ拡張アトムのついた配信を正常にリレーできない
IM50版以降がリレーしている配信を、IM版などのPeerCastで視聴することができないことがあります。 リレー接続時の最初のパケットの構造がおかしく、ヘッダーパケットや、トラック情報を受け取ることができません。
リレー接続直後に送信される PCP_CHAN パケットは、チャンネル情報やヘッダーパケットを含んでいますが、このパケットの構造が(FLV視聴・リレーパッチを取り込んだ)IM50版以降変わっています。
従来、PCP_CHAN は4つの子アトムを持っていて、PCP_CHAN_INFO には7つか、PPFLAGS がある場合には 8 つの子アトムが入っていました。
PCP_CHAN { // count=4 PCP_CHAN_ID PCP_CHAN_INFO { ... } // count=7~8 PCP_CHAN_TRACK { ... } PCP_CHAN_PKT { ... } // ヘッダーパケット }
IM50 で追加された PCP_CHAN_INFO_STREAMTYPE と PCP_CHAN_INFO_STREAMEXT は、PCP_CHAN_INFO に入って、総計は最大で 10 になるはずなのですが、8 までしか上がらないために、PCP_CHAN_INFO の外に押し出されてしまいます。典型的には以下のようになります。
PCP_CHAN { // count=4 PCP_CHAN_ID PCP_CHAN_INFO { // count=7 PCP_CHAN_INFO_NAME PCP_CHAN_INFO_BITRATE PCP_CHAN_INFO_GENRE PCP_CHAN_INFO_URL PCP_CHAN_INFO_DESC PCP_CHAN_INFO_COMMENT PCP_CHAN_INFO_TYPE } PCP_CHAN_INFO_STREAMTYPE // CHAN_INFO の外に出てしまう PCP_CHAN_INFO_STREAMEXT } PCP_CHAN_TRACK { ... } // CHAN の外に出てしまう PCP_CHAN_PKT { ... } // ヘッダーパケット
このようなデータを受けとると IM51-2 は以下のようなログを出し、HTML UI のチャンネル情報ページの Head の行には 0 (0 bytes) と表示されます。
Sat Apr 08 01:03:12 2017 [CHAN] Channel is PCP Sat Apr 08 01:03:12 2017 [CHAN] PCP skip: trck Sat Apr 08 01:03:12 2017 [CHAN] PCP skip: pkt
なお、PeerCastStation は PCP_CHAN アトムの階層構造は無視してパースしているようで、IM50 以降の下に付いても視聴できました。
channel.cpp の ChanInfo::writeInfoAtoms() で、送信する PCP_CHAN_INFO_STREAMTYPE と PCP_CHAN_INFO_STREAMEXT がある場合は PCP_CHAN_INFO の子アトムのカウントを増やせば良いかと思います。
IM50版以降がリレーしている配信を、IM版などのPeerCastで視聴することができないことがあります。 リレー接続時の最初のパケットの構造がおかしく、ヘッダーパケットや、トラック情報を受け取ることができません。
リレー接続直後に送信される PCP_CHAN パケットは、チャンネル情報やヘッダーパケットを含んでいますが、このパケットの構造が(FLV視聴・リレーパッチを取り込んだ)IM50版以降変わっています。
従来、PCP_CHAN は4つの子アトムを持っていて、PCP_CHAN_INFO には7つか、PPFLAGS がある場合には 8 つの子アトムが入っていました。
IM50 で追加された PCP_CHAN_INFO_STREAMTYPE と PCP_CHAN_INFO_STREAMEXT は、PCP_CHAN_INFO に入って、総計は最大で 10 になるはずなのですが、8 までしか上がらないために、PCP_CHAN_INFO の外に押し出されてしまいます。典型的には以下のようになります。
このようなデータを受けとると IM51-2 は以下のようなログを出し、HTML UI のチャンネル情報ページの Head の行には 0 (0 bytes) と表示されます。
なお、PeerCastStation は PCP_CHAN アトムの階層構造は無視してパースしているようで、IM50 以降の下に付いても視聴できました。
channel.cpp の ChanInfo::writeInfoAtoms() で、送信する PCP_CHAN_INFO_STREAMTYPE と PCP_CHAN_INFO_STREAMEXT がある場合は PCP_CHAN_INFO の子アトムのカウントを増やせば良いかと思います。