Gstreamer Aspect Rate

新規アプリも作らなきゃだけど既存アプリのメンテナンスも。

動画によっては原寸とアスペクト比が異なっている場合がある。
Totem や Celluloid はファイル中にある情報を見て適切なアスペクト比になる。
筆者の自作の奴も同じようにしたい。

ClutterGst.VideoResolution – Structures – ClutterGst 3.0

ためしに par_d と par_n の値を見てみた。
アスペクト比が原寸どおりな場合は常にどちらも 1 になる。
アスペクト比がおかしいものは 1 にならない。
なるほど、コレを使って単純計算できる。

ClutterGst 3.0 Get Media Width, Height | Paepoi Blog

ついでに昔書いた古い GstPad での書き換え方も判明。
Gst を直接使う人はコッチしかできないので併記しとく。

var Y901xWindow = GObject.registerClass({
    GTypeName: 'Y901xWindow'
}, class Y901xWindow extends Gtk.ApplicationWindow {
    _init(app) {
        super._init({application: app});
        //
        // 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;
            /* or GstPad
            vsink.foreach_pad((sink, pad) => {
                let caps = pad.get_current_caps();
                let struct = caps.get_structure(0);
                //print(struct.to_string()); // check
                let [,w, h] = struct.get_fraction('pixel-aspect-ratio');
                this.src_width = struct.get_int('width')[1] * w / h;
                this.src_height = struct.get_int('height')[1];
            });
            */

でイケた。

後はスマホ動画では必須の回転情報を得たいんだけーが。
GstStructure に入っていると思ったけどドコにも無かった、残念。
Totem は再生開始と同時にグルッと回ってカッッチョイイんだよな。