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 70 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 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ xcode_build*
msvc_build*
cygwin_build*
mingw_build*
linux_build*
po/POTFILES
po/remove-potcdate.sed
po/stamp-po
Expand Down
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ git:

env:
global:
- COMMON_CMAKE_OPTIONS="-DEXIV2_ENABLE_WEBREADY=ON -DEXIV2_ENABLE_CURL=ON -DEXIV2_BUILD_UNIT_TESTS=ON -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON -DCMAKE_INSTALL_PREFIX=install"
- COMMON_CMAKE_OPTIONS="-DEXIV2_ENABLE_WEBREADY=ON -DEXIV2_ENABLE_CURL=ON -DEXIV2_BUILD_UNIT_TESTS=ON -DEXIV2_ENABLE_BMFF=ON -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON -DCMAKE_INSTALL_PREFIX=install"

matrix:
include:
Expand Down
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
36 changes: 33 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ The file ReadMe.txt in a build bundle describes how to install the library on th
16. [Cross Platform Build and Test on Linux for MinGW](#2-16)
17. [Building with C++11 and other compilers](#2-17)
18. [Static and Shared Libraries](#2-18)
19. [Support for bmff files (CR3, HEIF and AVIF)](#2-19)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Hm, I didn't mean remove HEIC (and from main page neither below)... As per Wikipedia, I believe we should have HEIF, HEIC, and AVIF documented.

The HIF/HEIF is the same as JPG/JPEG IMHO, no need to handle specially.

Copy link
Collaborator

Choose a reason for hiding this comment

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

@clanmills Maybe I just do a PR with what I had in mind?

Copy link
Collaborator

Choose a reason for hiding this comment

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

Yes. My telepathy is down at the moment! Can you wait until this PR has been merged into 0.27-maintenance and then open a new PR.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Sorry, saw this late and already pushed - just minor formatting changes though...

Copy link
Collaborator

@clanmills clanmills Mar 8, 2021

Choose a reason for hiding this comment

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

Milos. Please don't make cosmetic changes to existing code that isn't part of the PR. It introduces changes between old-master and 0.27-maintenance which makes porting fixes from old-master more tricky. @neheb did a lot of work last Fall on 'master' and it would be good to see if we can merge his great work into 0.27-maintenance.

@neheb: I'm sorry to let you know that the Team has decided to hibernate 'master'. #1466 (comment)

@piponazo and @hassec have both proposed reformatting all the code with clang-tidy. I think we should consider doing that on 'main' when that ships as 0.28. Currently scheduled for 2021-09-15.

Copy link
Collaborator

@kmilos kmilos Mar 8, 2021

Choose a reason for hiding this comment

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

Apologies Robin, I reverted my commits now. I'll do just the relevant subset once this PR is merged.

Copy link
Collaborator

Choose a reason for hiding this comment

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

@kmilos Thank you for both making the change and reverting the change. I know you intended well with those changes.

3. [License and Support](#3)
1. [License](#3-1)
2. [Support](#3-2)
Expand Down Expand Up @@ -127,6 +128,7 @@ option( EXIV2_ENABLE_XMP "Build with XMP metadata support" ON
option( EXIV2_ENABLE_EXTERNAL_XMP "Use external version of XMP" OFF )
option( EXIV2_ENABLE_PNG "Build with png support (requires libz)" ON )
...
option( EXIV2_ENABLE_BMFF "Build with BMFF support" OFF )
577 rmills@rmillsmm:~/gnu/github/exiv2/exiv2 $
```

Expand Down Expand Up @@ -581,13 +583,18 @@ The level of thread safety within Exiv2 varies depending on the type of metadata
Therefore, multi-threaded applications need to ensure that these two XMP functions are serialized, e.g., by calling them from an initialization section which is run before any threads are started. All exiv2 sample applications begin with:

```cpp
#include <exiv2/exiv2.hpp>
int main(int argc, const char* argv[])
{
Exiv2::XmpParser::initialize();
::atexit(Exiv2::XmpParser::terminate);
#if EXIV2_TEST_VERSION(0,27,4)
Exiv2::enableBMFF(true);
#endif
...
}
```
The use of the _**thread unsafe function**_ Exiv2::enableBMFF(true) is discussed in [2.19 Support for bmff files](#2-19)

[TOC](#TOC)

Expand All @@ -604,6 +611,7 @@ The exiv2 command-line program and sample applications call the following at the
```cpp
Exiv2::XmpParser::initialize();
::atexit(Exiv2::XmpParser::terminate);
Exiv2::enableBMFF(true);
```

[TOC](#TOC)
Expand Down Expand Up @@ -773,6 +781,24 @@ This is discussed: [https://github.com/Exiv2/exiv2/issues/1230](https://github.c

[TOC](#TOC)

<div id="2-19">

2.19 Support for bmff files (CR3, HEIF and AVIF)

**Attention is drawn to the possibility that bmff support may be the subject of patent rights. _Exiv2 shall not be held responsible for identifying any or all such patent rights. Exiv2 shall not be held responsible for the legal consequences of the use of this code_.**

Access to the bmff code is guarded in two ways. Firstly, you have to build the library with the cmake option: `-DEXIV2_ENABLE_BMFF=On`. Secondly, the application must enable bmff support at run-time by calling the following function.

```cpp
EXIV2API bool enableBMFF(bool enable);
```

Applications may wish the provide a preference setting to enable bmff support and thereby place the responsibility for the use of this code with the user of the application.

It is recommended that you enclose the call to `enableBMFF()` with the compile time macro EXIV2\_TEST\_VERSION to ensure that your code builds cleanly on earlier versions of Exiv2. It is recommended that you call enableBMFF() at process start-up as it is not threadsafe. A code snippet is provided in [2.14 Thread Safety](#2-14).

[TOC](#TOC)

<div id="3">

## 3 License and Support
Expand All @@ -784,7 +810,7 @@ All project resources are accessible from the project website.

### 3.1 License

Copyright (C) 2004-2019 Exiv2 authors.
Copyright (C) 2004-2021 Exiv2 authors.
You should have received a copy of the file [COPYING](COPYING) which details the GPLv2 license.

Exiv2 is free software; you can redistribute it and/or modify
Expand Down Expand Up @@ -1092,6 +1118,8 @@ Please note that the platform MinGW/msys2 32 is obsolete and superceded by MinGW
#### MinGW/msys2 64 bit
Install: [https://repo.msys2.org/distrib/x86\_64/msys2-x86\_64-20200903.exe](https://repo.msys2.org/distrib/x86_64/msys2-x86_64-20200903.exe)

The file `appveyor_mingw_cygwin.yml` has instructions to configure the AppVeyor CI to configures itself to build Exiv2 on MinGW/msys2 and Cygwin/64.

I use the following batch file to start the MinGW/msys2 64 bit bash shell from the Dos Command Prompt (cmd.exe)

```bat
Expand Down Expand Up @@ -1154,7 +1182,9 @@ Please note that the platform Cygwin/32 is obsolete and superceded by Cygwin/64.
Download: [https://cygwin.com/install.html](https://cygwin.com/install.html) and run setup-x86_64.exe. I install into c:\\cygwin64

You need:
make, cmake, curl, gcc, gettext-devel pkg-config, dos2unix, tar, zlib-devel, libexpat1-devel, git, python3-interpreter, libiconv, libxml2-utils, libncurses
make, cmake, curl, gcc, gettext-devel pkg-config, dos2unix, tar, zlib-devel, libexpat1-devel, git, libxml2-devel python3-interpreter, libiconv, libxml2-utils, libncurses, libxml2-devel libxslt-devel python38 python38-pip python38-libxml2

The file `appveyor_mingw_cygwin.yml` has instructions to configure the AppVeyor CI to configures itself to build Exiv2 on MinGW/msys2 and Cygwin/64.

To build unit tests, you should install googletest-release-1.8.0 as discussed [4.3 Unit tests](#4-3)

Expand Down Expand Up @@ -1304,5 +1334,5 @@ $ sudo pkg install developer/gcc-7

[TOC](#TOC)

Written by Robin Mills<br>robin@clanmills.com<br>Updated: 2020-11-20
Written by Robin Mills<br>robin@clanmills.com<br>Updated: 2021-03-05

2 changes: 1 addition & 1 deletion appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ build_script:
- cmd: conan --version
- cmd: conan install .. -o webready=%WEBREADY% --build missing
- cmd: echo %CMAKE_GENERATOR%
- cmd: cmake -G "%CMAKE_GENERATOR%" -DEXIV2_TEAM_WARNINGS_AS_ERRORS=%WARNINGS_AS_ERRORS% -DCMAKE_BUILD_TYPE=Release -DEXIV2_ENABLE_NLS=OFF -DEXIV2_ENABLE_PNG=ON -DEXIV2_ENABLE_WEBREADY=%WEBREADY% -DEXIV2_BUILD_UNIT_TESTS=%UNIT_TESTS% -DCMAKE_INSTALL_PREFIX=install ..
- cmd: cmake -G "%CMAKE_GENERATOR%" -DEXIV2_TEAM_WARNINGS_AS_ERRORS=%WARNINGS_AS_ERRORS% -DCMAKE_BUILD_TYPE=Release -DEXIV2_ENABLE_NLS=OFF -DEXIV2_ENABLE_PNG=ON -DEXIV2_ENABLE_BMFF=ON -DEXIV2_ENABLE_WEBREADY=%WEBREADY% -DEXIV2_BUILD_UNIT_TESTS=%UNIT_TESTS% -DCMAKE_INSTALL_PREFIX=install ..
- cmd: cmake --build . --config Release
- cmd: cmake --build . --config Release --target install
- cmd: cd bin
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
2 changes: 1 addition & 1 deletion ci/test_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ def run(cmd):
type=str,
nargs='?',
default="-DEXIV2_TEAM_EXTRA_WARNINGS=ON -DEXIV2_ENABLE_VIDEO=ON "
"-DEXIV2_ENABLE_WEBREADY=ON -DEXIV2_BUILD_UNIT_TESTS=ON "
"-DEXIV2_ENABLE_WEBREADY=ON -DEXIV2_BUILD_UNIT_TESTS=ON -DEXIV2_ENABLE_BMFF=ON "
"-DBUILD_WITH_CCACHE=ON -DEXIV2_ENABLE_CURL=ON"
)

Expand Down
6 changes: 6 additions & 0 deletions cmake/compilerFlagsExiv2.cmake
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
# These flags only applies to exiv2lib, and the applications, but not to the xmp code

include(CheckCXXCompilerFlag)

if (COMPILER_IS_GCC OR COMPILER_IS_CLANG) # MINGW, Linux, APPLE, CYGWIN
if ( EXIV2_TEAM_WARNINGS_AS_ERRORS )
add_compile_options(-Werror -Wno-error=deprecated-declarations)
check_cxx_compiler_flag(-Wno-error=deprecated-copy DEPRECATED_COPY)
if ( DEPRECATED_COPY)
add_compile_options(-Wno-error=deprecated-copy)
endif ()
endif ()

if ( EXIV2_TEAM_EXTRA_WARNINGS )
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
170 changes: 170 additions & 0 deletions include/exiv2/bmffimage.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
// ***************************************************************** -*- 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"
#include "iostream"

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


struct Iloc
{
Iloc(uint32_t ID = 0, uint32_t start = 0, uint32_t length = 0) : ID_(ID), start_(start), length_(length){};
virtual ~Iloc(){};

uint32_t ID_;
uint32_t start_;
uint32_t length_;

std::string toString() const;
}; // class Iloc

// *****************************************************************************
// 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);
//@}

//@{
/*!
@brief parse embedded tiff file (Exif metadata)
@param root_tag root of parse tree Tag::root, Tag::cmt2 etc.
@param length tiff block length
@param start offset in file (default, io_->tell())
@
*/
void parseTiff(uint32_t root_tag, uint32_t length);
void parseTiff(uint32_t root_tag, uint32_t length,uint32_t start);
//@}
hassec marked this conversation as resolved.
Show resolved Hide resolved

//@{
/*!
@brief parse embedded xmp/xml
@param length xmp block length
@param start offset in file
@
*/
void parseXmp(uint32_t length,uint32_t start);
//@}

//! @name Manipulators
//@{
void readMetadata() /* override */;
void writeMetadata() /* override */;
void setComment(const std::string& comment) /* override */;
void printStructure(std::ostream& out, Exiv2::PrintStructureOption option,int depth);
//@}

//! @name Accessors
//@{
std::string mimeType() const /* override */;
int pixelWidth() const;
int pixelHeight() const;
//@}

Exiv2::ByteOrder endian_ ;

private:
void openOrThrow();
/*!
@brief recursiveBoxHandler
@throw Error if we visit a box more than once
@return address of next box
@warning This function should only be called by readMetadata()
*/
long boxHandler(std::ostream& out=std::cout, Exiv2::PrintStructureOption option=kpsNone,int depth = 0);
std::string indent(int i)
{
return std::string(2*i,' ');
}

uint32_t fileType_;
std::set<uint64_t> visits_;
uint64_t visits_max_;
uint16_t unknownID_; // 0xffff
uint16_t exifID_;
uint16_t xmpID_;
std::map<uint32_t, Iloc> ilocs_;
bool bReadMetadata_;
//@}

/*!
@brief box utilities
*/
std::string toAscii(long n);
std::string boxName(uint32_t box);
bool superBox(uint32_t box);
bool fullBox(uint32_t box);
std::string uuidName(Exiv2::DataBuf& uuid);

}; // 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
Loading