`
java-admin
  • 浏览: 1381931 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

Android多媒体框架3月变化

阅读更多

Android的核心代码在3月底有一了一次比较重大的改动,尤其是多媒体方面的改动比较大,主要的目的是为了更好的实现Camcorder,以及进一步实现Video Telephony。这些改动也是软、硬件协调、结构和性能折中的一个结果。在此做出一些说明,希望中国的关心Android技术的网友进一步了解Android发展的历程。

1 ISurface接口的改动

  ISurface是一个给下层的C++/C代码访问Surface的接口,在JAVA层看不到这一层的逻辑,在以前ISurface接口是比较简单的。

class ISurface : public IInterface
    {
    
public:
        DECLARE_META_INTERFACE(Surface);
        virtual status_t registerBuffers(
int w, int h, int hstride, int vstride,
                PixelFormat format,
const sp<IMemoryHeap>& heap) = 0;
        virtual
void postBuffer(ssize_t offset) = 0; // one-way
        virtual void unregisterBuffers() = 0;
        virtual sp
<OverlayRef> createOverlay(
                uint32_t w, uint32_t h, int32_t format)
= 0;
    };

  其中createOverlay()其实表示的使用Overlay时候的接口,一般使用硬件的多个FrameBuffer来实现。这个接口类似一个“旁路”,直接绕过了SurfaceFlinger访问下层的显示硬件,和其他的接口没有什么关系。
主要的改动是registerBuffers()的改动,增加了一个ISurface ::BufferHeap类。

  class BufferHeap {
            
enum {
                
/* rotate source image 90 degrees */
                ROT_90    
= HAL_TRANSFORM_ROT_90,
            };
            BufferHeap(uint32_t w, uint32_t h,
                    int32_t hor_stride, int32_t ver_stride,
                    PixelFormat format,
const sp<IMemoryHeap>& heap);
            BufferHeap(uint32_t w, uint32_t h,
                    int32_t hor_stride, int32_t ver_stride,
                PixelFormat format, uint32_t transform, uint32_t flags,
    
const sp<IMemoryHeap>& heap);
    
/* ......  */
    };

 

  registerBuffers()的改动在于使用了新的BufferHeap接口:

 <!--EndFragment-->

  事实上,BufferHeap()的第一个构造函数与以前没有改动的接口从功能上是相同的。BufferHeap()的第二个构造函数增加了transform和flags两个参数,可以提供更灵活的操作方式,比如使用ROT_90来设置旋转。

  从操作上,本改动在功能改动不大的情况下却着实涉及了不少的内容,从PVPlayer的显示输出的Surface MIO,SurfaceFlinger的一些实现,Camera服务中的实现。由于ISurface主要用于Playback的输出和Camera / Video Telephony的preview,走的是下层的数据流,因此这个改动不会影响JAVA上层的内容。

  本次改动的来龙去脉是,以前的ISurface是不支持Overlay的接口,自从年前Overlay接口的确定后,为实现硬件的输出提供了方法。但是使用Overlay则不能使用SurfaceFlinger的2D处理功能,这次接口则增强了ISurface非Overlay接口的功能。比如让其具有了旋转的功能,这样在PVPlayer等输出显示的时候,就有一个方式可以控制显示的方向。

 

 virtual status_t registerBuffers(const BufferHeap& buffers) = 0;

1.旧的情况

  由于以前Android的Camera的接口只考虑了Camera本身的情况,没有考虑Camcorder和Video Telephony的情况,这样接口在很大的程度上就有了局限。以前最上层的Camera接口是frameworks/base/include/ui/中的Camera.h。
根据从前的接口,Camera在使用Overlay和不使用Overlay的情况分别如下所示:

  Camcorder在使用Overlay和不使用Overlay的情况分别如下所示:

 

  从数据流的角度使用Overlay,那么显示的输出将从Camera Hardware Interface的实现直接输出到显示设备上;如果不使用Overlay,则显示的输出通过PreviewCallback输出到Camera Service中有Camera实现输出到ISurface上。
而PreviewCallback是唯一向上层送Video数据的方法,在使用Overlay的Camera中,由于不需要上层显示,也不需要获取Video数据,因此PreviewCallback是没有用到。在Camcorder中,Video数据送向Encoder是通过PreviewCallback完成的。尤其在不使用Overlay的Camcorder中,PreviewCallback其实扮演的双用途。

  本问题在去年的年底就已经开始讨论,由于Video数据和Preview数据共用一个数据通道,主要的问题是无法在禁止Preview的情况下,向Encoder送出Video数据,这样就不适合了Video Telephony的实现。仅仅对于Camcorder的实现也有问题,无法让Preview和Recording的Video数据使用不同的大小。另外也有一些优化方面无法处理的问题。

2.新的情况

  在新的接口中,上层的Camera接口和下层的Camera Hardware Interface都实现了Preview和Recording数据通道的分离。
这样没有Overlay情况下的Camcorder的实现如下所示:

 

  在上面的情况下,可以看到使用了PreviewCallback和RecorderCallback两个回调函数送上,事实上,对于Camera Service的改动并不大,基本上只是更换了一个函数的名字。对于Camera Hardware Interface的实现,其实变化也不大,数据区可以使用一个,只是通过不同的回调函数送出。使用Overlay的Camcorder如下所示:

  Camera接口实际上更改了两个地方:
frameworks/base/include/ui/Camera.h
frameworks/base/include/ui/CameraHardwareInterface.h

  对于前者是上层的Camera接口,对于后者是下层硬件的Camera接口。二者共同的特点是将Preview和Recorder的数据通道进行了分离。

  从实现上,对于硬件层来说,传输数据的名称只是换了名字而已,由于一般的Camera接口的硬件驱动程序(比如v4l2)不会对Preview和Video数据进行区分,因此实现上的区别也不大。

  对于上层的Camera接口,在一般情况下。对于Camera的实现,无论是否使用Overlay,这两个Callback都没有使用的;对于Camcorder的实现,无论是否使用Overlay,RecordingCallback都是向上(Encoder)送数据的。请注意,其实无论哪一种情况,此时的PreviewCallback都是没有用处的,但是接口依然保留。

  对于Video Telephony,计划的实现方式如下所示:Camera Hardware Interface传输的数据还是一样的,CameraService中不做出Preview,上层数据通过RecordingCallback传输数据到Encorder。

  本次改动经过了较长时期的,最后的结果还是比较理想的,基本上照顾到了Camera,Camcorder,Video Telephony的实现情况。

  本次改动为Camera Hardware Interface的实现增加了难度,可能具体Camera Hardware Interface只是实现上述功能一个子集。

 

 

http://tech.it168.com/a2009/0526/577/000000577091_1.shtml

 

 

 

分享到:
评论

相关推荐

    Mastering the Android Media Framework

    ### 掌握Android多媒体框架 #### 一、概述 在Google官方发布的《Mastering the Android Media Framework》文档中,深入探讨了Android多媒体框架的核心概念、架构设计及其在实际开发中的应用。本文档由Dave Sparks...

    Android资料打包下载

    通常,这样的资源会涵盖Android SDK的使用、布局设计、事件处理、数据存储、网络通信、多媒体支持、权限管理等多个方面,以简单易懂的方式引导初学者入门。 3. **Google手持设备应用程序设计**:Google手持设备主要...

    Android中文翻译组—Android中文合集(7)

    《Android中文翻译组—Android中文合集(7)》是一个为中文用户提供的Android开发资源集合,更新至2012年1月22日,包含了当时最全面、最新的Android API中文版信息。这个合集主要以CHM(Microsoft Compiled ...

    基于Google Android 移动平台的研究

    Google Android 系统作为新一代智能手机平台,自2007年11月发布以来,在全球范围内引起了广泛的关注和应用。Android 不仅是一个操作系统,更是一个全面整合的操作系统、中间件、用户界面和应用软件为一体的移动...

    深入理解Android:卷I--详细书签版

    出版日期:2011 年9月 开本:16开 页码:488 版次:1-1 编辑推荐  结合实际应用开发需求,以情景分析的方式有针对性地对Android的源代码进行了十分详尽的剖析,深刻揭示Android系统的工作原理  机锋网、51CTO、...

    Android最新开发教材

    - **架构**:Android系统采用分层结构,主要包括应用程序层、应用程序框架层、核心库层、Linux内核层等四个主要部分。 - **应用程序层**:包含一系列预装的应用程序,如电话簿、短信工具等。 - **应用程序框架...

    Pro Android 4 (Professional Apress)

    深入探讨了Android多媒体框架的结构和功能,包括如何播放音频和视频文件,以及如何录制声音和视频流。 ##### 25. Home Screen Widgets 讲解了如何创建和使用桌面小部件(Widget),包括如何实现可配置的小部件和...

    Apress.Android.Essentials.Jul.2008

    《Apress.Android.Essentials.Jul.2008》是一部关于Android开发的重要参考资料,它由知名出版机构Apress在2008年7月发布。这本书深入浅出地介绍了当时Android平台的基础知识和核心概念,对于初学者以及有一定经验的...

    Apress.Pro.Android.Flash.Jul.2011.7z

    《Apress.Pro.Android.Flash.Jul.2011》这本书是2011年7月由Apress出版社出版的专业Android开发指南,专注于在Android平台上使用Flash技术进行应用开发。这个压缩包文件包含了该书的电子版内容,可能是PDF、EPUB或...

    android ijkplayer 最新.so文件,依赖最新0.8.3编译

    ijkplayer是Android平台上一个著名的开源媒体播放器框架,它基于FFmpeg进行开发,提供了高度优化的视频和音频解码功能。这个压缩包包含的是ijkplayer的最新.so文件,这意味着它是针对2017年10月10日的ijkplayer ...

    java中文帮助文档+Android官方帮助文档

    2. **API参考**:详尽列出了所有可用的类、方法和接口,包括Android框架API、AndroidX库以及Google Play服务API。开发者可以通过查阅这里来了解特定功能的使用方法。 3. **设计指南**:提供了关于用户体验、设计...

    安卓图片多选相关-Android超高仿微信图片选择器2016年3月13日升级版.rar

    这个"安卓图片多选相关-Android超高仿微信图片选择器2016年3月13日升级版"是一个专为Android平台设计的开源项目,旨在模仿微信的图片选择功能。下面我们将深入探讨这个项目的相关知识点。 1. **图片选择器的设计** ...

    Android系统原理及开发要点详解

    后发展起来,并在2007年11月宣布成立开放手机联盟(Open Handset Alliance),共同推进Android的发展。Android系统因其开源性、可定制性和丰富的应用生态系统而受到广泛欢迎。 #### 二、Android系统架构 Android...

    Android软件平台架构与应用开发.docx

    2008年9月22日,美国运营商T-Mobile USA在纽约正式发布了第一款Google手机T-Mobile G1,这款由宏达电制造的手机是全球首部采用真正开放且完整的移动软件——Android操作系统的手机。该手机支持WCDMA/HSPA网络,理论...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    1.2.4 Android移动Web项目开发的三种解决方案:Native, Web和Hybrid优缺陷分析 4 1.2.5国内外应用现状 6 1.2.6 研究现状总结 7 1.3研究目标与内容 7 1.3.1多窗口浏览器模式的实现机制 7 1.3.2跨域交互即缓存处理方法...

Global site tag (gtag.js) - Google Analytics