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