Merge "Revert "Paint buffers, basic result metadata."" into nyc-jaqen-dev
diff --git a/modules/camera/3_4/Android.mk b/modules/camera/3_4/Android.mk
index c851ad8..62624cc 100644
--- a/modules/camera/3_4/Android.mk
+++ b/modules/camera/3_4/Android.mk
@@ -44,11 +44,9 @@
 LOCAL_SRC_FILES := \
   Camera.cpp \
   Stream.cpp \
-  StreamFormat.cpp \
   V4L2Camera.cpp \
   V4L2CameraHAL.cpp \
   V4L2Gralloc.cpp \
-  V4L2Wrapper.cpp \
 
 LOCAL_CFLAGS += -Wall -Wextra -fvisibility=hidden
 
diff --git a/modules/camera/3_4/StreamFormat.cpp b/modules/camera/3_4/StreamFormat.cpp
deleted file mode 100644
index ec1c1cd..0000000
--- a/modules/camera/3_4/StreamFormat.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "StreamFormat.h"
-
-#include <linux/videodev2.h>
-
-#include "Common.h"
-#include "Stream.h"
-
-namespace v4l2_camera_hal {
-
-StreamFormat::StreamFormat(const default_camera_hal::Stream& stream)
-    // TODO(b/30000211): multiplanar support.
-    : type_(V4L2_BUF_TYPE_VIDEO_CAPTURE),
-      v4l2_pixel_format_(
-          StreamFormat::HalToV4L2PixelFormat(stream.getFormat())),
-      width_(stream.getWidth()),
-      height_(stream.getHeight()),
-      bytes_per_line_(0),
-      min_buffer_size_(0) {
-  HAL_LOG_ENTER();
-}
-
-StreamFormat::StreamFormat(const v4l2_format& format)
-    : type_(format.type),
-      // TODO(b/30000211): multiplanar support.
-      v4l2_pixel_format_(format.fmt.pix.pixelformat),
-      width_(format.fmt.pix.width),
-      height_(format.fmt.pix.height),
-      bytes_per_line_(format.fmt.pix.bytesperline),
-      min_buffer_size_(format.fmt.pix.sizeimage) {
-  HAL_LOG_ENTER();
-}
-
-void StreamFormat::FillFormatRequest(v4l2_format* format) const {
-  HAL_LOG_ENTER();
-
-  memset(format, 0, sizeof(*format));
-  format->type = type_;
-  format->fmt.pix.pixelformat = v4l2_pixel_format_;
-  format->fmt.pix.width = width_;
-  format->fmt.pix.height = height_;
-  // Bytes per line and min buffer size are outputs set by the driver,
-  // not part of the request.
-}
-
-FormatCategory StreamFormat::Category() const {
-  switch (v4l2_pixel_format_) {
-    case V4L2_PIX_FMT_JPEG:
-      return kFormatCategoryStalling;
-    case V4L2_PIX_FMT_YUV420:
-      return kFormatCategoryNonStalling;
-    default:
-      // Note: currently no supported RAW formats.
-      return kFormatCategoryUnknown;
-  }
-}
-
-bool StreamFormat::operator==(const StreamFormat& other) const {
-  // Used to check that a requested format was actually set, so
-  // don't compare bytes per line or min buffer size.
-  return (type_ == other.type_ &&
-          v4l2_pixel_format_ == other.v4l2_pixel_format_ &&
-          width_ == other.width_ && height_ == other.height_);
-}
-
-bool StreamFormat::operator!=(const StreamFormat& other) const {
-  return !(*this == other);
-}
-
-int StreamFormat::V4L2ToHalPixelFormat(uint32_t v4l2_pixel_format) {
-  // Translate V4L2 format to HAL format.
-  int hal_pixel_format = -1;
-  switch (v4l2_pixel_format) {
-    case V4L2_PIX_FMT_JPEG:
-      hal_pixel_format = HAL_PIXEL_FORMAT_BLOB;
-      break;
-    case V4L2_PIX_FMT_YUV420:
-      hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_888;
-      break;
-    default:
-      // Unrecognized format.
-      break;
-  }
-  return hal_pixel_format;
-}
-
-uint32_t StreamFormat::HalToV4L2PixelFormat(int hal_pixel_format) {
-  // Translate HAL format to V4L2 format.
-  uint32_t v4l2_pixel_format = 0;
-  switch (hal_pixel_format) {
-    case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:  // fall-through.
-    case HAL_PIXEL_FORMAT_YCbCr_420_888:
-      v4l2_pixel_format = V4L2_PIX_FMT_YUV420;
-      break;
-    case HAL_PIXEL_FORMAT_BLOB:
-      v4l2_pixel_format = V4L2_PIX_FMT_JPEG;
-      break;
-    default:
-      // Unrecognized format.
-      break;
-  }
-  return v4l2_pixel_format;
-}
-
-}  // namespace v4l2_camera_hal
diff --git a/modules/camera/3_4/StreamFormat.h b/modules/camera/3_4/StreamFormat.h
deleted file mode 100644
index 3686564..0000000
--- a/modules/camera/3_4/StreamFormat.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef V4L2_STREAM_FORMAT_H_
-#define V4L2_STREAM_FORMAT_H_
-
-#include <linux/videodev2.h>
-
-#include "Common.h"
-#include "Stream.h"
-
-namespace v4l2_camera_hal {
-
-enum FormatCategory {
-  kFormatCategoryRaw,
-  kFormatCategoryStalling,
-  kFormatCategoryNonStalling,
-  kFormatCategoryUnknown,
-};
-
-class StreamFormat {
- public:
-  StreamFormat(const default_camera_hal::Stream& stream);
-  StreamFormat(const v4l2_format& format);
-  virtual ~StreamFormat();
-  // Only uint32_t members, use default generated copy and assign.
-
-  void FillFormatRequest(v4l2_format* format) const;
-  FormatCategory Category() const;
-  inline uint32_t get_type() const { return type_; };
-
-  bool operator==(const StreamFormat& other) const;
-  bool operator!=(const StreamFormat& other) const;
-
-  // HAL <-> V4L2 conversions
-  // Returns 0 for unrecognized.
-  static uint32_t HalToV4L2PixelFormat(int hal_pixel_format);
-  // Returns -1 for unrecognized.
-  static int V4L2ToHalPixelFormat(uint32_t v4l2_pixel_format);
-
- private:
-  uint32_t type_;
-  uint32_t v4l2_pixel_format_;
-  uint32_t width_;
-  uint32_t height_;
-  uint32_t bytes_per_line_;
-  uint32_t min_buffer_size_;
-};
-
-}  // namespace v4l2_camera_hal
-
-#endif  // V4L2_STREAM_FORMAT_H_
diff --git a/modules/camera/3_4/V4L2Wrapper.cpp b/modules/camera/3_4/V4L2Wrapper.cpp
deleted file mode 100644
index fdcd179..0000000
--- a/modules/camera/3_4/V4L2Wrapper.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "V4L2Wrapper.h"
-
-#include <fcntl.h>
-#include <linux/videodev2.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <mutex>
-
-#include <nativehelper/ScopedFd.h>
-
-#include "Common.h"
-#include "Stream.h"
-#include "StreamFormat.h"
-
-namespace v4l2_camera_hal {
-
-V4L2Wrapper::V4L2Wrapper(const std::string device_path)
-    : device_path_(device_path), max_buffers_(0) {
-  HAL_LOG_ENTER();
-}
-
-V4L2Wrapper::~V4L2Wrapper() { HAL_LOG_ENTER(); }
-
-int V4L2Wrapper::Connect() {
-  HAL_LOG_ENTER();
-  std::lock_guard<std::mutex> lock(device_lock_);
-
-  if (connected()) {
-    HAL_LOGE("Camera device %s is already connected. Close it first",
-             device_path_.c_str());
-    return -EIO;
-  }
-
-  int fd = TEMP_FAILURE_RETRY(open(device_path_.c_str(), O_RDWR));
-  if (fd < 0) {
-    HAL_LOGE("failed to open %s (%s)", device_path_.c_str(), strerror(errno));
-    return -errno;
-  }
-  device_fd_.reset(fd);
-
-  // Check if this connection has the extended control query capability.
-  v4l2_query_ext_ctrl query;
-  query.id = V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
-  // Already holding the lock, so don't call ioctlLocked.
-  int res = TEMP_FAILURE_RETRY(
-      ioctl(device_fd_.get(), VIDIOC_QUERY_EXT_CTRL, &query));
-  extended_query_supported_ = (res == 0);
-
-  // TODO(b/29185945): confirm this is a supported device.
-  // This is checked by the HAL, but the device at device_path_ may
-  // not be the same one that was there when the HAL was loaded.
-  // (Alternatively, better hotplugging support may make this unecessary
-  // by disabling cameras that get disconnected and checking newly connected
-  // cameras, so Connect() is never called on an unsupported camera)
-  return 0;
-}
-
-void V4L2Wrapper::Disconnect() {
-  HAL_LOG_ENTER();
-  std::lock_guard<std::mutex> lock(device_lock_);
-
-  device_fd_.reset();  // Includes close().
-  format_.reset();
-  max_buffers_ = 0;
-}
-
-// Helper function. Should be used instead of ioctl throughout this class.
-template <typename T>
-int V4L2Wrapper::IoctlLocked(int request, T data) {
-  HAL_LOG_ENTER();
-  std::lock_guard<std::mutex> lock(device_lock_);
-
-  if (!connected()) {
-    HAL_LOGE("Device %s not connected.", device_path_.c_str());
-    return -ENODEV;
-  }
-  return TEMP_FAILURE_RETRY(ioctl(device_fd_.get(), request, data));
-}
-
-int V4L2Wrapper::StreamOn() {
-  HAL_LOG_ENTER();
-
-  if (!format_) {
-    HAL_LOGE("Stream format must be set before turning on stream.");
-    return -EINVAL;
-  }
-
-  int32_t type = format_->get_type();
-  if (IoctlLocked(VIDIOC_STREAMON, &type) < 0) {
-    HAL_LOGE("STREAMON fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  return 0;
-}
-
-int V4L2Wrapper::StreamOff() {
-  HAL_LOG_ENTER();
-
-  int32_t type = format_->get_type();
-  if (IoctlLocked(VIDIOC_STREAMOFF, &type) < 0) {
-    HAL_LOGE("STREAMOFF fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  return 0;
-}
-
-int V4L2Wrapper::QueryControl(uint32_t control_id,
-                              v4l2_query_ext_ctrl* result) {
-  HAL_LOG_ENTER();
-  int res;
-
-  memset(result, 0, sizeof(*result));
-
-  if (extended_query_supported_) {
-    result->id = control_id;
-    res = IoctlLocked(VIDIOC_QUERY_EXT_CTRL, result);
-    // Assuming the operation was supported (not ENOTTY), no more to do.
-    if (errno != ENOTTY) {
-      if (res) {
-        HAL_LOGE("QUERY_EXT_CTRL fails: %s", strerror(errno));
-        return -ENODEV;
-      }
-      return 0;
-    }
-  }
-
-  // Extended control querying not supported, fall back to basic control query.
-  v4l2_queryctrl query;
-  query.id = control_id;
-  if (IoctlLocked(VIDIOC_QUERYCTRL, &query)) {
-    HAL_LOGE("QUERYCTRL fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  // Convert the basic result to the extended result.
-  result->id = query.id;
-  result->type = query.type;
-  memcpy(result->name, query.name, sizeof(query.name));
-  result->minimum = query.minimum;
-  if (query.type == V4L2_CTRL_TYPE_BITMASK) {
-    // According to the V4L2 documentation, when type is BITMASK,
-    // max and default should be interpreted as __u32. Practically,
-    // this means the conversion from 32 bit to 64 will pad with 0s not 1s.
-    result->maximum = static_cast<uint32_t>(query.maximum);
-    result->default_value = static_cast<uint32_t>(query.default_value);
-  } else {
-    result->maximum = query.maximum;
-    result->default_value = query.default_value;
-  }
-  result->step = static_cast<uint32_t>(query.step);
-  result->flags = query.flags;
-  result->elems = 1;
-  switch (result->type) {
-    case V4L2_CTRL_TYPE_INTEGER64:
-      result->elem_size = sizeof(int64_t);
-      break;
-    case V4L2_CTRL_TYPE_STRING:
-      result->elem_size = result->maximum + 1;
-      break;
-    default:
-      result->elem_size = sizeof(int32_t);
-      break;
-  }
-
-  return 0;
-}
-
-int V4L2Wrapper::GetControl(uint32_t control_id, int32_t* value) {
-  HAL_LOG_ENTER();
-
-  v4l2_control control;
-  control.id = control_id;
-  if (IoctlLocked(VIDIOC_G_CTRL, &control) < 0) {
-    HAL_LOGE("G_CTRL fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-  *value = control.value;
-  return 0;
-}
-
-int V4L2Wrapper::SetControl(uint32_t control_id, int32_t desired,
-                            int32_t* result) {
-  HAL_LOG_ENTER();
-
-  v4l2_control control{control_id, desired};
-  if (IoctlLocked(VIDIOC_S_CTRL, &control) < 0) {
-    HAL_LOGE("S_CTRL fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-  *result = control.value;
-  return 0;
-}
-
-int V4L2Wrapper::SetFormat(const default_camera_hal::Stream& stream) {
-  HAL_LOG_ENTER();
-
-  // Should be checked earlier; sanity check.
-  if (stream.isInputType()) {
-    HAL_LOGE("Input streams not supported.");
-    return -EINVAL;
-  }
-
-  StreamFormat desired_format(stream);
-  if (desired_format == *format_) {
-    HAL_LOGV("Already in correct format, skipping format setting.");
-    return 0;
-  }
-
-  // Not in the correct format, set our format.
-  v4l2_format new_format;
-  desired_format.FillFormatRequest(&new_format);
-  // TODO(b/29334616): When async, this will need to check if the stream
-  // is on, and if so, lock it off while setting format.
-  if (IoctlLocked(VIDIOC_S_FMT, &new_format) < 0) {
-    HAL_LOGE("S_FMT failed: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  // Check that the driver actually set to the requested values.
-  if (desired_format != new_format) {
-    HAL_LOGE("Device doesn't support desired stream configuration.");
-    return -EINVAL;
-  }
-
-  // Keep track of our new format.
-  format_.reset(new StreamFormat(new_format));
-
-  // Format changed, setup new buffers.
-  SetupBuffers();
-  return 0;
-}
-
-int V4L2Wrapper::SetupBuffers() {
-  HAL_LOG_ENTER();
-
-  // "Request" a buffer (since we're using a userspace buffer, this just
-  // tells V4L2 to switch into userspace buffer mode).
-  v4l2_requestbuffers req_buffers;
-  memset(&req_buffers, 0, sizeof(req_buffers));
-  req_buffers.type = format_->get_type();
-  req_buffers.memory = V4L2_MEMORY_USERPTR;
-  req_buffers.count = 1;
-  if (IoctlLocked(VIDIOC_REQBUFS, &req_buffers) < 0) {
-    HAL_LOGE("REQBUFS failed: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  // V4L2 will set req_buffers.count to a number of buffers it can handle.
-  max_buffers_ = req_buffers.count;
-  return 0;
-}
-
-}  // namespace v4l2_camera_hal
diff --git a/modules/camera/3_4/V4L2Wrapper.h b/modules/camera/3_4/V4L2Wrapper.h
deleted file mode 100644
index 4126e90..0000000
--- a/modules/camera/3_4/V4L2Wrapper.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef V4L2_WRAPPER_H
-#define V4L2_WRAPPER_H
-
-#include <memory>
-#include <mutex>
-#include <string>
-
-#include <nativehelper/ScopedFd.h>
-
-#include "Common.h"
-#include "Stream.h"
-#include "StreamFormat.h"
-
-namespace v4l2_camera_hal {
-class V4L2Wrapper {
- public:
-  V4L2Wrapper(const std::string device_path);
-  virtual ~V4L2Wrapper();
-
-  // Connect or disconnect to the device.
-  int Connect();
-  void Disconnect();
-  // Turn the stream on or off.
-  int StreamOn();
-  int StreamOff();
-  // Manage controls.
-  int QueryControl(uint32_t control_id, v4l2_query_ext_ctrl* result);
-  int GetControl(uint32_t control_id, int32_t* value);
-  int SetControl(uint32_t control_id, int32_t desired, int32_t* result);
-  // Manage format.
-  int SetFormat(const default_camera_hal::Stream& stream);
-
-  inline bool connected() { return device_fd_.get() >= 0; }
-
- private:
-  // Perform an ioctl call in a thread-safe fashion.
-  template <typename T>
-  int IoctlLocked(int request, T data);
-  // Adjust buffers any time a device is connected/reformatted.
-  int SetupBuffers();
-
-  // The camera device path. For example, /dev/video0.
-  const std::string device_path_;
-  // The opened device fd.
-  ScopedFd device_fd_;
-  // Whether or not the device supports the extended control query.
-  bool extended_query_supported_;
-  // The format this device is set up for.
-  std::unique_ptr<StreamFormat> format_;
-  // The maximum number of buffers this device can handle in its current format.
-  uint32_t max_buffers_;
-  // Lock protecting use of the device.
-  std::mutex device_lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(V4L2Wrapper);
-};
-
-}  // namespace v4l2_camera_hal
-
-#endif  // V4L2_WRAPPER_H