Ticket #6093: 6093-v2.patch

File 6093-v2.patch, 8.5 KB (added by danielk, 11 years ago)

Avoid UpdateProgramInfo? loop regression

  • libs/libmythtv/avformatdecoder.cpp

     
    26982698        if (*buf == 0x02)
    26992699        {
    27002700            buf += 3;
     2701/*
     2702            cerr<<QString("vbi_dvb(%1,%2)")
     2703                .arg((int)(*(buf+1)))
     2704                .arg((int)(*(buf+2))).toAscii().constData()
     2705                <<endl;
     2706*/
    27012707            ttd->Decode(buf+1, VBI_DVB);
    27022708        }
    27032709        else if (*buf == 0x03)
    27042710        {
    27052711            buf += 3;
     2712/*
     2713            cerr<<QString("sub_dvb(%1,%2)")
     2714                .arg((int)(*(buf+1)))
     2715                .arg((int)(*(buf+2))).toAscii().constData()
     2716                <<endl;
    27062717            ttd->Decode(buf+1, VBI_DVB_SUBTITLE);
     2718*/
    27072719        }
    27082720        else if (*buf == 0xff)
    27092721        {
    27102722            buf += 3;
     2723//            cerr<<"dvb(0xff)"<<endl;
    27112724        }
    27122725        else
    27132726        {
     
    35213534        int subIdx = selectedTrack[kTrackTypeSubtitle].av_stream_index;
    35223535        avcodeclock.unlock();
    35233536
     3537        static AVSubtitle subtitle;
     3538        memset(&subtitle, 0, sizeof(AVSubtitle));
     3539
    35243540        while (!have_err && len > 0)
    35253541        {
    35263542            int ret = 0;
     
    39273943                case CODEC_TYPE_SUBTITLE:
    39283944                {
    39293945                    int gotSubtitles = 0;
    3930                     AVSubtitle subtitle;
    3931                     memset(&subtitle, 0, sizeof(AVSubtitle));
    39323946
    39333947                    if (ringBuffer->isDVD())
    39343948                    {
     
    39543968                        avcodec_decode_subtitle(curstream->codec,
    39553969                                                &subtitle, &gotSubtitles,
    39563970                                                ptr, len);
     3971                        VERBOSE(VB_IMPORTANT,
     3972                                QString("avcodec_decode_subtitles -> %1")
     3973                                .arg(gotSubtitles));
    39573974                    }
     3975                    else
     3976                    {
     3977                        VERBOSE(VB_IMPORTANT, "subtitles in silent stream");
     3978                    }
    39583979
    39593980                    // the subtitle decoder always consumes the whole packet
    39603981                    ptr += len;
    39613982                    len = 0;
    39623983
    39633984                    if (gotSubtitles)
    3964                     {
     3985                    {
     3986                        VERBOSE(VB_IMPORTANT, "gotSubtitles");
    39653987                        subtitle.start_display_time += pts;
    39663988                        subtitle.end_display_time += pts;
    39673989                        GetNVP()->AddAVSubtitle(subtitle);
     3990                        memset(&subtitle, 0, sizeof(AVSubtitle));
    39683991                    }
    39693992
    39703993                    break;
  • libs/libmythui/mythuibuttonlist.h

     
    6565     */
    6666    MythImage *getImage(const QString &name="");
    6767
    68     void SetImage(const QString &filename, const QString &name="");
     68    void SetImage(const QString &filename, const QString &name="",
     69                  bool force_reload = false);
     70    QString GetImage(const QString &name="") const;
    6971    const QString Image() const;
    7072
    7173    void DisplayState(const QString &state, const QString &name);
  • libs/libmythui/mythuibuttonlist.cpp

     
    12471247    return NULL;
    12481248}
    12491249
    1250 void MythUIButtonListItem::SetImage(const QString &filename, const QString &name)
     1250void MythUIButtonListItem::SetImage(
     1251    const QString &filename, const QString &name, bool force_reload)
    12511252{
     1253    bool do_update = force_reload;
    12521254    if (!name.isEmpty())
    1253         m_imageFilenames.insert(name, filename);
    1254     else
     1255    {
     1256        QMap<QString, QString>::iterator it = m_imageFilenames.find(name);
     1257        if (it == m_imageFilenames.end())
     1258        {
     1259            m_imageFilenames.insert(name, filename);
     1260            do_update = true;
     1261        }
     1262        else if (*it != filename)
     1263        {
     1264            *it = filename;
     1265            do_update = true;
     1266        }
     1267    }
     1268    else if (m_imageFilename != filename)
     1269    {
    12551270        m_imageFilename = filename;
     1271        do_update = true;
     1272    }
    12561273
    1257     if (m_parent)
     1274    if (m_parent && do_update)
    12581275        m_parent->Update();
    12591276}
    12601277
     1278QString MythUIButtonListItem::GetImage(const QString &name) const
     1279{
     1280    if (name.isEmpty())
     1281        return m_imageFilename;
     1282
     1283    QMap<QString, QString>::const_iterator it = m_imageFilenames.find(name);
     1284    if (it != m_imageFilenames.end())
     1285        return *it;
     1286
     1287    return QString::null;
     1288}
     1289
    12611290void MythUIButtonListItem::DisplayState(const QString &state,
    12621291                                        const QString &name)
    12631292{
    12641293    if (name.isEmpty())
    12651294        return;
    12661295
    1267     m_states.insert(name, state);
     1296    bool do_update = false;
     1297    QMap<QString, QString>::iterator it = m_states.find(name);
     1298    if (it == m_states.end())
     1299    {
     1300        m_states.insert(name, state);
     1301        do_update = true;
     1302    }
     1303    else if (*it != state)
     1304    {
     1305        *it = state;
     1306        do_update = true;
     1307    }
    12681308
    1269     if (m_parent)
     1309    if (m_parent && do_update)
    12701310        m_parent->Update();
    12711311}
    12721312
  • programs/mythfrontend/playbackbox.cpp

     
    586586    updateIcons();
    587587}
    588588
    589 void PlaybackBox::UpdateProgramInfo(MythUIButtonListItem *item, bool is_sel)
     589void PlaybackBox::UpdateProgramInfo(
     590    MythUIButtonListItem *item, bool is_sel, bool force_preview_reload)
    590591{
    591592    if (!item)
    592593        return;
     
    596597    if (!pginfo)
    597598        return;
    598599
     600    VERBOSE(VB_IMPORTANT, QString("UpdateProgramInfo(%1)")
     601            .arg(pginfo->title));
     602
    599603    static const char *disp_flags[] = { "transcoding", "commflagging", };
    600604    const bool disp_flag_stat[] =
    601605    {
    602606        !JobQueue::IsJobQueuedOrRunning(
    603607            JOB_TRANSCODE, pginfo->chanid, pginfo->recstartts),
    604608        !JobQueue::IsJobQueuedOrRunning(
    605             JOB_COMMFLAG, pginfo->chanid, pginfo->recstartts),
     609            JOB_COMMFLAG,  pginfo->chanid, pginfo->recstartts),
    606610    };
    607611
    608612    for (uint i = 0; i < sizeof(disp_flags) / sizeof(char*); i++)
    609613        item->DisplayState(disp_flag_stat[i]?"yes":"no", disp_flags[i]);
    610614
    611     QString imagefile = getPreviewImage(pginfo);
     615    QString oldimgfile = item->GetImage("preview");
     616    QString imagefile = QString::null;
     617    if (oldimgfile.isEmpty() || force_preview_reload ||
     618        ((is_sel && GetFocusWidget() == m_recordingList)))
     619    {
     620        VERBOSE(VB_IMPORTANT, QString(
     621                    "%1 || %2 || (%3 && %4) -> true")
     622                .arg(oldimgfile.isEmpty())
     623                .arg(force_preview_reload)
     624                .arg(is_sel)
     625                .arg(GetFocusWidget() == m_recordingList));
     626        imagefile = getPreviewImage(pginfo);
     627    }
     628
    612629    if (!imagefile.isEmpty())
    613         item->SetImage(imagefile, "preview");
     630        item->SetImage(imagefile, "preview", force_preview_reload);
    614631
    615632    if ((GetFocusWidget() == m_recordingList) && is_sel)
    616633    {
     
    622639
    623640        if (m_previewImage)
    624641        {
     642            QString imagefile = getPreviewImage(pginfo);
    625643            m_previewImage->SetVisible(!imagefile.isEmpty());
    626644            m_previewImage->SetFilename(imagefile);
    627645            m_previewImage->Load();
     
    33413359        return;
    33423360
    33433361    MythUIButtonListItem *sel_item = m_recordingList->GetItemCurrent();
    3344     UpdateProgramInfo(item, item == sel_item);
     3362    UpdateProgramInfo(item, item == sel_item, true);
    33453363}
    33463364
    33473365bool check_lastmod(LastCheckedMap &elapsedtime, const QString &filename)
  • programs/mythfrontend/playbackbox.h

     
    291291    void updateIcons(const ProgramInfo *pginfo = NULL);
    292292    void updateUsage();
    293293    void updateGroupInfo(const QString &groupname);
    294     void UpdateProgramInfo(MythUIButtonListItem *item, bool is_sel);
     294    void UpdateProgramInfo(MythUIButtonListItem *item, bool is_sel,
     295                           bool force_preview_reload = false);
    295296
    296297    void SetTextFromMap(MythUIType *parent, QMap<QString, QString> &infoMap);
    297298    void ResetMap(MythUIType *parent, QMap<QString, QString> &infoMap);