📄 getbit.c
字号:
/* 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 "global.h"
#include "getbit.h"
__forceinline static unsigned int Get_Short(void);
void Initialize_Buffer()
{
Rdptr = Rdbfr + BUFFER_SIZE;
Rdmax = Rdptr;
if (SystemStream_Flag)
{
if (Rdptr >= Rdmax)
Next_Packet();
CurrentBfr = *Rdptr++ << 24;
if (Rdptr >= Rdmax)
Next_Packet();
CurrentBfr += *Rdptr++ << 16;
if (Rdptr >= Rdmax)
Next_Packet();
CurrentBfr += *Rdptr++ << 8;
if (Rdptr >= Rdmax)
Next_Packet();
CurrentBfr += *Rdptr++;
Fill_Next();
}
else
{
Fill_Buffer();
CurrentBfr = (*Rdptr << 24) + (*(Rdptr+1) << 16) + (*(Rdptr+2) << 8) + *(Rdptr+3);
Rdptr += 4;
Fill_Next();
}
BitsLeft = 32;
}
unsigned int Get_Bits_All(unsigned int N)
{
N -= BitsLeft;
Val = (CurrentBfr << (32 - BitsLeft)) >> (32 - BitsLeft);
if (N != 0)
Val = (Val << N) + (NextBfr >> (32 - N));
CurrentBfr = NextBfr;
BitsLeft = 32 - N;
Fill_Next();
return Val;
}
void Flush_Buffer_All(unsigned int N)
{
CurrentBfr = NextBfr;
BitsLeft = BitsLeft + 32 - N;
Fill_Next();
}
void Next_Packet()
{
static unsigned int code, Packet_Length, Packet_Header_Length;
for (;;)
{
code = Get_Short();
code = (code<<16) + Get_Short();
// remove system layer byte stuffing
while ((code & 0xffffff00) != 0x00000100)
code = (code<<8) + Get_Byte();
switch (code)
{
case PACK_START_CODE:
Rdptr += 8;
break;
case VIDEO_ELEMENTARY_STREAM:
Packet_Length = Get_Short();
Rdmax = Rdptr + Packet_Length;
code = Get_Byte();
if ((code & 0xc0)==0x80)
{
code = Get_Byte();
Packet_Header_Length = Get_Byte();
Rdptr += Packet_Header_Length;
return;
}
else
Rdptr += Packet_Length-1;
break;
default:
if (code>=SYSTEM_START_CODE)
{
code = Get_Short();
Rdptr += code;
}
break;
}
}
}
void Fill_Buffer()
{
Read = _read(Infile[File_Flag], Rdbfr, BUFFER_SIZE);
if (Read < BUFFER_SIZE)
Next_File();
Rdptr = Rdbfr;
if (SystemStream_Flag)
Rdmax -= BUFFER_SIZE;
}
static unsigned int Get_Short()
{
unsigned int i = Get_Byte();
return (i<<8) + Get_Byte();
}
void Next_File()
{
if (File_Flag < File_Limit-1)
File_Flag ++;
_lseeki64(Infile[File_Flag], 0, SEEK_SET);
_read(Infile[File_Flag], Rdbfr + Read, BUFFER_SIZE - Read);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -