Linux Game Programming for PC & Embedded Systems using SDL
Presented by
Fore June
Author of Windows Fan, Linux Fan

A simple video codec.

codecio.h
runhuf.h
encode.h
decode.h
dct_video.h
common.h
fbitios.h
avilib.h
vcodec.cpp
runhuf.cpp
encode.cpp
decode.cpp
dct_video.cpp
fbitios.cpp
Makefile
sample_video.avi ( not zipped )
avilib.o ( not zipped )



fbitios.cpp:
//fbitios.cpp

#include "fbitios.h"
using namespace std;

bitFileIO :: bitFileIO()
{
}

bitFileIO :: bitFileIO( char *argv_in,  char *argv_out )
{
  ifs.open( argv_in, ios::in );
  if ( ifs.fail() ) {
    cout << "error open file " << argv_in << endl;
    exit( 1 );
  }
  ofs.open( argv_out, ios::out );
  if ( ifs.fail() ) {
    cout << "error open file " << argv_out << endl;
    exit( 1 );
  }
  ins_pos = outs_pos = 0;
  progress_indicator = 0;
}

bitFileIO :: bitFileIO( char *argv_out, int in_out )
{
  if ( in_out == 1 ){
    ifs.open( argv_out, ios::in );
    if ( ifs.fail() ) {
      cout << "error open file " << argv_out << endl;
      exit( 1 );
    }
  } else {
    ofs.open( argv_out, ios::out );
    if ( ofs.fail() ) {
      cout << "error open file " << argv_out << endl;
      exit( 1 );
    }
  }
  ins_pos = outs_pos = 0;
  progress_indicator = 0;
}

//read one bit from file
int bitFileIO :: inputBit()
{

  int value;
  if ( ins_pos == 0 ) {
    char c = ifs.get();
    if ( ifs.eof() ) {
	//cout << "Out of data" << endl;
	return -1;
    }
    if ( !(progress_indicator++ & 0x0fff)  ){
	cout << "." << flush;
    }
    ins = ( ul ) c;
  }
  int i = ins_pos++;
  if ( ins_pos > 7 )
    ins_pos = 0;
  return( ins[i] ? 1 : 0 );
}	

//output one bit
void bitFileIO :: outputBit ( int bit )
{
  if ( bit ) 
    outs.set( outs_pos );	//set bit to 1
  else	
    outs.reset( outs_pos );	//set bit to 0
  if ( outs_pos == 7 ) {
    char c = ( char ) outs.to_ulong();
    ofs.put ( c );
    if ( ofs.fail() ) {
	cout << "\nfatal error in output bit " << endl;
    }
    outs_pos = 0;	//reset output position
    if ( !(progress_indicator++ & 0x0fff)  ){
	cout << "." << flush;
    }
  } else
    ++outs_pos;
}	// OutputBit() 

//read n bits from file
long bitFileIO :: inputBits( int n )
{
  if ( n > max_bits - 1 ) {
    cout << "Cannot handle " << n << " bits at one time";
    return -2;
  }
  bitset<32> value;
  int pos = 0;
  while ( pos < n ) {
    if ( ins_pos == 0 ) {
    	char c = ifs.get();
    	if ( ifs.eof() ) {
	  //cout << "Out of data" << endl;
	  return -1;
    	}
       	if ( !(progress_indicator++ & 0x0fff)  ){
	  cout << "." << flush;
    	}
      	ins = ( ul ) c;
    } //if ( read one char )
    int i = ins_pos++;
    if ( ins_pos > 7 )
	ins_pos = 0;
    if ( ins[i] )
	value.set( pos );	//a 1
    else
	value.reset( pos );    	// a 0
    ++pos;			//points to next bit position
  } //while
  return ( (long)  value.to_ulong() );	//return the n-bit value
}	//inputBits()

//output n bits to file
void  bitFileIO :: outputBits( ul data, int n )
{
  bitset<32> value = data;
  int pos = 0;
  while ( pos < n ) {
    if ( value[pos++] ) 	//test the bit of input value
    	outs.set( outs_pos );	//set bit to 1
    else	
    	outs.reset( outs_pos );	//set bit to 0
    if ( outs_pos == 7 ) {
    	char c = ( char ) outs.to_ulong();
    	ofs.put ( c );
    	if ( ofs.fail() ) {
	  cout << "\nfatal error in output bit " << endl;
    	}
    	outs_pos = 0;	//reset output position
    	if ( !(progress_indicator++ & 0x0fff)  ){
	  cout << "." << flush;
    	}
    } else
    	++outs_pos;
  }
}	/* outputBits() */

//push out remaining bits to file
void	bitFileIO :: closeOutput ()
{
  if ( outs_pos != 0 ){
    for ( int i = outs_pos; i < 7; ++i )
	outs[i] = 0;
    ofs.put( ( char ) outs.to_ulong() );
  }
  ofs.close();
}

void	bitFileIO :: closeInput()
{
  ifs.close();
}