1548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/*************************************************************************** 2548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * cam_features.c 3548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 4548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Wed Jul 27 11:25:09 2005 5548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Copyright 2005 User: Naysawn Naderi 6548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Email: ndn at xiphos dot ca 7548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * 8548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Uses libdc1394 and libraw1394 9548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ****************************************************************************/ 10548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 11548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <stdio.h> 12548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <stdlib.h> 13548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <time.h> 14548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <sys/times.h> 15548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <errno.h> 16548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 17548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libraw1394/raw1394.h> 18548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libdc1394/dc1394_control.h> 19548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libdc1394/dc1394_register.h> 20548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 21548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen//EXIF includes 22548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-data.h> 23548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-ifd.h> 24548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-loader.h> 25548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 26548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen// Part of the exif command-line source package 27548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include "libjpeg/jpeg-data.h" 28548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 29548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 30548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#define FILENAME "test.jpg" 31548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 32548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 33548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenstatic int createEXIF(dc1394featureset_t *xFeatures, ExifData ** pParentEd); 34548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 35548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 36548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenint main(int argc, char *argv[]) 37548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ dc1394camera_t *pCamera, **pCameras=NULL; 38548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen int iNumCameras; 39548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dc1394featureset_t xFeatures; 40548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen int i; 41548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen int err=dc1394_find_cameras(&pCameras, &iNumCameras); 42548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 43548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen //EXIF STUFF 44548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen JPEGData *pData; 45548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen //float fOnefloat; 46548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifData * pEd; 47548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 48548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 49548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (err!=DC1394_SUCCESS) { 50548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fprintf( stderr, "Unable to look for cameras\n\n" 51548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen "Please check \n" 52548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen " - if the kernel modules `ieee1394',`raw1394' and `ohci1394' are loaded \n" 53548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen " - if you have read/write access to /dev/raw1394\n\n"); 54548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exit(1); 55548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 56548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 57548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 58548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /*----------------------------------------------------------------------- 59548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Initialize the camera 60548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *-----------------------------------------------------------------------*/ 61548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (iNumCameras<1) { 62548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fprintf(stderr, "no cameras found :(\n"); 63548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exit(1); 64548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 65548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pCamera=pCameras[0]; 66548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen for (i=1;i<iNumCameras;i++) 67548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen dc1394_free_camera(pCameras[i]); 68548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen free(pCameras); 69548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 70548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if(dc1394_get_camera_feature_set(pCamera, &xFeatures)!=DC1394_SUCCESS) 71548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen fprintf(stdout, "unable to get feature set\n"); 72548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen else 73548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf("camera's feature set retrieved\n"); 74548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 75548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen createEXIF(&xFeatures, &pEd); //tag the file with the settings of the camera 76548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 77548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen //exif_data_dump (pEd); 78548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 79548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen //write the Exif data to a jpeg file 80548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pData = jpeg_data_new_from_file (FILENAME); //input data 81548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen if (!pData) { 82548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf ("Could not load '%s'!\n", FILENAME); 83548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen return (-1); 84548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen } 85548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 86548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf("Saving EXIF data to jpeg file\n"); 87548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen jpeg_data_set_exif_data (pData, pEd); 88548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf("Set the data\n"); 89548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen jpeg_data_save_file(pData, "foobar2.jpg"); 90548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 91548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen return 0; 92548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 93548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 94548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 95548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 96548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenint createEXIF(dc1394featureset_t *xFeatures, ExifData ** pParentEd) 97548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{ 98548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifEntry *pE; 99548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifData * pEd; 100548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen int i = !xFeatures->feature[DC1394_FEATURE_WHITE_BALANCE - DC1394_FEATURE_MIN].auto_active; 101548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 102548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ExifSRational xR = {xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].value, xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].max};; 103548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 104548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf ("Creating EXIF data...\n"); 105548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pEd = exif_data_new (); 106548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 107548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen /* 108548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 109548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen Things to tag: 110548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 111548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_MAKE = 0x010f, 112548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_MODEL = 0x0110, 113548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_EXPOSURE_TIME = 0x829a, 114548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_BRIGHTNESS_VALUE = 0x9203, 115548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_WHITE_BALANCE = 0xa403, 116548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_GAIN_CONTROL = 0xa407, 117548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_CONTRAST = 0xa408, 118548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_SATURATION = 0xa409, 119548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_SHARPNESS = 0xa40a, 120548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen EXIF_TAG_USER_COMMENT 121548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen */ 122548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 123548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf ("Adding a Make reference\n"); 124548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pE = exif_entry_new (); 125548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 126548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_initialize (pE, EXIF_TAG_MAKE); 127548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pE->data="AVT"; 128548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_unref (pE); 129548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 130548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf ("Adding a Model reference\n"); 131548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pE = exif_entry_new (); 132548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 133548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_initialize (pE, EXIF_TAG_MODEL); 134548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pE->data="510c"; 135548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_unref (pE); 136548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 137548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf ("Adding a Tag to reference # samples per pixel\n"); 138548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pE = exif_entry_new (); 139548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 140548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_initialize (pE, EXIF_TAG_SAMPLES_PER_PIXEL); //by default is 3 141548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_unref (pE); 142548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 143548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf ("Adding a White Balance Reference\n"); 144548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pE = exif_entry_new (); 145548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 146548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_initialize (pE, EXIF_TAG_WHITE_BALANCE); 147548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_set_short(pE->data, exif_data_get_byte_order (pEd), i); //0=auto white balance, 1 = manual white balance 148548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_unref (pE); 149548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 150548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen //need to create logic according to the value of the sharpness 151548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf ("Adding a Sharpness Reference\n"); 152548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pE = exif_entry_new (); 153548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 154548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_initialize (pE, EXIF_TAG_SHARPNESS); 155548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_set_short(pE->data, exif_data_get_byte_order (pEd), 0); 156548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_unref (pE); 157548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 158548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf ("Adding a Brightness reference\n"); 159548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 160548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen //try to get brightness 161548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen //printf("Float Value: %i\n",xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].value); 162548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 163548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen pE = exif_entry_new (); 164548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 165548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_entry_initialize (pE, EXIF_TAG_BRIGHTNESS_VALUE); 166548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen exif_set_srational (pE->data, exif_data_get_byte_order (pEd), xR); 167548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 168548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 169548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen //exif_data_dump (ed); 170548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen //exif_data_dump (pEd); 171548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *pParentEd = pEd; 172548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen printf("Done!\n"); 173548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen 174548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen return 0; 175548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen} 176