#include "Decoder.h"


/*
 * decode headers from one input stream
 * until an End of Sequence or picture start code
 * is found
 */
int Decoder::getheader()
{
  unsigned int sorenson_version;

  /* look for startcode */
  startcode();
  buffer.getbits(PSC_LENGTH);
  sorenson_version = buffer.getbits(5);
  if (sorenson_version <= 1) 
	{
		escapemode=sorenson_version;
    getpicturehdr();
  }
	else
		return 0;

  return 1;
}

/* align to start of next startcode */

void Decoder::startcode()
{
  /* search for new picture start code */
  while (buffer.showbits(PSC_LENGTH)!=1l) 
         buffer.flushbits(1);
}

/* decode picture header */

void Decoder::getpicturehdr()
{
  int pei, tmp;

  buffer.getbits(8);

  tmp = buffer.getbits(3);	
	switch(tmp)
	{
		    case 0:
        horizontal_size = buffer.getbits(8);
        vertical_size = buffer.getbits(8);
        break;
    case 1:
        horizontal_size = buffer.getbits(16);
        vertical_size = buffer.getbits(16);
        break;
    case 2:
        horizontal_size = 352;
        vertical_size = 288;
        break;
    case 3:
        horizontal_size = 176;
        vertical_size = 144;
        break;
    case 4:
        horizontal_size = 128;
        vertical_size = 96;
        break;
    case 5:
        horizontal_size = 320;
        vertical_size = 240;
        break;
    case 6:
        horizontal_size = 160;
        vertical_size = 120;
        break;

	}
	pict_type = buffer.getbits(2);
	deblock=buffer.getbits(1); // deblocking flag
  quant = buffer.getbits(5);	

  pei = buffer.getbits(1);
pspare:
  if (pei) {
     /* extra info for possible future backward compatible additions */
    buffer.getbits(8);  /* not used */
    pei = buffer.getbits(1);
    if (pei) goto pspare; /* keep on reading pspare until pei=0 */
  }

}