vlc.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:4k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: vlc.c 287 2005-10-07 17:49:26Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "common.h"
  24. // 16bit vlc table
  25. // 
  26. // data = 4bit bits | 12bit data
  27. // subtable = 1|1|4bit tabbits|10bit offset*8
  28. typedef struct buildstate
  29. {
  30. vlc* table;
  31. int sizealign;
  32. int size;
  33. int pos;
  34. int escape;
  35. const uint8_t* code;
  36. bool_t code32;
  37. const uint16_t* data;
  38. int count;
  39. } buildstate;
  40. static bool_t buildvlc(buildstate* v, int tabbits, int prefix, int prefixbits)
  41. {
  42. int data,code,bits,i,j,n;
  43. uint16_t* p;
  44. int size = 1 << tabbits;
  45. int pos = v->pos;
  46. v->pos += size;
  47. if (v->pos > v->size)
  48. {
  49. // realloc table
  50. int size = (v->pos + v->sizealign) & ~v->sizealign; 
  51. uint16_t* table;
  52. table = (uint16_t*) realloc(v->table,size*sizeof(uint16_t));
  53. if (!table)
  54. return 0;
  55. //memset(table+v->pos,0xFE,(size-v->pos)*sizeof(uint16_t)); //mark unused
  56. v->size = size;
  57. v->table = table;
  58. }
  59. p = v->table + pos;
  60. for (i=0;i<size;++i)
  61. p[i] = (uint16_t)v->escape;
  62. for (i=0;i<v->count;++i)
  63. {
  64. if (v->code32)
  65. {
  66. code = ((uint32_t*)v->code)[i];
  67. bits = code & 31;
  68. code >>= 5;
  69. }
  70. else
  71. {
  72. code = ((uint16_t*)v->code)[i];
  73. bits = v->data[i] >> 12;
  74. }
  75. if (v->data)
  76. data = v->data[i] & 0xFFF;
  77. else
  78. data = i;
  79. bits -= prefixbits;
  80.         if (bits > 0 && (code >> bits) == prefix) 
  81. {
  82.             if (bits <= tabbits) 
  83. {
  84. // store data and bits
  85.                 j = (code << (tabbits - bits)) & (size - 1);
  86.                 n = j+(1 << (tabbits - bits));
  87.                 for (;j<n;j++) 
  88. p[j] = (uint16_t)((bits << 12) | data);
  89.             } 
  90. else 
  91. {
  92. // subtable
  93.                 bits -= tabbits;
  94.                 j = (code >> bits) & (size - 1);
  95. if (p[j] == v->escape)
  96. n = bits;
  97. else
  98. {
  99. n = p[j] & 31;
  100. if (bits > n)
  101. n = bits;
  102. }
  103.                 p[j] = (uint16_t)(0xC000 | n);
  104.             }
  105.         }
  106. }
  107. // create subtables
  108. for (i=0;i<size;++i)
  109. if ((p[i] >> 12) >= 12)
  110. {
  111. bits = p[i] & 31;
  112. if (bits > tabbits)
  113. bits = tabbits;
  114. j = v->pos - pos;
  115. // align to 8*offset
  116. if (j & 7)
  117. {
  118. n = 8 - (j & 7);
  119. v->pos += n;
  120. j += n;
  121. }
  122. assert(j<1024*8);
  123. p[i] = (uint16_t)(0xC000 | (bits << 10) | (j >> 3));
  124. if (!buildvlc(v,bits,(prefix << tabbits)|i, prefixbits+tabbits))
  125. return 0;
  126. p = v->table + pos;
  127. }
  128. return 1;
  129. }
  130. bool_t vlcinit(vlc** table, int* size, const void* code, bool_t code32, const uint16_t* data, int num, int escape, int bits)
  131. {
  132. bool_t Result;
  133. buildstate v;
  134. v.table = *table;
  135. v.sizealign = (1<<bits)-1;
  136. v.size = size?*size:0;
  137. v.pos = 0;
  138. v.code = (const uint8_t*)code;
  139. v.data = data;
  140. v.code32 = code32;
  141. v.count = num;
  142. v.escape = escape & 0xFFF;
  143. Result = buildvlc(&v,bits,0,0);
  144. *table = v.table;
  145. if (size) *size = v.size;
  146. return Result;
  147. }
  148. void vlcdone(vlc** v,int *size)
  149. {
  150. free(*v); 
  151. *v = NULL;
  152. if (size) 
  153. *size = 0;
  154. }