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);
}