• 竖屏旋转摄像头预览数据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;
          }
        }
      }
    }
  • 相关阅读:
    Codeforces Round #741 (Div. 2)部分题题解
    Wedding DJ题解 (回归OI)
    Note -「模板」FHQ-Treap
    Solution -「数论」「校内题」矩阵求和
    【游记】WC2021抱铃记
    洛谷 P7073 /AcWing 2769. 表达式
    洛谷 P3004 [USACO10DEC]Treasure Chest S/CSES 1097
    P7074 [CSP-J2020] 方格取数
    Unity Built-in转URP速查表
    英国学生签证准备材料+办理流程等
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/8990448.html
Copyright © 2020-2023  润新知