Merge master.
[dcpomatic.git] / src / lib / image.cc
index 432cfbd54b9279e0b2631cc417b511066dc2ab2f..d4ec6f99a6381070835b2fd54a875f414e5d7f87 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 #include <iostream>
+#include <openssl/md5.h>
 extern "C" {
 #include <libswscale/swscale.h>
 #include <libavutil/pixfmt.h>
@@ -40,6 +41,7 @@ using std::min;
 using std::cout;
 using std::cerr;
 using std::list;
+using std::stringstream;
 using boost::shared_ptr;
 using dcp::Size;
 
@@ -662,3 +664,24 @@ merge (list<PositionImage> images)
 
        return PositionImage (merged, all.position ());
 }
+
+string
+Image::digest () const
+{
+       MD5_CTX md5_context;
+       MD5_Init (&md5_context);
+
+       for (int i = 0; i < components(); ++i) {
+               MD5_Update (&md5_context, data()[i], line_size()[i]);
+       }
+       
+       unsigned char digest[MD5_DIGEST_LENGTH];
+       MD5_Final (digest, &md5_context);
+       
+       stringstream s;
+       for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) {
+               s << std::hex << std::setfill('0') << std::setw(2) << ((int) digest[i]);
+       }
+
+       return s.str ();
+}