出力ストリームと切り抜き

出力ストリーム

カメラ サブシステムは、すべての解像度と出力形式について、ANativeWindow ベースのパイプラインでのみ動作します。一度に複数のストリームを構成して、GPU、動画エンコーダ、RenderScript、アプリ可視バッファ(RAW Bayer、処理された YUV バッファ、JPEG にエンコードされたバッファ)などの複数のターゲットに対して単一フレームを送信できます。

最適化のために、これらの出力ストリームは事前に構成する必要があり、一度に存在できるのは限られた数だけです。そうすることで、メモリバッファの事前割り当てとカメラ ハードウェアの構成が可能となり、複数の出力パイプラインもしくはさまざまな出力パイプラインが一覧の状態で送信されても、リクエストの実行が遅れたり、レイテンシが生じることがありません。

サポート済みのハードウェア レベルに応じて保証されるストリーム出力の組み合わせについては、createCaptureSession() を参照してください。

切り抜き

フルピクセル配列の切り抜き(デジタルズームや、FOV が小さい方が望ましいその他のユースケース)は、ANDROID_SCALER_CROP_REGION 設定を介して伝達されます。これはリクエストごとの設定であり、リクエストごとに変更できます。このことは、スムーズなデジタルズームを実現する上で重要です。

領域はレクタングル(x、y、幅、高さ)で定義され、(x、y)はレクタングルの左上隅を表します。レクタングルはセンサー アクティブ ピクセル配列の座標で定義され、アクティブなピクセル配列の左上のピクセルが(0、0)になります。したがって、幅と高さは ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY 静的情報フィールドでレポートされるサイズ以下にする必要があります。許可されている最小の幅と高さは、ANDROID_SCALER_MAX_DIGITAL_ZOOM 静的情報フィールドで HAL によりレポートされます。このフィールドは、サポートされている最大ズーム倍率を示します。したがって、切り抜き領域の最小の幅と高さは次のようになります。

      {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) }
    

切り抜き領域に特定の要件を満たす必要がある場合(偶数の座標から開始し、幅と高さを偶数にする必要がある場合など)、HAL で必要な丸め処理を行い、出力結果のメタデータで使用される最終的な切り抜き領域を書き出す必要があります。同様に、HAL で動画の手ぶれ補正を実装する場合、結果の切り抜き領域を調整し、動画の手ぶれ補正が適用された後で実際に出力に含まれる領域を記述する必要があります。一般に、カメラを使用するアプリは、切り抜き領域、イメージ センサーの寸法、レンズ焦点距離に基づいて視野を決定できる必要があります。

切り抜き領域はすべてのストリームに適用されますが、切り抜き領域とは異なるアスペクト比を持つストリームもあるため、各ストリームに使用される正確なセンサー領域は、切り抜き領域より小さくなる場合があります。具体的には、定義された切り抜き領域を最小限に切り抜くことで、各ストリームでスクエア ピクセルとアスペクト比を維持する必要があります。ストリームのアスペクト比が切り抜き領域よりも広い場合、ストリームをさらに縦方向に切り抜き、ストリームのアスペクト比が切り抜き領域よりも狭い場合、ストリームをさらに横方向に切り抜く必要があります。

ストリームの切り抜き領域は、どのような場合でも、横方向または縦方向のいずれかで切り抜き領域全体の中央に配置されます。縦横の双方の向きで中央に配置されることはありません。

たとえば、2 つのストリームが 640x480 のストリーム(アスペクト比 4:3)と 1,280x720 のストリーム(アスペクト比 16:9)として定義されている場合に、3 メガピクセル(2,000 × 1,500 ピクセル配列)のセンサーを仮定すると、それぞれの切り抜き領域に対して見込まれる出力領域は以下のようになります。

切り抜き領域:(500、375、1,000、750)(アスペクト比 4:3)
640x480 のストリームの切り抜き:(500、375、1,000、750)(切り抜き領域に等しい) 1,280x720 のストリームの切り抜き:(500、469、1,000、562)

crop-region-43-ratio

図 1. アスペクト比 4:3

切り抜き領域:(500、375、1,333、750)(アスペクト比 16:9)
640x480 のストリームの切り抜き:(666、375、1,000、750) 1,280x720 のストリームの切り抜き:(500、375、1,333、750)(切り抜き領域に等しい)

crop-region-169-ratio

図 2. アスペクト比 16:9

切り抜き領域:(500、375、750、750)(アスペクト比 1:1)
640×480 ストリームの切り抜き:(500、469、750、562) 1,280x720 ストリームの切り抜き:(500、543、750、414)

crop-region-11-ratio

図 3. アスペクト比 1:1

最後の例では、480p ストリームではなく 1,024x1,024 のスクエア アスペクト比のストリームを使用しています。
切り抜き領域:(500、375、1,000、750)(アスペクト比 4:3) 1,024x1,024 ストリームの切り抜き:(625、375、750、750) 1,280x720 ストリームの切り抜き(500、469、1,000、562)

crop-region-43-square-ratio

図 4. アスペクト比 4:3、スクエア

再処理

RAW 画像ファイルは、RAW Bayer データを再処理することでサポートされます。このサポートにより、カメラ パイプラインで過去にキャプチャされた RAW バッファとメタデータ(過去に記録されたフレーム全体)を処理し、新しくレンダリングされた YUV または JPEG 出力を生成できるようになります。