All pastes #940622 Raw Edit

Anonymous

public text v1 · immutable
#940622 ·published 2008-03-13 03:03 UTC
rendered paste body
diff -rup mythtv.orig/libs/libavcodec/avcodec.h mythtv/libs/libavcodec/avcodec.h
--- mythtv.orig/libs/libavcodec/avcodec.h       2008-03-03 13:28:28.000000000 -0500
+++ mythtv/libs/libavcodec/avcodec.h    2008-03-09 16:44:25.000000000 -0400
@@ -289,6 +289,9 @@ enum CodecID {
     /* DSMCC codec */
     CODEC_ID_DSMCC_B,
 
+    /* Private Data */
+    CODEC_ID_DVB_PRIVSEC= 0x18000,
+
     CODEC_ID_MPEG2TS= 0x20000, /* _FAKE_ codec to indicate a raw MPEG-2 TS
                                 * stream (only used by libavformat) */
 };
diff -rup mythtv.orig/libs/libavcodec/myth_utils.c mythtv/libs/libavcodec/myth_utils.c
--- mythtv.orig/libs/libavcodec/myth_utils.c    2008-03-03 13:28:28.000000000 -0500
+++ mythtv/libs/libavcodec/myth_utils.c 2008-03-09 15:51:46.000000000 -0400
@@ -203,6 +203,9 @@ const char *codec_id_string(enum CodecID
 
         case CODEC_ID_DSMCC_B:          return "DSMCC_B";
 
+            /* private data codecs */
+        case CODEC_ID_DVB_PRIVSEC:      return "DVB_PRIVSEC";
+
         case CODEC_ID_MPEG2TS:          return "MPEG2TS";
     }
     return "Unknown Codec ID";
diff -rup mythtv.orig/libs/libavformat/mpegts.c mythtv/libs/libavformat/mpegts.c
--- mythtv.orig/libs/libavformat/mpegts.c       2008-03-03 13:28:30.000000000 -0500
+++ mythtv/libs/libavformat/mpegts.c    2008-03-12 14:53:18.000000000 -0400
@@ -866,6 +866,7 @@ static int is_desired_stream(int stream_
         case STREAM_TYPE_AUDIO_AAC:
         case STREAM_TYPE_AUDIO_AC3:
         case STREAM_TYPE_AUDIO_DTS:
+        case STREAM_TYPE_PRIVATE_SECTION:
         case STREAM_TYPE_PRIVATE_DATA:
         case STREAM_TYPE_VBI_DVB:
         case STREAM_TYPE_SUBTITLE_DVB:
@@ -1454,6 +1455,10 @@ static void init_stream(AVStream *st, in
             codec_type = CODEC_TYPE_DATA;
             codec_id = CODEC_ID_DSMCC_B;
             break;
+        case STREAM_TYPE_PRIVATE_SECTION:
+            codec_type = CODEC_TYPE_DATA;
+            codec_id = CODEC_ID_DVB_PRIVSEC;
+            break; 
         case STREAM_TYPE_PRIVATE_DATA:
         default:
             if (code >= 0x1c0 && code <= 0x1df) {
@@ -1553,6 +1558,15 @@ static void mpegts_push_data(void *opaqu
                     if (pes->total_size)
                         pes->total_size += 6;
                     pes->pes_header_size = pes->header[8] + 9;
+                } else if (pes->header[0] == 0x00 && pes->header[1] == 0xd3 &&
+                    pes->header[2] == 0xb0) {
+                    /* it must be a generic data stream */
+                    if (!pes->st) {
+                        /* allocate stream */
+                        new_pes_av_stream(pes, code);
+                    }
+
+                    pes->state = MPEGTS_PAYLOAD;
                 } else {
                     /* otherwise, it should be a table */
                     /* skip packet */
diff -rup mythtv.orig/libs/libmythtv/NuppelVideoPlayer.cpp mythtv/libs/libmythtv/NuppelVideoPlayer.cpp
--- mythtv.orig/libs/libmythtv/NuppelVideoPlayer.cpp    2008-03-06 20:41:41.000000000 -0500
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.cpp 2008-03-12 22:40:47.000000000 -0400
@@ -201,6 +201,7 @@ NuppelVideoPlayer::NuppelVideoPlayer(QSt
       // OSD stuff
       osd(NULL),                    timedisplay(NULL),
       dialogname(""),               dialogtype(0),
+      now_playing_changed(false),
       // Audio stuff
       audioOutput(NULL),
       audio_main_device(QString::null),
@@ -274,6 +275,8 @@ NuppelVideoPlayer::NuppelVideoPlayer(QSt
     itvEnabled       = gContext->GetNumSetting("EnableMHEG", 0);
     db_prefer708     = gContext->GetNumSetting("Prefer708Captions", 1);
 
+    osd_prog_info_timeout= gContext->GetNumSetting("OSDProgramInfoTimeout", 3);
+
     lastIgnoredManualSkip = QDateTime::currentDateTime().addSecs(-10);
 
     bzero(&txtbuffers, sizeof(txtbuffers));
@@ -2926,6 +2929,8 @@ void NuppelVideoPlayer::DisplayNormalFra
             ExpireSubtitles();
     }
 
+    DisplayNowPlaying();
+
     // handle scan type changes
     AutoDeint(frame);
 
@@ -7056,6 +7061,34 @@ void NuppelVideoPlayer::DisplayTextSubti
         osd->ClearTextSubtitles();
 }
 
+/** \fn NuppelVideoPlayer::DisplayNowPlaying(void)
+ *  \brief Displays Now Playing text
+ */
+void NuppelVideoPlayer::DisplayNowPlaying(bool anyway)
+{
+    QMutexLocker locker(&nowPlayingLock);
+
+    if (!now_playing_changed && !anyway)
+        return;
+
+    QString text;
+
+    // Skip if the first section is empty
+    QString t = now_playing[0].simplifyWhiteSpace();
+    if (t.isEmpty())
+        return;
+
+    for (QStringList::Iterator it = now_playing.begin();
+         it != now_playing.end(); ++it ) {
+        if (!(*it).isEmpty())
+            text.append(*it + " ");
+    }
+
+    osd->SetNowPlaying(text, osd_prog_info_timeout);
+
+    now_playing_changed = false;
+}
+
 /** \fn NuppelVideoPlayer::ExpireSubtitles(void)
  *  \brief Discard non-displayed subtitles.
  */
@@ -7145,6 +7178,18 @@ void NuppelVideoPlayer::AddAVSubtitle(co
     subtitleLock.unlock();
 }
 
+/** \fn void NuppelVideoPlayer::SetNowPlaying(const QStringList playing&)
+ *  \brief Set the Now Playing text in the OSD.
+ */
+void NuppelVideoPlayer::SetNowPlaying(const QStringList &playing)
+{
+    nowPlayingLock.lock();
+    now_playing = QDeepCopy<QStringList>(playing);
+    nowPlayingLock.unlock();
+
+    now_playing_changed = true;
+}
+
 /** \fn NuppelVideoPlayer::SetDecoder(DecoderBase*)
  *  \brief Sets the stream decoder, deleting any existing recorder.
  */
diff -rup mythtv.orig/libs/libmythtv/NuppelVideoPlayer.h mythtv/libs/libmythtv/NuppelVideoPlayer.h
--- mythtv.orig/libs/libmythtv/NuppelVideoPlayer.h      2008-03-05 18:59:28.000000000 -0500
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.h   2008-03-12 22:46:44.000000000 -0400
@@ -304,6 +304,10 @@ class MPUBLIC NuppelVideoPlayer : public
                      long long timecode, char type);
     void AddAVSubtitle(const AVSubtitle& subtitle);
 
+    // Now Playing data
+    void SetNowPlaying(const QStringList &playing);
+    void DisplayNowPlaying(bool anyway=false);
+
     // Closed caption and teletext stuff
     uint GetCaptionMode(void) const { return textDisplayMode; }
     void ResetCaptions(uint mode_override = 0);
@@ -648,6 +652,7 @@ class MPUBLIC NuppelVideoPlayer : public
 
     // Support for captions, teletext, etc. decoded by libav
     QMutex    subtitleLock;
+    QMutex    nowPlayingLock;
     /// This allows us to enable captions/subtitles later if the streams
     /// are not immediately available when the video starts playing.
     bool      textDesired;
@@ -735,6 +740,8 @@ class MPUBLIC NuppelVideoPlayer : public
     long long  lastCommSkipStart;
     time_t     lastSkipTime;
 
+    int osd_prog_info_timeout;
+
     long long  deleteframe;
     bool       hasdeletetable;
     bool       hasblanktable;
@@ -810,6 +817,10 @@ class MPUBLIC NuppelVideoPlayer : public
     AdjustFillMode detectLetterboxDefaultMode;
     int detectLetterboxCounter;
     int detectLetterboxLimit;
+
+    // Now Playing
+    QStringList now_playing;
+    bool now_playing_changed;
 };
 
 #endif
diff -rup mythtv.orig/libs/libmythtv/avformatdecoder.cpp mythtv/libs/libmythtv/avformatdecoder.cpp
--- mythtv.orig/libs/libmythtv/avformatdecoder.cpp      2008-03-08 12:14:37.000000000 -0500
+++ mythtv/libs/libmythtv/avformatdecoder.cpp   2008-03-12 21:23:09.000000000 -0400
@@ -1924,6 +1924,8 @@ int AvFormatDecoder::ScanStreams(bool no
             }
             case CODEC_TYPE_DATA:
             {
+                if (enc->bit_rate == 0)
+                    enc->bit_rate = 500;
                 ScanTeletextCaptions(i);
                 bitrate += enc->bit_rate;
                 VERBOSE(VB_PLAYBACK, LOC + QString("data codec (%1)")
@@ -2692,6 +2694,32 @@ void AvFormatDecoder::H264PreProcessPkt(
     }
 }
 
+void AvFormatDecoder::ProcessPrivSecDataPacket(const AVPacket *pkt)
+{
+    QStringList sections;
+    bool changed = false;
+
+    QString text = (const char*)pkt->data;
+
+    for (int i = 0; i < text.contains(0x0a); i++) {
+        QString section = text.section(0x0a, i, i);
+        if (section == "") section = " ";
+
+        if ((i > now_playing.size()) ||
+            now_playing[i].compare(section))
+        {
+            sections << section;
+            changed = true;
+        }
+    }
+
+    if (changed)
+    {
+        now_playing = sections;
+        GetNVP()->SetNowPlaying(sections);
+    }
+}
+
 /** \fn AvFormatDecoder::ProcessVBIDataPacket(const AVStream*, const AVPacket*)
  *  \brief Process ivtv proprietary embedded vertical blanking
  *         interval captions.
@@ -3583,6 +3611,16 @@ bool AvFormatDecoder::GetFrame(int onlyv
             continue;
         }
 
+        if (len > 0 &&
+            curstream->codec->codec_type == CODEC_TYPE_DATA &&
+            curstream->codec->codec_id   == CODEC_ID_DVB_PRIVSEC)
+        {
+            ProcessPrivSecDataPacket(pkt);
+
+            av_free_packet(pkt);
+            continue;
+        }
+
         // we don't care about other data streams
         if (curstream->codec->codec_type == CODEC_TYPE_DATA)
         {
diff -rup mythtv.orig/libs/libmythtv/avformatdecoder.h mythtv/libs/libmythtv/avformatdecoder.h
--- mythtv.orig/libs/libmythtv/avformatdecoder.h        2008-03-03 13:28:21.000000000 -0500
+++ mythtv/libs/libmythtv/avformatdecoder.h     2008-03-12 20:22:03.000000000 -0400
@@ -187,6 +187,7 @@ class AvFormatDecoder : public DecoderBa
     void MpegPreProcessPkt(AVStream *stream, AVPacket *pkt);
     void H264PreProcessPkt(AVStream *stream, AVPacket *pkt);
 
+    void ProcessPrivSecDataPacket(const AVPacket *pkt);
     void ProcessVBIDataPacket(const AVStream *stream, const AVPacket *pkt);
     void ProcessDVBDataPacket(const AVStream *stream, const AVPacket *pkt);
     void ProcessDSMCCPacket(const AVStream *stream, const AVPacket *pkt);
@@ -278,6 +279,8 @@ class AvFormatDecoder : public DecoderBa
     bool mpeg_seq_end_seen;
     /// \brief contains last dvd still frame decoded
     AVPacket *lastDVDStillFrame;
+
+    QStringList now_playing;
 };
 
 #endif
diff -rup mythtv.orig/libs/libmythtv/osd.cpp mythtv/libs/libmythtv/osd.cpp
--- mythtv.orig/libs/libmythtv/osd.cpp  2008-03-03 13:28:21.000000000 -0500
+++ mythtv/libs/libmythtv/osd.cpp       2008-03-12 21:44:57.000000000 -0400
@@ -1939,6 +1939,24 @@ void OSD::EndStatus(void)
     osdlock.unlock();
 }
 
+void OSD::SetNowPlaying(const QString &playing, int length)
+{
+    osdlock.lock();
+    OSDSet *container = GetSet("program_info");
+    if (container)
+    {
+        OSDTypeText *type = (OSDTypeText *)container->GetType("now_playing");
+        if (type)
+            type->SetText(playing);
+
+        container->DisplayFor(length * 1000000);
+        m_setsvisible = true;
+        changed = true;
+    }
+
+    osdlock.unlock();
+}
+
 void OSD::SetChannumText(const QString &text, int length)
 {
     osdlock.lock();
diff -rup mythtv.orig/libs/libmythtv/osd.h mythtv/libs/libmythtv/osd.h
--- mythtv.orig/libs/libmythtv/osd.h    2008-03-03 13:28:20.000000000 -0500
+++ mythtv/libs/libmythtv/osd.h 2008-03-12 19:51:27.000000000 -0400
@@ -80,6 +80,7 @@ class OSD : public QObject
                      const QString &callsign, const QString &iconpath,
                      int length);
     void SetChannumText(const QString &text, int length);
+    void SetNowPlaying(const QString &playing, int length);
 
     // CC-608 and DVB text captions (not DVB/DVD subtitles).
     void AddCCText(const QString &text, int x, int y, int color, 
diff -rup mythtv.orig/libs/libmythtv/tv_play.cpp mythtv/libs/libmythtv/tv_play.cpp
--- mythtv.orig/libs/libmythtv/tv_play.cpp      2008-03-08 11:11:29.000000000 -0500
+++ mythtv/libs/libmythtv/tv_play.cpp   2008-03-12 22:45:34.000000000 -0400
@@ -5433,6 +5433,8 @@ void TV::UpdateOSDProgInfo(const char *w
     osd->ClearAllText(whichInfo);
     osd->HideAll();
     osd->SetText(whichInfo, infoMap, osd_prog_info_timeout);
+
+    nvp->DisplayNowPlaying(true);
 }
 
 void TV::UpdateOSDSeekMessage(const QString &mesg, int disptime)