Ticket #1544: mythdvd_bookmark_v1.patch

File mythdvd_bookmark_v1.patch, 17.1 KB (added by skamithi@…, 20 years ago)

v1 patch. mythtv trunk patch.

  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    972972        }
    973973    }
    974974 
    975     // need this til proper DVD bookmarking is implemented
    976     if (!ringBuffer->isDVD())
    977         bookmarkseek = GetBookmark();
     975    bookmarkseek = GetBookmark();
    978976
    979977    return IsErrored() ? -1 : 0;
    980978}
     
    33453343    if (!m_playbackinfo || !osd)
    33463344        return;
    33473345
     3346    if (ringBuffer->isDVD())
     3347    {
     3348        if (ringBuffer->InDVDMenuOrStillFrame())
     3349            return;
     3350        else
     3351            SetDVDBookmark(framesPlayed);
     3352    }
    33483353    m_playbackinfo->SetBookmark(framesPlayed);
    33493354    osd->SetSettingsText(QObject::tr("Position Saved"), 1);
    33503355}
     
    33543359    if (!m_playbackinfo || !osd)
    33553360        return;
    33563361
    3357     m_playbackinfo->SetBookmark(0);
     3362    if (ringBuffer->isDVD())
     3363        SetDVDBookmark(0);
     3364    else
     3365        m_playbackinfo->SetBookmark(0);
    33583366    osd->SetSettingsText(QObject::tr("Position Cleared"), 1);
    33593367}
    33603368
     
    33633371    if (!m_playbackinfo)
    33643372        return 0;
    33653373
     3374    if (ringBuffer->isDVD())
     3375        return GetDVDBookmark();
     3376
    33663377    return m_playbackinfo->GetBookmark();
    33673378}
    33683379
     
    58305841        ringBuffer->DVD()->GoToNextProgram();
    58315842}
    58325843
     5844long long NuppelVideoPlayer::GetDVDBookmark(void) const
     5845{
     5846    QStringList dvdbookmark = QStringList();
     5847    const char *name;
     5848    const char *serialid;
     5849    long long frames = 0;
     5850    bool delbookmark,donotPlay;
     5851    delbookmark = donotPlay = ringBuffer->DVD()->IgnorePlayTitleAndPart();
     5852    if (m_playbackinfo && ringBuffer->isDVD())
     5853    {
     5854        ringBuffer->DVD()->GetNameAndSerialNum(&name,&serialid);
     5855        dvdbookmark = m_playbackinfo->GetDVDBookmark(QString(serialid),
     5856                              !delbookmark);
     5857        if (!dvdbookmark.empty())
     5858        {
     5859            QStringList::Iterator it = dvdbookmark.begin();
     5860            int title = atoi((*it).ascii());
     5861            int part  = atoi((*++it).ascii());
     5862            frames = (long long)(atoi((*++it).ascii()) & 0xffffffffLL);
     5863            if (!donotPlay)
     5864                ringBuffer->DVD()->PlayTitleAndPart(title, part);
     5865            ringBuffer->DVD()->IgnorePlayTitleAndPart(false);
     5866        }
     5867    }
     5868    return frames;
     5869}
     5870
     5871void NuppelVideoPlayer::SetDVDBookmark(long long frames)
     5872{
     5873    QStringList fields;
     5874    const char *name;
     5875    const char *serialid;
     5876    int title = 0;
     5877    int part = 0;
     5878    ringBuffer->DVD()->GetNameAndSerialNum(&name, &serialid);
     5879    if (frames != 0)
     5880        ringBuffer->DVD()->GetPartAndTitle(part, title);
     5881    if (m_playbackinfo && ringBuffer->isDVD() &&
     5882            !ringBuffer->InDVDMenuOrStillFrame() &&
     5883            ringBuffer->DVD()->GetTotalTimeOfTitle() > 300)
     5884    {
     5885        fields += QString(serialid);
     5886        fields += QString(name);
     5887        fields += QString("%1").arg(title);
     5888        fields += QString("%1").arg(part);
     5889        fields += QString("%1").arg(frames);
     5890        m_playbackinfo->SetDVDBookmark(fields);
     5891    }   
     5892}
     5893
    58335894// EIA-708 caption support -- begin
    58345895void NuppelVideoPlayer::SetCurrentWindow(uint service_num, int window_id)
    58355896{
  • libs/libmythtv/DVDRingBuffer.cpp

     
    3737      lastvobid(0), cellRepeated(false),
    3838      buttonstreamid(0), gotoCellStart(false),
    3939      menupktpts(0), autoselectaudio(true),
    40       autoselectsubtitle(true), parent(0)
     40      autoselectsubtitle(true),
     41      ignoredvdbookmark(false), parent(0)
    4142{
    4243}
    4344
     
    125126                        .arg(curTitle).arg(titleParts));
    126127            }
    127128        }
    128 
     129       
    129130        dvdnav_current_title_info(dvdnav, &title, &part);
     131        dvdnav_get_title_string(dvdnav,&dvdname);
     132        dvdnav_get_serial_number(dvdnav,&serialnumber);
    130133        return true;
    131134    }
    132135}
     
    909912    }
    910913}
    911914
     915double DVDRingBufferPriv::GetFrameRate(void)
     916{
     917    float dvdfps = 0;
     918    int format = dvdnav_get_video_format(dvdnav);
     919    if (format)
     920        dvdfps = 23.97;
     921    else
     922        dvdfps = 29.97;
     923
     924    return dvdfps;
     925}
     926
    912927void DVDRingBufferPriv::guess_palette(uint32_t *rgba_palette,uint8_t *palette,
    913928                                        uint8_t *alpha)
    914929{
  • libs/libmythtv/NuppelVideoPlayer.h

     
    369369        else
    370370            textDisplayMode &= ~kTrackTypeSubtitle;
    371371    }
     372    long long GetDVDBookmark(void) const;
     373       
    372374
    373375  protected:
    374376    void DisplayPauseFrame(void);
     
    476478
    477479    // Private DVD stuff
    478480    void DisplayDVDButton(void);
     481    void SetDVDBookmark(long long frames);
    479482
    480483  private:
    481484    VideoOutputType forceVideoOutput;
  • libs/libmythtv/DVDRingBuffer.h

     
    3939    long long GetTotalReadPosition(void) { return titleLength; }
    4040    void GetDescForPos(QString &desc) const;
    4141    void GetPartAndTitle(int &_part, int &_title) const
    42         { _part  = part; _title = _title; }
     42        { _part  = part; _title = title; }
    4343    uint GetTotalTimeOfTitle(void);
    4444    uint GetCellStart(void);
    4545    bool InStillFrame(void) { return cellHasStillFrame; }
    4646    bool IsWaiting(void) { return dvdWaiting; }
    47     int    NumPartsInTitle(void) { return titleParts; }
     47    int  NumPartsInTitle(void) { return titleParts; }
    4848    void GetMenuSPUPkt(uint8_t *buf, int len, int stream_id);
    4949    AVSubtitleRect *GetMenuButton(void);
    5050    bool IgnoringStillorWait(void) { return skipstillorwait; }
     
    5757    long long GetMenuPktPts(void) { return menupktpts; }
    5858    bool DecodeSubtitles(AVSubtitle * sub, int * gotSubtitles,
    5959                         const uint8_t * buf, int buf_size);
     60    void GetNameAndSerialNum(const char **_name, const char **_serial)
     61        { (*_name) = dvdname; (*_serial) = serialnumber; }
    6062
     63    bool IgnorePlayTitleAndPart(void) { return ignoredvdbookmark; }
     64    double GetFrameRate(void);
     65   
    6166    // commands
    6267    bool OpenFile(const QString &filename);
     68    void PlayTitleAndPart(int _title, int _part)
     69        { dvdnav_part_play(dvdnav, _title, _part); }
    6370    void close(void);
    6471    bool nextTrack(void);
    6572    void prevTrack(void);
     
    8390    uint8_t GetNumAudioChannels(int id);
    8491    void AutoSelectAudio(bool setting) { autoselectaudio = setting; }
    8592    void AutoSelectSubtitle(bool setting) { autoselectsubtitle = setting; }
    86 
     93    void IgnorePlayTitleAndPart(bool change) { ignoredvdbookmark = change; }
     94   
    8795    void SetParent(NuppelVideoPlayer *p) { parent = p; }
    8896   
    8997  protected:
     
    131139    long long      menupktpts;
    132140    bool           autoselectaudio;
    133141    bool           autoselectsubtitle;
     142    const char     *dvdname;
     143    const char     *serialnumber;
     144    bool           ignoredvdbookmark;
    134145
    135146    NuppelVideoPlayer *parent;
    136147
  • libs/libmythtv/tv_play.cpp

     
    24532453            {
    24542454                nvp->Pause();
    24552455
    2456                 QString vmessage = tr("You are exiting this video");
     2456                QString vmessage;
     2457                if (prbuffer->isDVD())
     2458                    vmessage = tr("You are exiting this DVD");
     2459                else
     2460                    vmessage = tr("You are exiting this video");
    24572461
    24582462                QStringList voptions;
    2459                 voptions += tr("Exit to the menu");
     2463                if (prbuffer->isDVD())
     2464                {
     2465                    voptions += tr("Save this position and go to the menu");
     2466                    voptions += tr("Do not save, just exit to the menu");                               
     2467                }
     2468                else
     2469                    voptions += tr("Exit to the menu");
     2470                   
    24602471                voptions += tr("Keep watching");
    2461                 dialogname = "videoexitplayoptions";
     2472                if (prbuffer->isDVD())
     2473                    dialogname = "exitplayoptions";
     2474                else
     2475                    dialogname = "videoexitplayoptions";
    24622476                if (GetOSD())
    24632477                    GetOSD()->NewDialogBox(dialogname, vmessage, voptions, 0);
    24642478            }
     
    26082622            {
    26092623                if (!was_doing_ff_rew)
    26102624                {
     2625                    if (prbuffer->isDVD())
     2626                        prbuffer->DVD()->IgnorePlayTitleAndPart(true);
     2627                   
    26112628                    if (gContext->GetNumSetting("AltClearSavedPosition", 1)
    26122629                        && nvp->GetBookmark())
    26132630                        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/decoderbase.cpp

     
    107107    {
    108108        long long totframes;
    109109        keyframedist = 15;
     110        fps = ringBuffer->DVD()->GetFrameRate();
    110111        if (fps < 26 && fps > 24)
    111112           keyframedist = 12;
    112113        totframes = (long long)(ringBuffer->DVD()->GetTotalTimeOfTitle() * fps);
  • 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 , part , frame "
     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 < 3 ; 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 part = *(++it);
     1757    QString frame = *(++it);
     1758   
     1759    query.prepare("INSERT IGNORE INTO dvdbookmark "
     1760                    " ( serialid, name, title, part, frame, timestamp )"
     1761                    " VALUES ( :SERIALID , :NAME , 0 , 0 , 0, NOW() );");
     1762    query.bindValue(":SERIALID", serialid);
     1763    query.bindValue(":NAME", name);
     1764   
     1765    if (!query.exec() || !query.isActive())
     1766        MythContext::DBError("SetDVDBookmark inserting", query);
     1767
     1768
     1769    query.prepare(" UPDATE dvdbookmark  "
     1770                    " SET title = ? , "
     1771                    "      part = ? , "
     1772                    "     frame = ? , "
     1773                    " timestamp = NOW() "
     1774                    " WHERE serialid = ? ;");
     1775    query.addBindValue(title);
     1776    query.addBindValue(part);
     1777    query.addBindValue(frame);
     1778    query.addBindValue( serialid);
     1779
     1780    if (!query.exec() || !query.isActive())
     1781        MythContext::DBError("SetDVDBookmark updating", query);
     1782}
     1783
    17061784/** \fn ProgramInfo::IsEditing(void) const
    17071785 *  \brief Queries "recorded" table for its "editing" field
    17081786 *         and returns true if it is set to true.
  • libs/libmythdvdnav/dvdnav.c

     
    817817  return DVDNAV_STATUS_OK;
    818818}
    819819
     820dvdnav_status_t dvdnav_get_serial_number(dvdnav_t *this, const char **serial_str) {
     821
     822  if(!this || !serial_str) {
     823     printerr("Passed a NULL pointer.");
     824     return DVDNAV_STATUS_ERR;
     825  }
     826
     827  (*serial_str) = this->vm->serial_number;
     828  return DVDNAV_STATUS_OK;
     829}
     830
    820831uint8_t dvdnav_get_video_aspect(dvdnav_t *this) {
    821832  uint8_t         retval;
    822833 
     
    855866  return retval;
    856867}
    857868
     869uint8_t dvdnav_get_video_format(dvdnav_t *this) {
     870  uint8_t         retval;
     871
     872  if(!this) {
     873    printerr("Passed a NULL pointer.");
     874    return -1;
     875  }
     876  if(!this->started) {
     877   printerr("Virtual DVD machine not started.");
     878   return -1;
     879  }
     880 
     881  pthread_mutex_lock(&this->vm_lock);
     882  retval = (uint8_t)vm_get_video_format(this->vm);
     883  pthread_mutex_unlock(&this->vm_lock);
     884
     885  return retval;
     886}
     887
    858888uint16_t dvdnav_audio_stream_to_lang(dvdnav_t *this, uint8_t stream) {
    859889  audio_attr_t  attr;
    860890 
  • libs/libmythdvdnav/vm.c

     
    124124}
    125125#endif
    126126
    127 static void dvd_read_name(char *name, const char *device) {
     127static void dvd_read_name(char *name, char *serial, const char *device) {
    128128    /* Because we are compiling with _FILE_OFFSET_BITS=64
    129129     * all off_t are 64bit.
    130130     */
     
    160160              fprintf(MSG_OUT, " ");
    161161            }
    162162          }
     163          strncpy(serial, &data[73], 16);
    163164          fprintf(MSG_OUT, "\nlibdvdnav: DVD Title (Alternative): ");
    164165          for(i=89; i < 128; i++ ) {
    165166            if((data[i] == 0)) break;
     
    320321      fprintf(MSG_OUT, "libdvdnav: vm: faild to open/read the DVD\n");
    321322      return 0;
    322323    }
    323     dvd_read_name(vm->dvd_name, dvdroot);
     324    dvd_read_name(vm->dvd_name, vm->serial_number, dvdroot);
    324325    vm->map  = remap_loadmap(vm->dvd_name);
    325326    vm->vmgi = ifoOpenVMGI(vm->dvd);
    326327    if(!vm->vmgi) {
     
    860861  return vm_get_video_attr(vm).permitted_df;
    861862}
    862863
     864int vm_get_video_format(vm_t *vm) {
     865  return vm_get_video_attr(vm).video_format;
     866}
     867
    863868video_attr_t vm_get_video_attr(vm_t *vm) {
    864869  switch ((vm->state).domain) {
    865870  case VTS_DOMAIN:
  • libs/libmythdvdnav/dvdnav.h

     
    526526dvdnav_status_t dvdnav_get_title_string(dvdnav_t *self, const char **title_str);
    527527
    528528/*
     529 * Return a string describing the serial number of the DVD
     530 */
     531dvdnav_status_t dvdnav_get_serial_number(dvdnav_t *self, const char **serial_str);
     532 
     533/*
    529534 * Get video aspect code.
    530535 * The aspect code does only change on VTS boundaries.
    531536 * See the DVDNAV_VTS_CHANGE event.
     
    544549uint8_t dvdnav_get_video_scale_permission(dvdnav_t *self);
    545550
    546551/*
     552 * Get video format
     553 * 0 - NTSC , 1 - PAL
     554 */
     555uint8_t dvdnav_get_video_format(dvdnav_t *self);
     556
     557/*
    547558 * Converts a *logical* audio stream id into language code
    548559 * (returns 0xffff if no such stream).
    549560 */
  • libs/libmythdvdnav/vm.h

     
    8888  dvd_state_t   state;
    8989  int32_t       hop_channel;
    9090  char          dvd_name[50];
     91  char          serial_number[19];
    9192  remap_t      *map;
    9293  int           stopped;
    9394} vm_t;
     
    168169#endif
    169170int  vm_get_video_aspect(vm_t *vm);
    170171int  vm_get_video_scale_permission(vm_t *vm);
     172int  vm_get_video_format(vm_t *vm);
    171173video_attr_t vm_get_video_attr(vm_t *vm);
    172174audio_attr_t vm_get_audio_attr(vm_t *vm, int streamN);
    173175subp_attr_t  vm_get_subp_attr(vm_t *vm, int streamN);