Giter Club home page Giter Club logo

xmp-toolkit-sdk's Introduction

XMP-Toolkit-SDK

The XMP Toolkit allows you to integrate XMP functionality into your product or solution. It supports Macintosh, Windows, as well as UNIX and comes with samples, documentation, source code and scripts to generate project files. The XMP Toolkit is available under the BSD license. The specification is provided under the XMP Specification Public Patent License

SDK components

The XMP Toolkit SDK contains two libraries, XMPCore and XMPFiles. XMPCore and XMPFiles are provided as C++ implementations.

XMPCore

This library supplies an API for parsing, manipulating, and serializing metadata, according to the XMP data model and regardless of the file format of the data it describes.

XMPFiles

This library supplies an API for locating, adding, or updating the XMP metadata in a file. The API allows you to retrieve the entire XMP Packet, which you can then pass to the XMPCore component in order to manipulate the individual XMP properties.

It also includes a plug-in SDK that allows you to create an XMPFiles Plug-in that handles metadata for additional file formats, or replaces built-in format handlers with custom ones.

XMP Toolkit SDK Contents

This git repo contains the following folders under the root folder:

Directory Details
/ At the root level, the license agreement (BSD_License.txt) and this overview (XMP-Toolkit-SDK-Overview.pdf).
build/ Contains Batch file, shell scripts, Makefile and CMake scripts to be used to create XMP Toolkit SDK project files on the supported platforms. Follow the instructions in README.txt to create the projects.
docs/ The three-part XMP Specification, the XMP Toolkit SDK Programmer’s Guide, the API reference documentation (API/index.html) and the XMPFiles plug-in SDK documentation.
public/include/ The header files and glue code that clients of the XMP Toolkit SDK must include.
samples/ Sample source code and CMake scripts for building sample projects, with the necessary resources to run the sample code. See ‘‘Sample code and tools’’ below.
source/ The common source code that is used by both components of the XMP Toolkit SDK.
XMPCore/ The source code for XMPCore library.
XMPFiles/ The source code for XMPFiles library.
third-party/
   expat/
   zlib/
   zuid/
Placeholders for third party source files which are needed for the XMP Toolkit SDK, including ReadMe.txt files with information on how to obtain and install the tools. MD5 source code, needed by both components for MD5 hash computation, is included.
tools/ Placeholder for downloading and placing CMake tool
XMPFilesPlugins/ The header files and glue code of the XMPFiles plug-in SDK and a sample plug-in.

How to Build and Use

XMP Toolkit SDK provides build script to ease the process. This repository contains everything needed to build SDK libraries on Mac OS®, Windows®, UNIX®/Linux®, iOS and Android. For detailed build steps , refer the Programmer's Guide

Documentation

See extensive API documentation where a complete API Reference is available.

The XMP Specification, available from Adobe Developer Center (XMP), provides a complete formal specification for XMP. Before working with the XMP Toolkit SDK, you must be familiar with, at a minimum, the XMP Data Model.

The specification has three parts:

  • Part 1, Data Model, Serialization, and Core Properties covers the basic metadata representation model that is the foundation of the XMP standard format. The Data Model prescribes how XMP metadata can be organized; it is independent of file format or specific usage. The Serialization Model prescribes how the Data Model is represented in XML, specifically RDF. This document provides all the details a programmer would need to implement a metadata manipulation system such as the XMP Toolkit SDK (which is available from Adobe).

  • Part 2, Additional Properties, provides detailed property lists and descriptions for standard XMP metadata schemas; these include general-purpose schemas such as Dublin Core, and special-purpose schemas for Adobe applications such as Photoshop®. It also provides information on extending existing schemas and creating new schemas.

  • Part 3, Storage in Files, provides information about how serialized XMP metadata is packaged into XMP Packets and embedded in different file formats. It includes information about how XMP relates to and incorporates other metadata formats, and how to reconcile values that are represented in multiple metadata formats.

Contributing

Contributions are welcomed! Read the Contributing Guide for more information.

Licensing

This project is BSD licensed. See LICENSE for more information.

Report Issues/Bugs

You can report the issues in the issues section of the github repo.

xmp-toolkit-sdk's People

Contributors

arpitapanda05 avatar gmondada avatar matthiasbaldi avatar maupadhyay avatar pawankishorsingh avatar prigupta-adobe avatar priyanka-gupta avatar suhail95 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xmp-toolkit-sdk's Issues

CopyXMP data changes XMP tag names

Hello

We use XMP Toolkit to copy xmp related data from file to file.
for some reason, 1 prefix is added to most of xmp tags in the result file.
Can you please advice ?

Thank you,
Lidia.

For example,
Xmp.crs.Version becomes Xmp.crs_1_.Version

Expected Behaviour

XMP tags are copied as is

Actual Behaviour

1 is added to most of xmp tags in the result file

steps to reproduce:

run sample code with attached file.
extract xmp data and compare
hires

Platform and Version

Windows/MAC

Sample Code that illustrates the problem

bool main()
{

string inFilename = "hires.jpg";
string outFilename = "before_xmp.jpg";

XMPMetaData t;
SXMPFiles::Initialize(options);

SXMPFiles myFile;
XMP_OptionBits opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUseSmartHandler;

ok = myFile.OpenFile(inFilename, kXMP_UnknownFile, opts);
SXMPMeta meta;
if (ok)
{
ok = myFile.GetXMP(&meta);
XMP_OptionBits opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUseSmartHandler;
bool ok = myFile.OpenFile(outFilename, kXMP_UnknownFile, opts);
if (!myFile.CanPutXMP(meta))
return false;

myFile.PutXMP(meta);
myFile.CloseFile();

}

Logs taken while reproducing problem

Error Compiling on Ubuntu 18_04, gcc 7.5.0, XMP version 201607

This is additional information/bugs for the issue which was closed (? why ?): Compiling on Linux with gcc 7.5.0 ( #8 ) .
I'm compiling the version XMP-Toolkit-SDK-CC201607. I followed the Readme file and fixed the bugs described here: #8.
In addition I set up the libuuid as per this description: https://noknow.info/it/os/install_libuuid_from_source?lang=en
Here's the gcc version:
image
I can run "make StaticAll" and it is finished successfully: *.ar were created.
If I try to build dynamic libs: "make DynamicAll" - I got the following errors:
[100%] Linking CXX shared library /home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/public/libraries/i80386linux_x64/release/libXMPFiles.so
CMakeFiles/XMPFiles.dir/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/XMPFiles/source/PluginHandler/OS_Utils_Linux.cpp.o: In function XMP_PLUGIN::GetFunctionPointerFromModuleImpl(void*, char const*)': OS_Utils_Linux.cpp:(.text+0x25): undefined reference to dlsym'
OS_Utils_Linux.cpp:(.text+0x62): undefined reference to dlerror' CMakeFiles/XMPFiles.dir/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/XMPFiles/source/PluginHandler/OS_Utils_Linux.cpp.o: In function XMP_PLUGIN::LoadModule(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&, bool)':
OS_Utils_Linux.cpp:(.text+0x51f): undefined reference to dlopen' OS_Utils_Linux.cpp:(.text+0x544): undefined reference to dlerror'
CMakeFiles/XMPFiles.dir/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/XMPFiles/source/PluginHandler/OS_Utils_Linux.cpp.o: In function XMP_PLUGIN::UnloadModule(void*, bool)': OS_Utils_Linux.cpp:(.text+0x70b): undefined reference to dlclose'
collect2: error: ld returned 1 exit status
/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/XMPFiles/build/gcc/dynamic/i80386linux_64/Release/CMakeFiles/XMPFiles.dir/build.make:2019: recipe for target '/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/public/libraries/i80386linux_x64/release/libXMPFiles.so' failed
make[3]: *** [/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/public/libraries/i80386linux_x64/release/libXMPFiles.so] Error 1
make[3]: Leaving directory '/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/build/gcc/dynamic/i80386linux_64/Release'
CMakeFiles/Makefile2:144: recipe for target '/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/XMPFiles/build/gcc/dynamic/i80386linux_64/Release/CMakeFiles/XMPFiles.dir/all' failed
make[2]: *** [/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/XMPFiles/build/gcc/dynamic/i80386linux_64/Release/CMakeFiles/XMPFiles.dir/all] Error 2
make[2]: Leaving directory '/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/build/gcc/dynamic/i80386linux_64/Release'
Makefile:83: recipe for target 'all' failed
make[1]: *** [all] Error 2
make[1]: Leaving directory '/home/ubuntu/tmp/XMP-Toolkit-SDK-CC201607/XMP-Toolkit-SDK-CC201607/build/gcc/dynamic/i80386linux_64/Release'
Makefile:49: recipe for target 'DynamicRelease64' failed
make: *** [DynamicRelease64] Error 2

image

Only libXMPCore.so was created (no libXMPFiles.so).
image

Please provide the instructions how I can fix this issue.

Earlier versions of the project

Hi,
Can you please help me to find the source code for the
XMPCORE_API_VERSION 5.6.0
XMPFILES_API_VERSION 5.7.0
The only release you have is
XMPCORE_API_VERSION 6.0.0
XMPFILES_API_VERSION 6.0.0
Is there any way for me to get the earlier releases ?
I was looking to create the Linux version of the earlier release, but whoever built the windows version (probably couple of years ago) did not save the the source files).

Regards,
Alex

iOS : cannot forward GPS metadata

I started from SDK code in "samples/source/ModifyingXMP.cpp".
I just extract XMP metadata from my photo source and reinject it in my new photo.
Result is that my new photo has all metadata from my photo source except GPS metadata.

Problem only on iOS, no problem on Android.

Cannot write GPano property into jpeg file on iOS

I started from SDK code in "samples/source/ModifyingXMP.cpp", I just added this few lines to write GPano metadata :

// register namespace
string actualPrefix;
SXMPMeta::RegisterNamespace( "http://ns.google.com/photos/1.0/panorama/", "GPano:", &actualPrefix );

// write gpano property
meta.SetProperty("http://ns.google.com/photos/1.0/panorama/", "ProjectionType", "equirectangular", 0);

I use this lines to dump meta content :

SXMPIterator iter( meta );
string schemaNS,propPath,propVal;
while( iter.Next( &schemaNS, &propPath, &propVal )){
    cout << schemaNS << " " << propPath << " = " << propVal << endl;
}

When I dump meta, I have this :

http://purl.org/dc/elements/1.1/  = 
http://purl.org/dc/elements/1.1/ dc:creator = 
http://purl.org/dc/elements/1.1/ dc:creator[1] = Author Name
http://purl.org/dc/elements/1.1/ dc:creator[2] = Another Author Name
http://purl.org/dc/elements/1.1/ dc:title = 
http://purl.org/dc/elements/1.1/ dc:title[1] = An English title
http://purl.org/dc/elements/1.1/ dc:title[1]/?xml:lang = x-default
http://purl.org/dc/elements/1.1/ dc:title[2] = An English title
http://purl.org/dc/elements/1.1/ dc:title[2]/?xml:lang = en-US
http://purl.org/dc/elements/1.1/ dc:title[3] = Un titre Francais
http://purl.org/dc/elements/1.1/ dc:title[3]/?xml:lang = fr-FR
http://ns.google.com/photos/1.0/panorama/  = 
http://ns.google.com/photos/1.0/panorama/ GPano:ProjectionType = equirectangular

So it is ok I see the GPano property when I dump the meta.

But my problem is that I don't retrieve GPano metadata in exported file while I see correctly other XMP properties added by the sample code. I use ApolloOne app or thexifer website or exiftool to check file metadata. Here is the exported file :

LPVK8002

It looks like GPano property is not exported to file, is it a bug or my misunderstanding?

Note 1 : no problem with same code on Android.

Note 2 : I also tried to just forward metadata by reading XMP from a file that have correct GPano metadata and writing these XMP to a new file, it failed too. I mean I don't retrieve Gpano in the new file while other metadata are present.

Note 3 : when building iOS SDK, I had to define "XML_POOR_ENTROPY" in "third-party/expat/lib/xmlparse.c"

HEIC support in XMP Toolkit?

Feature request: I miss HEIF/HEIC file format support in XMP Toolkit. HEIF/HEIC is there since years in iOS, recently also Canon added HEIC support into new cameras. Lightroom, Photoshop, etc. do support HEIC since several years too.

Are there any plans to add HEIC support into XMP Toolkit? If yes, is there an approximate timeline for it? If not, what are the alternatives?

PDF_Handler precompiled DLL for 32 bit and ARM 32 & 64 platform

Hi,

I found out that PDF files don't have a built-in file handler in XMP SDK, so that XMPFiles::OpenFile always fails on PDF if opened using smart handler and must fallback to packet scanning which is less recommended.

I've noticed there's a pre-compiled PDF handler DLL ready for use at :
https://github.com/adobe/XMP-Toolkit-SDK/tree/main/XMPFilesPlugins/PDF_Handler/windows/windows_x64

However I need a 32 bit DLL as well as Windows ARM support.

Can I build PDF Handler from sources? I didn't find any of it on this repository.
If not possible, can you build a 32 bit version as well as ARM?

Thank you

Provide Doxygen

I do not like the current method of documenting this SDK with a PDF. I would appreciate if Doxygen was employed in order to create easy-to-read and easy-to-browse documentation.

License no longer BSD

Each license header include the following sentence that wasn't in the previous release.

If you have received this file from a source other than Adobe, then your use, modification, or distribution of it requires the prior written permission of Adobe.

This mean that redistribution of the source code is restricted, therefor this is no longer BSD 3-clause licensed source code, and other open source package that include that code are no longer allowed to do so.

The README is therefor misleading.

Can not compile/link simplest test on Ubuntu 18 (how to use UNIX_ENV, XMP_DynamicBuild and so on)

Here's the simplest cpp file I wanted to compile with XMP Toolkit test.cpp:

#include "iostream"
#include <string>
/*
#define XMP_DynamicBuild 1
//#define ENABLE_CPP_DOM_MODEL 1
#define UNIX_ENV 1
#define XMP_64 1
#define __LITTLE_ENDIAN__ 1
*/

#define XMP_INCLUDE_XMPFILES 1
// Must be defined to instantiate template classes
#define TXMP_STRING_TYPE std::string
// Ensure XMP templates are instantiated
#include "XMP.incl_cpp"
// Provide access to the API
#include "XMP.hpp"


int main(void)
{
 std::cout << "Started to init SXMPMeta"<<std::endl;
 bool metaInitialized = SXMPMeta::Initialize();
 std::cout << "Finished to init SXMPMeta " << metaInitialized<<std::endl;
 std::cout << "Started to init SXMPFiles" <<std::endl;
 bool filesInitialized = SXMPFiles::Initialize();
 std::cout << "Finished to init SXMPFiles " << filesInitialized;
 bool success = metaInitialized && filesInitialized;
 std::cout << "Done both:" << success; 
 return 0;
}

I put in the same directory the following files:

  1. Interface which contains ALL files from the <xmp-toolkit-sdk-2020.1>/public/include directory:
    image
  2. Lib/x64 which contains dynamic *.so (only) files built into the <xmp-toolkit-sdk-2020.1>/public/libraries/i80386linux_x64/release
    image
    All I wanted is compile this test.cpp file and see that both SXMPMeta and SXMPFiles were initialized successfully using libXMPCore.so and libXMPFiles.so.
  3. Here's the command line:
    version: g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
    g++ *.cpp -fpermissive -std=c++0x -I/home/ubuntu/tmp/test/Interface -std=c++0x -L/home/ubuntu/tmp/test/Lib/x64/ -static -o testXMP
    Hundreds of errors were printed out:
    image

Can you please provide command line to compile and link this simple file ? I see many variables were defined in the <xmp-toolkit-sdk-2020.1>/samples/build/cmake , like compiler arguments:
-fPIC
-Wno-multichar
-funsigned-char
-m64
-fexceptions
-Wformat
-Wformat-security
-Wall
-Wno-reorder
-std=c++0x
-Os
some variable were defined:
-DENABLE_CPP_DOM_MODEL=1
-DUNIX_ENV=1
-DXMP_64=1
-DXMP_StaticBuild=1
-D__LITTLE_ENDIAN__=1

There is nothing about it in the XMPProgrammerGuide. The provided sample (ReadingXMP ) seems to use only the static libs.
Regards
Alex

patent license link is broken

The link to the patent license in README.md goes to a page that simply says:

Page not found

Has Adobe revoked the license or something?

Understand this SDK

Hello !

I am sorry to make an issue for this but i had no idea where else to ask you about it.
I am an Android / Flutter dev and my client wants me to write XMP data (Yaw, Pitch, Roll, Focal etc) in the image EXIF (that i take from the Android camera API).

I would like to understand how to proceed if i can use this SDK in my Android project for example, by compiling it from the Gradle , and also if this SDK is actually doing what i need to achieve ?
Can i call from some Java code the toolkit APIs if there are any ?

Thanks a lot in advance

template<class> class std::auto_ptr' is deprecated

XMPScanner.cpp: In member function 'void XMPScanner::Scan(const void*, XMP_Int64, XMP_Int64)':
XMPScanner.cpp:1267:33: warning: 'template<class> class std::auto_ptr' is deprecated: use 'std::unique_ptr' instead [-Wdeprecated-declarations]
 1267 |                                 auto_ptr<PacketMachine> ap ( pm );
      |                                 ^~~~~~~~
In file included from c:\msys1200\include\c++\12.0.0\memory:76,
                 from c:\msys1200\x86_64-w64-mingw32\include\xmpfiles\source\formatsupport\xmpscanner.hpp:22,
                 from XMPScanner.cpp:27:
c:\msys1200\include\c++\12.0.0\bits\unique_ptr.h:56:28: note: declared here
   56 |   template<typename> class auto_ptr;
      |                            ^~~~~~~~

Compiling on Linux with gcc 7.5.0

URL in "XMP-Toolkit-SDK/tools/cmake/ReadMe.txt" for Linux does not exist

See: #7 (comment)

Line 79 of "XMP-Toolkit-SDK/build/shared/SharedConfig_Common.cmake"

The command "-dumpversion" does not work correctly with gcc version 7.5.0.
This will lead to errors during the make command

CMake Error at shared/SharedConfig_Common.cmake:94 (if):
  if given arguments:
 
     "LESS" "413"
 
 Unknown arguments specified

The output for "-dumpversion" and "--version"

$ gcc -dumpversion
7
$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Therefore the variable GCC_VERSION_STRING was not set correctly which let to the mentioned error. I had to replace "-dumpversion" using "--version" to make it work.

Line 187 of "XMP-Toolkit-SDK/build/ProductConfig.cmake"

set(XMP_PLATFORM_LINK "-z defs -Xlinker -Bsymbolic -Wl,--no-undefined  ${XMP_EXTRA_LINK_FLAGS} ${XMP_TOOLCHAIN_LINK_FLAGS} -lrt -Wl,--no-as-needed -ldl -lpthread ${XMP_GCC_LIBPATH}/libssp.a")`

In contrast to the description from the "XMP-Toolkit-SDK/build/README.txt" setting the variable "XMP_ENABLE_SECURE_SETTINGS" to "OFF" (Line 37 of "XMP-Toolkit-SDK/build/shared/ToolchainGCC.cmake") does not turn off the linking of the libssp.a which results in the following error.

[ 43%] Linking CXX shared library /adobe_dng_sdk/xmp_sdk/public/libraries/i80386linux_x64/release/libXMPCore.so
g++: error: /user/unicore/i80386linux_x64/compiler/gcc4.8.2/linux3.10_64/lib64/libssp.a: No such file or directory
/adobe_dng_sdk/xmp_sdk/XMPCore/build/gcc/dynamic/i80386linux_64/Release/CMakeFiles/XMPCore.dir/build.make:1583: recipe for target '/adobe_dng_sdk/xmp_sdk/public/libraries/i80386linux_x64/release/libXMPCore.so' failed

I had to modify Line 187 of "XMP-Toolkit-SDK/build/ProductConfig.cmake" to:

set(XMP_PLATFORM_LINK "-z defs -Xlinker -Bsymbolic -Wl,--no-undefined  ${XMP_EXTRA_LINK_FLAGS} ${XMP_TOOLCHAIN_LINK_FLAGS} -lrt -Wl,--no-as-needed -ldl -lpthread")

Remove "Adobe Confidential" headers

Some of the files in this repo have "Adobe Confidential" in the headers. This should be removed as it gives folks the impression this project is not licensed under BSD-3-Clause. This may discourage folks from using the project and the open source office has already received one inquiry about the above.

Several undocumented namespace constants in XMP_Const.h

Expected Behaviour

All publicly-declared constants have \def and \brief comments.

Actual Behaviour

Several of the constants in XMP_Const.h do not have doc comments explaining their meaning.

Compare (one example each): kXMP_NS_ASF (undocumented) vs kXMP_NS_TIFF (which has a \def and \brief description earlier in the file).

XMP-Toolkit-SDK-2020.01/Ubuntu 18.04 / gcc 7.5.0/cmake 3.20.4

I try to build Linux version of the older libraries from here: https://www.adobe.com/devnet/xmp.html -> XMP-Toolkit-SDK-2020.01 . Can not build Linux libraries on Ubuntu 18.04:
ubuntu@ubuntu-VirtualBox:~/tmp/XMP-Toolkit-SDK-2020.1/build$ make ReleaseAll
./cmake.command 64 Dynamic Release ToolchainGCC.cmake Clean
---------------------------Config----------------------------------------
cmake_build_warning_as_error=Off
TOOLCHAIN=ToolchainGCC.cmake
cmake_buildbitdepth=On
cmake_modesubdir=_64
MACHTYPE=x86_64
cmake_buildtype=dynamic
cmake_buildmode=Release
cmake_build_static=Off
clean_cmakedir=On
cmake_libcpp=Off
Using toolchain ToolchainGCC.cmake
+++ Toolchain setup:
+++ /usr//
+++
+++
+++
+++
+++ Toolchain setup:
+++ /usr//
+++
+++
+++
+++
CMake Error at shared/SharedConfig_Common.cmake:94 (if):
if given arguments:

"LESS" "413"

Unknown arguments specified
Call Stack (most recent call first):
shared/SharedConfig_Linux.cmake:59 (SetupCompilerFlags)
shared/SharedConfig.cmake:55 (include)
XMP_ConfigCommon.cmake:34 (include)
XMP_Config.cmake:39 (include)
CMakeLists.txt:73 (include)

-- Configuring incomplete, errors occurred!
See also "/home/ubuntu/tmp/XMP-Toolkit-SDK-2020.1/build/gcc/dynamic/i80386linux_64/Release/CMakeFiles/CMakeOutput.log".
CmakeUtils.txt Failed.
cmake.command failed
Makefile:49: recipe for target 'DynamicRelease64' failed
make: *** [DynamicRelease64] Error 1

It seems this shared/SharedConfig_Common.cmake does not work at all:

workaround for visibility problem and gcc 4.1.x

	if(${${COMPONENT}_VERSIONING_GCC_VERSION} LESS 413)
		# only remove inline hidden...
		string(REGEX REPLACE "-fvisibility-inlines-hidden" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
	endif()
	if(${${COMPONENT}_VERSIONING_GCC_VERSION} EQUAL 482)
		#include path -I ${GNU_BASE}/include/c++/4.8.2/x86_64-unknown-linux-gnu
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I ${CMAKE_FIND_ROOT_PATH}/include/c++/4.8.2/x86_64-unknown-linux-gnu")
	endif()

Here's the contain of the : XMP-Toolkit-SDK-2020.1/build/gcc/dynamic/i80386linux_64/Release/CMakeFiles/CMakeOutput.log
The target system is: Linux - - x86_64
The host system is: Linux - 5.4.0-74-generic - x86_64

Please advise how to build the libraries ? Should I just delete all this "if" ? I would appreciate if you can please provide the Linux libraries built , it would eliminate my problem as well.
Regards,
Alex

Where is the XMP SDK for Java?

Sorry for posting this here but I didn't know any place else.

On your webpage https://www.adobe.com/devnet/xmp.html the old Java XMP version 5.1.3 is linked. Then on maven central one can find a slightly newer version 6.1.10 but still it is from 2016. But then here on github there is no java version at all. So please add repo for the Java SDK here - this would be highly appreciated!

Update in 2022, management summary:
According to Pawan all version 6.X releases were accidentally been released. All users should continue to use the latest version 5.X. This "accident" continued over the course of 4 years with several version:

  • 6.1.11 released in Nov, 2020 by accident
  • 6.1.10 released in Sep, 2016 by accident
  • 6.1.8 released in Sep, 2016 by accident
  • 6.1.6 released in Sep, 2016 by accident
  • 6.0.6 released in Sep, 2016 by accident
  • 6.0.4 released in Sep, 2016 by accident

Update in Nov. 2022

Leonard Rosenthol the chief PDF architect commented on this thread (thank you Leonard for honoring us here) and stated the following:

The 6.1.11 [...] is an official Adobe distribution. You can/should use that as it also includes an updated license file.

I have to admit: I am (and probably the whole community is) now totally confused...

Error 202: Expected property element node not found for stEvt:action

I have the following XMP (part) and the parser throws an 202 error:

Expected property element node not found

<xmpMM:History>
 <rdf:Seq>
  <rdf:li>
   <stEvt:action xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">converted</stEvt:action>
  </rdf:li>
 </rdf:Seq>
</xmpMM:History>

But the XMP itself doesn't look invalid, does it? It was created by Adobe InDesign 14.0 (Macintosh)

Ambiguous bool to int conversion

This is triggered by clang -Wint-in-bool-context

XMPFiles/source/FileHandlers/FLV_Handler.cpp:200:55: warning: converting the result of '<<' to a boolean; did you mean '(buffer[7] << 24) != 0'? [-Wint-in-bool-context]
        info->time = GetUns24BE ( &buffer[4] ) || (buffer[7] << 24);
                                                             ^
1 warning generated.

Expected Behaviour

Properly written code, no warning.

Actual Behaviour

Seems to want to put a bool value into an XMP_Uns32 with implicit conversion. Seems to be wrong.

Reproduce Scenario (including but not limited to)

Steps to Reproduce

Build with clang (Linux) with -Wint-in-bool-context

Platform and Version

clang version 13.0.0 (Fedora 13.0.0-3.fc35)

Sample Code that illustrates the problem

Logs taken while reproducing problem

Earlier versions of the toolkit are not available: 2016.07

Unfortunately I can not download the 2016.07 version. It’s not available any more, after I click this version on https://www.adobe.com/devnet/xmp.html and get to the EULA page – the zip is not available.
I click: XMP Toolkit SDK CC-2016.07 (ZIP, 38.7 MB) and get on the https://www.adobe.com/devnet/xmp/sdk/eula-cc20168.html
I click: "Agree and download XMP Toolkit SDK CC-2016.7" - no zip is downloaded.
Can I get the XMP Toolkit SDK CC-2016.7 ? Our software depends on this library and we wanted to re-compile it for Linux.

Use submodules to handle dependencies | Fix your library!

In #52, I found that I needed to install third-party sources in order to get the build working. However, I don't like the method of having to download sources manually. I strongly encourage moving to git submodules to manage these dependencies. This would simplify the dependency fetching process immensely: simply run git clone https://github.com/adobe/XMP-Toolkit-SDK.git --recurse-submodules, and presto, dependencies are downloaded! In addition, running git submodule update would keep dependencies up-to-date.

Furthermore, there is really no excuse to not do so, since both manually-fetched dependencies are available through git: zlib (or zlib-ng, for that matter) and libexpat.

** RANT ALERT **

If I am coming across as a bit harsh, I apologize, but this library is really not fun to work with. Most libraries I encounter have simple buildsystems (e.g. mkdir build; cd build; cmake ..; cmake --build .) that rely on system-bundled dependencies where possible (e.g. use CMake's find_package). In contrast, this library uses a strange conglomeration of make and CMake, requires manual download and placement of third-party dependency sources, and then, when I try to build (using make for simplicity instead of trying to wrap my head around a lot of different targets), fails with a linker error about not being able to locate libssp.a. Sure, a failure to find a library isn't that terrible, but I can't turn up a lot of information online. After grepping through the build directory, I found something terrifying.

Somebody hardcoded the path to compiler libs on Linux without bothering to verify that (a) the GCC dir is going to exist at /user/unicore/i80386linux_x64/compiler (it doesn't; probably no modern Linux distro even has /user), (b) the user has GCC 4.8.2 (they won't, given the fact that GCC is all the way to 11.2), (c) the user is using Linux kernel 3.10 (I sincerely hope they are not), (d) the user is on a 64-bit platform (most users are, but a few might be running code on legacy machines), or (e) the user is even using GCC (some people do use clang at times, myself among them).

Given all this, my level of enthusiasm for using this library is very low. Why use a library that is going to be a pain to work with?

** END RANT **

Sorry to disturb you with this rant. Have a nice day! 🙃

use of bitwise '|' with boolean operands

Build clang 14 and -Wbitwise-instead-of-logical as a warning

Expected Behaviour

The warning is never emitted

Actual Behaviour

It is emitted:

  CXX      ParseRDF.lo
../../../XMPCore/source/ParseRDF.cpp:389:8: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
                if ( (name[i] < '0') | (name[i] > '9') ) return false;
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                     ||
../../../XMPCore/source/ParseRDF.cpp:389:8: note: cast one or both operands to int to silence this warning
1 error generated.
  CXX      P2_Handler.lo
../../../../XMPFiles/source/FileHandlers/P2_Handler.cpp:161:8: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
                if ( (parentName == "AUDIO") | (parentName == "VOICE") ) {
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                             ||
../../../../XMPFiles/source/FileHandlers/P2_Handler.cpp:161:8: note: cast one or both operands to int to silence this warning
../../../../XMPFiles/source/FileHandlers/P2_Handler.cpp:235:8: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
                if ( (parentName == "AUDIO") | (parentName == "VOICE") ) {
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                             ||
../../../../XMPFiles/source/FileHandlers/P2_Handler.cpp:235:8: note: cast one or both operands to int to silence this warning
2 errors generated.

Note: here it says "error" because I have set it to be an error, but even as a warning it is present.

Reproduce Scenario (including but not limited to)

Steps to Reproduce

Build with clang 14, enable -Wbitwise-instead-of-logical

Platform and Version

clang version 14.0.0 (Fedora 14.0.0-1.fc36)

Sample Code that illustrates the problem

Logs taken while reproducing problem

Most compatible / lax parsing options

When parsing different XMP Metadata (contained in PDFs) we sometimes get errors. Now I realized that it is possible to specify several parsing options. So my question is what the most lax / compatible setting for reading XMP data would be. The following options are available and I would set the options to the following values:

ParseOptions po = ...;            
po.setAcceptLatin1(true);
po.setDisallowDoctype(false);
po.setFixControlChars(true);
po.setOmitNormalization(true);
po.setRequireXMPMeta(false);
po.setStrictAliasing(false);

Are these the most lax parsing options (in terms of reading compatibility)?

could be use in VS2019?

Expected Behaviour

Actual Behaviour

Reproduce Scenario (including but not limited to)

Steps to Reproduce

Platform and Version

Sample Code that illustrates the problem

Logs taken while reproducing problem

VS2019 Support

Would be great to support Visual Studio 2019.
It is tedious to keep old VS versions because important libraries are not updated.

Test suite failures on big-endian architectures

Hi,

I'm the Debian maintainer of exempi
Exempi is a port of the Adobe XMP SDK to work on UNIX and to be built with autotools.

https://gitlab.freedesktop.org/libopenraw/exempi

Running the test suite on various architectures, results in the following failure on big-endian architectures like s390x:

FAIL: tests/testcore
====================

Running ../samples/source/dumpmainxmp ./../samples/testfiles/BlueSquare.ai
Running ../samples/source/dumpmainxmp ./../samples/testfiles/BlueSquare.eps
Running ../samples/source/dumpmainxmp ./../samples/testfiles/BlueSquare.gif
terminate called after throwing an instance of 'XMP_Error'
Aborted
Failed
FAIL tests/testcore.sh (exit status: 255)

A backtrace of running the test manually:

Starting program: /home/biebl/exempi/exempi-2.6.2/samples/source/dumpmainxmp samples/testfiles/BlueSquare.gif

Program received signal SIGABRT, Aborted.
0x000003fffd7c1d60 in raise () from /lib/s390x-linux-gnu/libc.so.6
#0  0x000003fffd7c1d60 in raise () from /lib/s390x-linux-gnu/libc.so.6
No symbol table info available.
#1  0x000003fffd7a495c in abort () from /lib/s390x-linux-gnu/libc.so.6
No symbol table info available.
#2  0x000003fffdbc9736 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/s390x-linux-gnu/libstdc++.so.6
No symbol table info available.
#3  0x000003fffdbc7026 in ?? () from /usr/lib/s390x-linux-gnu/libstdc++.so.6
No symbol table info available.
#4  0x000003fffdbc70a0 in std::terminate() () from /usr/lib/s390x-linux-gnu/libstdc++.so.6
No symbol table info available.
#5  0x000003fffdbc7392 in __cxa_throw () from /usr/lib/s390x-linux-gnu/libstdc++.so.6
No symbol table info available.
#6  0x000002aa00024b1c in TXMPFiles<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::OpenFile (
    this=this@entry=0x3ffffffee70, filePath=filePath@entry=0x3fffffff7ad "samples/testfiles/BlueSquare.gif", 
    format=format@entry=538976288, openFlags=openFlags@entry=1) at ../../public/include/client-glue/TXMPFiles.incl_cpp:313
        wResult = {errMessage = 0x2aa001cb9b0 "Out of range seek operation", ptrResult = 0x2aa0013513c, floatResult = 0, 
          int64Result = 0, int32Result = 9}
        ok = <optimized out>
#7  0x000002aa0001e90a in ProcessFile (fileName=0x3fffffff7ad "samples/testfiles/BlueSquare.gif") at DumpMainXMP.cpp:83
        ok = <optimized out>
        buffer = "Dumping main XMP for samples/testfiles/BlueSquare.gif\000\217\314\000\000\002\252\000\033\371\240\000\000\002\252\000\a-\310\000\000\003\377\377\377\357X\000\000\003\377\377\377\357P\000\000\003\377\375\377W0\000\000\000\000\000\000\vg\000\000\002\252\000\033\367\300\000\000\003\377\375\372\257\230\000\000\002\252\000\a)\350\000\000\002\252\000\006S\210\000\000\003\377\377\377\356\250", '\000' <repeats 15 times>, "\002\000\000\000\000\000\000\000\000\000\000\002\252\000\033\367\300\000\000\000\000MP2 \000\000\002\252\000\034\256\260MP2 \000\006/$"...
        xmpMeta = {
          _vptr.TXMPMeta = 0x2aa0016f4c8 <vtable for TXMPMeta<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >+16>, xmpRef = 0x2aa001caf00}
        xmpFile = {
          _vptr.TXMPFiles = 0x2aa0016f508 <vtable for TXMPFiles<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >+16>, xmpFilesRef = 0x2aa001cb080}
        format = 4294962648
        openFlags = 1023
        handlerFlags = 4256987410
        xmpPacket = {offset = -1, length = -1, padSize = 0, charForm = 0 '\000', writeable = 0 '\000', hasWrapper = 0 '\000', 
          pad = 0 '\000'}
        offset = <optimized out>
        length = <optimized out>
#8  0x000002aa0001c258 in main (argc=<optimized out>, argv=<optimized out>) at DumpMainXMP.cpp:127
        i = <optimized out>
        options = 2

Full build logs can be found at https://buildd.debian.org/status/package.php?p=exempi

Useful documentation https://wiki.debian.org/ArchitectureSpecificsMemo

Does not build with Xcode 12

Maybe also older versions of Xcode but 12 is what I'm using and getting this result after executing GenerateXMPToolkitSDK_mac.sh:

Check dependencies
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=arm64 arm64e i386 x86_64, EXCLUDED_ARCHS=(
arm64,
arm64e
)).

** BUILD FAILED **

Not really sure why it would assume active arch=arm64 as it is on an Intel Mac running macOS 10.15.6
And admittedly I'm not an expert cmake user

UTF-8 Issues

Is this project still active??

I have serious doubts since the seems to at least one topic from more than 2 month ago which looks like some sort of SPAM and it has not been removed.

Still, I do have an issue with trying to get the correct string data from JPGs which have UTF-9 encode strings.

The seem to be some UTF-8 related option flag bits, but there seem to be no information one how they are expected to be used and what they are expected to do.

For now just a sign that there is any point in asking here would be a good start

GetXMP() for eps file

Expected Behaviour

GetXMP() returns the correct XMP packet for test.eps, the same XMP packet as after using PacketScanning.

Actual Behaviour

The problem introduced with XMPLib update. In the previous version of XMPLib(5.1.2, year 2011), we called SXMPFiles::GetXMP() and it returned false (does not contain XMP metadata), and we reopened the same SXMPFiles file with kXMPFiles_OpenUsePacketScanning flag and used the same method SXMPFiles::GetXMP(). But in new version of XMPLib, the first call SXMPFiles::GetXMP returns true (contains XMP), so since successful we don't try to reopen the file with PacketScanning. Looks like the new XMPLib started supporting *.eps files without PacketScanning. If PacketScanning is used in the new XMPLib, the result will be the same as in the previous version and will provide more information than without PacketScanning. 450 lines of information using PacketScanning vs 16 lines without PacketScanning in the extracted xmp file.

Our test.eps file contains only one XMP packet, which is located in the middle of the file. XMPLib uses its id. But the rest of the information, for example, xmp:CreatorTool, xmp:CreateDate, is used from the embedded information of the eps file itself. The beginning of the eps file contains embedded eps information. If you change XMP packet, then a new XMP packet will be added to the middle of the file before the old XMP packet and will have the same id. I have tested with other eps file mathematica.eps, which also contains the XMP packet located in the middle of the file. GetXMP() returns the correct XMP packet for mathematica.eps. I also noticed that our test.eps file does not contain the %ADO_ContainsXMP: <option> marker, which is desirable according to the specification. If you resave the test.epsfile in Visual Studio Code, then GetXMP() returns the correct XMP packet, but in this case, some binary characters may be replaced.

I attached the files : test.eps, withoutPacketScanning.xmp, withPacketScanning.xmp
testFiles.zip

Platform and Version

Tested on Windows 11 with latest XMPLib

Sample Code that illustrates the problem

    void
    extractXMPUsingScanner( const QString& sourceFileName, std::string& rawPacket )
    {
        try
        {
            SXMPFiles file;
            if ( file.OpenFile( sourceFileName,
                                kXMP_UnknownFile,
                                kXMPFiles_OpenForRead | kXMPFiles_OpenUsePacketScanning ) )
            {
                file.GetXMP( nullptr, &rawPacket );
                file.CloseFile();
            }
        }
        catch ( const XMP_Error& exception )
        {
            // HandleXMPException( exception, sourceFileName );
        }
    }

        std::string& rawPacket;
        try
        {
            SXMPFiles file;

            XMP_OptionBits openFlags =
                kXMPFiles_OpenForRead | kXMPFiles_OpenStrictly ;

            file.OpenFile( sourceFileName,
                           kXMP_UnknownFile,
                           openFlags );
            bool theRawPacketExtractFailed = !file.GetXMP( nullptr, &rawPacket );

            file.CloseFile();

            if ( theRawPacketExtractFailed )
            {
                // log( "XMP SDK could not extract XMP packet from file '%1'; trying to search XMP using packet scanning" ),
                //         QFileInfo( sourceFileName ).fileName() );
                extractXMPUsingScanner( sourceFileName, rawPacket );
            }
        }
        catch ( const XMP_Error& exception )
        {
            // HandleXMPException( exception, sourceFileName );
        }

Request for an update for Apple Silicon arch

I downloaded 2010.1 source code and after some hacking and tuning, I finally successfully built dynamic frameworks from the generated project.

But I have a very weird problem with the static builds.

  • Debug build produces two .a files as expected (each more than 50Mb).
  • Archive build produces an .xcarchive file with just 300+ BYTES (not Kb).

I believe I am doing something wrong. It's better to leave this for the experts. So please release an update to address this issue.

Exif Date missing seconds values

I started from SDK code in "samples/source/ModifyingXMP.cpp".
I just extract XMP metadata from my photo source and reinject it in my new photo.
Fields "Create Date" and "Date/Time Original" are missing seconds values. Here are the values I get when inspecting metadata with exiftool command line:

Photo source:
Create Date : 2021:07:25 12:00:00
Date/Time Original : 2021:07:25 12:00:00

New photo:
Create Date : 2021:07:25 12:00
Date/Time Original : 2021:07:25 12:00:

Windows batch file - missing options

The readme text says there are 6 options, but when the batch file is run, only 4 options are presented. Options to select 32-bit versions are missing.
But even selecting 'Build all' bombs.

Question: Inserting Localized Text Item Into Struct Field

I've searched the repo and couldn't seem to find a straightforward answer to this.

According to IPTC specifications, ArtworkOrObject is a bag of ArtworkOrObjectDetails structs. Some of those details e.g. AOContentDescription or AOCreator are arrays of information within the ArtworkOrObjectDetails struct. What is the best way to go about setting the value of a struct field to a Bag or AltLang or inserting array items into the value portion of a struct field?

Copy XMP data from file to file corrupts exif data

Hello

The following code corrupts exif meta data for some files.

XMP_OptionBits options = 0;
SXMPFiles::Initialize(options);
SXMPMeta meta;
{
SXMPFiles myFile;
XMP_OptionBits opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUseSmartHandler;

ok = myFile.OpenFile("from.jpg", kXMP_UnknownFile, opts);
if (ok)
{
    ok = myFile.GetXMP(&meta);
}

}

SXMPFiles myFile;
XMP_OptionBits opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUseSmartHandler;
bool ok = myFile.OpenFile("to.jpg", kXMP_UnknownFile, opts);
myFile.PutXMP(meta);
myFile.CloseFile();

The final.jpg contains wrong DateTimeOriginal field. ( time is truncated - please see attached error.jpg screenshot
error
)

Attached are 3 files illustrating the problem
to
final
from

Could you advice if it is bug in SDK or something wrong with my code ?

Thank you,
Lidia.

Missing AML Examples for Temporal Metadata

Hi

I have recently been introduced to XMP as a way to tag videos with metadata based on specific times/frames. I believe this ability is called temporal metadata and is described in "Partners Guide to XMP for Dynamic Media" (attached below)
DynamicMediaXMPPartnerGuide.pdf
. I could not find a single example or mention of Parts/Tracks/Ingredients/Pantries in this repo that started a new SDK from Jan 2020. Some examples like "AML_AddTimePartComponent" exist in previous repositories from 2016 from an older version of the SDK.

My question is what was the rationale from removing those examples and what is the best ways to learn about temporal XMP from C++ examples in the new SDK as this is a very powerful feature that seems to be veiled in mystery. Using the old SDK is not a viable solution at the moment.

Thank you for your time

XMPFiles::GetXMP() removes attributes with empty string.

I have a png with Embedded xmp data as shown below

<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 6.0.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:TMU="http://torontomu.ca/XMP/1.0/"
TMU:action=""
TMU:jobNumber=""
TMU:userEmail=""
TMU:userName=""/>
</rdf:RDF>
</x:xmpmeta>

And I am reading the embedded xmp using XMPFiles::GetXMP()

Expected Behaviour

It should return the complete xmp.

Actual Behaviour

It returns empty string because the attributes values are empty string.

Steps to Reproduce

  1. Build the sample application ReadingXMP.exe.
  2. create a Sample file with embedded xmp with attributes with empty string.
  3. Run ReadingXMP.exe , pass Sample file as argument.
  4. Observe that in the returned xmp the attributes with empty values are removed.

Platform and Version

Windows 10

XMP can't be read from png files (iOS)

XMP information can be read from jpg and pdf, but cannot be read from png files。

Expected Behaviour

read XMP information from jpg、png

Actual Behaviour

XMP information can be read from jpg and pdf, but cannot be read from png files。

Reproduce Scenario (including but not limited to)

test with BlueSquare.png in this project, GetXMP method return no XMP

Steps to Reproduce

test with BlueSquare.png in this project, GetXMP method return no XMP

Platform and Version

iOS 11.2.6
Xcode 12.1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.