Ticket #11451: 0001-Respect-the-start-and-end-times-of-menu-highlights-t.patch

File 0001-Respect-the-start-and-end-times-of-menu-highlights-t.patch, 7.2 KB (added by peper03@…, 7 years ago)
  • mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp

    From 6fa0d949f5db94e21410e0a44a4821e86ae5a306 Mon Sep 17 00:00:00 2001
    From: Richard <peper03@yahoo.com>
    Date: Mon, 11 Mar 2013 14:47:42 +0100
    Subject: [PATCH] Respect the start and end times of menu highlights to avoid
     showing the menu highlight too soon/for too long.
    
    ---
     mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp |   13 ++++++++-----
     mythtv/libs/libmythtv/DVD/dvdringbuffer.h   |    4 ++--
     mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp |   26 ++++++++++++++++++++++++--
     mythtv/libs/libmythtv/avformatdecoder.cpp   |    9 +++++----
     4 files changed, 39 insertions(+), 13 deletions(-)
    
    diff --git a/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp b/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp
    index 9f8ab82..2ff0d29 100644
    a b void DVDRingBuffer::ActivateButton(void) 
    11721172
    11731173/** \brief get SPU pkt from dvd menu subtitle stream
    11741174 */
    1175 void DVDRingBuffer::GetMenuSPUPkt(uint8_t *buf, int buf_size, int stream_id)
     1175void DVDRingBuffer::GetMenuSPUPkt(uint8_t *buf, int buf_size,
     1176                                  int stream_id, uint32_t startTime)
    11761177{
    11771178    if (buf_size < 4)
    11781179        return;
    void DVDRingBuffer::GetMenuSPUPkt(uint8_t *buf, int buf_size, int stream_id) 
    11981199    {
    11991200        int32_t gotbutton;
    12001201        m_buttonExists = DecodeSubtitles(&m_dvdMenuButton, &gotbutton,
    1201                                         m_menuSpuPkt, m_menuBuflength);
     1202                                        m_menuSpuPkt, m_menuBuflength, startTime);
    12021203    }
    12031204}
    12041205
    QRect DVDRingBuffer::GetButtonCoords(void) 
    12431244 * code obtained from ffmpeg project
    12441245 */
    12451246bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles,
    1246                                     const uint8_t *spu_pkt, int buf_size)
     1247                                    const uint8_t *spu_pkt, int buf_size, uint32_t startTime)
    12471248{
    12481249    #define GETBE16(p) (((p)[0] << 8) | (p)[1])
    12491250
    bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles, 
    12811282            {
    12821283                case 0x00:
    12831284                    force_subtitle_display = true;
     1285                    sub->start_display_time = startTime;
     1286                    sub->end_display_time   = 0xFFFFFFFF;
    12841287                break;
    12851288                case 0x01:
    1286                     sub->start_display_time = (date << 10) / 90;
     1289                    sub->start_display_time = ((date << 10) / 90) + startTime;
    12871290                break;
    12881291                case 0x02:
    1289                     sub->end_display_time = (date << 10) / 90;
     1292                    sub->end_display_time = ((date << 10) / 90) + startTime;
    12901293                break;
    12911294                case 0x03:
    12921295                {
  • mythtv/libs/libmythtv/DVD/dvdringbuffer.h

    diff --git a/mythtv/libs/libmythtv/DVD/dvdringbuffer.h b/mythtv/libs/libmythtv/DVD/dvdringbuffer.h
    index 3a31c1b..3f85a3e 100644
    a b class MTV_PUBLIC DVDRingBuffer : public RingBuffer 
    7777    bool AudioStreamsChanged(void) const { return m_audioStreamsChanged; }
    7878    bool IsWaiting(void) const           { return m_dvdWaiting;          }
    7979    int  NumPartsInTitle(void)     const { return m_titleParts;          }
    80     void GetMenuSPUPkt(uint8_t *buf, int len, int stream_id);
     80    void GetMenuSPUPkt(uint8_t *buf, int len, int stream_id, uint32_t startTime);
    8181
    8282    // Public menu/button stuff
    8383    AVSubtitle *GetMenuSubtitle(uint &version);
    class MTV_PUBLIC DVDRingBuffer : public RingBuffer 
    9090    // Subtitles
    9191    uint GetSubtitleLanguage(int key);
    9292    bool DecodeSubtitles(AVSubtitle * sub, int * gotSubtitles,
    93                          const uint8_t * buf, int buf_size);
     93                         const uint8_t * buf, int buf_size, uint32_t startTime);
    9494
    9595    uint GetAudioLanguage(int id);
    9696    int  GetAudioTrackNum(uint key);
  • mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp

    diff --git a/mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp b/mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp
    index 3f79e4b..2faf2dd 100644
    a b void MythDVDPlayer::DisplayDVDButton(void) 
    518518    AVSubtitle *dvdSubtitle = player_ctx->buffer->DVD()->GetMenuSubtitle(buttonversion);
    519519    bool numbuttons    = player_ctx->buffer->DVD()->NumMenuButtons();
    520520
     521    bool expired = false;
     522
     523    VideoFrame *currentFrame = videoOutput ? videoOutput->GetLastShownFrame() : NULL;
     524
     525    if (!currentFrame)
     526    {
     527        player_ctx->buffer->DVD()->ReleaseMenuButton();
     528        return;
     529    }
     530
     531    if (dvdSubtitle &&
     532        (dvdSubtitle->end_display_time < currentFrame->timecode))
     533    {
     534        expired = true;
     535    }
     536
    521537    // nothing to do
    522     if (buttonversion == ((uint)m_buttonVersion))
     538    if (!expired && (buttonversion == ((uint)m_buttonVersion)))
    523539    {
    524540        player_ctx->buffer->DVD()->ReleaseMenuButton();
    525541        return;
    526542    }
    527543
    528544    // clear any buttons
    529     if (!numbuttons || !dvdSubtitle || (buttonversion == 0))
     545    if (!numbuttons || !dvdSubtitle || (buttonversion == 0) || expired)
    530546    {
    531547        SetCaptionsEnabled(false, false);
    532548        osdLock.lock();
    void MythDVDPlayer::DisplayDVDButton(void) 
    538554        return;
    539555    }
    540556
     557    if (currentFrame->timecode && (dvdSubtitle->start_display_time > currentFrame->timecode))
     558    {
     559        player_ctx->buffer->DVD()->ReleaseMenuButton();
     560        return;
     561    }
     562
    541563    m_buttonVersion = buttonversion;
    542564    QRect buttonPos = player_ctx->buffer->DVD()->GetButtonCoords();
    543565    osdLock.lock();
  • mythtv/libs/libmythtv/avformatdecoder.cpp

    diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp
    index 452c679..975f54e 100644
    a b bool AvFormatDecoder::ProcessSubtitlePacket(AVStream *curstream, AVPacket *pkt) 
    36863686        if (ringBuffer->DVD()->NumMenuButtons() > 0)
    36873687        {
    36883688            ringBuffer->DVD()->GetMenuSPUPkt(pkt->data, pkt->size,
    3689                                              curstream->id);
     3689                                             curstream->id, pts);
    36903690        }
    36913691        else
    36923692        {
    bool AvFormatDecoder::ProcessSubtitlePacket(AVStream *curstream, AVPacket *pkt) 
    36943694            {
    36953695                QMutexLocker locker(avcodeclock);
    36963696                ringBuffer->DVD()->DecodeSubtitles(&subtitle, &gotSubtitles,
    3697                                                    pkt->data, pkt->size);
     3697                                                   pkt->data, pkt->size, pts);
    36983698            }
    36993699        }
    37003700    }
    bool AvFormatDecoder::ProcessSubtitlePacket(AVStream *curstream, AVPacket *pkt) 
    37033703        QMutexLocker locker(avcodeclock);
    37043704        avcodec_decode_subtitle2(curstream->codec, &subtitle, &gotSubtitles,
    37053705                                 pkt);
     3706
     3707        subtitle.start_display_time += pts;
     3708        subtitle.end_display_time += pts;
    37063709    }
    37073710
    37083711    if (gotSubtitles)
    37093712    {
    37103713        if (isForcedTrack)
    37113714            subtitle.forced = true;
    3712         subtitle.start_display_time += pts;
    3713         subtitle.end_display_time += pts;
    37143715        LOG(VB_PLAYBACK | VB_TIMESTAMP, LOG_INFO, LOC +
    37153716            QString("subtl timecode %1 %2 %3 %4")
    37163717                .arg(pkt->pts).arg(pkt->dts)