7

ImageReaderプレビュー フレームのデータ (バイト配列) を取得するために使用される があります。YUV_420_888次のような推奨画像形式で構成されています。

mPreviewImageReader = ImageReader.newInstance(width,
            height, ImageFormat.YUV_420_888, 2);

設定したリスナーmPreviewImageReader.setOnImageAvailableListener();が呼び出されると、画像を取得します。

Image image = reader.acquireLatestImage();

一部の電話では、ログに次のImageReader_JNIタグ付きの出力が表示されます。

ImageReader_imageSetup: バッファ形式 YUV_420_888 を 32315659 にオーバーライドします。

検索したところ、フォーマットが にオーバーライドされているようYV12です。ImageReader の c++ コードを調べてみたところ、これがどこで発生するかがわかりました。

int bufFmt = buffer->format;
if (imgReaderFmt == HAL_PIXEL_FORMAT_YCbCr_420_888) {
    bufFmt = buffer->flexFormat;
}
if (imgReaderFmt != bufFmt) {
    if (imgReaderFmt == HAL_PIXEL_FORMAT_YCbCr_420_888 && (bufFmt ==
            HAL_PIXEL_FORMAT_YCrCb_420_SP || bufFmt == HAL_PIXEL_FORMAT_YV12)) {
        // Special casing for when producer switches to a format compatible with flexible YUV
        // (HAL_PIXEL_FORMAT_YCbCr_420_888).
        ctx->setBufferFormat(bufFmt);
        ALOGD("%s: Overriding buffer format YUV_420_888 to %x.", __FUNCTION__, bufFmt);
}
// ... rest of the code

そのため、バッファの形式はの形式ですがYV12、設定したとおりです。ImageReaderYUV_420_888

これにより、この状況に関して、私が持っている2つのオプションに対応する2つの質問が得られます(私が見る限り):

  1. バッファの format はなぜYV12ですか? どこで設定されていますか? これを変更できますか?
  2. サポートを追加できYV12ますが、このオーバーライドが発生したことを知る必要があります。しかし、電話image.getFormat()をかけると、35を受け取りますYUV_420_888。このオーバーライドが行われたかどうかを知る方法はありますか?

他のアイデアは大歓迎です。

4

0 に答える 0