技术开发 频道

Android多媒体框架3月变化

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只是实现上述功能一个子集。

 

0
相关文章