kodiのnexusを使いたくて待ちわびているのだが、
なかなか完成度が上らない。

EPG表示の文字が突然消える、
tv視聴、録画再生時間が長くなると挙動が怪しくなる、
メモリーリークしているようなしないような。
まぁ、ラズパイ使用のkodiではいつもの事なのだが...。

ただ、見る度にお世話になっているforkが更新されているので、
何とかなるのも近いかも。

そんなことで、移行準備は欠かしていない。
常用しているアドオンに関しては、ほとんど移行できた。
ただし、ゲームに関してはまだ使えそうにない。
raspberrypi osのリポジトリにあるドライバーやサポートアドオンが、
まだnexusに未対応である。
そもそも、未だデフォルトはmatrixだから仕方ない。
しかし、それでもと言うならソースからビルドすれば良いのだが、
ラズパイnexus自体が発展途上なので焦って使う必要はない。

さて、あとは何が残るのか?
tvの字幕表示くらいだろうか。

kodiの字幕表示に関しては過去のブログに何度も記している。
しかし、nexusとなりwebvtt形式対応等の追加もあった。
そうなれば、新たに良い方法があるのかもしれない。
ただ、それ程頻繁に使用する機能でもない。
前回の手法で不満もないので、とりあえずは同じやり方で試みる。

ffmpegではarib字幕を処理するのにlibaribb24が使用可能である。
ただ、この組み合わせでkodiは機能しない。
その代りに未対応ではあるがlibaribcaptionを使用することで、
手を加えることなくkodiで字幕表示が可能となる。
幸いにも、このライブラリ対応させるためのpatchは存在している。

まず、libaribcaptionをインストールしなければ始まらない。

libaribcaption

次にffmpegに対して、このライブラリを対応させるためpatchを使用する。

FFmpage Patchwork

しかしながら、対象としているバージョンがkodiのffmpegと異なっている。
そのため、その内容を手動で適用する。

このpatch、先日に更新されたばかりである。
以前のものに比べて、patch適用する箇所が減っている。
進化していると思う反面、これで大丈夫なのかと少々心配になる。

さて、手作業によりpatchを適用する。
ffmpegのバージョン違いにより少々頭を悩ます箇所もあるのだが、
前後関係を確認しながら修正すれば内容を理解せずとも可能である。

あと、もう一点だけ手直しが必要である。
このライブラリを使ってデコードされるデータはass形式がデフォルトとなっている。
しかし、kodiで手間無く使うにはbitmap形式とする必要がある。
そのため、libaribcaption.c内で定義されている当該箇所を置き換える。
 

@@ -1110,8 +1108,7 @@
 static const AVOption options[] = {
     { "sub_type", "subtitle rendering type",
       OFFSET(subtitle_type), AV_OPT_TYPE_INT,
-      { .i64 = SUBTITLE_ASS }, SUBTITLE_NONE, SUBTITLE_ASS, SD, "type" },
+      { .i64 = SUBTITLE_BITMAP }, SUBTITLE_NONE, SUBTITLE_ASS, SD, "type" },
     { "none",   "do nothing", 0, AV_OPT_TYPE_CONST,
       { .i64 = SUBTITLE_NONE }, .flags = SD, .unit = "type" },
     { "bitmap", "bitmap rendering", 0, AV_OPT_TYPE_CONST,

以上で、arib字幕表示が可能なkodiの出来上がりである。

ただ、個人的にはlibaribcaption.cに少々に変更を加えたい。
以前のバージョンでは、字幕表示させるとメモリーリークしていた。
その対応策として、一行追加して使用メモリをクリアする。

また、表示時間指定のない字幕が残ってしまう。
今回は、これら字幕に対して表示時間を設定した。
家にあるtvで確認すると、結構な速さで消える。
個人的には、少し長く4秒とすることにした。

@@ -915,12 +915,14 @@
             sub->pts = av_rescale_q(ctx->avpkt->pts,
                                     ctx->time_base, AV_TIME_BASE_Q);
         if (ctx->caption.wait_duration == ARIBCC_DURATION_INDEFINITE)
-            sub->end_display_time = UINT32_MAX;
+            sub->end_display_time = 4000;
         else
             sub->end_display_time = (uint32_t)ctx->caption.wait_duration;
     }
 
     aribcc_caption_cleanup(&ctx->caption);
+    aribcc_render_result_cleanup(&ctx->render_result);
     return avpkt->size;
 }

使ってみて問題なし。
とにかく、これでnexusでも問題なく字幕表示されることが確認できた。

ただ、このラズパイnexus、
いつになれば安定するのやら...。