tbitpack.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:8k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: tbitpack.cpp,v 1.1.1.1.50.1 2004/07/09 01:55:10 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include <stdio.h>
  50. #include <stdlib.h>
  51. #include "hxassert.h"
  52. #include "bitstream.h"
  53. #include "bitpack.h"
  54. #define VALUE_CT 100001
  55. #define BUFFER_SIZE VALUE_CT * 32 / 8
  56. #define VALUE_CT2 1001
  57. #define PACK_BUF_SIZE 100
  58. #define BUFFER_SIZE2 VALUE_CT2 * PACK_BUF_SIZE
  59. char ToHex(int i)
  60. {
  61.     static char z_hex[] = "0123456789ABCDEF";
  62.     return z_hex[i];
  63. }
  64. void ShowBuffer(unsigned char* pData, int size)
  65. {
  66.     int lines = size >> 4;
  67.     char buf[16 * 3 + 1];
  68.     int i = 0;
  69.     
  70.     printf ("ShowBuffer(%p, %d)n", pData, size);
  71.     while (i < size)
  72.     {
  73. char* pTmp = buf;
  74. int j = 0;
  75. while (j < 16)
  76. {
  77.     if (i >= size)
  78. break;
  79.     *pTmp++ = ToHex((*pData >> 4) & 0xf);
  80.     *pTmp++ = ToHex((*pData++) & 0xf);
  81.     *pTmp++ = ' ';
  82.     i++;
  83.     j++;
  84. }
  85. *pTmp = '';
  86. printf ("%sn", buf);
  87.     }
  88. }
  89. int GetValue(int i, int size)
  90. {
  91.     int ret = i;
  92.     ret = rand();
  93.     ret &= ((1 << size) - 1);
  94.     return ret;
  95. }
  96. int GetBitCount(int maxSize)
  97. {   
  98.     int mask = 1;
  99.     
  100.     while (mask <  2 * maxSize)
  101. mask = (mask << 1) | 0x1;
  102.     //int ret = MIN(24, maxSize);
  103.     int ret = (maxSize * (rand() & mask) ) / mask;
  104.     HX_ASSERT(ret <= maxSize);
  105.     return ret;
  106. }
  107. void GenBuffer(UINT8* pBuf, int size)
  108. {
  109.     for (int i = 0; i < size; i++)
  110. pBuf[i] = (UINT8)(rand() & 0xff);
  111. }
  112. int GetOffset()
  113. {
  114.     return rand() & 0x7;
  115. }
  116. bool RunTest(int run)
  117. {
  118.     // This tests basic bit operations
  119.     bool failed = false;
  120.     printf ("RunTest(%d)n", run);
  121.     UINT8 buf[BUFFER_SIZE];
  122.     BitPacker pack(buf, BUFFER_SIZE);
  123.     srand(42 * run);
  124.     for (int i = 0; i < VALUE_CT; i++)
  125.     {
  126. int bitCount = GetBitCount(31);
  127. int value = GetValue(i, bitCount);
  128. pack.PackBits(value, bitCount);
  129.     }
  130.     
  131.     srand(42 * run);
  132.     Bitstream unpack;
  133.     unpack.SetBuffer(buf);
  134.     for (int j = 0; !failed && (j < VALUE_CT); j++)
  135.     {
  136. int bitCount = GetBitCount(31);
  137. int expected = GetValue(j, bitCount);
  138. int peekVal = unpack.PeekBits(bitCount);
  139. int getVal = unpack.GetBits(bitCount);
  140. if (expected != peekVal)
  141. {
  142.     printf ("%d expect %08x peekVal %08xn",
  143.     j, expected, peekVal);
  144.     failed = true;
  145. }
  146. else if (peekVal != getVal)
  147. {
  148.     printf ("%d peekVal %08x getVal %08xn",
  149.     j, peekVal, getVal);
  150.     failed = true;
  151. }
  152.     }
  153.     return !failed;
  154. }
  155. bool RunTest2(int run)
  156. {
  157.     printf ("RunTest2(%d)n", run);
  158.     bool failed = false;
  159.     // This tests the buffer GetBits() operation
  160.     const int MaxBufferSize = 100;
  161.     const int MaxBufferBits = 8 * MaxBufferSize;
  162.     const int MaxByteCount = MaxBufferSize / 2;
  163.     const int MaxBitCount = MaxByteCount * 8;
  164.     UINT8 buf[MaxBufferSize];
  165.     GenBuffer(buf, MaxBufferSize);
  166.     UINT8 tmpBuffer[MaxBufferSize];
  167.     Bitstream baseStream;
  168.     Bitstream expectStream;
  169.     baseStream.SetBuffer(buf);
  170.     expectStream.SetBuffer(buf);
  171.     
  172.     int bitCount = 0;
  173.     for (int bitsLeft = MaxBufferBits; !failed && bitsLeft; bitsLeft -= bitCount)
  174.     {
  175. int maxBits = (bitsLeft > MaxBitCount) ? MaxBitCount : bitsLeft;
  176. bitCount = GetBitCount(maxBits);
  177. baseStream.GetBits(bitCount, tmpBuffer);
  178. int tmpBitCount = bitCount;
  179. for (int i = 0; !failed && tmpBitCount; i++)
  180. {
  181.     int a = (tmpBitCount > 8) ? 8 : tmpBitCount;
  182.     ULONG32 expect = expectStream.GetBits(a);
  183.     ULONG32 result = tmpBuffer[i];
  184.     if (a < 8)
  185. expect <<= (8 - a);
  186.     if (expect != result)
  187.     {
  188. printf ("byte %d expect %02x got %02xn",
  189. i, expect, result);
  190. failed = true;
  191.     }
  192.     
  193.     tmpBitCount -= a;
  194. }
  195.     }
  196.     return !failed;
  197. }
  198. bool CompareBuffers(const UINT8* pBuf, const UINT8* pExpect, ULONG32 bitCount)
  199. {
  200.     bool failed = false;
  201.     for (int i = 0; !failed && bitCount; i++)
  202.     {
  203. int a = (bitCount > 8) ? 8 : bitCount;
  204. ULONG32 expect = pExpect[i];
  205. ULONG32 result = pBuf[i];
  206. if (a < 8)
  207. {
  208.     ULONG32 mask = ~((1 << (8 - a)) - 1);
  209.     expect &= mask;
  210.     result &= mask;
  211. }
  212. if (expect != result)
  213. {
  214.     printf ("byte %d expect %02x got %02xn",
  215.     i, expect, result);
  216.     failed = true;
  217. }
  218. bitCount -= a;
  219.     }
  220.     return !failed;
  221. }
  222. bool RunTest3(int run)
  223. {
  224.     bool failed = false;
  225.     printf ("RunTest3(%d)n", run);
  226.     
  227.     const int MaxBufSize = 100;
  228.     const int MaxBitCount = MaxBufSize * 8;
  229.     UINT8 src[MaxBufSize];
  230.     UINT8 dst[MaxBufSize];
  231.     UINT8 expectBuf[MaxBufSize];
  232.     srand(42 * run);
  233.     for (int i = 0; !failed && (i < 1000); i++)
  234.     {
  235. BitPacker pack(dst, MaxBufSize);
  236. GenBuffer(src, MaxBufSize);
  237. ULONG32 offset = 1; //GetOffset();
  238. int bitCount = GetBitCount(MaxBitCount - offset);
  239. pack.PackBits(0xbeef, offset);
  240. pack.PackBits(src, bitCount, 0);
  241. Bitstream expectStream;
  242. expectStream.SetBuffer(dst);
  243. expectStream.GetBits(offset);
  244. expectStream.GetBits(bitCount, expectBuf);
  245. failed = !CompareBuffers(src, expectBuf, bitCount);
  246.     }
  247.     return !failed;
  248. }
  249. int main (int argc, char* argv[])
  250. {
  251.     int ret = 0;
  252.     for (int i = 1; i < 24; i++)
  253.     {
  254. if (!RunTest(i) ||
  255.     !RunTest2(i) ||
  256.     !RunTest3(i))
  257. {
  258.     ret = -1;
  259.     break;
  260. }
  261.     }
  262.     if (ret == 0)
  263. printf("Unit Test PASSEDn");
  264.     else
  265. printf("Unit Test FAILEDn");
  266.     return ret;
  267. }