ClutterGst 3.0 Get Media Width, Height

スマホやタブレット 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 よくワカンネエ!