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

[WIP] Add ISO/IEC Base Media File Format #1458

Closed
wants to merge 8 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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_ISOBMFF "Build with ISO 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 ISO BMFF support.
#cmakedefine EXV_ENABLE_ISOBMFF

// 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_ISOBMFF ${EXIV2_ENABLE_ISOBMFF})
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 ISO BMFF support: " EXIV2_ENABLE_ISOBMFF )
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
127 changes: 127 additions & 0 deletions include/exiv2/bmffimage.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
// ***************************************************************** -*- 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 enableISOBMFF(bool enable = true);

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

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

/*!
@brief Class to access ISO BMFF images.
*/
class EXIV2API BmffImage : public Image {
public:
//! @name Creators
//@{
/*!
@brief Constructor to open a ISO/IEC 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
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);
//@}

}; // 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 ISO 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 ISO 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_ISOBMFF
#include "bmffimage.hpp"
#endif// EXV_ENABLE_ISOBMFF
#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
}

/*!
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