[mythtv] [PATCH] HDTV Recorder Patch

John Patrick Poet john at BlueSkyTours.com
Sun Nov 14 00:13:50 UTC 2004

Daniel Thor Kristjansson wrote:

> 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

Been playing with this for the last hour and a half.  In general it 
works very well.  Even fixes a crash I was getting with a recent CVS, 
trying to switch between tuner cards (via 'Y').  Until recently, I only 
had one tuner card, so I don't know how long this problem has existed.

The only problem I have discovered has to do with  my PBS station.  
Skipping forward and Fast-Forward do not work well -- if at all -- with 
programs recorded using this patch, from my PBS station.  All of my 
other digital stations work just fine.  I do not know what is special 
about my PBS station that is causing this.  What is weird, is the first 
couple of minutes of the program are okay -- you have to go a couple 
minutes in, before the problem exhibits itself.

I now have two HD-3000 cards in my system, instead of the one HD-2000 
that I have had for the last 11 months.  The HD-3000 is a nice card, 
however I am having a serious "kernel: cx8800: buffer overrun" problem 
with it.

I have always had some buffer overruns with my HD-2000, but typically 
only one every 10-20 minutes.  With the HD-3000, I am getting a buffer 
overrun almost every minute.  I have looked at the cx8800 driver for the 
HD-3000, but cannot figure out how to increase it's internal buffer 
without causing other problems.

You said you "increased the read buffer size" in v31 of your patch.  
Where exactly is that done.  I would like to play with it, to see if I 
can tune it a bit better for my system.



More information about the mythtv-dev mailing list