文章目录
一、分辨率
1.1、获取/设置分辨率
1.2、初始化默认分辨率
1.2.1、最优分辨率
1.2.2、最大分辨率
二、电视机信息
三、待机
在进行机顶盒ROM开发时,HDMI相关功能是常见的功能模块,本篇文章就简单介绍一些常见的HDMI相关需求开发。
常见的HDMI相关功能可分为三大块:(通过HDMI线获取/设置)分辨率、(通过HDMI线获取)电视机信息、(HDMI)待机。
一、分辨率
机顶盒通过HDMI线与TV相连时,是通过HDMI线(获取TV的EDID)来获取TV支持的分辨率情况的,所以与此相关的功能有获取/设置分辨率、初始化默认分辨率等。
1.1、获取/设置分辨率
该功能的相关代码代码看上去和HDMI“没多大关系”,属于Android通用性功能,其实不然,该功能与HDMI息息相关。接下来就以Hi3798MV300和Amlogic905两种平台来简单介绍。
先以Hi3798MV300为例,获取分辨率用到的接口和Android原生流程是一样的,主要来自于frameworks/base/core/java/android/os/display/DisplayManager.java,关键接口如下:
private int[] mAllDisplayStandard = {
DISPLAY_STANDARD_1080P_60,
DISPLAY_STANDARD_1080P_50,
DISPLAY_STANDARD_1080P_30,
DISPLAY_STANDARD_1080P_25,
DISPLAY_STANDARD_1080P_24,
DISPLAY_STANDARD_1080I_60,
DISPLAY_STANDARD_1080I_50,
DISPLAY_STANDARD_720P_60,
DISPLAY_STANDARD_720P_50,
DISPLAY_STANDARD_576P_50,
DISPLAY_STANDARD_480P_60,
DISPLAY_STANDARD_PAL,
DISPLAY_STANDARD_NTSC,
DISPLAY_STANDARD_3840_2160P_24,
DISPLAY_STANDARD_3840_2160P_25,
DISPLAY_STANDARD_3840_2160P_30,
DISPLAY_STANDARD_3840_2160P_50,
DISPLAY_STANDARD_3840_2160P_60,
DISPLAY_STANDARD_4096_2160P_24,
DISPLAY_STANDARD_4096_2160P_25,
DISPLAY_STANDARD_4096_2160P_30,
DISPLAY_STANDARD_4096_2160P_50,
DISPLAY_STANDARD_4096_2160P_60,
};
public DisplayManager(IDisplayManager server) {
mdisplay = server;
//see display.c::get_hdmi_capability
// hisi format value fmt cap index
mMapEncFmtToIndex.put(ENC_FMT_1080P_60 , 1 );
mMapEncFmtToIndex.put(ENC_FMT_1080P_50 , 2 );
mMapEncFmtToIndex.put(ENC_FMT_1080P_30 , 3 );
mMapEncFmtToIndex.put(ENC_FMT_1080P_25 , 4 );
mMapEncFmtToIndex.put(ENC_FMT_1080P_24 , 5 );
mMapEncFmtToIndex.put(ENC_FMT_1080i_60 , 6 );
mMapEncFmtToIndex.put(ENC_FMT_1080i_50 , 7 );
mMapEncFmtToIndex.put(ENC_FMT_720P_60 , 8 );
mMapEncFmtToIndex.put(ENC_FMT_720P_50 , 9 );
mMapEncFmtToIndex.put(ENC_FMT_576P_50 , 10);
mMapEncFmtToIndex.put(ENC_FMT_480P_60 , 11);
mMapEncFmtToIndex.put(ENC_FMT_PAL , 12);
mMapEncFmtToIndex.put(ENC_FMT_NTSC , 15);
mMapEncFmtToIndex.put(ENC_FMT_3840x2160_24 , 44);
mMapEncFmtToIndex.put(ENC_FMT_3840x2160_25 , 45);
mMapEncFmtToIndex.put(ENC_FMT_3840x2160_30 , 46);
mMapEncFmtToIndex.put(ENC_FMT_3840x2160_50 , 47);
mMapEncFmtToIndex.put(ENC_FMT_3840x2160_60 , 48);
mMapEncFmtToIndex.put(ENC_FMT_4096X2160_24 , 49);
mMapEncFmtToIndex.put(ENC_FMT_4096X2160_25 , 50);
mMapEncFmtToIndex.put(ENC_FMT_4096X2160_30 , 51);
mMapEncFmtToIndex.put(ENC_FMT_4096X2160_50 , 52);
mMapEncFmtToIndex.put(ENC_FMT_4096X2160_60 , 53);
try{
int[] dispCapability = mdisplay.getDisplayCapability();
for(int i = 0; i < dispCapability.length; i++){
Log.d("DisplayManager.java", "dispCapability[" + i + "]=" + dispCapability[i]);
}
if(dispCapability != null){
int supportFmtCnt = 0;
int[] supportFmt = new int[mAllDisplayStandard.length];
for(int i = 0; i < mAllDisplayStandard.length; i++){
if(dispCapability[mMapEncFmtToIndex.get(covertCMCCFmtToHisi(mAllDisplayStandard[i]))] == 1){
supportFmt[supportFmtCnt] = mAllDisplayStandard[i];
supportFmtCnt++;
Log.d("DisplayManager.java", "supportFmt:" + mAllDisplayStandard[i]);
}
Log.d("DisplayManager.java", "supportFmtCnt:" + supportFmtCnt);
}
mStandard = new int[supportFmtCnt];
System.arraycopy(supportFmt, 0, mStandard, 0, supportFmtCnt);
}else{
mStandard = new int[0];
}
}
catch(Exception ex){
mStandard = new int[0];
}
}
public int[] getAllSupportStandards() {
return mStandard;
}
public boolean isSupportStandard(int standard) {
boolean ret = false;
for (int i = 0; i < mStandard.length; i++) {
if(standard == mStandard[i]){
ret = true;
break;
}
}
return ret;
}
public void setDisplayStandard(int standard) {
int hisiFmt = -1;
int ret = -1;
if(isSupportStandard(standard)){
try {
hisiFmt = covertCMCCFmtToHisi(standard);
if (hisiFmt >= ENC_FMT_1080P_60) {
ret = mdisplay.setFmt(hisiFmt);
}
} catch(Exception ex) {
Log.e(TAG,"setDisplayStandard: " + ex);
}</