IOP Codes - tiredboffin/fffw GitHub Wiki
IOP Codes (presumably Image Output Processor Codes) appear to uniquely identify the Fujifilm image processor used to generate a RAW image.
The codes are present in RAF file header[^1]
X Raw Studio Conversion Profile xml files (.FP1)
and in firmware "cfgdata" section.
The codes are returned by Camera over PTP as Data Code 0xd184:
[^1]: all samples are for X-T4 fw 2.12
The exact purpose of the code isn't entirely clear, but it's tempting to associate certain camera properties with it as these codes seem to follow consistent patterns and internal structure, though as far as I know, no serious attempt has been made to decode or document them. While understanding their structure may not have obvious scientific significance, it could be useful for reverse engineering—especially if the hypothesis holds that cameras with "similar" IOPCodes also share similar image processing characteristics.
And to be honest — it's just fun to dig into this kind of stuff :)
What follows is a quick attempt to analyze IOPCodes found across various Fujifilm cameras, aiming to infer their structure based on a list of codes extracted from dozens of sample RAF files and firmware files (for e.g. when RAFs weren't available) from different cameras.
Note: Some of the notes below are adapted from comments I originally posted on the Fujihack Discord server.
Ancient Cameras
Information about sensor models and IDs is quite limited for older Fujifilm cameras, but based on a few samples, it appears that early IOPCodes directly referenced the sensor model. For example:
- F40FD: IopCode: FF389701 SensorDesc: HA-CCD(HR) FUI-MS3897A 1/1.7 inch 6.3M. 2.7µm Super CCD HR VI
- F660EXR: IopCode: FF8EW409 SensorDesc: EXR-CMOS T8EW4 (Areus)
- X10: IopCode: FF8LY903 SensorDesc: EXR-CMOS T8LY9 2/3 12M
From these examples, a rough pattern emerges: FFXZZZNN, where XZZZ seems to identify the sensor and NN may be a version or sequence number. At the time, the "image processor" may have been tightly coupled to the sensor itself. However, IOPCode also encoded the "mode" the sensor was operating in when the image was captured. For example, the X10 internally defined six RAF compatibility codes (互換性コード)
FF8LY903, FA8LY903
FF8LY901, FA8LY901
FF8LY902, FA8LY901
which reflected different "EXR modes" the sensor could operate in. The EXR CMOS sensors supported pixel binning and dual-exposure operations to optimize for either noise reduction or higher dynamic range.
Sensor mode:
12MP "High Resolution Priority" (full sensor readout)
6MP "Low Noise Priority" (pixel binning)
6MP "High Dynamic Range Priority" (dual-exposure)
Color space:
sRGB (prefix FF)
Adobe RGB (prefix FA)
However, in standard RAW files from the X10, only FF8LY903 (or the Adobe RGB equivalent FA8LY903) is present, because the camera only supported RAW output in the high-resolution mode.
In all "non-EXR"-CMOS cameras I’ve examined, the firmware typically uses only two IOPCodes: one for sRGB and one for Adobe RGB. While there are still six available "slots" for different codes, the remaining four are usually left empty. It’s unclear why Fujifilm continues to use separate IOPCodes for the two color spaces—this might be a legacy decision, possibly to maintain compatibility with some older RAW converters.
Note: It’s worth mentioning a potential known outlier — assuming the sensor model information found online is accurate -- Fujifilm Finepix F30:
IopCode: FF148801
SensorDesc: HA-CCD(HR) FUI-MS3897A, 1/1.7", 6.3MP (same as F40FD?)
Despite using what seems to be the same sensor as the F40FD, the IOPCode is quite different (FF148801 vs. FF389701).
More Recent Cameras
At some point—likely around the release of the X-A1 or slightly earlier—a new coding pattern was introduced. Beginning with the X-A1, all IOPCodes follow a consistent format with a fixed prefix FF1, and the remaining five positions vary.
FF1(ABC)NN
-
FF1 / FA1 – A fixed prefix in the new schema; FA1 is used for Adobe RGB.
-
NN apperas to be a sequence number
-
A varies from 1 to 8. It seems to reflect the image processor version or model, while B and C act more like platform or category identifiers.
-
B is 9 on most cameras but it is 6 on XE1, XPRO1, XM1 and GFX50* -- I haven't identified a common trait shared by these models that would explain the difference.
-
C – This value is:
- 3 on all Xacti-developed cameras (e.g., X-A3+, X-T100, X-T200) — if Fujirumors is accurate.
- 1 on GFX50* models.
- 5 on all other models
The correspondence between the IOP code and camera model is not strictly one-to-one, some cameras share IOPCode. for. e.g XT4 and XE4 both use value FF159505 . The IOPCode even changed for X-E2 from FF119502 to FF119507 with firmware v4.00 update to the code of XE2s.
The ABC triplet appears to identify the sensor or the sensor-plus-platform combination. Most cameras using the same generation of sensor (e.g., X-Trans I, II, etc.) tend to share the same ABC code. There is, however, one notable exception: the X-T50. Despite being an APS-C model, it shares its ABC code with the medium format GFX100 II and GFX100S II—rather than with the X-T5, X100VI, X-E5, or other 40MP X-Trans V cameras.
Conclusion
Unfortunately, the outcome is somewhat disappointing. While the subfields of the IOPCode may appear to encode distinct information, they likely lack strictly defined meanings. Instead, the code functions more as an internal "label"—a naming convention used by the camera firmware or RAW converters to reference a particular set of image processor capabilities. As such, making any logic dependent on the subfields should be avoided, I think.
br, tb