www.pudn.com > MPEG2systemsrc.rar > SectionConsumers.H
/* 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.
*/
/* SectionConsumer classes */
#ifndef sectionconsumer_h
#define sectionconsumer_h
#include "Consumer.H"
#include "Section.H"
#include "Decoder.H"
// SectionConsumer State
#define SCHEAD1 1
#define SCHEAD2 2
#define SCFLUSH 3
class SectionConsumer : public Consumer
{
public:
SectionConsumer (Decoder*, Section*);
virtual int read_partial (int);
virtual void read_section () = 0;
protected:
Section* sec;
void read_header_a (); // table_id .. section_length
void read_header_b (); // reserved .. last_section_number
void read_CRC ();
char* buf;
int buf_index;
int length_expected;
};
class PATConsumer : public SectionConsumer
{
public:
PATConsumer (Decoder*, PATSection*);
virtual void read_section ();
private:
PATSection* patsec;
};
class MapConsumer : public SectionConsumer
{
public:
MapConsumer (Decoder*, MapSection*);
virtual void read_section ();
private:
MapSection* mapsec;
};
class CAConsumer : public SectionConsumer
{
public:
CAConsumer (Decoder*, CASection*);
virtual void read_section ();
private:
CASection* casec;
};
class PriConsumer : public SectionConsumer
{
public:
PriConsumer (Decoder*, PriSection*);
virtual void read_section ();
private:
PriSection* prisec;
};
/*
DOCUMENTATION
SectionConsumer is a base class from which the PSI-related Consumers
PATConsumer, MapConsumer, and CAConsumer are derived.
Since the syntax for these sections is similar reproduction of code
is avoided by defining read_partial in the base class SectionProducer
and calling the virtual function read_section. read_section is
defined in each of the derived classes. The definitions of
read_section, then, use as utilities the functions read_header_a and
read_header_b, which are defined back in the base class.
Note that the syntax objects: casec, mapsec and patsec are stored
twice in each structure. Once under the generic name "sec" and once
under the more specific name. This is a hack to work around a
well-known and annoying C++ strong-typing problem; if you don't mind
the extra pointer and they are "write-once", then it's a pretty
effective solution.
*/
#endif