putbits.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:2k
源码类别:

DVD

开发平台:

Others

  1. #include "Includesysdefs.h"
  2. #include "PlaycoreCaptureLogompeg_encenc_io.h"
  3. #include "PlaycoreCaptureLogompeg_encmpeg_defs.h"
  4. #include "PlaycoreCaptureLogompeg_encputbits.h"
  5. #include "PlaycoreCaptureLogompeg_encenc.h"
  6. #ifdef SUPPORT_CAPTURE_LOGO
  7. void putsyshdr(void)
  8. {
  9. putbits(PACK_START_CODE,32);
  10. putbits(0x44000404L,32);
  11. putbits(0x94AD0189L,32);
  12. putbits(0xC3F80000L,32);
  13. putbits(0x01E007ECL,32);
  14. putbits(0x81C10D31L,32);
  15. putbits(0x0001AEE9L,32);
  16. putbits(0x11000192L,32);
  17. putbits(0xC91E60E8L,32);
  18. }
  19. /* initialize buffer, call once before first putbits or alignbits */
  20. void initbits(void)
  21. {
  22.   pLogoCapture->outcnt = 16;
  23.   pLogoCapture->bytecnt = 0;
  24.   pLogoCapture->sectors_cnt = 0;
  25. }
  26. /* write rightmost n (0<=n<=32) bits of val to outfile */
  27. int putbits(long val,int n)
  28. {
  29.   int i;
  30.   unsigned long mask;  
  31.   mask = 1UL << (n-1); /* selects first (leftmost) bit */
  32.   for (i=0; i<n; i++)
  33.   {
  34.     pLogoCapture->outbfr <<= 1;
  35.     if (val & mask)
  36.       pLogoCapture->outbfr|= 1;
  37.     mask >>= 1; /* select next bit */
  38.     pLogoCapture->outcnt--;
  39.     if (pLogoCapture->outcnt==0) /* 8 bit buffer full */
  40.     {
  41.       output(pLogoCapture->outbfr);
  42.       pLogoCapture->outcnt = 16;
  43.       pLogoCapture->bytecnt++;
  44.   if( !(pLogoCapture->bytecnt % 1024) )
  45.   {
  46.       pLogoCapture->bytecnt=0;
  47.   pLogoCapture->sectors_cnt ++;
  48.   putsyshdr();
  49.   }
  50.     }
  51.   }
  52.   return 1;
  53. }
  54. /* zero bit stuffing to next byte boundary (5.2.3, 6.2.1) */
  55. void alignbits(void)
  56. {
  57.   if (pLogoCapture->outcnt!=8 && pLogoCapture->outcnt!=16)
  58.   {
  59.     putbits(0,pLogoCapture->outcnt&0x7);
  60.   }
  61. }
  62. /* return total number of generated bits */
  63. int bitcount(void)
  64. {
  65.   return 16*pLogoCapture->bytecnt + (16-pLogoCapture->outcnt);
  66. }
  67. int alignsector(void)
  68. {
  69. int i;
  70. alignbits();
  71. if(pLogoCapture->bytecnt!=0)
  72. {
  73. for(i=pLogoCapture->bytecnt;i<1024;i++)
  74. {
  75. output(0);
  76. }
  77. pLogoCapture->sectors_cnt ++;
  78. }
  79. return pLogoCapture->sectors_cnt;
  80. }
  81. #endif