Author: post
Date: 2011-03-20 08:52:40 +0100 (Sun, 20 Mar 2011)
New Revision: 3894

Modified:
   trunk/plugins/meta-tiff/tiff-meta.c
Log:
Add Samsung makernote parser for Samsung WB and Lens ID.

Modified: trunk/plugins/meta-tiff/tiff-meta.c
===================================================================
--- trunk/plugins/meta-tiff/tiff-meta.c 2011-03-19 19:48:40 UTC (rev 3893)
+++ trunk/plugins/meta-tiff/tiff-meta.c 2011-03-20 07:52:40 UTC (rev 3894)
@@ -68,6 +68,7 @@
 static gboolean makernote_olympus_equipment(RAWFILE *rawfile, guint base, 
guint offset, RSMetadata *meta);
 static gboolean ifd_panasonic(RAWFILE *rawfile, guint offset, RSMetadata 
*meta);
 static gboolean makernote_pentax(RAWFILE *rawfile, guint offset, RSMetadata 
*meta);
+static gboolean makernote_samsung(RAWFILE *rawfile, guint offset, RSMetadata 
*meta);
 static gboolean makernote_sony(RAWFILE *rawfile, guint offset, RSMetadata 
*meta);
 static void sony_decrypt(SonyMeta *sony, guint *data, gint len);
 static gboolean private_sony(RAWFILE *rawfile, guint offset, RSMetadata *meta);
@@ -1161,6 +1162,59 @@
 }
 
 static gboolean
+makernote_samsung(RAWFILE *rawfile, guint offset, RSMetadata *meta)
+{
+       gushort number_of_entries = 0;
+       guint base = offset;
+       guint uint_temp1;
+       gushort ushort_temp1;
+
+       struct IFD ifd;
+
+       /* get number of entries */
+       if(!raw_get_ushort(rawfile, offset, &number_of_entries))
+               return FALSE;
+       offset += 2;
+
+       while(number_of_entries--)
+       {
+               read_ifd(rawfile, offset, &ifd);
+               offset += 12;
+
+               switch (ifd.tag)
+               {
+               case 0xa021: /* White Balance */
+                               raw_get_uint(rawfile, base+ifd.value_offset, 
&uint_temp1);
+                               meta->cam_mul[0] = (gdouble) uint_temp1;
+                               raw_get_uint(rawfile, base+ifd.value_offset+4, 
&uint_temp1);
+                               meta->cam_mul[1] = (gdouble) uint_temp1;
+                               raw_get_uint(rawfile, base+ifd.value_offset+8, 
&uint_temp1);
+                               meta->cam_mul[3] = (gdouble) uint_temp1;
+                               raw_get_uint(rawfile, base+ifd.value_offset+12, 
&uint_temp1);
+                               meta->cam_mul[2] = (gdouble) uint_temp1;
+                       break;
+               case 0xa028: /* White Balance */
+                               raw_get_uint(rawfile, base+ifd.value_offset, 
&uint_temp1);
+                               meta->cam_mul[0] -= (gdouble) uint_temp1;
+                               raw_get_uint(rawfile, base+ifd.value_offset+4, 
&uint_temp1);
+                               meta->cam_mul[1] -= (gdouble) uint_temp1;
+                               raw_get_uint(rawfile, base+ifd.value_offset+8, 
&uint_temp1);
+                               meta->cam_mul[3] -= (gdouble) uint_temp1;
+                               raw_get_uint(rawfile, base+ifd.value_offset+12, 
&uint_temp1);
+                               meta->cam_mul[2] -= (gdouble) uint_temp1;
+                       break;
+               case 0xa003: /* LensType */
+                       raw_get_ushort(rawfile, offset-4, &ushort_temp1);
+                       meta->lens_id = ushort_temp1;
+                       break;
+               }
+       }
+       rs_metadata_normalize_wb(meta);
+       return TRUE;
+}
+
+
+static gboolean
 makernote_sony(RAWFILE *rawfile, guint offset, RSMetadata *meta)
 {
        gushort number_of_entries = 0;
@@ -1359,6 +1413,9 @@
                                                else if (raw_strcmp(rawfile, 
ifd.value_offset, "OLYMP", 5))
                                                        
makernote_olympus(rawfile, ifd.value_offset+8, ifd.value_offset+8, meta);
                                                break;
+                                       case MAKE_SAMSUNG:
+                                               makernote_samsung(rawfile, 
ifd.value_offset, meta);
+                                               break;
                                        case MAKE_SONY:
                                                makernote_sony(rawfile, 
ifd.value_offset, meta);
                                                break;
@@ -1461,6 +1518,9 @@
                        else if (raw_strcmp(maker_raw,org_offset, "OLYMP", 5))
                                makernote_olympus(maker_raw, org_offset+8, 
org_offset+8, meta);
                        break;
+               case MAKE_SAMSUNG:
+                       makernote_samsung(maker_raw, org_offset, meta);
+                       break;
                case MAKE_SONY:
                        makernote_sony(maker_raw, org_offset, meta);
                        break;


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to