summaryrefslogtreecommitdiff
path: root/contrib/examples/cam_features.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/examples/cam_features.c')
-rw-r--r--contrib/examples/cam_features.c175
1 files changed, 175 insertions, 0 deletions
diff --git a/contrib/examples/cam_features.c b/contrib/examples/cam_features.c
new file mode 100644
index 0000000..6a2dc18
--- /dev/null
+++ b/contrib/examples/cam_features.c
@@ -0,0 +1,175 @@
+/***************************************************************************
+ * 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;
+}