70 uint32_t schedulingDelayMs = 0)
220 "PacedVideoOutput: %s (fps=%.2f, clock=%s, scheduling delay=%u ms, "
221 "queue=%u bytes, stack=%u words, priority=%u)",
222 ok ?
"render task started" :
"render task failed to start",
224 p_clock !=
nullptr ?
"external audio" :
"wall",
235 "PacedVideoOutput: render task stopped (%u frames rendered - %u "
236 "I / %u P, %u P dropped / %u I dropped, input=%.2f fps, "
263 size_t write(
const uint8_t* data,
size_t len)
override {
264 if (len == 0)
return 0;
290 header.
size = (uint32_t)len;
292 header.
is_key = is_key ? 1 : 0;
293 size_t needed =
sizeof(header) + len;
306 bool falling_behind =
310 if (!is_key && (queue_full || falling_behind)) {
320 "PacedVideoOutput: dropping P frames starting at #%u - %s "
321 "(%d/%u bytes free, need %u, render %d ms behind)",
322 (
unsigned)this_frame,
323 queue_full ?
"render queue full" :
"catching up",
332 bool logged_wait =
false;
336 "PacedVideoOutput: write() blocked on frame #%u - render "
337 "queue full (%d/%u bytes free, need %u)",
339 (
unsigned)
queue.
size(), (
unsigned)needed);
348 "PacedVideoOutput: queued frame #%u (%s, %u bytes, target=%u ms, "
350 (
unsigned)this_frame, is_key ?
"I" :
"P", (unsigned)len,
439 return elapsed > 0 ? (1000.0f *
frame_count) / elapsed : 0.0f;
453 return elapsed > 0 ? (1000.0f * count) / elapsed : 0.0f;
462 StrView str(buf,
sizeof(buf) - 1);
464 out.println(str.
printf(
"input fps: %.2f / output fps: %.2f",
inputFPS(),
467 out.println(str.
printf(
"avg render ms - I: %.2f / P: %.2f / overall: %.2f",
472 "frames - I: %d / P: %d / dropped P: %d / dropped I: %d / "
473 "queued I: %d / queue: %d/%d bytes (%.2f%% full)",
477 queueCapacity > 0 ? 100.0f *
queuedBytes() / queueCapacity : 0.0f));
489 renderedFrames > 0 ? (float)decodeMs / renderedFrames : 0.0f;
490 out.println(str.
printf(
"avg decode ms: %.2f / avg convert+SPI ms: %.2f",
494 size_t heapFree = ESP.getFreeHeap();
495 size_t heapTotal = ESP.getHeapSize();
496 size_t heapUsed = heapTotal - heapFree;
498 size_t psramFree = ESP.getFreePsram();
499 size_t psramTotal = ESP.getPsramSize();
500 size_t psramUsed = psramTotal - psramFree;
502 out.println(str.
printf(
"Heap: total=%u, used=%u, free=%u bytes",
503 (
unsigned)heapTotal, (
unsigned)heapUsed,
504 (
unsigned)heapFree));
505 out.println(str.
printf(
"PSRAM: total=%u, used=%u, free=%u bytes",
506 (
unsigned)psramTotal, (
unsigned)psramUsed,
507 (
unsigned)psramFree));
513 "Largest heap block: %u bytes",
514 (
unsigned)heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL)));
516 "Largest PSRAM block: %u bytes",
517 (
unsigned)heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM)));
651 bool found_key =
false;
669 uint8_t scratch[256];
671 while (remaining > 0) {
672 size_t chunk = remaining <
sizeof(scratch) ? remaining :
sizeof(scratch);
728 LOGI(
"PacedVideoOutput: playback anchored at %u ms (%s clock)",
735 while ((int32_t)(scheduled_ms -
clockMs()) > 0) {
742 int32_t lateness_ms = (int32_t)(
clockMs() - scheduled_ms);
756 bool lateness_resync =
764 if (lateness_resync || queue_resync || iframe_resync) {
767 uint32_t new_target_ms = target_ms;
770 "PacedVideoOutput: resyncing (%s) - %s instead of trying to "
774 : (queue_resync ?
"queue fill" :
"I-frame backlog"),
775 found_fresher_key ?
"jumping to the newest available keyframe"
776 :
"jumping the schedule forward");
777 if (found_fresher_key) {
784 target_ms = new_target_ms;
813 uint32_t processStart =
millis();
816 uint32_t processMs =
millis() - processStart;
838 "PacedVideoOutput: rendered %s frame - scheduled=%u actual=%u "
839 "(%d ms late), process=%u ms",
840 is_key ?
"I" :
"P", (unsigned)scheduled_ms, (
unsigned)
clockMs(),
841 (int)lateness_ms, (
unsigned)processMs);
844 "PacedVideoOutput: decoded %s frame, no picture emitted yet "
845 "(scheduled=%u actual=%u, %d ms late), process=%u ms",
846 is_key ?
"I" :
"P", (unsigned)scheduled_ms, (
unsigned)
clockMs(),
847 (int)lateness_ms, (
unsigned)processMs);
851 "PacedVideoOutput: %s frame took %u ms to render - longer than "
852 "the %.1f ms frame period, falling behind",
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27