Code Monkey home page Code Monkey logo

heif's People

Contributors

jhippela avatar nokiatech 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  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

heif's Issues

Problems with decoding the 7th tile on JavaScript

Problems with decoding the 7th tile. When you try to decode the 7th tile, then there are problems. Here already wrote, how to solve this problem on c++, but nothing about JavaScript.

I tried to rewrite it on the JS, but nothing came out. Is it even possible?
Somebody did the decoding onJavaScript?

default

Write EXIF tags to HEIF

In example 8 EXIF data is read from a HEIC file. Is it also possible to go the other way around: write EXIF data (for instance read from a JPG file) into a HEIC file?

Add AV1 support

No modern royalty free codec is supported currently.

AV1 is a reasonable option, and has very broad industry adoption.

Can't Find Image Data

I am trying to make a simple Heic image viewer. I was able to link the libraries okay and find the height and width of an image. However, I can't find the routines that get the bits per pixel or the decoded image data.

Do I need codec just to view simple images? Is there a simple way to get the image data?

Thanks.

corrupted tile in grid

I'm having trouble converting HEIC files from an iphone to a jpeg. The files contain 8x6 grids of images and every file, apart from some inputs, such as panorama shots(not 8x6 grid) have the 7th tile corrupted.

see attached file:
final

I put some code in a github repo: https://github.com/Kimbsen/heiftest to reproduce the problem. the code there is pretty self explanatory.

Any ideas what i might be doing wrong? I've excluded rotating the image though it should have been rotated 270 degrees as the problem is present regardless.

Fedora 26 - compile error with gcc-c++-7.1.1

I just tried compiling heif fresh from github on my fedora 26 beta pc and the compilation fails with the following error:

cd /home/zzz/Downloads/git/heif/build/Srcs/jsonlib && /usr/lib64/ccache/c++    -std=c++11 -Wall -Wextra -Werror -Wno-missing-field-initializers   -o CMakeFiles/json.dir/jsoncpp.cpp.o -c /home/zzz/Downloads/git/heif/Srcs/jsonlib/jsoncpp.cpp
/home/zzz/Downloads/git/heif/Srcs/jsonlib/jsoncpp.cpp: In member function ‘bool Json::OurReader::readToken(Json::OurReader::Token&)’:
/home/zzz/Downloads/git/heif/Srcs/jsonlib/jsoncpp.cpp:1444:5: error: this statement may fall through [-Werror=implicit-fallthrough=]
     if (features_.allowSingleQuotes_) {
     ^~
/home/zzz/Downloads/git/heif/Srcs/jsonlib/jsoncpp.cpp:1449:3: note: here
   case '/':
   ^~~~
cc1plus: all warnings being treated as errors
make[2]: *** [Srcs/jsonlib/CMakeFiles/json.dir/build.make:66: Srcs/jsonlib/CMakeFiles/json.dir/jsoncpp.cpp.o] Error 1

DecodePts::applyShiftEdit - Attempt to deference an invalid iterator

In the line 177 of the file decodepts.hpp you have
if (std::prev(it) != mMediaPts.cbegin() &&...

I believe what you intended was
if (it != mMediaPts.cbegin() &&...

I happened by this bug when to use the C036.heic (found on your own repository) with the reader.

A simple
HevcImageFileReader reader;
reader.initialize("C036.heic");
is enough to reproduce the problem.

JavaScript: Uncaught abort() when trying to decode .heic file from iPhone x

I am trying to use the JavaScript decoder to decode some heic files coming from an iPhone (iOS 11) and am getting this error:

HEIFReader: REQUEST FILE INFO: http://127.0.0.1:8080/content/images/rodo.heic
Skipping an unknown box of type 'colr' in ItemPropertyContainer.
Skipping an unknown box of type 'pixi' in ItemPropertyContainer.
Skipping an unknown box of type 'colr' in ItemPropertyContainer.
Skipping an unknown box of type 'pixi' in ItemPropertyContainer.
FileInfo {fileFeature: {…}, trackProperties: undefined, rootLevelMetaBoxProperties: {…},
Major brand: heic
Compatible brands: mif1,heic
ImageProvider: REQUEST IMAGE DATA: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
libde265.min.js:21 Uncaught abort() at Error
at La (http://127.0.0.1:8080/js/libde265.min.js:31:6)

rodo.zip

ImageFileReaderInterface::FileReaderException

...
    HevcImageFileReader reader;
    ImageFileReaderInterface::DataVector image_data;
    ImageFileReaderInterface::DataVector auxl_data;
    ImageFileReaderInterface::IdVector itemIds;
    reader.initialize(file_name);
...

The last line has an error:

terminate called after throwing an instance of 'ImageFileReaderInterface::FileReaderException'
what(): Error while reading file.

So I used gdb to debug my program, I found the exception is here:

image

image

But I dont know why...

HevcImageFileReader::initialize does not reset internal state

HevcImageFileReader::initialize does not reset the class internal state.

That means that if have more than one file/stream and we attempt to reuse an instance of the HevcImageFileReader class to read the next one, all the data from the previous stream will still be there, resulting in crashes (when you are lucky)

Please make a viewer

I compiled this but don't know what to do with writerapp, it needs some kind of config file. It would be great to have a viewer binary.

MetaData writing exception: XML

When method MetadataWriter::getMetadataLength is called, then an exception is thrown if the metadata type is set to XML_ITEM_TYPE (i.e. "xml1").

crash when i use example1()

lzj@lzj:/jia/mytest/image_process/heif/build$
lzj@lzj:
/jia/mytest/image_process/heif/build$ ../Bins/examples
compatibilityVersion = 0
[MESSAGE][readStream-1036] compatibilityVersion = 0
Skipping an unknown box of type 'colr' in ItemPropertyContainer.
Skipping an unknown box of type 'pixi' in ItemPropertyContainer.
Skipping an unknown box of type 'colr' in ItemPropertyContainer.
Skipping an unknown box of type 'pixi' in ItemPropertyContainer.
success
terminate called after throwing an instance of 'std::out_of_range'
what(): map::at
Terminated(core dump)

This is a picture sample, and when I use other images in heic format, it's the same mistake;
The environment is ubuntu 14.04;
IMG_0657.zip

Parser SPS crash as SPS struct not init!!

 The SequenceParameterSet is struct type, and not init while new.

if (naluHeader.mH265NalUnitType == H265NalUnitType::SPS){
SequenceParameterSet* sps = new SequenceParameterSet;
printf("[%s-%d]%p mSpsInferScalingListFlag(%d)\n", func, LINE, this, sps->mSpsInferScalingListFlag);
parseSPS(bitstr, *sps, naluHeader);
removeSps(sps->mSpsId);
mSpsList.push_back(sps);
}

Then print log is:
[parseNalUnit-457]0x7ffeefbfd7e8 mSpsInferScalingListFlag(66301659)

Build issues using GCC4.8 on Ubuntu14.04

I use these commands to build the project:
cmake ../srcs
make
and I got below error, somebody help me please?

  1. cmake log
    cmake ../srcs
    -- The CXX compiler identification is GNU 4.8.4
    -- The C compiler identification is GNU 4.8.4
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    Allocator test failed, enable fix
    fatal: Not a git repository (or any parent up to mount point /home)
    Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
    Could not get version information from git
    -- System name : Linux
    -- Project Name : heif
    -- Project directory : ~/opensource/heif-3.2/srcs
    -- Build called from : ~/opensource/heif-3.2/build
    -- Executables in : ~/opensource/heif-3.2/build/bin
    -- Libraries in :
    -- Configuring done
    -- Generating done
    -- Build files have been written to: ~/opensource/heif-3.2/build

  2. build log
    /usr/local/bin/cmake -H~/opensource/heif-3.2/srcs -B~/opensource/heif-3.2/build --check-build-system CMakeFiles/Makefile.cmake 0
    /usr/local/bin/cmake -E cmake_progress_start ~/opensource/heif-3.2/build/CMakeFiles /opensource/heif-3.2/build/CMakeFiles/progress.marks
    make -f CMakeFiles/Makefile2 all
    make[1]: Entering directory ~/opensource/heif-3.2/build' make -f common/CMakeFiles/common.dir/build.make common/CMakeFiles/common.dir/depend make[2]: Entering directory
    /opensource/heif-3.2/build'
    cd ~/opensource/heif-3.2/build && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" ~/opensource/heif-3.2/srcs ~/opensource/heif-3.2/srcs/common ~/opensource/heif-3.2/build ~/opensource/heif-3.2/build/common /opensource/heif-3.2/build/common/CMakeFiles/common.dir/DependInfo.cmake --color=
    make[2]: Leaving directory ~/opensource/heif-3.2/build' make -f common/CMakeFiles/common.dir/build.make common/CMakeFiles/common.dir/build make[2]: Entering directory
    /opensource/heif-3.2/build'
    [ 0%] Building CXX object common/CMakeFiles/common.dir/audiosampleentrybox.cpp.o
    cd /opensource/heif-3.2/build/common && /usr/bin/c++ -I/opensource/heif-3.2/build -DHEIF_GCC_ALLOCATOR_FIX=1 -g -W -Wall -Wall -Wextra -Wcast-align -Wcast-qual -Wdisabled-optimization -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wlogical-op -Wnoexcept -Wstrict-null-sentinel -fvisibility=hidden -fPIC -std=c++11 -o CMakeFiles/common.dir/audiosampleentrybox.cpp.o -c ~/opensource/heif-3.2/srcs/common/audiosampleentrybox.cpp
    In file included from /usr/include/c++/4.8/string:52:0,
    from /usr/include/c++/4.8/stdexcept:39,
    from /usr/include/c++/4.8/array:38,
    from /usr/include/c++/4.8/tuple:39,
    from /usr/include/c++/4.8/bits/stl_map.h:63,
    from /usr/include/c++/4.8/map:61,
    from ~/opensource/heif-3.2/srcs/common/customallocator.hpp:16,
    from ~/opensource/heif-3.2/srcs/common/bitstream.hpp:16,
    from ~/opensource/heif-3.2/srcs/common/audiosampleentrybox.hpp:15,
    from ~/opensource/heif-3.2/srcs/common/audiosampleentrybox.cpp:14:
    /usr/include/c++/4.8/bits/basic_string.h: In instantiation of ‘class std::basic_string<char, std::char_traits, Allocator >’:
    /opensource/heif-3.2/srcs/common/customallocator.hpp:226:24: required from here
    /usr/include/c++/4.8/bits/basic_string.h:122:61: error: no type named ‘difference_type’ in ‘std::basic_string<char, std::char_traits, Allocator >::_CharT_alloc_type {aka class Allocator}’
    typedef typename _CharT_alloc_type::difference_type difference_type;
    ^
    make[2]: *** [common/CMakeFiles/common.dir/audiosampleentrybox.cpp.o] Error 1
    make[2]: Leaving directory ~/opensource/heif-3.2/build' make[1]: *** [common/CMakeFiles/common.dir/all] Error 2 make[1]: Leaving directory
    /opensource/heif-3.2/build'
    make: *** [all] Error 2

build fail in Centos 6.5

This is error log. please help me,thank you.

[root@baseline build]# cmake ..
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- System name : Linux
-- Project Name : HEIF
-- Project directory : /home/heif
-- Executables in : /home/heif/Bins
-- File-list :
-- Performing Test COMPILER_SUPPORTS_CXX11
-- Performing Test COMPILER_SUPPORTS_CXX11 - Failed
-- Performing Test COMPILER_SUPPORTS_CXX0X
-- Performing Test COMPILER_SUPPORTS_CXX0X - Success
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/heif/build
[root@baseline build]# make
/usr/bin/cmake -H/home/heif -B/home/heif/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/heif/build/CMakeFiles /home/heif/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory /home/heif/build' make -f Srcs/parser/h265parser/CMakeFiles/h265parser.dir/build.make Srcs/parser/h265parser/CMakeFiles/h265parser.dir/depend make[2]: Entering directory /home/heif/build'
cd /home/heif/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/heif /home/heif/Srcs/parser/h265parser /home/heif/build /home/heif/build/Srcs/parser/h265parser /home/heif/build/Srcs/parser/h265parser/CMakeFiles/h265parser.dir/DependInfo.cmake --color=
Scanning dependencies of target h265parser
make[2]: Leaving directory /home/heif/build' make -f Srcs/parser/h265parser/CMakeFiles/h265parser.dir/build.make Srcs/parser/h265parser/CMakeFiles/h265parser.dir/build make[2]: Entering directory /home/heif/build'
/usr/bin/cmake -E cmake_progress_report /home/heif/build/CMakeFiles 65
[ 1%] Building CXX object Srcs/parser/h265parser/CMakeFiles/h265parser.dir/h265parser.cpp.o
cd /home/heif/build/Srcs/parser/h265parser && /usr/bin/c++ -std=c++0x -Wall -Wextra -Werror -Wno-missing-field-initializers -I/home/heif/Srcs/common -I/home/heif/Srcs/parser -o CMakeFiles/h265parser.dir/h265parser.cpp.o -c /home/heif/Srcs/parser/h265parser/h265parser.cpp
/home/heif/Srcs/parser/h265parser/h265parser.cpp: In destructor ‘virtual H265Parser::~H265Parser()’:
/home/heif/Srcs/parser/h265parser/h265parser.cpp:38: error: expected initializer before ‘:’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:43: error: expected primary-expression before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:43: error: expected ‘;’ before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:43: error: expected primary-expression before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:43: error: expected ‘)’ before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:43: error: expected initializer before ‘:’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:48: error: expected primary-expression before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:48: error: expected ‘;’ before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:48: error: expected primary-expression before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:48: error: expected ‘)’ before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:48: error: expected initializer before ‘:’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:52: error: expected primary-expression before ‘}’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:52: error: expected ‘;’ before ‘}’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:52: error: expected primary-expression before ‘}’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:52: error: expected ‘)’ before ‘}’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:52: error: expected primary-expression before ‘}’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:52: error: expected ‘;’ before ‘}’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp: In member function ‘bool H265Parser::initDisplayOrderArray(const char*)’:
/home/heif/Srcs/parser/h265parser/h265parser.cpp:109: error: expected initializer before ‘:’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:116: error: could not convert ‘std::sort [with _RAIter = __gnu_cxx::__normal_iterator<ParserInterface::PicOrder*, std::vector<ParserInterface::PicOrder, std::allocatorParserInterface::PicOrder > >, _Compare = bool (*)(const ParserInterface::PicOrder&, const ParserInterface::PicOrder&)](picOrder.std::vector<_Tp, _Alloc>::begin with _Tp = ParserInterface::PicOrder, _Alloc = std::allocatorParserInterface::PicOrder, picOrder.std::vector<_Tp, _Alloc>::end with _Tp = ParserInterface::PicOrder, _Alloc = std::allocatorParserInterface::PicOrder, ParserInterface::compareDecodeOrder)’ to ‘bool’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:118: error: expected primary-expression before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:118: error: expected ‘)’ before ‘for’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:118: error: expected initializer before ‘:’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:122: error: could not convert ‘picOrder.std::vector<_Tp, _Alloc>::clear with _Tp = ParserInterface::PicOrder, _Alloc = std::allocatorParserInterface::PicOrder’ to ‘bool’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:123: error: expected primary-expression before ‘}’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:123: error: expected ‘)’ before ‘}’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:123: error: expected primary-expression before ‘}’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:123: error: expected ‘;’ before ‘}’ token
cc1plus: warnings being treated as errors
/home/heif/Srcs/parser/h265parser/h265parser.cpp:86: error: unused variable ‘displayNum’
/home/heif/Srcs/parser/h265parser/h265parser.cpp: In member function ‘bool H265Parser::hasVpsExtension()’:
/home/heif/Srcs/parser/h265parser/h265parser.cpp:147: error: expected initializer before ‘:’ token
/home/heif/Srcs/parser/h265parser/h265parser.cpp:3033: error: expected primary-expression at end of input
/home/heif/Srcs/parser/h265parser/h265parser.cpp:3033: error: expected ‘;’ at end of input
/home/heif/Srcs/parser/h265parser/h265parser.cpp:3033: error: expected primary-expression at end of input
/home/heif/Srcs/parser/h265parser/h265parser.cpp:3033: error: expected ‘)’ at end of input
/home/heif/Srcs/parser/h265parser/h265parser.cpp:3033: error: expected statement at end of input
/home/heif/Srcs/parser/h265parser/h265parser.cpp:146: error: unused variable ‘hasExtension’
/home/heif/Srcs/parser/h265parser/h265parser.cpp:3033: error: expected ‘}’ at end of input
/home/heif/Srcs/parser/h265parser/h265parser.cpp:3033: error: no return statement in function returning non-void
make[2]: *** [Srcs/parser/h265parser/CMakeFiles/h265parser.dir/h265parser.cpp.o] Error 1
make[2]: Leaving directory /home/heif/build' make[1]: *** [Srcs/parser/h265parser/CMakeFiles/h265parser.dir/all] Error 2 make[1]: Leaving directory /home/heif/build'
make: *** [all] Error 2

Multiple compile errors with VS 2015

There are no Visual Studio project files, so I've had to craft them by hand. Most of the project is building fine, but I'm getting numerous complaints of the following form:

1>Srcs\writer\datastore.cpp(39): error C2065: 'not': undeclared identifier

where the offending line is:

if (not mValueMap.count(key))

not is not the boolean negation operator in C++, the standard very clearly defines ! as this operator. Is there any good reason for attempting to use a non-standard operator, I'm not sure I can see how doing so adds any value to the project.

problems building

Using git source.

The only thing built is writerapp. No reader, etc.
And "make install" gives me "No rule to make target 'install'".

I don't know much about cmake, so I'm not sure what to do.
I have cmake 3.9.1 and GCC 7.1.0, BTW.

OSX El Capitain - Compile Issue

Tried to compile heir for OS X and got these errors during compiling process:

In file included from /heif/Srcs/common/hevcsampleentry.cpp:13:
/Users/gary/Desktop/raypack_heif/heif/Srcs/common/hevcsampleentry.hpp:46:18: error: 'writeBox' overrides a member function but is not marked 'override' [-Werror,-Winconsistent-missing-override]
virtual void writeBox(BitStream& bitstr);
^
/heif/Srcs/common/visualsampleentrybox.hpp:66:18: note: overridden virtual function is here
virtual void writeBox(BitStream& bitstr);
^
In file included from /heif/Srcs/common/hevcsampleentry.cpp:13:
/heif/Srcs/common/hevcsampleentry.hpp:51:18: error: 'parseBox' overrides a member function but is not marked 'override' [-Werror,-Winconsistent-missing-override]
virtual void parseBox(BitStream& bitstr);
^
/heif/Srcs/common/visualsampleentrybox.hpp:70:18: note: overridden virtual function is here
virtual void parseBox(BitStream& bitstr);
^
2 errors generated.

Build issues: snprintf not declared

Hi,

i wanted to build the library using windows with cmake and mingw.
cmake runs properly and when compiling the source using make i get an error when it comes to the
jsonLib:

D:\development\Libs\c++\heif-master\Srcs\jsonlib\jsoncpp.cpp:1035:70: error: 'snprintf' was not declared in this scope
snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column);

and so on.

Anyone has an idea what i am doing wrong?

Thanks
Sebastian

h265parser.cpp undeclared identifier 'log2'

D:\android_weiyun_proj\branches\Heif3\app\src\main\cpp\heif\Srcs\parser\h265parser\h265parser.cpp:1832:41: error: use of undeclared identifier 'log2'
unsigned int numBits = ceil(log2(numLayersInTreePartition.at(j) + 1));
^
D:\android_weiyun_proj\branches\Heif3\app\src\main\cpp\heif\Srcs\parser\h265parser\h265parser.cpp:1937:37: error: use of undeclared identifier 'log2'
unsigned int numBits = ceil(log2(numLayerSets - 1));
^
D:\android_weiyun_proj\branches\Heif3\app\src\main\cpp\heif\Srcs\parser\h265parser\h265parser.cpp:2061:45: error: use of undeclared identifier 'log2'
unsigned int numBits = ceil(log2(vpsExt.mVpsNumProfileTierLevelMinus1 + 1));
^
3 errors generated.
ninja: build stopped: subcommand failed.

Failed in buildding project

I use these commands for build this project:

cd heif/build   
cmake3 ../srcs   
camke3 --build .

and I'm using
gcc 4.8.5 and cmake 3.11.2 on CentOS 7

but I failed with following error, somebody help me please?

/root/heif/heif/srcs/api-cpp/Heif.cpp:47:43: error: redeclaration ‘HEIFPP::Heif::InvalidGroup’ differs in ‘constexpr’
 constexpr HEIF::GroupId Heif::InvalidGroup((std::uint32_t) 0);
                                           ^
In file included from /root/heif/heif/srcs/api-cpp/DecoderConfiguration.h:15:0,
                 from /root/heif/heif/srcs/api-cpp/AACDecoderConfiguration.h:15,
                 from /root/heif/heif/srcs/api-cpp/Heif.cpp:16:
/root/heif/heif/srcs/api-cpp/Heif.h:77:36: error: from previous declaration ‘HEIFPP::Heif::InvalidGroup’
         static const HEIF::GroupId InvalidGroup;
                                    ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:47:43: error: ‘HEIFPP::Heif::InvalidGroup’ declared ‘constexpr’ outside its class
 constexpr HEIF::GroupId Heif::InvalidGroup((std::uint32_t) 0);
                                           ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:47:43: error: declaration of ‘const HEIF::GroupId HEIFPP::Heif::InvalidGroup’ outside of class is not definition [-fpermissive]
/root/heif/heif/srcs/api-cpp/Heif.cpp:48:42: error: redeclaration ‘HEIFPP::Heif::InvalidItem’ differs in ‘constexpr’
 constexpr HEIF::ImageId Heif::InvalidItem((std::uint32_t) 0);
                                          ^
In file included from /root/heif/heif/srcs/api-cpp/DecoderConfiguration.h:15:0,
                 from /root/heif/heif/srcs/api-cpp/AACDecoderConfiguration.h:15,
                 from /root/heif/heif/srcs/api-cpp/Heif.cpp:16:
/root/heif/heif/srcs/api-cpp/Heif.h:78:36: error: from previous declaration ‘HEIFPP::Heif::InvalidItem’
         static const HEIF::ImageId InvalidItem;
                                    ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:48:42: error: ‘HEIFPP::Heif::InvalidItem’ declared ‘constexpr’ outside its class
 constexpr HEIF::ImageId Heif::InvalidItem((std::uint32_t) 0);
                                          ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:48:42: error: declaration of ‘const HEIF::ImageId HEIFPP::Heif::InvalidItem’ outside of class is not definition [-fpermissive]
/root/heif/heif/srcs/api-cpp/Heif.cpp:49:49: error: redeclaration ‘HEIFPP::Heif::InvalidSequence’ differs in ‘constexpr’
 constexpr HEIF::SequenceId Heif::InvalidSequence((std::uint32_t) ~0);
                                                 ^
In file included from /root/heif/heif/srcs/api-cpp/DecoderConfiguration.h:15:0,
                 from /root/heif/heif/srcs/api-cpp/AACDecoderConfiguration.h:15,
                 from /root/heif/heif/srcs/api-cpp/Heif.cpp:16:
/root/heif/heif/srcs/api-cpp/Heif.h:79:39: error: from previous declaration ‘HEIFPP::Heif::InvalidSequence’
         static const HEIF::SequenceId InvalidSequence;
                                       ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:49:49: error: ‘HEIFPP::Heif::InvalidSequence’ declared ‘constexpr’ outside its class
 constexpr HEIF::SequenceId Heif::InvalidSequence((std::uint32_t) ~0);
                                                 ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:49:49: error: declaration of ‘const HEIF::SequenceId HEIFPP::Heif::InvalidSequence’ outside of class is not definition [-fpermissive]
/root/heif/heif/srcs/api-cpp/Heif.cpp:50:59: error: redeclaration ‘HEIFPP::Heif::InvalidSequenceImage’ differs in ‘constexpr’
 constexpr HEIF::SequenceImageId Heif::InvalidSequenceImage((std::uint32_t) ~0);
                                                           ^
In file included from /root/heif/heif/srcs/api-cpp/DecoderConfiguration.h:15:0,
                 from /root/heif/heif/srcs/api-cpp/AACDecoderConfiguration.h:15,
                 from /root/heif/heif/srcs/api-cpp/Heif.cpp:16:
/root/heif/heif/srcs/api-cpp/Heif.h:80:44: error: from previous declaration ‘HEIFPP::Heif::InvalidSequenceImage’
         static const HEIF::SequenceImageId InvalidSequenceImage;
                                            ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:50:59: error: ‘HEIFPP::Heif::InvalidSequenceImage’ declared ‘constexpr’ outside its class
 constexpr HEIF::SequenceImageId Heif::InvalidSequenceImage((std::uint32_t) ~0);
                                                           ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:50:59: error: declaration of ‘const HEIF::SequenceImageId HEIFPP::Heif::InvalidSequenceImage’ outside of class is not definition [-fpermissive]
/root/heif/heif/srcs/api-cpp/Heif.cpp:51:49: error: redeclaration ‘HEIFPP::Heif::InvalidProperty’ differs in ‘constexpr’
 constexpr HEIF::PropertyId Heif::InvalidProperty((std::uint32_t) 0);
                                                 ^
In file included from /root/heif/heif/srcs/api-cpp/DecoderConfiguration.h:15:0,
                 from /root/heif/heif/srcs/api-cpp/AACDecoderConfiguration.h:15,
                 from /root/heif/heif/srcs/api-cpp/Heif.cpp:16:
/root/heif/heif/srcs/api-cpp/Heif.h:81:39: error: from previous declaration ‘HEIFPP::Heif::InvalidProperty’
         static const HEIF::PropertyId InvalidProperty;
                                       ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:51:49: error: ‘HEIFPP::Heif::InvalidProperty’ declared ‘constexpr’ outside its class
 constexpr HEIF::PropertyId Heif::InvalidProperty((std::uint32_t) 0);
                                                 ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:51:49: error: declaration of ‘const HEIF::PropertyId HEIFPP::Heif::InvalidProperty’ outside of class is not definition [-fpermissive]
/root/heif/heif/srcs/api-cpp/Heif.cpp:52:59: error: redeclaration ‘HEIFPP::Heif::InvalidDecoderConfig’ differs in ‘constexpr’
 constexpr HEIF::DecoderConfigId Heif::InvalidDecoderConfig((std::uint32_t) 0);
                                                           ^
In file included from /root/heif/heif/srcs/api-cpp/DecoderConfiguration.h:15:0,
                 from /root/heif/heif/srcs/api-cpp/AACDecoderConfiguration.h:15,
                 from /root/heif/heif/srcs/api-cpp/Heif.cpp:16:
/root/heif/heif/srcs/api-cpp/Heif.h:82:44: error: from previous declaration ‘HEIFPP::Heif::InvalidDecoderConfig’
         static const HEIF::DecoderConfigId InvalidDecoderConfig;
                                            ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:52:59: error: ‘HEIFPP::Heif::InvalidDecoderConfig’ declared ‘constexpr’ outside its class
 constexpr HEIF::DecoderConfigId Heif::InvalidDecoderConfig((std::uint32_t) 0);
                                                           ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:52:59: error: declaration of ‘const HEIF::DecoderConfigId HEIFPP::Heif::InvalidDecoderConfig’ outside of class is not definition [-fpermissive]
/root/heif/heif/srcs/api-cpp/Heif.cpp:53:51: error: redeclaration ‘HEIFPP::Heif::InvalidMediaData’ differs in ‘constexpr’
 constexpr HEIF::MediaDataId Heif::InvalidMediaData((std::uint32_t) 0);
                                                   ^
In file included from /root/heif/heif/srcs/api-cpp/DecoderConfiguration.h:15:0,
                 from /root/heif/heif/srcs/api-cpp/AACDecoderConfiguration.h:15,
                 from /root/heif/heif/srcs/api-cpp/Heif.cpp:16:
/root/heif/heif/srcs/api-cpp/Heif.h:83:40: error: from previous declaration ‘HEIFPP::Heif::InvalidMediaData’
         static const HEIF::MediaDataId InvalidMediaData;
                                        ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:53:51: error: ‘HEIFPP::Heif::InvalidMediaData’ declared ‘constexpr’ outside its class
 constexpr HEIF::MediaDataId Heif::InvalidMediaData((std::uint32_t) 0);
                                                   ^
/root/heif/heif/srcs/api-cpp/Heif.cpp:53:51: error: declaration of ‘const HEIF::MediaDataId HEIFPP::Heif::InvalidMediaData’ outside of class is not definition [-fpermissive]
make[2]: *** [api-cpp/CMakeFiles/heifpp.dir/Heif.cpp.o] Error 1
make[2]: Leaving directory `/root/heif/heif/build'
make[1]: *** [api-cpp/CMakeFiles/heifpp.dir/all] Error 2
make[1]: Leaving directory `/root/heif/heif/build'
make: *** [all] Error 2

A problem about iPhone heic

Dear Nokia Developer,
I know a typical iPhone heic picture has 48 tiles, and I extract all tiles into H.265 bitstream successful. Then I use ffmpeg convert them to png,I get all 48 still tiles picture finally.
But it's not I wanted. I try to put all decoder tile into one memory buffer, just converting one times get the complete png picture. Because I think maybe I could get a picture, not 48 tile. But I don't know how to set the HEVC NAL Uint at the beganing of memory buffer. What should I do? Or the mathod cannot make it?
My part code

Array<ImageId> gridIds;
Grid gridData;
Array<ImageId> tileItemIds;
if(reader->getItemListByType("grid",gridIds) == ErrorCode::OK)
{
    tileItemIds = gridData.imageIds;
    if(reader->getItem(gridIds[0].get(), gridData) == ErrorCode::OK)
        {
            tileItemIds = gridData.imageIds; // 48 tiles
            
            // Calculate size of parameter sets, but do not copy the data yet.
            size_t parameterSize = 0;
            DecoderConfiguration decodeConf;
             if(reader->getDecoderParameterSets(tileItemIds[0], decodeConf) == ErrorCode::OK)       
             // I konw the decodeConf is not I want 
            {
                for (auto& config : decodeConf.decoderSpecificInfo)
                {parameterSize += config.decSpecInfoData.size;}
            }
            
            //  Copy (worong)parameter data to the beginning of the buffer.
            uint64_t itemSize(0);
            size_t offset = 0;
            for (const auto& config : decodeConf.decoderSpecificInfo)
            {
                memcpy(memoryBuffer + offset, config.decSpecInfoData.begin(), config.decSpecInfoData.size);
                offset += config.decSpecInfoData.size;
            }
            itemSize = memoryBufferSize - static_cast<uint32_t>(parameterSize);
            
            // Copy all tiles data to the buffer
            size_t tileSize = 0;
            for (unsigned int i = 0; i < tileItemIds.size; i++)
            {

                if (reader->getItemData(tileItemIds[i].get(), &memoryBuffer[parameterSize+tileSize], itemSize) == ErrorCode::OK)
                {
                    cout << "Get the tile: " << i << endl;
                    tileSize += itemSize;
                    itemSize = memoryBufferSize - parameterSize - tileSize;
                }
                else{cout << "Get Image Data error!" << endl;}
                
                memoryBufferSize = static_cast<uint32_t>(parameterSize) + tileSize;
                
                ofstream outfile(file_name, ofstream::binary);
                outfile.write(memoryBuffer, memoryBufferSize);
            }

example.cpp build issues on Ubuntu 16.10

I am having issues building the example.cpp on Ubuntu 16.10:

/tmp/example-d90d81.o: In function `example1()':
example.cpp:(.text+0x13): undefined reference to `HevcImageFileReader::HevcImageFileReader()'
example.cpp:(.text+0x58): undefined reference to `HevcImageFileReader::initialize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
example.cpp:(.text+0x163): undefined reference to `HevcImageFileReader::getCoverImageItemId(unsigned int) const'
example.cpp:(.text+0x1af): undefined reference to `HevcImageFileReader::getItemDataWithDecoderParameters(unsigned int, unsigned int, std::vector<unsigned char, std::allocator<unsigned char> >&)'
/tmp/example-d90d81.o: In function `example2()':
example.cpp:(.text+0x243): undefined reference to `HevcImageFileReader::HevcImageFileReader()'
example.cpp:(.text+0x2a0): undefined reference to `HevcImageFileReader::initialize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
example.cpp:(.text+0x424): undefined reference to `HevcImageFileReader::getItemListByType(unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned int, std::allocator<unsigned int> >&) const'
example.cpp:(.text+0x51f): undefined reference to `HevcImageFileReader::getReferencedToItemListByType(unsigned int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned int, std::allocator<unsigned int> >&) const'
example.cpp:(.text+0x590): undefined reference to `HevcImageFileReader::getItemDataWithDecoderParameters(unsigned int, unsigned int, std::vector<unsigned char, std::allocator<unsigned char> >&)'
example.cpp:(.text+0x639): undefined reference to `HevcImageFileReader::getItemDataWithDecoderParameters(unsigned int, unsigned int, std::vector<unsigned char, std::allocator<unsigned char> >&)'
/tmp/example-d90d81.o: In function `example3()':
example.cpp:(.text+0x6e3): undefined reference to `HevcImageFileReader::HevcImageFileReader()'
example.cpp:(.text+0x74c): undefined reference to `HevcImageFileReader::initialize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
example.cpp:(.text+0x80f): undefined reference to `HevcImageFileReader::getItemListByType(unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned int, std::allocator<unsigned int> >&) const'
example.cpp:(.text+0x913): undefined reference to `HevcImageFileReader::getReferencedToItemListByType(unsigned int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned int, std::allocator<unsigned int> >&) const'
/tmp/example-d90d81.o: In function `example4()':
example.cpp:(.text+0xc13): undefined reference to `HevcImageFileReader::HevcImageFileReader()'
example.cpp:(.text+0xc64): undefined reference to `HevcImageFileReader::initialize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
example.cpp:(.text+0xd27): undefined reference to `HevcImageFileReader::getItemListByType(unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned int, std::allocator<unsigned int> >&) const'
example.cpp:(.text+0xddc): undefined reference to `HevcImageFileReader::getReferencedFromItemListByType(unsigned int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<unsigned int, std::allocator<unsigned int> >&) const'
example.cpp:(.text+0xe43): undefined reference to `HevcImageFileReader::getItemProperties(unsigned int, unsigned int) const'
example.cpp:(.text+0xee5): undefined reference to `HevcImageFileReader::getPropertyIrot(unsigned int, unsigned int) const'
/tmp/example-d90d81.o: In function `example5()':
example.cpp:(.text+0x11e3): undefined reference to `HevcImageFileReader::HevcImageFileReader()'
example.cpp:(.text+0x1234): undefined reference to `HevcImageFileReader::initialize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
example.cpp:(.text+0x161f): undefined reference to `HevcImageFileReader::getItemTimestamps(unsigned int, std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int> > >&) const'
example.cpp:(.text+0x184b): undefined reference to `HevcImageFileReader::getItemDecodeDependencies(unsigned int, unsigned int, std::vector<unsigned int, std::allocator<unsigned int> >&) const'
example.cpp:(.text+0x18ed): undefined reference to `HevcImageFileReader::getItemDataWithDecoderParameters(unsigned int, unsigned int, std::vector<unsigned char, std::allocator<unsigned char> >&)'
/tmp/example-d90d81.o: In function `example6()':
example.cpp:(.text+0x1a13): undefined reference to `HevcImageFileReader::HevcImageFileReader()'
example.cpp:(.text+0x1a64): undefined reference to `HevcImageFileReader::initialize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
example.cpp:(.text+0x1baf): undefined reference to `HevcImageFileReader::getDisplayWidth(unsigned int) const'
example.cpp:(.text+0x1bd8): undefined reference to `HevcImageFileReader::getDisplayWidth(unsigned int) const'
/tmp/example-d90d81.o: In function `example3()::$_0::operator()(unsigned int, unsigned int) const':
example.cpp:(.text+0x1f6a): undefined reference to `HevcImageFileReader::getWidth(unsigned int, unsigned int) const'
example.cpp:(.text+0x1f83): undefined reference to `HevcImageFileReader::getWidth(unsigned int, unsigned int) const'
/tmp/example-d90d81.o: In function `HevcImageFileReader::~HevcImageFileReader()':
example.cpp:(.text._ZN19HevcImageFileReaderD2Ev[_ZN19HevcImageFileReaderD2Ev]+0xa): undefined reference to `vtable for HevcImageFileReader'
/tmp/example-d90d81.o: In function `FileTypeBox::~FileTypeBox()':
example.cpp:(.text._ZN11FileTypeBoxD2Ev[_ZN11FileTypeBoxD2Ev]+0xa): undefined reference to `vtable for FileTypeBox'
/tmp/example-d90d81.o: In function `MetaBox::~MetaBox()':
example.cpp:(.text._ZN7MetaBoxD2Ev[_ZN7MetaBoxD2Ev]+0xa): undefined reference to `vtable for MetaBox'
/tmp/example-d90d81.o: In function `GroupsListBox::~GroupsListBox()':
example.cpp:(.text._ZN13GroupsListBoxD2Ev[_ZN13GroupsListBoxD2Ev]+0xa): undefined reference to `vtable for GroupsListBox'
/tmp/example-d90d81.o: In function `ItemPropertiesBox::~ItemPropertiesBox()':
example.cpp:(.text._ZN17ItemPropertiesBoxD2Ev[_ZN17ItemPropertiesBoxD2Ev]+0xa): undefined reference to `vtable for ItemPropertiesBox'
/tmp/example-d90d81.o: In function `ItemDataBox::~ItemDataBox()':
example.cpp:(.text._ZN11ItemDataBoxD2Ev[_ZN11ItemDataBoxD2Ev]+0xa): undefined reference to `vtable for ItemDataBox'
/tmp/example-d90d81.o: In function `ItemReferenceBox::~ItemReferenceBox()':
example.cpp:(.text._ZN16ItemReferenceBoxD2Ev[_ZN16ItemReferenceBoxD2Ev]+0xa): undefined reference to `vtable for ItemReferenceBox'
/tmp/example-d90d81.o: In function `ItemInfoBox::~ItemInfoBox()':
example.cpp:(.text._ZN11ItemInfoBoxD2Ev[_ZN11ItemInfoBoxD2Ev]+0xa): undefined reference to `vtable for ItemInfoBox'
/tmp/example-d90d81.o: In function `ItemProtectionBox::~ItemProtectionBox()':
example.cpp:(.text._ZN17ItemProtectionBoxD2Ev[_ZN17ItemProtectionBoxD2Ev]+0xa): undefined reference to `vtable for ItemProtectionBox'
/tmp/example-d90d81.o: In function `ItemLocationBox::~ItemLocationBox()':
example.cpp:(.text._ZN15ItemLocationBoxD2Ev[_ZN15ItemLocationBoxD2Ev]+0xa): undefined reference to `vtable for ItemLocationBox'
/tmp/example-d90d81.o: In function `DataInformationBox::~DataInformationBox()':
example.cpp:(.text._ZN18DataInformationBoxD2Ev[_ZN18DataInformationBoxD2Ev]+0xa): undefined reference to `vtable for DataInformationBox'
/tmp/example-d90d81.o: In function `HandlerBox::~HandlerBox()':
example.cpp:(.text._ZN10HandlerBoxD2Ev[_ZN10HandlerBoxD2Ev]+0xa): undefined reference to `vtable for HandlerBox'
/tmp/example-d90d81.o: In function `ItemPropertyAssociation::~ItemPropertyAssociation()':
example.cpp:(.text._ZN23ItemPropertyAssociationD2Ev[_ZN23ItemPropertyAssociationD2Ev]+0xa): undefined reference to `vtable for ItemPropertyAssociation'
/tmp/example-d90d81.o: In function `ItemPropertyContainer::~ItemPropertyContainer()':
example.cpp:(.text._ZN21ItemPropertyContainerD2Ev[_ZN21ItemPropertyContainerD2Ev]+0xa): undefined reference to `vtable for ItemPropertyContainer'
/tmp/example-d90d81.o: In function `std::pair<unsigned int const, ItemInfoEntry>::~pair()':
example.cpp:(.text._ZNSt4pairIKj13ItemInfoEntryED2Ev[_ZNSt4pairIKj13ItemInfoEntryED2Ev]+0x15): undefined reference to `ItemInfoEntry::~ItemInfoEntry()'
/tmp/example-d90d81.o: In function `DataReferenceBox::~DataReferenceBox()':
example.cpp:(.text._ZN16DataReferenceBoxD2Ev[_ZN16DataReferenceBoxD2Ev]+0xa): undefined reference to `vtable for DataReferenceBox'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Here is a link to the Dockerfile that reproduces the issue:
https://gist.github.com/Eriken/2f36e232e637d4e9cd34a539a7c0bfa0

how can I run it with JAVA

My build command are as following, and succeed:
sudo cmake ../srcs
sudo cmake --build .
I see the directory "heif/srcs/api-java" has "cpp" and "java" two directories, and HEIF.java has "System.loadLibrary("heifjni");", but in directory "heif/build/lib", I can't find heifjni.so or heifjni.a.
How can I build heifjni file?
Looking forward to your reply.

Comparison isnt accurate

JPEG is outdated. And its out of the league. Same with GIF.
Since you suggest new format, that not yet fully supported you have to compare with competitive alternatives:

  • JPEG2000
  • WebP
  • FLIF (+ animation)
  • WebM (animation)
  • MP4 (animation)

Look what google did: https://developers.google.com/speed/webp/docs/webp_study?csw=1
Use PSNR / SSIM

Dont get me wrong, you publish closed source codec, compare it to previous century technologies, and expect we would adapt it. No way. x265 is great since it has intel(and probably amd) cores support, but. but. It weren't adopted by any browser, nor would be adopted(except probably Safari, cause they don't mind closed source). Meanwhile almost every end-user app nowdays either hybrid or pure web.
On other hand we have WebP, which already implemented in Chrome&Opera&Android + UC (74% of world traffic consumers), and on his way in Firefox&Safari team.

If you really want your work to be worthy, you have to put some effort to it. We have tens of image format alternatives, same as with compression algorithms.

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.