A camera's Y plane is not width x height bytes. Rows sit rowStride apart, and the stride can run past the width: copy it as width x height and a QR code comes out as stripes. The buffer ends at the last meaningful pixel: a stride x height check rejects padded frames. Ours did.
