fix: count repeated frame steps and retain the forward decoder cursor

This commit is contained in:
2026-10-10 18:35:13 +02:00
parent 2bb7d9b4ee
commit 131acbe41b
6 changed files with 130 additions and 21 deletions
+23 -1
View File
@@ -121,9 +121,31 @@ static void frameSteps(Player *player, MTKView *view, const std::string &directo
auto ended = until(player, [](auto s) { return s.status == PLAYER_ENDED; });
require(std::abs(ended.position - 4) < .0001, "last stepped frame retains its presentation duration");
step(player, -1, 94.0 / 24);
require(player_open(player, (directory + "/av.mp4").c_str()), "repeated stepping open");
until(player, [](auto s) { return s.status == PLAYER_PAUSED; });
step(player, -1, 0);
revision = player_get_state(player).revision;
for (int i = 0; i < 64; ++i)
require(player_step_frame(player, 1), "held forward steps accepted without queue overflow");
frameCompleted(player, revision, 64.0 / 24);
revision = player_get_state(player).revision;
for (int i = 0; i < 64; ++i)
require(player_step_frame(player, -1), "held backward steps accepted without queue overflow");
frameCompleted(player, revision, 0);
revision = player_get_state(player).revision;
for (int i = 0; i < 40; ++i) require(player_step_frame(player, 1), "queue forward step run");
require(player_seek(player, 1.5), "seek separates repeated step runs");
for (int i = 0; i < 32; ++i) require(player_step_frame(player, -1), "queue reverse step run");
for (int i = 0; i < 24; ++i) require(player_step_frame(player, 1), "queue direction reversal");
frameCompleted(player, revision, 28.0 / 24);
// A new media timeline supersedes the entire pending repeated run.
for (int i = 0; i < 4096; ++i) require(player_step_frame(player, 1), "queue long repeated run");
require(player_open(player, (directory + "/audio.wav").c_str()), "open supersedes repeated steps");
auto replacement = until(player, [](auto s) { return s.status == PLAYER_PAUSED && !s.has_video && !s.seek_pending; });
require(replacement.position == 0 && replacement.has_audio, "stale steps do not affect replacement media");
require(player_close(player), "close stepped media accepted");
until(player, [](auto s) { return s.status == PLAYER_EMPTY; });
std::puts("PASS exact VFR/B-frame steps/queued steps/seek reference/pause/resume/boundaries");
std::puts("PASS exact VFR/B-frame steps/repeat bursts/seek ordering/pause/resume/boundaries/timeline replacement");
}
int main(int argc, char **argv) {