// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_CAPTURE_VIDEO_MAC_TEST_PIXEL_BUFFER_TEST_UTILS_MAC_H_
#define MEDIA_CAPTURE_VIDEO_MAC_TEST_PIXEL_BUFFER_TEST_UTILS_MAC_H_

#include <memory>
#include <tuple>
#include <vector>

#import <CoreVideo/CoreVideo.h>
#import <IOSurface/IOSurface.h>

#include "base/mac/scoped_cftyperef.h"

namespace media {

struct ByteArrayPixelBuffer {
  ByteArrayPixelBuffer();
  ~ByteArrayPixelBuffer();

  std::vector<uint8_t> byte_array;
  base::ScopedCFTypeRef<CVPixelBufferRef> pixel_buffer;
};

// All pixels of the resulting buffer have the specified RGB. Alpha is 255.
std::vector<uint8_t> CreateArgbBufferFromSingleRgbColor(int width,
                                                        int height,
                                                        uint8_t r,
                                                        uint8_t g,
                                                        uint8_t b);

// True if the RGB color is closer to white (255,255,255) than black (0,0,0).
bool IsArgbPixelWhite(const std::vector<uint8_t>& argb_buffer, size_t i);

// True if all pixels are the specified RGB color, within some margin of error.
bool ArgbBufferIsSingleColor(const std::vector<uint8_t>& argb_buffer,
                             uint8_t r,
                             uint8_t g,
                             uint8_t b);

// Creates a checker pattern with tiles being white (255,255,255) or dark gray
// (100,100,100). Alpha is 255. The top-left corner is white.
std::vector<uint8_t> CreateArgbCheckerPatternBuffer(int width,
                                                    int height,
                                                    int num_tiles_across);

// Traverse the top and left border pixels, counting the number of tiles if this
// is a checker pattern. (Each pixel is characterized as white or non-white and
// this function counts the number of transitions between these colors.)
std::tuple<int, int> GetCheckerPatternNumTilesAccross(
    const std::vector<uint8_t>& argb_buffer,
    int width,
    int height);

// Creates a CVPixelBuffer that is backed by an in-memory byte array.
std::unique_ptr<ByteArrayPixelBuffer> CreateYuvsPixelBufferFromArgbBuffer(
    int width,
    int height,
    const std::vector<uint8_t>& argb_buffer);
std::unique_ptr<ByteArrayPixelBuffer> CreateYuvsPixelBufferFromSingleRgbColor(
    int width,
    int height,
    uint8_t r,
    uint8_t g,
    uint8_t b);

// YUVS IOSurface -> ARGB byte array.
std::vector<uint8_t> CreateArgbBufferFromYuvsIOSurface(IOSurfaceRef io_surface);

// True if all pixels of the YUVS IOSurface are the specified RGB color, within
// some margin of error.
bool YuvsIOSurfaceIsSingleColor(IOSurfaceRef io_surface,
                                uint8_t r,
                                uint8_t g,
                                uint8_t b);

// True if all pixels of the pixel buffer are the specified RGB color, within
// some margin of error.
bool PixelBufferIsSingleColor(CVPixelBufferRef pixel_buffer,
                              uint8_t r,
                              uint8_t g,
                              uint8_t b);

}  // namespace media

#endif  // MEDIA_CAPTURE_VIDEO_MAC_TEST_PIXEL_BUFFER_TEST_UTILS_MAC_H_
