6a828-视频播放默认播放区域是等比例缩放需要改为自动充满到指定区域

1. 参考6a918的代码

1. 【918】【4k屏小窗口播放视频】

分析1) 总是显示不显示, 但是mirror后总能显示
在文件中/home/6a918/4K2K_SDK/jb_4.3/hardware/mstar/hwcomposer/hwcomposer.cpp
#if 1//20150515 byh
//#define HWC_ENABLE_DYNAMIC_SCALING
#else
#define HWC_ENABLE_DYNAMIC_SCALING
#endif
分析2) 视频是1920x1080, 显示区域是960x720. 发现y总是180; 换成其他位置也会上下有黑边。日志如下:
王云(王云) 05-15 18:00:58
E/hwcomposer( 1010): dff tempDff u32ScalingMode is 1!!
D/hwcomposer( 1010): before Wrapper_Video_setXCWin win.x = 0, win.y = 0, win.wid
th = 1920, win.height = 1440
D/vsyncbridge( 1010): Wrapper_Video_setXCWin 0
D/vsyncbridge( 1010): Wrapper_Video_setXCWin 0 x 0 y 0 width 1920 height 1440
D/vsyncbridge( 1010): vsync_bridge_CalAspectRatio type = 1
D/vsyncbridge( 1010): Wrapper_Video_setXCWin 0 x 0 y 0 width 1920 height 1440
D/vsyncbridge( 1010): Wrapper_Video_setXCWin 0 DispWin x 0 y 180 width 1920 heig
ht 1080
D/vsyncbridge( 1010): Wrapper_Video_setXCWin before video_setXCWin 0 DispWin x 0

王云(王云) 05-15 18:00:58
y 180 width 1920 height 1080
D/VideoSet( 1010): video_setXCWin 0
D/IVideoSet( 1010): Send video_setXCWin 0
I/tvos    ( 1016): V/VideoSetService( 1024 1713): input x=0, y=180, width=1920,
height=1080, enWin=0
I/tvos    ( 1016): V/VideoSetService( 1024 1713): CropWin: x=0, y=0, w=1920, h=1
080, DispWin: x=0, y=180, w=1920, h=1080
I/tvos    ( 1016): D/VideoSetService( 1024 1713): VIDEO is not Mute
I/tvos    ( 1016): D/VideoSetService( 1024 2737

发现一个关键点:海信电视是01-03 05:35:32.349 D/vsyncbridge( 979): vsync_bridge_set_aspectratio [0] 0
而我们的918电视是D/vsyncbridge( 1009): vsync_bridge_set_aspectratio [0] 1。
那么是1的话是E_AR_16x9, 在vsync_bridge_CalAspectRatio 就会做一个以x轴为标准的等比例拉伸。
好了我们在/home/6a918/4K2K_SDK/jb_4.3/hardware/mstar/hwcomposer/hwcomposer.cpp static void MsVideoDispManager 中
做如下
pMyPictureManager = PictureManager::connect();
if (pMyPictureManager == NULL) {
ALOGE(“Fail to connect service mstar.PictureManager”);
} else {
//ALOGD(“Success to connect mstar.PipManager”);
#if 1//20150515 byh
ALOGD(“AspectRatio is %d force to %d,\n”, (Vsync_Bridge_ARC_Type)pMyPictureManager->getAspectRatio(), 0);
vsync_bridge_set_aspectratio(enWin, (Vsync_Bridge_ARC_Type)E_AR_DEFAULT);
#else
vsync_bridge_set_aspectratio(enWin, (Vsync_Bridge_ARC_Type)pMyPictureManager->getAspectRatio());
#endif
pMyPictureManager->disconnect();
pMyPictureManager.clear();
}
那么默认的aspectratio 就是E_AR_DEFAULT。
但是我们发现E_AR_DEFAULT 里面会判断KEEP_ASPECT_RATE, 如果是还会转换坐标。
所以我们在/home/6a918/4K2K_SDK/jb_4.3/hardware/mstar/libvsyncbridge vsync_bridge.c 里面
#if 1//20150515
#ifdef KEEP_ASPECT_RATE
#undef KEEP_ASPECT_RATE
#define KEEP_ASPECT_RATE 0
#endif
#endif
那么好了, 就原来0 x 0 y 0 width 1920 height 1440还会是这个。

2. 参照918改2个文件disp_api.cpp, vsync_bridge.c看看效果

$ adb -s 172.168.47.24:5555 push /home/6a918/6a828/l-828/out/target/product/pitaya/system/lib/libvsyncbridge.so /system/lib/
2044 KB/s (70976 bytes in 0.033s)
$ 
$ 
$ adb -s 172.168.47.24:5555 push /home/6a918/6a828/l-828/out/target/product/pitaya/system/lib64/libvsyncbridge.so /system/lib64/
2167 KB/s (104056 bytes in 0.046s)
$ 
$ 
$ adb -s 172.168.47.24:5555 push /home/6a918/6a828/l-828/out/target/product/pitaya/system/lib/libmsfrmfmt.so /system/lib/
118 KB/s (5160 bytes in 0.042s)
$ adb -s 172.168.47.24:5555 push /home/6a918/6a828/l-828/out/target/product/pitaya/system/lib64/libmsfrmfmt.so /system/lib64/
果然应该是充满指定区域了。

3. 发现如果osd层旋转90度后,那么全屏的视频只播放屏幕一半左右

1. 日志如下

11-22 10:37:49.289 D/vsyncbridge( 1148): u32FrameRate=25000, u32OutputFrmRate=50000, u8FrcMode[0] = 4
11-22 10:37:49.289 D/vsyncbridge( 1148): panelWidth = 1920, panelHeight = 1080, [1920 1080 600]
11-22 10:37:49.290 D/vsyncbridge( 1148): Display Path INIT END: 1
11-22 10:37:49.290 D/BufferQueueProducer( 1148): [SurfaceView] wait disp path init done
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  603] DispW:1920 DispH:1080
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  607] Cap.x:493 Cap.y:30 CapW:1920 CapH:1080
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  608] enInputSourceType:34
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  610] u16InputVTotal:2205  u16InputVFreq:500
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  612] bInterlace:0  u16DefaultHtotal:0
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  615] bPreHCusScaling:1  bPreVCusScaling:1
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  617] u16PreHCusScalingSrc:1920  u16PreHCusScalingDst:1920
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  619] u16PreVCusScalingSrc:1080  u16PreVCusScalingSrc:1080
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  622] bHCusScaling:0  bVCusScaling:0
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  624] u16HCusScalingSrc:960  u16HCusScalingDst:1920
11-22 10:37:49.290 D/vsyncbridge( 1148): [update_ds_table,  626] u16VCusScalingSrc:1084  u16VCusScalingDst:1080
11-22 10:37:49.290 D/vsyncbridge( 1148): vsync_bridge_CalAspectRatio type = 0
11-22 10:37:49.290 D/vsyncbridge( 1148): panel [1920 1080] osd [1080 1920] ratio [1.777778 0.562500]
11-22 10:37:49.290 D/vsyncbridge( 1148): apply ratio, x=0, y=0, width=1920, height=607
11-22 10:37:49.290 V/VideoSetService( 1173): video_SurfaceVideoSizeChange(callingPid 1148, clientPid 1148)

1. “force Wratio = 1.0f, Hratio = 1.0f

修改vsync_bridge.c

#if 1//20161112 byh
                ALOGD("force Wratio = 1.0f, Hratio = 1.0f\n");
                Wratio = 1.0f;
                Hratio = 1.0f;
#endif

3. 后来发现竖屏的位置都很不对,lvds不对,vbyone也不对

-#if 1//20161112 byh
-#if 1//20161215 byh
-                               if(u32OsdWidth < u32OsdHeight)//panel [1920 1080] osd [1080 1920] 
-                               {
-               if (u32OsdWidth && u32OsdHeight) {
-                   Wratio = (float)panelWidth[dff->OverlayID] / u32OsdHeight;
-                   Hratio = (float)panelHeight[dff->OverlayID] / u32OsdWidth;
-               }
-
-               ALOGD("panel [%d %d] osd [%d %d] ratio [%f %f] after change", panelWidth[dff->OverlayID],
-                   panelHeight[dff->OverlayID], u32OsdWidth, u32OsdHeight, Wratio, Hratio);
-                               }
-                               else//panel [3840 2160] osd [1920 1080] ratio [2.000000 2.000000]
-                               {
-                                       ALOGD("u32OsdWidth >= u32OsdHeight, don't change Wratio, Hratio\n");
-                               }
-#else
-                               ALOGD("force Wratio = 1.0f, Hratio = 1.0f\n");
-                               Wratio = 1.0f;
-                               Hratio = 1.0f;
-#endif
-#endif

那说明竖屏需要ratio的算法,w,h要互换一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值