xref: /aosp_15_r20/external/libexif/contrib/examples/cam_features.c (revision 735d6239c16e246968a03ef6e2db00d67bad6cdc)
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