1 /*************************************************************************** 2 * cam_features.c 3 * 4 * Wed Jul 27 11:25:09 2005 5 * Copyright 2005 User: Naysawn Naderi 6 * Email: ndn at xiphos dot ca 7 * 8 * Uses libdc1394 and libraw1394 9 ****************************************************************************/ 10 11 #include <stdio.h> 12 #include <stdlib.h> 13 #include <time.h> 14 #include <sys/times.h> 15 #include <errno.h> 16 17 #include <libraw1394/raw1394.h> 18 #include <libdc1394/dc1394_control.h> 19 #include <libdc1394/dc1394_register.h> 20 21 //EXIF includes 22 #include <libexif/exif-data.h> 23 #include <libexif/exif-ifd.h> 24 #include <libexif/exif-loader.h> 25 26 // Part of the exif command-line source package 27 #include "libjpeg/jpeg-data.h" 28 29 30 #define FILENAME "test.jpg" 31 32 33 static int createEXIF(dc1394featureset_t *xFeatures, ExifData ** pParentEd); 34 35 36 int main(int argc, char *argv[]) 37 { dc1394camera_t *pCamera, **pCameras=NULL; 38 int iNumCameras; 39 dc1394featureset_t xFeatures; 40 int i; 41 int err=dc1394_find_cameras(&pCameras, &iNumCameras); 42 43 //EXIF STUFF 44 JPEGData *pData; 45 //float fOnefloat; 46 ExifData * pEd; 47 48 49 if (err!=DC1394_SUCCESS) { 50 fprintf( stderr, "Unable to look for cameras\n\n" 51 "Please check \n" 52 " - if the kernel modules `ieee1394',`raw1394' and `ohci1394' are loaded \n" 53 " - if you have read/write access to /dev/raw1394\n\n"); 54 exit(1); 55 } 56 57 58 /*----------------------------------------------------------------------- 59 * Initialize the camera 60 *-----------------------------------------------------------------------*/ 61 if (iNumCameras<1) { 62 fprintf(stderr, "no cameras found :(\n"); 63 exit(1); 64 } 65 pCamera=pCameras[0]; 66 for (i=1;i<iNumCameras;i++) 67 dc1394_free_camera(pCameras[i]); 68 free(pCameras); 69 70 if(dc1394_get_camera_feature_set(pCamera, &xFeatures)!=DC1394_SUCCESS) 71 fprintf(stdout, "unable to get feature set\n"); 72 else 73 printf("camera's feature set retrieved\n"); 74 75 createEXIF(&xFeatures, &pEd); //tag the file with the settings of the camera 76 77 //exif_data_dump (pEd); 78 79 //write the Exif data to a jpeg file 80 pData = jpeg_data_new_from_file (FILENAME); //input data 81 if (!pData) { 82 printf ("Could not load '%s'!\n", FILENAME); 83 return (-1); 84 } 85 86 printf("Saving EXIF data to jpeg file\n"); 87 jpeg_data_set_exif_data (pData, pEd); 88 printf("Set the data\n"); 89 jpeg_data_save_file(pData, "foobar2.jpg"); 90 91 return 0; 92 93 } 94 95 96 int createEXIF(dc1394featureset_t *xFeatures, ExifData ** pParentEd) 97 { 98 ExifEntry *pE; 99 ExifData * pEd; 100 int i = !xFeatures->feature[DC1394_FEATURE_WHITE_BALANCE - DC1394_FEATURE_MIN].auto_active; 101 102 ExifSRational xR = {xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].value, xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].max};; 103 104 printf ("Creating EXIF data...\n"); 105 pEd = exif_data_new (); 106 107 /* 108 109 Things to tag: 110 111 EXIF_TAG_MAKE = 0x010f, 112 EXIF_TAG_MODEL = 0x0110, 113 EXIF_TAG_EXPOSURE_TIME = 0x829a, 114 EXIF_TAG_BRIGHTNESS_VALUE = 0x9203, 115 EXIF_TAG_WHITE_BALANCE = 0xa403, 116 EXIF_TAG_GAIN_CONTROL = 0xa407, 117 EXIF_TAG_CONTRAST = 0xa408, 118 EXIF_TAG_SATURATION = 0xa409, 119 EXIF_TAG_SHARPNESS = 0xa40a, 120 EXIF_TAG_USER_COMMENT 121 */ 122 123 printf ("Adding a Make reference\n"); 124 pE = exif_entry_new (); 125 exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 126 exif_entry_initialize (pE, EXIF_TAG_MAKE); 127 pE->data="AVT"; 128 exif_entry_unref (pE); 129 130 printf ("Adding a Model reference\n"); 131 pE = exif_entry_new (); 132 exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 133 exif_entry_initialize (pE, EXIF_TAG_MODEL); 134 pE->data="510c"; 135 exif_entry_unref (pE); 136 137 printf ("Adding a Tag to reference # samples per pixel\n"); 138 pE = exif_entry_new (); 139 exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 140 exif_entry_initialize (pE, EXIF_TAG_SAMPLES_PER_PIXEL); //by default is 3 141 exif_entry_unref (pE); 142 143 printf ("Adding a White Balance Reference\n"); 144 pE = exif_entry_new (); 145 exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 146 exif_entry_initialize (pE, EXIF_TAG_WHITE_BALANCE); 147 exif_set_short(pE->data, exif_data_get_byte_order (pEd), i); //0=auto white balance, 1 = manual white balance 148 exif_entry_unref (pE); 149 150 //need to create logic according to the value of the sharpness 151 printf ("Adding a Sharpness Reference\n"); 152 pE = exif_entry_new (); 153 exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 154 exif_entry_initialize (pE, EXIF_TAG_SHARPNESS); 155 exif_set_short(pE->data, exif_data_get_byte_order (pEd), 0); 156 exif_entry_unref (pE); 157 158 printf ("Adding a Brightness reference\n"); 159 160 //try to get brightness 161 //printf("Float Value: %i\n",xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].value); 162 163 pE = exif_entry_new (); 164 exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); 165 exif_entry_initialize (pE, EXIF_TAG_BRIGHTNESS_VALUE); 166 exif_set_srational (pE->data, exif_data_get_byte_order (pEd), xR); 167 168 169 //exif_data_dump (ed); 170 //exif_data_dump (pEd); 171 *pParentEd = pEd; 172 printf("Done!\n"); 173 174 return 0; 175 } 176