| /*************************************************************************** |
| * 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; |
| } |