summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHubert Figuière <hub@figuiere.net>2024-06-16 11:02:37 -0400
committerHubert Figuière <hub@figuiere.net>2024-06-16 22:11:22 -0400
commite1dfc5bd532db7db3be550a288c45366c4a19feb (patch)
tree197c027908490f5daa84e60aa2a4f127765889fc
parent67dbe25ca8c89135c758ed2f9591a57b697e88cd (diff)
cr2: Added selective mosaic patternHEADmaster
Signed-off-by: Hubert Figuière <hub@figuiere.net>
-rw-r--r--src/canon/cr2.rs21
-rw-r--r--src/tiff/exif/tags.rs1
-rw-r--r--testsuite/testsuite.xml6
3 files changed, 17 insertions, 11 deletions
diff --git a/src/canon/cr2.rs b/src/canon/cr2.rs
index 752d931..863ab81 100644
--- a/src/canon/cr2.rs
+++ b/src/canon/cr2.rs
@@ -106,6 +106,18 @@ impl Cr2File {
}
}
+ fn detect_mosaic_pattern(&self, cfa_ifd: &Dir) -> Pattern {
+ let cfa_pattern = cfa_ifd.uint_value(exif::CR2_TAG_CFA_PATTERN).unwrap_or(1);
+ match cfa_pattern {
+ 3 => Pattern::Gbrg,
+ 1 => Pattern::Rggb,
+ _ => {
+ log::error!("Unkown CFA Pattern value {cfa_pattern}");
+ Pattern::Rggb
+ }
+ }
+ }
+
/// Find the colour data in the file.
fn colour_data(&self) -> Option<Vec<u16>> {
self.maker_note_ifd().and_then(|mnote| {
@@ -219,14 +231,7 @@ impl Cr2File {
.and_then(super::SensorInfo::new)
.map(|sensor_info| sensor_info.0);
rawdata.set_active_area(sensor_info);
- // They are not all RGGB.
- // XXX but I don't seem to see where this is encoded.
- // For the 5DMKII, DNG set an odd row for the active area.
- if self.type_id() == canon!(EOS_5DMKII) {
- rawdata.set_mosaic_pattern(Pattern::Gbrg);
- } else {
- rawdata.set_mosaic_pattern(Pattern::Rggb);
- }
+ rawdata.set_mosaic_pattern(self.detect_mosaic_pattern(cfa_ifd));
if let Some(colour_data) = self.colour_data() {
if let Some(colour_format) = ColourFormat::identify(&colour_data) {
diff --git a/src/tiff/exif/tags.rs b/src/tiff/exif/tags.rs
index 6f5ca7c..1b3f598 100644
--- a/src/tiff/exif/tags.rs
+++ b/src/tiff/exif/tags.rs
@@ -210,6 +210,7 @@ pub const ORF_TAG_RAW_INFO: u16 = 0x3000;
/// This tag is present in the RAW IFD for Canon CR2.
pub const _CR2_TAG_C5D8: u16 = 0xc5d8;
pub const _CR2_TAG_C5D9: u16 = 0xc5d9;
+pub const CR2_TAG_CFA_PATTERN: u16 = 0xc5e0;
/// Exif tag for CR2 RAW "slices"
pub const CR2_TAG_SLICE: u16 = 0xc640;
pub const _CR2_TAG_SRAW_TYPE: u16 = 0xc6c5;
diff --git a/testsuite/testsuite.xml b/testsuite/testsuite.xml
index b3d9ac9..6835c77 100644
--- a/testsuite/testsuite.xml
+++ b/testsuite/testsuite.xml
@@ -75,7 +75,7 @@
<rawDataSize>37691520</rawDataSize>
<rawDataDimensions>5360 3516</rawDataDimensions>
<rawDataActiveArea>168 56 5184 3456</rawDataActiveArea>
- <rawCfaPattern>RGGB</rawCfaPattern>
+ <rawCfaPattern>GBRG</rawCfaPattern>
<rawMinValue>2047 2046 2048 2047</rawMinValue>
<rawMaxValue>13584 13584 13584 13584</rawMaxValue>
<rawAsShotNeutral>0.5029469548133595 1 0.45309734513274336 NaN</rawAsShotNeutral>
@@ -103,7 +103,7 @@
<rawDataSize>37691520</rawDataSize>
<rawDataDimensions>5360 3516</rawDataDimensions>
<rawDataActiveArea>168 56 5184 3456</rawDataActiveArea>
- <rawCfaPattern>RGGB</rawCfaPattern>
+ <rawCfaPattern>GBRG</rawCfaPattern>
<rawMinValue>2046 2046 2049 2049</rawMinValue>
<rawMaxValue>13584 13584 13584 13584</rawMaxValue>
<rawAsShotNeutral>0.4727608494921514 1 0.6719160104986877 NaN</rawAsShotNeutral>
@@ -131,7 +131,7 @@
<rawDataSize>44065536</rawDataSize>
<rawDataDimensions>5792 3804</rawDataDimensions>
<rawDataActiveArea>168 56 5616 3744</rawDataActiveArea>
- <rawCfaPattern>RGGB</rawCfaPattern>
+ <rawCfaPattern>GBRG</rawCfaPattern>
<rawMinValue>1021 1021 1020 1020</rawMinValue>
<rawMaxValue>15600 15600 15600 15600</rawMaxValue>
<rawAsShotNeutral>0.5301786576533076 1 0.401609363569861 NaN</rawAsShotNeutral>