Android crash in FMovieSceneNumericVariant::Set when loading a Level Sequence with Custom Time Warp

On Android, loading a Level Sequence fatals in the async loading thread:

Assertion failed: (NewValue & ~PAYLOAD_Bits) == 0

MovieSceneNumericVariant.cpp:133

Unable to store a pointer outside of a 48 bit address space in this container

This fires while serializing a UMovieSceneSection whose Time Warp type is Custom (Play Rate Curve / Time Warp Curve). Windows does not hit this.

Hey there,

Thanks for raising this, I’ve logged an issue for this one that you can follow: https://issues.unrealengine.com/issue/UE-392043

Dustin

Could you send us a repro of the issue in your content? It’s an odd error to see because it’s on load, and it’s a UObject, so it should be allocated in our global object buckets.

The gameplay trigger lives in our component. The fatal is in engine load, not in our game logic.

  1. Event: A gameplay event fires and calls FunctionA.
  2. Resolve asset: FunctionA reads an FSoftObjectPath from config. It points at a Level Sequence (LS with Custom Time Warp(Use with animation for playrate) on a section should do).
  3. Load: Same function loads it synchronously:

ULevelSequence* LevelSequence = LoadObject(nullptr, *AssetPath);

LoadObject flushes async loading. Same frame in the log: FlushAsyncLoading(…): 1 QueuedPackages. 4. Failure: The process fatals on the async loading thread while the package is still being serialized. LoadObject never returns. We never reach Sequence Player creation, play, or binding.

Same-frame order:

FunctionA -> LoadObject -> FlushAsyncLoading -> async thread UMovieSceneSection::Serialize -> FMovieSceneTimeWarpVariant::Serialize (type = Custom) -> FMovieSceneNumericVariant::Set(UMovieSceneNumericVariantGetter*) -> check fails.

Assertion:

Assertion failed: (NewValue & ~PAYLOAD_Bits) == 0 MovieSceneNumericVariant.cpp:133 Unable to store a pointer outside of a 48 bit address space in this container

Thanks for the info, we’re going to keep looking at it.