プレーン設定変更イベントとプレーン解像度の取得

プレーン設定変更イベントを取得し、さらに変更後の解像度を取得するサンプルコードである。
BD-Jでは再生するビデオの解像度に応じて、各プレーンの解像度が自動的に切り替わるが(プレーン構成参照)、この切換を捉える方法を示すことを目的としている。

本プログラムでは、BD-J Object fileのinitial_HAVi_Configuration_idで1920×1080を指定して、プログラム開始から5秒後に720×480のビデオを再生することを想定しており、この場合、ビデオ再生と同時にHScreenConfigurationListener.report()が呼び出される。

なお、ビデオの解像度に変更が無かった場合、仕様を見る限りHScreenConfigurationListener.report()は呼び出されないように思われるが、なぜか呼び出されてしまう…
 
Main.java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
 
import javax.media.Manager;
import javax.media.Player;
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import org.bluray.net.BDLocator;
import org.davic.media.MediaLocator;
import org.havi.ui.HBackgroundDevice;
import org.havi.ui.HGraphicsDevice;
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;
import org.havi.ui.HScreen;
import org.havi.ui.HVideoDevice;
import org.havi.ui.event.HScreenConfigurationEvent;
import org.havi.ui.event.HScreenConfigurationListener;
 
// HScreenConfigurationListenerを実装
public class Main implements Xlet, HScreenConfigurationListener {
    HScreen hscr;
    HGraphicsDevice hgd;
    HVideoDevice hvd;
    HBackgroundDevice hbd;
    Graphics g = null;
 
    public void initXlet(XletContext context){
        try {
            hscr = HScreen.getDefaultHScreen();
            hgd = hscr.getDefaultHGraphicsDevice();
            hvd = hscr.getDefaultHVideoDevice();
            hbd = hscr.getDefaultHBackgroundDevice();
 
            HScene hs= HSceneFactory.getInstance().getFullScreenScene(hgd);
            g = hs.getGraphics();
            Font f = new Font(null, java.awt.Font.BOLD, 38);
            hs.setFont(f);
            hs.setVisible(true);
 
            hscr.getDefaultHVideoDevice();
            //HScreenConfigurationListenerとして自分自身を登録
            hgd.addScreenConfigurationListener(this); 
            Thread.sleep(5000);
            BDLocator loc = new BDLocator("bd://1.PLAYLIST:00000"); // 720x480のビデオを再生
            MediaLocator ml = new MediaLocator(loc);
            Player player = Manager.createPlayer(ml);
            player.start();
        } catch(Throwable thr) {
        }
    }
    public void startXlet(){    }
    public void pauseXlet(){    }
    public void destroyXlet(boolean unconditional){ }
    //  HScreenConfigurationListenerを実装
    public void report(HScreenConfigurationEvent gce) {
        g.setColor(Color.white);
        g.drawString("G:"+hgd.getCurrentConfiguration().getPixelResolution().toString(), 50, 100);
        g.drawString("V:"+hvd.getCurrentConfiguration().getPixelResolution().toString(), 50, 150);
        g.drawString("B:"+hbd.getCurrentConfiguration().getPixelResolution().toString(), 50, 200);
    }
}

関連する項目

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です