Skip to content

Commit

Permalink
Respect the start and end times of menu highlights to avoid showing t…
Browse files Browse the repository at this point in the history
…he menu highlight too soon/for too long.

Fixes #11451
  • Loading branch information
Richard committed Jun 22, 2013
1 parent 92f9a77 commit 3d589bc
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 13 deletions.
13 changes: 8 additions & 5 deletions mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp
Expand Up @@ -1240,7 +1240,8 @@ void DVDRingBuffer::ActivateButton(void)

/** \brief get SPU pkt from dvd menu subtitle stream
*/
void DVDRingBuffer::GetMenuSPUPkt(uint8_t *buf, int buf_size, int stream_id)
void DVDRingBuffer::GetMenuSPUPkt(uint8_t *buf, int buf_size,
int stream_id, uint32_t startTime)
{
if (buf_size < 4)
return;
Expand All @@ -1266,7 +1267,7 @@ void DVDRingBuffer::GetMenuSPUPkt(uint8_t *buf, int buf_size, int stream_id)
{
int32_t gotbutton;
m_buttonExists = DecodeSubtitles(&m_dvdMenuButton, &gotbutton,
m_menuSpuPkt, m_menuBuflength);
m_menuSpuPkt, m_menuBuflength, startTime);
}
}

Expand Down Expand Up @@ -1311,7 +1312,7 @@ QRect DVDRingBuffer::GetButtonCoords(void)
* code obtained from ffmpeg project
*/
bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles,
const uint8_t *spu_pkt, int buf_size)
const uint8_t *spu_pkt, int buf_size, uint32_t startTime)
{
#define GETBE16(p) (((p)[0] << 8) | (p)[1])

Expand Down Expand Up @@ -1350,12 +1351,14 @@ bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles,
{
case 0x00:
force_subtitle_display = true;
sub->start_display_time = startTime;
sub->end_display_time = 0xFFFFFFFF;
break;
case 0x01:
sub->start_display_time = (date << 10) / 90;
sub->start_display_time = ((date << 10) / 90) + startTime;
break;
case 0x02:
sub->end_display_time = (date << 10) / 90;
sub->end_display_time = ((date << 10) / 90) + startTime;
break;
case 0x03:
{
Expand Down
4 changes: 2 additions & 2 deletions mythtv/libs/libmythtv/DVD/dvdringbuffer.h
Expand Up @@ -77,7 +77,7 @@ class MTV_PUBLIC DVDRingBuffer : public RingBuffer
bool AudioStreamsChanged(void) const { return m_audioStreamsChanged; }
bool IsWaiting(void) const { return m_dvdWaiting; }
int NumPartsInTitle(void) const { return m_titleParts; }
void GetMenuSPUPkt(uint8_t *buf, int len, int stream_id);
void GetMenuSPUPkt(uint8_t *buf, int len, int stream_id, uint32_t startTime);
int64_t GetTimeDiff(void) const { return m_timeDiff; }

// Public menu/button stuff
Expand All @@ -92,7 +92,7 @@ class MTV_PUBLIC DVDRingBuffer : public RingBuffer
uint GetSubtitleLanguage(int key);
int GetSubtitleTrackNum(uint stream_id);
bool DecodeSubtitles(AVSubtitle * sub, int * gotSubtitles,
const uint8_t * buf, int buf_size);
const uint8_t * buf, int buf_size, uint32_t startTime);

uint GetAudioLanguage(int id);
int GetAudioTrackNum(uint key);
Expand Down
26 changes: 24 additions & 2 deletions mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp
Expand Up @@ -526,15 +526,31 @@ void MythDVDPlayer::DisplayDVDButton(void)
AVSubtitle *dvdSubtitle = player_ctx->buffer->DVD()->GetMenuSubtitle(buttonversion);
bool numbuttons = player_ctx->buffer->DVD()->NumMenuButtons();

bool expired = false;

VideoFrame *currentFrame = videoOutput ? videoOutput->GetLastShownFrame() : NULL;

if (!currentFrame)
{
player_ctx->buffer->DVD()->ReleaseMenuButton();
return;
}

if (dvdSubtitle &&
(dvdSubtitle->end_display_time < currentFrame->timecode))
{
expired = true;
}

// nothing to do
if (buttonversion == ((uint)m_buttonVersion))
if (!expired && (buttonversion == ((uint)m_buttonVersion)))
{
player_ctx->buffer->DVD()->ReleaseMenuButton();
return;
}

// clear any buttons
if (!numbuttons || !dvdSubtitle || (buttonversion == 0))
if (!numbuttons || !dvdSubtitle || (buttonversion == 0) || expired)
{
osdLock.lock();
if (osd)
Expand All @@ -545,6 +561,12 @@ void MythDVDPlayer::DisplayDVDButton(void)
return;
}

if (currentFrame->timecode && (dvdSubtitle->start_display_time > currentFrame->timecode))
{
player_ctx->buffer->DVD()->ReleaseMenuButton();
return;
}

m_buttonVersion = buttonversion;
QRect buttonPos = player_ctx->buffer->DVD()->GetButtonCoords();
osdLock.lock();
Expand Down
9 changes: 5 additions & 4 deletions mythtv/libs/libmythtv/avformatdecoder.cpp
Expand Up @@ -3699,15 +3699,15 @@ bool AvFormatDecoder::ProcessSubtitlePacket(AVStream *curstream, AVPacket *pkt)
if (ringBuffer->DVD()->NumMenuButtons() > 0)
{
ringBuffer->DVD()->GetMenuSPUPkt(pkt->data, pkt->size,
curstream->id);
curstream->id, pts);
}
else
{
if (pkt->stream_index == subIdx)
{
QMutexLocker locker(avcodeclock);
ringBuffer->DVD()->DecodeSubtitles(&subtitle, &gotSubtitles,
pkt->data, pkt->size);
pkt->data, pkt->size, pts);
}
}
}
Expand All @@ -3716,14 +3716,15 @@ bool AvFormatDecoder::ProcessSubtitlePacket(AVStream *curstream, AVPacket *pkt)
QMutexLocker locker(avcodeclock);
avcodec_decode_subtitle2(curstream->codec, &subtitle, &gotSubtitles,
pkt);

subtitle.start_display_time += pts;
subtitle.end_display_time += pts;
}

if (gotSubtitles)
{
if (isForcedTrack)
subtitle.forced = true;
subtitle.start_display_time += pts;
subtitle.end_display_time += pts;
LOG(VB_PLAYBACK | VB_TIMESTAMP, LOG_INFO, LOC +
QString("subtl timecode %1 %2 %3 %4")
.arg(pkt->pts).arg(pkt->dts)
Expand Down

0 comments on commit 3d589bc

Please sign in to comment.