/*************************************************************************** * cam_features.c * * Wed Jul 27 11:25:09 2005 * Copyright 2005 User: Naysawn Naderi * Email: ndn at xiphos dot ca * * Uses libdc1394 and libraw1394 ****************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/times.h> #include <errno.h> #include <libraw1394/raw1394.h> #include <libdc1394/dc1394_control.h> #include <libdc1394/dc1394_register.h> //EXIF includes #include <libexif/exif-data.h> #include <libexif/exif-ifd.h> #include <libexif/exif-loader.h> // Part of the exif command-line source package #include "libjpeg/jpeg-data.h" #define FILENAME "test.jpg" static int createEXIF(dc1394featureset_t *xFeatures, ExifData ** pParentEd); int main(int argc, char *argv[]) { dc1394camera_t *pCamera, **pCameras=NULL; int iNumCameras; dc1394featureset_t xFeatures; int i; int err=dc1394_find_cameras(&pCameras, &iNumCameras); //EXIF STUFF JPEGData *pData; //float fOnefloat; ExifData * pEd; if (err!=DC1394_SUCCESS) { fprintf( stderr, "Unable to look for cameras\n\n" "Please check \n" " - if the kernel modules `ieee1394',`raw1394' and `ohci1394' are loaded \n" " - if you have read/write access to /dev/raw1394\n\n"); exit(1); } /*----------------------------------------------------------------------- * Initialize the camera *-----------------------------------------------------------------------*/ if (iNumCameras<1) { fprintf(stderr, "no cameras found :(\n"); exit(1); } pCamera=pCameras[0]; for (i=1;i<iNumCameras;i++) dc1394_free_camera(pCameras[i]); free(pCameras); if(dc1394_get_camera_feature_set(pCamera, &xFeatures)!=DC1394_SUCCESS) fprintf(stdout, "unable to get feature set\n"); else printf("camera's feature set retrieved\n"); createEXIF(&xFeatures, &pEd); //tag the file with the settings of the camera //exif_data_dump (pEd); //write the Exif data to a jpeg file pData = jpeg_data_new_from_file (FILENAME); //input data if (!pData) { printf ("Could not load '%s'!\n", FILENAME); return (-1); } printf("Saving EXIF data to jpeg file\n"); jpeg_data_set_exif_data (pData, pEd); printf("Set the data\n"); jpeg_data_save_file(pData, "foobar2.jpg"); return 0; } int createEXIF(dc1394featureset_t *xFeatures, ExifData ** pParentEd) { ExifEntry *pE; ExifData * pEd; int i = !xFeatures->feature[DC1394_FEATURE_WHITE_BALANCE - DC1394_FEATURE_MIN].auto_active; ExifSRational xR = {xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].value, xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].max};; printf ("Creating EXIF data...\n"); pEd = exif_data_new (); /* Things to tag: EXIF_TAG_MAKE = 0x010f, EXIF_TAG_MODEL = 0x0110, EXIF_TAG_EXPOSURE_TIME = 0x829a, EXIF_TAG_BRIGHTNESS_VALUE = 0x9203, EXIF_TAG_WHITE_BALANCE = 0xa403, EXIF_TAG_GAIN_CONTROL = 0xa407, EXIF_TAG_CONTRAST = 0xa408, EXIF_TAG_SATURATION = 0xa409, EXIF_TAG_SHARPNESS = 0xa40a, EXIF_TAG_USER_COMMENT */ printf ("Adding a Make reference\n"); pE = exif_entry_new (); exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); exif_entry_initialize (pE, EXIF_TAG_MAKE); pE->data="AVT"; exif_entry_unref (pE); printf ("Adding a Model reference\n"); pE = exif_entry_new (); exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); exif_entry_initialize (pE, EXIF_TAG_MODEL); pE->data="510c"; exif_entry_unref (pE); printf ("Adding a Tag to reference # samples per pixel\n"); pE = exif_entry_new (); exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); exif_entry_initialize (pE, EXIF_TAG_SAMPLES_PER_PIXEL); //by default is 3 exif_entry_unref (pE); printf ("Adding a White Balance Reference\n"); pE = exif_entry_new (); exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); exif_entry_initialize (pE, EXIF_TAG_WHITE_BALANCE); exif_set_short(pE->data, exif_data_get_byte_order (pEd), i); //0=auto white balance, 1 = manual white balance exif_entry_unref (pE); //need to create logic according to the value of the sharpness printf ("Adding a Sharpness Reference\n"); pE = exif_entry_new (); exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); exif_entry_initialize (pE, EXIF_TAG_SHARPNESS); exif_set_short(pE->data, exif_data_get_byte_order (pEd), 0); exif_entry_unref (pE); printf ("Adding a Brightness reference\n"); //try to get brightness //printf("Float Value: %i\n",xFeatures->feature[DC1394_FEATURE_BRIGHTNESS - DC1394_FEATURE_MIN].value); pE = exif_entry_new (); exif_content_add_entry (pEd->ifd[EXIF_IFD_0], pE); exif_entry_initialize (pE, EXIF_TAG_BRIGHTNESS_VALUE); exif_set_srational (pE->data, exif_data_get_byte_order (pEd), xR); //exif_data_dump (ed); //exif_data_dump (pEd); *pParentEd = pEd; printf("Done!\n"); return 0; }