Ticket #1544: mythdvd_bookmark_v2.patch

File mythdvd_bookmark_v2.patch, 10.9 KB (added by skamithi@…, 20 years ago)

v2 mythtv trunk patch for dvd bookmarks.

  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    980980            deleteIter = deleteMap.begin();
    981981        }
    982982    }
    983  
    984     // need this til proper DVD bookmarking is implemented
    985     if (!ringBuffer->isDVD())
    986         bookmarkseek = GetBookmark();
     983 
     984    if (ringBuffer->isDVD())
     985       ringBuffer->DVD()->JumpToTitle(false);
    987986
     987    bookmarkseek = GetBookmark();
     988
    988989    return IsErrored() ? -1 : 0;
    989990}
    990991
     
    28942895        GetDecoder()->setExactSeeks(false);
    28952896
    28962897        fftime = bookmarkseek;
     2898        if (ringBuffer->isDVD())
     2899            GetDVDBookmark();
     2900
    28972901        DoFastForward();
    28982902        fftime = 0;
    28992903
    29002904        GetDecoder()->setExactSeeks(seeks);
    29012905
    29022906        if (gContext->GetNumSetting("ClearSavedPosition", 1))
    2903             m_playbackinfo->SetBookmark(0);
     2907        {
     2908            if (ringBuffer->isDVD())
     2909                SetDVDBookmark(0);
     2910            else
     2911                m_playbackinfo->SetBookmark(0);
     2912        }
    29042913    }
    29052914
    29062915    commBreakMapLock.lock();
     
    33613370    if (!m_playbackinfo || !osd)
    33623371        return;
    33633372
     3373    if (ringBuffer->isDVD())
     3374    {
     3375        if (ringBuffer->InDVDMenuOrStillFrame())
     3376            SetDVDBookmark(0);
     3377        else
     3378            SetDVDBookmark(framesPlayed);
     3379    }
    33643380    m_playbackinfo->SetBookmark(framesPlayed);
    33653381    osd->SetSettingsText(QObject::tr("Position Saved"), 1);
    33663382}
     
    33703386    if (!m_playbackinfo || !osd)
    33713387        return;
    33723388
    3373     m_playbackinfo->SetBookmark(0);
     3389    if (ringBuffer->isDVD())
     3390        SetDVDBookmark(0);
     3391    else
     3392        m_playbackinfo->SetBookmark(0);
    33743393    osd->SetSettingsText(QObject::tr("Position Cleared"), 1);
    33753394}
    33763395
     
    33793398    if (!m_playbackinfo)
    33803399        return 0;
    33813400
     3401    if (ringBuffer->isDVD())
     3402        return GetDVDBookmark();
     3403
    33823404    return m_playbackinfo->GetBookmark();
    33833405}
    33843406
     
    59055927        ringBuffer->DVD()->GoToNextProgram();
    59065928}
    59075929
     5930long long NuppelVideoPlayer::GetDVDBookmark(void) const
     5931{
     5932    if (!ringBuffer->isDVD())
     5933        return 0;
     5934   
     5935    QStringList dvdbookmark = QStringList();
     5936    const char *name;
     5937    const char *serialid;
     5938    long long frames = 0;
     5939    bool delbookmark, jumptotitle;
     5940    delbookmark = jumptotitle = ringBuffer->DVD()->JumpToTitle();
     5941    if (m_playbackinfo && ringBuffer->isDVD())
     5942    {
     5943        ringBuffer->DVD()->GetNameAndSerialNum(&name,&serialid);
     5944        dvdbookmark = m_playbackinfo->GetDVDBookmark(QString(serialid),
     5945                                                        !delbookmark);
     5946        if (!dvdbookmark.empty())
     5947        {
     5948            QStringList::Iterator it = dvdbookmark.begin();
     5949            int title = atoi((*it).ascii());
     5950            frames = (long long)(atoi((*++it).ascii()) & 0xffffffffLL);
     5951            if (jumptotitle)
     5952            {
     5953                ringBuffer->DVD()->PlayTitleAndPart(title, 1);
     5954                int audiotrack = atoi((*++it).ascii());
     5955                int subtitletrack = atoi((*++it).ascii());
     5956                ringBuffer->DVD()->SetTrack(kTrackTypeAudio, audiotrack);
     5957                ringBuffer->DVD()->SetTrack(kTrackTypeSubtitle, subtitletrack);
     5958            }
     5959            ringBuffer->DVD()->JumpToTitle(true);
     5960        }
     5961    }
     5962    return frames;
     5963}
     5964
     5965void NuppelVideoPlayer::SetDVDBookmark(long long frames)
     5966{
     5967    if (!ringBuffer->isDVD())
     5968        return;
     5969
     5970    QStringList fields;
     5971    const char *name;
     5972    const char *serialid;
     5973    int title = 0;
     5974    int part;
     5975    int audiotrack = -1;
     5976    int subtitletrack = -1;
     5977    ringBuffer->DVD()->GetNameAndSerialNum(&name, &serialid);
     5978   
     5979    if (!ringBuffer->InDVDMenuOrStillFrame() &&
     5980            ringBuffer->DVD()->GetTotalTimeOfTitle() > 300 &&
     5981            frames > 0)
     5982    {
     5983        audiotrack = GetTrack(kTrackTypeAudio);
     5984        if (GetCaptionMode())
     5985            subtitletrack = GetTrack(kTrackTypeSubtitle);
     5986        ringBuffer->DVD()->GetPartAndTitle(part,title);
     5987    }
     5988   
     5989    if (m_playbackinfo)
     5990    {
     5991        fields += QString(serialid);
     5992        fields += QString(name);
     5993        fields += QString("%1").arg(title);
     5994        fields += QString("%1").arg(audiotrack);
     5995        fields += QString("%1").arg(subtitletrack);
     5996        fields += QString("%1").arg(frames);
     5997        m_playbackinfo->SetDVDBookmark(fields);
     5998    }   
     5999}
     6000
    59086001// EIA-708 caption support -- begin
    59096002void NuppelVideoPlayer::SetCurrentWindow(uint service_num, int window_id)
    59106003{
  • libs/libmythtv/NuppelVideoPlayer.h

     
    477477
    478478    // Private DVD stuff
    479479    void DisplayDVDButton(void);
     480    long long GetDVDBookmark(void) const;
     481    void SetDVDBookmark(long long frames);
    480482
    481483  private:
    482484    VideoOutputType forceVideoOutput;
  • libs/libmythtv/tv_play.cpp

     
    23982398                DoSeek(jumptime * 60, tr("Jump Ahead"));
    23992399            }
    24002400        }
    2401         else if (action == "JUMPBKMRK")
     2401        else if (action == "JUMPBKMRK" && !prbuffer->isDVD())
    24022402        {
    24032403            int bookmark = activenvp->GetBookmark();
    24042404            if (bookmark > frameRate)
     
    24832483            {
    24842484                nvp->Pause();
    24852485
    2486                 QString vmessage = tr("You are exiting this video");
     2486                QString vmessage;
     2487                if (prbuffer->isDVD())
     2488                    vmessage = tr("You are exiting this DVD");
     2489                else
     2490                    vmessage = tr("You are exiting this video");
    24872491
    24882492                QStringList voptions;
    2489                 voptions += tr("Exit to the menu");
     2493                if (prbuffer->isDVD())
     2494                {
     2495                    voptions += tr("Save this position and go to the menu");
     2496                    voptions += tr("Do not save, just exit to the menu");                               
     2497                }
     2498                else
     2499                    voptions += tr("Exit to the menu");
     2500                   
    24902501                voptions += tr("Keep watching");
    2491                 dialogname = "videoexitplayoptions";
     2502                if (prbuffer->isDVD())
     2503                    dialogname = "exitplayoptions";
     2504                else
     2505                    dialogname = "videoexitplayoptions";
    24922506                if (GetOSD())
    24932507                    GetOSD()->NewDialogBox(dialogname, vmessage, voptions, 0);
    24942508            }
     
    26382652            {
    26392653                if (!was_doing_ff_rew)
    26402654                {
     2655                    if (prbuffer->isDVD())
     2656                        prbuffer->DVD()->JumpToTitle(false);
     2657                   
    26412658                    if (gContext->GetNumSetting("AltClearSavedPosition", 1)
    26422659                        && nvp->GetBookmark())
    26432660                        nvp->ClearBookmark();
  • libs/libmythtv/programinfo.h

     
    177177    // DB gets
    178178    long long GetFilesize(void);
    179179    long long GetBookmark(void) const;
     180    QStringList GetDVDBookmark(QString serialid, bool delbookmark) const;
    180181    bool IsEditing(void) const;
    181182    bool IsCommFlagged(void) const;
    182183    bool IsInUse(QString &byWho) const;
     
    191192    // DB sets
    192193    void SetFilesize(long long fsize);
    193194    void SetBookmark(long long pos) const;
     195    void SetDVDBookmark(QStringList fields) const;
    194196    void SetEditing(bool edit) const;
    195197    void SetTranscoded(int transFlag) const;
    196198    void SetDeleteFlag(bool deleteFlag) const;
  • libs/libmythtv/programinfo.cpp

     
    17031703    return pos;
    17041704}
    17051705
     1706/** \fn ProgramInfo::GetDVDBookmark(QString serialid,bool delbookmark) const
     1707 *  \brief Queries "dvdbookmark" table for bookmarking using DVD
     1708 *  serial number. Deletes old dvd bookmarks if "delete" is true.
     1709 * 
     1710 *  \return list containing title,part,frame number
     1711 */
     1712QStringList ProgramInfo::GetDVDBookmark(QString serialid, bool delbookmark) const
     1713{
     1714    QStringList fields = QStringList();
     1715    MSqlQuery query(MSqlQuery::InitCon());
     1716
     1717    if (ignoreBookmark)
     1718        return fields;
     1719
     1720    if (delbookmark)
     1721    {
     1722        int days = -(gContext->GetNumSetting("DVDBookmarkDays",10));
     1723        QDateTime removedate = mythCurrentDateTime().addDays(days);
     1724        query.prepare(" DELETE from dvdbookmark "
     1725                        " WHERE timestamp < ? ");
     1726        query.addBindValue(removedate.toString(Qt::ISODate));
     1727   
     1728        if (!query.exec() || !query.isActive())
     1729            MythContext::DBError("GetDVDBookmark deleting old entries", query);
     1730    }
     1731   
     1732    query.prepare(" SELECT title , framenum , audionum, subtitlenum "
     1733                    " FROM dvdbookmark "
     1734                    " WHERE serialid = ? ");
     1735    query.addBindValue(serialid);
     1736
     1737    if (query.exec() && query.isActive() && query.size() > 0)
     1738    {
     1739        query.next();
     1740        for (int i = 0; i < 4 ; i++)
     1741            fields.append(query.value(i).toString());
     1742    }
     1743   
     1744    return fields;
     1745}
     1746
     1747void ProgramInfo::SetDVDBookmark(QStringList fields) const
     1748{
     1749
     1750    QStringList::Iterator it = fields.begin();
     1751    MSqlQuery query(MSqlQuery::InitCon());
     1752   
     1753    QString serialid = *(it);
     1754    QString name = *(++it);
     1755    QString title = *(++it);
     1756    QString audionum = *(++it);
     1757    QString subtitlenum = *(++it);
     1758    QString frame = *(++it);
     1759   
     1760    query.prepare("INSERT IGNORE INTO dvdbookmark "
     1761                    " ( serialid, name)"
     1762                    " VALUES ( :SERIALID , :NAME );");
     1763    query.bindValue(":SERIALID", serialid);
     1764    query.bindValue(":NAME", name);
     1765   
     1766    if (!query.exec() || !query.isActive())
     1767        MythContext::DBError("SetDVDBookmark inserting", query);
     1768
     1769
     1770    query.prepare(" UPDATE dvdbookmark  "
     1771                    " SET title          = ? , "
     1772                    "     audionum       = ? , "
     1773                    "     subtitlenum    = ? , "
     1774                    "     framenum       = ? , "
     1775                    "     timestamp      = NOW() "
     1776                    " WHERE serialid = ? ;");
     1777    query.addBindValue(title);
     1778    query.addBindValue(audionum);
     1779    query.addBindValue(subtitlenum);
     1780    query.addBindValue(frame);
     1781    query.addBindValue(serialid);
     1782
     1783    if (!query.exec() || !query.isActive())
     1784        MythContext::DBError("SetDVDBookmark updating", query);
     1785}
     1786
    17061787/** \fn ProgramInfo::IsEditing(void) const
    17071788 *  \brief Queries "recorded" table for its "editing" field
    17081789 *         and returns true if it is set to true.