    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: A Mini-project to Decode a Mini-language - Part One</title>
        <link>https://members.accu.org/index.php/articles/241</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Programming Topics + Overload Journal #63 - Oct 2004</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c65/">Programming</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c78/">Overload</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c149/">63</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c65-149/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c65+149/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;A Mini-project to Decode a Mini-language - Part One</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 01 October 2004 16:25:38 +01:00 or Fri, 01 October 2004 16:25:38 +01:00</p>
<p><strong>Summary:</strong>&nbsp;</p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e18" id="d0e18"></a></h2>
</div>
<p>This article appears in two parts. Part One - this part -
describes the first stages of a mini-project to write a codec for a
mini-language. (If you don't know what codecs and mini-languages
are, don't worry. Read on!) Part two will describe the later stages
of this project and present an actual implementation of the
codec.</p>
<p>Keen readers will, then, have the opportunity to try out an
implementation of their own before part two appears, based on the
specification arrived at during the course of the following
paragraphs. As encouragement, I provide a (link to a) data suite
which can be used for test purposes.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e24" id="d0e24"></a>Motivation</h2>
</div>
<p>The motivation for this article comes from &quot;The Art of UNIX
Programming&quot; by Eric Raymond ([<a href="#Raymond">Raymond</a>]).
This is one of the most inspiring books I've read on how to write
software: although firmly rooted in the traditions of the UNIX
operating system, the culture and philosophy it describes applies
far more widely. It has reinforced my belief that software
development can indeed be an art.</p>
<p>Having read this book, I wanted to put some of its ideas into
practice. So I set myself a mini-project.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e34" id="d0e34"></a>An Idea For a
Mini-project</h2>
</div>
<p>As a starting point, I'd like to summarise two of [<a href=
"#Raymond">Raymond</a>]'s most important lessons</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Data structures, not algorithms, are central to programming.</p>
</li>
<li>
<p>Prefer text file formats: they're human-readable and extensible.
If you must use a binary format then invest in a tool which
converts from this format to a textual one and back again. This
will facilitate working with your data.</p>
</li>
</ul>
</div>
<p>I work in a domain where the need for compression requires the
use of binary file formats: namely digital television (DTV).
Digital video is typically MPEG-2 encoded. This is a highly
compressed encoding designed to squeeze as much content as possible
into a limited bandwidth. MPEG-2 encoding also allows video and
audio content to be combined with metadata: for example, a
television programme might be accompanied by a text description of
itself and of what's showing next<sup>[<a name="d0e51" href=
"#ftn.d0e51" id="d0e51">1</a>]</sup>.</p>
<p>To get to grips with this metadata a conversion tool is
required. The specific task I set myself, then, was to write a tool
to convert MPEG-2 metadata from binary to text, and, if required,
to reverse the process. Such an encode/decode tool is commonly
referred to as a 'codec'.</p>
<p>My project, then, was to implement a digital television
codec.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e59" id="d0e59"></a>The MPEG-2 Bit
Stream Syntax: An Example of a Mini-language</h2>
</div>
<p>The metadata format is specified using the MPEG-2 bit stream
syntax which is defined in [<a href=
"#ISO-IEC13818-1">ISO-IEC13818-1</a>]. Data items are described by
name and length in bits using a C-like procedural syntax. An
example makes this clear:</p>
<pre class="literallayout">
TS_program_map_section() {
  table_id                 8
  section_syntax_indicator 1
  '0'                      1
  reserved                 2
  section_length          12
  program_number          16
  reserved                 2
  version_number           5
  current_next_indicator   1
  section_number           8
  last_section_number      8
  reserved                 3
  PCR_PID                 13
  reserved                 4
  program_info_length     12
  for(i=0; i&lt;N; i++) {
    descriptor()
  }
  for(i=0;i&lt;N1;i++) {
    stream_type            8
    reserved               3
    elementary_PID        13
    reserved               4
    ES_info_length        12
    for(i=0; i&lt;N2; i++) {
      descriptor()
    }
  }
  CRC_32                  32
}
</pre>
<p>What we have here is the bit stream syntax for a section of the
Program Map Table. The first 8 bits give the table id (which
happens to be 2, for this particular table); the single bit which
follows provides the section syntax indicator; the next bit is
always set to zero; the next two bits are reserved (and should each
be set to one); and so on, until we get to the 32 bit
CRC<sup>[<a name="d0e71" href="#ftn.d0e71" id=
"d0e71">2</a>]</sup>.</p>
<p>To provide a little context: the Program Map Table (PMT)
supplies basic information about the digital television services
present in an MPEG-2 transport stream. A section of this table - as
shown above - defines the elementary streams which comprise a
single television service. For example, the PMT for the BBC1
digital television service consists of a video stream, an audio
stream, a subtitle stream and some data streams. Of course,
[<a href="#ISO-IEC13818-1">ISO-IEC13818-1</a>] defines the format
of many other tables and sections, and related specifications -
such as [<a href="#ETSI-EN300468">ETSI-EN300468</a>] define many
more.</p>
<p>This textual specification of a binary format is an example of
what [<a href="#Raymond">Raymond</a>] terms a mini-language. In
fact we have a Turing-complete mini-language: that is, it allows
for loops and conditionals. The particular example shown here does
not include any conditionals, though we do have nested loops. Note
also the referenced <span class="structname">descriptor()</span>
items. To fully parse the <span class=
"structname">TS_program_map_section()</span> we'll need the
<span class="structname">descriptor()</span> format specified
too:</p>
<pre class="literallayout">
descriptor() {
  descriptor_tag       8
  descriptor_length    8
  for(i=0; i&lt;N; i++) {
    private_data_byte  8
  }
}
</pre></div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e104" id=
"d0e104"></a>Complications</h2>
</div>
<p>The syntax is easy to read, particularly to anyone familiar with
C. However, if we look more closely at the <tt class=
"literal">for</tt>-loop in Example 2, although it's apparent that i
must be an integral loop counter, it's less clear where N is
defined. Similarly, in Example 1, how do we find the values of N1
and N2?</p>
<p>[<a href="#ISO-IEC13818-1">ISO-IEC13818-1</a>] answers these
questions. In Example 2, the <i class=
"structfield"><tt>descriptor_length</tt></i> data element encodes
an unsigned integer which tells us how many bytes of data are to
follow: so N is simply the value obtained by decoding <i class=
"structfield"><tt>descriptor_length</tt></i>. Example 1 is not
quite so simple. N is easy enough - it's as many variable-length
descriptors as it takes to fill the total length specified by
<i class="structfield"><tt>program_info_length</tt></i>. N2 is
similarly the number of descriptors to fill the length specified by
the most recent occurrence of <i class=
"structfield"><tt>ES_info_length</tt></i>. For N1 however, we have
to keep decoding elementary streams until the following is
true:</p>
<pre class="literallayout">
Sum of elementary stream lengths (in bytes)
   == 'section_length' - 
      - (2 + 5 + 1 + 8 + 8 
         + 3 + 13 + 4 + 12) / 8
      - 'program_info_length'
      - 32 / 8
</pre>
<p>We have to divide by 8 since field widths of values within the
PMT section are given in bits - but length fields give values in
bytes.</p>
<p>Despite these complications, the encoding is well-designed: we
can parse these binary data structures sequentially without needing
to look ahead; and we can skip over any bits we're not interested
in.</p>
<p>In fact, the more closely we inspect our examples, the more we
notice. This is good. Recall that data structures, not algorithms,
are central to programming. Already we're getting stuck into the
data.</p>
<p>While we're in this positive frame of mind, let's review the
full range of control structures required by the [<a href=
"#ISO-IEC13818-1">ISO-IEC13818-1</a>] bitstream syntax:</p>
<pre class="programlisting">
while(condition) {
  data_element
  ...
}
do {
  data_element
  ...
}
while(condition)
if(condition) {
  data_element
  ...
}
else {
  data_element
  ...
}
for(i=0;i&lt;n;i++) {
  data_element
  ...
}
</pre>
<p>So, we've got pretty much C's control structures, excepting
<tt class="literal">switch</tt>, <tt class="literal">break</tt>,
<tt class="literal">return</tt> and <tt class=
"literal">continue</tt>.</p>
<p>This is starting to look alarming. How complex can a <tt class=
"varname">condition</tt> be? How shall we handle three different
looping constructs? Our mini-project has become rather bigger than
we imagined.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e163" id="d0e163"></a>Back to the
Data</h2>
</div>
<p>The thing to do at this point is to shelve these concerns and
get back to specifics. So, I got hold of some PMT section data and
parsed it by hand. I used two types of data:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>PMT sections pulled out of recorded digital TV broadcasts</p>
</li>
<li>
<p>a simple PMT section synthesised by hand.</p>
</li>
</ul>
</div>
<p>I shall spare you the details. Note though that in parsing by
hand we're already starting work on our text output format. For
example, given the binary contents of a synthesised descriptor:</p>
<pre class="literallayout">
0a 04 0a 0b 0a 0b
</pre>
<p>and recalling the descriptor syntax:</p>
<pre class="literallayout">
descriptor() {
  descriptor_tag        8
  descriptor_length     8
  for (i=0; i&lt;N; i++) {
    private_data_byte   8
  }
}
</pre>
<p>a suitable output might be:</p>
<pre class="literallayout">
descriptor() {
  descriptor_tag      8 = 0x0a
  descriptor_length   8 = 0x04
  for (i=0; i&lt;N; i++) {
    private_data_byte 8 = 0x0a
    private_data_byte 8 = 0x0b
    private_data_byte 8 = 0x0a
    private_data_byte 8 = 0x0b
  }
}
</pre>
<p>I have deliberately chosen an output format which closely
resembles the syntax definition. The loop has been unrolled, but I
have retained the loop control to indicate the structure and origin
of the data. I have chosen a hexadecimal representation for the
data values - always a good choice for binary data - and explicitly
indicate the numeric base used by prefixing these values with the
string 0x. Finally, I have retained the bit widths for convenience:
this will mean that when converting from text to binary, there will
be no need to refer back to the descriptor syntax.</p>
<p>Referrring back to our motivating reference, we see we have
instinctively followed one of [<a href="#Raymond">Raymond</a>]'s
recommendations:</p>
<div class="blockquote">
<blockquote class="blockquote">
<p>&quot;when filtering, never throw away information you don't need
to&quot;.</p>
</blockquote>
</div>
<p>(Here, the term &quot;filter&quot; is used in its Unix sense, and applies
well to a codec; and the reasoning is that any discarded
information can never be used in any program further down the Unix
pipeline). In our example, we can see that the output includes all
the information carried by both the descriptor syntax definition
and by the example descriptor.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e199" id="d0e199"></a>Handling
Failures</h2>
</div>
<p>Suppose our descriptor was too short:</p>
<pre class="literallayout">
0a 04 0a 0b 0a
</pre>
<p>What should our codec make of such data?</p>
<p>Maybe something like this:</p>
<pre class="literallayout">
descriptor() {
  descriptor_tag      8 = 0x0a
  descriptor_length   8 = 0x04
  for (i=0; i&lt;N; i++) {
    private_data_byte 8 = 0x0a
    private_data_byte 8 = 0x0b
    private_data_byte 8 = 0x0a
  &gt;&gt;&gt; ERROR: end of data reached. descriptor() incomplete
</pre>
<p>It's perhaps premature to tie down how errors should be handled,
other than to say that they should draw attention to themselves,
that they shouldn't crash the codec, and that they should provide
useful diagnostics. But it certainly isn't premature to include
some malformed data in our test set.</p>
<p>Another point [<a href="#Raymond">Raymond</a>] makes about data
conversion tools is that they should be generous in what they
accept (as input) but rigorous in what they emit (as output). In
our case, this means that a user might change the layout of a text
version of a <span class="structname">descriptor()</span> to read
like this:</p>
<pre class="literallayout">
descriptor() 
    {   descriptor_tag 8 = 0xA
        descriptor_length 8 = 0x4
        for (i = 0; i &lt; N; i++) 
        {    private_data_byte 8 = 0xA
             private_data_byte 8 = 0xB
             private_data_byte 8 = 0xA
             private_data_byte 8 = 0xB
        }
    }
</pre>
<p>and still expect the codec to convert this to binary as:</p>
<pre class="literallayout">
0a 04 0a 0b 0a 0b
</pre>
<p>One of the great benefits of having a codec is that we can
generate binary data from an easy-to-edit textual form: it would be
a severe limitation if the encoding process was over-sensitive
about whitespace, layout, or the capitalisation of hexadecimal
numbers.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e230" id="d0e230"></a>Reducing
Project Scope</h2>
</div>
<p>Whilst tinkering around with my test data set, I've also been
paging through the MPEG-2 bitstream syntax. The bad news is that
the expressions which appear in conditionals may be quite complex,
making use of all the usual C arithmetic, bitwise, logical and
relational operators as well as a few domain-specific
additions.</p>
<p>The good news is that we can make good progress if we restrict
our scope as follows:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Restriction 1: restrict the control structures to <tt class=
"literal">for() {...}</tt> and <tt class="literal">if (condition)
{...} else {...}</tt></p>
</li>
<li>
<p>Restriction 2: restrict conditions to the form <tt class=
"literal">field == value</tt></p>
</li>
</ul>
</div>
<p>These restrictions will not make a lot of sense to end users. In
end user terms, we can aim for a first release of our codec which
will only support sections from the following four tables:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Program Association Table (PAT)</p>
</li>
<li>
<p>Conditional Access Table (CAT)</p>
</li>
<li>
<p>Network Information Table (NIT)</p>
</li>
<li>
<p>Program Map Table (PMT)</p>
</li>
</ul>
</div>
<p>This reduced scope may seem rather limiting.</p>
<p>Note however that these four tables - collectively termed the
Program Specific Information (PSI) Tables - &quot;<span class=
"quote">contain the necessary and sufficient information to
demultiplex and present programs</span>&quot; ([<a href=
"#ISO-IEC13818-1">ISO-IEC13818-1</a>]).</p>
<p>Note further that our syntactic restrictions will not stop us
from extending our codec to handle the complete set of DVB Service
Information (SI) tables ([<a href=
"#ETSI-EN300468">ETSI-EN300468</a>]), which contain just about all
of the metadata used in European digital broadcasts. Note finally
that we remain faithful to our aims: [<a href=
"#Raymond">Raymond</a>] emphasises the need to release early and
often, so that users can drive (and implement, even, in an open
source world) future developments. By reducing scope, we allow for
this early feedback. We must take care, though, to follow another
Unix maxim, and keep our design extensible.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e284" id="d0e284"></a>A Prototype
Descriptor Decoder</h2>
</div>
<pre class="programlisting">
/**
 * @brief Decode a descriptor.
 * @param begin The start of the descriptor data
 * @param end One past the end of the descriptor
 *            descriptor data
 * @param out Output stream for the decoded data
 */
bool decodeDescriptor(desc_iter begin,
         desc_iter end, std::ostream &amp; out) {
  out &lt;&lt; &quot;descriptor() {\n&quot;;
  if(begin != end) {
    out &lt;&lt; &quot;    descriptor_tag 8 = &quot;
        &lt;&lt; *begin++ &lt;&lt; &quot;\n&quot;;
  }

  // We don't know yet how much data we need to
  // decode.  Use a special non-zero value to
  // indicate this.
  unsigned int to_decode = 0xff;

  if(begin != end) {
    to_decode = *begin++;
    out &lt;&lt; &quot;    descriptor_length 8 = &quot;
        &lt;&lt; to_decode &lt;&lt; &quot;\n&quot;;
    out &lt;&lt; &quot;    for(i=0; i&lt;N; i++) {\n&quot;;
    while(begin != end &amp;&amp; to_decode != 0) {
      out &lt;&lt; &quot;        &quot;
          &lt;&lt; &quot;private_data_byte 8 = &quot;
          &lt;&lt; *begin++ &lt;&lt; &quot;\n&quot;;
      --to_decode;
    }
    out &lt;&lt; &quot;    }\n&quot;; 
  }
  if(begin != end) {
    out &lt;&lt; &quot;ERROR: descriptor() too long.\n&quot;;
  }
  else if (to_decode != 0) {
    out &lt;&lt; &quot;ERROR: end of data reached. &quot;
        &lt;&lt; &quot;descriptor() incomplete.\n&quot;;
  }
  else {
    out &lt;&lt; &quot;}\n&quot;;
  }
  return begin == end &amp;&amp; to_decode == 0;
}
</pre>
<p>The function above is a direct first attempt at writing a
descriptor decoder. Whilst there may be some mileage in this
approach, some weaknesses are apparent:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>The indentation is fixed. This won't do if we are decoding a
descriptor in the broader context of a PMT section, when it can
appear at two different levels.</p>
</li>
<li>
<p>The error handling is clumsy.</p>
</li>
<li>
<p>Data - in this case, the descriptor's syntax - has become
muddled with control flow.</p>
</li>
</ul>
</div>
<p>Now is not the time to deal with these weaknesses. We shall
simply note that the first is simple to fix and the second can
easily be improved on. It's the third weakness which, in the longer
term, will lead to code which is harder to understand, maintain and
extend. On the other hand, this function demonstrably works on our
test data set, which is encouraging; and it's not hard to see how
the approach taken could be extended to decode PAT, CAT, NIT and
PMT sections - which is all we've decided to do.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e303" id="d0e303"></a>Design
Alternatives</h2>
</div>
<p>We are now in a good position to consider the design of our
dtv-codec. Three alternatives spring to mind:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Implement a descriptor-codec, a pmt-codec, and so on as
required. Here, each mini-codec understands its own designated part
of the syntax. Then the dtv-codec simply farms out work as
appropriate. This extends the direct approach described above.</p>
</li>
<li>
<p>Implement a general dtv-codec which understands the full
bitstream syntax and can use it to parse an arbitrary section
format. All that then remains is to prime this codec with the
required section formats.</p>
</li>
<li>
<p>Devise a code generator which, given a section format, will
generate a program to code/decode that particular format.</p>
</li>
</ul>
</div>
<p>All three alternatives are good, and all seem in line with our
motivating aims. The third, in particular, exemplifies [<a href=
"#Raymond">Raymond</a>]'s &quot;<span class="quote">Rule of Generation:
Avoid hand-hacking; write programs to write programs when you
can.</span>&quot;</p>
<p>In choosing which route to take, we should remember the
[<a href="#XP">XP</a>] mantra: &quot;<span class="quote">Do the simplest
thing possible</span>&quot;; which, in UNIX-speak, becomes the more
prosaic: &quot;<span class="quote">Keep it Simple, Stupid!</span>&quot;</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e335" id="d0e335"></a>More
Details</h2>
</div>
<p>For those who want to implement their own codec I have posted a
zip archive to my website [<a href="#HomePage">HomePage</a>]. This
archive contains:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>binary PAT, CAT, NIT and PMT sections</p>
</li>
<li>
<p>synthesised text sections</p>
</li>
<li>
<p>alternative text versions</p>
</li>
<li>
<p>malformed binary sections</p>
</li>
<li>
<p>the relevant section syntax definitions</p>
</li>
<li>
<p>table_id values</p>
</li>
<li>
<p>a README</p>
</li>
</ul>
</div>
<p>For those who'd prefer to see my attempt; you'll have to wait
for part two of this article.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e367" id=
"d0e367"></a>Conclusions</h2>
</div>
<p>Progress has been made, and without the need to compromise our
artistic aims. Even before we've completed the project, we've
started to receive the main benefit: of understanding our data.</p>
<p>The second part of this article is where we compromise, get our
hands get dirty, bite off more than we can chew - that is, we write
some code.</p>
</div>
<div class="bibliography">
<div class="titlepage">
<h2><a name="d0e374" id="d0e374"></a>References</h2>
</div>
<div class="bibliomixed"><a name="Raymond" id="Raymond"></a>
<p class="bibliomixed">[Raymond] Eric S. Raymond, <span class=
"citetitle"><i class="citetitle">The Art of UNIX
Programming</i></span>, Addison-Wesley 0-13-142901-9</p>
</div>
<div class="bibliomixed"><a name="ISO-IEC13818-1" id=
"ISO-IEC13818-1"></a>
<p class="bibliomixed">[ISO-IEC13818-1] <span class=
"citetitle"><i class="citetitle">Information Technology - Generic
Coding Of Moving Pictures And Associated Audio: Systems</i></span>
Recommendation H.222.0 ISO/IEC 13818-1</p>
</div>
<div class="bibliomixed"><a name="ETSI-EN300468" id=
"ETSI-EN300468"></a>
<p class="bibliomixed">[ETSI-EN300468] <span class=
"citetitle"><i class="citetitle">Digital Video Broadcasting (DVB);
Specification for Service Information (SI) in DVB
systems</i></span></p>
</div>
<div class="bibliomixed"><a name="XP" id="XP"></a>
<p class="bibliomixed">[XP] <span class="citetitle"><i class=
"citetitle">Extreme Programming</i></span>, <span class=
"bibliomisc"><a href="http://www.extremeprogramming.org" target=
"_top">http://www.extremeprogramming.org</a></span></p>
</div>
<div class="bibliomixed"><a name="HomePage" id="HomePage"></a>
<p class="bibliomixed">[HomePage] <span class="bibliomisc"><a href=
"http://homepage.ntlworld.com/thomas.guest" target=
"_top">http://homepage.ntlworld.com/thomas.guest</a></span></p>
</div>
</div>
<div class="footnotes"><br>
<hr class="c2" width="100">
<div class="footnote">
<p><sup>[<a name="ftn.d0e51" href="#d0e51" id=
"ftn.d0e51">1</a>]</sup> The proper term for these particular items
of metadata is Event Information, present and following. Since this
article is not primarily about digital television I shall avoid
such jargon as far as possible.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e71" href="#d0e71" id=
"ftn.d0e71">2</a>]</sup> I assume the 'reserved' parts of the
section are included to provide room for a degree of future
extensibility. But not much room. This is one of the reasons why
[<a href="#Raymond">Raymond</a>] advocates text file formats:
&quot;<span class="quote">if you need a larger value in a text format,
just write it.</span>&quot;</p>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
