common.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "common.h"
  5. char *layer_names[3] = { "I", "II", "III" };
  6. int bitrate[3][15] = {
  7. {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
  8. {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
  9. {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}
  10. };
  11. double  s_freq[4] = {44.1, 48, 32, 0};
  12. char *mode_names[4] = { "stereo", "j-stereo", "dual-ch", "single-ch" };
  13. FILE *OpenTableFile(char *name)
  14. {
  15. char fulname[80];
  16. FILE *f;
  17. fulname[0] = '';
  18. strcat(fulname, name);
  19. if( (f=fopen(fulname,"r"))==NULL ) {
  20. fprintf(stderr,"nOpenTable: could not find %sn", fulname);
  21.     }
  22.     return f;
  23. }
  24. void WriteHdr(frame_params *fr_ps)
  25. {
  26. layer *info = fr_ps->header;
  27. printf("HDR:  sync=FFF, id=%X, layer=%X, ep=%X, br=%X, sf=%X, pd=%X, ",
  28. info->version, info->lay, !info->error_protection,
  29. info->bitrate_index, info->sampling_frequency, info->padding);
  30. printf("pr=%X, m=%X, js=%X, c=%X, o=%X, e=%Xn",
  31. info->extension, info->mode, info->mode_ext,
  32. info->copyright, info->original, info->emphasis);
  33. printf("layer=%s, tot bitrate=%d, sfrq=%.1f, mode=%s, ",
  34. layer_names[info->lay-1], bitrate[info->lay-1][info->bitrate_index],
  35. s_freq[info->sampling_frequency], mode_names[info->mode]);
  36. printf("sblim=%d, jsbd=%d, ch=%dn",
  37. fr_ps->sblimit, fr_ps->jsbound, fr_ps->stereo);
  38. }
  39. void *mem_alloc(unsigned long block, char *item)
  40. {
  41. void *ptr;
  42. ptr = (void *)malloc((unsigned long)block);
  43. if (ptr != NULL)
  44. memset(ptr, 0, block);
  45. else{
  46. printf("Unable to allocate %sn", item);
  47. exit(0);
  48. }
  49. return ptr;
  50. }
  51. /*打开并初始化缓冲区; */
  52. void alloc_buffer(Bit_stream_struc *bs, int size)
  53. {
  54. bs->buf = (unsigned char *) mem_alloc(size*sizeof(unsigned char), "buffer");
  55. bs->buf_size = size;
  56. }
  57. void desalloc_buffer(Bit_stream_struc *bs)
  58. {
  59. free(bs->buf);
  60. }
  61. /* 打开设备并读取比特流 */
  62. void open_bit_stream_r(Bit_stream_struc *bs, char *bs_filenam, int size)
  63. {
  64. register unsigned char flag = 1;
  65. if ((bs->pt = fopen(bs_filenam, "rb")) == NULL) {
  66. printf("Could not find "%s".n", bs_filenam);
  67. exit(1);
  68. }
  69. bs->format = BINARY;
  70. alloc_buffer(bs, size);
  71. bs->buf_byte_idx=0;
  72. bs->buf_bit_idx=0;
  73. bs->totbit=0;
  74. bs->mode = READ_MODE;
  75. bs->eob = FALSE;
  76. bs->eobs = FALSE;
  77. }
  78. void close_bit_stream_r(Bit_stream_struc *bs)
  79. {
  80. fclose(bs->pt);
  81. desalloc_buffer(bs);
  82. }
  83. /*返回比特流的状态*/
  84. /* 如果到达比特流的末尾则返回1 */
  85. /* 如果不能到达比特流的末尾则返回0*/
  86. int end_bs(Bit_stream_struc *bs)
  87. {
  88.   return(bs->eobs);
  89. }
  90. /*返回当前比特流的长度 (bits)*/
  91. unsigned long sstell(Bit_stream_struc *bs)
  92. {
  93.   return(bs->totbit);
  94. }
  95. void refill_buffer(Bit_stream_struc *bs)
  96. {
  97. register int i=bs->buf_size-2-bs->buf_byte_idx;
  98. register unsigned long n=1;
  99. while ((i>=0) && (!bs->eob)) {
  100. n=fread(&bs->buf[i--], sizeof(unsigned char), 1, bs->pt);
  101. if (!n)
  102. bs->eob= i+1;
  103. }
  104. }
  105. int mask[8]={0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
  106. /*从比特流中读取1比特*/
  107. unsigned int get1bit(Bit_stream_struc *bs)
  108. {
  109.    unsigned int bit;
  110.    register int i;
  111.    bs->totbit++;
  112.    if (!bs->buf_bit_idx) {
  113.         bs->buf_bit_idx = 8;
  114.         bs->buf_byte_idx--;
  115.         if ((bs->buf_byte_idx < MINIMUM) || (bs->buf_byte_idx < bs->eob)) {
  116.              if (bs->eob)
  117.                 bs->eobs = TRUE;
  118.              else {
  119.                 for (i=bs->buf_byte_idx; i>=0;i--)
  120.                   bs->buf[bs->buf_size-1-bs->buf_byte_idx+i] = bs->buf[i];
  121.                 refill_buffer(bs);
  122.                 bs->buf_byte_idx = bs->buf_size-1;
  123.              }
  124.         }
  125.    }
  126.    bit = bs->buf[bs->buf_byte_idx]&mask[bs->buf_bit_idx-1];
  127.    bit = bit >> (bs->buf_bit_idx-1);
  128.    bs->buf_bit_idx--;
  129.    return(bit);
  130. }
  131. int putmask[9]={0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
  132. /*从比特流中读取N比特 */
  133. unsigned long getbits(Bit_stream_struc *bs, int N)
  134. {
  135. unsigned long val=0;
  136. register int i;
  137. register int j = N;
  138. register int k, tmp;
  139. if (N > MAX_LENGTH)
  140. printf("Cannot read or write more than %d bits at a time.n", MAX_LENGTH);
  141. bs->totbit += N;
  142. while (j > 0) {
  143. if (!bs->buf_bit_idx) {
  144. bs->buf_bit_idx = 8;
  145. bs->buf_byte_idx--;
  146. if ((bs->buf_byte_idx < MINIMUM) || (bs->buf_byte_idx < bs->eob)) {
  147. if (bs->eob)
  148. bs->eobs = TRUE;
  149. else {
  150. for (i=bs->buf_byte_idx; i>=0;i--)
  151. bs->buf[bs->buf_size-1-bs->buf_byte_idx+i] = bs->buf[i];
  152. refill_buffer(bs);
  153. bs->buf_byte_idx = bs->buf_size-1;
  154. }
  155. }
  156. }
  157. k = MIN(j, bs->buf_bit_idx);
  158. tmp = bs->buf[bs->buf_byte_idx]&putmask[bs->buf_bit_idx];
  159. tmp = tmp >> (bs->buf_bit_idx-k);
  160. val |= tmp << (j-k);
  161. bs->buf_bit_idx -= k;
  162. j -= k;
  163. }
  164. return val;
  165. }
  166. int seek_sync(Bit_stream_struc *bs, unsigned long sync, int N)
  167. {
  168. unsigned long aligning;
  169. unsigned long val;
  170. long maxi = (int)pow(2.0, (double)N) - 1;
  171. aligning = sstell(bs)%ALIGNING;
  172. if (aligning)
  173. getbits(bs, (int)(ALIGNING-aligning));
  174. val = getbits(bs, N);
  175. while (((val&maxi) != sync) && (!end_bs(bs))) {
  176. val <<= ALIGNING;
  177. val |= getbits(bs, ALIGNING);
  178. }
  179. if (end_bs(bs))
  180. return(0);
  181. else
  182. return(1);
  183. }
  184. int js_bound(int lay, int m_ext)
  185. {
  186. static int jsb_table[3][4] =  {
  187. { 4, 8, 12, 16 },
  188. { 4, 8, 12, 16},
  189. { 0, 4, 8, 16}
  190. };  /* lay+m_e -> jsbound */
  191.     if(lay<1 || lay >3 || m_ext<0 || m_ext>3) {
  192.         fprintf(stderr, "js_bound bad layer/modext (%d/%d)n", lay, m_ext);
  193.         exit(1);
  194.     }
  195. return(jsb_table[lay-1][m_ext]);
  196. }
  197. /* 将数据从hdr结构翻译为fr_ps */
  198. void hdr_to_frps(frame_params *fr_ps)
  199. {
  200. layer *hdr = fr_ps->header;     /* (or pass in as arg?) */
  201. fr_ps->actual_mode = hdr->mode;
  202. fr_ps->stereo = (hdr->mode == MPG_MD_MONO) ? 1 : 2;
  203. fr_ps->sblimit = SBLIMIT;
  204. if(hdr->mode == MPG_MD_JOINT_STEREO)
  205. fr_ps->jsbound = js_bound(hdr->lay, hdr->mode_ext);
  206. else
  207. fr_ps->jsbound = fr_ps->sblimit;
  208. }
  209. #define BUFSIZE 4096
  210. static unsigned int buf[BUFSIZE];
  211. static unsigned int buf_bit_idx=8;
  212. static unsigned long offset, totbit=0, buf_byte_idx=0;
  213. void hputbuf(unsigned int val, int N)
  214. {
  215. if (N != 8) {
  216. printf("Not Supported yet!!n");
  217. exit(-3);
  218. }
  219. buf[offset % BUFSIZE] = val;
  220. offset++;
  221. }
  222. /*返回当前比特流的长度 (bits)*/
  223. unsigned long hsstell()
  224. {
  225. return(totbit);
  226. }
  227. /*从比特流中读取N比特*/
  228. unsigned long hgetbits(int N)
  229. {
  230. unsigned long val=0;
  231. register int j = N;
  232. register int k, tmp;
  233. /*
  234.  if (N > MAX_LENGTH)
  235.  printf("Cannot read or write more than %d bits at a time.n", MAX_LENGTH);
  236. */
  237. totbit += N;
  238. while (j > 0) {
  239. if (!buf_bit_idx) {
  240. buf_bit_idx = 8;
  241. buf_byte_idx++;
  242. if (buf_byte_idx > offset) {
  243. printf("Buffer overflow !!n");
  244. exit(3);
  245. }
  246. }
  247. k = MIN(j, buf_bit_idx);
  248. tmp = buf[buf_byte_idx%BUFSIZE]&putmask[buf_bit_idx];
  249. tmp = tmp >> (buf_bit_idx-k);
  250. val |= tmp << (j-k);
  251. buf_bit_idx -= k;
  252. j -= k;
  253. }
  254. return(val);
  255. }
  256. unsigned int hget1bit()
  257. {
  258. return(hgetbits(1));
  259. }
  260. void rewindNbits(int N)
  261. {
  262. totbit -= N;
  263. buf_bit_idx += N;
  264. while( buf_bit_idx >= 8 ){
  265. buf_bit_idx -= 8;
  266. buf_byte_idx--;
  267. }
  268. }
  269. void rewindNbytes(int N)
  270. {
  271. totbit -= N*8;
  272. buf_byte_idx -= N;
  273. }