Official repository of the ISO Base Media File Format Reference Software

Overview

ISO Base Media File Format (ISOBMFF)

This repository is the official repository for the ISO Base Media File Format Reference Software.

The ISO base media file format is published by ISO as part 12 of the MPEG-4 specifications, ISO/IEC 14496-12. As such, it implements and conforms to part of MPEG-4. This part of MPEG-4 is used heavily by standards other than MPEG-4, and this reference software is often used by the reference software for those other standards, but still provides, in those contexts, an implementation "claiming conformance to MPEG-4".

Updates to the reference software can be submitted using Pull Requests but are subject to approval by MPEG, and a formal input contribution should be submitted to MPEG.

When possible, it is preferred that separate Pull Requests for fixes/enhancements to the build system and for fixes/enhancements to the software features.

Documentation

The general documentation of the public exported API is available at gh-pages and can also be generated locally with Doxygen by running:

doxygen Doxyfile

In addition, several How to use examples as well as the old version of the API (extracted from isofile.doc) are provided in the following Wiki.

Development

The repository contains the libisomediafile which is a library implementing the ISO base media file format. In addition, several tools to read and write files based on this specification are provided.

Requirements

Compiling

It is recommended to use cmake to build the software in this repository. However, this repository also contains old project files for some IDE's which are no longer maintained and are kept in the repository just to maintain compatibility with other software from MPEG.

Example of commands to build the entire toolset on a Linux platform.

git clone https://github.com/MPEGGroup/isobmff.git
cd isobmff
mkdir build && cd build
cmake ..
make

Cross platform

CMake allows to generate build scripts for different platforms. For instance:

cmake -G "Visual Studio 16 2019" -A ARM64

For more generators, please see CMake documentation.

Note also that certain IDE may be able to natively parse a CMakeLists.txt in which case there is no need to generate specific build scripts. Please refer to your IDE's documentation on how to best handle CMake-based projects.

Individual compilation

If you are only interested in certain tools, you can build them individually.

For instance, the libisomediafile can be built using make libisomediafile when using Unix Makefile.

For a complete list, please refer to the generated build scripts, for instance with Unix Makefile:

$ make help
The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... rebuild_cache
... edit_cache
... libuniDrcBitstreamDecoderLib
... libwavIO
... libreadonlybitbuf
... libwriteonlybitbuf
... TLibDecoder
... TLibCommon
... libisomediafile
... makeAudioMovieSample
... playAudioMovieSample
... DRC_to_MP4
... MP4_to_DRC
... hevc_muxer
... hevc_demuxer
... hevc_extractors
... protectAudioMovie
... libisoiff
... isoiff_tool
... WAV_to_MP4
... MP4_to_WAV
Comments
  • Fix build issue for VS2008

    Fix build issue for VS2008

    Hello, I'm Daniel Richter from Fraunhofer IIS, mainly working in the Audio WG on the MPEG-H 3D Audio reference software. I noticed that for VS2008 the isobmff reference software is not compiling with the 3D Audio reference software. Therefore I request to adapt the corresponding libisomedia.vcproj file to fix this issue. Kind regards, Daniel

    opened by drichter-iis 7
  • How to get the 'avc1' sample entry from sampleDescription (stsd)?

    How to get the 'avc1' sample entry from sampleDescription (stsd)?

    Hi,

    I try many different ways but still can not get the avc1 box information such as width, height, and extensionList point to avcC.

    First, I open the file and get moov and then get track... and so on. err = ISOOpenMovieFile( &moov, filename, MP4OpenMovieNormal ); err = ISOGetMovieIndTrack( moov, trackNumber, &trak ); err = ISOGetTrackMedia( trak, &media );

    Then, I get sampleDescription box. stsd = (MP4SampleDescriptionAtomPtr) stbl->SampleDescription;

    Then, I want get the avc1 box in stsd. But stsd only have method call: getEntry( struct MP4SampleDescriptionAtom *self, u32 entryNumber, struct GenericSampleEntryAtom **outEntry )

    The problem is the outEntry is GenericSampleEntryAtom, but I may need to use MP4VisualSampleEntryAtom as output. If that possible way to transfer GenericSampleEntryAtom to MP4VisualSampleEntryAtomPtr? Or is there is other way to get avc1 box information?

    Thanks!

    opened by hengshaochen 6
  • Submodule issue: Failed to clone 'IsoLib/HM'

    Submodule issue: Failed to clone 'IsoLib/HM'

    I just noticed that git://hevc.kw.bbc.co.uk/git/jctvc-hm.git seems to be down. Therefore HM submodule can not be cloned when attempting to build IsoLib

    $ cmake .. -- ... -- Detecting CXX compile features - done -- Submodule update Submodule 'IsoLib/HM' (git://hevc.kw.bbc.co.uk/git/jctvc-hm.git) registered for path 'IsoLib/HM' Cloning into '/Users/podborski/projects/isobmff/IsoLib/HM'... fatal: unable to connect to hevc.kw.bbc.co.uk: hevc.kw.bbc.co.uk[0: 132.185.142.226]: errno=Operation timed out

    fatal: clone of 'git://hevc.kw.bbc.co.uk/git/jctvc-hm.git' into submodule path '/Users/podborski/projects/isobmff/IsoLib/HM' failed Failed to clone 'IsoLib/HM'. Retry scheduled Cloning into '/Users/podborski/projects/isobmff/IsoLib/HM'... fatal: unable to connect to hevc.kw.bbc.co.uk: hevc.kw.bbc.co.uk[0: 132.185.142.226]: errno=Operation timed out

    Moving it to github would be great I guess.

    opened by podborski 5
  • Compile errors in test_main

    Compile errors in test_main

    [ 95%] Building CXX object test/CMakeFiles/unit_tests.dir/test_main.cpp.o
    In file included from /usr/include/signal.h:328,
                     from /home/bradh/coding/isobmff/test/./catch.hpp:8042,
                     from /home/bradh/coding/isobmff/test/test_main.cpp:2:
    /home/bradh/coding/isobmff/test/./catch.hpp:10830:58: error: call to non-‘constexpr’ function ‘long int sysconf(int)’
    10830 |     static constexpr std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ;
          |                                                          ^~~~~~~~~~~
    In file included from /usr/include/x86_64-linux-gnu/bits/sigstksz.h:24,
                     from /usr/include/signal.h:328,
                     from /home/bradh/coding/isobmff/test/./catch.hpp:8042,
                     from /home/bradh/coding/isobmff/test/test_main.cpp:2:
    /usr/include/unistd.h:640:17: note: ‘long int sysconf(int)’ declared here
      640 | extern long int sysconf (int __name) __THROW;
          |                 ^~~~~~~
    In file included from /home/bradh/coding/isobmff/test/test_main.cpp:2:
    /home/bradh/coding/isobmff/test/./catch.hpp:10889:45: error: size of array ‘altStackMem’ is not an integral constant-expression
    10889 |     char FatalConditionHandler::altStackMem[sigStackSize] = {};
          |                                             ^~~~~~~~~~~~
    make[2]: *** [test/CMakeFiles/unit_tests.dir/build.make:76: test/CMakeFiles/unit_tests.dir/test_main.cpp.o] Error 1
    make[1]: *** [CMakeFiles/Makefile2:822: test/CMakeFiles/unit_tests.dir/all] Error 2
    make: *** [Makefile:91: all] Error 2
    

    This is on Kubuntu with g++ (Ubuntu 11.2.0-19ubuntu1) 11.2.0.

    opened by bradh 4
  • CMake scripts for the entire repo

    CMake scripts for the entire repo

    This PR provides CMake scripts to build the reference software library and tools.

    It does not yet remove the legacy scripts, i.e. makefiles, vs studio and xcode.

    This will be done at a later stage when compilation will be validated on these platforms.

    opened by edrthomas 4
  • CMakeLists.txt for libisomediafile

    CMakeLists.txt for libisomediafile

    Hi isobmff maintainers, In the past I had problems building libisomediafile on Windows with recent versions of Visual Studio. I couldn't find a cmake list, so I wrote this one. Tested the build on Linux, Windows and Mac. Currently, I use it with the MPEG-4 audio reference software.

    Best, Daniel

    opened by dfisc 4
  • test the VVC subpicture track

    test the VVC subpicture track

    Hi Dimitri

    I wrote a piece of code based on test_01_sample, but because the second section is too complicated, the corresponding track cannot be parsed correctly. Can you check it out for me?

    Thank you Pengjian

    opened by yangpengjjj 3
  • MPEG-D USAC and MPEG-H 3D Audio support / edit list handling

    MPEG-D USAC and MPEG-H 3D Audio support / edit list handling

    I solved some issues with the integration of the libisomediafile into the reference software of MPEG-D USAC and MPEG-H 3D Audio: I added missing source code files to Visual Studio 2008 and Visual Studio 2012 project files. Additionally I solved a bug when writing the edit list. In case the trackStartTime equals 0 the elst should be written when the media duration equals the track duration.

    opened by chrisneukam 3
  • drc_in_isom: outdated API usage of uniDrcBitstreamDecoder_api.h in MPEG-D part 4

    drc_in_isom: outdated API usage of uniDrcBitstreamDecoder_api.h in MPEG-D part 4

    compilation error:

    ./src/DRCData.c: In function ‘initDRCData’:
    ../src/DRCData.c:68:14: error: too few arguments to function ‘initUniDrcBitstreamDec’
         drcErr = initUniDrcBitstreamDec(drcData->hUniDrcBsDecStruct, sampleRate, framesize);
                  ^~~~~~~~~~~~~~~~~~~~~~
    In file included from ../src/DRCData.h:39:0,
                     from ../src/DRCData.c:24:
    ../../../external/Part04-Dynamic_Range_Control/trunk/modules/uniDrcModules/uniDrcBitstreamDecoderLib/include/uniDrcBitstreamDecoder_api.h:53:1: note: declared here  initUniDrcBitstreamDec(HANDLE_UNI_DRC_BS_DEC_STRUCT hUniDrcBsDecStruct,
    
    opened by edrthomas 2
  • OMAF extensions

    OMAF extensions

    This request includes support for new atoms defined in OMAF FDIS as needed extensions to ISO/IEC 14496-12 and ISO/IEC 14496-15. Support for restricted schemes (which was already in ISO/IEC 14496-12 but not implemented in the reference software) was also added. Also added a Visual Studio solution for hevc_extractor code.

    Please squash all commits into a single one when merging.

    opened by ahmedhmz 2
  • New media and entity groups

    New media and entity groups

    Based on the work done for 23090-10 we identified several missing features in libisomedia. This PR also includes a few other bugfixes.

    Short summary of this PR:

    • Add sample entries, handlers and media headers for new media (volumetric and haptic, ISOBMFF 7th edition)
    • EntityToGroup implementation provided by Nokia (thank you)
    • Fraunhofer HHI reported a bug regarding large files (mdat box which uses size=1 and unsigned int(64) largesize) which is also addressed by this PR
    opened by podborski 1
  • How to add DRC data?

    How to add DRC data?

    Hi team,

    Can you please share an example mp4 file with loudness box -- ludt data?

    Or can you please share an example of drcInputBitStream.bit, so that we can run DRC_to_MP4?

    It is confusing for me about how to add ludt data.

    Thanks in advance!

    opened by xinyuwang-hotstar 8
  • Fixes macOS build of applications using the macro PUTBYTES(...)

    Fixes macOS build of applications using the macro PUTBYTES(...)

    Fixes the following issue:

    Using the Macro #define PUTBYTES( src, len ) from isobmff/IsoLib/libisomediafile/src/MP4Impl.h on macOS, unix-based platforms other than Linux currently leads to a compiler error in the MPEG-H Refsoft, if the target application does not include string.h. The reason for that is a directive #ifdef __linux, which encapsulates the string.h include in MP4Impl.h, making it unavailable for macOS and other unix-based platforms (except for Linux).

    opened by msturm-iis 0
  • Improve testing using conformance files

    Improve testing using conformance files

    During MPEG 135 it was suggested to add more tests based on conformance files from Part 32.

    In the first step we could fetch conformance files from mpeg server and check if the reference software can successfully open all of them.

    In the next step we should continue improving tests by parsing deeper in the files...

    enhancement 
    opened by podborski 1
Releases(v0.2.0)
  • v0.2.0(Jul 27, 2021)

    This pre-release introduces an overhaul of the repository

    • Set up GitHub actions runners
    • Clean up build files which are set in .gitignore but are staged in the repo.
    • Configure cmake to store executables and libraries in corresponding folders
    • Setup testing environment
    • Implement sample groups and compact sample groups in fragments
    • Fix all compilation issues & warnings on macOS, linux and windows for libisomediafile
    • Set up cmake to treat all warnings as errors (libisomediafile only)
    • Implement defragmentation of the sampleToGroup and SampleGroupDescription boxes (merging etc.)
    • Implement the API to change the flavour of the sample groups before writing a file.
    • Implement an API to get the sample numbers given the sample group type and entry
    • Implement a comprehensive sample group test
    • Implement getDescriptionEntryCount to provide the API to iterate over all entries
    • Implement an initial testing environment for sample description functions
    • Clean up debugging output
    • BugFix: allow multiple sample group descriptions of the same type to be present.
    • BugFix: local compact sample groups in fragments
    • BugFix: non mandatory tfdt
    • BugFix: default local group description in fragments 0x10000 should be treated as 0
    • BugFix: HEVC sample entry lengthSize-1 was not correctly written to file
    • BugFix: get the correct value for the last sample number index
    • Setup documentation of the API using doxygen and automate publishing it to gh-pages
    • Setup clang-format and reformat all files in the libisomedia to have a unique style. Also automate checks for future pull requests.
    • Switch HEVC reference software dependency from BBC to HHI as BBC server seems to be unreachable.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Jul 27, 2021)

    First release before refactoring.

    All the contents from ReleaseNotes.txt are copied below:

    Release notes Feb 2018

    a) Added new atoms defined in OMAF FDIS [N17235] as extensions to ISO/IEC 14496-12 and ISO/IEC 14496-15.

    b) Added Visual Studio 2013 solution and project files for hevc_extractors.

    Release notes Jan 2018

    a) Added support for Visual Studio 2008 (required also fixing some minor compiler errors)

    b) Added new functions ISOGetTrackEditlistEntryCount and ISOGetTrackEditlist for transporting Elst information

    Release notes Dec 2016

    a) Added support for Item Properties to libisomedia

    b) Fixed a bug in ISOMeta.c with mdat construction method

    c) Fixed a bug in ItemInfoAtom.c for setting correct sizes depending on the atom version

    d) Added support for Item Properties to isoiff library

    e) Updated HEVC Still Image Format to be used with Item Properties in isoiff_tool

    f) Added AVC and JPEG Image Format support to isoiff_tool

    Release notes Dec 2014

    a) Added composition to decode time atom. Also supports signed values.

    b) Added support for sample auxiliary information.

    c) Added ISO Image File Format library and tool. Tool is able to create HEVC Still Image Collections.

    d) Updated and added functions in isofile.doc

    e) Removed support for freebsd, osxs, solaris

    f) Updated Meta atom structure and related atoms, to newest spec

    Release notes Oct 2014

    a) Added support for track fragment decode time

    b) Added new ISOAddDelayToTrackFragmentDecodeTime function, to introduce delay to base media decode time

    c) Added extended language tag and ISOGetMediaExtendedLanguageTag, ISOSetMediaExtendedLanguageTag

    d) Fixed a bug in MP4LinkedList

    e) Added setSampleEntry to MediaAtom, MediaInformationAtom

    f) Added ChannelLayoutAtom, DownMixInstructionsAtom, LoudnessAtom, LoudnessBaseAtom

    g) Added new function MP4GetAtomFromUserData

    h) Added DRC file format tool set “drc_in_isom”

    Release notes Jan 2011

    a) better tracing output from sample groups and movie fragments

    b) handle atoms that have more data than the parser used

    c) correctly calculate track runs sizes based off the flags (even if we don't recognize them all, as per spec.)

    Release Notes August 2010

    a) Added support for the simpler moof-relative addressing in movie fragments, and fix the more complicated case

    b) be more tolerant of unknown atoms in a few places

    c) be more tolerant of 'empty' sample tables in movies (so that merging movie fragments into it works)

    d) fixed some minor cases of not calculating field sizes right

    Release notes Jan 2008

    a) Fixed a couple of bugs referencing freed memory (thanks to Coding Tech.)

    b) fixed some compile warnings and errors on Linux

    c) fixed some compilation issues on Mac OS X 'Leopard'

    d) fixed some cases of calculating samples in track readers

    Release notes Aug 2007

    a) support for the sample dependency table

    b) fixed bug in movie fragments where ftyp atoms were getting written with fragments; not sure when it was introduced.

    Release notes Apr 2007

    a) track references now cope with general references on reading and writing (previously, only known reference types could be read)

    Release notes Jan 2007

    a) fixed a bug where the 'isom' brand was incorrectly added to files without a movie atom

    b) added ISONewMetaMovie and ISOAddMetaItemWithID for general meta-structured files.

    c) much surgery on the support for sample entries, to handle several embedded atoms rather than just one

    d) support for more 3G files

    Release notes Sept 2006

    a) Updated ISMASecurity.c to handle ISMA salt values. Some bug fixes and cross-platform compilations issues. New file ISMASaltAtom.c

    b) Makefile for MINGW32 for the library (thanks to Stefan from FhG).

    c) Lots of new functions to support meta-boxes (atoms), with updated documentation (which also covers some older functions that seemed to have missed getting documented). Also 'NewMPEG21' to make an MPEG-21 file.

    d) The extension atom parameter to ISONewGeneralSampleDescription is now a GenericAtom.

    e) Support for AVC sample entries added. Now much easier to work with AVC.

    f) Optimizations and memory leak fix, thanks to Coding Technologies. Four atoms no longer reallocate memory every time a sample is added; the input stream machinery was leaking when streams were closed; and files that start with 8 zeroes (which parse successfully as a single atom of type NULL) are now rejected, since they contain neither an ftyp or moov atom.

    g) Please note that going ahead, though I will maintain the Linux, FreeBSD, and Solaris makefiles, I probably will not check these builds (or the new MINGW32). If you find bugs, or compiler warnings or errors, please let me know.

    h) Fixed a bug in the Mac OS X file mapping where data that was larger than the window wasn't handled.

    i) Added support for timed meta-data tracks (Thanks, Michael)

    Release notes August 2006

    a) Much work on handling files over 4GB. The ChunkLargeOffset atom file is no longer needed (the ChunkOffsetAtom handles both 32bit and 64bit offsets). Many internal changes to make sizes etc. 64 bit. Only Mac OS X has a SimpleFileMapping that will handle >4GB files, by mapping around them; note that these files cannot be re-written (yet). You can force making >4GB files (have a look at MediaDataAtom).

    Release notes June 2006

    a) Added support for sample groups; see documentation

    b) fixed a bug adding encrypted samples when written to another file

    c) fixed a bug that sometimes affected offsetted handles

    d) made it easier to add 'foreign' and UUID atoms; see MP4NewForeignAtom, MP4NewUUIDAtom, and MP4AddAtomToMovie and MP4AddAtomToTrack

    e) [INCOMPATIBLE CHANGE] fixed some errors in the MP4TrackReader when there were edit lists. Unfortunately it is now true that the outDTS and outCTS may be negative, in the case where the AU is the first AU and the edit starts in the middle of it. So their type has changed from unsigned to signed. This enables one to detect the 'AAC pre-roll' and end-trimming cases. If the DTS is -ve, or overlaps the end of the previous AU (i.e. previous DTS + previous duration), then discard that amount of samples from the front of the AU. If the duration is less than the normal AU duration, discard from the end of the AU. (Theoretically, both may occur).

    f) slightly easier to make non-MPEG tracks. New function ISONewGeneralSampleDescription. But this function is subject to change as we work on the atoms that go into these other sample descriptions (the last parameter may not stay as a handle, so supply NULL for now).

    g) Integrated some of the improvements from the 3GPP community (ongoing work)

    h) Fixed a few missing equivalents and their documentation (again).

    Release Notes Feb 2005

    a) equivalents defined for ISOOpenMovieNormal, ISOOpenMovieDebug, ISOOpenMovieInPlace, ISOGetMovieDuration, ISOGetTrackDuration

    b) New facility in handles, to set an offset; offsets can be used when encrypting/decrypting. Essentially you can set a handle to point a little way into the allocated space, and then 'back it up' when you want to use that space.

    c) Basic ISMACrypt support; new functions to transform sample entries; note that we don't do the encryption (that is your problem); see ISMATransformSampleEntry and ISMAUnTransformSampleEntry. These might provide a starting point for OMA 2.0 support.

    d) Fixed movie-fragment sequence number checking on read

    e) Fixed a bug in the PaddingBits atom where it could overwrite memory

    f) fixed a bug where a failed read of a movie would leak memory

    Release notes Oct 2004

    a) Added some missing documentation for get movie/track duration.

    b) Fixed a bug in reading padding bits atoms with odd numbers of entries.

    c) Some missing equivalents (ISO/MP4) were also added.

    Release notes jul 2003

    a) Bug fix in getTrackOffset; not returning zero when that was the right answer.

    b) Bug fix to the vmhd flags.

    c) fixed a number of compiler warnings and errors (thanks again, Ralph)

    d) improved handle support (you can now offset handles to leave space at the front for later use, for example)

    e) handle 64-bit chunk offset atoms better (read files which use them OK)

    f) better handling of edit lists, some bug fixes in that area

    g) MP4NewMovie will now create an OD, not an IOD, in the IOD atom, if all the profiles are 0 (which is a forbidden value), and will create no IOD atom at all if the Object Descriptor ID supplied is 0 (also a forbidden value). This makes it easy to create a greater variety of files.

    h) INCOMPATIBLE CHANGE!! Previously, if a sample had no recorded padding bits information, then 0 was returned (if requested) as the padding value. But 0 is a legal pad value, and so it was not possible to distinguish "this sample is not padded" from "this sample didn't have any padding recorded". Now if there is no recorded padding the value 0xF8 is returned, which (being large) clearly exceeds the 0-7 possible legal values for padding. The creation functions do NOT check for this value; it is your responsibility to check for this and not pass it through.

    i) A missing equivalence defining ISOAddMediaSamplesPad was inserted

    j) An error in adding IPMP track references was corrected (an OR should have been an AND) which caused crashes under some circumstances.

    Release notes Oct 2002:

    This is a major update of the ISO Media File reference library. In this release we are pleased to welcome the IPMP support donated by ResonateMP4.

    One fix below which worries me is that MP4InsertMediaIntoTrack was not converting the mediaDuration to the movie timescale, contrary to the documentation. I fixed this, but maybe I broke some software...

    Here's all the fixes in a list:

    a) free atoms can now be found and discarded almost anywhere; this means the software copes, for example, with files with free atoms inside edit atoms. The software is probably more liberal than the specification in this respect; be careful. Free atoms are now mostly discarded on reading.

    b) empty free atoms (8 bytes long) are also handled on reading and no longer cause a crash.

    c) I believe that empty durations in movie fragments are handled correctly. This hasn't been fully verified.

    d) edit lists can now be found in base movies with fragments, so that e.g. track start offsets can be in the base movie.

    e) there is a fix to finding a sample by time (it was wrong when chunks had multiple samples).

    f) edit atoms with no included list are correctly treated as if they were not present.

    g) the movie duration is now calculated in 64 bits, which means non-trivial-lengthed movies should be OK.

    h) for those in the 3GPP world, a nod of support: new3gppmovie

    i) we no longer crash if asked for the IOD of a movie which doesn't have one.

    j) the IPMP support, as noted above.

    k) builds for CW5, 7, and 8 (carbon), and project builder under OS X.

    l) MP4 InsertMediaIntoTrack converts the mediaDuration to the Movie timescale now (as documented).

    -- (2nd drop of the experimental software)

    m) the ftyp for the motion jpeg 2000 was wrong, and a JP2 Header incorrectly present at top level. This would only be correct with a JP2 Codestream also at top level (a parallel still image).

    n) now fixed for missing prototypes, and checked on solaris, freebsd and linux (library and audio example)


    Release notes from Oct 2001:

    Here is the extent of the trouble I may be causing. Comments gratefully received.

    Intended improvements:

    a) Implemented the new 'compact' sample size table (requested for audio). See the function ISOSetSampleSizeField.

    b) Implemented the Padding bits sample table atom (also for audio). See ISOAddMediaSamplesPad, ISOAddMediaSampleReferencePad, MP4GetIndMediaSampleWithPad, GetMediaSampleWithPad, MP4TrackReaderGetNextAccessUnitWithPad

    c) (Biggie) Implemented movie fragments. See ISOStartMovieFragment, ISOSetTrackFragmentDefaults. Fragmented movies can be both created and read. When read, the movie is de-fragmented so that it can be iterated over. Combined with the work on writing movies that have been read in (see below), this means a movie can be simply de-fragmented back to disk.

    d) Implemented reading an atom with size==0 meaning atom goes to end of file.

    e) Improved the QT support a little; QT files made by the library can now be read by QT without modification. Also, the library probably copes with a counted (pascal) string in a hdlr atom, where a C (null-terminated) string ought to be.

    f) Made the file-type atom occur in all files, not just MJ2 files. See ISOSetMovieBrand, ISOSetMovieCompatibleBrand, ISOGetMovieBrand, ISOIsMovieCompatibleBrand.

    g) (The other biggie). Changed the way that samples are extracted from movies that are read in, so that it's now possible to write out a file after reading it in, without scrodding all the chunk offsets. Instead of reading sample data from the file mapping data pointer, it's now read from the read-in mdats. Chunk offsets are adjusted, and all the mdats are merged into one. No attempt is made to purge unused space in the mdats, however. This means that the filemappinginputstream could be closed after reading the atoms in; I have not worked out where to do this. Note: if you supply the flag MP4OpenMovieInPlace to OpenMovieFile, then the media data will be read from the input file (as before); however, such files cannot be re-written to disk. This is not yet optimal; the media data is read from disk into memory, and then thrown away; it ought to be skipped.

    h) If there is an extra byte in the SLConfigDescriptor, because we're reading a systems V1 file, skip it. (The matching change to ignore OCRFlag in ESDescriptors doesn't seem like it ought to be part of the permanent source).

    i) Improved the handling of top-level atoms; those that can occur are saved, and free space is tossed.

    j) Fixed the reading of the sample-to-chunk table to handle run-length compressed tables, and improved the writing of such tables also.

    k) Added make files for Pmake on freebsd (Makefile.pmk) and Solaris make (Makefile.sol).

    l) Made the library compile without warning under strict Ansi C, with only the warning for 'long long' suppressed (thanks, Ralph).

    m) Fixed a leak in getMovieInitialObjectDescriptor -- the ESD list was not freed, as it shared structure with stuff we needed to keep. There's now a copydescriptor function, so the sharing is gone, and the list is correctly freed.

    n) For those wanting to track memory leaks, there is an alternative implementation on the Mac for MP4Handle.c, in MacHandle.c, which uses regular Mac handle routines (e.g. by using ZoneRanger 'watch for leaks').

    o) Also fixed a few leaks with memory input streams not being closed. There are no known leaks at the moment (though I doubt that there are no leaks).

    p) Now compiles without warning if -Wmissing-prototypes is set; prototypes all fixed.

    q) Fixed some errors in the fragment stuff. You can now call SetTrackFragmentdefaults before you add any samples.

    Questions:

    Does anyone rely on being able to create free-space atoms in the library, or on being able to read them? It seems that their contents at least should be tossed on reading, and they should not write anything out when a file is written. Comments?

    Changes in the project:

    These files are no longer needed and should be removed from builds: ISOMovieFile.c MJ2MovieFile.c QTMovieFile.c

    These files are new: TrackFragmentAtom.c MovieFragmentAtom.c TrackFragmentHeaderAtom.c MovieExtendsAtom.c TrackFragmentRunAtom.c TrackExtendsAtom.c MovieFragmentHeaderAtom.c PaddingBitsAtom.c


    It is hosted at

    loc.apple.com

    as an FTP file. Logon as either sc29wg01 (JPEG) or sc29wg11 (MPEG) using the standard (latest) passwords.

    My thanks go to the original creator and maintainer, Mike Coleman.

    Make media files and prosper!

    Dave Singer

    Source code(tar.gz)
    Source code(zip)
🎥 mpv is a free (as in freedom) media player for the command line.

mpv is a free (as in freedom) media player for the command line. It supports a wide variety of media file formats, audio and video codecs, and subtitle types.

mpv 20.2k Oct 4, 2022
TIP (translate it, please) is a plugin for VLC media player that helps you to study languages by watching videos.

vlc-tip-plugin TIP (translate it, please) is a plugin for VLC media player that helps you to study languages by watching videos. Features The plugin a

Aleksey Koltakov 42 Sep 21, 2022
Jellyfin Desktop Client based on Plex Media Player

Desktop client using jellyfin-web with embedded MPV player. Supports Windows, Mac OS, and Linux. Media plays within the same window using the jellyfin-web interface unlike Jellyfin Desktop. Supports audio passthrough. Based on Plex Media Player.

Jellyfin 1.1k Oct 3, 2022
A clone of Media Player Classic reimplemented in Qt.

Media Player Classic Qute Theater A clone of Media Player Classic reimplemented in Qt. Media Player Classic Home Cinema (mpc-hc) is considered by many

Media Player Classic Qute Theater 125 Sep 24, 2022
media server based on c++11, support webrtc/rtmp/httpflv/websocket flv

cpp_media_server A media server is writen by C++11, and the network io is writen by Boost.Asio. It support rtmp/httpflv/websocket(flv)/webrtc. preinst

Alex.CR 139 Jun 30, 2022
Smartstreaming is a high-performance and scalable streaming media server.

1. introduction Smartstreaming is a high-performance and scalable streaming media server. 2. design | io | Coroutine | | transport | tcp/udp/srt/quic

null 2 Jan 7, 2022
Free and open-source media player written in C++

Liquid Media Player Free and open-source media player written in C++. Currently in development. Build Guide Windows Install the MSYS2 Building Platfor

Arrow Interactive 4 Sep 20, 2022
Video stabilization is a software-based approach in real-time to eliminating environmental effects (wind, heavy vehicle etc.) and enhance the visual performance that degrade video streaming quality.

Video Stabilization Contents General Info Installation To Do General Info Video stabilization is a software-based approach in real-time to eliminating

null 6 Sep 23, 2022
A homebrew software suite for video game consoles developed to help in the evaluation of upscalers, upscan converters

A homebrew software suite for video game consoles developed to help in the evaluation of upscalers, upscan converters, line doublers and of course TV processing of 240p video. The Wii and Dreamcast versions have modes for 480i and 480p evaluation as well.

Artemio Urbina 99 Oct 1, 2022
This repository contains applications used in my Gameboy LCD video.

Gameboy LCD stuff This repository contains applications used in my Gameboy LCD video. Pin naming LCD pin naming used in this repository matches the Ga

null 21 Jul 3, 2022
ffmpeg supporting EVC codec and file formats.

ffevc ffmpeg supporting EVC codec and file formats. MPEG-5 Essential Video Coding (EVC) integration with FFmpeg project. It is supported under Linux a

MPEG-5 26 Aug 15, 2022
Example how to use ffmpeg to decode video file.

FFMpeg-decode-example Example how to use ffmpeg to decode video file. Link to article about decode with FFMpeg. Russian article. Example shows you the

Unick Soft 32 Jul 8, 2022
The Dolby MP4 streaming muxer (dlb_mp4base) is a software implementation of a muxer of fragmented or unfragmented ISO base media file format (mp4)

The Dolby MP4 streaming muxer (dlb_mp4base) is a software implementation of a muxer of fragmented or unfragmented ISO base media file format (mp4). It supports muxing of Dolby Digital (AC-3), Dolby Digital Plus (E-AC-3), and Dolby AC-4 audio formats as well as Dolby Vision.

Dolby Laboratories 194 Sep 18, 2022
The Dolby MP4 streaming demuxer (dlb_mp4demux) is a software implementation of a demuxer of fragmented or unfragmented ISO base media file format (mp4).

The Dolby MP4 streaming demuxer (dlb_mp4demux) is a software implementation of a demuxer of fragmented or unfragmented ISO base media file format (mp4). It supports demuxing of Dolby Digital (AC-3), Dolby Digital Plus (E-AC-3), and Dolby AC-4 audio formats as well as Dolby Vision. It is designed for use on architectures with limited resources.

Dolby Laboratories 64 Oct 4, 2022
The OpenEXR project provides the specification and reference implementation of the EXR file format, the professional-grade image storage format of the motion picture industry.

OpenEXR OpenEXR provides the specification and reference implementation of the EXR file format, the professional-grade image storage format of the mot

Academy Software Foundation 1.3k Sep 26, 2022
✔️The smallest header-only GUI library(4 KLOC) for all platforms

Welcome to GUI-lite The smallest header-only GUI library (4 KLOC) for all platforms. 中文 Lightweight ✂️ Small: 4,000+ lines of C++ code, zero dependenc

null 6.5k Oct 2, 2022
Kodi is an award-winning free and open source software media player and entertainment hub for digital media

website • docs • community • add-ons Welcome to Kodi Home Theater Software! Kodi is an award-winning free and open source software media player and en

Team Kodi 14.5k Oct 2, 2022
Reference Implementations of P0267, the proposed 2D graphics API for ISO C++

P0267 Reference Implementation Please read the LICENSE before cloning or forking the code as there is important information there! Please see the wiki

cpp-io2d 305 Sep 16, 2022
TengineGst is a streaming media analytics framework, based on GStreamer multimedia framework, for creating varied complex media analytics pipelines.

TengineGst is a streaming media analytics framework, based on GStreamer multimedia framework, for creating varied complex media analytics pipelines. It ensures pipeline interoperability and provides optimized media, and inference operations using Tengine Toolkit Inference Engine backend, across varied architecture - CPU, iGPU and VPU.

OAID 64 May 30, 2022