From 5a5af063dd0f35e8cfed6ae6c1cbdebe891d0815 Mon Sep 17 00:00:00 2001 From: torger Date: Mon, 5 May 2014 11:48:23 +0200 Subject: [PATCH] Issue 2348: camconst.json updates with many new cameras. --- rtengine/camconst.json | 1428 +++++++++++++++++++++++++--------------- 1 file changed, 895 insertions(+), 533 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 1be5928f5..7b0864f77 100755 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1,533 +1,895 @@ -/* - - DO NOT EDIT THIS FILE! - - All changes made here will be lost on software update. - If you want to add custom values or changes existing ones, - create a "camconst.json" file next to your personal "options" file. - Its values will then override and/or complete the ones of this file. - - If you add values for your own camera and are okay to share them with - RawTherapee's community, please drop a link on the user's forum - - IMPORTANT: - ---------- - - 1. If you set the dcraw matrix in your user file for an already existing entry - in RT's file (same camera, same model), your values will replace RT's ones. - 2. If you set the Black level(s) values in your user file for an already existing - entry in RT's file, your values will replace RT's ones, even if RT's ones are - more complete and/or detailed. You might want to copy/paste RT's levels first - (if provided) to your user's file and complete/modify it. - - Same for the White level(s), independently from the Black level(s). - - ----------------------------------------------------------------------------------- - - -This file is in JSON format and contains camera constants which RawTherapee uses -when parsing raw files. - -Raw files themselves unfortunately do not contain all information needed for making -a raw conversion, typically color response information and black/white levels are -missing. That's why this file is needed. - -It's read once during startup, so if the file is updated you need to restart -RawTherapee in order to take effect. The file is not intended for modification by -the casual user, but advanced users can add missing camera information to this file. -If you do so please report at http://code.google.com/p/rawtherapee/issues so we can -extend the distributed version of this file so your provided camera information -becomes available to all. - -RawTherapee uses DCRAW as the raw format parser. DCRAW contains hard-coded camera -constants, but not for all cameras and not always accurate information. For example -DCRAW only support one white level, while some cameras have different white levels -per channel and per ISO. If a camera is not listed in this file the constants from -DCRAW will be used, if listed here this information will override any constants in -DCRAW (if any). - -Some cameras may only have partial information here, for example if the raw file -itself contains a color matrix it's not entered here. A camera whose black level -is measured on special pixels in the raw file should only have white levels here -etc. - -Examples: - - { - // make and model separated with single space, must match make - // and model as provided by dcraw (case-insensitive). - "make_model": "ManufacturerA ModelB", - // ColorMatrix with D65 Calibration Illuminant, in dcraw format - "dcraw_matrix": [ 7530, -1942, -255, -4318, 11390, 3362, -926, 1694, 7649 ], - // black and white level same for all colors at all ISOs - "ranges": { "black": 10, "white": 1000 }, - // crop away masked sensor borders, 10 pixels left, 20 pixels top, resulting image width/height 4000x3000 - // instead of width/height you can write a negative number which specifies how much of right/bottom border - // that should be removed - "raw_crop": [ 10, 20, 4000, 3000 ], - // same as MaskedAreas DNG tag, used for black level measuring here two areas defined - "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ], - }, - - { - "make_model": "ManufacturerA ModelB", - "dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], - // black and white levels per ISO per channel - // this example only two ISOs, normally the list should be more populated. - // When RawTherapee asks for black/white levels for a specific ISO the closest - // match is picked. - "ranges": { - "black": [ - { "iso": 100, "levels": 10 }, // here only one level, same level for all channels - { "iso": 3200, "levels": [ 50, 60, 50 ] } // 3 levels, G2 same as G1 - ], - "white": [ - { "iso": 100, "levels": [ 10000, 11000, 10000, 12000 ] }, // 4 levels, G1 and G2 different - { "iso": 3200, "levels": [ 11000, 11000, 10000, 12000 ] } - ] - } - } - -How to measure white levels: ----------------------------- - -Dcraw which provides the default values to RawTherapee often provides too high -white levels, and only provides a single value regardless of color channel, ISO -or aperture. If you open an image with a large clipped area and that is -rendered in a pink/magenta color rather than white it usually means that the -white level constant is too high. You can fix this by adjusting the -"Raw White Point" in the raw tab inside RawTherapee, or permanently fix it by -measuring and providing a more exact white level in camconst.json so -RawTherapee gets to know from start where the camera actually clips. - -Providing a complete and detailed white-level profile can be a quite large -and complicated effort. As an alternative you can provide a simpler profile. -We suggest one of the following alternatives in rising difficulty (and -generally diminishing return): - -A) Provide a single white-level value measured on the native ISO (base ISO). - For many cameras this will actually be complete information, those that - don't vary on channel, ISO or aperture. -B) Check through all ISOs and if there are differences in white level provide - an array with white level per ISO. -C) In addition to ISO, check for aperture scaling and add that. -D) In addition to ISO and aperture scaling check for color channel - differences and add that. - -Doing A) is often better than nothing, as dcraw's default is often too high. -B) can also be worthwhile for some cameras (or else you'll get pink highlights -for some ISOs), while C) and D) can generally be seen as fine-tuning. - -Here follows a guide how to measure white levels (clipping levels): - -Shoot with your camera into a bright light source, such as a lamp, and make -sure the shutter speed is long enough to get overexposure (we want -clipping!). Preferably overexpose lightly, say 1 or 2 stops if you can. The -reason for this is that some cameras with fuzzy white levels may look less -fuzzy than they actually are if over-exposure is heavy. - -Use f/5.6 or smaller aperture (=larger f-number) to avoid any raw scaling -the camera might have for large apertures. - -Open the file in a raw analyzer such as Rawdigger and check the pixel values -for the clipped areas (if you are using Rawdigger, make sure you have disabled -"subtract black" in preferences or else sample values can be wrong). In this -stage we always look at white level before black level subtraction! White -levels can be different on color channel (R, G1, B, G2, note the two greens, -most often both green channels have the same white level though) and vary -depending on ISO setting, so if you want to provide a complete profile make -one shoot for each ISO (even 1/3 steps, so yes it can be quite a lot of -pictures to shoot and check). - -In addition, many cameras scale the raw values for large apertures. It's -generally not that important to cover this, but if you want to extract most -out of the camera you should cover this too. Then you need to shoot with a -wide aperture lens (ideally the widest available from the manufacturer) and -test each aperture (1/3 steps) from the widest (say f/1.2) until the camera -stops scaling the raw values (usually f/2.8 or f/4.0). If the camera also -have ISO scaling you need to shoot at these different ISOs to detect any -differences in scaling, there can be a bit of variation. If you don't have -access to the widest lens available for the system (say only an f/1.8 lens -instead of an f/1.2) it can still be valuable to have the values down to -what you can provide. Brands known to have models that have aperture scaling -of white levels include Canon and Nikon. Note that if white levels are not -scaled the camera may have raw scaling anyway (Sony for example), but as -such scaling will not affect raw decoding we don't need to care about that. - -PROVIDE CONSERVATIVE VALUES. Most cameras have a little noise at the white -level, and some can have a lot. In your raw analyzer, move around and look at -the values in the clipped areas to get a sense of the variation, and/or look -at the histogram. While it's common to with very little variation, say only -+/-2 units, some can have +/-500 or more (some may have different variation -depending on ISO). There can also be camera-to-camera variation. - -If the white level is set too high RawTherapee will not think the pixels are -clipped and you can get discoloured highlights (usually pink), this is what -we want to avoid. If white level is set too low RawTherapee will clip early, ie -you lose a little highlight detail, but the color is rendered correctly and -highlight reconstruction can work properly, so this is not as bad. This is why -we want conservative values. - -By conservative values we mean that if you see a white level of most often -15760 and occassionally 15759 (ie very small variation of white level which -is a common case), you set the white level 10 - 20 units below, say at 15750 in -this example, this way we get a little margin from noise and camera variation. -Since sensor raw values are linear you lose in this example log2(1-10/15760) = --0.001 stop of detail, ie irrelevant. Thus it's better to provide RawTherapee -with knowledge where the image clips rather than keeping that last 0.001 stop -of highlight information and risking that clipping will not be detected -properly. - -If you have a fuzzy white level look at the linear histogram; you will probably -see a normal/gaussian distribution (bell shape) noise peak at clipping and -probably also a peak at a hard raw data clip level usually at or close to a -power of two - 1, such as 4095 or 16383. Then you pick a value just before the -bell shape rises, ie to the left of the bell meaning that you cut away the -whole fuzzy noise peak. If a little of the starting edge of the noise will be -included it's not harmful, but 99% of it should be above. - -If you have used Adobe's DNG Converter and analyzed it's output you may have -noticed that it's very conservative regarding white levels, ie it cuts away -quite a lot from the top. While we also recommend to be conservative, you can -generally be a little bit less so than Adobe's DNG Converter. RawTherapee is -meant to max out what you can get from your camera, and the white levels should -mirror that, within reason. - -The aperture scaling feature is meant to raise the white level to not miss out -on highlight detail when the camera has scaled the raw values (and thus -raised white levels). Many cameras do this, but not all, and can only do it -for lenses that report aperture to the camera (ie you see it in the EXIF -data). Providing proper aperture scaling values is a bit more advanced task, -so if you are unsure we recommend to skip that part. - -Beware that the raw format may have a ceiling so that it clips scaled values, -for example the Canon 5D mark II maxes out at 16383 which happens at f/1.8 -for ISOs with the white level at 15750, but for ISO160 when the white level -is 12800 it does not max out. If there is such a raw limit it must also be -provided ("ranges":"white_max"). Usually you will not need a margin on -white_max as it clips there as a result of an in-camera math operation. - -Note that aperture scaling can be quite small, for the 5D mark II it's only -0.1 stop down to f/1.4 and then it can be discussed if it's worthwhile to care. -The "worst" cameras scale about 0.6 stops though, and then it's more -valuable to compensate. If you skip aperture scaling RawTherapee will clip the -files a little bit too early and you miss that last fraction of highlight -detail, but you get no processing problems. Setting unconservative scale -factors can on the other hand cause a too high whitelevel and break highlight -processing, so be careful. - -Scaling can vary sligthly depending on ISO (if white levels vary) so make -sure to provide conservative scalings so regardless of ISO you don't get a -too high white level. We recommend to keep a wider margin here than on the -white levels, ie 0.5-1% lower or so. For example if base (conservative!) -white level is 15750 and the scaled is 16221 we have a scaling factor of -16221/15750=1.0299 ie +2.9% we set the factor to 1.02 or +2% to keep a -margin. - -The scale factor you provide here is applied on the white level before black -level subtraction (if any), ie directly on the white level value you provide in -the camconst.json file. Black level (if provided) is not scaled. Please report -to us if you come across a camera which scales black levels, then we can add -that as an option. Usually the camera applies an offset to shift back the -black level to the standard level after scaling. - -If RawTherapee doesn't find an entry for the aperture used in the image, it -will pick the closest above. Ie if the apertures 1.0 and 2.0 is in the table -and the image has aperture 1.2, it will pick scaling for 2.0, even if 1.0 is -the closer aperture. The reason for always checking the closest above is that -we rather get a bit too low white level than too high, as discussed before. - -Some cameras have different white levels on different color channels. When -this is the case the difference is often so small so you can just provide a -single value instead, ie a conservative value based on the lowest clipping. - -What we know at the time of writing about different brands/models (not -complete info): - - - Canon CR2: typically same clipping per channel, but significant variations - on ISO and aperture. Maxes out at 16383, black level measured on masked - black pixels, ie don't provide that. - - Nikon NEF: sometimes different clipping per color (most often negligible - though). Will do aperture and ISO scaling, but often to a lesser extent - than Canon files, ie not as much to gain. - - Sony ARW2: no scaling. Generally black level around 512, and white level - 16350. - -Note that some raw formats may go through a certain amount of pre-processing -based on meta data, such as curve and levels adjustments and various -calibrations. The Phase One IIQ is one example, and this means that if you -look at the data in a raw analyzer such as RawDigger it may perform a -different type of preprocessing than RawTherapee's loader does, and you may -end up providing incompatible black/white levels. - -You can use RawTherapee for analysis too, it's safer as you are using it's -own raw decoder but it's not as user-friendly: enable verbose mode in options -so you get output on the console (you need to start RT from a console to see -the output). When you load a file you will see a message of current black -and white levels and if they came from dcraw or camconst.json. If you're -adjusting an existing camconst.json value you can just read what it is in -the file and not need to enable verbose output. - -Reset exposure sliders to neutral, and zoom in on a large clipped highlight. -Move around the mouse pointer within, it should show stable 100% on R G B. If -so, the white level is not too high, it could however be too low. To test that, -go to the raw tab and adjust the "whitepoint linear correction factor", reduce -it until one of the channels is no longer 100%, and then increase in steps of -0.01 until all are 100 again. Usually you play around in the range 0.90 to -0.99, ie a very small adjustment. When you've found this factor you should -apply it on the old white level to find a new larger one. As RT's "whitepoint -linear correction factor" work after blacklevel subtraction and camconst.json -want values without it we need to do some math: - -BL = black level (typically something near 0, 256, 512 or 1024, find it in the - verbose output or if available in camconst.json) -F = whitepoint linear correction factor you just found out (typically in the - range 0.90 to 0.99 if you need to increase white level, 1.01 to 1.10 if - decrease) -oldWL = old white level, found in verbose output or in camconst.json if - available. - -new white level = BL + (oldWL - BL) / F - -Note that if black level is 0 which it is for many cameras, the formula -simplifies to: new white level = oldWL / F. - -Here's an example from a Canon 1000D: black level is 256, old white level is -3651, whitepoint correction factor becomes 0.90, then new white level is -256 + (3651 - 256) / 0.9 = 4028. - -If your camera have different black levels per channel use the one which -yields the smallest white level (can be the largest or smallest, test!). - -This new white level you then enter in your camconst.json file. The same -procedure can be used if the white level is too high, ie if you see pink -highlights, then increase the correction factor above 1.0 until you just start -seeing stable 100% on all channels, you use the same formula to calculate the -new smaller white level. - -About black levels: -------------------- - -Unlike for white levels it's much more common that black levels can be -derived from the format. Either it's simply 0 (typical for Nikon cameras), or -it can be derived from masked pixels (typical for Canon cameras) or otherwise -be extracted from some tag. Some formats are have built-in subtraction -information and are pre-processed by DCRaw to end up at a black level of zero -(Phase One's IIQ). In all, you typically should not care about the black -level in camconst.json: any information that can be derived from the raw file -itself should not be specified in camconst.json! Sony's ARW2 is one of the -few exceptions (which has a single black level around 512), but DCraw -generally has good constants for these already. - -Currently we have chosen not to provide any guide how to measure black levels -as we don't think it will be a common task (it's also more difficult to do -than measure white levels). If you experience a black level issue it's more -likely due to a format parsing bug which should be fixed in DCRaw and/or -RawTherapee's raw format parser. - -How does a black level issue look? If the image has a color cast and is -possibly duller than normal it's likely that black levels are off. The color -cast is typically stronger in darker colors but it can be hard to see, it's -more often experienced as a cast over the whole image. - -*/ -{"camera_constants": [ - -/* - -When adding camera constants please set a quality level so we know the status for future updates - -Quality A: complete information, no need to add more, to the best of our knowledge -Quality B: not complete, but very little to gain from adding more -Quality C: complementing with additional information would provide significant gain -Quality X: unknown, ie we knowing to little about the camera properties to know if - we have enough info or not. - -*/ - - - { // quality A (only aperture scaling for f/1.2 missing) - "make_model": "Canon EOS 5D Mark II", - "dcraw_matrix": [ 4716,603,-830,-7798,15474,2480,-1496,1937,6651 ], - "ranges": { - // black levels are read from raw masked pixels - // white levels are same for all colors, but vary on ISO - "white": [ - { "iso": 50, "levels": 15750 }, // typical: 15760 - { "iso": 100, "levels": 15750 }, - { "iso": 125, "levels": 15750 }, - { "iso": 160, "levels": 12800 }, - { "iso": 200, "levels": 15750 }, - { "iso": 250, "levels": 15750 }, - { "iso": 320, "levels": 12800 }, // typical: 12810 - { "iso": 400, "levels": 15750 }, - { "iso": 500, "levels": 15750 }, - { "iso": 640, "levels": 12800 }, - { "iso": 800, "levels": 15750 }, - { "iso": 1000, "levels": 15750 }, - { "iso": 1250, "levels": 12800 }, - { "iso": 1600, "levels": 15750 }, - { "iso": 2000, "levels": 15750 }, - { "iso": 2500, "levels": 15750 }, - { "iso": 3200, "levels": 15750 }, - { "iso": 4000, "levels": 15750 }, - { "iso": 5000, "levels": 15750 }, - { "iso": 6400, "levels": 16370 }, // typical: 16383 - { "iso": 12800, "levels": 16370 }, - { "iso": 25600, "levels": 16370 } - ], - "white_max": 16383, - "aperture_scaling": [ - /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the - typical 15750 white level maxes out at "white_max" for f/1.8 and below anyway. */ - { "aperture": 1.4, "scale_factor": 1.077 }, - { "aperture": 1.6, "scale_factor": 1.054 }, - { "aperture": 1.8, "scale_factor": 1.039 }, - { "aperture": 2.0, "scale_factor": 1.031 }, - { "aperture": 2.2, "scale_factor": 1.021 }, - { "aperture": 2.5, "scale_factor": 1.016 }, - { "aperture": 2.8, "scale_factor": 1.010 }, - { "aperture": 3.2, "scale_factor": 1.0046 }, - { "aperture": 3.5, "scale_factor": 1.0031 } - ] - } - }, - { // quality B, more aperture scalings desired - "make_model": "Canon EOS 5D Mark III", - "dcraw_matrix": [ 6722,-635,-963,-4287,12460,2028,-908,2162,5668 ], - "ranges": { - // black levels are read from raw masked pixels - // white levels are same for all colors, but vary on ISO - "white": [ - { "iso": 50, "levels": 15270 }, // typical: 15282 - { "iso": 100, "levels": 15270 }, - { "iso": 125, "levels": 15270 }, - { "iso": 160, "levels": 13300 }, // typical: 13306 - { "iso": 200, "levels": 15270 }, - { "iso": 250, "levels": 15270 }, - { "iso": 320, "levels": 13300 }, - { "iso": 400, "levels": 15270 }, - { "iso": 500, "levels": 15270 }, - { "iso": 640, "levels": 13300 }, - { "iso": 800, "levels": 15270 }, - { "iso": 1000, "levels": 15270 }, - { "iso": 1250, "levels": 13300 }, - { "iso": 1600, "levels": 15270 }, - { "iso": 2000, "levels": 15270 }, - { "iso": 2500, "levels": 13300 }, - { "iso": 3200, "levels": 15270 }, - { "iso": 4000, "levels": 15270 }, - { "iso": 5000, "levels": 13300 }, - { "iso": 6400, "levels": 15270 }, - { "iso": 8000, "levels": 15270 }, - { "iso": 10000, "levels": 13300 }, // no data, guessed - { "iso": 12800, "levels": 15270 }, - { "iso": 16000, "levels": 15270 }, - { "iso": 20000, "levels": 15270 }, - { "iso": 25600, "levels": 16300 }, - { "iso": 32000, "levels": 16300 }, - { "iso": 40000, "levels": 16300 }, - { "iso": 51200, "levels": 16300 }, - { "iso": 102400, "levels": 16300 } - ], - "white_max": 16383, - "aperture_scaling": [ - // limited scaling info available, please provide more - { "aperture": 2.0, "scale_factor": 1.024 }, - { "aperture": 2.8, "scale_factor": 1.010 } - ] - } - }, - - { // quality B, lacks aperture and ISO scaling, known to exist, but little to gain as the levels are so close to white_max - "make_model": "Nikon D7000", - "dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], // matrix provided by Tanveer(tsk1979) - "ranges": { - // measured at ISO 100. ISO differences not measured, but known to exist - "white": [ 16370, // 16383 typical - 15760, // 15778 typical - 16370 // 16383 typical - ], - "white_max": 16383 - // aperture scaling not measured, but known to exist, at f/1.8 the G channels hits white_max - } - }, - - { // quality A - "make_model": "Sony SLT-A77", - "dcraw_matrix": [ 5126,-830,-261,-4788,12196,2934,-948,1602,7068 ], // matrix provided by Colin Walker - // note: Sony ARW2 file format gets 14 bit values, not 12 bit like in dcraw 9.19 - "ranges": { "black": 512, "white": 16350 } - }, - { // quality A - "make_model": [ "Sony SLT-A99", "Sony SLT-A99V" ], - "dcraw_matrix": [ 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 ], - "ranges": { "black": 512, "white": 16350 } - }, - - /* Phase One: color matrices borrowed from Adobe DNG Converter, black/white levels tested on actual raw files. - Note: the dcraw decoder makes black level subtraction and various corrections to the raw values based on - metadata embedded in the IIQ format, so what we see here is the result after that, ie black level is 0, - and white level is typically at or close to 65535. However sensors vary a bit and can be noisy around clip - so we cut away 0.05 stop from top down to 63300 to be a bit conservative. */ - { // quality A - "make_model": [ "Phase One P40+", "Phase One IQ140", "Phase One P65+", "Phase One IQ160", "Phase One IQ260" ], - "dcraw_matrix": [ 8035,435,-962,-6001,13872,2320,-1159,3065,5434 ], - "ranges": { "black": 0, "white": 63300 } - }, - { // quality A - "make_model": [ "Phase One IQ180", "Phase One IQ280" ], - "dcraw_matrix": [ 6294,686,-712,-5435,13417,2211,-1006,2435,5042 ], - "ranges": { "black": 0, "white": 63300 } - }, - { // quality A - "make_model": [ "Phase One P20", "Phase One P20+", "Phase One P25", "Phase One P25+" ], - "dcraw_matrix": [ 2905,732,-237,-8135,16626,1476,-3038,4253,7517 ], - "ranges": { "black": 0, "white": 63300 } - }, - { // quality A - "make_model": [ "Phase One P21", "Phase One P21+" ], - "dcraw_matrix": [ 6516,-2050,-507,-8217,16703,1479,-3492,4741,8489 ], - "ranges": { "black": 0, "white": 63300 } - }, - { // quality A - "make_model": [ "Phase One P30", "Phase One P30+"], - "dcraw_matrix": [ 4516,-244,-36,-7020,14976,2174,-3206,4670,7087 ], - "ranges": { "black": 0, "white": 63300 } - }, - { // quality A - "make_model": [ "Phase One P45", "Phase One P45+" ], - "dcraw_matrix": [ 5053,-24,-117,-5685,14077,1703,-2619,4491,5850 ], - "ranges": { "black": 0, "white": 63300 } - }, - - { // Quality B, only raw crop fix here, dcraw hard-coded seems to handle the rest just fine - "make_model": [ "Hasselblad CFV-50" ], - "raw_crop": [ 44, 4, 8196, 6152 ] - }, - - // dummy test entry to test the parser and show the format with all entries active - { - "make_model": "DummyMake DummyModel", - "dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], - "raw_crop": [ 10, 20, 4000, 3000 ], - "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ], - "ranges": { - "aperture_scaling": [ - { "aperture": 1.2, "scale_factor": 1.1 }, - { "aperture": 1.4, "scale_factor": 1.08 } - ], - "black": [ - { "iso": 100 , "levels": [ 10, 20, 10, 20 ] }, - { "iso": [100, 200] , "levels": [ 30, 40, 30 ] }, - { "iso": 3200, "levels": [ 50, 60, 50, 60 ] } - ], - "white": [ - { "iso": 100 , "levels": [ 10000, 11000, 10000, 11000 ] }, - { "iso": 3200, "levels": [ 11000, 11000, 10000, 11000 ] } - ], - "white_max": 16383 - } - } -]} +/* + + DO NOT EDIT THIS FILE! + + All changes made here will be lost on software update. + If you want to add custom values or changes existing ones, + create a "camconst.json" file next to your personal "options" file. + Its values will then override and/or complete the ones of this file. + + If you add values for your own camera and are okay to share them with + RawTherapee's community, please drop a link on the user's forum + + IMPORTANT: + ---------- + + 1. If you set the dcraw matrix in your user file for an already existing entry + in RT's file (same camera, same model), your values will replace RT's ones. + 2. If you set the Black level(s) values in your user file for an already existing + entry in RT's file, your values will replace RT's ones, even if RT's ones are + more complete and/or detailed. You might want to copy/paste RT's levels first + (if provided) to your user's file and complete/modify it. + + Same for the White level(s), independently from the Black level(s). + + +---------------------------------------------------------------------------------- + + +This file is in JSON format and contains camera constants which RawTherapee uses +when parsing raw files. + +Raw files themselves unfortunately do not contain all information needed for making +a raw conversion, typically color response information and black/white levels are +missing. That's why this file is needed. + +It's read once during startup, so if the file is updated you need to restart +RawTherapee in order to take effect. The file is not intended for modification by +the casual user, but advanced users can add missing camera information to this file. +If you do so please report at http://code.google.com/p/rawtherapee/issues so we can +extend the distributed version of this file so your provided camera information +becomes available to all. + +RawTherapee uses DCRAW as the raw format parser. DCRAW contains hard-coded camera +constants, but not for all cameras and not always accurate information. For example +DCRAW only support one white level, while some cameras have different white levels +per channel and per ISO. If a camera is not listed in this file the constants from +DCRAW will be used, if listed here this information will override any constants in +DCRAW (if any). + +Some cameras may only have partial information here, for example if the raw file +itself contains a color matrix it's not entered here. A camera whose black level +is measured on special pixels in the raw file should only have white levels here +etc. + +Examples: + + { + // make and model separated with single space, must match make + // and model as provided by dcraw (case-insensitive). + "make_model": "ManufacturerA ModelB", + // ColorMatrix with D65 Calibration Illuminant, in dcraw format + "dcraw_matrix": [ 7530, -1942, -255, -4318, 11390, 3362, -926, 1694, 7649 ], + // black and white level same for all colors at all ISOs + "ranges": { "black": 10, "white": 1000 }, + // crop away masked sensor borders, 10 pixels left, 20 pixels top, resulting image width/height 4000x3000 + // instead of width/height you can write a negative number which specifies how much of right/bottom border + that should be removed but keep in mind that sometimes after converting to DNG the borders are already + cropped so the "negative number" way is not totally safe. + "raw_crop": [ 10, 20, 4000, 3000 ], + // Almost same as MaskedAreas DNG tag, used for black level measuring here two areas defined + "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ], + The difference here is the meaning of the numbers which here are expressing the absolute distance (in pixels) + of each side of each rectangular "masked area" from the top and left side of the sensor + - the first number is the distance of the top edge from the sensor's top + - the second is the distance of the left side from the sensors left + - the third is the distance of the bottomn side from the sensors top + - the fourth is the distance of the right side from the sensor's left + }, + + { + "make_model": "ManufacturerA ModelB", + "dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], + // black and white levels per ISO per channel + // this example only two ISOs, normally the list should be more populated. + // When RawTherapee asks for black/white levels for a specific ISO the closest + // match is picked. + "ranges": { + "black": [ + { "iso": 100, "levels": 10 }, // here only one level, same level for all channels + { "iso": 3200, "levels": [ 50, 60, 50 ] } // 3 levels, G2 same as G1 + ], + "white": [ + { "iso": 100, "levels": [ 10000, 11000, 10000, 12000 ] }, // 4 levels, G1 and G2 different + { "iso": 3200, "levels": [ 11000, 11000, 10000, 12000 ] } + ] + } + } + +How to measure white levels: +---------------------------- + +Dcraw which provides the default values to RawTherapee often provides too high +white levels, and only provides a single value regardless of color channel, ISO +or aperture. If you open an image with a large clipped area and that is +rendered in a pink/magenta color rather than white it usually means that the +white level constant is too high. You can fix this by adjusting the +"Raw White Point" in the raw tab inside RawTherapee, or permanently fix it by +measuring and providing a more exact white level in camconst.json so +RawTherapee gets to know from start where the camera actually clips. + +Providing a complete and detailed white-level profile can be a quite large +and complicated effort. As an alternative you can provide a simpler profile. +We suggest one of the following alternatives in rising difficulty (and +generally diminishing return): + +A) Provide a single white-level value measured on the native ISO (base ISO). + For many cameras this will actually be complete information, those that + don't vary on channel, ISO or aperture. +B) Check through all ISOs and if there are differences in white level provide + an array with white level per ISO. +C) In addition to ISO, check for aperture scaling and add that. +D) In addition to ISO and aperture scaling check for color channel + differences and add that. + +Doing A) is often better than nothing, as dcraw's default is often too high. +B) can also be worthwhile for some cameras (or else you'll get pink highlights +for some ISOs), while C) and D) can generally be seen as fine-tuning. + +Here follows a guide how to measure white levels (clipping levels): + +Shoot with your camera into a bright light source, such as a lamp, and make +sure the shutter speed is long enough to get overexposure (we want +clipping!). Preferably overexpose lightly, say 1 or 2 stops if you can. The +reason for this is that some cameras with fuzzy white levels may look less +fuzzy than they actually are if over-exposure is heavy. + +Use f/5.6 or smaller aperture (=larger f-number) to avoid any raw scaling +the camera might have for large apertures. + +Open the file in a raw analyzer such as Rawdigger and check the pixel values +for the clipped areas (if you are using Rawdigger, make sure you have disabled +"subtract black" in preferences or else sample values can be wrong). In this +stage we always look at white level before black level subtraction! White +levels can be different on color channel (R, G1, B, G2, note the two greens, +most often both green channels have the same white level though) and vary +depending on ISO setting, so if you want to provide a complete profile make +one shoot for each ISO (even 1/3 steps, so yes it can be quite a lot of +pictures to shoot and check). + +In addition, many cameras scale the raw values for large apertures. It's +generally not that important to cover this, but if you want to extract most +out of the camera you should cover this too. Then you need to shoot with a +wide aperture lens (ideally the widest available from the manufacturer) and +test each aperture (1/3 steps) from the widest (say f/1.2) until the camera +stops scaling the raw values (usually f/2.8 or f/4.0). If the camera also +have ISO scaling you need to shoot at these different ISOs to detect any +differences in scaling, there can be a bit of variation. If you don't have +access to the widest lens available for the system (say only an f/1.8 lens +instead of an f/1.2) it can still be valuable to have the values down to +what you can provide. Brands known to have models that have aperture scaling +of white levels include Canon and Nikon. Note that if white levels are not +scaled the camera may have raw scaling anyway (Sony for example), but as +such scaling will not affect raw decoding we don't need to care about that. + +PROVIDE CONSERVATIVE VALUES. Most cameras have a little noise at the white +level, and some can have a lot. In your raw analyzer, move around and look at +the values in the clipped areas to get a sense of the variation, and/or look +at the histogram. While it's common to with very little variation, say only ++/-2 units, some can have +/-500 or more (some may have different variation +depending on ISO). There can also be camera-to-camera variation. + +If the white level is set too high RawTherapee will not think the pixels are +clipped and you can get discoloured highlights (usually pink), this is what +we want to avoid. If white level is set too low RawTherapee will clip early, ie +you lose a little highlight detail, but the color is rendered correctly and +highlight reconstruction can work properly, so this is not as bad. This is why +we want conservative values. + +By conservative values we mean that if you see a white level of most often +15760 and occassionally 15759 (ie very small variation of white level which +is a common case), you set the white level around 40-80 14bit units below or +10-20 12bit units. Say at 15700 in this example, or 4080 instead of 4095 for +12bit raws. This way we get a little margin from noise and camera variation. +Since sensor raw values are linear you lose in this example log2(1-50/15760) = +-0.005 stop of detail, ie irrelevant. Thus it's better to provide RawTherapee +with knowledge where the image clips rather than keeping that last 0.005 stop +of highlight information and risking that clipping will not be detected +properly. + +It is very usual for white level to be a bell distribution instead of a candle +when the camera applies long exposure noise reduction by subtracting a black frame +and/or when the system is destabilized due to temperature. Some models have +always a bell distribution at WL. +If you have a fuzzy white level look at the linear histogram; you will probably +see a normal/gaussian distribution (bell shape) noise peak at clipping and +probably also a peak at a hard raw data clip level usually at or close to a +power of two - 1, such as 4095 or 16383. Then you pick a value just before the +bell shape rises, ie to the left of the bell meaning that you cut away the +whole fuzzy noise peak. If a little of the starting edge of the noise will be +included it's not harmful, but 99% of it should be above. +This would mean that it's better to measure white level on long exposure/ high temp +raws but since this if difficult and time consuming we choose to measure on normal +raws and cover the abnormalities whith the conservative WL values. + +If you have used Adobe's DNG Converter and analyzed it's output you may have +noticed that it's very conservative regarding white levels, ie it cuts away +quite a lot from the top. While we also recommend to be conservative, you can +generally be a little bit less so than Adobe's DNG Converter. RawTherapee is +meant to max out what you can get from your camera, and the white levels should +mirror that, within reason. + +The aperture scaling feature is meant to raise the white level to not miss out +on highlight detail when the camera has scaled the raw values (and thus +raised white levels). Many cameras do this, but not all, and can only do it +for lenses that report aperture to the camera (ie you see it in the EXIF +data). Providing proper aperture scaling values is a bit more advanced task, +so if you are unsure we recommend to skip that part. + +Beware that the raw format may have a ceiling so that it clips scaled values, +for example the Canon 5D mark II maxes out at 16383 which happens at f/1.8 +for ISOs with the white level at 15750, but for ISO160 when the white level +is 12800 it does not max out. If there is such a raw limit it must also be +provided ("ranges":"white_max"). Usually you will not need a margin on +white_max as it clips there as a result of an in-camera math operation. + +Note that aperture scaling can be quite small, for the 5D mark II it's only +0.2 stop down to f/1.2 and then it can be discussed if it's worthwhile to care. +The "worst" cameras scale about 0.6 stops though, and then it's more +valuable to compensate. If you skip aperture scaling RawTherapee will clip the +files a little bit too early and you miss that last fraction of highlight +detail, but you get no processing problems. Setting unconservative scale +factors can on the other hand cause a too high whitelevel and break highlight +processing, so be careful. + +Scaling can vary sligthly depending on ISO (if white levels vary) so make +sure to provide conservative scalings so regardless of ISO you don't get a +too high white level. We recommend to keep a small margin here also +white levels, ie 0.5% lower or so. For example if base (not conservative!) +white level is 15750 and the scaled is 16221 we have a scaling factor of +16221/15750=1.0299 ie +2.9% we set the factor to 1.025 to keep a margin. +The abnormal cases are already covered by setting conservative per ISO White levels. + +The scale factor you provide here is applied on the white level before black +level subtraction (if any), ie directly on the white level value you provide in +the camconst.json file. Black level (if provided) is not scaled. Please report +to us if you come across a camera which scales black levels, then we can add +that as an option. Usually the camera applies an offset to shift back the +black level to the standard level after scaling. + +If RawTherapee doesn't find an entry for the aperture used in the image, it +will pick the closest above. Ie if the apertures 1.0 and 2.0 is in the table +and the image has aperture 1.2, it will pick scaling for 2.0, even if 1.0 is +the closer aperture. The reason for always checking the closest above is that +we rather get a bit too low white level than too high, as discussed before. + +Some cameras have different white levels on different color channels. When +this is the case the difference is often so small so you can just provide a +single value instead, ie a conservative value based on the lowest clipping. + +What we know at the time of writing about different brands/models (not +complete info): + + - Canon CR2: typically same clipping per channel, but significant variations + on ISO and aperture. Maxes out at 16383, black level measured on masked + black pixels, ie don't provide that. + - Nikon NEF: sometimes different clipping per color (most often negligible + though). Will do aperture and ISO scaling, but often to a lesser extent + than Canon files, ie not as much to gain. + - Sony ARW2: no scaling. Generally black level around 512, and white level + 16350 and to be conservative say 16300. + +Note that some raw formats may go through a certain amount of pre-processing +based on meta data, such as curve and levels adjustments and various +calibrations. The Phase One IIQ is one example, and this means that if you +look at the data in a raw analyzer such as RawDigger it may perform a +different type of preprocessing than RawTherapee's loader does, and you may +end up providing incompatible black/white levels. + +You can use RawTherapee for analysis too, it's safer as you are using it's +own raw decoder but it's not as user-friendly: enable verbose mode in options +so you get output on the console (you need to start RT from a console to see +the output). When you load a file you will see a message of current black +and white levels and if they came from dcraw or camconst.json. If you're +adjusting an existing camconst.json value you can just read what it is in +the file and not need to enable verbose output. + +Reset exposure sliders to neutral, and zoom in on a large clipped highlight. +Move around the mouse pointer within, it should show stable 100% on R G B. If +so, the white level is not too high, it could however be too low. To test that, +go to the raw tab and adjust the "whitepoint linear correction factor", reduce +it until one of the channels is no longer 100%, and then increase in steps of +0.01 until all are 100 again. Usually you play around in the range 0.90 to +0.99, ie a very small adjustment. When you've found this factor you should +apply it on the old white level to find a new larger one. As RT's "whitepoint +linear correction factor" work after blacklevel subtraction and camconst.json +want values without it we need to do some math: + +BL = black level (typically something near 0, 256, 512 or 1024, find it in the + verbose output or if available in camconst.json) +F = whitepoint linear correction factor you just found out (typically in the + range 0.90 to 0.99 if you need to increase white level, 1.01 to 1.10 if + decrease) +oldWL = old white level, found in verbose output or in camconst.json if + available. + +new white level = BL + (oldWL - BL) / F + +Note that if black level is 0 which it is for many cameras, the formula +simplifies to: new white level = oldWL / F. + +Here's an example from a Canon 1000D: black level is 256, old white level is +3651, whitepoint correction factor becomes 0.90, then new white level is +256 + (3651 - 256) / 0.9 = 4028. + +If your camera have different black levels per channel use the one which +yields the smallest white level (can be the largest or smallest, test!). + +This new white level you then enter in your camconst.json file. The same +procedure can be used if the white level is too high, ie if you see pink +highlights, then increase the correction factor above 1.0 until you just start +seeing stable 100% on all channels, you use the same formula to calculate the +new smaller white level. + +About black levels: +------------------- + +Unlike for white levels it's much more common that black levels can be +derived from the format. Either it's simply 0 (typical for Nikon cameras), or +it can be derived from masked pixels (typical for Canon cameras) or otherwise +be extracted from some tag. Some formats are have built-in subtraction +information and are pre-processed by DCRaw to end up at a black level of zero +(Phase One's IIQ). In all, you typically should not care about the black +level in camconst.json: any information that can be derived from the raw file +itself should not be specified in camconst.json! Sony's ARW2 is one of the +few exceptions (which has a single black level around 512), but DCraw +generally has good constants for these already. + +Currently we have chosen not to provide any guide how to measure black levels +as we don't think it will be a common task (it's also more difficult to do +than measure white levels). If you experience a black level issue it's more +likely due to a format parsing bug which should be fixed in DCRaw and/or +RawTherapee's raw format parser. + +How does a black level issue look? If the image has a color cast and is +possibly duller than normal it's likely that black levels are off. The color +cast is typically stronger in darker colors but it can be hard to see, it's +more often experienced as a cast over the whole image. + +*/ +{"camera_constants": [ + +/* + +When adding camera constants please set a quality level so we know the status for future updates + +Quality A: complete information, no need to add more, to the best of our knowledge +Quality B: not complete, but very little to gain from adding more +Quality C: complementing with additional information would provide significant gain +Quality X: unknown, ie we knowing to little about the camera properties to know if + we have enough info or not. + +*/ + + { // quality A (only aperture scaling for f/1.2 missing) + "make_model": "Canon EOS 5D Mark II", + "dcraw_matrix": [ 4716,603,-830,-7798,15474,2480,-1496,1937,6651 ], + "ranges": { + // black levels are read from raw masked pixels + // white levels are same for all colors, but vary on ISO + "white": [ + { "iso": 50, "levels": 15600 }, // typical: 15760 + { "iso": 100, "levels": 15600 }, + { "iso": 125, "levels": 15600 }, + { "iso": 160, "levels": 12700 }, + { "iso": 200, "levels": 15600 }, + { "iso": 250, "levels": 15600 }, + { "iso": 320, "levels": 12700 }, // typical: 12810 + { "iso": 400, "levels": 15600 }, + { "iso": 500, "levels": 15600 }, + { "iso": 640, "levels": 12700 }, + { "iso": 800, "levels": 15600 }, + { "iso": 1000, "levels": 15600 }, + { "iso": 1250, "levels": 12700 }, + { "iso": 1600, "levels": 15600 }, + { "iso": 2000, "levels": 15600 }, + { "iso": 2500, "levels": 15600 }, + { "iso": 3200, "levels": 15600 }, + { "iso": 4000, "levels": 15600 }, + { "iso": 5000, "levels": 15600 }, + { "iso": 6400, "levels": 16200 }, // typical: 16383 + { "iso": 12800, "levels": 16200 }, + { "iso": 25600, "levels": 16200 } + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for and f/1.0 (had no lenses to test with), but the + typical 15700 white level maxes out at "white_max" for f/1.8 and below anyway. */ + { "aperture": 1.2, "scale_factor": 1.100 }, // guessed by relative 5DIII data + { "aperture": 1.4, "scale_factor": 1.077 }, + { "aperture": 1.6, "scale_factor": 1.054 }, + { "aperture": 1.8, "scale_factor": 1.039 }, + { "aperture": 2.0, "scale_factor": 1.031 }, + { "aperture": 2.2, "scale_factor": 1.021 }, + { "aperture": 2.5, "scale_factor": 1.016 }, + { "aperture": 2.8, "scale_factor": 1.010 }, + { "aperture": 3.2, "scale_factor": 1.004 }, + { "aperture": 3.5, "scale_factor": 1.003 } + ] + } + }, + { // quality A, + "make_model": "Canon EOS 5D Mark III", + "dcraw_matrix": [ 6722,-635,-963,-4287,12460,2028,-908,2162,5668 ], + "ranges": { + // black levels are read from raw masked pixels + // white levels are same for all colors, but vary on ISO + "white": [ + { "iso": [ 50, 100, 125, 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 12800, 16000, 20000 ], "levels": 15180 }, // typical: 15282 + { "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 13200 }, // typical: 13306 + { "iso": [ 25600, 32000, 40000, 51200, 102400 ], "levels": 16200 } + ], + "white_max": 16383, + "aperture_scaling": [ + { "aperture": 1.2, "scale_factor": 1.130 }, + { "aperture": 1.4, "scale_factor": 1.090 }, + { "aperture": 1.6, "scale_factor": 1.065 }, + { "aperture": 1.8, "scale_factor": 1.040 }, + { "aperture": 2.0, "scale_factor": 1.025 }, + { "aperture": 2.2, "scale_factor": 1.020 }, + { "aperture": 2.5, "scale_factor": 1.015 }, + { "aperture": 2.8, "scale_factor": 1.010 }, + { "aperture": 3.2, "scale_factor": 1.005 }, + { "aperture": 3.5, "scale_factor": 1.002 } + ] + } + }, + { // Quality A, some missing scaling factors are safelly guessed - most samples by sfink16 at RT forums + "make_model": "Canon EOS 6D", + "dcraw_matrix": [ 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 ], + "ranges": { + "white": [ + { "iso": [ 50, 100, 125, 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 12800, 16000, 25600 ], "levels": 15180 }, // typical 15283 + { "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000, 20000 ], "levels": 13100 }, // typical 13225 + { "iso": [ 51200, 102400 ], "levels": 16280 } // typical 16383 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.0 (had no lenses to test with), but the + ISO 160-320... 12650 white levels maxes out at "white_max" for f/1.2 and below anyway. */ + { "aperture": 1.2, "scale_factor": 1.130 }, // from histogramm 1 gap in every 7 levels + { "aperture": 1.4, "scale_factor": 1.090 }, // histogram 3 gaps in every 32 levels + { "aperture": 1.6, "scale_factor": 1.060 }, // 16213/15283 + { "aperture": 1.8, "scale_factor": 1.040 }, // guessed + { "aperture": 2.0, "scale_factor": 1.030 }, // 15800/15283 + { "aperture": 2.2, "scale_factor": 1.020 }, // guessed + { "aperture": 2.5, "scale_factor": 1.015 }, // 15541/15283 + { "aperture": 2.8, "scale_factor": 1.010 }, // 15437/15283 + { "aperture": 3.2, "scale_factor": 1.005 }, // 15361/15283 + { "aperture": 3.5, "scale_factor": 1.000 } // no sample + ] + } + }, + + { // Quality A - ISO and aperture WL data by Ilias at Avclub gr forums + "make_model": "Canon EOS 40D", + "dcraw_matrix": [ 6071,-747,-856,-7653,15365,2441,-2025,2553,7315 ], + "raw_crop": [ 30, 18, 3908, 2602 ], + "masked_areas": [ 20, 2, 2616, 20 ], + "ranges": { + "white": [ + { "iso": 100, "levels": 13700 }, // typical 13825 + { "iso": [ 125, 250, 500, 1000, 3200 ], "levels": 16280 }, // typical 16383 + { "iso": [ 160, 320, 640 ], "levels": 12600 }, // typical 12744 + { "iso": [ 200, 400 ], "levels": 16100 }, // typical 16224 + { "iso": 800, "levels": 15900 }, // gaussian histogram 15900-16224 + { "iso": 1600, "levels": 14900 }, // gaussian histogram 14900-15750 + { "iso": 1250, "levels": 11900 } // gaussian histogram 11900-12500 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the + typical 12700 white levels maxes out at "white_max" for f/1.4 and below anyway. */ + { "aperture": 1.4, "scale_factor": 1.265 }, // 16142/12744 + { "aperture": 1.6, "scale_factor": 1.145 }, // 15872/13825 + { "aperture": 1.8, "scale_factor": 1.090 }, // 15103/13825 + { "aperture": 2.0, "scale_factor": 1.035 }, // 14334/13825 + { "aperture": 2.2, "scale_factor": 1.005 }, // 13950/13825 + { "aperture": 2.5, "scale_factor": 1.000 } // 13825/13825 + ] + } + }, + { // Quality A, ISO and aperture WL data by Ayshih at Magic Lantern forums + "make_model": "Canon EOS 50D", + "dcraw_matrix": [ 4920,616,-593,-6493,13964,2784,-1774,3178,7005 ], + "ranges": { + "white": [ + { "iso": [ 100, 125 ], "levels": 13300 }, // typical 13432 + { "iso": [ 160, 320, 640, 1250 ], "levels": 12700 }, // typical 12790-12810 + { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 2500, 3200 ], "levels": 15630 }, // typical 15763-15733 + { "iso": [ 6400, 12800 ], "levels": 16200 } // typical 16383 + ], + "white_max": 16383, + "aperture_scaling": [ + { "aperture": 1.4, "scale_factor": 1.270 }, + { "aperture": 1.6, "scale_factor": 1.150 }, + { "aperture": 1.8, "scale_factor": 1.090 }, + { "aperture": 2.0, "scale_factor": 1.040 }, + { "aperture": 2.2, "scale_factor": 1.020 }, + { "aperture": 2.5, "scale_factor": 1.010 }, + { "aperture": 2.8, "scale_factor": 1.000 }, + { "aperture": 3.2, "scale_factor": 1.000 } + ] + } + }, + { // Quality A, ISO and aperture WL data by Shalrath at RawTherapee forums + "make_model": "Canon EOS 60D", + "dcraw_matrix": [ 6719,-994,-925,-4408,12426,2211,-887,2129,6051 ], + "ranges": { + "white": [ + { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583 + { "iso": [ 160, 320, 640, 1250, 2500 ], "levels": 12550 }, // typical 12650 + { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 5000, 6400, 12800 ], "levels": 15200 } // typical 15304 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the + typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */ + { "aperture": 1.4, "scale_factor": 1.308 }, // gaps 81of301 + { "aperture": 1.6, "scale_factor": 1.201 }, + { "aperture": 1.8, "scale_factor": 1.143 }, + { "aperture": 2.0, "scale_factor": 1.084 }, // gaps 1of11 + { "aperture": 2.2, "scale_factor": 1.060 }, + { "aperture": 2.5, "scale_factor": 1.050 }, + { "aperture": 2.8, "scale_factor": 1.033 }, + { "aperture": 3.2, "scale_factor": 1.016 }, + { "aperture": 3.5, "scale_factor": 1.000 } // no sample but it would be negligible + ] + } + }, + { // Quality B, more aperture scale factors needed + "make_model": "Canon EOS 70D", + "dcraw_matrix": [ 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 ], + "ranges": { + "white": [ + { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583 + { "iso": [ 160, 320, 640, 1250, 2500, 5000 ], "levels": 12450 }, // typical 12559 + { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 10000 ], "levels": 15200 }, // typical 15303 - ISO 8000-10000 guessed + { "iso": [ 12800, 25600 ], "levels": 16200 } // typical 16383 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but even with the + 12500 white levels nearly maxes out for f/1.4 and below anyway. */ + { "aperture": 1.4, "scale_factor": 1.240 }, // guessed + { "aperture": 1.6, "scale_factor": 1.160 }, // guessed + { "aperture": 1.8, "scale_factor": 1.110 }, // 31of35 + { "aperture": 2.0, "scale_factor": 1.060 }, // guessed + { "aperture": 2.2, "scale_factor": 1.030 }, // guessed + { "aperture": 2.5, "scale_factor": 1.015 }, // guessed + { "aperture": 2.8, "scale_factor": 1.008 }, // 15432/15303 + { "aperture": 3.2, "scale_factor": 1.000 }, + { "aperture": 3.5, "scale_factor": 1.000 } + ] + } + }, + + { // Quality b, scaling factors missing but guessed safely + "make_model": [ "Canon EOS 1200D", "Canon EOS Rebel T5" ], + "dcraw_matrix": [ 6461,-907,-882,-4300,12184,2378,-819,1944,5931 ], // dcp D65 colormatrix2 + "ranges": { + "white": [ + { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583 + { "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650 + { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000 ], "levels": 15200 }, // typical 15303 + { "iso": [ 12800, 25600 ], "levels": 16200 } // typical 16383 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the + typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */ + { "aperture": 1.4, "scale_factor": 1.200 }, // guessed from 650D data + { "aperture": 1.6, "scale_factor": 1.080 }, // guessed + { "aperture": 1.8, "scale_factor": 1.055 }, // guessed + { "aperture": 2.0, "scale_factor": 1.030 }, // guessed + { "aperture": 2.2, "scale_factor": 1.020 }, // guessed + { "aperture": 2.5, "scale_factor": 1.020 }, // guessed + { "aperture": 2.8, "scale_factor": 1.000 }, // + { "aperture": 3.2, "scale_factor": 1.000 }, // + { "aperture": 3.5, "scale_factor": 1.000 } // + ] + } + }, + + { // Quality A, only one scaling factor missing and guessed safely + "make_model": [ "Canon EOS 650D", "Canon EOS Rebel T4i" ], + "dcraw_matrix": [ 6602,-841,-939,-4472,12458,2247,-975,2039,6148 ], + "ranges": { + "white": [ + { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583 + { "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650 + { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000 ], "levels": 15200 }, // typical 15303 + { "iso": [ 12800, 25600 ], "levels": 16200 } // typical 16383 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the + typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */ + { "aperture": 1.4, "scale_factor": 1.200 }, // 16332/13583 + { "aperture": 1.6, "scale_factor": 1.080 }, // guessed + { "aperture": 1.8, "scale_factor": 1.055 }, // 14372/13583 + { "aperture": 2.0, "scale_factor": 1.030 }, // 14034/13583 + { "aperture": 2.2, "scale_factor": 1.025 }, // 13921/13583 + { "aperture": 2.5, "scale_factor": 1.020 }, // + { "aperture": 2.8, "scale_factor": 1.000 }, // + { "aperture": 3.2, "scale_factor": 1.000 }, // + { "aperture": 3.5, "scale_factor": 1.000 } // + ] + } + }, + + { // Quality B, only one some scaling factors missing + "make_model": "Canon EOS-M", + "dcraw_matrix": [ 6602,-841,-939,-4472,12458,2247,-975,2039,6148 ], + "ranges": { + "white": [ + { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583 + { "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650 + { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000 ], "levels": 15200 }, // typical 15303 + { "iso": [ 12800, 25600 ], "levels": 16200 } // typical 16383 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the + typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */ + { "aperture": 1.4, "scale_factor": 1.200 }, // guessed + { "aperture": 1.6, "scale_factor": 1.080 }, // guessed + { "aperture": 1.8, "scale_factor": 1.055 }, // guessed + { "aperture": 2.0, "scale_factor": 1.030 }, // 15821/15303 + { "aperture": 2.2, "scale_factor": 1.025 }, // 15691/15303 + { "aperture": 2.5, "scale_factor": 1.020 }, // 12947/12650 + { "aperture": 2.8, "scale_factor": 1.000 }, // + { "aperture": 3.2, "scale_factor": 1.000 }, // + { "aperture": 3.5, "scale_factor": 1.000 } // + ] + } + }, + + { /* Quality C, needs a way to auto apply 3/2 or 4/3 crops (read exif tags ..) to work better with auto distortion, + for the moment just comment-uncomment the desired raw crop */ + "make_model": "Canon PowerShot G1 X Mark II", + "dcraw_matrix": [ 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 ], // D65 matrix from adobe dcp + // "raw_crop": [ 80, 50, 4400, 3316 ], // full frame 4480x3366 borders 80,50 - much shade in corners, no/wrong auto distortion + // "raw_crop": [ 104, 144, 4360, 3128 ], // Mixed best average frame - , width is 4352 from 3/2, height 3120 from 4/3 - auto distortion does not work correctly + // "raw_crop": [ 200, 144, 4168, 3128 ], // Optional 4/3 frame 4160x3120, 4pix borders, Left Border 204-4, Top Border 148-4 + "raw_crop": [ 104, 252, 4360, 2912 ], // Default 3/2 frame 4352X2904, 4pix borders, Left Border 108-4, Top border 256-4 + "masked_areas": [ 148, 2, 3340, 78 ], + "ranges": { "white": 16300 } + }, + + { // Quality A + "make_model": "Canon PowerShot S120", + "dcraw_matrix": [ 6961,-1685,-695,-4625,12945,1836,-1114,2152,5518 ], + "raw_crop": [ 120, 30, 4024, 3030 ], + "masked_areas": [ 32, 2, 3028, 80 ], + "ranges": { "white": 4050 } + }, + + { // Quality A + "make_model": "FUJIFILM S1", + "dcraw_matrix": [ 11705,-4262,-1107,-2282,10791,1709,-555,1713,4945 ] // MATRIX FROM FUJI SL1000 + }, + + { // quality B, lacks aperture and ISO scaling, known to exist, but little to gain as the levels are so close to white_max + "make_model": "Nikon D7000", + "dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], // matrix provided by Tanveer(tsk1979) + "ranges": { + // measured at ISO 100. ISO differences not measured, but known to exist + "white": [ 16370, // 16383 typical + 15760, // 15778 typical + 16370 // 16383 typical + ], + "white_max": 16383 + // aperture scaling not measured, but known to exist, at f/1.8 the G channels hits white_max + } + }, + { // Quality A, new model, not in dcraw 9.20, conflict with D4 in dcraw 9.20, sRAW format not supported + "make_model": "Nikon D4s", + "dcraw_matrix": [ 8598,-2848,-857,-5618,13606,2195,-1002,1773,7137 ], + "ranges": { "black": 768, "white": 16300 } + }, + { // Quality A, // correction for BL 147 to 150 and color matrix + "make_model": "Nikon D3300", + "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // matrix from adobe dcp d65 + "ranges": { "black": 150, "white": 4095 } + }, +// { // Quality B, does not work with 12bit files - experimenting with matrices +// "make_model": "Nikon D5300", +// "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // matrix from adobe dcp d65 +// "dcraw_matrix": [ 7009,-1699,-414,-5209,12641,2886,-1201,1904,7229 ], // Calculated from DxO d50 +// "ranges": { "black": 600 } +// }, + + { // Quality A, new model, there is a conflict with E-M1 in Dcraw.cc, raw crop correction + "make_model": "OLYMPUS E-M10", + "dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ], + "raw_crop": [ 0, 0, 4624, 3472 ], // largest valid - full frame is 4640x3472 +// "raw_crop": [ 4, 4, 4616, 3464 ], // olympus jpeg crop 8, 8, 4608, 3456 + "ranges": { "white": 4080 } + }, + { // Quality A, white level correction + "make_model": "OLYMPUS E-PM2", + "dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ], + "ranges": { "white": 4040 } // nominal 4056 + }, + + { // Quality B + "make_model": "Panasonic DMC-LF1", + "dcraw_matrix": [ 9379,-3267,-816,-3227,11560,1881,-926,1928,5340 ], + "ranges": { "black": 143, "white": 4080 } // BL is floating and should be extracted from exif + }, + { // Quality B + "make_model": [ "Panasonic DMC-TZ60", "Panasonic DMC-TZ61", "Panasonic DMC-ZS40", "Panasonic DMC-ZS41" ], + "dcraw_matrix": [ 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 ], // matrix from Adobe dcp v8.4 + "raw_crop": [ 8, 8, 4904, 3680 ], // crop according to exif 4896 X 3672 plus 4 pixels borders. RT's frame gets smaller than Dcraw but works better with auto distortion + "ranges": { "black": 143, "white": 4050 } // BL is floating and should be extracted from exif + }, + + { // Quality B, BL is floating and should be extracted from exif maker data + "make_model": "Panasonic DMC-GH3", + "dcraw_matrix": [ 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 ], // dcp d65 + "ranges": { + "black": 144, + "white": [ + { "iso": 125, "levels": 3500 }, // gaussian 3600-4095 + { "iso": [ 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 + ] + } + }, + + { // Quality C, preliminary support, not yet supported by Dcraw or Adobe + "make_model": "Panasonic DMC-GH4", + "dcraw_matrix": [ 5545,-878,-249,-4592,12128,2709,-1225,1928,5260 ], // calculated from dxo D50 matrix + "ranges": { + "black": 144, // BL is floating and should be extracted from exif maker data + "white": [ + { "iso": 100, "levels": 2700 }, // gaussian center at 2870-2920 range +/- 150 + { "iso": 125, "levels": 3100 }, // guessed + { "iso": [ 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 + ] + } + }, + + { // Quality B, BL is floating and should be extracted from exif maker data + "make_model": "Panasonic DMC-GM1", + "dcraw_matrix": [ 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 ], + "ranges": { + "black": 143, + "white": [ + { "iso": 125, "levels": 3100 }, // bell shape 3150-3650 - exif 2616 + { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 + ] + } + }, + { // Quality B, BL is floating and should be extracted from exif maker data + "make_model": "Panasonic DMC-GX7", + "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ], + "ranges": { + "black": 143, + "white": [ + { "iso": 125, "levels": 3100 }, + { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 + ] + } + }, + + { // Quality A, Conflict with Samsung NX in Dcraw.c-Dcraw.cc if not included in camconst.json + "make_model": "Samsung NX30", + "dcraw_matrix": [ 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 ] // D65 matrix from Adobe's Dcp profile - DxoD50 6661,-1695,-616,-6456,14646,1913,-1417,2142,5646 + }, +// { // Quality C, new model, +// "make_model": "Samsung NX mini", +// "dcraw_matrix": [ 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 ], // quessed +// "raw_crop": [ 128, 36, 5480, 3656 ] // jpeg 5472x3648 - raw 5664 x 3710 - crop 132, 40, 5604, 3688 +// }, + + { // Quality A, correction for frame width + "make_model": "Sony NEX-5N", + "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], + "raw_crop": [ 0, 0, 4920, 3276 ], + "ranges": { "black": 512, "white": 16300 } + }, + { // Quality A, correction for frame width black level and color matrix + "make_model": "Sony ILCE-3000", + "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65 + "ranges": { "black": 512, "white": 16300 }, + "raw_crop": [ 0, 0, 5476, 3656 ] + }, + { // Quality A, correction for frame width + "make_model": "Sony ILCE-5000", + "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65 + "ranges": { "black": 512, "white": 16300 }, + "raw_crop": [ 0, 0, 5476, 3656 ] + }, + { // Quality A, new model not supported in dcraw 9.20 + "make_model": "Sony ILCE-6000", + "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65 +// "dcraw_matrix": [ 5012,-901,-206,-4034,11428,2984,-1104,1718,6377 ], // IR_x-rite D55 +// "dcraw_matrix": [ 4491,-737,-117,-4578,11908,3037,-1088,1686,6152 ], // DxO_D50 + "raw_crop": [ 0, 0, 6024, 4024 ], + "ranges": { "black": 512, "white": 16300 } + }, + { // Quality A, correction for frame width + "make_model": "Sony ILCE-7R", + "dcraw_matrix": [ 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 ], + "raw_crop": [ 0, 0, 7372, 4920 ], + "ranges": { "black": 512, "white": 16300 } + }, +// No need for these Sony models anymore +// { // quality A +// "make_model": "Sony SLT-A77", +// "dcraw_matrix": [ 5126,-830,-261,-4788,12196,2934,-948,1602,7068 ], // matrix provided by Colin Walker +// // note: Sony ARW2 file format gets 14 bit values, not 12 bit like in dcraw 9.19 +// "ranges": { "black": 512, "white": 16300 } +// }, +// { // quality A +// "make_model": [ "Sony SLT-A99", "Sony SLT-A99V" ], +// "dcraw_matrix": [ 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 ], +// "ranges": { "black": 512, "white": 16300 } +// }, + + /* Phase One: color matrices borrowed from Adobe DNG Converter, black/white levels tested on actual raw files. + Note: the dcraw decoder makes black level subtraction and various corrections to the raw values based on + metadata embedded in the IIQ format, so what we see here is the result after that, ie black level is 0, + and white level is typically at or close to 65535. However sensors vary a bit and can be noisy around clip + so we cut away 0.05 stop from top down to 63300 to be a bit conservative. */ + { // quality A + "make_model": [ "Phase One P40+", "Phase One IQ140", "Phase One P65+", "Phase One IQ160", "Phase One IQ260" ], + "dcraw_matrix": [ 8035,435,-962,-6001,13872,2320,-1159,3065,5434 ], + "ranges": { "black": 0, "white": 63300 } + }, + { // quality A + "make_model": [ "Phase One IQ180", "Phase One IQ280" ], + "dcraw_matrix": [ 6294,686,-712,-5435,13417,2211,-1006,2435,5042 ], + "ranges": { "black": 0, "white": 63300 } + }, + { // quality A + "make_model": [ "Phase One P20", "Phase One P20+", "Phase One P25", "Phase One P25+" ], + "dcraw_matrix": [ 2905,732,-237,-8135,16626,1476,-3038,4253,7517 ], + "ranges": { "black": 0, "white": 63300 } + }, + { // quality A + "make_model": [ "Phase One P21", "Phase One P21+" ], + "dcraw_matrix": [ 6516,-2050,-507,-8217,16703,1479,-3492,4741,8489 ], + "ranges": { "black": 0, "white": 63300 } + }, + { // quality A + "make_model": [ "Phase One P30", "Phase One P30+"], + "dcraw_matrix": [ 4516,-244,-36,-7020,14976,2174,-3206,4670,7087 ], + "ranges": { "black": 0, "white": 63300 } + }, + { // quality A + "make_model": [ "Phase One P45", "Phase One P45+" ], + "dcraw_matrix": [ 5053,-24,-117,-5685,14077,1703,-2619,4491,5850 ], + "ranges": { "black": 0, "white": 63300 } + }, + + { // Quality B, only raw crop fix here, dcraw hard-coded seems to handle the rest just fine + "make_model": [ "Hasselblad CFV-50" ], + "raw_crop": [ 44, 4, 8196, 6152 ] + }, + + // dummy test entry to test the parser and show the format with all entries active + { + "make_model": "DummyMake DummyModel", + "dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], + "raw_crop": [ 10, 20, 4000, 3000 ], + "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ], + "ranges": { + "aperture_scaling": [ + { "aperture": 1.2, "scale_factor": 1.1 }, + { "aperture": 1.4, "scale_factor": 1.08 } + ], + "black": [ + { "iso": 100 , "levels": [ 10, 20, 10, 20 ] }, + { "iso": [100, 200] , "levels": [ 30, 40, 30 ] }, + { "iso": 3200, "levels": [ 50, 60, 50, 60 ] } + ], + "white": [ + { "iso": 100 , "levels": [ 10000, 11000, 10000, 11000 ] }, + { "iso": 3200, "levels": [ 11000, 11000, 10000, 11000 ] } + ], + "white_max": 16383 + } + } +]}