スマホ動画等の回転情報の件。
そういう埋め込み情報ってメタデータというんだね。
gstreamer metadata で検索したら公式のサンプルコードが見付かった。
Metadata
上部の Language から JavaScript を選択しても C のままなんだけど。
いやそれは別にいい、C のサンプルがあるだけで親切という世界。
for (let s in OBJECT) print(s);
すれば今の gjs はメソッドの存在は解る、以前はできなかったような?
別の端末で Python を立ち上げて dir していた記憶があるけど、まあいいか。
そんなことより困ったぞ。
GST_CLOCK_TIME_NONE は 18446744073709551615 だ。
JavaScript の Number は 16 桁までしか使えない。
Python なら桁数無制限だから気にしなくてもいいんだけど。
BigInt – JavaScript | MDN
コレが使えるかなと思ったけど現行 gjs は未対応。
そもそも bus.timed_pop_filtered の引数が Number 指定だった。
あぁコイツも PyGObject で作り替えするしかないのか。。。。。
って、gst_bus_timed_pop_filtered の第一引数はタイムアウト指定じゃん。
GstBus
GST_CLOCK_TIME_NONE 固定では無いみたい、一千万ナノ秒にして問題無しだった。
これで Gjs のまま書き換え作業に移れるぞ。
そんなことより、困ったのが GstElement の取得。
ハンドラの中で get_pipeline にて得た変数は当然ガベージコレクションされる。
すると GstElement の参照元まで破棄される、と気がつくのに半日かかった。
SpiderMonkey ってガベージコレクションのタイミングわかり辛ぇ!
コンストラクタで this に付けるという回避策を気がつくのに二日も使った筆者は…
それとタグって結構重複している、値も試したかぎりでは全部同じだった。
Map を使って重複タグは一つにまとめるようにしてみた。
var Y901xWindow = GObject.registerClass({
GTypeName: 'Y901xWindow'
}, class Y901xWindow extends Gtk.ApplicationWindow {
_init(app) {
super._init({application: app});
// var
this.player = new ClutterGst.Playback();
this.pipeline = this.player.get_pipeline();
// etc...
this.player.connect('ready', (playbin)=> {
this.player.set_playing(false);
// Get Origin size
let vsink = playbin.get_video_sink();
// Only ClutterGst
let frame = vsink.get_frame();
let d = frame.resolution.par_d;
let n = frame.resolution.par_n;
this.src_width = frame.resolution.width * n / d;
this.src_height = frame.resolution.height;
/**
* get Tag
*/
//let bus = vsink.get_bus(); // Not this.
//let bus = playbin.get_pipeline().get_bus(); // GC...
let bus = this.pipeline.get_bus();
let meta = new Map();
let t = GLib.path_get_basename(playbin.get_uri());
meta.set('Title', decodeURI(t));
for (;;) {
let msg = bus.timed_pop_filtered(10000000, //Gst.CLOCK_TIME_NONE
Gst.MessageType.ASYNC_DONE | Gst.MessageType.TAG | Gst.MessageType.ERROR);
if (msg == null) {
break;
} else if (msg.type != Gst.MessageType.TAG) {
break;
}
let tag_list = msg.parse_tag();
tag_list.foreach((ls, tag)=> {
let num = ls.get_tag_size(tag);
for (let i=0; i<num; ++i) {
let val = ls.get_value_index(tag, i);
if (tag == 'datetime') {
let t = val.to_iso8601_string()
meta.set(tag, t);
} else {
meta.set(tag, val);
}
}
});
}
for (let [key, val] of meta) print(`${key}: ${val}`);
って。
回転情報出てこないジャン!
勉強にはなったけど何も進まず正月休みが終わってしまった。