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

📄 c_getbits.h

📁 基于linux的DVD播放器程序
💻 H
字号:
#ifndef C_GETBITS_H_INCLUDED#define C_GETBITS_H_INCLUDED/* Ogle - A video player * Copyright (C) 2000, 2001 Bj鰎n Englund, H錵an Hjort * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <inttypes.h>#include "ogle_endian.h"#include "video_types.h"//#define GETBITS32#define GETBITS64#define GETBITSMMAP#ifdef GETBITSMMAP // Mmap i/ovoid setup_mmap(char *);void get_next_packet(void);extern uint32_t *buf;extern uint32_t buf_size;extern uint32_t packet_offset;extern uint32_t packet_length;extern uint8_t *mmap_base;#else // Normal i/o#define READ_SIZE 1024*8#define ALLOC_SIZE 2048#define BUF_SIZE_MAX 1024*8extern uint32_t buf[];#endif // Commonextern FILE *infile;extern char *infilename;#ifdef GETBITS32void back_word(void);void next_word(void);extern unsigned int backed;extern unsigned int buf_pos;extern unsigned int bits_left;extern uint32_t cur_word;#endif#ifdef GETBITS64void read_buf(void);extern int offs;extern unsigned int bits_left;extern uint64_t cur_word;#endif#ifdef DEBUG#define GETBITS(a,b) getbits(a,b)#else#define GETBITS(a,b) getbits(a)#endif/* ---------------------------------------------------------------------- */#ifdef GETBITS64#ifdef GETBITSMMAP // (64bit) Discontinuous buffers of variable size/* 5.2.2 Definition of nextbits() function */static inlineuint32_t nextbits(unsigned int nr){  uint32_t result = (cur_word << (64-bits_left)) >> 32;  return result >> (32-nr);  //  return (cur_word << (64-bits_left)) >> (64-nr);}#ifdef DEBUGstatic inlineuint32_t getbits(unsigned int nr, char *func)#elsestatic inlineuint32_t getbits(unsigned int nr)#endif{  uint32_t result;  result = (cur_word << (64-bits_left)) >> 32;  result = result >> (32-nr);  //  result = cur_word >> (64-nr); //+  //  cur_word = cur_word << nr; //+    bits_left -= nr;  if(bits_left <= 32) {    if(offs >= buf_size) {      read_buf();   } else {      uint32_t new_word = FROM_BE_32(buf[offs++]);      cur_word = (cur_word << 32) | new_word;      //cur_word = cur_word | (((uint64_t)new_word) << (32-bits_left)); //+      bits_left += 32;    }  }  DPRINTF(5, "%s getbits(%u): %x, ", func, nr, result);  DPRINTBITS(6, nr, result);  DPRINTF(5, "\n");  return result;}static inlinevoid dropbits(unsigned int nr){  //cur_word = cur_word << nr; //+  bits_left -= nr;  if(bits_left <= 32) {    if(offs >= buf_size)      read_buf();    else {      uint32_t new_word = FROM_BE_32(buf[offs++]);      cur_word = (cur_word << 32) | new_word;      //cur_word = cur_word | (((uint64_t)new_word) << (32-bits_left)); //+      bits_left += 32;    }  }}#endif#endif/* ---------------------------------------------------------------------- */#ifdef GETBITS64#ifndef GETBITSMMAP // (64bit) Discontinuous buffers of *static* size/* 5.2.2 Definition of nextbits() function */static inlineuint32_t nextbits(unsigned int nr){  uint32_t result = (cur_word << (64-bits_left)) >> 32;  return result >> (32-nr);}#ifdef DEBUGstatic inlineuint32_t getbits(unsigned int nr, char *func)#elsestatic inlineuint32_t getbits(unsigned int nr)#endif{  uint32_t result;  result = (cur_word << (64-bits_left)) >> 32;  result = result >> (32-nr);  bits_left -=nr;  if(bits_left <= 32) {    uint32_t new_word = FROM_BE_32(buf[offs++]);    if(offs >= READ_SIZE/4)      read_buf();    cur_word = (cur_word << 32) | new_word;    bits_left += 32;  }  DPRINTF(5, "%s getbits(%u): %x, ", func, nr, result);  DPRINTBITS(6, nr, result);  DPRINTF(5, "\n");  return result;}static inlinevoid dropbits(unsigned int nr){  bits_left -= nr;  if(bits_left <= 32) {    uint32_t new_word = FROM_BE_32(buf[offs++]);    if(offs >= READ_SIZE/4)      read_buf();    cur_word = (cur_word << 32) | new_word;    bits_left += 32;  }}#endif#endif/* ---------------------------------------------------------------------- */#ifdef GETBITS32  // (32bit) 'Normal' getbits, word based.#ifdef DEBUGstatic inlineuint32_t getbits(unsigned int nr, char *func)#elsestatic inlineuint32_t getbits(unsigned int nr)#endif{  uint32_t result;  uint32_t rem;  if(nr <= bits_left) {    result = (cur_word << (32-bits_left)) >> (32-nr);    bits_left -=nr;    if(bits_left == 0) {      next_word();      bits_left = 32;    }   } else {    rem = nr-bits_left;    result = ((cur_word << (32-bits_left)) >> (32-bits_left)) << rem;    next_word();    bits_left = 32;    result |= ((cur_word << (32-bits_left)) >> (32-rem));    bits_left -=rem;    if(bits_left == 0) {      next_word();      bits_left = 32;    }  }  DPRINTF(5,"%s getbits(%u): %x ", func, nr, result);  DPRINTBITS(6, nr, result);  DPRINTF(5, "\n");  return result;}static inlinevoid dropbits(unsigned int nr){  bits_left -= nr;  if(bits_left <= 0) {    next_word();    bits_left += 32;  } }/* 5.2.2 Definition of nextbits() function */static inlineuint32_t nextbits(unsigned int nr){  uint32_t result;  uint32_t rem;  unsigned int t_bits_left = bits_left;  if(nr <= t_bits_left) {    result = (cur_word << (32-t_bits_left)) >> (32-nr);  } else {    rem = nr-t_bits_left;    result = ((cur_word << (32-t_bits_left)) >> (32-t_bits_left)) << rem;    t_bits_left = 32;    next_word();    result |= ((cur_word << (32-t_bits_left)) >> (32-rem));    back_word();  }  return result;}#endif/* ---------------------------------------------------------------------- *//* 5.2.1 Definition of bytealigned() function */static inlineint bytealigned(void){  return !(bits_left%8);}#ifdef DEBUGstatic inlinevoid marker_bit(void){  if(!GETBITS(1, "markerbit")) {    fprintf(stderr, "*** video_decoder: incorrect marker_bit in stream\n");    //exit_program(-1);  }}#else // DEBUGstatic inlinevoid marker_bit(void){  dropbits(1);}#endif //DEBUG#endif /* C_GETBITS_H_INCLUDED */

⌨️ 快捷键说明

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