blob: 2d307179559f95105602509f521f2bdcc616a53f [file] [log] [blame]
<html devsite><head>
<title>输出流和剪裁</title>
<meta name="project_path" value="/_project.yaml"/>
<meta name="book_path" value="/_book.yaml"/>
</head>
<body>
<!--
Copyright 2017 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<h2 id="output-stream">输出流</h2>
<p>相机子系统针对所有分辨率和输出格式都仅在基于 ANativeWindow 的管道上运行。您可以一次配置多个流,以便将单个帧发送至多个目标,例如:GPU、视频编码器、<a href="/devices/architecture/vndk/renderscript">RenderScript</a>,或应用可见的缓冲区(RAW Bayer 缓冲区、经处理的 YUV 缓冲区或经 JPEG 编码的缓冲区)。</p>
<p>出于优化的目的,这些输出流必须提前配置,而且只有有限的输出流可同时存在。这样一来,就可以预先分配内存缓冲区和配置相机硬件,以便在提交列有多个或者不同输出管道的请求时,不会出现请求延迟执行的情况。</p>
<p>有关取决于支持的硬件级别的保证流输出组合的详情,请参阅 <code><a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice#createCaptureSession(java.util.List%3Candroid.view.Surface%3E,%20android.hardware.camera2.CameraCaptureSession.StateCallback,%20android.os.Handler)">createCaptureSession()</a></code></p>
<h2>剪裁</h2>
<p>完整像素阵列的剪裁(用于数字变焦和需要更小 FOV 的其他使用情况)通过 ANDROID_SCALER_CROP_REGION 设置进行传递。这个设置可按需更改,这种方式对于实现平滑的数字变焦至关重要。</p>
<p>该区域被定义为矩形(x 和 y 分别表示宽和高),其中 (x,y) 表示矩形的左上角。该矩形在传感器有源像素阵列的坐标系中进行定义,其中 (0,0) 对应有源像素阵列的左上角像素。因此,宽度和高度不能大于 ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY 静态信息字段中所报告的尺寸。允许的最小宽度和高度由 HAL 通过 ANDROID_SCALER_MAX_DIGITAL_ZOOM 静态信息字段进行报告,该字段描述了所支持的缩放因子的最大值。因此,最小剪裁区域的宽度和高度为:</p>
<pre class="devsite-click-to-copy">
{width, height} =
{ floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM),
floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
</pre>
<p>如果剪裁区域需要满足特定需求(例如:要求起始位置坐标为偶数,并且其宽度/高度需均为偶数),则 HAL 必须进行必要的舍入运算,并写出输出结果元数据中所用的最终剪裁区域。同样,HAL 要实现视频防抖功能,则必须调整结果剪裁区域,以描述在应用视频防抖功能后输出结果中实际包含的区域。一般情况下,使用相机的应用必须能够根据剪裁区域、图像传感器的尺寸和镜头焦距确定其接收的视野范围。</p>
<p>由于剪裁区域适用于所有视频流,这些视频流的宽高比可能与剪裁区域的不同,所以每路视频流所用的实际传感器区域可能小于剪裁区域。具体而言,每路视频流应尽量避免进一步剪裁已定义的剪裁区域,以维持方形像素及其宽高比。如果视频流的宽高比大于剪裁区域,则该视频流应该在垂直方向上进一步剪裁,如果视频流的宽高比小于剪裁区域,则该视频流应该在水平方向上进一步剪裁。</p>
<p>在所有情况下,视频流剪裁均必须位于整个剪裁区域的中心位置,并且相对于整个剪裁区域,每路视频流要么在水平方向上进行剪裁,要么在垂直方向上进行剪裁,但绝不能在这两个方向上同时进行剪裁。</p>
<p>例如,如果两路视频流分别定义为 640x480(宽高比为 4:3)和 1280x720(宽高比为 16:9),并假设传感器为 300 万像素级(2000 x 1500 像素阵列),则下面展示了针对几个样本剪裁区域,每路视频流的预期输出区域。</p>
<p></p>剪裁区域:(500、375、1000、750)(宽高比为 4:3)<br />640x480 视频流剪裁:(500、375、1000、750)(与剪裁区域相同)<br />1280x720 视频流剪裁:(500、469、1000、562)<p></p>
<img src="images/crop-region-43-ratio.png" alt="crop-region-43-ratio" id="figure1"/>
<p class="img-caption">
<strong>图 1.</strong> 宽高比为 4:3</p>
<p>剪裁区域:(500、375、1333、750)(宽高比为 16:9)<br />640x480 视频流剪裁:(666、375、1000、750)<br />1280×720 视频流剪裁:(500、375、1333、750)(与剪裁区域相同)</p>
<img src="images/crop-region-169-ratio.png" alt="crop-region-169-ratio" id="figure2"/>
<p class="img-caption">
<strong>图 2. </strong>宽高比为 16:9</p>
<p>剪裁区域:(500、375、750、750)(宽高比为 1:1)<br />640x480 视频流剪裁:(500、469、750、562)<br />1280x720 视频流剪裁:(500、543、750、414)</p>
<img src="images/crop-region-11-ratio.png" alt="crop-region-11-ratio" id="figure3"/>
<p class="img-caption">
<strong>图 3. </strong>宽高比为 1:1</p>
<p>最后一个示例是宽高比为 1024×1024(方形)的视频流,而不是 480p 视频流:<br />剪裁区域:(500、375、1000、750)(宽高比为 4:3)<br />1024x1024 视频流剪裁:(625、375、750、750)<br />1280x720 视频流剪裁:(500、469、1000、562)</p>
<img src="images/crop-region-43-square-ratio.png" alt="crop-region-43-square-ratio" id="figure4"/>
<p class="img-caption">
<strong>图 4. </strong>宽高比为 4:3(方形)</p>
<h2 id="reprocessing">重新处理</h2>
<p>对原始图片文件提供额外的支持功能,即 RAW Bayer 数据重新处理支持功能。该支持功能允许相机管道处理之前捕获的 RAW 缓冲区和元数据(之前记录的整个帧),以生成新渲染的 YUV 或 JPEG 输出。</p>
</body></html>