// Copyright 2014 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 COBALT_MEDIA_CAST_TEST_UTILITY_BARCODE_H_
#define COBALT_MEDIA_CAST_TEST_UTILITY_BARCODE_H_

#include <vector>

#include "base/memory/ref_counted.h"
#include "starboard/types.h"

namespace cobalt {
namespace media {
class VideoFrame;

namespace cast {
namespace test {
// Encode a resilient barcode into |frame| containing all the bits
// from |bits|.
bool EncodeBarcode(const std::vector<bool>& bits,
                   scoped_refptr<media::VideoFrame> output_frame);
// Decode a barcode (encoded by EncodeBarCode) into |output|.
// |output| should already be sized to contain the right number
// of bits.
bool DecodeBarcode(const scoped_refptr<media::VideoFrame>& frame,
                   std::vector<bool>* output);

// Convenience templates that allows you to encode/decode numeric
// types directly.
template <class T>
bool EncodeBarcode(T data, scoped_refptr<media::VideoFrame> output_frame) {
  std::vector<bool> bits(sizeof(T) * 8);
  for (size_t i = 0; i < bits.size(); i++) {
    bits[i] = ((data >> i) & 1) == 1;
  }
  return EncodeBarcode(bits, output_frame);
}

template <class T>
bool DecodeBarcode(scoped_refptr<media::VideoFrame> output_frame, T* data) {
  std::vector<bool> bits(sizeof(T) * 8);
  bool ret = DecodeBarcode(output_frame, &bits);
  if (!ret) return false;
  *data = 0;
  for (size_t i = 0; i < bits.size(); i++) {
    if (bits[i]) {
      *data |= 1UL << i;
    }
  }
  return true;
}

}  // namespace test
}  // namespace cast
}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_CAST_TEST_UTILITY_BARCODE_H_
