www.pudn.com > MPEG2systemsrc.rar > TS.C


/* Copyright (C) 1995, Tektronix Inc. All Rights Reserved.
 *
 *   Usage Restrictions
 *
 * License is granted to copy, to use, and to make and to use derivative
 * works for research and evaluation purposes only.
 *
 *   Disclaimer of Warranty
 *
 * These software programs are available to the user without any license
 * fee or royalty on an "as is" basis.  Tektronix Inc. 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 Tektronix Inc. does not represent or warrant that the programs
 * furnished hereunder are free of infringement of any third-party
 * patents.
*/

/* TS class and AdaptationField class implementations */

#include "TS.H"
#include "Utilities.H"

extern "C"
{
#include   
}

TS::TS ()
{
  adaptation = NULL;
  continuity_counter = NOCC;
}

int TS::get_header_length ()
{
  if (adaptation)
    return adaptation->get_length() + 4;
  else
    return 4;
}

void TS::config_basic (char e, char a, char p1, char s, int c, char p2)
{
  transport_error_code = e;
  payload_unit_start_code = a;
  priority_code = p1;
  scrambling_code = s;
  continuity_counter = c;
  payload_code = p2;
}

void TS::config_adaptation (char d, char r, char p,
       		            TimeStamp27* pcr, TimeStamp27* opcr, int splice,
			    int dlen, int elen, int slen)
{
  if (!adaptation) adaptation = new AdaptationField();
  adaptation->discontinuity_code = d;
  adaptation->random_access_code = r;
  adaptation->elem_stream_priority_code = p;
  if (pcr)
    adaptation->PCR = pcr;
  else
    adaptation->PCR = NULL;    
  if (opcr)
    adaptation->OPCR = opcr;
  else 
    adaptation->OPCR = NULL;
  adaptation->splice_countdown = splice;
  adaptation->transport_private_data_length = dlen;
  adaptation->adaptation_extension_length =  elen;
  adaptation->number_stuffing_bytes = slen;
}  

void TS::inc_cc ()
{
  if (continuity_counter >= 15) continuity_counter = 0;
  else continuity_counter++;
}

void TS::add_pcr (TimeStamp27 pcr)
{
  if (!adaptation)
    {
      adaptation = new AdaptationField();
    }
  if (!adaptation->PCR)
    {
      adaptation->PCR = new TimeStamp27();      
    }
  adaptation->PCR->bits0_31 = pcr.bits0_31;
  adaptation->PCR->ext = pcr.ext;  
}

void TS::delete_pcr ()
{
  if (adaptation)
    {
      adaptation->PCR = NULL;
      if (adaptation->get_length() == 0)
	{
	  delete adaptation;
	  adaptation = NULL;
	}
    }
}

void TS::print ()
{
  printf("transport_error_indicator: %c\n", transport_error_code);
  printf("payload_unit_start_indicator: %c\n", payload_unit_start_code);
  printf("transport_priority: %c\n", priority_code);
  printf("PID: %d\n", pid);
  printf("transport_scramble_control: %c\n", scrambling_code);
  printf("continuity_counter: %d\n", continuity_counter);
  if (adaptation)
    {
	adaptation->print();
    }
  if (payload_code == 'P')
    printf("transport payload length = %d\n", 188 - get_header_length());
}

AdaptationField::AdaptationField ()
{
  adaptation_field_length = NOLENGTH;
  discontinuity_code = '0';
  random_access_code = '0';
  elem_stream_priority_code = 'L';
  PCR = (TimeStamp27*) NULL;
  OPCR = (TimeStamp27*) NULL;
  splice_countdown = NOSPLICE;
  transport_private_data_length = 0;
  adaptation_extension_length = 0;
  number_stuffing_bytes = 0;
}

int AdaptationField::get_fields_length ()
{
  int fields_length = 0;

  if (PCR) fields_length += 6;
  if (OPCR) fields_length += 6;

  if (splice_countdown != NOSPLICE) fields_length += 1;

  if (transport_private_data_length > 0)
    fields_length += transport_private_data_length + 1;

  if (adaptation_extension_length > 0)
    fields_length += adaptation_extension_length + 1;

  fields_length += number_stuffing_bytes;

  return fields_length;
}
     
// get_length returns the total length of the adaptation field including
// the adaptation_field_length field.
int AdaptationField::get_length ()
{
  // first collect the total length of the data fields (minus the length
  // field and flags field
  int fields_length = get_fields_length();

  if ((fields_length == 0) && (adaptation_field_length == 0)) return 1;

  return fields_length + 2;
}

void AdaptationField::print ()
{
  printf(" - Adaptation Field Begins - \n");
  printf("adaptation_field_length: %d\n", get_length() - 1);
  printf("discontinuity_indicator: %c\n", discontinuity_code);
  printf("random_access_indicator: %c\n", random_access_code);
  printf("elementary_stream_priority_indicator: %c\n",
	 elem_stream_priority_code);
  if (PCR)
    printf("PCR: b32 = %d; bits0..31 = %d; ext = %d\n",
	   PCR->bit32, PCR->bits0_31, PCR->ext);;
  
  if (OPCR)
    printf("OPCR: b32 = %d; bits0..31 = %d; ext = %d\n",
	   OPCR->bit32, OPCR->bits0_31, OPCR->ext);
  
  if (splice_countdown != NOSPLICE)
    printf("splice_countdown: %d\n", splice_countdown);
  
  if (transport_private_data_length)
    printf("transport_private_data_length: %d\n",
	   transport_private_data_length);
  
  if (adaptation_extension_length)
    printf("adaptation_field_extension_length: %d\n",
	   adaptation_extension_length);
  
  if (number_stuffing_bytes)
    printf("stuffing bytes read: length: %d\n", number_stuffing_bytes);
}