1548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen/***************************************************************************
2548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *            cam_features.c
3548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *
4548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *  Wed Jul 27 11:25:09 2005
5548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *  Copyright  2005  User: Naysawn Naderi
6548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *  Email: ndn at xiphos dot ca
7548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen *
8548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen * Uses libdc1394 and libraw1394
9548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen ****************************************************************************/
10548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
11548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <stdio.h>
12548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <stdlib.h>
13548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <time.h>
14548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <sys/times.h>
15548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <errno.h>
16548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
17548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libraw1394/raw1394.h>
18548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libdc1394/dc1394_control.h>
19548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libdc1394/dc1394_register.h>
20548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
21548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen//EXIF includes
22548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-data.h>
23548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-ifd.h>
24548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include <libexif/exif-loader.h>
25548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
26548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen// Part of the exif command-line source package
27548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#include "libjpeg/jpeg-data.h"
28548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
29548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
30548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen#define FILENAME "test.jpg"
31548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
32548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
33548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenstatic int createEXIF(dc1394featureset_t *xFeatures, ExifData ** pParentEd);
34548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
35548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
36548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenint main(int argc, char *argv[])
37548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{   dc1394camera_t *pCamera, **pCameras=NULL;
38548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    int iNumCameras;
39548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    dc1394featureset_t xFeatures;
40548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    int i;
41548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    int err=dc1394_find_cameras(&pCameras, &iNumCameras);
42548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
43548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    //EXIF STUFF
44548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    JPEGData *pData;
45548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    //float fOnefloat;
46548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    ExifData * pEd;
47548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
48548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
49548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if (err!=DC1394_SUCCESS) {
50548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen        fprintf( stderr, "Unable to look for cameras\n\n"
51548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen            "Please check \n"
52548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen            "  - if the kernel modules `ieee1394',`raw1394' and `ohci1394' are loaded \n"
53548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen            "  - if you have read/write access to /dev/raw1394\n\n");
54548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen        exit(1);
55548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    }
56548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
57548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
58548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    /*-----------------------------------------------------------------------
59548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen     *  Initialize the camera
60548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen     *-----------------------------------------------------------------------*/
61548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if (iNumCameras<1) {
62548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen        fprintf(stderr, "no cameras found :(\n");
63548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen        exit(1);
64548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    }
65548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pCamera=pCameras[0];
66548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    for (i=1;i<iNumCameras;i++)
67548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen        dc1394_free_camera(pCameras[i]);
68548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    free(pCameras);
69548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
70548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if(dc1394_get_camera_feature_set(pCamera, &xFeatures)!=DC1394_SUCCESS)
71548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen            fprintf(stdout, "unable to get feature set\n");
72548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    else
73548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen            printf("camera's feature set retrieved\n");
74548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
75548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    createEXIF(&xFeatures, &pEd);  //tag the file with the settings of the camera
76548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
77548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    //exif_data_dump (pEd);
78548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
79548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    //write the Exif data to a jpeg file
80548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pData = jpeg_data_new_from_file (FILENAME);  //input data
81548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    if (!pData) {
82548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen        printf ("Could not load '%s'!\n", FILENAME);
83548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen        return (-1);
84548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    }
85548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
86548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf("Saving EXIF data to jpeg file\n");
87548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    jpeg_data_set_exif_data (pData, pEd);
88548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf("Set the data\n");
89548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    jpeg_data_save_file(pData, "foobar2.jpg");
90548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
91548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    return 0;
92548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
93548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen}
94548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
95548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
96548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissenint createEXIF(dc1394featureset_t *xFeatures, ExifData ** pParentEd)
97548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen{
98548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    ExifEntry *pE;
99548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    ExifData * pEd;
100548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    int i = !xFeatures->feature[DC1394_FEATURE_WHITE_BALANCE - DC1394_FEATURE_MIN].auto_active;
101548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
102548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    ExifSRational xR = {xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].value, xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].max};;
103548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
104548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf ("Creating EXIF data...\n");
105548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pEd = exif_data_new ();
106548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
107548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    /*
108548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
109548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    Things to tag:
110548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
111548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_MAKE               = 0x010f,
112548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_MODEL              = 0x0110,
113548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_EXPOSURE_TIME      = 0x829a,
114548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_BRIGHTNESS_VALUE   = 0x9203,
115548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_WHITE_BALANCE      = 0xa403,
116548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_GAIN_CONTROL       = 0xa407,
117548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_CONTRAST           = 0xa408,
118548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_SATURATION         = 0xa409,
119548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_SHARPNESS          = 0xa40a,
120548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    EXIF_TAG_USER_COMMENT
121548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    */
122548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
123548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf ("Adding a Make reference\n");
124548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pE = exif_entry_new ();
125548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE);
126548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_initialize (pE, EXIF_TAG_MAKE);
127548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pE->data="AVT";
128548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_unref (pE);
129548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
130548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf ("Adding a Model reference\n");
131548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pE = exif_entry_new ();
132548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE);
133548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_initialize (pE, EXIF_TAG_MODEL);
134548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pE->data="510c";
135548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_unref (pE);
136548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
137548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf ("Adding a Tag to reference # samples per pixel\n");
138548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pE = exif_entry_new ();
139548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE);
140548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_initialize (pE, EXIF_TAG_SAMPLES_PER_PIXEL); //by default is 3
141548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_unref (pE);
142548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
143548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf ("Adding a White Balance Reference\n");
144548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pE = exif_entry_new ();
145548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE);
146548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_initialize (pE, EXIF_TAG_WHITE_BALANCE);
147548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_set_short(pE->data, exif_data_get_byte_order (pEd), i);  //0=auto white balance, 1 = manual white balance
148548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_unref (pE);
149548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
150548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    //need to create logic according to the value of the sharpness
151548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf ("Adding a Sharpness Reference\n");
152548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pE = exif_entry_new ();
153548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE);
154548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_initialize (pE, EXIF_TAG_SHARPNESS);
155548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_set_short(pE->data, exif_data_get_byte_order (pEd), 0);
156548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_unref (pE);
157548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
158548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf ("Adding a Brightness reference\n");
159548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
160548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    //try to get brightness
161548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    //printf("Float Value: %i\n",xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].value);
162548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
163548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    pE = exif_entry_new ();
164548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE);
165548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_entry_initialize (pE, EXIF_TAG_BRIGHTNESS_VALUE);
166548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    exif_set_srational (pE->data, exif_data_get_byte_order (pEd), xR);
167548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
168548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
169548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    //exif_data_dump (ed);
170548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    //exif_data_dump (pEd);
171548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    *pParentEd = pEd;
172548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    printf("Done!\n");
173548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen
174548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen    return 0;
175548dde4863e9a2315e3f327efe63ff55949addb8Marco Nelissen}
176