zoukankan      html  css  js  c++  java
  • 竖屏旋转摄像头预览数据90度

     @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;
          }
        }
      }
    }
  • 相关阅读:
    BZOJ 1009 GT考试
    BZOJ 2085 [POI2010] Hamsters
    BZOJ 3160 万径人踪灭
    左偏树 / 非旋转treap学习笔记
    BZOJ 3217 ALOEXT
    BZOJ 3065 带插入区间第K小值
    BZOJ2716 天使玩偶
    XSY1659 [HNOI2012]永无乡
    BZOJ1367【Baltic2004】sequence
    蔡勒公式 计算星期
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/8990448.html
Copyright © 2011-2022 走看看