スマホ動画等の回転情報の件。
そういう埋め込み情報ってメタデータというんだね。
gstreamer metadata で検索したら公式のサンプルコードが見付かった。
上部の Language から JavaScript を選択しても C のままなんだけど。
いやそれは別にいい、C のサンプルがあるだけで親切という世界。
for (let s in OBJECT) print(s);
すれば今の gjs はメソッドの存在は解る、以前はできなかったような?
別の端末で Python を立ち上げて dir していた記憶があるけど、まあいいか。
そんなことより困ったぞ。
GST_CLOCK_TIME_NONE は 18446744073709551615 だ。
JavaScript の Number は 16 桁までしか使えない。
Python なら桁数無制限だから気にしなくてもいいんだけど。
コレが使えるかなと思ったけど現行 gjs は未対応。
そもそも bus.timed_pop_filtered の引数が Number 指定だった。
あぁコイツも PyGObject で作り替えするしかないのか。。。。。
って、gst_bus_timed_pop_filtered の第一引数はタイムアウト指定じゃん。
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}`);
って。
回転情報出てこないジャン!
勉強にはなったけど何も進まず正月休みが終わってしまった。