Ticket #4967: nowplaying_16344.3.diff

File nowplaying_16344.3.diff, 20.1 KB (added by Mark Buechler <Mark.Buechler@…>, 12 years ago)

Set default proirity to 20, check text before using it in OSD::ResetNowPlaying?(), add default and blue OSD support

  • themes/defaultosd/osd.xml

     
    345345    </textarea>
    346346  </container>
    347347
     348  <container name="now_playing" priority="20" fademovement="0,0">
     349    <image name="background">
     350      <filename>now_playing.png</filename>
     351      <position>85,124</position>
     352    </image>
     353    <textarea name="playing">
     354      <area>290,150,240,220</area>
     355      <font>notifyfont</font>
     356      <multiline>yes</multiline>
     357    </textarea>
     358  </container>
     359
    348360</mythosdtheme>
  • themes/blueosd/osd.xml

     
    349349      <fcnfont name="infofontgray" function="inactive"></fcnfont>
    350350    </listtreemenu>
    351351  </container>
    352    
    353352
     353  <container name="now_playing" priority="20" fademovement="0,0">
     354    <image name="background">
     355      <filename>now_playing.png</filename>
     356      <position>85,124</position>
     357    </image>
     358    <textarea name="playing">
     359      <area>290,150,240,220</area>
     360      <font>infofont</font> 
     361      <multiline>yes</multiline>
     362    </textarea>
     363  </container>   
     364
    354365</mythosdtheme>
  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    198198      interactiveTV(NULL),
    199199      itvEnabled(false),
    200200
     201      // Now Playing visible in OSD
     202      has_now_playing(false),
     203      now_playing_changed(false),
     204
    201205      // OSD stuff
    202206      osd(NULL),                    timedisplay(NULL),
    203207      dialogname(""),               dialogtype(0),
     
    272276    commnotifyamount = gContext->GetNumSetting("CommNotifyAmount",0);
    273277    decode_extra_audio=gContext->GetNumSetting("DecodeExtraAudio", 0);
    274278    itvEnabled       = gContext->GetNumSetting("EnableMHEG", 0);
     279    nowPlayEnabled   = gContext->GetNumSetting("EnableNowPlaying", 0);
    275280    db_prefer708     = gContext->GetNumSetting("Prefer708Captions", 1);
    276281
     282    osd_now_play_timeout = gContext->GetNumSetting("OSDNowPlayingTimeout", 10);
     283
    277284    lastIgnoredManualSkip = QDateTime::currentDateTime().addSecs(-10);
    278285
    279286    bzero(&txtbuffers, sizeof(txtbuffers));
     
    27102717            ExpireSubtitles();
    27112718    }
    27122719
     2720    if (has_now_playing && nowPlayEnabled)
     2721        DisplayNowPlaying();
     2722
    27132723    // handle scan type changes
    27142724    AutoDeint(frame);
    27152725
     
    31503160    ringBuffer->Pause();
    31513161    ringBuffer->WaitForPause();
    31523162
     3163    SetHasNowPlaying(false);
     3164
     3165    if (osd)
     3166        osd->ResetNowPlaying();
     3167
    31533168    ClearSubtitles();
    31543169
    31553170    livetvchain->SetProgram(pginfo);
     
    68216836        osd->ClearTextSubtitles();
    68226837}
    68236838
     6839/** \fn NuppelVideoPlayer::SetHasNowPlaying(void)
     6840 *  \brief Enables displaying of Now Playing content
     6841 */
     6842void NuppelVideoPlayer::SetHasNowPlaying(bool has)
     6843{
     6844    if (nowPlayEnabled)
     6845    {
     6846        has_now_playing = has;
     6847
     6848        if (has_now_playing != has)
     6849        {
     6850            QString which = has ? "Enabling" : "Disabling";
     6851            VERBOSE(VB_PLAYBACK, LOC + QString("%1 Now Playing processing")
     6852                    .arg(which));
     6853        }
     6854    }
     6855}
     6856
     6857/** \fn NuppelVideoPlayer::HasNowPlaying(void)
     6858 *  \brief Returns bool stream has Now Playing
     6859 */
     6860bool NuppelVideoPlayer::HasNowPlaying(void)
     6861{
     6862    return has_now_playing;
     6863}
     6864
     6865/** \fn NuppelVideoPlayer::DisplayNowPlaying(void)
     6866 *  \brief Displays Now Playing text
     6867 */
     6868void NuppelVideoPlayer::DisplayNowPlaying()
     6869{
     6870    QMutexLocker locker(&nowPlayingLock);
     6871
     6872    if (!nowPlayEnabled ||
     6873        !has_now_playing ||
     6874        !now_playing_changed)
     6875        return;
     6876
     6877    QString text = "Now Playing:\n\n";
     6878
     6879    // Skip if the first section is empty
     6880    QString t = now_playing[0].simplifyWhiteSpace();
     6881    if (t.isEmpty())
     6882        return;
     6883
     6884    int i = 0;
     6885
     6886    for (QStringList::Iterator it = now_playing.begin();
     6887         it != now_playing.end(); ++it )
     6888        text.append(*it + "\n");
     6889
     6890    osd->SetNowPlaying(text, osd_now_play_timeout);
     6891
     6892    now_playing_changed = false;
     6893}
     6894
    68246895/** \fn NuppelVideoPlayer::ExpireSubtitles(void)
    68256896 *  \brief Discard non-displayed subtitles.
    68266897 */
     
    69106981    subtitleLock.unlock();
    69116982}
    69126983
     6984/** \fn void NuppelVideoPlayer::SetNowPlaying(const QStringList playing&)
     6985 *  \brief Set the Now Playing text in the OSD.
     6986 */
     6987void NuppelVideoPlayer::SetNowPlaying(const QStringList &playing)
     6988{
     6989    nowPlayingLock.lock();
     6990    now_playing = QDeepCopy<QStringList>(playing);
     6991    nowPlayingLock.unlock();
     6992
     6993    now_playing_changed = true;
     6994}
     6995
    69136996/** \fn NuppelVideoPlayer::SetDecoder(DecoderBase*)
    69146997 *  \brief Sets the stream decoder, deleting any existing recorder.
    69156998 */
  • libs/libmythtv/avformatdecoder.cpp

     
    437437    allow_dts_passthru = gContext->GetNumSetting("DTSPassThru", false);
    438438    max_channels = (uint) gContext->GetNumSetting("MaxChannels", 2);
    439439
     440    nowPlayEnabled = gContext->GetNumSetting("EnableNowPlaying", 0);
     441
    440442    audioIn.sample_size = -32; // force SetupAudioStream to run once
    441443    itv = GetNVP()->GetInteractiveTV();
    442444
     
    14301432    tracks[kTrackTypeTeletextCaptions].clear();
    14311433    selectedVideoIndex = -1;
    14321434
     1435    GetNVP()->SetHasNowPlaying(false);
     1436
    14331437    map<int,uint> lang_sub_cnt;
    14341438    map<int,uint> lang_aud_cnt;
    14351439
     
    16551659            }
    16561660            case CODEC_TYPE_DATA:
    16571661            {
    1658                 ScanTeletextCaptions(i);
    1659                 bitrate += enc->bit_rate;
     1662                switch(enc->codec_id)
     1663                {
     1664                    case CODEC_ID_DSMCC_B:
     1665                        bitrate += enc->bit_rate;
     1666                        break;
     1667                    case CODEC_ID_DVB_VBI:
     1668                        ScanTeletextCaptions(i);
     1669                        bitrate += enc->bit_rate;
     1670                        break;
     1671                    case CODEC_ID_DVB_PRIVSEC:
     1672                        if (enc->bit_rate == 0)
     1673                            enc->bit_rate = 175; // 1 TS packet - 13 byte header
     1674                        break;
     1675                }
     1676
    16601677                VERBOSE(VB_PLAYBACK, LOC + QString("data codec (%1)")
    16611678                        .arg(codec_type_string(enc->codec_type)));
    16621679                break;
     
    24232440    }
    24242441}
    24252442
     2443void AvFormatDecoder::ProcessPrivSecDataPacket(const AVPacket *pkt)
     2444{
     2445    if (!GetNVP())
     2446        return;
     2447
     2448    if (nowPlayEnabled)
     2449    {
     2450        QStringList sections;
     2451        bool changed = false;
     2452        uint non_ascii = 0;
     2453        uint end = 0;
     2454
     2455        uint8_t *buf = pkt->data;
     2456        uint len = pkt->size;
     2457
     2458        if (!len || len > 188)
     2459            return;
     2460
     2461        // Sanity checks
     2462        for (uint x = 0; x < len; x++)
     2463            if (buf[x] == 0x00)
     2464                len = end = x;
     2465            else if (buf[x] > 0x7f)
     2466                non_ascii++;
     2467
     2468        if ((non_ascii / len) > .4)
     2469            return;
     2470
     2471        if (!end)
     2472            return;
     2473
     2474        QString text = (const char*)buf;
     2475
     2476        if (text.contains(0x0a) > 10)
     2477            return;
     2478
     2479        GetNVP()->SetHasNowPlaying(true);
     2480
     2481        for (int i = 0; i < text.contains(0x0a); i++) {
     2482            QString section = text.section(0x0a, i, i);
     2483            if (section == "") section = " ";
     2484
     2485            if ((i > now_playing.size()) ||
     2486                now_playing[i].compare(section))
     2487            {
     2488                sections << section;
     2489                changed = true;
     2490            }
     2491        }
     2492
     2493        if (changed)
     2494        {
     2495            now_playing = sections;
     2496            GetNVP()->SetNowPlaying(sections);
     2497        }
     2498    }
     2499}
     2500
    24262501/** \fn AvFormatDecoder::ProcessVBIDataPacket(const AVStream*, const AVPacket*)
    24272502 *  \brief Process ivtv proprietary embedded vertical blanking
    24282503 *         interval captions.
     
    33143389            continue;
    33153390        }
    33163391
     3392        if (len > 0 &&
     3393            curstream->codec->codec_type == CODEC_TYPE_DATA &&
     3394            curstream->codec->codec_id   == CODEC_ID_DVB_PRIVSEC)
     3395        {
     3396            ProcessPrivSecDataPacket(pkt);
     3397
     3398            av_free_packet(pkt);
     3399            continue;
     3400        }
     3401
    33173402        // we don't care about other data streams
    33183403        if (curstream->codec->codec_type == CODEC_TYPE_DATA)
    33193404        {
  • libs/libmythtv/tv_play.h

     
    444444    bool    arrowAccel;
    445445    int     osd_general_timeout;
    446446    int     osd_prog_info_timeout;
     447    int     osd_now_play_timeout;
    447448
    448449    enum commSkipMode autoCommercialSkip;
    449450    bool    tryUnflaggedSkip;
     
    683684    // Network Control stuff
    684685    QValueList<QString> networkControlCommands;
    685686    QMutex ncLock;
     687
     688    // Now Playing
     689    bool nowPlayEnabled;
    686690};
    687691
    688692#endif
  • libs/libmythtv/NuppelVideoPlayer.h

     
    299299                     long long timecode, char type);
    300300    void AddAVSubtitle(const AVSubtitle& subtitle);
    301301
     302    // Now Playing data
     303    void SetHasNowPlaying(bool has);
     304    void SetNowPlaying(const QStringList &playing);
     305    void DisplayNowPlaying();
     306    bool HasNowPlaying(void);
     307
    302308    // Closed caption and teletext stuff
    303309    uint GetCaptionMode(void) const { return textDisplayMode; }
    304310    void ResetCaptions(uint mode_override = 0);
     
    640646
    641647    // Support for captions, teletext, etc. decoded by libav
    642648    QMutex    subtitleLock;
     649    QMutex    nowPlayingLock;
    643650    /// This allows us to enable captions/subtitles later if the streams
    644651    /// are not immediately available when the video starts playing.
    645652    bool      textDesired;
     
    671678    bool       itvEnabled;
    672679    QMutex     itvLock;
    673680
     681    // Support for Now Playing
     682    bool       nowPlayEnabled;
     683    QStringList now_playing;
     684    bool       has_now_playing;
     685    bool       now_playing_changed;
     686
    674687    // OSD stuff
    675688    OSD      *osd;
    676689    OSDSet   *timedisplay;
     
    727740    long long  lastCommSkipStart;
    728741    time_t     lastSkipTime;
    729742
     743    int osd_now_play_timeout;
     744
    730745    long long  deleteframe;
    731746    bool       hasdeletetable;
    732747    bool       hasblanktable;
  • libs/libmythtv/osd.h

     
    8080                     const QString &callsign, const QString &iconpath,
    8181                     int length);
    8282    void SetChannumText(const QString &text, int length);
     83    void SetNowPlaying(const QString &playing, int length);
     84    void ResetNowPlaying(void);
    8385
    8486    // CC-608 and DVB text captions (not DVB/DVD subtitles).
    8587    void AddCCText(const QString &text, int x, int y, int color,
  • libs/libmythtv/tv_play.cpp

     
    508508      jumptime(0), smartChannelChange(false),
    509509      MuteIndividualChannels(false), arrowAccel(false),
    510510      osd_general_timeout(2), osd_prog_info_timeout(3),
     511      osd_now_play_timeout(10),
    511512      autoCommercialSkip(CommSkipOff), tryUnflaggedSkip(false),
    512513      smartForward(false), stickykeys(0),
    513514      ff_rew_repos(1.0f), ff_rew_reverse(false),
     
    635636    persistentbrowsemode = gContext->GetNumSetting("PersistentBrowseMode", 0);
    636637    osd_general_timeout  = gContext->GetNumSetting("OSDGeneralTimeout", 2);
    637638    osd_prog_info_timeout= gContext->GetNumSetting("OSDProgramInfoTimeout", 3);
     639    osd_now_play_timeout = gContext->GetNumSetting("OSDNowPlayingTimeout", 10);
    638640    autoCommercialSkip   = (enum commSkipMode)gContext->GetNumSetting(
    639641                            "AutoCommercialSkip", CommSkipOff);
    640642    tryUnflaggedSkip     = gContext->GetNumSetting("TryUnflaggedSkip", 0);
     
    642644    stickykeys           = gContext->GetNumSetting("StickyKeys");
    643645    ff_rew_repos         = gContext->GetNumSetting("FFRewReposTime", 100)/100.0;
    644646    ff_rew_reverse       = gContext->GetNumSetting("FFRewReverse", 1);
     647    nowPlayEnabled       = gContext->GetNumSetting("EnableNowPlaying", 0);
    645648    int def[8] = { 3, 5, 10, 20, 30, 60, 120, 180 };
    646649    for (uint i = 0; i < sizeof(def)/sizeof(def[0]); i++)
    647650        ff_rew_speeds.push_back(
     
    52635266    osd->ClearAllText(whichInfo);
    52645267    osd->HideAll();
    52655268    osd->SetText(whichInfo, infoMap, osd_prog_info_timeout);
     5269
     5270    if (nowPlayEnabled && nvp->HasNowPlaying())
     5271        osd->SetNowPlaying("", osd_now_play_timeout);
    52665272}
    52675273
    52685274void TV::UpdateOSDSeekMessage(const QString &mesg, int disptime)
  • libs/libmythtv/avformatdecoder.h

     
    187187    void MpegPreProcessPkt(AVStream *stream, AVPacket *pkt);
    188188    void H264PreProcessPkt(AVStream *stream, AVPacket *pkt);
    189189
     190    void ProcessPrivSecDataPacket(const AVPacket *pkt);
    190191    void ProcessVBIDataPacket(const AVStream *stream, const AVPacket *pkt);
    191192    void ProcessDVBDataPacket(const AVStream *stream, const AVPacket *pkt);
    192193    void ProcessDSMCCPacket(const AVStream *stream, const AVPacket *pkt);
     
    278279    bool mpeg_seq_end_seen;
    279280    /// \brief contains last dvd still frame decoded
    280281    AVPacket *lastDVDStillFrame;
     282
     283    // Now Playing
     284    QStringList now_playing;
     285    bool nowPlayEnabled;
    281286};
    282287
    283288#endif
  • libs/libmythtv/osd.cpp

     
    19391939    osdlock.unlock();
    19401940}
    19411941
     1942void OSD::ResetNowPlaying(void)
     1943{
     1944    osdlock.lock();
     1945
     1946    QString my_name = "now_playing";
     1947
     1948    OSDSet *container = GetSet(my_name);
     1949    if (container)
     1950    {
     1951        container->Hide();
     1952
     1953        OSDTypeText *text = (OSDTypeText *)container->GetType("playing");
     1954        if (text)
     1955            text->SetText("");
     1956
     1957        m_setsvisible = false;
     1958        changed = true;
     1959    }
     1960
     1961    osdlock.unlock();
     1962}
     1963
     1964void OSD::SetNowPlaying(const QString &playing, int length)
     1965{
     1966    osdlock.lock();
     1967
     1968    QString my_name = "now_playing";
     1969
     1970    OSDSet *container = GetSet(my_name);
     1971    if (!container)
     1972    {
     1973        OSDSet *set = GetSet("now_playing");
     1974        if (!set)
     1975        {
     1976            VERBOSE(VB_IMPORTANT, "couldn't find now_playing dialog");
     1977            osdlock.unlock();
     1978            return;
     1979        }
     1980
     1981        container = new OSDSet(*set);
     1982        container->SetName(my_name);
     1983        container->SetCache(true);
     1984        container->SetPriority(20);
     1985        container->SetAllowFade(true);
     1986        AddSet(container, my_name, false);
     1987    }
     1988
     1989    if (container)
     1990    {
     1991        OSDTypeText *text = (OSDTypeText *)container->GetType("playing");
     1992
     1993        if (!playing.isNull() && !playing.isEmpty())
     1994            if (text)
     1995                text->SetText(playing);
     1996
     1997        if (length > 0)
     1998            container->DisplayFor(length * 1000000);
     1999        else
     2000            container->Display();
     2001
     2002        m_setsvisible = true;
     2003        changed = true;
     2004
     2005        //VERBOSE(VB_PLAYBACK, QString("NOW PLAYING: '%1'").arg(text->GetText()));
     2006    }
     2007
     2008    osdlock.unlock();
     2009}
     2010
    19422011void OSD::SetChannumText(const QString &text, int length)
    19432012{
    19442013    osdlock.lock();
  • libs/libavcodec/myth_utils.c

     
    203203
    204204        case CODEC_ID_DSMCC_B:          return "DSMCC_B";
    205205
     206            /* private data codecs */
     207        case CODEC_ID_DVB_PRIVSEC:      return "DVB_PRIVSEC";
     208
    206209        case CODEC_ID_MPEG2TS:          return "MPEG2TS";
    207210    }
    208211    return "Unknown Codec ID";
  • libs/libavcodec/avcodec.h

     
    289289    /* DSMCC codec */
    290290    CODEC_ID_DSMCC_B,
    291291
     292    /* Private Data */
     293    CODEC_ID_DVB_PRIVSEC= 0x19000,
     294
    292295    CODEC_ID_MPEG2TS= 0x20000, /* _FAKE_ codec to indicate a raw MPEG-2 TS
    293296                                * stream (only used by libavformat) */
    294297};
  • libs/libavformat/mpegts.c

     
    866866        case STREAM_TYPE_AUDIO_AAC:
    867867        case STREAM_TYPE_AUDIO_AC3:
    868868        case STREAM_TYPE_AUDIO_DTS:
     869        case STREAM_TYPE_PRIVATE_SECTION:
    869870        case STREAM_TYPE_PRIVATE_DATA:
    870871        case STREAM_TYPE_VBI_DVB:
    871872        case STREAM_TYPE_SUBTITLE_DVB:
     
    14541455            codec_type = CODEC_TYPE_DATA;
    14551456            codec_id = CODEC_ID_DSMCC_B;
    14561457            break;
     1458        case STREAM_TYPE_PRIVATE_SECTION:
     1459            codec_type = CODEC_TYPE_DATA;
     1460            codec_id = CODEC_ID_DVB_PRIVSEC;
     1461            break;
    14571462        case STREAM_TYPE_PRIVATE_DATA:
    14581463        default:
    14591464            if (code >= 0x1c0 && code <= 0x1df) {
     
    15531558                    if (pes->total_size)
    15541559                        pes->total_size += 6;
    15551560                    pes->pes_header_size = pes->header[8] + 9;
     1561                } else if (pes->header[0] == 0x00 && pes->header[1] == 0xd3 &&
     1562                           pes->header[2] == 0xb0) {
     1563                    /* private sections */
     1564                    if (!pes->st) {
     1565                        /* allocate stream */
     1566                        new_pes_av_stream(pes, code);
     1567                    }
     1568                    if (pes->header[7] != 0x00 && pes->header[7] != 0x01)
     1569                         pes->state = MPEGTS_PESHEADER_FILL;
     1570                    else
     1571                         pes->state = MPEGTS_PAYLOAD; /* No PTS/DTS info */
    15561572                } else {
    15571573                    /* otherwise, it should be a table */
    15581574                    /* skip packet */
  • programs/mythfrontend/globalsettings.cpp

     
    15711571    return gs;
    15721572}
    15731573
     1574static HostSpinBox *OSDNowPlayingTimeout()
     1575{
     1576    HostSpinBox *gs = new HostSpinBox("OSDNowPlayingTimeout", 1, 60, 1);
     1577    gs->setLabel(QObject::tr("Now Playing OSD time-out"));
     1578    gs->setValue(10);
     1579    gs->setHelpText(QObject::tr("If available, length of time the on-screen "
     1580                    "display will display Now Playing information."));
     1581    return gs;
     1582}
     1583
    15741584static HostSpinBox *ThemeCacheSize()
    15751585{
    15761586    HostSpinBox *gs = new HostSpinBox("ThemeCacheSize", 1, 1000, 1, true);
     
    18981908    return gc;
    18991909}
    19001910
     1911static HostCheckBox *EnableNowPlaying()
     1912{
     1913    HostCheckBox *gc = new HostCheckBox("EnableNowPlaying");
     1914    gc->setLabel(QObject::tr("Enable Now Playing Information"));
     1915    gc->setValue(false);
     1916    gc->setHelpText(QObject::tr(
     1917                        "If enabled and available, Now Playing "
     1918                        "information will be activated. This is used for "
     1919                        "some DVB radio channels."));
     1920    return gc;
     1921}
     1922
    19011923static HostCheckBox *PersistentBrowseMode()
    19021924{
    19031925    HostCheckBox *gc = new HostCheckBox("PersistentBrowseMode");
     
    46944716    osd->addChild(new ThemeSelector("OSDTheme"));
    46954717    osd->addChild(OSDGeneralTimeout());
    46964718    osd->addChild(OSDProgramInfoTimeout());
     4719    osd->addChild(OSDNowPlayingTimeout());
    46974720    osd->addChild(OSDFont());
    46984721    osd->addChild(OSDThemeFontSizeType());
    46994722    osd->addChild(EnableMHEG());
     4723    osd->addChild(EnableNowPlaying());
    47004724    osd->addChild(PersistentBrowseMode());
    47014725    addChild(osd);
    47024726