Ticket #7994: clear_bookmark_at_end_14.patch

File clear_bookmark_at_end_14.patch, 6.6 KB (added by Jim Stichnoth <stichnot@…>, 15 years ago)

Adds the logic regarding "realTotalFrames" to IsNearEnd(). This is probably worthy of a separate bug report, but it's hard to see the impact without this whole patch.

  • mythtv/libs/libmythtv/mythplayer.cpp

    diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp
    index 1525a29..7a8b9f9 100644
    a b bool MythPlayer::IsReallyNearEnd(void) const  
    33553355
    33563356/** \brief Returns true iff near end of recording.
    33573357 */
    3358 bool MythPlayer::IsNearEnd(void)
     3358bool MythPlayer::IsNearEnd(bool allowVideo)
    33593359{
    33603360    uint64_t framesRead, framesLeft = 0;
    33613361
    bool MythPlayer::IsNearEnd(void)  
    33633363        return false;
    33643364
    33653365    player_ctx->LockPlayingInfo(__FILE__, __LINE__);
    3366     if (!player_ctx->playingInfo || player_ctx->playingInfo->IsVideo() ||
     3366    if (!player_ctx->playingInfo || (player_ctx->playingInfo->IsVideo() && !allowVideo) ||
    33673367        !decoder)
    33683368    {
    33693369        player_ctx->UnlockPlayingInfo(__FILE__, __LINE__);
    bool MythPlayer::IsNearEnd(void)  
    33793379    framesRead = decoder->GetFramesRead();
    33803380
    33813381    if (!player_ctx->IsPIP() &&
    3382         player_ctx->GetState() == kState_WatchingPreRecorded)
    3383     {
    3384         if (framesRead >= deleteMap.GetLastFrame(totalFrames))
    3385             return true;
    3386         framesLeft = (totalFrames > framesRead) ? totalFrames - framesRead : 0;
     3382        (player_ctx->GetState() == kState_WatchingPreRecorded ||
     3383         player_ctx->GetState() == kState_WatchingVideo ||
     3384         player_ctx->GetState() == kState_WatchingBD ||
     3385         player_ctx->GetState() == kState_WatchingDVD))
     3386    {
     3387        uint64_t realTotalFrames = deleteMap.GetLastFrame(totalFrames);
     3388        framesLeft = (realTotalFrames > framesRead) ?
     3389            realTotalFrames - framesRead : 0;
    33873390        return (framesLeft < (uint64_t)margin);
    33883391    }
    33893392
  • mythtv/libs/libmythtv/mythplayer.h

    diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h
    index ca57534..3dc4d3e 100644
    a b class MTV_PUBLIC MythPlayer  
    180180    bool    IsPlaying(uint wait_ms = 0, bool wait_for = true) const;
    181181    bool    AtNormalSpeed(void) const         { return next_normal_speed; }
    182182    bool    IsReallyNearEnd(void) const;
    183     bool    IsNearEnd(void);
     183    bool    IsNearEnd(bool allowVideo = false);
    184184    bool    HasAudioOut(void) const           { return audio.HasAudioOut(); }
    185185    bool    IsPIPActive(void) const           { return pip_active; }
    186186    bool    IsPIPVisible(void) const          { return pip_visible; }
  • mythtv/libs/libmythtv/tv_play.cpp

    diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
    index 25ff274..c0a0bdf 100644
    a b void TV::PrepToSwitchToRecordedProgram(PlayerContext *ctx,  
    28442844    SetExitPlayer(true, true);
    28452845}
    28462846
    2847 void TV::PrepareToExitPlayer(PlayerContext *ctx, int line, bool bookmark) const
     2847void TV::PrepareToExitPlayer(PlayerContext *ctx, int line, BookmarkAction bookmark) const
    28482848{
    2849     bool bookmark_it = bookmark && IsBookmarkAllowed(ctx);
     2849    bool bm_basic = (bookmark == kBookmarkAlways ||
     2850                     (bookmark == kBookmarkAuto && db_playback_exit_prompt == 2));
     2851    bool bookmark_it = bm_basic && IsBookmarkAllowed(ctx);
    28502852    ctx->LockDeletePlayer(__FILE__, line);
    28512853    if (ctx->player)
    28522854    {
    2853         if (bookmark_it && (!(ctx->player->IsNearEnd()) ||
    2854                             StateIsRecording(GetState(ctx))))
    2855             ctx->player->SetBookmark();
     2855        if (bookmark_it)
     2856        {
     2857            if (ctx->player->IsNearEnd(true) && !StateIsRecording(GetState(ctx)))
     2858                ctx->player->ClearBookmark();
     2859            else
     2860                ctx->player->SetBookmark();
     2861        }
    28562862        if (db_auto_set_watched)
    28572863            ctx->player->SetWatched();
    28582864    }
    void TV::HandleEndOfPlaybackTimerEvent(void)  
    29202926        if (mctx == ctx)
    29212927        {
    29222928            endOfRecording = true;
    2923             PrepareToExitPlayer(mctx, __LINE__, false);
     2929            PrepareToExitPlayer(mctx, __LINE__);
    29242930            SetExitPlayer(true, true);
    29252931        }
    29262932    }
    bool TV::ActiveHandleAction(PlayerContext *ctx,  
    38473853    }
    38483854    else if (has_action(ACTION_STOP, actions))
    38493855    {
    3850         PrepareToExitPlayer(ctx, __LINE__, false);
     3856        PrepareToExitPlayer(ctx, __LINE__);
    38513857        SetExitPlayer(true, true);
    38523858    }
    38533859    else if (has_action(ACTION_EXITSHOWNOPROMPTS, actions))
    bool TV::ActiveHandleAction(PlayerContext *ctx,  
    39033909                ShowOSDStopWatchingRecording(ctx);
    39043910                return handled;
    39053911            }
    3906             PrepareToExitPlayer(ctx, __LINE__, db_playback_exit_prompt == 2);
     3912            PrepareToExitPlayer(ctx, __LINE__);
    39073913            requestDelete = false;
    39083914            do_exit = true;
    39093915        }
    void TV::customEvent(QEvent *e)  
    82678273        for (uint i = 0; mctx && (i < player.size()); i++)
    82688274        {
    82698275            PlayerContext *ctx = GetPlayer(mctx, i);
    8270             PrepareToExitPlayer(ctx, __LINE__, db_playback_exit_prompt == 1 ||
    8271                                                db_playback_exit_prompt == 2);
     8276            PrepareToExitPlayer(ctx, __LINE__);
    82728277        }
    82738278
    82748279        SetExitPlayer(true, true);
    void TV::OSDDialogEvent(int result, QString text, QString action)  
    94239428        DoTogglePause(actx, true);
    94249429    else if (action == ACTION_STOP)
    94259430    {
    9426         PrepareToExitPlayer(actx, __LINE__, false);
     9431        PrepareToExitPlayer(actx, __LINE__);
    94279432        SetExitPlayer(true, true);
    94289433    }
    94299434    else if (action == ACTION_JUMPFFWD)
    bool TV::HandleOSDVideoExit(PlayerContext *ctx, QString action)  
    1155011555    }
    1155111556    else if (action == "SAVEPOSITIONANDEXIT" && bookmark_ok)
    1155211557    {
    11553         PrepareToExitPlayer(ctx, __LINE__);
     11558        PrepareToExitPlayer(ctx, __LINE__, kBookmarkAlways);
    1155411559        SetExitPlayer(true, true);
    1155511560    }
    1155611561    else if (action == "KEEPWATCHING" && !near_end)
  • mythtv/libs/libmythtv/tv_play.h

    diff --git a/mythtv/libs/libmythtv/tv_play.h b/mythtv/libs/libmythtv/tv_play.h
    index 32f9d50..4908bdf 100644
    a b class MTV_PUBLIC TV : public QObject  
    328328    void SetErrored(PlayerContext*);
    329329    void PrepToSwitchToRecordedProgram(PlayerContext*,
    330330                                       const ProgramInfo &);
     331    enum BookmarkAction {
     332        kBookmarkAlways,
     333        kBookmarkNever,
     334        kBookmarkAuto // set iff db_playback_exit_prompt==2
     335    };
    331336    void PrepareToExitPlayer(PlayerContext*, int line,
    332                              bool bookmark = true) const;
     337                             BookmarkAction bookmark = kBookmarkAuto) const;
    333338    void SetExitPlayer(bool set_it, bool wants_to) const;
    334339    void SetUpdateOSDPosition(bool set_it);
    335340