Quarter HD(QHD)グラフィックスとHDグラフィックスの共存

1920×1080のビデオと960×540(Quater HD or QHD)のグラフィックスを組み合わせるためのサンプルコード。
BD-J Object fileのinitial_HAVi_configurationでグラフィックスがQHDになるように設定していても、HDビデオを再生すると引きずられてGraphics DeviceもHDになってしまう(プレーン構成参照)。本プログラムではそれを避けるものである。
QHDが必要な場面は稀であると思われるが、以下のような場合に有用である。
  • 高速化したい場合:解像度が低いほど一般的に有利
  • イメージファイルのデータサイズを小さくしたい場合
  • 日本のデジタル放送のデータを流用したい場合:デジタル放送のグラフィックスプレーンの解像度は960×540であるため

 

Main.java

import java.awt.Dimension;
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.davic.resources.ResourceClient;
import org.davic.resources.ResourceProxy;
import org.havi.ui.HGraphicsConfigTemplate;
import org.havi.ui.HGraphicsConfiguration;
import org.havi.ui.HGraphicsDevice;
import org.havi.ui.HScreen;
import org.havi.ui.HScreenConfigTemplate;
 
// ResourceClientインタフェースを実装する必要がある
public class Main implements Xlet, ResourceClient {
 
    private HGraphicsDevice device;
    public void initXlet(XletContext context){
        try {
            // Graphics Deviceを取得
            device = HScreen.getDefaultHScreen().getDefaultHGraphicsDevice();
            // configuration取得用テンプレートの取得
            HGraphicsConfigTemplate template= new HGraphicsConfigTemplate();            
            // QHDをテンプレートに設定
            // Programming HD DVD and Blu-ray Discのサンプルコードでは"SCREEN_RECTANGLE"となっているが
            //PIXEL_RESOLUTIONの間違い
            template.setPreference(HScreenConfigTemplate.PIXEL_RESOLUTION, new Dimension(960, 540), 
                                 HScreenConfigTemplate.REQUIRED);
            // configuration取得
            HGraphicsConfiguration config = device.getBestConfiguration(template);
            // Graphics Deviceを占有
            device.reserveDevice(this);
            // configurationを設定
            device.setGraphicsConfiguration(config);
            // Movie PlayListを再生開始
            BDLocator loc = new BDLocator("bd://1.PLAYLIST:00000");
            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){
        // Graphics Deviceの占有を開放
        device.releaseDevice();
    }
 
    // ResourceClientインタフェースを実装する必要がある
    public void notifyRelease(ResourceProxy proxy) {}
    public void release(ResourceProxy proxy) {}
    public boolean requestRelease(ResourceProxy proxy, Object requestData) {return false;}
}

 


コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください