Ticket #1544: mythdvd_bookmark_v1.patch
File mythdvd_bookmark_v1.patch, 17.1 KB (added by , 20 years ago) |
---|
-
libs/libmythtv/NuppelVideoPlayer.cpp
972 972 } 973 973 } 974 974 975 // need this til proper DVD bookmarking is implemented 976 if (!ringBuffer->isDVD()) 977 bookmarkseek = GetBookmark(); 975 bookmarkseek = GetBookmark(); 978 976 979 977 return IsErrored() ? -1 : 0; 980 978 } … … 3345 3343 if (!m_playbackinfo || !osd) 3346 3344 return; 3347 3345 3346 if (ringBuffer->isDVD()) 3347 { 3348 if (ringBuffer->InDVDMenuOrStillFrame()) 3349 return; 3350 else 3351 SetDVDBookmark(framesPlayed); 3352 } 3348 3353 m_playbackinfo->SetBookmark(framesPlayed); 3349 3354 osd->SetSettingsText(QObject::tr("Position Saved"), 1); 3350 3355 } … … 3354 3359 if (!m_playbackinfo || !osd) 3355 3360 return; 3356 3361 3357 m_playbackinfo->SetBookmark(0); 3362 if (ringBuffer->isDVD()) 3363 SetDVDBookmark(0); 3364 else 3365 m_playbackinfo->SetBookmark(0); 3358 3366 osd->SetSettingsText(QObject::tr("Position Cleared"), 1); 3359 3367 } 3360 3368 … … 3363 3371 if (!m_playbackinfo) 3364 3372 return 0; 3365 3373 3374 if (ringBuffer->isDVD()) 3375 return GetDVDBookmark(); 3376 3366 3377 return m_playbackinfo->GetBookmark(); 3367 3378 } 3368 3379 … … 5830 5841 ringBuffer->DVD()->GoToNextProgram(); 5831 5842 } 5832 5843 5844 long 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 5871 void 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 5833 5894 // EIA-708 caption support -- begin 5834 5895 void NuppelVideoPlayer::SetCurrentWindow(uint service_num, int window_id) 5835 5896 { -
libs/libmythtv/DVDRingBuffer.cpp
37 37 lastvobid(0), cellRepeated(false), 38 38 buttonstreamid(0), gotoCellStart(false), 39 39 menupktpts(0), autoselectaudio(true), 40 autoselectsubtitle(true), parent(0) 40 autoselectsubtitle(true), 41 ignoredvdbookmark(false), parent(0) 41 42 { 42 43 } 43 44 … … 125 126 .arg(curTitle).arg(titleParts)); 126 127 } 127 128 } 128 129 129 130 dvdnav_current_title_info(dvdnav, &title, &part); 131 dvdnav_get_title_string(dvdnav,&dvdname); 132 dvdnav_get_serial_number(dvdnav,&serialnumber); 130 133 return true; 131 134 } 132 135 } … … 909 912 } 910 913 } 911 914 915 double 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 912 927 void DVDRingBufferPriv::guess_palette(uint32_t *rgba_palette,uint8_t *palette, 913 928 uint8_t *alpha) 914 929 { -
libs/libmythtv/NuppelVideoPlayer.h
369 369 else 370 370 textDisplayMode &= ~kTrackTypeSubtitle; 371 371 } 372 long long GetDVDBookmark(void) const; 373 372 374 373 375 protected: 374 376 void DisplayPauseFrame(void); … … 476 478 477 479 // Private DVD stuff 478 480 void DisplayDVDButton(void); 481 void SetDVDBookmark(long long frames); 479 482 480 483 private: 481 484 VideoOutputType forceVideoOutput; -
libs/libmythtv/DVDRingBuffer.h
39 39 long long GetTotalReadPosition(void) { return titleLength; } 40 40 void GetDescForPos(QString &desc) const; 41 41 void GetPartAndTitle(int &_part, int &_title) const 42 { _part = part; _title = _title; }42 { _part = part; _title = title; } 43 43 uint GetTotalTimeOfTitle(void); 44 44 uint GetCellStart(void); 45 45 bool InStillFrame(void) { return cellHasStillFrame; } 46 46 bool IsWaiting(void) { return dvdWaiting; } 47 int 47 int NumPartsInTitle(void) { return titleParts; } 48 48 void GetMenuSPUPkt(uint8_t *buf, int len, int stream_id); 49 49 AVSubtitleRect *GetMenuButton(void); 50 50 bool IgnoringStillorWait(void) { return skipstillorwait; } … … 57 57 long long GetMenuPktPts(void) { return menupktpts; } 58 58 bool DecodeSubtitles(AVSubtitle * sub, int * gotSubtitles, 59 59 const uint8_t * buf, int buf_size); 60 void GetNameAndSerialNum(const char **_name, const char **_serial) 61 { (*_name) = dvdname; (*_serial) = serialnumber; } 60 62 63 bool IgnorePlayTitleAndPart(void) { return ignoredvdbookmark; } 64 double GetFrameRate(void); 65 61 66 // commands 62 67 bool OpenFile(const QString &filename); 68 void PlayTitleAndPart(int _title, int _part) 69 { dvdnav_part_play(dvdnav, _title, _part); } 63 70 void close(void); 64 71 bool nextTrack(void); 65 72 void prevTrack(void); … … 83 90 uint8_t GetNumAudioChannels(int id); 84 91 void AutoSelectAudio(bool setting) { autoselectaudio = setting; } 85 92 void AutoSelectSubtitle(bool setting) { autoselectsubtitle = setting; } 86 93 void IgnorePlayTitleAndPart(bool change) { ignoredvdbookmark = change; } 94 87 95 void SetParent(NuppelVideoPlayer *p) { parent = p; } 88 96 89 97 protected: … … 131 139 long long menupktpts; 132 140 bool autoselectaudio; 133 141 bool autoselectsubtitle; 142 const char *dvdname; 143 const char *serialnumber; 144 bool ignoredvdbookmark; 134 145 135 146 NuppelVideoPlayer *parent; 136 147 -
libs/libmythtv/tv_play.cpp
2453 2453 { 2454 2454 nvp->Pause(); 2455 2455 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"); 2457 2461 2458 2462 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 2460 2471 voptions += tr("Keep watching"); 2461 dialogname = "videoexitplayoptions"; 2472 if (prbuffer->isDVD()) 2473 dialogname = "exitplayoptions"; 2474 else 2475 dialogname = "videoexitplayoptions"; 2462 2476 if (GetOSD()) 2463 2477 GetOSD()->NewDialogBox(dialogname, vmessage, voptions, 0); 2464 2478 } … … 2608 2622 { 2609 2623 if (!was_doing_ff_rew) 2610 2624 { 2625 if (prbuffer->isDVD()) 2626 prbuffer->DVD()->IgnorePlayTitleAndPart(true); 2627 2611 2628 if (gContext->GetNumSetting("AltClearSavedPosition", 1) 2612 2629 && nvp->GetBookmark()) 2613 2630 nvp->ClearBookmark(); -
libs/libmythtv/programinfo.h
177 177 // DB gets 178 178 long long GetFilesize(void); 179 179 long long GetBookmark(void) const; 180 QStringList GetDVDBookmark(QString serialid, bool delbookmark) const; 180 181 bool IsEditing(void) const; 181 182 bool IsCommFlagged(void) const; 182 183 bool IsInUse(QString &byWho) const; … … 191 192 // DB sets 192 193 void SetFilesize(long long fsize); 193 194 void SetBookmark(long long pos) const; 195 void SetDVDBookmark(QStringList fields) const; 194 196 void SetEditing(bool edit) const; 195 197 void SetTranscoded(int transFlag) const; 196 198 void SetDeleteFlag(bool deleteFlag) const; -
libs/libmythtv/decoderbase.cpp
107 107 { 108 108 long long totframes; 109 109 keyframedist = 15; 110 fps = ringBuffer->DVD()->GetFrameRate(); 110 111 if (fps < 26 && fps > 24) 111 112 keyframedist = 12; 112 113 totframes = (long long)(ringBuffer->DVD()->GetTotalTimeOfTitle() * fps); -
libs/libmythtv/programinfo.cpp
1703 1703 return pos; 1704 1704 } 1705 1705 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 */ 1712 QStringList 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 1747 void 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 1706 1784 /** \fn ProgramInfo::IsEditing(void) const 1707 1785 * \brief Queries "recorded" table for its "editing" field 1708 1786 * and returns true if it is set to true. -
libs/libmythdvdnav/dvdnav.c
817 817 return DVDNAV_STATUS_OK; 818 818 } 819 819 820 dvdnav_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 820 831 uint8_t dvdnav_get_video_aspect(dvdnav_t *this) { 821 832 uint8_t retval; 822 833 … … 855 866 return retval; 856 867 } 857 868 869 uint8_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 858 888 uint16_t dvdnav_audio_stream_to_lang(dvdnav_t *this, uint8_t stream) { 859 889 audio_attr_t attr; 860 890 -
libs/libmythdvdnav/vm.c
124 124 } 125 125 #endif 126 126 127 static void dvd_read_name(char *name, c onst char *device) {127 static void dvd_read_name(char *name, char *serial, const char *device) { 128 128 /* Because we are compiling with _FILE_OFFSET_BITS=64 129 129 * all off_t are 64bit. 130 130 */ … … 160 160 fprintf(MSG_OUT, " "); 161 161 } 162 162 } 163 strncpy(serial, &data[73], 16); 163 164 fprintf(MSG_OUT, "\nlibdvdnav: DVD Title (Alternative): "); 164 165 for(i=89; i < 128; i++ ) { 165 166 if((data[i] == 0)) break; … … 320 321 fprintf(MSG_OUT, "libdvdnav: vm: faild to open/read the DVD\n"); 321 322 return 0; 322 323 } 323 dvd_read_name(vm->dvd_name, dvdroot);324 dvd_read_name(vm->dvd_name, vm->serial_number, dvdroot); 324 325 vm->map = remap_loadmap(vm->dvd_name); 325 326 vm->vmgi = ifoOpenVMGI(vm->dvd); 326 327 if(!vm->vmgi) { … … 860 861 return vm_get_video_attr(vm).permitted_df; 861 862 } 862 863 864 int vm_get_video_format(vm_t *vm) { 865 return vm_get_video_attr(vm).video_format; 866 } 867 863 868 video_attr_t vm_get_video_attr(vm_t *vm) { 864 869 switch ((vm->state).domain) { 865 870 case VTS_DOMAIN: -
libs/libmythdvdnav/dvdnav.h
526 526 dvdnav_status_t dvdnav_get_title_string(dvdnav_t *self, const char **title_str); 527 527 528 528 /* 529 * Return a string describing the serial number of the DVD 530 */ 531 dvdnav_status_t dvdnav_get_serial_number(dvdnav_t *self, const char **serial_str); 532 533 /* 529 534 * Get video aspect code. 530 535 * The aspect code does only change on VTS boundaries. 531 536 * See the DVDNAV_VTS_CHANGE event. … … 544 549 uint8_t dvdnav_get_video_scale_permission(dvdnav_t *self); 545 550 546 551 /* 552 * Get video format 553 * 0 - NTSC , 1 - PAL 554 */ 555 uint8_t dvdnav_get_video_format(dvdnav_t *self); 556 557 /* 547 558 * Converts a *logical* audio stream id into language code 548 559 * (returns 0xffff if no such stream). 549 560 */ -
libs/libmythdvdnav/vm.h
88 88 dvd_state_t state; 89 89 int32_t hop_channel; 90 90 char dvd_name[50]; 91 char serial_number[19]; 91 92 remap_t *map; 92 93 int stopped; 93 94 } vm_t; … … 168 169 #endif 169 170 int vm_get_video_aspect(vm_t *vm); 170 171 int vm_get_video_scale_permission(vm_t *vm); 172 int vm_get_video_format(vm_t *vm); 171 173 video_attr_t vm_get_video_attr(vm_t *vm); 172 174 audio_attr_t vm_get_audio_attr(vm_t *vm, int streamN); 173 175 subp_attr_t vm_get_subp_attr(vm_t *vm, int streamN);