[mythtv] [PATCH] HDTV Recorder Patch

Daniel Thor Kristjansson danielk at mrl.nyu.edu
Sat Nov 13 21:23:45 UTC 2004


The patch is too big (34K) to attach, so here's the link:
   http://www.mrl.nyu.edu/~danielk/mythtv/hdtv-recorder-v32.tbz

This is the HDTV Recorder patch I've been working on for some time now. 
I released this a couple weeks ago and there seem to be no new bugs 
introduced by this patch. The only caveat is that the pmt-tracking patch 
I posted earlier today needs to be in cvs before this can be committed, 
or it will break Live TV.

This patch adds only one desirable user visible feature, multiple audio 
streams. But more importantly it parses the PSIP data present in ATSC 
streams, and it separates out general MPEG stream parsing from ATSC 
stream parsing. This will allow code to be shared with the DVB recorder 
which should lower maintenance problems in the long run.

This is also a major cleanup of hdtvrecorder.cpp. It no longer needs to 
rewrite the pid's of recordings because of the pmt tracking added to 
ffmpeg. And due to the existance of the TSPacket class and the PMT and 
PAT classes we no longer need obscure parsing code. The CRC of the 
tables is checked so that a momentary loss of signal won't compromise 
the stream as much (I still don't CRC check the video stream). I've also 
added a few defines, such as WHACK_A_BUG_VIDEO, WHACK_A_BUG_AUDIO, and 
FAKE_VIDEO which make it easier to test changes.

It's unfortunately a rather large patch, but it's mostly new code that 
and the only significant changes are to hdtv-recorder. To apply this 
patch untar hdtv-recorder.tbz inside the mythtv directory, enter the new 
dtk-patches directory, and run apply-patches.sh. This will copy over the 
new files (and hdtvrecorder.{cpp,h} due to all the changes) and will 
patch tv_play.cpp channel.{h,cpp}, and libmythtv.pro

Here's a basic description of the changes and new files. There is more 
information within the files.

Changed Files:
channel.h:      Adds FAKE_VIDEO define, which allows the use
   of debugging streams in hdtv-recorder
channel.cpp:    Small fix for CheckSignal (plus FAKE_VIDEO)
tv_play.cpp     Adds some asserts
libmythtv.pro:  Adds the new files to the linux compile
hdtvrecorder.{h,cpp}:    These files are a completely rewritten using
   MPEGStreamData to track the program, pids, and the PAT and PMT Tables,
   and ATSCStreamData to handle the PSIP tables.

New Files:
mpegstreamdata.{h,cpp}:  These files implement the MPEGStreamData
   class which handles MPEG specific data in the DTV Stream. It also
   includes a PAT and PMT rewriter which allows stripping the stream
   down to just one program.

atscstreamdata.{h,cpp}:  These files implement ATSCStreamData which
   extends the MPEGStreamData class to handle PSIP tables.

mpegtables.{h,cpp}:      These files implement the basic PSIPTable
   class and the two MPEG specific table classes for the PAT and PMT.
   In addition the MPEG Adaptation Field Control table is implemented
   here.

atsctables.{h,cpp}:      These files implement most of the ATSC PSIP
   table set. Included are MGT, VCT Terra, EIT, ETT, and STT.
   MGT: The Master Guide Table tells you what pid various tables are
        using, and the current version.
   STT: The SystemTimeTable  reports the current GPS time at the
        transmitter. And the current GPS_UTC offset.
   VCT Terra: The Terrestrial Virtual Channel Table gives you various
        information about the channel.
   EIT: This reports on event information. EIT[0] is always the current
        event info, while each additional EIT block describes another
        3 hours of TV programming.
   ETT: Depending on what the MGT Tells you an ETT describes either
        additional Event information (TV Guide data) or Channel
        information ("You are watching WPIX, New Yorks Number one Movie
        Channel!").

atscdescriptors.{h,cpp}: These files implement classes that parse the
   various ATSC descriptors. This includes the Caption Service
   Descriptor, the Registration Descriptor, the Audio Stream Descriptor,
   and the Content Identifier Descrptor. It also includes the classes
   that decode the ISO 639 Language Code, and the Multiple String
   Structure.
    Caption Service Descriptor: This describes the current captions, and
      is either in the PMT or in the VCT Terra.
    Registration Descriptor: We don't use this, decoded for completeness.
    Audio Stream Descriptor: This describes the audio in a ATSC stream
      it includes useful information such as what language the stream
      is in, what the encoding and bitrate is, and whether it's a
      complete or partial stream (i.e. just the dialog or just the
      background.)
    Content Identifier Descriptor: This is like an ISBN for programming
      and is intended to make managing a library of recordings simpler.
    ISO 639 Language Code: This is not a descriptor really, but a code
      used in ATSC Descriptors and tables to tell you what language
      something is in.
    Multiple String Structure: This also is not a descriptor but
      an encoding used in various descriptors and tables to encode
      a list of strings.

atscdescriptorsmap.cpp:  This file contains the iso639 to QString
   map used by the ISO639LanguageCode class. It is in it's own file
   because g++ takes forever and a day to compile this.

pespacket.{h,cpp}:       This contains the a basic PES packet class
   and pes packet assembler used to construct all the tables we use
   out of ts packets. It works but I plan to replace it with the DVB
   pes packet assembler once that code stabilizes.

tspacket.{h,cpp}:        This contains two closely interconnected
   classes the TSHeader and TSPacket. The first parses the 4 byte
   header of a Transport Stream Packet, and the second parses
   the optional start of field pointer, but mostly just allows
   for easy cloning of an entire TSPacket.

-- Daniel


More information about the mythtv-dev mailing list