1 // Copyright 2014 The Chromium 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 #ifndef MEDIA_CAST_TEST_UTILITY_BARCODE_H_ 6 #define MEDIA_CAST_TEST_UTILITY_BARCODE_H_ 7 8 #include <vector> 9 10 #include "base/memory/ref_counted.h" 11 12 namespace media { 13 class VideoFrame; 14 15 namespace cast { 16 namespace test { 17 // Encode a resilient barcode into |frame| containing all the bits 18 // from |bits|. 19 bool EncodeBarcode(const std::vector<bool>& bits, 20 scoped_refptr<media::VideoFrame> output_frame); 21 // Decode a barcode (encoded by EncodeBarCode) into |output|. 22 // |output| should already be sized to contain the right number 23 // of bits. 24 bool DecodeBarcode(const scoped_refptr<media::VideoFrame>& frame, 25 std::vector<bool>* output); 26 27 // Convenience templates that allows you to encode/decode numeric 28 // types directly. 29 template<class T> EncodeBarcode(T data,scoped_refptr<media::VideoFrame> output_frame)30bool EncodeBarcode(T data, scoped_refptr<media::VideoFrame> output_frame) { 31 std::vector<bool> bits(sizeof(T) * 8); 32 for (size_t i = 0; i < bits.size(); i++) { 33 bits[i] = ((data >> i) & 1) == 1; 34 } 35 return EncodeBarcode(bits, output_frame); 36 } 37 38 template<class T> DecodeBarcode(scoped_refptr<media::VideoFrame> output_frame,T * data)39bool DecodeBarcode(scoped_refptr<media::VideoFrame> output_frame, T* data) { 40 std::vector<bool> bits(sizeof(T) * 8); 41 bool ret = DecodeBarcode(output_frame, &bits); 42 if (!ret) return false; 43 *data = 0; 44 for (size_t i = 0; i < bits.size(); i++) { 45 if (bits[i]) { 46 *data |= 1UL << i; 47 } 48 } 49 return true; 50 } 51 52 } // namespace test 53 } // namespace cast 54 } // namespace media 55 56 #endif // MEDIA_CAST_TEST_UTILITY_BARCODE_H_ 57