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
、設定したとおりです。ImageReader
YUV_420_888
これにより、この状況に関して、私が持っている2つのオプションに対応する2つの質問が得られます(私が見る限り):
- バッファの format はなぜ
YV12
ですか? どこで設定されていますか? これを変更できますか? - サポートを追加でき
YV12
ますが、このオーバーライドが発生したことを知る必要があります。しかし、電話image.getFormat()
をかけると、35を受け取りますYUV_420_888
。このオーバーライドが行われたかどうかを知る方法はありますか?
他のアイデアは大歓迎です。