Crop a 16:9 AI clip to 21:9 with video filter: height 0.762, y 0.119

Cut a 16:9 Wan 3.0 or Kling 3 clip to a 21:9 frame for $0.02: crop width 1, height 0.762, y 0.119. Compared with generating 21:9 natively on Sume.

5 min readSume
All posts

To get a 21:9 frame from a 16:9 AI clip on Sume, send one crop op to the video filter with x 0, y 0.119, width 1 and height 0.762. It costs $0.02 per encode, the check is free, and the clip keeps its source audio and frame rate. Use it when the model that suits your shot, such as Wan 3.0 or Kling 3, has no 21:9 option.

Kling 4.0 adds 21:9, per the fal explainer (read 2026-10-05), but its full launch is due in October. Until then, a crop is the quick way to a wide look from a model that only lists 16:9, 9:16 and 1:1.

The fractions

The video filter docs describe crop as a rectangle in fractions of the source frame: x and y are in 0 to 1, width and height are in 0.05 to 1, the rectangle must stay inside the frame, and the compiler rounds to even values for yuv420p. The source must be a clip in your workspace's media.sume.com storage and no longer than 300 seconds.

A 21:9 frame from a 16:9 source keeps the full width and a fraction of the height. The fraction is (16 / 9) / (21 / 9), which is 0.762. Centre it with y = (1 - 0.762) / 2 = 0.119. A lower y (for example 0.05) keeps more of the sky and a higher y keeps more of the floor, so pick it by where the subject sits.

What the crop leaves, per source size

Crop of 16:9 to 21:9: width 1, height 0.762, y 0.119, approximate result (read 2026-10-05)
Source clipSource sizeAfter cropShare of frame kept
Wan 3.0 480p864x496about 864x37876%
Wan 3.0 720p1280x720about 1280x54876%
Kling 3 / Wan 1080p1920x1080about 1920x82276%
Seedance 2.5 21:9 native 720p1470x630no crop needed100%

Crop or generate 21:9 natively

Compare the two routes on price. A native Seedance 2.5 clip at 720p 21:9 and 10 seconds costs $5.81 and arrives at 1470 x 630. A 10 second Wan 3.0 clip at 720p is $1.25, and with the $0.02 crop it is $1.27 and arrives at about 1280 x 548. Cropping is about a fifth of the cost, with fewer pixels, and the subject must be framed with the crop in mind.

The native route is better when the model composes for the wide frame, for example a wide establishing shot with action at the edges. The crop route is better for a drafted shot or a lower-priced background plate. Kling 3 at 10 seconds is $1.40 with audio off or $2.10 with audio on, and it also takes the crop.

Build the crop

This builds the body for the free /check call from a source size and prints it. It does not call the API.

import json

def crop_to_ratio(src_w, src_h, ratio_w, ratio_h, y_center=0.5):
    target_h = (src_w * ratio_h / ratio_w) / src_h
    if target_h >= 1:
        raise ValueError("source is already at or wider than the target ratio")
    height = round(target_h, 3)
    y = round((1 - height) * y_center, 3)
    return {"op": "crop", "x": 0, "y": y, "width": 1, "height": height}

op = crop_to_ratio(1920, 1080, 21, 9)
body = {
    "video_url": "https://media.sume.com/artifacts/artf_demo/shot.mp4",
    "ops": [op],
}
print(json.dumps(body, indent=2))
print("expected height px:", round(1080 * op["height"]))

Check, then encode

Check the framing before you commit a batch. Pull a still from the source with the video frames endpoint, apply the same fractions to it in your head or in an image editor, and look at where the head, horizon and any on-screen text fall. A 21:9 crop removes 24 percent of the height, which is about 170 pixels of a 720p frame, roughly 85 from the top and 85 from the bottom, so prompts for the source clip should keep the subject in the middle band.

Prompt for it from the start. Ask the model for a wide establishing shot with the subject centred and empty space above and below, and avoid captions or logos in the top or bottom fifth. If a clip fails the check, a different y fraction often rescues it, and a new encode is only $0.02.

Send the body to POST /v1/video-filter/check first. It runs the same checks as the encode and returns valid, diagnostics and an estimate, without creating a job. Then send it to POST /v1/video-filter with an Idempotency-Key, poll GET /v1/jobs/{id}/status, and read video_url from the result. The jobs docs cover the polling.

The output is a new file and the source does not change. Put it into a Timeline slot as usual, and set the Timeline canvas to a 21:9 size so that cover does not crop it again.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume