Commit a3eb9430 authored by Mikhail Karpenko's avatar Mikhail Karpenko
Browse files

Edit two Exif fields

HostComputer exif field containing serial number was replaced with more
suitable CameraSerialNumber. IPTCNAA field containing frame number was
replaced with ImageNumber.
parent 6393936e
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -9,6 +9,9 @@
      dlen: length of a variable data field, stored in frame buffer
      dlen: length of a variable data field, stored in frame buffer
      ltag: Exif_tag+(group<<16). If specified, is used by the software, while the Exif output will still have tag
      ltag: Exif_tag+(group<<16). If specified, is used by the software, while the Exif output will still have tag
      SubSecTimeOriginal should go immediately after DateTimeOriginal (in the sequence numbers, not in the Exif templete)
      SubSecTimeOriginal should go immediately after DateTimeOriginal (in the sequence numbers, not in the Exif templete)
      
      Update, June 2016: PageNumber field is used as sensor port number, HostComputer field is replaced with CameraSerialNumber and
            FrameNumber field (which actually was IPTCNAA field) is replaced with standart ImageNumber field.
    -->
    -->
<Exif>
<Exif>
 <Image>
 <Image>
@@ -22,8 +25,8 @@
   <DateTime tag="0x0132" format="ASCII" count="20"  seq="1" dlen="20">
   <DateTime tag="0x0132" format="ASCII" count="20"  seq="1" dlen="20">
     <value>2001:06:21 12:00:00</value>
     <value>2001:06:21 12:00:00</value>
   </DateTime>
   </DateTime>
   <HostComputer tag="0x013c" format="ASCII" function="SERIAL"/>
   <CameraSerialNumber tag="0xc62f" format="ASCII" function="SERIAL"/>
   <FrameNumber  tag="0x83bb" format="LONG" count="1"  seq="25" dlen="4"/>
   <ImageNumber  tag="0x9211" format="LONG" count="1"  seq="25" dlen="4"/>
   <Orientation  tag="0x112"  format="SHORT" count="1"  seq="27" dlen="2"/>
   <Orientation  tag="0x112"  format="SHORT" count="1"  seq="27" dlen="2"/>
   <PageNumber   tag="0x129"  format="SHORT" count="1"  seq="28" dlen="2"/>
   <PageNumber   tag="0x129"  format="SHORT" count="1"  seq="28" dlen="2"/>
   <ExifTag tag="0x8769" format="LONG" function="EXIFTAG"/>
   <ExifTag tag="0x8769" format="LONG" function="EXIFTAG"/>
+523 −515
Original line number Original line Diff line number Diff line
#!/usr/local/sbin/php -q
#!/usr/bin/env php
<?php
<?php
/*!
/*!
 *! FILE NAME  : exif.php
 *! FILE NAME  : exif.php
@@ -16,7 +16,7 @@
 *! exif=0         - print current Exif page (updated in real time)
 *! exif=0         - print current Exif page (updated in real time)
 *! exif=NNN       - print one of the Exif pages in the buffer (debug feature, current buffer pointer is not known here)
 *! exif=NNN       - print one of the Exif pages in the buffer (debug feature, current buffer pointer is not known here)
 *!
 *!
*! Copyright (C) 2007-2008 Elphel, Inc
 *! Copyright (C) 2007-2016 Elphel, Inc
 *! -----------------------------------------------------------------------------**
 *! -----------------------------------------------------------------------------**
 *!
 *!
 *!  This program is free software: you can redistribute it and/or modify
 *!  This program is free software: you can redistribute it and/or modify
@@ -90,6 +90,10 @@ $ExifDeviceMetadirFilename= "/dev/exif_metadir";
$ExifDeviceExifFilename=    "/dev/exif_exif";
$ExifDeviceExifFilename=    "/dev/exif_exif";
$ExifDeviceMetaFilename=    "/dev/exif_meta";
$ExifDeviceMetaFilename=    "/dev/exif_meta";


$DeviceSNFilename = "/sys/devices/soc0/elphel393-init/serial";
$DeviceRevisionFilename = "/sys/devices/soc0/elphel393-init/revision";
$DeviceBrand = "Elphel";
$DeviceModel = "Elphel393";


//! if called from the command line - accepts just one parameter - configuration file,
//! if called from the command line - accepts just one parameter - configuration file,
//! through CGI - accepts more parameters
//! through CGI - accepts more parameters
@@ -454,11 +458,12 @@ function addDirEntry($ifd_entry) {


function substitute_value($ifd_entry) {
function substitute_value($ifd_entry) {
	global $SUB_IFD_offset,$GPSInfo_offset;
	global $SUB_IFD_offset,$GPSInfo_offset;
	global $DeviceSNFilename, $DeviceRevisionFilename, $DeviceBrand, $DeviceModel;
	$attrs = $ifd_entry->attributes();
	$attrs = $ifd_entry->attributes();


	switch ($attrs["function"]) {
	switch ($attrs["function"]) {
	case "BRAND":
	case "BRAND":
      $ifd_entry->addChild ('value',exec("bootblocktool -x BRAND"));
		$ifd_entry->addChild('value', $DeviceBrand);
		break;
		break;
	case "MODEL":
	case "MODEL":
		if (file_exists ('/var/state/APPLICATION')) {
		if (file_exists ('/var/state/APPLICATION')) {
@@ -467,17 +472,20 @@ function substitute_value($ifd_entry) {
				$model.=' CHN'.file_get_contents('/var/state/APPLICATION_MODE');
				$model.=' CHN'.file_get_contents('/var/state/APPLICATION_MODE');
			}
			}
		} else {
		} else {
       $model= exec("bootblocktool -x MODEL").exec("bootblocktool -x REVISION");
			$model = $DeviceModel;
		}
		}
///      $ifd_entry->addChild ('value',exec("bootblocktool -x MODEL").exec("bootblocktool -x REVISION"));
		$ifd_entry->addChild ('value',$model);
		$ifd_entry->addChild ('value',$model);

		break;
		break;
	case "SOFTWARE":
	case "SOFTWARE":
		if (file_exists("/usr/html/docs/")) {
			$ifd_entry->addChild ('value',exec("ls /usr/html/docs/")); // filter
			$ifd_entry->addChild ('value',exec("ls /usr/html/docs/")); // filter
		}
		break;
		break;
	case "SERIAL":
	case "SERIAL":
      $s=exec("bootblocktool -x SERNO");
		$s = "";
		if (file_exists($DeviceSNFilename)) {
			$s = exec('cat '.$DeviceSNFilename);
		}
		$ifd_entry->addChild ('value',substr($s,0,2).":".substr($s,2,2).":".substr($s,4,2).":".substr($s,6,2).":".substr($s,8,2).":".substr($s,10,2));
		$ifd_entry->addChild ('value',substr($s,0,2).":".substr($s,2,2).":".substr($s,4,2).":".substr($s,6,2).":".substr($s,8,2).":".substr($s,10,2));
		break;
		break;
	case "EXIFTAG":
	case "EXIFTAG":
+5 −5
Original line number Original line Diff line number Diff line
@@ -289,7 +289,7 @@ int printExifXML(int exif_page, struct file_set *fset)
	while (read(fd_exifdir, &dir_table_entry, sizeof(dir_table_entry)) > 0) {
	while (read(fd_exifdir, &dir_table_entry, sizeof(dir_table_entry)) > 0) {
		switch (dir_table_entry.ltag) {
		switch (dir_table_entry.ltag) {
		case Exif_Image_ImageDescription:      indx = Exif_Image_ImageDescription_Index; break;
		case Exif_Image_ImageDescription:      indx = Exif_Image_ImageDescription_Index; break;
		case Exif_Image_FrameNumber:           indx = Exif_Image_FrameNumber_Index; break;
		case Exif_Image_ImageNumber:           indx = Exif_Image_ImageNumber_Index; break;
		case Exif_Photo_DateTimeOriginal:      indx = Exif_Photo_DateTimeOriginal_Index; break;
		case Exif_Photo_DateTimeOriginal:      indx = Exif_Photo_DateTimeOriginal_Index; break;
		case Exif_Photo_SubSecTimeOriginal:    indx = Exif_Photo_SubSecTimeOriginal_Index; break;
		case Exif_Photo_SubSecTimeOriginal:    indx = Exif_Photo_SubSecTimeOriginal_Index; break;
		case Exif_Photo_ExposureTime:          indx = Exif_Photo_ExposureTime_Index; break;
		case Exif_Photo_ExposureTime:          indx = Exif_Photo_ExposureTime_Index; break;
@@ -349,14 +349,14 @@ int printExifXML(int exif_page, struct file_set *fset)
		saferead255(fd_exif, val, exif_dir[Exif_Image_ImageDescription_Index].len);
		saferead255(fd_exif, val, exif_dir[Exif_Image_ImageDescription_Index].len);
		printf("<ImageDescription>\"%s\"</ImageDescription>\n", val);
		printf("<ImageDescription>\"%s\"</ImageDescription>\n", val);
	}
	}
	///Exif_Image_FrameNumber_Index           0x13
	///Exif_Image_ImageNumber_Index           0x13
	if (exif_dir[Exif_Image_FrameNumber_Index].ltag == Exif_Image_FrameNumber) { // Exif_Image_FrameNumber_Index is present in template
	if (exif_dir[Exif_Image_ImageNumber_Index].ltag == Exif_Image_ImageNumber) { // Exif_Image_ImageNumber_Index is present in template
		lseek(fd_exif,
		lseek(fd_exif,
				exif_page_start + exif_dir[Exif_Image_FrameNumber_Index].dst,
				exif_page_start + exif_dir[Exif_Image_ImageNumber_Index].dst,
				SEEK_SET);
				SEEK_SET);
		read(fd_exif, rational3, 4);
		read(fd_exif, rational3, 4);
		sprintf(val, "%ld", (long)__cpu_to_be32( rational3[0]));
		sprintf(val, "%ld", (long)__cpu_to_be32( rational3[0]));
		printf("<FrameNumber>\"%s\"</FrameNumber>\n", val);
		printf("<ImageNumber>\"%s\"</ImageNumber>\n", val);
	}
	}


	///Exif_Image_Orientation_Index           0x14
	///Exif_Image_Orientation_Index           0x14