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;
          }
        }
      }
    }
  • 相关阅读:
    CentOS 7部署KVM之三基本管理
    CentOS 7部署KVM之二安装配置
    CentOS 7部署KVM之一架构介绍
    DOM 事件流
    渐进增强与优雅降级
    (三)跟我一起玩Linux网络服务:DHCP服务配置之主服务器配置
    (二)跟我一起玩Linux网络服务:BIND的自动部署(附上完整的代码)
    责任链模式--行为模式
    装饰模式--- 结构型模式
    elastic-job+zookeeper实现分布式定时任务调度的使用(springboot版本)
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/8990448.html
Copyright © 2011-2022 走看看