Main Page | File List

GETBITS.C

00001 /* getbits.c, bit level routines                                            */
00002 
00003 /*
00004  * tmndecode 
00005  * Copyright (C) 1995 Telenor R&D
00006  *                    Karl Olav Lillevold <kol@nta.no>                    
00007  *
00008  * based on mpeg2decode, (C) 1994, MPEG Software Simulation Group
00009  * and mpeg2play, (C) 1994 Stefan Eckart
00010  *                         <stefan@lis.e-technik.tu-muenchen.de>
00011  *
00012  */
00013 #define GLOBAL
00014 
00015 #include <io.h>
00016 #include <stdlib.h>
00017 #include <stdio.h>
00018 #include <memory.h>
00019 
00020 #include "config.h"
00021 #include "global.h"
00022 
00023 
00024 /* to mask the n least significant bits of an integer */
00025 
00026 static unsigned int msk[33] =
00027 {
00028   0x00000000,0x00000001,0x00000003,0x00000007,
00029   0x0000000f,0x0000001f,0x0000003f,0x0000007f,
00030   0x000000ff,0x000001ff,0x000003ff,0x000007ff,
00031   0x00000fff,0x00001fff,0x00003fff,0x00007fff,
00032   0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
00033   0x000fffff,0x001fffff,0x003fffff,0x007fffff,
00034   0x00ffffff,0x01ffffff,0x03ffffff,0x07ffffff,
00035   0x0fffffff,0x1fffffff,0x3fffffff,0x7fffffff,
00036   0xffffffff
00037 };
00038 
00039 
00040 /* initialize buffer, call once before first getbits or showbits */
00041 
00042 void initbits()
00043 {
00044   ld->incnt = 0;
00045   ld->rdptr = ld->rdbfr + recv_buf_size;
00046   ld->bitcnt = 0;
00047 
00048 }
00049 
00050 void fillbfr()
00051 {
00052   int l;
00053 
00054   ld->inbfr[0] = ld->inbfr[8];
00055   ld->inbfr[1] = ld->inbfr[9];
00056   ld->inbfr[2] = ld->inbfr[10];
00057   ld->inbfr[3] = ld->inbfr[11];
00058 
00059   // bits_recv_buf: bit count in the recv buffer
00060   if (ld->rdptr >= ld->rdbfr + bits_recv_buf)
00061   {
00062         bits_recv_buf = recv(ld->pDataSock, recv_buf, recv_buf_size, 0);
00063         if((bits_recv_buf==SOCKET_ERROR)||(bits_recv_buf==0))
00064         {
00065                 closesocket(ld->pDataSock);
00066                 bits_recv_buf = 0;
00067                 while (bits_recv_buf < recv_buf_size)          /* Add recognizable sequence end code */
00068                 {
00069                         ld->rdbfr[bits_recv_buf ++] = 0;
00070                         ld->rdbfr[bits_recv_buf ++] = 0;
00071                         ld->rdbfr[bits_recv_buf ++] = (1 << 7) | (SE_CODE << 2);
00072                 }
00073                 //      fclose(video);    
00074                 bits_recv_buf = recv_buf_size;
00075         }
00076         else
00077         {
00078                 //      fwrite(recv_buf, 1, bits_recv_buf, video);  
00079                 memcpy(ld->rdbfr, recv_buf, bits_recv_buf);
00080         }
00081                         
00082         ld->rdptr = ld->rdbfr;
00083   }
00084 
00085   for (l = 0; l < 8; l++)
00086         ld->inbfr[l + 4] = ld->rdptr[l];
00087 
00088   ld->rdptr += 8;
00089   ld->incnt += 64;
00090 }
00091 
00092 
00093 /* return next n bits (right adjusted) without advancing */
00094 
00095 unsigned int showbits(n)
00096 int n;
00097 {
00098   unsigned char *v;
00099   unsigned int b;
00100   int c;
00101 
00102   if (ld->incnt<n)
00103     fillbfr();
00104 
00105   v = ld->inbfr + ((96 - ld->incnt)>>3);
00106   b = (v[0]<<24) | (v[1]<<16) | (v[2]<<8) | v[3];
00107   c = ((ld->incnt-1) & 7) + 25;
00108   return (b>>(c-n)) & msk[n];
00109 }
00110 
00111 
00112 /* return next bit (could be made faster than getbits(1)) */
00113 
00114 unsigned int getbits1()
00115 {
00116   return getbits(1);
00117 }
00118 
00119 
00120 /* advance by n bits */
00121 
00122 void flushbits(n)
00123 int n;
00124 {
00125 
00126   ld->bitcnt+= n;
00127   ld->incnt-= n;
00128   if (ld->incnt < 0)
00129     fillbfr();
00130 }
00131 
00132 
00133 /* return next n bits (right adjusted) */
00134 
00135 unsigned int getbits(n)
00136 int n;
00137 {
00138   unsigned int l;
00139 
00140   l = showbits(n);
00141   flushbits(n);
00142 
00143   return l;
00144 }

Generated on Mon May 8 22:27:08 2006 by  doxygen 1.3.9.1