@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (mPusherRuning) {
switch (screen) {
case SCREEN_PORTRAIT:
portraitData2Raw(data);
break;
case SCREEN_LANDSCAPE_LEFT:
raw = data;
break;
case SCREEN_LANDSCAPE_RIGHT:
landscapeData2Raw(data);
break;
}
mNative.fireVideo(raw);
}
camera.addCallbackBuffer(buffer);
}
private void landscapeData2Raw(byte[] data) {
int width = mParam.getWidth(), height = mParam.getHeight();
int y_len = width * height;
int k = 0;
// y数据倒叙插入raw中
for (int i = y_len - 1; i > -1; i--) {
raw[k] = data[i];
k++;
}
// System.arraycopy(data, y_len, raw, y_len, uv_len);
// v1 u1 v2 u2
// v3 u3 v4 u4
// 需要转换为:
// v4 u4 v3 u3
// v2 u2 v1 u1
int maxpos = data.length - 1;
int uv_len = y_len >> 2; // 4:1:1
for (int i = 0; i < uv_len; i++) {
int pos = i << 1;
raw[y_len + i * 2] = data[maxpos - pos - 1];
raw[y_len + i * 2 + 1] = data[maxpos - pos];
}
}
private void portraitData2Raw(byte[] data) {
// if (mContext.getResources().getConfiguration().orientation !=
// Configuration.ORIENTATION_PORTRAIT) {
// raw = data;
// return;
// }
int width = mParam.getWidth(), height = mParam.getHeight();
int y_len = width * height;
int uvHeight = height >> 1; // uv数据高为y数据高的一半
int k = 0;
if (mParam.getCameraId() == CameraInfo.CAMERA_FACING_BACK) {
for (int j = 0; j < width; j++) {
for (int i = height - 1; i >= 0; i--) {
raw[k++] = data[width * i + j];
}
}
for (int j = 0; j < width; j += 2) {
for (int i = uvHeight - 1; i >= 0; i--) {
raw[k++] = data[y_len + width * i + j];
raw[k++] = data[y_len + width * i + j + 1];
}
}
} else {
for (int i = 0; i < width; i++) {
int nPos = width - 1;
for (int j = 0; j < height; j++) {
raw[k] = data[nPos - i];
k++;
nPos += width;
}
}
for (int i = 0; i < width; i += 2) {
int nPos = y_len + width - 1;
for (int j = 0; j < uvHeight; j++) {
raw[k] = data[nPos - i - 1];
raw[k + 1] = data[nPos - i];
k += 2;
nPos += width;
}
}
}
}
竖屏旋转摄像头预览数据90度
原文:https://www.cnblogs.com/yongfengnice/p/8990448.html