static int64_t get_pts_stc_delta(int64_t pts) { int64_t stc, delta; dvbsub_get_stc(&stc); delta = LimitTo32Bit(pts) - LimitTo32Bit(stc); delta /= 90; return delta; }
int cDvbSubtitleConverter::Action(void) { int WaitMs = WAITMS; if (!running) return 0; if(!avctx) { dbgconverter("cDvbSubtitleConverter::Action: no context\n"); return -1; } Lock(); if (cDvbSubtitleBitmaps *sb = bitmaps->First()) { int64_t STC; dvbsub_get_stc(&STC); int64_t Delta = 0; Delta = LimitTo32Bit(sb->Pts()) - LimitTo32Bit(STC); Delta /= 90; // STC and PTS are in 1/90000s dbgconverter("cDvbSubtitleConverter::Action: PTS: %lld STC: %lld (%lld) timeout: %d\n", sb->Pts(), STC, Delta, sb->Timeout()); if (Delta <= MAXDELTA) { if (Delta <= SHOW_DELTA) { dbgconverter("cDvbSubtitleConverter::Action: Got %d bitmaps, showing #%d\n", bitmaps->Count(), sb->Index() + 1); if (running) { Clear(); sb->Draw(min_x, min_y, max_x, max_y); Timeout.Set(sb->Timeout()); } if(sb->Count()) WaitMs = MIN_DISPLAY_TIME; bitmaps->Del(sb, true); } else if (Delta < WaitMs) WaitMs = (Delta > SHOW_DELTA) ? Delta - SHOW_DELTA : Delta; } else bitmaps->Del(sb, true); } else { if (Timeout.TimedOut()) { dbgconverter("cDvbSubtitleConverter::Action: timeout, elapsed %lld\n", Timeout.Elapsed()); Clear(); Timeout.Set(0xFFFF*1000); } } Unlock(); if(WaitMs != WAITMS) dbgconverter("cDvbSubtitleConverter::Action: finish, WaitMs %d\n", WaitMs); return WaitMs*1000; }
void cDvbSubtitleConverter::Action(void) { int LastSetupLevel = setupLevel; cTimeMs Timeout; while (Running()) { int WaitMs = 100; if (!frozen) { LOCK_THREAD; if (osd) { int NewSetupLevel = setupLevel; if (Timeout.TimedOut() || LastSetupLevel != NewSetupLevel) { DELETENULL(osd); } LastSetupLevel = NewSetupLevel; } if (cDvbSubtitleBitmaps *sb = bitmaps->First()) { int64_t STC = cDevice::PrimaryDevice()->GetSTC(); int64_t Delta = LimitTo32Bit(sb->Pts()) - LimitTo32Bit(STC); // some devices only deliver 32 bits if (Delta > (int64_t(1) << 31)) Delta -= (int64_t(1) << 32); else if (Delta < -((int64_t(1) << 31) - 1)) Delta += (int64_t(1) << 32); Delta /= 90; // STC and PTS are in 1/90000s if (Delta <= MAXDELTA) { if (Delta <= 0) { dbgconverter("Got %d bitmaps, showing #%d\n", bitmaps->Count(), sb->Index() + 1); if (AssertOsd()) { sb->Draw(osd); Timeout.Set(sb->Timeout() * 1000); dbgconverter("PTS: %"PRId64" STC: %"PRId64" (%"PRId64") timeout: %d\n", sb->Pts(), cDevice::PrimaryDevice()->GetSTC(), Delta, sb->Timeout()); } bitmaps->Del(sb); } else if (Delta < WaitMs) WaitMs = Delta; } else bitmaps->Del(sb); } } cCondWait::SleepMs(WaitMs); } }
int cDvbSubtitleConverter::Action(void) { int WaitMs = WAITMS; if (!running) return 0; if(!avctx) { dbgconverter("cDvbSubtitleConverter::Action: no context\n"); return -1; } min_x = min_y = 0; max_x = 720; max_y = 576; if (avctx->width && avctx->height) { min_x = 0; min_y = 0; max_x = avctx->width; max_y = avctx->height; dbgconverter("cDvbSubtitleConverter::Action: Display Definition: min_x=%d min_y=%d max_x=%d max_y=%d\n", min_x, min_y, max_x, max_y); } Lock(); if (cDvbSubtitleBitmaps *sb = bitmaps->First()) { int64_t STC; dvbsub_get_stc(&STC); int64_t Delta = 0; Delta = LimitTo32Bit(sb->Pts()) - LimitTo32Bit(STC); Delta /= 90; // STC and PTS are in 1/90000s // dbgconverter("cDvbSubtitleConverter::Action: PTS: %016llx STC: %016llx (%lld) timeout: %d\n", sb->Pts(), STC, Delta, sb->Timeout()); if (Delta <= MAXDELTA) { if (Delta <= SHOW_DELTA) { dbgconverter("cDvbSubtitleConverter::Action: PTS: %012llx STC: %012llx (%lld) timeout: %d bmp %d/%d\n", sb->Pts(), STC, Delta, sb->Timeout(), bitmaps->Count(), sb->Index() + 1); // dbgconverter("cDvbSubtitleConverter::Action: Got %d bitmaps, showing #%d\n", bitmaps->Count(), sb->Index() + 1); if (running) { Clear(); sb->Draw(min_x, min_y, max_x, max_y); Timeout.Set(sb->Timeout()); } if(sb->Count()) { WaitMs = MIN_DISPLAY_TIME; #if HAVE_SPARK_HARDWARE || HAVE_DUCKBOX_HARDWARE painted = true; #endif } bitmaps->Del(sb, true); } else if (Delta < WaitMs) WaitMs = int((Delta > SHOW_DELTA) ? Delta - SHOW_DELTA : Delta); } else { dbgconverter("deleted because delta (%lld) > MAXDELTA (%d)\n", Delta, MAXDELTA); bitmaps->Del(sb, true); } } else { if (Timeout.TimedOut()) { dbgconverter("cDvbSubtitleConverter::Action: timeout, elapsed %lld\n", Timeout.Elapsed()); Clear(); Timeout.Set(0xFFFF*1000); } } Unlock(); if(WaitMs != WAITMS) dbgconverter("cDvbSubtitleConverter::Action: finish, WaitMs %d\n", WaitMs); return WaitMs*1000; }