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