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