1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_TEST_MD5_HELPER_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_TEST_MD5_HELPER_H_ 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Worker #include "./md5_utils.h" 15*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_decoder.h" 16*fb1b10abSAndroid Build Coastguard Worker 17*fb1b10abSAndroid Build Coastguard Worker namespace libvpx_test { 18*fb1b10abSAndroid Build Coastguard Worker class MD5 { 19*fb1b10abSAndroid Build Coastguard Worker public: MD5()20*fb1b10abSAndroid Build Coastguard Worker MD5() { MD5Init(&md5_); } 21*fb1b10abSAndroid Build Coastguard Worker Add(const vpx_image_t * img)22*fb1b10abSAndroid Build Coastguard Worker void Add(const vpx_image_t *img) { 23*fb1b10abSAndroid Build Coastguard Worker for (int plane = 0; plane < 3; ++plane) { 24*fb1b10abSAndroid Build Coastguard Worker const uint8_t *buf = img->planes[plane]; 25*fb1b10abSAndroid Build Coastguard Worker // Calculate the width and height to do the md5 check. For the chroma 26*fb1b10abSAndroid Build Coastguard Worker // plane, we never want to round down and thus skip a pixel so if 27*fb1b10abSAndroid Build Coastguard Worker // we are shifting by 1 (chroma_shift) we add 1 before doing the shift. 28*fb1b10abSAndroid Build Coastguard Worker // This works only for chroma_shift of 0 and 1. 29*fb1b10abSAndroid Build Coastguard Worker const int bytes_per_sample = 30*fb1b10abSAndroid Build Coastguard Worker (img->fmt & VPX_IMG_FMT_HIGHBITDEPTH) ? 2 : 1; 31*fb1b10abSAndroid Build Coastguard Worker const int h = 32*fb1b10abSAndroid Build Coastguard Worker plane ? (img->d_h + img->y_chroma_shift) >> img->y_chroma_shift 33*fb1b10abSAndroid Build Coastguard Worker : img->d_h; 34*fb1b10abSAndroid Build Coastguard Worker const int w = 35*fb1b10abSAndroid Build Coastguard Worker (plane ? (img->d_w + img->x_chroma_shift) >> img->x_chroma_shift 36*fb1b10abSAndroid Build Coastguard Worker : img->d_w) * 37*fb1b10abSAndroid Build Coastguard Worker bytes_per_sample; 38*fb1b10abSAndroid Build Coastguard Worker 39*fb1b10abSAndroid Build Coastguard Worker for (int y = 0; y < h; ++y) { 40*fb1b10abSAndroid Build Coastguard Worker MD5Update(&md5_, buf, w); 41*fb1b10abSAndroid Build Coastguard Worker buf += img->stride[plane]; 42*fb1b10abSAndroid Build Coastguard Worker } 43*fb1b10abSAndroid Build Coastguard Worker } 44*fb1b10abSAndroid Build Coastguard Worker } 45*fb1b10abSAndroid Build Coastguard Worker Add(const uint8_t * data,size_t size)46*fb1b10abSAndroid Build Coastguard Worker void Add(const uint8_t *data, size_t size) { 47*fb1b10abSAndroid Build Coastguard Worker MD5Update(&md5_, data, static_cast<uint32_t>(size)); 48*fb1b10abSAndroid Build Coastguard Worker } 49*fb1b10abSAndroid Build Coastguard Worker Get()50*fb1b10abSAndroid Build Coastguard Worker const char *Get() { 51*fb1b10abSAndroid Build Coastguard Worker static const char hex[16] = { 52*fb1b10abSAndroid Build Coastguard Worker '0', '1', '2', '3', '4', '5', '6', '7', 53*fb1b10abSAndroid Build Coastguard Worker '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 54*fb1b10abSAndroid Build Coastguard Worker }; 55*fb1b10abSAndroid Build Coastguard Worker uint8_t tmp[16]; 56*fb1b10abSAndroid Build Coastguard Worker MD5Context ctx_tmp = md5_; 57*fb1b10abSAndroid Build Coastguard Worker 58*fb1b10abSAndroid Build Coastguard Worker MD5Final(tmp, &ctx_tmp); 59*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < 16; i++) { 60*fb1b10abSAndroid Build Coastguard Worker res_[i * 2 + 0] = hex[tmp[i] >> 4]; 61*fb1b10abSAndroid Build Coastguard Worker res_[i * 2 + 1] = hex[tmp[i] & 0xf]; 62*fb1b10abSAndroid Build Coastguard Worker } 63*fb1b10abSAndroid Build Coastguard Worker res_[32] = 0; 64*fb1b10abSAndroid Build Coastguard Worker 65*fb1b10abSAndroid Build Coastguard Worker return res_; 66*fb1b10abSAndroid Build Coastguard Worker } 67*fb1b10abSAndroid Build Coastguard Worker 68*fb1b10abSAndroid Build Coastguard Worker protected: 69*fb1b10abSAndroid Build Coastguard Worker char res_[33]; 70*fb1b10abSAndroid Build Coastguard Worker MD5Context md5_; 71*fb1b10abSAndroid Build Coastguard Worker }; 72*fb1b10abSAndroid Build Coastguard Worker 73*fb1b10abSAndroid Build Coastguard Worker } // namespace libvpx_test 74*fb1b10abSAndroid Build Coastguard Worker 75*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_TEST_MD5_HELPER_H_ 76