Ticket #7731: delay_unlink_fix_bookmark_7.patch

File delay_unlink_fix_bookmark_7.patch, 5.8 KB (added by Jim Stichnoth <stichnot@…>, 11 years ago)
  • programs/mythtranscode/main.cpp

     
    3030                       ProgramInfo *pginfo);
    3131int BuildKeyframeIndex(MPEG2fixup *m2f, QString &infile,
    3232                       frm_pos_map_t &posMap, int jobID);
    33 void CompleteJob(int jobID, ProgramInfo *pginfo,
    34                  bool useCutlist, int &resultCode);
     33void CompleteJob(int jobID, ProgramInfo *pginfo, bool useCutlist,
     34                 frm_dir_map_t *deleteMap, int &resultCode);
    3535void UpdateJobQueue(float percent_done);
    3636int CheckJobQueue();
    3737static int glbl_jobID = -1;
     
    664664    }
    665665
    666666    if (jobID >= 0)
    667         CompleteJob(jobID, pginfo, useCutlist, exitcode);
     667        CompleteJob(jobID, pginfo, useCutlist, &deleteMap, exitcode);
    668668
    669669    transcode->deleteLater();
    670670
     
    742742    return unlink(filename.toLocal8Bit().constData());
    743743}
    744744
    745 void CompleteJob(int jobID, ProgramInfo *pginfo, bool useCutlist, int &resultCode)
     745uint64_t ComputeNewBookmark(uint64_t oldBookmark,
     746                            frm_dir_map_t *deleteMap)
    746747{
     748    if (deleteMap == NULL)
     749        return oldBookmark;
     750    uint64_t subtraction = 0;
     751    uint64_t startOfCutRegion = 0;
     752    frm_dir_map_t delMap = *deleteMap;
     753    bool withinCut = false;
     754    while (delMap.count() && delMap.begin().key() <= oldBookmark)
     755    {
     756        if (delMap.begin().data() == MARK_CUT_START && !withinCut)
     757        {
     758            withinCut = true;
     759            startOfCutRegion = delMap.begin().key();
     760        }
     761        else if (delMap.begin().data() == MARK_CUT_END && withinCut)
     762        {
     763            withinCut = false;
     764            subtraction += (delMap.begin().key() - startOfCutRegion);
     765        }
     766        delMap.remove(delMap.begin());
     767    }
     768    if (withinCut)
     769        subtraction += (oldBookmark - startOfCutRegion);
     770    return oldBookmark - subtraction;
     771}
     772
     773uint64_t ReloadBookmark(ProgramInfo *pginfo)
     774{
     775    MSqlQuery query(MSqlQuery::InitCon());
     776    uint64_t currentBookmark = 0;
     777    query.prepare("SELECT DISTINCT mark FROM recordedmarkup "
     778                  "WHERE chanid = :CHANID "
     779                  "AND starttime = :STARTIME "
     780                  "AND type = :MARKTYPE ;");
     781    query.bindValue(":CHANID", pginfo->GetChanID());
     782    query.bindValue(":STARTTIME", pginfo->GetRecordingStartTime());
     783    query.bindValue(":MARKTYPE", MARK_BOOKMARK);
     784    if (query.exec() && query.next())
     785    {
     786        currentBookmark = query.value(0).toLongLong();
     787    }
     788    return currentBookmark;
     789}
     790
     791void WaitToDelete(ProgramInfo *pginfo)
     792{
     793    VERBOSE(VB_GENERAL,
     794            "Transcode: delete old file: "
     795            "waiting while program is in use.");
     796    bool inUse = true;
     797    MSqlQuery query(MSqlQuery::InitCon());
     798    while (inUse)
     799    {
     800        query.prepare("SELECT count(*) FROM inuseprograms "
     801                      "WHERE chanid = :CHANID "
     802                      "AND starttime = :STARTTIME "
     803                      "AND recusage = 'player' ;");
     804        query.bindValue(":CHANID", pginfo->GetChanID());
     805        query.bindValue(":STARTTIME", pginfo->GetRecordingStartTime());
     806        if (!query.exec() || !query.next())
     807        {
     808            VERBOSE(VB_GENERAL,
     809                    "Transcode: delete old file: in-use query failed;");
     810            inUse = false;
     811        }
     812        else
     813        {
     814            inUse = (query.value(0).toUInt() != 0);
     815        }
     816
     817        if (inUse)
     818        {
     819            const unsigned kSecondsToWait = 10;
     820            VERBOSE(VB_GENERAL,
     821                    QString("Transcode: program in use, "
     822                            "rechecking in %1 seconds.").arg(kSecondsToWait));
     823            sleep(kSecondsToWait);
     824        }
     825    }
     826    VERBOSE(VB_GENERAL, "Transcode: program is no longer in use.");
     827}
     828
     829void CompleteJob(int jobID, ProgramInfo *pginfo, bool useCutlist,
     830                 frm_dir_map_t *deleteMap, int &resultCode)
     831{
    747832    int status = JobQueue::GetJobStatus(jobID);
    748833
    749834    if (!pginfo)
     
    753838        return;
    754839    }
    755840
     841    WaitToDelete(pginfo);
     842
    756843    const QString filename = pginfo->GetPlaybackURL(false, true);
    757844    const QByteArray fname = filename.toLocal8Bit();
    758845
    759846    if (status == JOB_STOPPING)
    760847    {
     848        // Transcoding may take several minutes.  Reload the bookmark
     849        // in case it changed, then save its translated value back.
     850        uint64_t previousBookmark =
     851            ComputeNewBookmark(ReloadBookmark(pginfo), deleteMap);
     852        pginfo->SaveBookmark(previousBookmark);
     853
    761854        const QString jobArgs = JobQueue::GetJobArgs(jobID);
    762855
    763856        const QString tmpfile = filename + ".tmp";
     
    903996        {
    904997            query.prepare("DELETE FROM recordedmarkup "
    905998                          "WHERE chanid = :CHANID "
    906                           "AND starttime = :STARTTIME ");
     999                          "AND starttime = :STARTTIME "
     1000                          "AND type != :BOOKMARK ");
    9071001            query.bindValue(":CHANID", pginfo->GetChanID());
    9081002            query.bindValue(":STARTTIME", pginfo->GetRecordingStartTime());
     1003            query.bindValue(":BOOKMARK", MARK_BOOKMARK);
    9091004
    9101005            if (!query.exec())
    9111006                MythDB::DBError("Error in mythtranscode", query);
    9121007
    9131008            query.prepare("UPDATE recorded "
    914                           "SET cutlist = :CUTLIST, bookmark = :BOOKMARK "
     1009                          "SET cutlist = :CUTLIST "
    9151010                          "WHERE chanid = :CHANID "
    9161011                          "AND starttime = :STARTTIME ;");
    9171012            query.bindValue(":CUTLIST", "0");
    918             query.bindValue(":BOOKMARK", "0");
    9191013            query.bindValue(":CHANID", pginfo->GetChanID());
    9201014            query.bindValue(":STARTTIME", pginfo->GetRecordingStartTime());
    9211015