2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

BonDriver共有ツール総合 その2

1 :名無しさん@編集中:2015/04/07(火) 20:25:07.03 ID:n6IDd8Gi.net
BonDriver共有ツール総合

※前スレ
http://peace.2ch.net/test/read.cgi/avi/1366339738/

601 : ◆SALrG1ld3mTc :2016/05/11(水) 07:09:31.42 ID:tX1ss39h.net
>>599
なるほど、ECMのPIDがXXXの状態から、PMT更新でECMが無くなり(あるいはECMのPIDが他の値に変わり)、更なるPMT更新で
ECMのPIDがXXXに戻る場合、XXXにset_decryptor()したけどまだ参照カウントを増やす前のタイミングで、前々回のPMTの
PIDリストからXXXをunref_stream()してしまっているせいで、XXXがECMだとみなされなくなってしまうわけですね
これは再現条件の特定大変だったんじゃないでしょうか…ご苦労様です

個人的な好みで言えば、前々回のPMTのPIDリストをunref_stream()するコードブロックを逆にadd_ecm_stream()の
後に持って行くか、あるいはprv->map[ecm_pid].refの増加をadd_ecm_stream()の中からset_decryptor()の戻り値が
NULLで無かったと判定できたタイミングに移動するかの方が好きですヽ(;´ー`)ノ

602 :名無しさん@編集中:2016/05/11(水) 09:39:07.55 ID:nvP85pXZ.net
>>601
詳細な解説いたみいります。

すこし気になったのですが、
>前々回のPMTのPIDリストをunref_stream()するコードブロックを逆にadd_ecm_stream()の
>後に持って行く
この方法ですと、ver. 0.1.5で入った修正が無効化されそうですがいかがでしょうか?
http://www.marumo.ne.jp/db2008_2.htm#12

603 : ◆SALrG1ld3mTc :2016/05/11(水) 19:17:30.07 ID:tX1ss39h.net
>>602
もちろんunref_stream()するのは前のPMTのPIDリストではなく2つ前のPMTのPIDリストである必要があるので、
単純にコードの順番を入れ替えるだけではなく、pgrm->old_strmは一旦保存する形になりますね
具体的には、
---
TS_STREAM_LIST tmp_old_strm;
...
head += len;

/* save old streams */
memcpy(&tmp_old_strm, &(pgrm->old_strm), sizeof(TS_STREAM_LIST));

/* save current streams */
memcpy(&(pgrm->old_strm), &(pgrm->streams), sizeof(TS_STREAM_LIST));
memset(&(pgrm->streams), 0, sizeof(TS_STREAM_LIST));

/* add current stream entries */
if( (ecm_pid != 0) && (ecm_pid != 0x1fff) ){
if(!add_ecm_stream(prv, &(pgrm->streams), ecm_pid)){
r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY;
goto LAST;
}
}

/* unref old stream entries */
while( (strm = get_stream_list_head(&tmp_old_strm)) != NULL ){
unref_stream(prv, strm->pid);
memset(strm, 0, sizeof(TS_STREAM_ELEM));
put_stream_list_tail(&(prv->strm_pool), strm);
}
---
みたいな感じです
proc_pmt()がエラーなく終わった後の状態は、>>599さんのパッチを当てた状態と大体同じで、
違いは問題のパターンのPMT更新があっても、新しいdecryptorを作成して各PIDから参照されてる
旧decryptorと入れ替えると言う処理が発生しなくなる事くらいかなーと思ってます
当方が変な勘違いをしていなければですがヽ(;´ー`)ノ

604 :名無しさん@編集中:2016/05/11(水) 19:57:15.09 ID:nvP85pXZ.net
>>603
なるほど、old_strmは一旦保存すれば問題無いですね。納得しました。
ありがとうございます。


あと釈迦に説法&重箱の隅ですが…

/* save old streams */
tmp_old_strm = pgrm->old_strm; /* memcpy(&tmp_old_strm, &(pgrm->old_strm), sizeof(TS_STREAM_LIST)); */

/* save current streams */
pgrm->old_strm = pgrm->streams; /* memcpy(&(pgrm->old_strm), &(pgrm->streams), sizeof(TS_STREAM_LIST)); */
memset(&(pgrm->streams), 0, sizeof(TS_STREAM_LIST));

605 : ◆SALrG1ld3mTc :2016/05/12(木) 07:40:43.49 ID:jM0CbusM.net
>>604
> tmp_old_strm = pgrm->old_strm; /* memcpy(&tmp_old_strm, &(pgrm->old_strm), sizeof(TS_STREAM_LIST)); */
> pgrm->old_strm = pgrm->streams; /* memcpy(&(pgrm->old_strm), &(pgrm->streams), sizeof(TS_STREAM_LIST)); */

あ、確かに普通の代入で問題無いですねヽ(;´ー`)ノ
まるもさんの元ソースがmemcpy()使ってたので、追加部分でも特に何も考えずにmemcpy()使いましたが…

しかしまあこの辺は、今時のコンパイラで最適化かけたら結局同じバイナリになる可能性も高いと思うので、
自分のやってる事がわかっている限りは、プログラマの好みで良いと思ってますw

606 :名無しさん@編集中:2016/05/12(木) 13:22:06.17 ID:lHh3x1oS.net
こちらで大丈夫でしょうか。
Windows
https://github.com/epgdatacapbon/libaribb25/commit/a0bb16af95ea26b140a64d4408002c667084db66
Linux
https://github.com/epgdatacapbon/libaribb25_Linux/commit/294af6774bf21292a11b41ca705ab51b7f25ed08

607 :名無しさん@編集中:2016/05/12(木) 14:39:54.03 ID:dP82cHm1.net
こちらにも適用しておきました。
https://github.com/stz2012/libarib25/commit/09770e334837f6c67268c41c1c15784373d35e5b

608 : ◆SALrG1ld3mTc :2016/05/12(木) 21:09:39.86 ID:jM0CbusM.net
>>606
大丈夫だと思います

なお、問題が起きるのはスクランブル番組の間にノンスクランブル番組が1番組だけ挟まった場合のみだと思うので、
ちゃんと直ってるかテストする時はそのような番組配置の時間帯を探してスクランブル解除せずに生TSを保存し、
そのTSを修正前後のb25に通してみれば確認できると思いますよー

609 :604:2016/05/12(木) 21:15:28.87 ID:1LlVhf6U.net
>>608
了解です。
確認ありがとうございました。

610 :名無しさん@編集中:2016/05/12(木) 21:30:54.95 ID:XEXWdBC4.net
WOWOW、★の番組宣伝中はノンスクランブルだから、それを跨ぐように生TS保存すればおっけー

総レス数 837
356 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★