git.y1.nz

fbui

Framebuffer-based graphical environment
download: https://git.y1.nz/archives/fbui.tar.gz
README | Files | Log | Refs

libfbui/MPEG/getbits.c

      1 /* getbits.c, bit level routines                                            */
      2 
      3 /*
      4  * All modifications (mpeg2decode -> mpeg2play) are
      5  * Copyright (C) 1996, Stefan Eckart. All Rights Reserved.
      6  */
      7 
      8 /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
      9 
     10 /*
     11  * Disclaimer of Warranty
     12  *
     13  * These software programs are available to the user without any license fee or
     14  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
     15  * any and all warranties, whether express, implied, or statuary, including any
     16  * implied warranties or merchantability or of fitness for a particular
     17  * purpose.  In no event shall the copyright-holder be liable for any
     18  * incidental, punitive, or consequential damages of any kind whatsoever
     19  * arising from the use of these programs.
     20  *
     21  * This disclaimer of warranty extends to the user of these programs and user's
     22  * customers, employees, agents, transferees, successors, and assigns.
     23  *
     24  * The MPEG Software Simulation Group does not represent or warrant that the
     25  * programs furnished hereunder are free of infringement of any third-party
     26  * patents.
     27  *
     28  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
     29  * are subject to royalty fees to patent holders.  Many of these patents are
     30  * general enough such that they are unavoidable regardless of implementation
     31  * design.
     32  *
     33  */
     34 
     35 #include <stdio.h>
     36 #include <stdlib.h>
     37 
     38 #include "config.h"
     39 #include "global.h"
     40 
     41 /* initialize buffer, call once before first getbits or showbits */
     42 
     43 void Initialize_Buffer()
     44 {
     45   ld->Incnt = 0;
     46   ld->Rdptr = ld->Rdbfr + 2048;
     47   ld->Rdmax = ld->Rdptr;
     48 
     49 #ifdef VERIFY
     50   /*  only the verifier uses this particular bit counter 
     51    *  Bitcnt keeps track of the current parser position with respect
     52    *  to the video elementary stream being decoded, regardless 
     53    *  of whether or not it is wrapped within a systems layer stream 
     54    */
     55   ld->Bitcnt = 0;
     56 #endif
     57 
     58   ld->Bfr = 0;
     59   Flush_Buffer(0); /* fills valid data into bfr */
     60 }
     61 
     62 void Fill_Buffer()
     63 {
     64   int Buffer_Level;
     65 
     66   Buffer_Level = read(ld->Infile,ld->Rdbfr,2048);
     67   ld->Rdptr = ld->Rdbfr;
     68 
     69   if (System_Stream_Flag)
     70     ld->Rdmax -= 2048;
     71 
     72   
     73   /* end of the bitstream file */
     74   if (Buffer_Level < 2048)
     75   {
     76     /* just to be safe */
     77     if (Buffer_Level < 0)
     78       Buffer_Level = 0;
     79 
     80     /* pad until the next to the next 32-bit word boundary */
     81     while (Buffer_Level & 3)
     82       ld->Rdbfr[Buffer_Level++] = 0;
     83 
     84 	/* pad the buffer with sequence end codes */
     85     while (Buffer_Level < 2048)
     86     {
     87       ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>24;
     88       ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>16;
     89       ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>8;
     90       ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE&0xff;
     91     }
     92   }
     93 }
     94 
     95 
     96 /* MPEG-1 system layer demultiplexer */
     97 
     98 int Get_Byte()
     99 {
    100   while(ld->Rdptr >= ld->Rdbfr+2048)
    101   {
    102     read(ld->Infile,ld->Rdbfr,2048);
    103     ld->Rdptr -= 2048;
    104     ld->Rdmax -= 2048;
    105   }
    106   return *ld->Rdptr++;
    107 }
    108 
    109 /* extract a 16-bit word from the bitstream buffer */
    110 int Get_Word()
    111 {
    112   int Val;
    113 
    114   Val = Get_Byte();
    115   return (Val<<8) | Get_Byte();
    116 }
    117 
    118 
    119 /* return next n bits (right adjusted) without advancing */
    120 
    121 unsigned int Show_Bits(N)
    122 int N;
    123 {
    124   return ld->Bfr >> (32-N);
    125 }
    126 
    127 
    128 /* return next bit (could be made faster than Get_Bits(1)) */
    129 
    130 unsigned int Get_Bits1()
    131 {
    132   return Get_Bits(1);
    133 }
    134 
    135 
    136 /* advance by n bits */
    137 
    138 void Flush_Buffer(N)
    139 int N;
    140 {
    141   int Incnt;
    142 
    143   ld->Bfr <<= N;
    144 
    145   Incnt = ld->Incnt -= N;
    146 
    147   if (Incnt <= 24)
    148   {
    149     if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
    150     {
    151       do
    152       {
    153         if (ld->Rdptr >= ld->Rdmax)
    154           Next_Packet();
    155         ld->Bfr |= Get_Byte() << (24 - Incnt);
    156         Incnt += 8;
    157       }
    158       while (Incnt <= 24);
    159     }
    160     else if (ld->Rdptr < ld->Rdbfr+2044)
    161     {
    162       do
    163       {
    164         ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
    165         Incnt += 8;
    166       }
    167       while (Incnt <= 24);
    168     }
    169     else
    170     {
    171       do
    172       {
    173         if (ld->Rdptr >= ld->Rdbfr+2048)
    174           Fill_Buffer();
    175         ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
    176         Incnt += 8;
    177       }
    178       while (Incnt <= 24);
    179     }
    180     ld->Incnt = Incnt;
    181   }
    182 
    183 #ifdef VERIFY 
    184   ld->Bitcnt += N;
    185 #endif /* VERIFY */
    186 
    187 }
    188 
    189 
    190 /* return next n bits (right adjusted) */
    191 
    192 unsigned int Get_Bits(N)
    193 int N;
    194 {
    195   unsigned int Val;
    196 
    197   Val = Show_Bits(N);
    198   Flush_Buffer(N);
    199 
    200   return Val;
    201 }
    202 

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.