`
androidssh
  • 浏览: 115217 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android上HDMI介绍(基于高通平台)

阅读更多
本文重点针对HDMI在android上的应用,而比较相关的就是overlay机制。overlay在这里只是简单的介绍,后续会有文章再专门详述。

      我没记错的话,高通从7X30开始,平台就可以支持HDMI(1.3)输出了。只不过在7x30上通过RGB接口外接一颗HDMI的transmitter来实现;而到了8系列(8x60),高通把这颗IC也集成了,直接就提供HDMI的输出了。(这样下去,以后渐渐的把外围器件都集成了,做底层的估计要失业了,做硬件的似乎工作量也没多少了)。

      先来看看HW的能力,下图是MDP4.0的结构图:


        可以看到,MDP4内部有4个overlay pipe,2个是for UI(RGB)的,2个VG是for video和graphics的;另外有2个mixer,mixer1是for primary display的(可以是MDDI接口的,也可以是RGB接口的lcd、oled等);mixer2是for external display的,如通过RGB interface2外接HDMI transmitter到TV,也可以是NTSC/PAL等模拟电视信号。

        Note:VG1和RGB1被mixer1混合到primary lcd,VG2和RGB2被mixer2混合到external LCD(如HDMI TV)

        如果是MDP4.1的话,MDDI接口被移除了,另外RGB接口只有一个,另一个内部集成为HDMI接口了。

    

       上面提到的是硬件平台相关的,就是说硬件有支持HDMI输出的能力,但是软件的状况呢?我们来看看Android和高通的状况。

      关于HDMI本身,我就不介绍了,网上随便找找都可以看明白。

      研究过Android的都知道,surfacefinger负责管理应用程序的显示窗口,每个窗口可以由多个surface组成,surfaceflinger通过OpenGL(可以通过HW,也可以是SW)把所有的surface合成后,通过调用gralloc模块或是overlay模块(MDP4.X才支持)把整屏数据送到显示设备上。可是Android(截止到2.2,3.0的状况还未知)上目前只支持一个显示设备,也就是说在surfaceflinger只能固定一个显示设备,那么HDMI这个应用在android手机上如何应用呢?

     这里介绍2个做法,一个是高通给做好的,叫做UI mirroring和video mirroring;另一个就是我们自己添加接口,AP自己来实现想要的功能。

     先来看高通在android中的做法,根据字面不难理解,UI mirroring和video mirroring其实就是把原来显示在primary LCD上的数据mirror到HDMI接口。下图为软件框架图:




       先来看看HDMI的控制方面,上图的右侧,user空间中有一个HDMI service,包含一个listener(都是java的),当HDMI cable插入后,底层HDMI的驱动检测到(HPD)后,通过kobject_uevent传送给HDMI daemon,daemon再把event发送给HDMI service,HDMI service除了判断这个event(cable状态),另外还要判断qualcomm setting中HDMI的on/off选项,然后把判断结果broadcast给各个AP,各个AP也就知道当前是否要开启HDMI输出了

       接着先看UI mirroring(不含video的状况)的实现,它针对的是界面的操作,数据为RGB格式。我们知道在kernel中每个显示设备都对应一个fb,初始化时都会分配framebuffer,在这里,primary lcd对应fb0设备,HDMI对应fb1设备。正常情况下,surfaceflinger合成好一个main surface后,通过post buffer(gralloc模块)把数据放入fb0,然后,通过overlay(kernel下做的,上层看到的还是通过IOCRL-FBIOPUT_VSCREENINFO命令实现)输出到primary lcd;当平台支持HDMI并且UI mirroring开启时,gralloc中(framebuffer.cpp)初始化时会多创建一个task(hdmi_ui_loop),并新建一个overlay(主要是控制和数据,参考overlaylib.h),这个overlay对应的channel固定为fb1,src fd就是fb0,也就是说这个overlay的源数据就是fb0,也就是primary lcd上的数据,通过rotator进行旋转(电视是横屏),然后在overlay中再scale up后再通过HDMI送到TV。这样看来,送到HDMI上的数据其实就是把fb0中的数据copybit了一份并放大,多少会有些失真的,但对于UI界面来说是可以接受的。上述整个过程,surfaceflinger是不参与的。

       再来看video mirroring是怎么做的?

       先来看看什么是video mirroring,其实就是手机播放视频,同时通过HDMI输出到TV上,手机上的内容分为2个部分,一个是视频本身部分,另一个是UI,这已经占用2个overlay pipe了(一个VG pipe,一个RGB pipe),TV上视频部分肯定是需要一个VG pipe的,另外,由于视频大小问题,视频不可能正好为全屏模式,这样必须还需要一个RGB pipe来实现一个背景(全黑)。4个pipe都被占用了,没有多余的pipe来把UI部分传到TV上,所以再使用高通平台时候,进行video mirroring时,TV上只能播放视频画面,UI部分(如菜单)在TV上是无法显示的。

        接着来看video部分是怎么处理的?首先手机端UI部分的处理模式不变,只不过上面提到的hdmi_ui_loop这个task会被停掉(UI不需要送到HDMI,原因上面已经解释过);video部分的frame通过opencore解码出来后,首先会通过surfaceflinger来创建overlay(参考layerbuffer.cpp),当系统支持HDMI时通过create overlay都会创建2个通道(这里是2个VG通道),其中包含2个control channel和2个data channel,它们的HAL层接口都再overlaylib.cpp中,channel0 for fb0;channel1 for fb1,如果需要旋转,则从系统pmem中再分配对应的内存。AP中overlay基本上的流程是这样的(可以参考overlays.cpp,里面不全,我补充了一些):


    sp<SurfaceComposerClient> client = new SurfaceComposerClient();//新建surface客户端

    // create pushbuffer surface
    sp<Surface> surface = client->createSurface(getpid(), 0, 320, 240,
            PIXEL_FORMAT_UNKNOWN, ISurfaceComposer::ePushBuffers);//创建一个surface

    // get to the isurface
    sp<ISurface> isurface = Test::getISurface(surface);//得到surface相关接口
printf("isurface = %p\n", isurface.get());
   
    // now request an overlay
    sp<OverlayRef> ref = isurface->createOverlay(320, 240, PIXEL_FORMAT_RGB_565);//创建overlay,并得到控制通道
sp<Overlay> overlay = new Overlay(ref);//初始化overlay并得到数据通道

overlay->setFd(mFd);//设置src data的fd

overlay->setCrop(x,y,w,h);//设置剪裁信息(根据需要)

overlay->queueBuffer(offset);//设置显示数据的偏移

   这样video player没解码出一个frame,都会调用quene函数把数据送入2个数据通道,overlay engine会把数据送到2个显示设备。

   关于那个背景,暂时在code中还没发现,也许是因为目前的版本不是最终版本,后续还会更新。

    上面的做法是高通的;但它是有限制的,比如说无法在2个屏幕上显示不同的内容。如果我们要做,也是可以的,主要就是看AP怎么定义规则了。另外framework中需要添加接口,主要是提供一个针对fb1设备的控制接口,同样也是绕过surfaceflinger。比如说手机在播放一个影片,通过HDMI把影片传送到TV上,同时手机端可以去浏览网页。这个功能可以这样做,AP背景播放影片,得到的frame不送到primary display上,而是通过新加的接口输出到fb1设备上,而browser的UI正常显示即可。如果是在高通平台去实现的话,需要把qualcomm setting里面的HDMI选项关掉,否则高通的做法和你自己AP的做法就乱套了。不过目前看,高通提供的方式似乎也可以满足应用了,但应用是永无止境的,只要user有这样的需求,developer就要去做,呵呵!
0
0
分享到:
评论

相关推荐

    android hdmi 输入 apk 源码 文档

    android hdmi 输入 apk 源码 文档 参考,rk3288 平台 硬件支持hdmiin,软件apk 源码参考

    基于Zynq的HDMI传输和相关IP核介绍

    在这篇文章中,我们将向大家介绍如何在不同目标开发板上使用基于Zynq的HDMI传输。图:Arty Z7 HDMI输入输出基于Zynq开发板对HDMI视频解码包含两种方式:外部解码(PS端)然后通过I2C总线传到PL端内部解码(PL端)...

    rk3399的android7.1平台新增HDMI特殊分辨率输出修改补丁

    白名单的分辨率数据要和kernel中的hdmi驱动新增分辨率一致

    android4.0 hdmi设置

    icool210 android4.0.4 hdmi设置

    mt8788 android12 HDMI patch

    mt8788 android12 HDMI(it66121) kernel4.19 patch

    HDMI基于4层PCB的布线指南

    综上所述,HDMI基于4层PCB的布线设计,不仅涉及到阻抗匹配的精细控制,还需要在板材选择、走线长度、Stub效应管理和焊盘过孔的阻抗补偿等方面做出周密考虑。通过遵循上述指南,可以显著提升HDMI信号的传输质量和稳定...

    HDMI详细介绍.pdf

    HDMI详细介绍.pdf HDMI(High Definition Multimedia Interface,高清晰多媒体接口)是一种数字接口,用于传输高清晰视频和音频信号。它基于DVI 1.0发展而来,专门为消费电子市场设计。 HDMI的主要特点包括: 1. ...

    rk3399android71平台新增HDMI特殊分辨率输出改补丁.pptx

    本文档主要介绍了在RK3399的Android 7.1平台上,针对HDMI输出存在的分辨率问题进行的修复和优化。RK3399是一款基于ARM架构的高性能SoC,常用于开发板和智能电视盒等领域,其Android系统在HDMI输出时遇到的分辨率问题...

    基于Android平台的收银秤系统的设计与实现.pdf

    《基于Android平台的收银秤系统的设计与实现》这篇论文主要探讨了如何在Android平台上构建一个功能完善的收银秤系统,以解决传统收银秤功能单一、操作复杂的问题。该系统利用Android平台的优势,结合小型嵌入式...

    FS4412-Android4.4 HDMI移植的步骤

    近期需要把 Android4.4 KitKat 的 HDMI 高清输出功能移植到 fs4412 开发平台,查阅了相关资料,经过一段时间的研究、调试,终于成功输出 1080P 的图像到电视,当然也支持720P 的输出了。

    基于pynq的简易HDMI服务器

    【基于pynq的简易HDMI服务器】是一个项目,它利用了PYNQ框架来实现一个简单的HDMI视频服务器。PYNQ(Python Productivity for Zynq)是Xilinx公司开发的一个开源平台,旨在为Zynq FPGA(Field Programmable Gate ...

    添加HDMI分辨率和屏幕旋转

    rk3399添加HDMI分辨率以及屏幕旋转。内含代码和修改记录

    基于Android平台的多点触控.pdf

    总的来说,基于Android平台的多点触控技术涉及硬件选型、Linux驱动编程、Android SDK的使用以及手势识别等多个层面。开发者需要综合考虑性能、成本和用户体验,精心设计和实现多点触控功能,以满足现代移动应用的...

    HDMI介绍,HDMI的SPEC.,和测试要求,以及解决方案

    ### HDMI技术概述与规格详解 #### 一、前言 HDMI(High Definition Multimedia Interface,高清晰度多媒体接口)是一种全数字化的视频和音频发送接口,可以传送无压缩的音频信号及视频信号。HDMI可用于机顶盒、DVD...

    RK3288双屏异显HDMI作主屏补丁

    这表明补丁开发者已经对它进行了测试,并确保在RK3288平台上的双屏显示功能正常运行,特别是在HDMI作为主要输出的情况下。双屏异显意味着两个屏幕可以同时显示不同的内容,这对于多任务处理或特定应用场景(如监控、...

    基于FPGA的HDMI转LVDS应用案例 fpga开发.pdf

    4. LVDS转HDMI的测试案例:在这个模式下,LVDS信号被转换为HDMI信号,然后被发送到显示设备上。 在讨论基于FPGA的HDMI转LVDS应用案例的技术细节之前,让我们先了解一下FPGA的基本概念和应用。FPGA(Field-...

    基于Verilog的VGA转HDMI实验

    在这个实验中,设计者利用Verilog编写代码,将传统的模拟视频信号VGA(Video Graphics Array)转换为数字高清多媒体接口HDMI(High-Definition Multimedia Interface)信号,以便在现代高清显示器上显示由0V7725...

    EDID.rar_ddc_edid_edid hdmi_hdmi edid_hdmi-receiver

    在这个名为"EDID.rar_ddc_edid_edid hdmi_hdmi edid_hdmi-receiver"的压缩包中,主要包含的是关于EDID及其在HDMI系统中的应用知识。 DDC(Display Data Channel)是EDID的基础,它是VESA(Video Electronics ...

    基于PI3HDMI341ART设计的四路HDMI参考设计Cadence硬件原理图PCB文件.zip

    标题中的“基于PI3HDMI341ART设计的四路HDMI参考设计Cadence硬件原理图PCB文件.zip”揭示了这个压缩包文件的主要内容,它是一个使用Cadence工具进行设计的四通道HDMI(High-Definition Multimedia Interface)系统的...

    pynq HDMI(zynq芯片也可使用 hdmi in hdmi out)

    使用PYNQ框架,可以更方便地在Zynq平台上进行Python编程,实现对HDMI接口的控制。PYNQ是一个基于Jupyter Notebook的开源项目,它为Zynq提供了一个高级抽象层,使得用户可以通过Python代码直接操作硬件资源,而无需...

Global site tag (gtag.js) - Google Analytics