private void ThreadRun()
        {
            if (writer == null)
            {
                Failed = true;
                return;
            }

            double packetsPerSecond = (double)(BitsPerSecond / 8) / 188;
            ulong  packetTime       = 27000000 / (ulong)packetsPerSecond;

            currentTime = 0;

            ulong nextPacketTime = Streams.NextPacketTime;

            while (nextPacketTime != 0xFFFFFFFFFFFFFFFF && currentTime < EndAfter)
            {
                if (currentTime >= ProgramTables.NextPacketTime)
                {
                    // Checking for cancel here means that the mutex on the cancel bool will only be triggered about
                    // 20 times per second of video processed. This theoretically can cause a mutex lock as many as
                    // 1000 times a second if I ever tweak the buffer reader on the MPEG-2 video stream to handle
                    // peeking more efficiently
                    if (Cancelled)
                    {
                        break;
                    }

                    writer.Write(ProgramTables.NextPacket().Packet, 0, 188);
                    currentTime += packetTime;
                }
                else if (currentTime >= nextPacketTime)
                {
                    TransportPacket nextPacket = Streams.TakePacket(currentTime);
                    if (nextPacket.HasPCR)
                    {
                        nextPacket.SetPCR(currentTime);
                    }

                    if (nextPacket.DecoderStamp < currentTime)
                    {
                        throw new Exception(nextPacket.PID.ToString("{0:X4}") + " Decoder Stamp " + nextPacket.DecoderStamp.ToString() + " > current time " + currentTime.ToString());
                    }

                    writer.Write(nextPacket.Packet, 0, 188);

                    nextPacketTime = Streams.NextPacketTime;
                    currentTime   += packetTime;
                }
                else
                {
                    if (PadToConstant)
                    {
                        NullPacket.IncrementContinuityCounter();
                        writer.Write(NullPacket.Packet, 0, 188);
                    }

                    currentTime += packetTime;
                }
            }

            Close();
            Finished = true;
            return;
        }