1923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org/* 2923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org * 4923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org * Use of this source code is governed by a BSD-style license 5923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org * that can be found in the LICENSE file in the root of the source 6923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org * tree. An additional intellectual property rights grant can be found 7923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org * in the file PATENTS. All contributing project authors may 8923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org * be found in the AUTHORS file in the root of the source tree. 9923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org */ 10923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 11f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#ifndef TEST_MD5_HELPER_H_ 12f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#define TEST_MD5_HELPER_H_ 13923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 14923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "./md5_utils.h" 15923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "vpx/vpx_decoder.h" 16923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 17923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgnamespace libvpx_test { 18923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgclass MD5 { 19923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org public: 20923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org MD5() { 21923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org MD5Init(&md5_); 22923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 23923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 24923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org void Add(const vpx_image_t *img) { 25923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org for (int plane = 0; plane < 3; ++plane) { 2653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org const uint8_t *buf = img->planes[plane]; 2753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org // Calculate the width and height to do the md5 check. For the chroma 2853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org // plane, we never want to round down and thus skip a pixel so if 2953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org // we are shifting by 1 (chroma_shift) we add 1 before doing the shift. 3053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org // This works only for chroma_shift of 0 and 1. 31d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org const int bytes_per_sample = 32d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org (img->fmt & VPX_IMG_FMT_HIGHBITDEPTH) ? 2 : 1; 3353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org const int h = plane ? (img->d_h + img->y_chroma_shift) >> 3453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org img->y_chroma_shift : img->d_h; 35e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org const int w = (plane ? (img->d_w + img->x_chroma_shift) >> 36e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org img->x_chroma_shift : img->d_w) * bytes_per_sample; 37923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 38923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org for (int y = 0; y < h; ++y) { 39923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org MD5Update(&md5_, buf, w); 40923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org buf += img->stride[plane]; 41923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 42923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 43923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 44923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 45923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org const char *Get(void) { 46923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org static const char hex[16] = { 47923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org '0', '1', '2', '3', '4', '5', '6', '7', 48923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 49923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org }; 50923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org uint8_t tmp[16]; 51923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org MD5Context ctx_tmp = md5_; 52923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 53923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org MD5Final(tmp, &ctx_tmp); 54923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org for (int i = 0; i < 16; i++) { 55923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org res_[i * 2 + 0] = hex[tmp[i] >> 4]; 56923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org res_[i * 2 + 1] = hex[tmp[i] & 0xf]; 57923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 58923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org res_[32] = 0; 59923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 60923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org return res_; 61923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org } 62923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 63923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org protected: 64923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org char res_[33]; 65923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org MD5Context md5_; 66923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}; 67923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 68923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org} // namespace libvpx_test 69923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 70f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#endif // TEST_MD5_HELPER_H_ 71