Home | History | Annotate | Download | only in arc
      1 /* Copyright 2017 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 #ifndef HAL_USB_CACHED_FRAME_H_
      7 #define HAL_USB_CACHED_FRAME_H_
      8 
      9 #include <memory>
     10 
     11 #include <camera/CameraMetadata.h>
     12 #include "arc/image_processor.h"
     13 
     14 namespace arc {
     15 
     16 // CachedFrame contains a source FrameBuffer and a cached, converted
     17 // FrameBuffer. The incoming frames would be converted to YU12, the default
     18 // format of libyuv, to allow convenient processing.
     19 class CachedFrame {
     20  public:
     21   CachedFrame();
     22   ~CachedFrame();
     23 
     24   // SetSource() doesn't take ownership of |frame|. The caller can only release
     25   // |frame| after calling UnsetSource(). SetSource() immediately converts
     26   // incoming frame into YU12. Return non-zero values if it encounters errors.
     27   // If |rotate_degree| is 90 or 270, |frame| will be cropped, rotated by the
     28   // specified amount and scaled.
     29   // If |rotate_degree| is -1, |frame| will not be cropped, rotated, and scaled.
     30   // This function will return an error if |rotate_degree| is not -1, 90, or
     31   // 270.
     32   int SetSource(const FrameBuffer* frame, int rotate_degree);
     33   void UnsetSource();
     34 
     35   uint8_t* GetSourceBuffer() const;
     36   size_t GetSourceDataSize() const;
     37   uint32_t GetSourceFourCC() const;
     38   uint8_t* GetCachedBuffer() const;
     39   uint32_t GetCachedFourCC() const;
     40 
     41   uint32_t GetWidth() const;
     42   uint32_t GetHeight() const;
     43 
     44   // Calculate the output buffer size when converting to the specified pixel
     45   // format. |fourcc| is defined as V4L2_PIX_FMT_* in linux/videodev2.h. Return
     46   // 0 on error.
     47   size_t GetConvertedSize(int fourcc) const;
     48 
     49   // Caller should fill everything except |data_size| and |fd| of |out_frame|.
     50   // The function will do format conversion and scale to fit |out_frame|
     51   // requirement.
     52   // If |video_hack| is true, it outputs YU12 when |hal_pixel_format| is YV12
     53   // (swapping U/V planes). Caller should fill |fourcc|, |data|, and
     54   // Return non-zero error code on failure; return 0 on success.
     55   int Convert(const android::CameraMetadata& metadata, FrameBuffer* out_frame,
     56               bool video_hack = false);
     57 
     58  private:
     59   int ConvertToYU12();
     60   // When we have a landscape mounted camera and the current camera activity is
     61   // portrait, the frames shown in the activity would be stretched. Therefore,
     62   // we want to simulate a native portrait camera. That's why we want to crop,
     63   // rotate |rotate_degree| clockwise and scale the frame. HAL would not change
     64   // CameraInfo.orientation. Instead, framework would fake the
     65   // CameraInfo.orientation. Framework would then tell HAL how much the frame
     66   // needs to rotate clockwise by |rotate_degree|.
     67   int CropRotateScale(int rotate_degree);
     68 
     69   const FrameBuffer* source_frame_;
     70   // const V4L2FrameBuffer* source_frame_;
     71 
     72   // Temporary buffer for cropped and rotated results.
     73   std::unique_ptr<uint8_t[]> cropped_buffer_;
     74   size_t cropped_buffer_capacity_;
     75 
     76   // Cache YU12 decoded results.
     77   std::unique_ptr<AllocatedFrameBuffer> yu12_frame_;
     78 
     79   // Temporary buffer for scaled results.
     80   std::unique_ptr<AllocatedFrameBuffer> scaled_frame_;
     81 };
     82 
     83 }  // namespace arc
     84 
     85 #endif  // HAL_USB_CACHED_FRAME_H_
     86