“ ImageReader.getSurface()”如何工作?

时间:2019-08-06 22:07:57

标签: android android-image image-reader

我正在使用android中的camera2 API,并试图了解我正在使用的这段代码。部分代码如下所示:

previewReader = ImageReader.newInstance(previewSize.getWidth(), previewSize.getHeight(), 
                                        ImageFormat.YUV_420_888, 4);

previewReader.setOnImageAvailableListener(imageListener, backgroundHandler);
// This adds another output surface but not sure where this surface comes from..
previewRequestBuilder.addTarget(previewReader.getSurface());

imageListener是另一个实现android.media.ImageReader.OnImageAvailableListener的类的对象,而backgroundHandler只是一个后台线程。我没有包括这两个或previewRequestBuilder的代码,因为它们对于理解我的问题似乎并不重要。

我进行了广泛的搜索,但似乎发生了一些魔术,previewReader以某种方式发现了某个地方的表面。根据{{​​3}},getSurface()的作用是:

  

获取一个Surface,可用来为此Image产生ImageReader

任何人都可以解释它的来源吗?

1 个答案:

答案 0 :(得分:2)

Surface属于ImageReader;它是用ImageReader's构造函数的本机等效物创建的,并且(有效地)是ImageReader私有成员,带有吸气剂。

Here是本机构造函数中用于设置IGraphicBufferProducergbProducer)的行,该行基本上等效于Surface

Here在这里,您可以看到本机代码使用相同的成员来形成getSurface()/nativeGetSurface()的返回值(您可能需要对代码进行一点点跟踪,但就在那儿)。

这就是您的问题的字面答案。但是也许您在问,因为不清楚为什么相机不创建Surface并强迫您将其提供给ImageReader,相反:Surface很复杂对象(实际上是缓冲区队列),不应将其视为简单的预分配位图。进行捕捉时,相机管线将与其输出Surfaces通信,并设置正确的尺寸和颜色平面等。 (请注意,您可以通过addTarget()添加多个目标;相机可以使用它们中的每个。)相机需要知道的是它将输出发送到的位置;不需要自己创建输出Surface