Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Base Media File Format #1475

Merged
merged 79 commits into from
Mar 10, 2021
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
92469f4
[WIP] Add ISO/IEC Base Media File Format
1div0 Jan 24, 2021
460a802
Fix image handler to give jp2image code higher priority than the next…
clanmills Jan 24, 2021
0844e1b
Rename class ISOBMFF => class bmffImage to match other image handlers…
clanmills Jan 25, 2021
fa39234
Fixing Linux build/test issues.
clanmills Jan 25, 2021
f5c6e75
Fix Linux build-breaker when ENABLE_ISOBMFF=False and EXIV2_TEAM_WARN…
clanmills Jan 25, 2021
e19fca6
Small corrections
1div0 Jan 26, 2021
2104665
Modified ci/install.sh to install cmake before dependencies.
clanmills Jan 26, 2021
c608148
[WIP] Added box types
1div0 Jan 27, 2021
f0a321d
[WIP] Base Media File Format
1div0 Feb 16, 2021
7b5854e
[WIP] Redefine tags
1div0 Feb 16, 2021
81e0f99
[WIP] Another try
1div0 Feb 16, 2021
4fa0a88
[WIP] Correction
1div0 Feb 16, 2021
04481dd
[WIP] 64-bit length
1div0 Feb 22, 2021
a75ac74
[WIP] Correction to make Travis CI happy
1div0 Feb 22, 2021
0360a7d
[WIP] Yet another type cast correction to make Travis CI happy
1div0 Feb 22, 2021
6d13e44
WIP: Refactored readMetadata() into recursive boxHandler()
clanmills Feb 23, 2021
630fb23
Fixing a build breaker.
clanmills Feb 23, 2021
ea96814
Fix linux/CI build breaker.
clanmills Feb 24, 2021
0b4b7c6
Fix msvc/CI build breakers.
clanmills Feb 24, 2021
1b47e1e
Fix linux/CI build breaker.
clanmills Feb 24, 2021
64866cc
Fixing warnings from LGTM/CI.
clanmills Feb 24, 2021
8976a23
More fixes for LGTM/CI warnings.
clanmills Feb 24, 2021
8d7133d
WIP: Added class Iloc and related code.
clanmills Feb 24, 2021
bafea0f
[WIP] Fixed Image Spatial Extents Property Handling
1div0 Feb 24, 2021
4a96025
Fixed recursion issue in the meta box.
clanmills Feb 24, 2021
f190f49
Tidying up. 1. pixelHeight_. 2. refactored indenter() -> indent(). 3.…
clanmills Feb 25, 2021
29f3d5c
introduce parseTiff method to parse exif
hassec Feb 25, 2021
28b41f5
run clang-format on new files
hassec Feb 25, 2021
108670b
Corrected format string
1div0 Feb 25, 2021
4ff8fcd
Updating .gitignore.
clanmills Feb 25, 2021
913ee33
Parse Exif in .HEIC/.AVIF
clanmills Feb 25, 2021
9515e46
Cleanup. 1. Recursively process uuid/cano box. 2. Fix LGTM/CI sprint…
clanmills Feb 25, 2021
4ae0a1d
Tidy up. Rename Tag::cr3_exif -> Tag:cmt2
clanmills Feb 25, 2021
4d3af08
Add CR3 image dimensions
1div0 Feb 25, 2021
3ed67d3
Update README.md
1div0 Feb 25, 2021
5c77888
Revised following code review by @hassec. Thank You, Christoph.
clanmills Feb 25, 2021
c46e800
Add artist tag
1div0 Feb 25, 2021
dcfe538
Revert "Add artist tag"
1div0 Feb 25, 2021
44d976c
Remove bmffimage::printStructure() as discussed in review with @hasse…
clanmills Feb 26, 2021
0250046
Adding test images.
clanmills Feb 28, 2021
ca180e0
Remove executable bits from test data files
1div0 Feb 28, 2021
ea1c918
Added parseXmp() to parse Xmp metadata.
clanmills Feb 28, 2021
4ca05ed
Fix .CR3 files to call parseXmp().
clanmills Feb 28, 2021
f69de0d
Rename test image.
clanmills Mar 2, 2021
fd9cb67
WIP: adding BmffImage::printStructure() and support for colr box.
clanmills Mar 2, 2021
c84274e
Cosmetic change to -pR/-pS output.
clanmills Mar 2, 2021
0e1412a
Adding HIF tests.
clanmills Mar 2, 2021
55d2201
Changed CI build default -DEXIV2_ENABLE_BMFF=On. Fixed suite to run …
clanmills Mar 3, 2021
71d29fe
Fix MSVC build breaker and modify test_pr_1475_HIF.py to run on Windows.
clanmills Mar 3, 2021
70eaef9
Renamed a test file.
clanmills Mar 4, 2021
4d70f5c
Test suite updates.
clanmills Mar 4, 2021
4adc301
Added 2.19 Support for bmff files
clanmills Mar 5, 2021
19fe69c
Updated for bmff.
clanmills Mar 5, 2021
b983a9d
Re-awaken obsolete command-line argument --binary and store class Task.
clanmills Mar 5, 2021
df68648
refactored setModeAndPrintStructure() to respect class Task.binary_ w…
clanmills Mar 5, 2021
a0e6361
Minor corrections and clarification concerning enableBMFF().
clanmills Mar 5, 2021
ee4d143
Fix box.length == to use bigEndian decode! Fix toAscii() to emit on …
clanmills Mar 5, 2021
c3e7011
Test suite update.
clanmills Mar 5, 2021
0ad4645
With good fortune, bmffimage is ready for review.
clanmills Mar 6, 2021
5410395
Replaced the ugly code in Exiv2::base64encode() and update the test s…
clanmills Mar 6, 2021
80e2030
Fix Linux build breakers.
clanmills Mar 6, 2021
1eeeece
Replaced Exiv2::base64encode() because last effort failed unit test o…
clanmills Mar 6, 2021
3bfea0c
This should be it. Test suite fixed.
clanmills Mar 6, 2021
c59c53a
Trick to avoid msvc issue with final line of base64 data.
clanmills Mar 6, 2021
2f2dd7d
Fix ICC profile handling (my bad, iOS files are correct).
clanmills Mar 7, 2021
21c610e
Restoring i < dataLength trigraph that I should not have removed.
clanmills Mar 7, 2021
db9bec3
Restore -pC --binary to output everything. Test suite updated to suit.
clanmills Mar 7, 2021
87e536d
Fix #1358. This should be in a different PR. Keep changes to base64…
clanmills Mar 8, 2021
f1303cb
Another effort to fix base64decode and associated unit test.
clanmills Mar 8, 2021
ae66869
Updated to adopt Review suggestions by @kmilos. Thank You, Milos.
clanmills Mar 8, 2021
2c0f3c2
Include HEIC type in docs
kmilos Mar 8, 2021
e09d093
Minor whitespace formatting
kmilos Mar 8, 2021
4c52861
Fix msvc build breaker.
clanmills Mar 8, 2021
0da1a50
Revert style changes
kmilos Mar 8, 2021
9d28943
Simplify functions: runTest(), verbose_version()
LeoHsiao1 Mar 9, 2021
e3fd0c6
Thank You @piponazo for the code review. I've made the changes you r…
clanmills Mar 9, 2021
212f1b5
Following review by @piponazo, I am clarifying the bool return from E…
clanmills Mar 10, 2021
02477fa
Following review by @hassec, I use static base64_encoding vector in b…
clanmills Mar 10, 2021
19aab43
Move system_tests.runTest() and system_tests.verbose_version() to sys…
clanmills Mar 10, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ option( EXIV2_ENABLE_WIN_UNICODE "Use Unicode paths (wstring) on Windows"
option( EXIV2_ENABLE_WEBREADY "Build webready support into library" OFF )
option( EXIV2_ENABLE_CURL "USE Libcurl for HttpIo (WEBREADY)" OFF )
option( EXIV2_ENABLE_SSH "USE Libssh for SshIo (WEBREADY)" OFF )
option( EXIV2_ENABLE_BMFF "Build with BMFF support" OFF )

option( EXIV2_BUILD_SAMPLES "Build sample applications" ON )
option( EXIV2_BUILD_EXIV2_COMMAND "Build exiv2 command-line executable" ON )
Expand Down
5 changes: 3 additions & 2 deletions ci/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ python3 --version
if [[ "$(uname -s)" == 'Linux' ]]; then
sudo apt-get update

sudo apt-get install cmake
if [[ "$(lsb_release -cs)" == 'focal' ]]; then
# In Ubuntu 20.04 python-pip does not exist. Furthermore we need to have the alias python for python3
sudo apt-get install cmake zlib1g-dev libssh-dev python3-pip python-is-python3 libxml2-utils
sudo apt-get install zlib1g-dev libssh-dev python3-pip python-is-python3 libxml2-utils
else
sudo apt-get install cmake zlib1g-dev libssh-dev python-pip libxml2-utils
sudo apt-get install zlib1g-dev libssh-dev python-pip libxml2-utils
fi

if [ -n "$WITH_VALGRIND" ]; then
Expand Down
3 changes: 3 additions & 0 deletions cmake/config.h.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
// Define if you want translation of program messages to the user's native language
#cmakedefine EXV_ENABLE_NLS

// Define if you want BMFF support.
#cmakedefine EXV_ENABLE_BMFF

// Define if you want video support.
#cmakedefine EXV_ENABLE_VIDEO

Expand Down
1 change: 1 addition & 0 deletions cmake/generateConfigFile.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ if (${EXIV2_ENABLE_WEBREADY})
set(EXV_USE_SSH ${EXIV2_ENABLE_SSH})
set(EXV_USE_CURL ${EXIV2_ENABLE_CURL})
endif()
set(EXV_ENABLE_BMFF ${EXIV2_ENABLE_BMFF})
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix alignment?

set(EXV_ENABLE_VIDEO ${EXIV2_ENABLE_VIDEO})
set(EXV_ENABLE_WEBREADY ${EXIV2_ENABLE_WEBREADY})
set(EXV_HAVE_LENSDATA ${EXIV2_ENABLE_LENSDATA})
Expand Down
1 change: 1 addition & 0 deletions cmake/printSummary.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ if ( EXIV2_ENABLE_EXTERNAL_XMP )
else()
OptionOutput( "XMP metadata support: " EXIV2_ENABLE_XMP )
endif()
OptionOutput( "Building BMFF support: " EXIV2_ENABLE_BMFF )
OptionOutput( "Native language support: " EXIV2_ENABLE_NLS )
OptionOutput( "Conversion of Windows XP tags: " EXIV2_ENABLE_PRINTUCS2 )
OptionOutput( "Nikon lens database: " EXIV2_ENABLE_LENSDATA )
Expand Down
1 change: 1 addition & 0 deletions include/exiv2/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
install(FILES
asfvideo.hpp
basicio.hpp
bmffimage.hpp
bmpimage.hpp
config.h
convert.hpp
Expand Down
129 changes: 129 additions & 0 deletions include/exiv2/bmffimage.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
// ***************************************************************** -*- C++ -*-
/*
* Copyright (C) 2021 Exiv2 authors
* This program is part of the Exiv2 distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
*/

#pragma once

// *****************************************************************************
#include "exiv2lib_export.h"

// included header files
#include "image.hpp"

// *****************************************************************************
// namespace extensions
namespace Exiv2
{
EXIV2API bool enableBMFF(bool enable = true);
hassec marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should not this function has return type void ? I see that in the examples and documentation we do not use the returned value.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The return value is important. It tells the caller if the code has been built with BMFF support. In the documentation and samples, we ignore the return value. However, "real" applications can use this to "gray out" a UI option such as "Use bmff support", or to post an alert such as bmff support cannot be enabled on this platform.


// *****************************************************************************
// class definitions

// Add Base Media File Format to the supported image formats
namespace ImageType {
const int bmff = 15; //!< BMFF (bmff) image type (see class BMFF)
}

/*!
@brief Class to access BMFF images.
*/
class EXIV2API BmffImage : public Image {
public:
//! @name Creators
//@{
/*!
@brief Constructor to open a BMFF image. Since the
constructor can not return a result, callers should check the
good() method after object construction to determine success
or failure.
@param io An auto-pointer that owns a BasicIo instance used for
reading and writing image metadata. \b Important: The constructor
takes ownership of the passed in BasicIo instance through the
auto-pointer. Callers should not continue to use the BasicIo
instance after it is passed to this method. Use the Image::io()
method to get a temporary reference.
@param create Specifies if an existing image should be read (false)
or if a new file should be created (true).
*/
BmffImage(BasicIo::AutoPtr io, bool create);
//@}

//! @name Manipulators
//@{
void readMetadata() /* override */ ;
void writeMetadata() /* override */ ;

/*!
@brief Print out the structure of image file.
@throw Error if reading of the file fails or the image data is
not valid (does not look like data of the specific image type).
@warning This function is not thread safe and intended for exiv2 -pS for debugging.
*/
void printStructure(std::ostream& out, PrintStructureOption option,int depth) /* override */ ;

/*!
@brief Todo: Not supported yet(?). Calling this function will throw
an instance of Error(kerInvalidSettingForImage).
*/
void setComment(const std::string& comment) /* override */ ;
//@}

//! @name Accessors
//@{
std::string mimeType() const /* override */ ;
//@}
#if 0
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove block or add comment why it's there (still testing, debug..)

BmffImage& operator=(const BmffImage& rhs) /* = delete*/ ;
BmffImage& operator=(const BmffImage&& rhs) /* = delete */ ;
BmffImage(const BmffImage& rhs) /* = delete */;
BmffImage(const BmffImage&& rhs) /* = delete */;
#endif

private:
uint32_t fileType;

/*!
@brief Provides the main implementation of writeMetadata() by
writing all buffered metadata to the provided BasicIo.
@param oIo BasicIo instance to write to (a temporary location).

@return 4 if opening or writing to the associated BasicIo fails
*/
void doWriteMetadata(BasicIo& outIo);
//@}

std::string toAscii(long n);

}; // class BmffImage

// *****************************************************************************
// template, inline and free functions

// These could be static private functions on Image subclasses but then
// ImageFactory needs to be made a friend.
/*!
@brief Create a new BMFF instance and return an auto-pointer to it.
Caller owns the returned object and the auto-pointer ensures that
it will be deleted.
*/
EXIV2API Image::AutoPtr newBmffInstance(BasicIo::AutoPtr io, bool create);

//! Check if the file iIo is a BMFF image.
EXIV2API bool isBmffType(BasicIo& iIo, bool advance);
} // namespace Exiv2
3 changes: 3 additions & 0 deletions include/exiv2/exiv2.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@
#include "exiv2/image.hpp"
#include "exiv2/ini.hpp"
#include "exiv2/iptc.hpp"
#ifdef EXV_ENABLE_BMFF
kmilos marked this conversation as resolved.
Show resolved Hide resolved
#include "bmffimage.hpp"
#endif// EXV_ENABLE_BMFF
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space missing before comment

#include "exiv2/jp2image.hpp"
#include "exiv2/jpgimage.hpp"
#include "exiv2/metadatum.hpp"
Expand Down
2 changes: 1 addition & 1 deletion include/exiv2/jp2image.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ namespace Exiv2
// Add JPEG-2000 to the supported image formats
namespace ImageType
{
const int jp2 = 15; //!< JPEG-2000 image type
const int jp2 = 19; //!< JPEG-2000 image type
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the new type using the value 15 and jp2 value has been updated from 15 to 19? Was not possible to keep the previous values for jp2 and use a new one for BMFF?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

15 is used by bmff, and 19 by jp2.

Let's replace that with an enum in 'main'. I didn't want change it to an enum for a "dot" because if it's not broken, don't fix it. However, when we get to 'main/0.28' we can fix this.

509 rmills@rmillsm1:~/gnu/github/exiv2/bmff $ grep 'const int' include/exiv2/*image.hpp 
include/exiv2/bmffimage.hpp:        const int bmff = 15;  //!< BMFF (bmff) image type (see class BMFF)
include/exiv2/bmpimage.hpp:        const int bmp = 14; //!< Windows bitmap (bmp) image type (see class BmpImage)
include/exiv2/cr2image.hpp:        const int cr2 = 7;          //!< CR2 image type (see class Cr2Image)
include/exiv2/crwimage.hpp:        const int crw = 3;          //!< CRW image type (see class CrwImage)
include/exiv2/epsimage.hpp:        const int eps = 18;                     //!< EPS image type
include/exiv2/gifimage.hpp:        const int gif = 11;          //!< GIF image type (see class GifImage)
include/exiv2/image.hpp:        const int none = 0;         //!< Not an image
include/exiv2/jp2image.hpp:        const int jp2 = 19;                     //!< JPEG-2000 image type
include/exiv2/jpgimage.hpp:        const int jpeg = 1;         //!< JPEG image type (see class JpegImage)
include/exiv2/jpgimage.hpp:        const int exv  = 2;         //!< EXV image type (see class ExvImage)
include/exiv2/mrwimage.hpp:        const int mrw = 5;          //!< MRW image type (see class MrwImage)
include/exiv2/orfimage.hpp:        const int orf = 9;          //!< ORF image type (see class OrfImage)
include/exiv2/pgfimage.hpp:        const int pgf = 17;          //!< PGF image type (see class PgfImage)
include/exiv2/pngimage.hpp:        const int png = 6;          //!< PNG image type (see class PngImage)
include/exiv2/psdimage.hpp:        const int psd = 12; //!< Photoshop (PSD) image type (see class PsdImage)
include/exiv2/rafimage.hpp:        const int raf = 8;          //!< RAF image type (see class RafImage)
include/exiv2/rw2image.hpp:        const int rw2 = 16;             //!< RW2 image type (see class Rw2Image)
include/exiv2/tgaimage.hpp:        const int tga = 13; //!< Truevision TARGA (tga) image type (see class TgaImage)
include/exiv2/tiffimage.hpp:        const int tiff = 4;          //!< TIFF image type (see class TiffImage)
include/exiv2/tiffimage.hpp:        const int dng = 4;           //!< DNG image type (see class TiffImage)
include/exiv2/tiffimage.hpp:        const int nef = 4;           //!< NEF image type (see class TiffImage)
include/exiv2/tiffimage.hpp:        const int pef = 4;           //!< PEF image type (see class TiffImage)
include/exiv2/tiffimage.hpp:        const int arw = 4;           //!< ARW image type (see class TiffImage)
include/exiv2/tiffimage.hpp:        const int sr2 = 4;           //!< SR2 image type (see class TiffImage)
include/exiv2/tiffimage.hpp:        const int srw = 4;           //!< SRW image type (see class TiffImage)
include/exiv2/webpimage.hpp:        const int webp = 23; //!< Treating webp as an image type>
510 rmills@rmillsm1:~/gnu/github/exiv2/bmff $ 

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've realised during lunch that you're asking "why not leave jp2 unchanged and set bmff=19?". When I started working with Peter, the only way I could change anything was to send him a patch and that's what I did. I didn't want to discuss what that code means, so I accepted his 15 (even though it's wrong).

You're right. Now that we're cleaning up and the end, I should restore jp2 = 15 and set bmff = 19. Good Catch.

}

/*!
Expand Down
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ add_library( exiv2lib
../include/exiv2/rwlock.hpp
../include/exiv2/slice.hpp
basicio.cpp ../include/exiv2/basicio.hpp
bmffimage.cpp ../include/exiv2/bmffimage.hpp
bmpimage.cpp ../include/exiv2/bmpimage.hpp
convert.cpp ../include/exiv2/convert.hpp
cr2image.cpp ../include/exiv2/cr2image.hpp
Expand Down
Loading