| // 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_ |