⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getbits.c

📁 DirectFB-1.0.1可用于linux的嵌入式GUI
💻 C
字号:
/* getbits.c, bit level routines                                            *//* * All modifications (mpeg2decode -> mpeg2play) are * Copyright (C) 1996, Stefan Eckart. All Rights Reserved. *//* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. *//* * Disclaimer of Warranty * * These software programs are available to the user without any license fee or * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims * any and all warranties, whether express, implied, or statuary, including any * implied warranties or merchantability or of fitness for a particular * purpose.  In no event shall the copyright-holder be liable for any * incidental, punitive, or consequential damages of any kind whatsoever * arising from the use of these programs. * * This disclaimer of warranty extends to the user of these programs and user's * customers, employees, agents, transferees, successors, and assigns. * * The MPEG Software Simulation Group does not represent or warrant that the * programs furnished hereunder are free of infringement of any third-party * patents. * * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, * are subject to royalty fees to patent holders.  Many of these patents are * general enough such that they are unavoidable regardless of implementation * design. * */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include "global.h"/* initialize buffer, call once before first getbits or showbits */voidMPEG2_Initialize_Buffer(MPEG2_Decoder *dec){     dec->Incnt = 0;     dec->Rdptr = dec->Rdbfr + 2048;     dec->Rdmax = dec->Rdptr;     dec->Bfr = 0;     MPEG2_Flush_Buffer(dec, 0); /* fills valid data into bfr */}voidMPEG2_Fill_Buffer(MPEG2_Decoder *dec){     int Buffer_Level;     Buffer_Level = dec->mpeg2_read (dec->Rdbfr, 2048, dec->mpeg2_read_ctx);     dec->Rdptr = dec->Rdbfr;     /* end of the bitstream file */     if (Buffer_Level < 2048) {          /* just to be safe */          if (Buffer_Level < 0)               Buffer_Level = 0;          /* pad until the next to the next 32-bit word boundary */          while (Buffer_Level & 3)               dec->Rdbfr[Buffer_Level++] = 0;          /* pad the buffer with sequence end codes */          while (Buffer_Level < 2048) {               dec->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>24;               dec->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>16;               dec->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>8;               dec->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE&0xff;          }     }}/* return next n bits (right adjusted) without advancing */unsigned intMPEG2_Show_Bits(MPEG2_Decoder *dec, int N){     return dec->Bfr >> (32-N);}/* return next bit (could be made faster than MPEG2_Get_Bits(1)) */unsigned intMPEG2_Get_Bits1(MPEG2_Decoder *dec){     return MPEG2_Get_Bits(dec, 1);}/* advance by n bits */voidMPEG2_Flush_Buffer(MPEG2_Decoder *dec, int N){     int Incnt;     dec->Bfr <<= N;     Incnt = dec->Incnt -= N;     if (Incnt <= 24) {          if (dec->Rdptr < dec->Rdbfr+2044) {               do {                    dec->Bfr |= *dec->Rdptr++ << (24 - Incnt);                    Incnt += 8;               }               while (Incnt <= 24);          }          else {               do {                    if (dec->Rdptr >= dec->Rdbfr+2048)                         MPEG2_Fill_Buffer(dec);                    dec->Bfr |= *dec->Rdptr++ << (24 - Incnt);                    Incnt += 8;               }               while (Incnt <= 24);          }          dec->Incnt = Incnt;     }}/* return next n bits (right adjusted) */unsigned intMPEG2_Get_Bits(MPEG2_Decoder *dec, int N){     unsigned int Val;     Val = MPEG2_Show_Bits(dec, N);     MPEG2_Flush_Buffer(dec, N);     return Val;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -