■まずは、絶賛開発中の公式のデータの話。
nginxのrtmpModuleですが、会社のサービスでつかってみようか?という話になりました。
room接続やstreamNameを固定しないと動作しないみたいなので、作者にできる方法ある?ってきいてみたところ。pull動作には動的操作はいまのところないという回答いただきました。
プログラム見た感じなさそうだったのですが、やっぱりなかったか・・・
ちょっと残念です。
■じゃぁfolkしたやつは・・・ですが
とりあえず、room接続っぽいことやstreamNameをnginxへの接続アドレスから構築してということには成功したものの、文字列のメモリーの扱いがおかしいことがわかっちゃいました。
C言語やってる人にとっては当たり前のレベルの話だとは思うんですが
#include <stdio.h>
void
test1(char *lpstr)
{
char buf[256];
sprintf(buf, "test");
puts(buf);
lpstr = buf;
puts(lpstr);
}
int main(int argc, const char * argv[])
{
char *lpstr = NULL;
test1(lpstr);
puts(lpstr);
return 0;
}
こんなプログラムを書いたといて、出力がどうなるか・・
答えは
test
test
(不明)
となります。test1の内部でbuf[256]に文字列を書き込んで、外部からきたポインターに結びつけているのですが、関数から抜けたところ(mainの関数の中のputs出力)では、lifetimeがきれるので、参照データがどうなるかわからないということになっています。
ちなみに手持ちのUbuntuでやったら、実体がのこったままになるのか、testと出力
MacのXcodeで動作させてみたら(null)となりました。OSやコンパイラ依存でどうなるかわからなくなるというわけです。
さて、nginxの僕がfolkしたプログラムですが、
782行目あたりでtargetという構造体にデータを持たせるところで同じミスをやっています。
手持ちの環境では、たまたまこれでも別のサーバーのストリームデータを引っ張ってくることができましたが、何がおこるかわからないコードになってしまいました。
本来なら、alloc系の関数をつかって変数を定義してやり、解放すべきところで解放処理をいれる必要があるのですが、nginxのngx_str_tとかの構造体がそのあたりのメモリー管理を提供しているのか?rtmpModuleがどこかで解放処理をしているのか?あたりを調べるところで面倒になってしまったので、「俺がやっちゃる」みたいな気合いのある人おられましたら、folkしていじってみるといいかと思います。
たぶん、ngx_rtmp_relay_playの関数ないでtarget指定の部分の設定に従って指定したサーバーからデータをとってくるという動作しているのは、ほぼ間違いないと思います。
0 件のコメント:
コメントを投稿