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
main(int argc,char * argv[])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
createEXIF(dc1394featureset_t * xFeatures,ExifData ** pParentEd)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