Vault
research

FilmFrame on a Sony A7: PMCA Feasibility

Created

FilmFrame on a Sony A7: PMCA Feasibility

Related: Projects/FilmFrame

A feasibility audit of porting Projects/FilmFrame — a modern Kotlin/CameraX/OpenGL camera app — to the Sony A7-generation cameras that have a real Android subsystem (PMCA: PlayMemories Camera Apps). Three questions: does it run native code at all, can you sideload without "jailbreaking," and can FilmFrame's signature feature (live-view film LUTs) actually work on that hardware.

TL;DR

The Platform

Sony's BIONZ X-era cameras are not "just an embedded camera." They run a Linux kernel with an Android 2.3.7 (Gingerbread, API level 10) userland on top, on a quad-core ARM Cortex-A5 SoC (CXD90027GF on the original A7, with the CXD4236 ISP doing the actual imaging work). The Android part is what PMCA apps target. The imaging pipeline is hardware/firmware that the apps poke at through Sony-specific Java classes.

The exposed Sony APIs live in three rough namespaces, all wrapped by the community OpenMemories-Framework:

Build-side: compileSdkVersion 10, targetSdkVersion 10, sourceCompatibility 1.6. Old Gradle. No AndroidX, no Jetpack, no Compose, no CameraX, no Kotlin runtime, no Hilt. Java 1.6 with a vendor framework.

Sources: the actual PMCADemo app's build.gradle, AndroidManifest.xml, and CameraActivity.java (github.com/ma1co/PMCADemo); the stubs tree of OpenMemories-Framework (github.com/ma1co/OpenMemories-Framework).

Sideloading: No Jailbreak Required

PMCA installation was reverse-engineered, not bypassed. Sony's pipeline goes:

  1. Browser plugin → camera over USB sends an XPD file (ini + HMAC).
  2. Camera contacts a portal URL over SSL-tunneled USB, sends serial number/firmware/battery/installed apps.
  3. Portal returns a JSON with an SPK URL.
  4. Camera fetches the SPK (AES-encrypted APK + RSA-encrypted decryption key), decrypts, installs.

ma1co's sony-pmca-re stands a local server in front of step 3, hands the camera an SPK pointing at whatever APK you built, and the camera installs it. Sony explicitly accepts both debug and release certificates. "No origin verification is performed in the whole process." This is the load-bearing fact that makes the whole community possible.

Practical install path:

build APK → pmca-gui (Mac/Win) → connect camera USB →
camera enters "MTP / mass storage" mode → tool drives the flow → app installed

Two important caveats:

The OpenMemories ecosystem usually pairs your app install with OpenMemories: Tweak, which adds telnet on port 23 and adb on 5555 over the camera's WiFi. That's the deeper jailbreak-adjacent layer — root shell on the Linux side. Useful for debugging your app, not required to install it.

Sources: github.com/ma1co/Sony-PMCA-RE, github.com/ma1co/Sony-PMCA-RE — AppInstallation.md, github.com/ma1co/OpenMemories-Tweak.

FilmFrame Feature-by-Feature on PMCA

What FilmFrame does today on a Pixel 10 Pro, and what each feature would look like on an A7:

FilmFrame feature Modern Pixel stack A7 / PMCA reality
Live-view 3D LUT (film simulation) OpenGL CameraEffect shader on CameraX preview No path. Preview surface is written directly by Sony's ISP; no shader hook into the preview. YUV plane access exists but pulling, color-managing, and uploading every frame in Java 1.6 on Cortex-A5 will not hit anything close to viewfinder framerate.
1D tone curve / B&W / contrast Subset of the LUT shader Achievable. CameraEx.GammaTable installs a custom gamma curve into the imaging pipeline. Maps to S-curves, B&W via desaturation + curve, contrast shaping. Not 3D color rotation.
Aspect ratios incl. XPan (65:24) Letterbox overlay on viewport Achievable. Camera always shoots 3:2; you draw black letterbox bars on a transparent View above the camera SurfaceView. Save-time crop uses CropImageFilter or post-processed JPEG.
Manual controls (ISO, shutter, focus, EV, WB) CameraX Camera2 interop Achievable. CameraEx exposes nearly all of these as listeners and parameter modifiers. This is the original sell of PMCA — every "Smart Remote" / "Time-Lapse" / "Multiple Exposure" app is built on these primitives.
RAW/DNG export CameraX DNG_FORMAT + GPU pipeline Out of reach. The capture pipeline writes Sony ARW files at the firmware level. Apps don't insert custom RAW processing into that path.
Focus peaking (GPU LoG) OpenGL shader on preview Effectively out. Same preview-pixel problem. Sony already has its own focus-peaking on the A7 — better to expose that toggle than rebuild it.
Horizon level Sensor fusion → overlay Achievable. Sensors are reachable; overlay rendered on top of preview View.
Histogram From preview pixels Partially achievable. Sony exposes a Histogram meta class and the camera computes one on the imaging side. App reads, app draws. Don't try to compute one in Java.
Film grain (animated) Per-frame noise on preview shader No path on preview. Can be baked into post-capture JPEG only.
Rule-of-thirds / golden ratio grids Overlay Achievable. Plain Android View draw.
Settings persistence SharedPreferences Achievable. Same Android primitive.
LUT-on-captured-JPEG Same shader applied to capture Achievable but slow. Read JPEG, apply LUT in Java/Bitmap, write JPEG. Cortex-A5 will take real time per shot. Cinestill 800T applied per shot in ~2–5s is plausible.

The honest summary: most of the "manual rangefinder camera with film aesthetic and XPan crop" UX ports. The live-view part of "film simulation" does not. You'd ship something more like "FilmFrame-Lite: XPan finder, intervalometer, custom curves, post-capture film bake" on an A7 II.

Effort Estimate

Working backwards from FilmFrame's current Pixel-only state:

Architecture Notes Worth Remembering

A few things that are easy to get wrong on first reading:

What This Analysis Can't Resolve

A few unknowns I didn't pin down and that would matter if you actually started building:

A Smaller, More Honest Project

If the actual question under the question is "I have a film-aesthetic camera app and I want it on real glass with a viewfinder," the realistic PMCA project isn't FilmFrame-the-port. It's something like:

That's the version that can actually exist. It uses what PMCA gives you and stops fighting it. The Pixel version of FilmFrame stays the place where the GPU-shader film simulation lives. The A7 version is a different artifact with the same aesthetic DNA — viewfinder framing and post-capture film color — running on glass that Sony stopped maintaining.

Sources