Changeset 125 in SHVCSoftware for trunk/source/Lib/TLibCommon/TComPicYuvMD5.cpp
- Timestamp:
- 16 Apr 2013, 06:39:31 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/Lib/TLibCommon/TComPicYuvMD5.cpp
r2 r125 4 4 * granted under this license. 5 5 * 6 * Copyright (c) 2010-201 2, ITU/ISO/IEC6 * Copyright (c) 2010-2013, ITU/ISO/IEC 7 7 * All rights reserved. 8 8 * … … 42 42 * OUTBIT_BITDEPTH_DIV8. 43 43 */ 44 template< unsignedOUTPUT_BITDEPTH_DIV8>45 static void md5_block(MD5& md5, const Pel* plane, unsignedn)44 template<UInt OUTPUT_BITDEPTH_DIV8> 45 static void md5_block(MD5& md5, const Pel* plane, UInt n) 46 46 { 47 47 /* create a 64 byte buffer for packing Pel's into */ 48 unsigned char buf[64/OUTPUT_BITDEPTH_DIV8][OUTPUT_BITDEPTH_DIV8];49 for ( unsignedi = 0; i < n; i++)48 UChar buf[64/OUTPUT_BITDEPTH_DIV8][OUTPUT_BITDEPTH_DIV8]; 49 for (UInt i = 0; i < n; i++) 50 50 { 51 51 Pel pel = plane[i]; 52 52 /* perform bitdepth and endian conversion */ 53 for ( unsignedd = 0; d < OUTPUT_BITDEPTH_DIV8; d++)53 for (UInt d = 0; d < OUTPUT_BITDEPTH_DIV8; d++) 54 54 { 55 55 buf[i][d] = pel >> (d*8); 56 56 } 57 57 } 58 md5.update(( unsigned char*)buf, n * OUTPUT_BITDEPTH_DIV8);58 md5.update((UChar*)buf, n * OUTPUT_BITDEPTH_DIV8); 59 59 } 60 60 … … 63 63 * is adjusted to OUTBIT_BITDEPTH_DIV8. 64 64 */ 65 template< unsignedOUTPUT_BITDEPTH_DIV8>66 static void md5_plane(MD5& md5, const Pel* plane, unsigned width, unsigned height, unsignedstride)65 template<UInt OUTPUT_BITDEPTH_DIV8> 66 static void md5_plane(MD5& md5, const Pel* plane, UInt width, UInt height, UInt stride) 67 67 { 68 68 /* N is the number of samples to process per md5 update. 69 69 * All N samples must fit in buf */ 70 unsignedN = 32;71 unsignedwidth_modN = width % N;72 unsignedwidth_less_modN = width - width_modN;73 74 for ( unsignedy = 0; y < height; y++)75 { 76 /* convert pel's into unsignedchars in little endian byte order.70 UInt N = 32; 71 UInt width_modN = width % N; 72 UInt width_less_modN = width - width_modN; 73 74 for (UInt y = 0; y < height; y++) 75 { 76 /* convert pel's into UInt chars in little endian byte order. 77 77 * NB, for 8bit data, data is truncated to 8bits. */ 78 for ( unsignedx = 0; x < width_less_modN; x += N)78 for (UInt x = 0; x < width_less_modN; x += N) 79 79 md5_block<OUTPUT_BITDEPTH_DIV8>(md5, &plane[y*stride + x], N); 80 80 … … 84 84 } 85 85 86 void compCRC(const Pel* plane, unsigned int width, unsigned int height, unsigned int stride, unsigned char digest[16]) 87 { 88 unsigned int bitdepth = g_uiBitDepth + g_uiBitIncrement; 89 unsigned int dataMsbIdx = bitdepth - 1; 90 unsigned int crcMsb; 91 unsigned int bitVal; 92 unsigned int crcVal = 0xffff; 93 unsigned int bitIdx; 94 for (unsigned y = 0; y < height; y++) 95 { 96 for (unsigned x = 0; x < width; x++) 97 { 98 for(bitIdx=0; bitIdx<bitdepth; bitIdx++) 86 static void compCRC(Int bitdepth, const Pel* plane, UInt width, UInt height, UInt stride, UChar digest[16]) 87 { 88 UInt crcMsb; 89 UInt bitVal; 90 UInt crcVal = 0xffff; 91 UInt bitIdx; 92 for (UInt y = 0; y < height; y++) 93 { 94 for (UInt x = 0; x < width; x++) 95 { 96 // take CRC of first pictureData byte 97 for(bitIdx=0; bitIdx<8; bitIdx++) 99 98 { 100 99 crcMsb = (crcVal >> 15) & 1; 101 bitVal = (plane[y*stride+x] >> (dataMsbIdx - (bitIdx&dataMsbIdx))) & 1;100 bitVal = (plane[y*stride+x] >> (7 - bitIdx)) & 1; 102 101 crcVal = (((crcVal << 1) + bitVal) & 0xffff) ^ (crcMsb * 0x1021); 103 102 } 103 // take CRC of second pictureData byte if bit depth is greater than 8-bits 104 if(bitdepth > 8) 105 { 106 for(bitIdx=0; bitIdx<8; bitIdx++) 107 { 108 crcMsb = (crcVal >> 15) & 1; 109 bitVal = (plane[y*stride+x] >> (15 - bitIdx)) & 1; 110 crcVal = (((crcVal << 1) + bitVal) & 0xffff) ^ (crcMsb * 0x1021); 111 } 112 } 104 113 } 105 114 } … … 114 123 } 115 124 116 void calcCRC(TComPicYuv& pic, unsigned char digest[3][16])117 { 118 unsignedwidth = pic.getWidth();119 unsignedheight = pic.getHeight();120 unsignedstride = pic.getStride();121 122 compCRC( pic.getLumaAddr(), width, height, stride, digest[0]);125 void calcCRC(TComPicYuv& pic, UChar digest[3][16]) 126 { 127 UInt width = pic.getWidth(); 128 UInt height = pic.getHeight(); 129 UInt stride = pic.getStride(); 130 131 compCRC(g_bitDepthY, pic.getLumaAddr(), width, height, stride, digest[0]); 123 132 124 133 width >>= 1; … … 126 135 stride >>= 1; 127 136 128 compCRC(pic.getCbAddr(), width, height, stride, digest[1]); 129 compCRC(pic.getCrAddr(), width, height, stride, digest[2]); 130 } 131 132 void compChecksum(const Pel* plane, unsigned int width, unsigned int height, unsigned int stride, unsigned char digest[16]) 133 { 134 unsigned int bitdepth = g_uiBitDepth + g_uiBitIncrement; 135 136 unsigned int checksum = 0; 137 unsigned char xor_mask; 138 139 for (unsigned y = 0; y < height; y++) 140 { 141 for (unsigned x = 0; x < width; x++) 137 compCRC(g_bitDepthC, pic.getCbAddr(), width, height, stride, digest[1]); 138 compCRC(g_bitDepthC, pic.getCrAddr(), width, height, stride, digest[2]); 139 } 140 141 static void compChecksum(Int bitdepth, const Pel* plane, UInt width, UInt height, UInt stride, UChar digest[16]) 142 { 143 UInt checksum = 0; 144 UChar xor_mask; 145 146 for (UInt y = 0; y < height; y++) 147 { 148 for (UInt x = 0; x < width; x++) 142 149 { 143 150 xor_mask = (x & 0xff) ^ (y & 0xff) ^ (x >> 8) ^ (y >> 8); … … 157 164 } 158 165 159 void calcChecksum(TComPicYuv& pic, unsigned char digest[3][16])160 { 161 unsignedwidth = pic.getWidth();162 unsignedheight = pic.getHeight();163 unsignedstride = pic.getStride();164 165 compChecksum( pic.getLumaAddr(), width, height, stride, digest[0]);166 void calcChecksum(TComPicYuv& pic, UChar digest[3][16]) 167 { 168 UInt width = pic.getWidth(); 169 UInt height = pic.getHeight(); 170 UInt stride = pic.getStride(); 171 172 compChecksum(g_bitDepthY, pic.getLumaAddr(), width, height, stride, digest[0]); 166 173 167 174 width >>= 1; … … 169 176 stride >>= 1; 170 177 171 compChecksum( pic.getCbAddr(), width, height, stride, digest[1]);172 compChecksum( pic.getCrAddr(), width, height, stride, digest[2]);178 compChecksum(g_bitDepthC, pic.getCbAddr(), width, height, stride, digest[1]); 179 compChecksum(g_bitDepthC, pic.getCrAddr(), width, height, stride, digest[2]); 173 180 } 174 181 /** … … 179 186 * uses little-endian two byte words; 8bit data uses single byte words. 180 187 */ 181 void calcMD5(TComPicYuv& pic, unsigned char digest[3][16]) 182 { 183 unsigned bitdepth = g_uiBitDepth + g_uiBitIncrement; 188 void calcMD5(TComPicYuv& pic, UChar digest[3][16]) 189 { 184 190 /* choose an md5_plane packing function based on the system bitdepth */ 185 typedef void (*MD5PlaneFunc)(MD5&, const Pel*, unsigned, unsigned, unsigned);191 typedef void (*MD5PlaneFunc)(MD5&, const Pel*, UInt, UInt, UInt); 186 192 MD5PlaneFunc md5_plane_func; 187 md5_plane_func = bitdepth<= 8 ? (MD5PlaneFunc)md5_plane<1> : (MD5PlaneFunc)md5_plane<2>;193 md5_plane_func = g_bitDepthY <= 8 ? (MD5PlaneFunc)md5_plane<1> : (MD5PlaneFunc)md5_plane<2>; 188 194 189 195 MD5 md5Y, md5U, md5V; 190 unsignedwidth = pic.getWidth();191 unsignedheight = pic.getHeight();192 unsignedstride = pic.getStride();196 UInt width = pic.getWidth(); 197 UInt height = pic.getHeight(); 198 UInt stride = pic.getStride(); 193 199 194 200 md5_plane_func(md5Y, pic.getLumaAddr(), width, height, stride); 195 201 md5Y.finalize(digest[0]); 196 202 203 md5_plane_func = g_bitDepthC <= 8 ? (MD5PlaneFunc)md5_plane<1> : (MD5PlaneFunc)md5_plane<2>; 197 204 width >>= 1; 198 205 height >>= 1;
Note: See TracChangeset for help on using the changeset viewer.