◉GEMINI LABJP
●ARGON — gemini-4-argon is generally available as of 10/13, aimed at complex coding, agents, math and science●DEEP RES — deep-research-pro-preview-12-2025 shuts down 10/23, 7 days left. Move to deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 is GA (10/06). gemini-3.1-flash-image is deprecated with no shutdown date yet●MCP — One write-up cut an 85,000-token tool result to 310 tokens by wrapping it in an ADK FunctionTool●FLASH — gemini-3.7-flash and 3.5-flash now route automatically to newer Flash models (10/08)●NEW — Stop Re-Reading Every Crash Report: Gre…●ARGON — gemini-4-argon is generally available as of 10/13, aimed at complex coding, agents, math and science●DEEP RES — deep-research-pro-preview-12-2025 shuts down 10/23, 7 days left. Move to deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 is GA (10/06). gemini-3.1-flash-image is deprecated with no shutdown date yet●MCP — One write-up cut an 85,000-token tool result to 310 tokens by wrapping it in an ADK FunctionTool●FLASH — gemini-3.7-flash and 3.5-flash now route automatically to newer Flash models (10/08)●NEW — Stop Re-Reading Every Crash Report: Gre…
Articles/API / SDK
◈ API / SDK/2026-08-29Intermediate

Should Omni Flash Hand You the 4K, or Should You Upscale at the Last Step?

In Gemini Omni Flash, 1080p and 4K are upscaled outputs. Here is how to pick the upscale point by working backwards from your delivery target, plus a script that checks whether the detail matches the nominal resolution.

gemini119omni-flashvideo6interactions-api5resolution

✦ Premium Article

Every time a new iPhone ships, I add another branch to the resolution logic in my wallpaper apps. More points on screen means different real pixels in the file I hand over, so no matter how carefully the source is built, the last step is always cutting it to fit the bucket on the receiving end. On Android I once lost resources entirely to density splitting and had to move them into drawable-nodpi/ to get them back.

What decides the resolution of a delivered asset is not the source. It is the condition on the receiving side. As an indie developer, getting that order backwards turns straight into lost hours.

Now that gemini-omni-1.1-flash is generally available, you can pick a video output resolution anywhere from 360p to 4k. But the documentation is explicit that 1080p and 4K are produced by upscaling. Reaching for "4K, just to be safe" repeats exactly the mistake I made with wallpapers.

resolution lives in response_format, not video_config

The first thing to trip over is where the parameter goes. Resolution belongs in response_format, not in generation_config.video_config. What goes into video_config is task — one of text_to_video, image_to_video, reference_to_video, edit, or extend.

Put it in the wrong place and the request still succeeds. You simply get the default 720p back. There is no error to catch it, so run ffprobe on your very first output.

import base64
from google import genai
 
client = genai.Client()
 
interaction = client.interactions.create(
    model="gemini-omni-1.1-flash",
    input="A drone shot of a mountain landscape at sunrise.",
    response_format={
        "type": "video",
        "aspect_ratio": "9:16",   # 16:9 is the default, so portrait must be explicit
        "resolution": "1080p",    # here, not in video_config
    },
)
 
with open("hires.mp4", "wb") as f:
    f.write(base64.b64decode(interaction.output_video.data))

Here is what the values mean.

ValueOutputHow it is produced
360p360pNative
720p720p (default)Native
1080p1080pUpscaled
4k4KUpscaled

So the native ceiling of this API is 720p. The 1080p and 4K options are names attached to a stretched version of that. The full table lives in the Gemini Omni Flash documentation.

What 4K adds, and what it does not

Knowing the word "upscaling" is not the same as knowing what it costs you. Before spending API calls, I checked the property on synthetic footage at my desk.

Three clips, all two seconds, 24fps, CRF 18, all with a nominal size of 3840x2160:

  1. A frame full of fine stripes and hard edges, authored at 3840x2160 from the start (native 4K)
  2. The same picture authored at 1280x720 and stretched to 3840x2160 with Lanczos (upscaled 4K)
  3. A smooth gradient with almost no fine detail, authored at 3840x2160 (native 4K, but flat)

Read them with ffprobe and all three report 3840,2160. The container metadata gives you nothing. The bitrate, on identical encoder settings, splits them wide open.

ClipNominal sizeBitrateFile size (2s)
Native 4K (detailed)3840x216017.19 Mbps4,299,566 B
Upscaled 4K3840x21607.25 Mbps1,812,869 B
Native 4K (flat)3840x21600.59 Mbps147,756 B

At the same size and the same CRF, the upscaled clip lands at roughly 42% of the native bitrate. An encoder does not spend bits on detail that is not there, which is obvious in hindsight and still worth measuring. Asking for 4K increases dimensions, not information.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦You will be able to lock the delivery requirement before choosing a resolution, so you never ship a 4K file that gained dimensions and nothing else
✦You will be able to tell, with ffmpeg and about 40 lines of Python, whether a returned mp4 actually carries detail worth its nominal resolution
✦You will be able to decide resolution by payload size rather than by picture quality, using the fact that upscaled output lands at under half the bitrate at the same CRF
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

◈ API / SDK2026-09-06
Two Ways to Make a Longer Shot in Gemini Omni 1.1, and Two Different Ways They Break
Omni 1.1 extends scenes in 10-second steps up to 40 seconds cumulative, and interpolates between a pinned first and last frame. Which one you use is decided before your first generation, not after. Here is the planner I run first and the drift check I run last.
◈ API / SDK2026-09-05
Gemini 3.8 Flash Costs the Same Per Token and Can Still Raise Your Bill
Gemini 3.8 Flash carries the same per-token price as 3.7 Flash, but it is designed to work harder, so output tokens can grow and your bill with them. Here is what to measure before you switch, and how to price it across the January boundary.
◈ API / SDK2026-09-04
Screen Loop Seam Clicks With Numbers Before You Hand the Audio to Gemini
An ambient loop that clicks only at the wrap point. Here is the numeric prescreen I run before sending anything to audio understanding, why an absolute threshold fails, and how AAC encoding quietly rebuilt the seam I had just repaired.