スマホやタブレット PC の動画再生は常にフルスクリーン。
ソースの原寸や倍率なんてナンセンス。
で、今や QuickTime, Totem 等のデフォルトプレイヤーはそんな感じに。
だけどまだタブレット PC の普及は進んでいないんですよ。
Y901x beta1 で等倍や二倍を消してしばらく使ってみたけどしっくりこない。
やはり等倍等にする機能は付けることにする。
さて、ClutterGst ではどうやってソースサイズを得るのか。
ClutterGstPlayer: Clutter Gst 3.0.18 Reference Manual
clutter_gst_player_get_video_sink
にて ClutterGstVideoSink 構造体を得ることができる。
Clutter とあるけどチト試すと GstVideoSink と同じように扱えるようだ。
だとすれば C, Python のコードが Web 上に山程ある、もちろん英語で。
ソレらを JavaScript に変換すればよさそう。
つか Y901x 1.1 はズバリだ、早速変換してみよう。
又パラメータや戻り値が違うかもしれないから慎重に。
const Y901Window = new Lang.Class({ Name: 'Y901Window', Extends: Gtk.ApplicationWindow, _init: function(app) { this.parent({application: app}); // var this.src_width = 0; this.src_height = 0; // // etc... // this.aspectratio = new ClutterGst.Aspectratio(); this.player = new ClutterGst.Playback(); // Ready Signal this.player.connect("ready", Lang.bind(this, function(player) { // Get Media About let vsink = player.get_video_sink(); let it = vsink.iterate_pads(); // it @ GstPad Iteraror it.foreach(Lang.bind(this, function(pad) { let caps = pad.get_current_caps(); let struct = caps.get_structure(0); this.src_width = struct.get_int("width")[1]; this.src_height = struct.get_int("height")[1]; })); })); // // etc... // this.show_all(); } });
ビックリするほど同じだった。
解説は Python Gst 関連のもっと詳しいサイトで、もちろん英語。
foreach にアレ?と思うかもだがコレ gst_iterator_foreach ですんで。
コイツも Gjs ではメソッドになるので Lang.bind にて this を親に置き換える。
つか Lang.bind ってネストできたのか、試しに書いて上手くいっただけだが。
原寸は得ることができたけどウインドウのリサイズはどうしよう?
gtk_widget_set_size_request は縮小できなるので使えない。
Y901x 1.1 は親ウインドウをリサイズでまかなっていた。
しかし今度のは GtkHeaderBar がある、内寸と外寸が一致しない。
うーん駄目元で中の GtkBox との差分を計算してリサイズしてみよう。
this.change_video_size = function(n) { let w = Math.round(this.src_width * n); let h = Math.round(this.src_height * n) + SEEKBAR_HEIGHT; let diff_x = this.get_allocated_width() - this.vbox.get_allocated_width(); let diff_y = this.get_allocated_height() - this.vbox.get_allocated_height(); this.resize(w + diff_x, h + diff_y); };
ちなみに this のメソッドには Lang.bind はいらない。
この関数に 1 を渡すと、見事に原寸の動画が再生できた。
計算方法は意外にもコレでいいようだ、GtkHeaderBar よくワカンネエ!