Ticket #8791: multiangle.diff
File multiangle.diff, 16.9 KB (added by , 14 years ago) |
---|
-
libs/libmythtv/mythbdplayer.h
13 13 virtual int64_t GetChapter(int chapter); 14 14 15 15 virtual int GetNumTitles(void) const; 16 virtual int GetNumAngles(void) const; 16 17 virtual int GetCurrentTitle(void) const; 18 virtual int GetCurrentAngle(void) const; 17 19 virtual int GetTitleDuration(int title) const; 18 20 virtual QString GetTitleName(int title) const; 21 virtual QString GetAngleName(int angle) const; 19 22 virtual bool SwitchTitle(int title); 20 23 virtual bool PrevTitle(void); 21 24 virtual bool NextTitle(void); 25 virtual bool SwitchAngle(int angle); 26 virtual bool PrevAngle(void); 27 virtual bool NextAngle(void); 22 28 }; 23 29 24 30 #endif // MYTHBDPLAYER_H -
libs/libmythtv/DVDRingBuffer.cpp
38 38 m_currentpos(0), 39 39 m_lastNav(NULL), m_part(0), 40 40 m_title(0), m_titleParts(0), 41 m_gotStop(false), 41 m_gotStop(false), m_currentAngle(0), 42 m_currentTitleAngleCount(0), 42 43 m_cellHasStillFrame(false), m_audioStreamsChanged(false), 43 44 m_dvdWaiting(false), 44 45 m_titleLength(0), m_hl_button(0, 0, 0, 0), … … 187 188 188 189 int32_t numTitles = 0; 189 190 m_titleParts = 0; 191 190 192 dvdnav_title_play(m_dvdnav, 0); 191 193 dvdRet = dvdnav_get_number_of_titles(m_dvdnav, &numTitles); 192 194 if (numTitles == 0 ) … … 220 222 dvdnav_current_title_info(m_dvdnav, &m_title, &m_part); 221 223 dvdnav_get_title_string(m_dvdnav, &m_dvdname); 222 224 dvdnav_get_serial_string(m_dvdnav, &m_serialnumber); 225 dvdnav_get_angle_info(m_dvdnav, &m_currentAngle, &m_currentTitleAngleCount); 223 226 SetDVDSpeed(); 224 227 VERBOSE(VB_PLAYBACK, QString("DVD Serial Number %1").arg(m_serialnumber)); 225 228 return true; … … 1498 1501 s->rects[0]->y += y1; 1499 1502 return 1; 1500 1503 } 1504 1505 bool DVDRingBufferPriv::SwitchAngle(uint angle) 1506 { 1507 if (m_dvdnav) 1508 { 1509 VERBOSE(VB_IMPORTANT, LOC + QString("Switching to Angle %1...") 1510 .arg(angle)); 1511 dvdnav_status_t status = dvdnav_angle_change(m_dvdnav, 1512 (int32_t)angle); 1513 if (status == DVDNAV_STATUS_OK) 1514 { 1515 m_currentAngle = angle; 1516 return true; 1517 } 1518 else 1519 return false; 1520 } 1521 else 1522 return false; 1523 } 1524 -
libs/libmythtv/tv_play.h
448 448 int GetTitleDuration(const PlayerContext *ctx, int title) const; 449 449 QString GetTitleName(const PlayerContext *ctx, int title) const; 450 450 void DoSwitchTitle(PlayerContext*, int title); 451 int GetNumAngles(const PlayerContext *ctx) const; 452 int GetCurrentAngle(const PlayerContext *ctx) const; 453 QString GetAngleName(const PlayerContext *ctx, int angle) const; 454 void DoSwitchAngle(PlayerContext*, int angle); 451 455 void DoJumpChapter(PlayerContext*, int direction); 452 456 void DoSkipCommercials(PlayerContext*, int direction); 453 457 -
libs/libmythtv/BDRingBuffer.cpp
72 72 m_titlesize = 0; 73 73 m_currentTime = 0; 74 74 m_currentTitleInfo = NULL; 75 m_currentTitleAngleCount = 0; 76 m_currentAngle = 0; 75 77 76 78 VERBOSE(VB_IMPORTANT, LOC + QString("Found %1 relevant titles.") 77 79 .arg(m_numTitles)); … … 164 166 return false; 165 167 166 168 m_currentTitleLength = m_currentTitleInfo->duration; 169 m_currentTitleAngleCount = m_currentTitleInfo->angle_count; 170 m_currentAngle = 0; 167 171 bd_select_title(bdnav, title); 168 172 uint32_t chapter_count = m_currentTitleInfo->chapter_count; 169 173 VERBOSE(VB_IMPORTANT, LOC + QString("Selected title: index %1. " 170 174 "Duration: %2 (%3 mins) " 171 "Number of Chapters: %4 ")175 "Number of Chapters: %4 Number of Angles: %5") 172 176 .arg(title) 173 177 .arg(m_currentTitleLength) 174 178 .arg(m_currentTitleLength / (90000 * 60)) 175 .arg(chapter_count)); 179 .arg(chapter_count) 180 .arg(m_currentTitleAngleCount)); 176 181 VERBOSE(VB_PLAYBACK, LOC + QString("Frame Rate: %1").arg(GetFrameRate())); 177 182 if (chapter_count) 178 183 { … … 198 203 return false; 199 204 } 200 205 206 bool BDRingBufferPriv::SwitchAngle(uint angle) 207 { 208 if (bdnav) 209 { 210 VERBOSE(VB_IMPORTANT, LOC + QString("Switching to Angle %1...") 211 .arg(angle)); 212 bd_seamless_angle_change(bdnav, angle); 213 m_currentAngle = angle; 214 return true; 215 } 216 else 217 return false; 218 } 219 201 220 uint64_t BDRingBufferPriv::GetTotalReadPosition(void) 202 221 { 203 222 if (bdnav) … … 289 308 } 290 309 291 310 return iso639_str3_to_key("und"); 292 } 293 No newline at end of file 311 } -
libs/libmythtv/mythdvdplayer.h
46 46 47 47 void HideDVDButton(bool hide) { hidedvdbutton = hide; } 48 48 49 virtual int GetNumAngles(void) const; 50 virtual int GetCurrentAngle(void) const; 51 virtual QString GetAngleName(int angle) const; 52 virtual bool SwitchAngle(int angle); 53 49 54 private: 50 55 void SetDVDBookmark(uint64_t frame); 51 56 void DisplayDVDButton(void); -
libs/libmythtv/mythbdplayer.cpp
61 61 return 0; 62 62 } 63 63 64 int MythBDPlayer::GetNumAngles(void) const 65 { 66 if (player_ctx->buffer->BD() && player_ctx->buffer->BD()->IsOpen()) 67 return player_ctx->buffer->BD()->GetNumAngles(); 68 return 0; 69 } 70 64 71 int MythBDPlayer::GetCurrentTitle(void) const 65 72 { 66 73 if (player_ctx->buffer->BD() && player_ctx->buffer->BD()->IsOpen()) … … 68 75 return -1; 69 76 } 70 77 78 int MythBDPlayer::GetCurrentAngle(void) const 79 { 80 if (player_ctx->buffer->BD() && player_ctx->buffer->BD()->IsOpen()) 81 return player_ctx->buffer->BD()->GetCurrentAngle(); 82 return -1; 83 } 84 71 85 int MythBDPlayer::GetTitleDuration(int title) const 72 86 { 73 87 if (player_ctx->buffer->BD() && player_ctx->buffer->BD()->IsOpen() && … … 95 109 return QString(); 96 110 } 97 111 112 QString MythBDPlayer::GetAngleName(int angle) const 113 { 114 if (angle >= 0 && angle < GetNumAngles()) 115 { 116 QString name = QObject::tr("Angle %1").arg(angle+1); 117 return name; 118 } 119 return QString(); 120 } 121 98 122 bool MythBDPlayer::SwitchTitle(int title) 99 123 { 100 124 uint total = GetNumTitles(); … … 134 158 135 159 return SwitchTitle(prev); 136 160 } 161 162 bool MythBDPlayer::SwitchAngle(int angle) 163 { 164 uint total = GetNumAngles(); 165 if (!total || angle == GetCurrentAngle()) 166 return false; 167 168 if (angle >= (int)total) 169 angle = 0; 170 171 bool ok = static_cast<bool>(player_ctx->buffer->BD()->SwitchAngle(angle)); 172 173 return ok; 174 } 175 176 bool MythBDPlayer::NextAngle(void) 177 { 178 uint total = GetNumAngles(); 179 int next = GetCurrentAngle() + 1; 180 if (!total) 181 return false; 182 183 if (next >= (int)total) 184 next = 0; 185 186 return SwitchAngle(next); 187 } 188 189 bool MythBDPlayer::PrevAngle(void) 190 { 191 uint total = GetNumAngles(); 192 int prev = GetCurrentAngle() - 1; 193 if (!total || total == 1) 194 return false; 195 196 if (prev < 0) 197 prev = total; 198 199 return SwitchAngle(prev); 200 } 201 -
libs/libmythtv/mythplayer.h
269 269 virtual bool NextTitle(void) { return false; } 270 270 virtual bool PrevTitle(void) { return false; } 271 271 272 // Angle stuff 273 virtual bool SwitchAngle(int title) { return false; } 274 virtual bool NextAngle(void) { return false; } 275 virtual bool PrevAngle(void) { return false; } 276 272 277 // Commercial stuff 273 278 void SetAutoCommercialSkip(CommSkipMode autoskip) 274 279 { commBreakMap.SetAutoCommercialSkip(autoskip, framesPlayed); } … … 389 394 virtual int GetTitleDuration(int title) const { return 0; } 390 395 virtual QString GetTitleName(int title) const { return QString(); } 391 396 397 // Angle public stuff 398 virtual int GetNumAngles(void) const { return 0; } 399 virtual int GetCurrentAngle(void) const { return 0; } 400 virtual QString GetAngleName(int title) const { return QString(); } 401 392 402 // DVD public stuff 393 403 virtual void ChangeDVDTrack(bool ffw) { (void) ffw; } 394 404 virtual bool GoToDVDMenu(QString str) { return false; } -
libs/libmythtv/mythdvdplayer.cpp
465 465 } 466 466 player_ctx->UnlockPlayingInfo(__FILE__, __LINE__); 467 467 } 468 469 int MythDVDPlayer::GetNumAngles(void) const 470 { 471 if (player_ctx->buffer->DVD() && player_ctx->buffer->DVD()->IsOpen()) 472 return player_ctx->buffer->DVD()->GetNumAngles(); 473 return 0; 474 } 475 476 int MythDVDPlayer::GetCurrentAngle(void) const 477 { 478 if (player_ctx->buffer->DVD() && player_ctx->buffer->DVD()->IsOpen()) 479 return player_ctx->buffer->DVD()->GetCurrentAngle(); 480 return -1; 481 } 482 483 QString MythDVDPlayer::GetAngleName(int angle) const 484 { 485 if (angle >= 0 && angle < GetNumAngles()) 486 { 487 QString name = QObject::tr("Angle %1").arg(angle+1); 488 return name; 489 } 490 return QString(); 491 } 492 493 bool MythDVDPlayer::SwitchAngle(int angle) 494 { 495 uint total = GetNumAngles(); 496 if (!total || angle == GetCurrentAngle()) 497 return false; 498 499 if (angle >= (int)total) 500 angle = 0; 501 502 bool ok = static_cast<bool>(player_ctx->buffer->DVD()->SwitchAngle(angle)); 503 504 return ok; 505 } 506 -
libs/libmythtv/DVDRingBuffer.h
34 34 // gets 35 35 int GetTitle(void) const { return m_title; } 36 36 int GetPart(void) const { return m_part; } 37 int GetCurrentAngle(void) const { return m_currentAngle; }; 38 int GetNumAngles(void) { return m_currentTitleAngleCount; }; 37 39 bool IsInMenu(bool update = false); 38 40 bool IsOpen(void) const { return m_dvdnav; } 39 41 long long GetReadPosition(void); … … 108 110 void JumpToTitle(bool change) { m_jumptotitle = change; } 109 111 void SetDVDSpeed(void); 110 112 void SetDVDSpeed(int speed); 113 bool SwitchAngle(uint angle); 111 114 112 115 void SetParent(MythDVDPlayer *p) { m_parent = p; } 113 116 … … 130 133 int32_t m_title; 131 134 int32_t m_titleParts; 132 135 bool m_gotStop; 136 int m_currentAngle; 137 int m_currentTitleAngleCount; 133 138 134 139 bool m_cellHasStillFrame; 135 140 bool m_audioStreamsChanged; -
libs/libmythtv/tv_play.cpp
6044 6044 return currentTitle; 6045 6045 } 6046 6046 6047 int TV::GetNumAngles(const PlayerContext *ctx) const 6048 { 6049 int num_angles = 0; 6050 ctx->LockDeletePlayer(__FILE__, __LINE__); 6051 if (ctx->player) 6052 num_angles = ctx->player->GetNumAngles(); 6053 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 6054 return num_angles; 6055 } 6056 6057 int TV::GetCurrentAngle(const PlayerContext *ctx) const 6058 { 6059 int currentAngle = 0; 6060 ctx->LockDeletePlayer(__FILE__, __LINE__); 6061 if (ctx->player) 6062 currentAngle = ctx->player->GetCurrentAngle(); 6063 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 6064 return currentAngle; 6065 } 6066 6067 QString TV::GetAngleName(const PlayerContext *ctx, int angle) const 6068 { 6069 QString name; 6070 ctx->LockDeletePlayer(__FILE__, __LINE__); 6071 if (ctx->player) 6072 name = ctx->player->GetAngleName(angle); 6073 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 6074 return name; 6075 } 6076 6047 6077 int TV::GetTitleDuration(const PlayerContext *ctx, int title) const 6048 6078 { 6049 6079 int seconds = 0; … … 6086 6116 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 6087 6117 } 6088 6118 6119 void TV::DoSwitchAngle(PlayerContext *ctx, int angle) 6120 { 6121 NormalSpeed(ctx); 6122 StopFFRew(ctx); 6123 6124 PauseAudioUntilBuffered(ctx); 6125 6126 osdInfo info; 6127 ctx->CalcPlayerSliderPosition(info); 6128 info.text["description"] = tr("Switch Angle"); 6129 info.text["title"] = tr("Switching"); 6130 UpdateOSDStatus(ctx, info, kOSDFunctionalType_Default, kOSDTimeout_Med); 6131 6132 ctx->LockDeletePlayer(__FILE__, __LINE__); 6133 if (ctx->player) 6134 { 6135 ctx->player->SwitchAngle(angle); 6136 } 6137 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 6138 } 6139 6089 6140 void TV::DoSkipCommercials(PlayerContext *ctx, int direction) 6090 6141 { 6091 6142 NormalSpeed(ctx); … … 9989 10040 int title = action.right(3).toInt(); 9990 10041 DoSwitchTitle(actx, title); 9991 10042 } 10043 else if (action.left(13) == "SWITCHTOANGLE") 10044 { 10045 int angle = action.right(3).toInt(); 10046 DoSwitchAngle(actx, angle); 10047 } 9992 10048 else if (action == "EDIT") 9993 10049 StartProgramEditMode(actx); 9994 10050 else if (action == "TOGGLEAUTOEXPIRE") … … 10409 10465 { 10410 10466 int num_chapters = GetNumChapters(ctx); 10411 10467 int num_titles = GetNumTitles(ctx); 10468 int num_angles = GetNumAngles(ctx); 10412 10469 TVState state = ctx->GetState(); 10413 10470 bool isdvd = state == kState_WatchingDVD; 10414 10471 bool islivetv = StateIsLiveTV(state); … … 10459 10516 osd->DialogAddButton(tr("Chapter"), "DIALOG_MENU_AVCHAPTER_0", 10460 10517 true, selected == "AVCHAPTER"); 10461 10518 } 10519 if (num_angles > 1) 10520 { 10521 osd->DialogAddButton(tr("Angle"), "DIALOG_MENU_AVANGLE_0", 10522 true, selected == "AVANGLE"); 10523 } 10462 10524 if (num_titles) 10463 10525 { 10464 10526 osd->DialogAddButton(tr("Title"), "DIALOG_MENU_AVTITLE_0", … … 10507 10569 false, current_title == i); 10508 10570 } 10509 10571 } 10572 else if (category == "AVANGLE") 10573 { 10574 backaction = "NAVIGATE"; 10575 currenttext = tr("Angle"); 10576 int current_angle = GetCurrentAngle(ctx); 10577 10578 for (int i = 0; i < num_angles; i++) 10579 { 10580 QString angleIdx = QString("%1").arg(i, 3, 10, QChar(48)); 10581 QString desc = GetAngleName(ctx, i); 10582 osd->DialogAddButton(desc, QString("SWITCHTOANGLE%1").arg(angleIdx), 10583 false, current_angle == i); 10584 } 10585 } 10510 10586 else if (category == "COMMSKIP") 10511 10587 { 10512 10588 backaction = "NAVIGATE"; -
libs/libmythtv/BDRingBuffer.h
25 25 26 26 uint32_t GetNumTitles(void) const { return m_numTitles; } 27 27 int GetCurrentTitle(void) const; 28 uint64_t GetCurrentAngle(void) const { return m_currentAngle; }; 28 29 int GetTitleDuration(int title) const; 29 30 // Get the size in bytes of the current title (playlist item). 30 31 uint64_t GetTitleSize(void) const { return m_titlesize; } … … 34 35 uint64_t GetReadPosition(void); 35 36 uint64_t GetTotalReadPosition(void); 36 37 uint32_t GetNumChapters(void); 38 uint64_t GetNumAngles(void) { return m_currentTitleAngleCount; }; 37 39 uint64_t GetChapterStartTime(uint32_t chapter); 38 40 uint64_t GetChapterStartFrame(uint32_t chapter); 39 41 bool IsOpen(void) const { return bdnav; } … … 49 51 void close(void); 50 52 51 53 bool SwitchTitle(uint title); 54 bool SwitchAngle(uint angle); 52 55 53 56 int safe_read(void *data, unsigned sz); 54 57 uint64_t Seek(uint64_t pos); … … 60 63 uint64_t m_currentTitleLength; // Selected title's duration, in ticks (90Khz) 61 64 BLURAY_TITLE_INFO *m_currentTitleInfo; // Selected title info from struct in bluray.h 62 65 uint64_t m_titlesize; 66 uint64_t m_currentAngle; 67 uint64_t m_currentTitleAngleCount; 63 68 uint64_t m_currentTime; 64 69 }; 65 70 #endif