[SCM] libmediainfo/master: Imported Upstream version 0.7.90

hyperair at users.alioth.debian.org hyperair at users.alioth.debian.org
Thu Dec 1 16:48:53 UTC 2016


The following commit has been merged in the master branch:
commit f0746c3e2c8aca3a1d191d546506ab47892cfdfb
Author: Chow Loong Jin <hyperair at debian.org>
Date:   Thu Dec 1 23:13:31 2016 +0800

    Imported Upstream version 0.7.90

diff --git a/.travis.yml b/.travis.yml
index febe6b6..9e4d4b9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,6 +9,7 @@ before_install:
   - sudo dpkg -i libzen0_0.4.32-1_amd64.xUbuntu_14.04.deb
   - wget http://mediaarea.net/download/binary/libzen0/0.4.32/libzen-dev_0.4.32-1_amd64.xUbuntu_14.04.deb
   - sudo dpkg -i libzen-dev_0.4.32-1_amd64.xUbuntu_14.04.deb
+before_script: git -C .. clone https://github.com/MediaArea/ZenLib.git
 env:
   global:
     - secure: NP+/jWbhIDs0JH+FOfElZnywkm/d9K+WAkuDp8STeSpTbWqBIQhEWfixVPlFMZWMaXTpCIEDcZ85+COdUTitLfF/XuTE5tmUD7MnVrqPLDtOTQSbhrC1ag7uiII9U2Usz/q8GMbuU+ZE3/0K4zrm531kWaBj8Ot0yIJlw6yXPQM=
@@ -16,4 +17,9 @@ env:
   matrix:
     -
     - CXXFLAGS="-DMEDIAINFO_ADVANCED_NO -DMEDIAINFO_ARCHIVE_NO -DMEDIAINFO_DEMUX_NO -DMEDIAINFO_DVDIF_ANALYZE_NO -DMEDIAINFO_EVENTS_NO -DMEDIAINFO_LIBCURL_NO -DMEDIAINFO_LIBMMS_NO -DMEDIAINFO_MD5_NO -DMEDIAINFO_MINIMAL_YES -DMEDIAINFO_MPEGTS_DUPLICATE_NO -DMEDIAINFO_N19_NO -DMEDIAINFO_OTHERTEXT_NO -DMEDIAINFO_TRACE_NO -DMEDIAINFO_READTHREAD_NO -DMEDIAINFO_EXPORT_NO -DMEDIAINFO_TEXT_YES" NO_CHECKS="true"
-script: cd Project/GNU/Library/ && ./autogen.sh && ./configure --with-libcurl && make && if [ -z "$NO_CHECKS" ] ; then make clone_regression_files && make check && ./test/s3.sh ; fi
+script:
+    - cd Project/GNU/Library/ && ./autogen.sh && ./configure --with-libcurl && make &&
+      if [ -z "$NO_CHECKS" ] ; then
+         make clone_regression_files && make check ;
+      fi &&
+      mkdir ../../CMake/Build && cd ../../CMake/Build && cmake -DBUILD_ZENLIB=1 .. && make
diff --git a/History_DLL.txt b/History_DLL.txt
index 88d6aae..6767ddb 100644
--- a/History_DLL.txt
+++ b/History_DLL.txt
@@ -3,11 +3,45 @@
 + Added
 - Deleted
 x Correction
-#number is the identifier of SourceForge bug report (B), requested feature (F) or patch (P), or GitHub issue (I)
+#number is the identifier of SourceForge bug report (B), requested feature (F) or patch (P), MediaInfoLib GitHub issue (I), or MediaInfo GitHub issue (M)
 bug reports and feature request are here:
 https://sourceforge.net/p/mediainfo/_list/tickets
 
 
+Version 0.7.90, 2016-10-31
+--------------
++ #M94, WAV: support of file with a buggy RIFF header
++ Matroska: detection of segment size of zero (compatibility risks e.g. Windows 10 Media Player does not play such file)
++ MXF: detection of some incoherences between header and footer
++ MXF: display of Locked information
++ N19/STL: support of 48/50/60 fps content
++ N19/STL: display of time code of first frame
++ AC-3: bit depth
++ MPEG Video: CBR bitrate mode information based on vbv_delay
++ DXW: support of fake time code attribute
+x Teletext in MPEG-TS: CodecID, format (classic teletext or subtitle), video delay were sometimes not displayed
+x PDF: fixed crash with some files with full analysis set
+x #B485, BMP height is negative
+x Several minor fixes
+
+Version 0.7.89, 2016-09-30
+--------------
++ QuickTime: support of Panasonic AVC-Intra 50/100/200 without SPS/PPS ("aixx" and "AVin" CodecID)
++ More QuickTime/MP4/AVC/HEVC color descriptions based on future ISO 23001-8:201x/PDAM1
++ FFV1: handling 16+ bitdepth (YUV and RGB) while handling buggy version <= 3 YUV 16-bit streams
++ Improved growing file detection, option for forcing the growing file test
++ Matroska: support of video FieldOrder, MatrixCoefficients, BitsPerChannel, Range, TransferCharacteristics, Primaries
++ Acquisition Metadata: support of more elements (IrisTNumber, IrisRingPosition, FocusRingPosition, ZoomRingPosition, ColorMatrix)
++ Add stream counts to MIXML output
++ I242, AVI/Matroska: mapping of mjp2 to JPEG 2000 format name
++ MPEG-4 Visual: parsing of Studio profiles, providing width/height/frame rate...
++ MXF: reading MPEG-4 Visual profile from MXF sub-descriptor and/or EssenceCompression
++ MXF: reading Intra GOP info from descriptors
++ Sequence of images: detection of sequence even if the provided path separator is the Unix one (Windows only)
+x Acquisition Metadata: IrisFNumber, FocusPosition, LensZoom were not correctly reported
+x LXF: fixed crash in case of some malformed files
+x LXF: reject bad frames instead of displaying wrong duration and bit rate
+
 Version 0.7.88, 2016-08-31
 --------------
 + MediaInfo distributed with HTTP/HTTPS support: support of Amazon S3 with Signature Version 4
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a20a18b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,25 @@
+BSD 2-Clause License
+
+Copyright (c) 2002-2016, MediaArea.net SARL
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Project/CMake/CMakeLists.txt b/Project/CMake/CMakeLists.txt
index 45b54e3..1731b3e 100644
--- a/Project/CMake/CMakeLists.txt
+++ b/Project/CMake/CMakeLists.txt
@@ -6,7 +6,7 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
 
 set(MediaInfoLib_MAJOR_VERSION 0)
 set(MediaInfoLib_MINOR_VERSION 7)
-set(MediaInfoLib_PATCH_VERSION 88)
+set(MediaInfoLib_PATCH_VERSION 90)
 set(MediaInfoLib_VERSION ${MediaInfoLib_MAJOR_VERSION}.${MediaInfoLib_MINOR_VERSION}.${MediaInfoLib_PATCH_VERSION})
 
 if (NOT WIN32)
diff --git a/Project/GNU/Library/AddThisToRoot_DLL_compile.sh b/Project/GNU/Library/AddThisToRoot_DLL_compile.sh
index 06c4814..caaf309 100755
--- a/Project/GNU/Library/AddThisToRoot_DLL_compile.sh
+++ b/Project/GNU/Library/AddThisToRoot_DLL_compile.sh
@@ -54,9 +54,9 @@ if test -e ZenLib/Project/GNU/Library/configure; then
     test -e Makefile && rm Makefile
     chmod +x configure
     if [ "$OS" = "mac" ]; then
-        ./configure $MacOptions $ZenLib_Options $*
+        ./configure --enable-static --disable-shared $MacOptions $ZenLib_Options $*
     else
-        ./configure $ZenLib_Options $*
+        ./configure --enable-static --disable-shared $ZenLib_Options $*
     fi
     if test -e Makefile; then
         make clean
@@ -86,10 +86,10 @@ if test -e MediaInfoLib/Project/GNU/Library/configure; then
     chmod +x configure
     if [ "$OS" = "mac" ]; then
         #./configure $MacOptions --enable-shared --disable-static --with-libcurl $*
-        ./configure $MacOptions --enable-shared --disable-static $*
+        ./configure $MacOptions --enable-staticlibs --enable-shared --disable-static $*
     else
         #./configure --enable-shared --disable-static --with-libcurl $*
-        ./configure --enable-shared --disable-static $*
+        ./configure --enable-staticlibs --enable-shared --disable-static $*
     fi
     if test -e Makefile; then
         make clean
diff --git a/Project/GNU/Library/Makefile.am b/Project/GNU/Library/Makefile.am
index 4b606c0..f607971 100644
--- a/Project/GNU/Library/Makefile.am
+++ b/Project/GNU/Library/Makefile.am
@@ -226,7 +226,6 @@ lib at MediaInfoLib_LibName@_la_SOURCES = \
  ../../../Source/MediaInfoDLL/MediaInfoDLL.h \
  ../../../Source/MediaInfoDLL/MediaInfoDLL_Static.h
 
-
 if COMPILE_AES
 lib at MediaInfoLib_LibName@_la_SOURCES += \
                        ../../../Source/ThirdParty/aes-gladman/aes_modes.c \
@@ -263,6 +262,9 @@ endif
 
 lib at MediaInfoLib_LibName@_la_LDFLAGS     = -no-undefined -version-info 0:0:0
 
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = libmediainfo.pc
+
 AM_CPPFLAGS = -I../../../Source -I../../../../ZenLib/Source
 
 TESTS_DIR = test
diff --git a/Project/GNU/Library/configure.ac b/Project/GNU/Library/configure.ac
index f277813..60e2dc1 100644
--- a/Project/GNU/Library/configure.ac
+++ b/Project/GNU/Library/configure.ac
@@ -5,7 +5,7 @@ dnl #########################################################################
 dnl -------------------------------------------------------------------------
 dnl Name and version
 dnl
-AC_INIT([libmediainfo], [0.7.88])
+AC_INIT([libmediainfo], [0.7.90])
 
 dnl -------------------------------------------------------------------------
 dnl Test if we are at the good place
@@ -26,7 +26,7 @@ CXXFLAGS="$CXXFLAGS"
 AC_PROG_CC
 AM_PROG_CC_C_O
 AC_PROG_CXX
-AC_DISABLE_SHARED
+AC_DISABLE_STATIC
 AC_LIBTOOL_WIN32_DLL
 AC_PROG_LIBTOOL
 AC_PROG_INSTALL
@@ -836,8 +836,16 @@ dnl #########################################################################
 dnl ### MediaInfoLib flags
 dnl #########################################################################
 
-MediaInfoLib_LIBS=" -L$(pwd) -l$with_libmediainfo_name $MediaInfoLib_LIBS"
-MediaInfoLib_LIBS_Static=" $(pwd)/.libs/lib$with_libmediainfo_name.a $MediaInfoLib_LIBS_Static"
+if test "$enable_shared" = yes ; then
+    MediaInfoLib_LIBS=" -L$(pwd)/.libs -l$with_libmediainfo_name $MediaInfoLib_LIBS"
+else
+    MediaInfoLib_LIBS=""
+fi
+if test "$enable_static" = yes ; then
+    MediaInfoLib_LIBS_Static=" $(pwd)/.libs/lib$with_libmediainfo_name.a $MediaInfoLib_LIBS_Static"
+else
+    MediaInfoLib_LIBS_Static=""
+fi
 
 dnl #########################################################################
 dnl ### Output
diff --git a/Project/GNU/Library/libmediainfo-config.in b/Project/GNU/Library/libmediainfo-config.in
index fe22f26..e993dd3 100644
--- a/Project/GNU/Library/libmediainfo-config.in
+++ b/Project/GNU/Library/libmediainfo-config.in
@@ -3,10 +3,10 @@
 if test "$1" = "CXXFLAGS"; then
 echo @MediaInfoLib_CXXFLAGS@
 fi
-if test "$1" = "LIBS"; then
+if test "$1" = "LIBS" -a -n "@MediaInfoLib_LIBS@"; then
 echo @MediaInfoLib_LIBS@
 fi
-if test "$1" = "LIBS_Static"; then
+if test "$1" = "LIBS_Static" -a -n "@MediaInfoLib_LIBS_Static@"; then
 echo @MediaInfoLib_LIBS_Static@
 fi
 if test "$1" = "Unicode"; then
diff --git a/Project/GNU/Library/test/Makefile.am b/Project/GNU/Library/test/Makefile.am
index f351d1d..457dedd 100644
--- a/Project/GNU/Library/test/Makefile.am
+++ b/Project/GNU/Library/test/Makefile.am
@@ -1,7 +1,10 @@
 AUTOMAKE_OPTIONS = foreign subdir-objects
 
+AM_TESTS_FD_REDIRECT = 9>&2
+
 TESTS = \
-    trace.sh
+    trace.sh \
+    s3.sh
 
 check_PROGRAMS = mil_analyze
 mil_analyze_SOURCES = \
diff --git a/Project/GNU/Library/test/s3.sh b/Project/GNU/Library/test/s3.sh
index 495da24..651c7ef 100755
--- a/Project/GNU/Library/test/s3.sh
+++ b/Project/GNU/Library/test/s3.sh
@@ -4,7 +4,8 @@ PATH_SCRIPT=$(dirname "$0")
 RCODE=0
 
 if [ -z $S3_KEY ] || [ -z $S3_PASS ] ; then
-    exit 0
+    # Skip test
+    exit 77
 fi
 
 SERVERS="travis-standard.s3.amazonaws.com"
@@ -21,12 +22,11 @@ for SERVER in $SERVERS; do
     FILE=$(mktemp)
 
     "$PATH_SCRIPT"/mil_analyze -f "General;%Format%" -l raw  "https://$S3_KEY:$S3_PASS@$SERVER/Example.ogg" $FILE
-    # '=' this is not an error, this is POSIX
     if [ "$(cat $FILE)" = "Ogg" ] ; then
-        echo "OK: $SERVER"
+        echo "OK: $SERVER" >&9
     else
         RCODE=1
-        echo "NOK: $SERVER"
+        echo "NOK: $SERVER" >&9
     fi
 
     rm $FILE
diff --git a/Project/GNU/PKGBUILD b/Project/GNU/PKGBUILD
index 05758ac..8eda25c 100644
--- a/Project/GNU/PKGBUILD
+++ b/Project/GNU/PKGBUILD
@@ -3,7 +3,7 @@
 # Contributor: hydro <hydro at freenet.de>
 
 pkgname=libmediainfo
-pkgver=0.7.88
+pkgver=0.7.90
 pkgrel=1
 pkgdesc="shared library for mediainfo"
 arch=('i686' 'x86_64')
@@ -29,8 +29,5 @@ package() {
     install -dm 755 $pkgdir/usr/include/$i
     install -m 644 $srcdir/MediaInfoLib/Source/$i/*.h $pkgdir/usr/include/$i
   done
-  install -dm 755 $pkgdir/usr/lib/pkgconfig
-  install -m 644 $srcdir/MediaInfoLib/Project/GNU/Library/libmediainfo.pc $pkgdir/usr/lib/pkgconfig
-  sed -i -e 's|Version: |Version: '$pkgver'|g' $pkgdir/usr/lib/pkgconfig/libmediainfo.pc
 }
 
diff --git a/Project/GNU/libmediainfo.dsc b/Project/GNU/libmediainfo.dsc
index 5799e22..27dd66d 100644
--- a/Project/GNU/libmediainfo.dsc
+++ b/Project/GNU/libmediainfo.dsc
@@ -2,7 +2,7 @@ Format: 3.0 (quilt)
 Source: libmediainfo
 Binary: libmediainfo-dev, libmediainfo0, python-mediainfodll, python3-mediainfodll, libmediainfo-doc libmediainfo0-dbg
 Architecture: any all
-Version: 0.7.88-1
+Version: 0.7.90-1
 Maintainer: MediaArea.net SARL <info at mediaarea.net>
 Homepage: http://MediaArea.net/MediaInfo
 Standards-Version: 3.9.6
@@ -16,11 +16,11 @@ Package-List:
  python-mediainfodll deb python optional arch=all
  python3-mediainfodll deb python optional arch=all
 Checksums-Sha1:
- 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.88.orig.tar.xz
- 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.88-1.debian.tar.xz
+ 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
+ 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.90-1.debian.tar.xz
 Checksums-Sha256:
- 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.88.orig.tar.xz
- 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.88-1.debian.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.90-1.debian.tar.xz
 Files:
- 00000000000000000000000000000000 000000 libmediainfo_0.7.88.orig.tar.xz
- 00000000000000000000000000000000 000000 libmediainfo_0.7.88-1.debian.tar.xz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.90-1.debian.tar.xz
diff --git a/Project/GNU/libmediainfo.spec b/Project/GNU/libmediainfo.spec
index ce153d2..db158be 100644
--- a/Project/GNU/libmediainfo.spec
+++ b/Project/GNU/libmediainfo.spec
@@ -1,4 +1,4 @@
-%define libmediainfo_version      0.7.88
+%define libmediainfo_version      0.7.90
 %define libzen_version            0.4.33
 
 %if 0%{?fedora} || 0%{?centos_version} >= 600 || 0%{?rhel_version} >= 600
@@ -174,6 +174,7 @@ pushd Project/GNU/Library
 %else
 %configure --enable-shared --disable-static --enable-visibility --with-libcurl
 %endif
+
 make %{?_smp_mflags}
 popd
 
@@ -182,7 +183,7 @@ pushd Project/GNU/Library/
     make install DESTDIR=%{buildroot}
 popd
 
-# MediaInfoDLL headers and MediaInfo-config
+# MediaInfoDLL headers
 install -dm 755 %{buildroot}%{_includedir}/MediaInfo
 install -m 644 Source/MediaInfo/MediaInfo.h %{buildroot}%{_includedir}/MediaInfo
 install -m 644 Source/MediaInfo/MediaInfoList.h %{buildroot}%{_includedir}/MediaInfo
@@ -197,13 +198,8 @@ install -m 644 Source/MediaInfoDLL/MediaInfoDLL.JNative.java %{buildroot}%{_incl
 install -m 644 Source/MediaInfoDLL/MediaInfoDLL.py %{buildroot}%{_includedir}/MediaInfoDLL
 install -m 644 Source/MediaInfoDLL/MediaInfoDLL3.py %{buildroot}%{_includedir}/MediaInfoDLL
 
-sed -i -e 's|Version: |Version: %{version}|g' Project/GNU/Library/%{name_without_0_ending}.pc
-install -dm 755 %{buildroot}%{_libdir}/pkgconfig
-install -m 644 Project/GNU/Library/%{name_without_0_ending}.pc %{buildroot}%{_libdir}/pkgconfig
-
 rm -f %{buildroot}%{_libdir}/%{name_without_0_ending}.la
 
-
 %post
 
 %postun
@@ -231,11 +227,11 @@ rm -f %{buildroot}%{_libdir}/%{name_without_0_ending}.la
 %defattr(-,root,root,-)
 %{_includedir}/MediaInfo
 %{_includedir}/MediaInfoDLL
-%{_libdir}/%{name_without_0_ending}.so
 %{_libdir}/pkgconfig/*.pc
+%{_libdir}/%{name_without_0_ending}.so
 
 %changelog
-* Sun Jan 01 2012 MediaArea.net SARL <info at mediaarea.net> - 0.7.88-0
+* Sun Jan 01 2012 MediaArea.net SARL <info at mediaarea.net> - 0.7.90-0
 - See History.txt for more info and real dates
 - Previous packages made by Toni Graffy <toni at links2linux.de>
 - Fedora style made by Vasiliy N. Glazov <vascom2 at gmail.com>
diff --git a/Project/MSVC2013/Dll/MediaInfo.rc b/Project/MSVC2013/Dll/MediaInfo.rc
index c60a279..720f92d 100644
--- a/Project/MSVC2013/Dll/MediaInfo.rc
+++ b/Project/MSVC2013/Dll/MediaInfo.rc
@@ -1,8 +1,8 @@
 #include <winresrc.h>
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,7,88,0
- PRODUCTVERSION 0,7,88,0
+ FILEVERSION 0,7,90,0
+ PRODUCTVERSION 0,7,90,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -19,10 +19,10 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "MediaArea.net"
             VALUE "FileDescription", "Most relevant technical and tag data for video and audio files"
-            VALUE "FileVersion", "0.7.88.0"
+            VALUE "FileVersion", "0.7.90.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.88.0"
+            VALUE "ProductVersion", "0.7.90.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2013/Example/HowToUse.rc b/Project/MSVC2013/Example/HowToUse.rc
index c60a279..720f92d 100644
--- a/Project/MSVC2013/Example/HowToUse.rc
+++ b/Project/MSVC2013/Example/HowToUse.rc
@@ -1,8 +1,8 @@
 #include <winresrc.h>
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,7,88,0
- PRODUCTVERSION 0,7,88,0
+ FILEVERSION 0,7,90,0
+ PRODUCTVERSION 0,7,90,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -19,10 +19,10 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "MediaArea.net"
             VALUE "FileDescription", "Most relevant technical and tag data for video and audio files"
-            VALUE "FileVersion", "0.7.88.0"
+            VALUE "FileVersion", "0.7.90.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.88.0"
+            VALUE "ProductVersion", "0.7.90.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2013/ShellExtension/MediaInfoShellExt.rc b/Project/MSVC2013/ShellExtension/MediaInfoShellExt.rc
index c60a279..720f92d 100644
--- a/Project/MSVC2013/ShellExtension/MediaInfoShellExt.rc
+++ b/Project/MSVC2013/ShellExtension/MediaInfoShellExt.rc
@@ -1,8 +1,8 @@
 #include <winresrc.h>
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,7,88,0
- PRODUCTVERSION 0,7,88,0
+ FILEVERSION 0,7,90,0
+ PRODUCTVERSION 0,7,90,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -19,10 +19,10 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "MediaArea.net"
             VALUE "FileDescription", "Most relevant technical and tag data for video and audio files"
-            VALUE "FileVersion", "0.7.88.0"
+            VALUE "FileVersion", "0.7.90.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.88.0"
+            VALUE "ProductVersion", "0.7.90.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2015/Dll/MediaInfo.rc b/Project/MSVC2015/Dll/MediaInfo.rc
index b669add..8bd3ccf 100644
--- a/Project/MSVC2015/Dll/MediaInfo.rc
+++ b/Project/MSVC2015/Dll/MediaInfo.rc
@@ -1,8 +1,8 @@
 #include <winresrc.h>
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,7,88,0
- PRODUCTVERSION 0,7,88,0
+ FILEVERSION 0,7,90,0
+ PRODUCTVERSION 0,7,90,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -19,10 +19,10 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "MediaArea.net"
             VALUE "FileDescription", "Most relevant technical and tag data for video and audio files"
-            VALUE "FileVersion", "0.7.88.0"
+            VALUE "FileVersion", "0.7.90.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.88.0"
+            VALUE "ProductVersion", "0.7.90.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2015/Example/HowToUse.rc b/Project/MSVC2015/Example/HowToUse.rc
index b669add..8bd3ccf 100644
--- a/Project/MSVC2015/Example/HowToUse.rc
+++ b/Project/MSVC2015/Example/HowToUse.rc
@@ -1,8 +1,8 @@
 #include <winresrc.h>
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,7,88,0
- PRODUCTVERSION 0,7,88,0
+ FILEVERSION 0,7,90,0
+ PRODUCTVERSION 0,7,90,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -19,10 +19,10 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "MediaArea.net"
             VALUE "FileDescription", "Most relevant technical and tag data for video and audio files"
-            VALUE "FileVersion", "0.7.88.0"
+            VALUE "FileVersion", "0.7.90.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.88.0"
+            VALUE "ProductVersion", "0.7.90.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2015/Example/HowToUse_Dll.vcxproj b/Project/MSVC2015/Example/HowToUse_Dll.vcxproj
index 75cce89..d4bb4ac 100644
--- a/Project/MSVC2015/Example/HowToUse_Dll.vcxproj
+++ b/Project/MSVC2015/Example/HowToUse_Dll.vcxproj
@@ -83,7 +83,7 @@
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <Link>
-      <AdditionalLibraryDirectories>..\..\..\..\MediaInfoLib\Project\MSVC2013\Library\$(Platform)\$(Configuration);..\..\..\..\ZenLib\Project\MSVC2013\Library\$(Platform)\$(Configuration);..\..\..\..\zlib\projects\MSVC2013\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>..\..\..\..\MediaInfoLib\Project\MSVC2015\Library\$(Platform)\$(Configuration);..\..\..\..\ZenLib\Project\MSVC2015\Library\$(Platform)\$(Configuration);..\..\..\..\zlib\projects\MSVC2015\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
diff --git a/Project/MSVC2015/RegressionTest/RegressionTest.vcxproj b/Project/MSVC2015/RegressionTest/RegressionTest.vcxproj
index bc3b7b7..965fb61 100644
--- a/Project/MSVC2015/RegressionTest/RegressionTest.vcxproj
+++ b/Project/MSVC2015/RegressionTest/RegressionTest.vcxproj
@@ -100,8 +100,8 @@
     <Link>
       <SubSystem>Console</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalLibraryDirectories>..\..\..\..\ZenLib\Project\MSVC2013\Library\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>ZenLib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\..\ZenLib\Project\MSVC2015\Library\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -115,8 +115,8 @@
     <Link>
       <SubSystem>Console</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalLibraryDirectories>..\..\..\..\ZenLib\Project\MSVC2013\Library\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>ZenLib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\..\ZenLib\Project\MSVC2015\Library\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
diff --git a/Project/MSVC2015/ShellExtension/MediaInfoShellExt.rc b/Project/MSVC2015/ShellExtension/MediaInfoShellExt.rc
index b669add..8bd3ccf 100644
--- a/Project/MSVC2015/ShellExtension/MediaInfoShellExt.rc
+++ b/Project/MSVC2015/ShellExtension/MediaInfoShellExt.rc
@@ -1,8 +1,8 @@
 #include <winresrc.h>
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,7,88,0
- PRODUCTVERSION 0,7,88,0
+ FILEVERSION 0,7,90,0
+ PRODUCTVERSION 0,7,90,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -19,10 +19,10 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "MediaArea.net"
             VALUE "FileDescription", "Most relevant technical and tag data for video and audio files"
-            VALUE "FileVersion", "0.7.88.0"
+            VALUE "FileVersion", "0.7.90.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.88.0"
+            VALUE "ProductVersion", "0.7.90.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/OBS/deb6.debian/changelog b/Project/OBS/deb6.debian/changelog
index 6808ca6..3612d86 100644
--- a/Project/OBS/deb6.debian/changelog
+++ b/Project/OBS/deb6.debian/changelog
@@ -1,4 +1,4 @@
-libmediainfo (0.7.88) unstable; urgency=low
+libmediainfo (0.7.90) unstable; urgency=low
 
   * See History.txt for more info and real dates
 
diff --git a/Project/OBS/deb6.debian/rules b/Project/OBS/deb6.debian/rules
index be5d947..5e77e0d 100644
--- a/Project/OBS/deb6.debian/rules
+++ b/Project/OBS/deb6.debian/rules
@@ -68,10 +68,6 @@ install: build
 	install -m 644 Source/MediaInfoDLL/MediaInfoDLL.py $(CURDIR)/debian/tmp/usr/include/MediaInfoDLL
 	install -m 644 Source/MediaInfoDLL/MediaInfoDLL3.py $(CURDIR)/debian/tmp/usr/include/MediaInfoDLL
 
-	sed -i -e 's|Version: |Version: %{version}|g' Project/GNU/Library/libmediainfo.pc
-	install -dm 755 $(CURDIR)/debian/tmp/usr/lib/pkgconfig
-	install -m 644 Project/GNU/Library/libmediainfo.pc $(CURDIR)/debian/tmp/usr/lib/pkgconfig
-
 	install -dm 755 $(CURDIR)/debian/tmp/usr/share/doc/libmediainfo0
 	install -m 644 Release/ReadMe_DLL_Linux.txt $(CURDIR)/debian/tmp/usr/share/doc/libmediainfo0/ReadMe.txt
 	install -m 644 History_DLL.txt $(CURDIR)/debian/tmp/usr/share/doc/libmediainfo0/History.txt
diff --git a/Project/OBS/deb6.dsc b/Project/OBS/deb6.dsc
index bcc3164..ee37013 100644
--- a/Project/OBS/deb6.dsc
+++ b/Project/OBS/deb6.dsc
@@ -2,10 +2,10 @@ Format: 1.0
 Source: libmediainfo
 Binary: libmediainfo-dev, libmediainfo0 libmediainfo0-dbg
 Architecture: any
-Version: 0.7.88-1deb6
+Version: 0.7.90-1deb6
 Maintainer: MediaArea.net SARL <info at mediaarea.net>
 Homepage: http://MediaArea.net/MediaInfo
 Standards-Version: 3.7.3
 Build-Depends: debhelper (>= 5), doxygen, tofrodos, libzen-dev (>= 0.4.33), zlib1g-dev, pkg-config, automake, autoconf, libtool
 Files: 
- 00000000000000000000000000000000 000000 libmediainfo_0.7.88-1deb6.tar.gz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.90-1deb6.tar.gz
diff --git a/Project/OBS/deb9.debian/changelog b/Project/OBS/deb9.debian/changelog
index 5045228..beae681 100644
--- a/Project/OBS/deb9.debian/changelog
+++ b/Project/OBS/deb9.debian/changelog
@@ -1,6 +1,6 @@
-libmediainfo (0.7.88-1) experimental; urgency=medium
+libmediainfo (0.7.90-1) experimental; urgency=medium
 
-  * Upstream version 0.7.88
+  * Upstream version 0.7.90
     For details, see https://github.com/MediaArea/MediaInfoLib/blob/master/History_DLL.txt
 
  -- MediaArea <info at mediaarea.net>  Mon, 02 Nov 2015 10:30:00 +0100
diff --git a/Project/OBS/deb9.debian/rules b/Project/OBS/deb9.debian/rules
index 29942f4..a21457a 100755
--- a/Project/OBS/deb9.debian/rules
+++ b/Project/OBS/deb9.debian/rules
@@ -20,6 +20,7 @@ override_dh_auto_build:
 	dh_auto_build -DProject/GNU/Library
 
 override_dh_auto_install:
+
 	dh_auto_install -DProject/GNU/Library
 	for py in $(shell pyversions -vr); do												\
 		install -D -m644 Source/MediaInfoDLL/MediaInfoDLL.py debian/tmp/usr/lib/python$$py/dist-packages/MediaInfoDLL.py;	\
@@ -27,8 +28,6 @@ override_dh_auto_install:
 	for py3 in $(shell py3versions -vr); do												\
 		install -D -m644 Source/MediaInfoDLL/MediaInfoDLL3.py debian/tmp/usr/lib/python$$py3/dist-packages/MediaInfoDLL3.py;	\
 	done
-	mkdir -p debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/
-	sed -e 's|Version: |Version: $(version)|g' Project/GNU/Library/libmediainfo.pc > debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/libmediainfo.pc
 
 override_dh_auto_clean:
 	dh_auto_clean -DProject/GNU/Library
diff --git a/Project/OBS/deb9.dsc b/Project/OBS/deb9.dsc
index 005a234..7f6ac21 100644
--- a/Project/OBS/deb9.dsc
+++ b/Project/OBS/deb9.dsc
@@ -2,7 +2,7 @@ Format: 3.0 (quilt)
 Source: libmediainfo
 Binary: libmediainfo-dev, libmediainfo0v5, python-mediainfodll, python3-mediainfodll, libmediainfo-doc libmediainfo0v5-dbg
 Architecture: any all
-Version: 0.7.88-1deb9
+Version: 0.7.90-1deb9
 Maintainer: MediaArea.net SARL <info at mediaarea.net>
 Homepage: http://MediaArea.net/MediaInfo
 Standards-Version: 3.9.6
@@ -16,11 +16,11 @@ Package-List:
  python-mediainfodll deb python optional arch=all
  python3-mediainfodll deb python optional arch=all
 Checksums-Sha1:
- 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.88.orig.tar.xz
- 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.88-1deb9.debian.tar.xz
+ 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
+ 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.90-1deb9.debian.tar.xz
 Checksums-Sha256:
- 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.88.orig.tar.xz
- 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.88-1deb9.debian.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.90-1deb9.debian.tar.xz
 Files:
- 00000000000000000000000000000000 000000 libmediainfo_0.7.88.orig.tar.xz
- 00000000000000000000000000000000 000000 libmediainfo_0.7.88-1deb9.debian.tar.xz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.90-1deb9.debian.tar.xz
diff --git a/Project/Solaris/mkpkg b/Project/Solaris/mkpkg
index 8c4fede..7e61c0c 100755
--- a/Project/Solaris/mkpkg
+++ b/Project/Solaris/mkpkg
@@ -9,7 +9,7 @@ release=`uname -r`
 
 #Creation of known directories and filenames
 name="libmediainfo0"
-version="0.7.88"
+version="0.7.90"
 Home=`pwd`
 install_prefix=${Home}/mk_package
 packagecreation_prefix=${Home}/create_package
diff --git a/Project/version.txt b/Project/version.txt
index e62d4dd..8bc6633 100644
--- a/Project/version.txt
+++ b/Project/version.txt
@@ -1 +1 @@
-0.7.88
+0.7.90
diff --git a/Source/Install/MediaInfo_DLL_Windows_i386.nsi b/Source/Install/MediaInfo_DLL_Windows_i386.nsi
index b16a6bb..f2ef8dd 100644
--- a/Source/Install/MediaInfo_DLL_Windows_i386.nsi
+++ b/Source/Install/MediaInfo_DLL_Windows_i386.nsi
@@ -4,7 +4,7 @@ RequestExecutionLevel admin
 ; Some defines
 !define PRODUCT_NAME "MediaInfo"
 !define PRODUCT_PUBLISHER "MediaArea.net"
-!define PRODUCT_VERSION "0.7.88"
+!define PRODUCT_VERSION "0.7.90"
 !define PRODUCT_VERSION4 "${PRODUCT_VERSION}.0"
 !define PRODUCT_WEB_SITE "http://MediaArea.net/MediaInfo"
 !define COMPANY_REGISTRY "Software\MediaArea.net"
diff --git a/Source/Install/MediaInfo_DLL_Windows_x64.nsi b/Source/Install/MediaInfo_DLL_Windows_x64.nsi
index f3575e4..141cd86 100644
--- a/Source/Install/MediaInfo_DLL_Windows_x64.nsi
+++ b/Source/Install/MediaInfo_DLL_Windows_x64.nsi
@@ -4,7 +4,7 @@ RequestExecutionLevel admin
 ; Some defines
 !define PRODUCT_NAME "MediaInfo"
 !define PRODUCT_PUBLISHER "MediaArea.net"
-!define PRODUCT_VERSION "0.7.88"
+!define PRODUCT_VERSION "0.7.90"
 !define PRODUCT_VERSION4 "${PRODUCT_VERSION}.0"
 !define PRODUCT_WEB_SITE "http://MediaArea.net/MediaInfo"
 !define COMPANY_REGISTRY "Software\MediaArea.net"
diff --git a/Source/MediaInfo/Audio/File_Aac.cpp b/Source/MediaInfo/Audio/File_Aac.cpp
index 69d9f23..d3ca059 100644
--- a/Source/MediaInfo/Audio/File_Aac.cpp
+++ b/Source/MediaInfo/Audio/File_Aac.cpp
@@ -40,6 +40,12 @@ namespace MediaInfoLib
 File_Aac::File_Aac()
 :File__Analyze(), File__Tags_Helper()
 {
+    //Config
+    #if MEDIAINFO_EVENTS
+        ParserIDs[0]=MediaInfo_Parser_Aac;
+        StreamIDs_Width[0]=0;
+    #endif //MEDIAINFO_EVENTS
+
     //File__Tags_Helper
     Base=this;
 
diff --git a/Source/MediaInfo/Audio/File_Aac_GeneralAudio.cpp b/Source/MediaInfo/Audio/File_Aac_GeneralAudio.cpp
index f2f7647..6db0df2 100644
--- a/Source/MediaInfo/Audio/File_Aac_GeneralAudio.cpp
+++ b/Source/MediaInfo/Audio/File_Aac_GeneralAudio.cpp
@@ -39,7 +39,7 @@ extern const char* Aac_audioObjectType(int8u audioObjectType);
 extern const char* Aac_Format_Profile(int8u ID);
 
 //---------------------------------------------------------------------------
-const char* Aac_id_syn_ele[8]=
+static const char* Aac_id_syn_ele[8]=
 {
     "SCE - single_channel_element",
     "CPE - channel_pair_element",
@@ -52,7 +52,7 @@ const char* Aac_id_syn_ele[8]=
 };
 
 //---------------------------------------------------------------------------
-const char* Aac_window_sequence[4]=
+static const char* Aac_window_sequence[4]=
 {
     "ONLY_LONG_SEQUENCE",
     "LONG_START_SEQUENCE",
diff --git a/Source/MediaInfo/Audio/File_Aac_Main.cpp b/Source/MediaInfo/Audio/File_Aac_Main.cpp
index e3a1e7d..83ef8ba 100644
--- a/Source/MediaInfo/Audio/File_Aac_Main.cpp
+++ b/Source/MediaInfo/Audio/File_Aac_Main.cpp
@@ -42,14 +42,14 @@ extern const int32u Aac_sampling_frequency[13]=
  16000, 12000, 11025,  8000,  7350};
 
 //---------------------------------------------------------------------------
-const char* Aac_Adts_ID[]=
+static const char* Aac_Adts_ID[]=
 {
     "MPEG-4",
     "MPEG-2",
 };
 
 //---------------------------------------------------------------------------
-const char* Aac_Format(int8u ID)
+static const char* Aac_Format(int8u ID)
 {
     switch (ID)
     {
@@ -156,7 +156,7 @@ const char* Aac_audioObjectType(int8u audioObjectType)
 }
 
 //---------------------------------------------------------------------------
-const int8u Aac_Channels[]=
+static const int8u Aac_Channels[]=
 {
     0,
     1,
@@ -177,7 +177,7 @@ const int8u Aac_Channels[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Aac_ChannelConfiguration[]=
+static const char* Aac_ChannelConfiguration[]=
 {
     "",
     "Front: C",
@@ -198,7 +198,7 @@ const char* Aac_ChannelConfiguration[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Aac_ChannelConfiguration2[]=
+static const char* Aac_ChannelConfiguration2[]=
 {
     "",
     "1/0/0",
@@ -219,7 +219,7 @@ const char* Aac_ChannelConfiguration2[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Aac_ChannelLayout[]=
+static const char* Aac_ChannelLayout[]=
 {
     "",
     "C",
diff --git a/Source/MediaInfo/Audio/File_Ac3.cpp b/Source/MediaInfo/Audio/File_Ac3.cpp
index 7147b6f..44cbb7c 100644
--- a/Source/MediaInfo/Audio/File_Ac3.cpp
+++ b/Source/MediaInfo/Audio/File_Ac3.cpp
@@ -779,6 +779,7 @@ void File_Ac3::Streams_Fill()
         Fill(Stream_General, 0, General_Format, "AC-3");
         Fill(Stream_Audio, 0, Audio_Format, "AC-3");
         Fill(Stream_Audio, 0, Audio_Codec, "AC3");
+        Fill(Stream_Audio, 0, Audio_BitDepth, 16);
 
         int32u Divider=bsid_Max==9?2:1; // Unofficial hack for low sample rate (e.g. 22.05 kHz)
         if (Ztring::ToZtring(AC3_SamplingRate[fscod]/Divider)!=Retrieve(Stream_Audio, 0, Audio_SamplingRate))
diff --git a/Source/MediaInfo/Audio/File_DolbyE.cpp b/Source/MediaInfo/Audio/File_DolbyE.cpp
index bcb2dcf..2547625 100644
--- a/Source/MediaInfo/Audio/File_DolbyE.cpp
+++ b/Source/MediaInfo/Audio/File_DolbyE.cpp
@@ -36,6 +36,8 @@
 
 //---------------------------------------------------------------------------
 #include "MediaInfo/Audio/File_DolbyE.h"
+#include <cmath>
+using namespace std;
 //---------------------------------------------------------------------------
 
 namespace MediaInfoLib
@@ -54,16 +56,16 @@ const int8u DolbyE_Channels[64]=
 {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 
 //---------------------------------------------------------------------------
-const int8u DolbyE_Channels_PerProgram(int8u program_config, int8u program)
+const int8u DolbyE_Channels_PerProgram(int8u ProgramConfiguration, int8u ProgramNumber)
 {
-    switch (program_config)
+    switch (ProgramConfiguration)
     {
-        case  0 :   switch (program)
+        case  0 :   switch (ProgramNumber)
                     {
                         case  0 :   return 6;
                         default :   return 2;
                     }
-        case  1 :   switch (program)
+        case  1 :   switch (ProgramNumber)
                     {
                         case  0 :   return 6;
                         default :   return 1;
@@ -71,19 +73,19 @@ const int8u DolbyE_Channels_PerProgram(int8u program_config, int8u program)
         case  2 :
         case 18 :   return 4;
         case  3 :
-        case 12 :   switch (program)
+        case 12 :   switch (ProgramNumber)
                     {
                         case  0 :   return 4;
                         default :   return 2;
                     }
-        case  4 :   switch (program)
+        case  4 :   switch (ProgramNumber)
                     {
                         case  0 :   return 4;
                         case  1 :   return 2;
                         default :   return 1;
                     }
         case  5 :
-        case 13 :   switch (program)
+        case 13 :   switch (ProgramNumber)
                     {
                         case  0 :   return 4;
                         default :   return 1;
@@ -91,7 +93,7 @@ const int8u DolbyE_Channels_PerProgram(int8u program_config, int8u program)
         case  6 :
         case 14 :
         case 19 :   return 2;
-        case  7 :   switch (program)
+        case  7 :   switch (ProgramNumber)
                     {
                         case  0 :
                         case  1 :
@@ -99,7 +101,7 @@ const int8u DolbyE_Channels_PerProgram(int8u program_config, int8u program)
                         default :   return 1;
                     }
         case  8 :
-        case 15 :   switch (program)
+        case 15 :   switch (ProgramNumber)
                     {
                         case  0 :
                         case  1 :   return 2;
@@ -107,7 +109,7 @@ const int8u DolbyE_Channels_PerProgram(int8u program_config, int8u program)
                     }
         case  9 :
         case 16 :
-        case 20 :   switch (program)
+        case 20 :   switch (ProgramNumber)
                     {
                         case  0 :   return 2;
                         default :   return 1;
@@ -192,16 +194,16 @@ const char*  DolbyE_ChannelPositions[64]=
 };
 
 //---------------------------------------------------------------------------
-const char*  DolbyE_ChannelPositions_PerProgram(int8u program_config, int8u program)
+const char*  DolbyE_ChannelPositions_PerProgram(int8u ProgramConfiguration, int8u ProgramNumber)
 {
-    switch (program_config)
+    switch (ProgramConfiguration)
     {
-        case  0 :   switch (program)
+        case  0 :   switch (ProgramNumber)
                     {
                         case  0 :   return "Front: L C R, Side: L R, LFE";
                         default :   return "Front: L R";
                     }
-        case  1 :   switch (program)
+        case  1 :   switch (ProgramNumber)
                     {
                         case  0 :   return "Front: L C R, Side: L R, LFE";
                         default :   return "Front: C";
@@ -209,19 +211,19 @@ const char*  DolbyE_ChannelPositions_PerProgram(int8u program_config, int8u prog
         case  2 :
         case 18 :   return "Front: L C R, LFE";
         case  3 :
-        case 12 :   switch (program)
+        case 12 :   switch (ProgramNumber)
                     {
                         case  0 :   return "Front: L C R, LFE";
                         default :   return "Front: L R";
                     }
-        case  4 :   switch (program)
+        case  4 :   switch (ProgramNumber)
                     {
                         case  0 :   return "Front: L C R, LFE";
                         case  1 :   return "Front: L R";
                         default :   return "Front: C";
                     }
         case  5 :
-        case 13 :   switch (program)
+        case 13 :   switch (ProgramNumber)
                     {
                         case  0 :   return "Front: L C R, LFE";
                         default :   return "Front: C";
@@ -229,7 +231,7 @@ const char*  DolbyE_ChannelPositions_PerProgram(int8u program_config, int8u prog
         case  6 :
         case 14 :
         case 19 :   return "Front: L R";
-        case  7 :   switch (program)
+        case  7 :   switch (ProgramNumber)
                     {
                         case  0 :
                         case  1 :
@@ -237,7 +239,7 @@ const char*  DolbyE_ChannelPositions_PerProgram(int8u program_config, int8u prog
                         default :   return "Front: C";
                     }
         case  8 :
-        case 15 :   switch (program)
+        case 15 :   switch (ProgramNumber)
                     {
                         case  0 :
                         case  1 :   return "Front: L R";
@@ -245,7 +247,7 @@ const char*  DolbyE_ChannelPositions_PerProgram(int8u program_config, int8u prog
                     }
         case  9 :
         case 16 :
-        case 20 :   switch (program)
+        case 20 :   switch (ProgramNumber)
                     {
                         case  0 :   return "Front: L R";
                         default :   return "Front: C";
@@ -330,16 +332,16 @@ const char*  DolbyE_ChannelPositions2[64]=
 };
 
 //---------------------------------------------------------------------------
-const char*  DolbyE_ChannelPositions2_PerProgram(int8u program_config, int8u program)
+const char*  DolbyE_ChannelPositions2_PerProgram(int8u ProgramConfiguration, int8u ProgramNumber)
 {
-    switch (program_config)
+    switch (ProgramConfiguration)
     {
-        case  0 :   switch (program)
+        case  0 :   switch (ProgramNumber)
                     {
                         case  0 :   return "3/2/0.1";
                         default :   return "2/0/0";
                     }
-        case  1 :   switch (program)
+        case  1 :   switch (ProgramNumber)
                     {
                         case  0 :   return "3/2/0.1";
                         default :   return "1/0/0";
@@ -347,19 +349,19 @@ const char*  DolbyE_ChannelPositions2_PerProgram(int8u program_config, int8u pro
         case  2 :
         case 18 :   return "3/0/0.1";
         case  3 :
-        case 12 :   switch (program)
+        case 12 :   switch (ProgramNumber)
                     {
                         case  0 :   return "3/0/0.1";
                         default :   return "2/0/0";
                     }
-        case  4 :   switch (program)
+        case  4 :   switch (ProgramNumber)
                     {
                         case  0 :   return "3/0/0.1";
                         case  1 :   return "2/0/0";
                         default :   return "1/0/0";
                     }
         case  5 :
-        case 13 :   switch (program)
+        case 13 :   switch (ProgramNumber)
                     {
                         case  0 :   return "3/0/0.1";
                         default :   return "1/0/0";
@@ -367,7 +369,7 @@ const char*  DolbyE_ChannelPositions2_PerProgram(int8u program_config, int8u pro
         case  6 :
         case 14 :
         case 19 :   return "Front: L R";
-        case  7 :   switch (program)
+        case  7 :   switch (ProgramNumber)
                     {
                         case  0 :
                         case  1 :
@@ -375,7 +377,7 @@ const char*  DolbyE_ChannelPositions2_PerProgram(int8u program_config, int8u pro
                         default :   return "1/0/0";
                     }
         case  8 :
-        case 15 :   switch (program)
+        case 15 :   switch (ProgramNumber)
                     {
                         case  0 :
                         case  1 :   return "2/0/0";
@@ -383,7 +385,7 @@ const char*  DolbyE_ChannelPositions2_PerProgram(int8u program_config, int8u pro
                     }
         case  9 :
         case 16 :
-        case 20 :   switch (program)
+        case 20 :   switch (ProgramNumber)
                     {
                         case  0 :   return "2/0/0";
                         default :   return "1/0/0";
@@ -578,6 +580,8 @@ File_DolbyE::File_DolbyE()
 
     //In
     GuardBand_Before=0;
+
+    //Out
     GuardBand_After=0;
 
     //Temp
@@ -593,16 +597,16 @@ File_DolbyE::File_DolbyE()
 void File_DolbyE::Streams_Fill()
 {
     Fill(Stream_General, 0, General_Format, "Dolby E");
-    for (int8u program=0; program<DolbyE_Programs[ProgramConfiguration]; program++)
+    for (int8u ProgramNumber=0; ProgramNumber<DolbyE_Programs[ProgramConfiguration]; ProgramNumber++)
     {
         Stream_Prepare(Stream_Audio);
         Fill(Stream_Audio, StreamPos_Last, Audio_Format, "Dolby E");
         if (DolbyE_Programs[ProgramConfiguration]>1)
             Fill(Stream_Audio, StreamPos_Last, Audio_ID, Count_Get(Stream_Audio));
-        Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, DolbyE_Channels_PerProgram(ProgramConfiguration, program));
-        Fill(Stream_Audio, StreamPos_Last, Audio_ChannelPositions, DolbyE_ChannelPositions_PerProgram(ProgramConfiguration, program));
-        Fill(Stream_Audio, StreamPos_Last, Audio_ChannelPositions_String2, DolbyE_ChannelPositions2_PerProgram(ProgramConfiguration, program));
-        Fill(Stream_Audio, StreamPos_Last, Audio_ChannelLayout, DolbyE_ChannelLayout_PerProgram(ProgramConfiguration, program));
+        Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, DolbyE_Channels_PerProgram(ProgramConfiguration, ProgramNumber));
+        Fill(Stream_Audio, StreamPos_Last, Audio_ChannelPositions, DolbyE_ChannelPositions_PerProgram(ProgramConfiguration, ProgramNumber));
+        Fill(Stream_Audio, StreamPos_Last, Audio_ChannelPositions_String2, DolbyE_ChannelPositions2_PerProgram(ProgramConfiguration, ProgramNumber));
+        Fill(Stream_Audio, StreamPos_Last, Audio_ChannelLayout, DolbyE_ChannelLayout_PerProgram(ProgramConfiguration, ProgramNumber));
         Fill(Stream_Audio, StreamPos_Last, Audio_SamplingRate, 48000);
         Fill(Stream_Audio, StreamPos_Last, Audio_BitDepth, BitDepth);
         if (SMPTE_time_code_StartTimecode!=(int64u)-1)
@@ -623,9 +627,7 @@ void File_DolbyE::Streams_Fill()
                 Fill(Stream_Audio, StreamPos_Last, "GuardBand_Before/String", Ztring::ToZtring(GuardBand_Before_Initial_Duration*1000000, 0)+Ztring().From_UTF8(" \xC2xB5s")); //0xC2 0xB5 = micro sign
                 (*Stream_More)[Stream_Audio][StreamPos_Last](Ztring().From_Local("GuardBand_Before"), Info_Options)=__T("N NT");
                 (*Stream_More)[Stream_Audio][StreamPos_Last](Ztring().From_Local("GuardBand_Before/String"), Info_Options)=__T("N NT");
-            }
-            if (GuardBand_Before_Initial)
-            {
+
                 float GuardBand_After_Initial_Duration=GuardBand_After_Initial*8/BitRate;
                 Fill(Stream_Audio, StreamPos_Last, "GuardBand_After", GuardBand_After_Initial_Duration, 9);
                 Fill(Stream_Audio, StreamPos_Last, "GuardBand_After/String", Ztring::ToZtring(GuardBand_After_Initial_Duration*1000000, 0)+Ztring().From_UTF8(" \xC2xB5s")); //0xC2 0xB5 = micro sign
@@ -645,7 +647,7 @@ void File_DolbyE::Streams_Fill()
 bool File_DolbyE::Synchronize()
 {
     //Synchronizing
-    while (Buffer_Offset+32<=Buffer_Size)
+    while (Buffer_Offset+3<=Buffer_Size)
     {
         if ((CC2(Buffer+Buffer_Offset_Temp)&0xFFFE)==0x078E) //16-bit
         {
@@ -669,7 +671,7 @@ bool File_DolbyE::Synchronize()
     }
 
     //Parsing last bytes if needed
-    if (Buffer_Offset+8>Buffer_Size)
+    if (Buffer_Offset+3>Buffer_Size)
         return false;
 
     //Synched
@@ -680,7 +682,7 @@ bool File_DolbyE::Synchronize()
 bool File_DolbyE::Synched_Test()
 {
     //Must have enough buffer for having header
-    if (Buffer_Offset+32>Buffer_Size)
+    if (Buffer_Offset+3>Buffer_Size)
         return false;
 
     //Quick test of synchro
@@ -774,6 +776,9 @@ void File_DolbyE::Data_Parse()
     Block();
     BS_End();
 
+    if (Element_Offset<Element_Size)
+        Skip_XX(Element_Size-Element_Offset,                    "Unknown");
+
     //In case of scrambling
     if (ScrambledBitStream)
     {
@@ -783,6 +788,46 @@ void File_DolbyE::Data_Parse()
     }
 
     FILLING_BEGIN();
+        {
+            //Guard band
+            if (Mpegv_frame_rate[FrameRate])
+            {
+            int64u BytesPerSecond=96000*BitDepth/8;
+            float64 BytesPerFrame=BytesPerSecond/Mpegv_frame_rate[FrameRate];
+            int64u BytesUpToLastFrame;
+            int64u BytesUpToNextFrame;
+            for (;;)
+            {
+                BytesUpToLastFrame=(int64u)(BytesPerFrame*Frame_Count);
+                BytesUpToLastFrame/=BitDepth/4;
+                BytesUpToLastFrame*=BitDepth/4;
+                BytesUpToNextFrame=(int64u)(BytesPerFrame*(Frame_Count+1));
+                BytesUpToNextFrame/=BitDepth/4;
+                BytesUpToNextFrame*=BitDepth/4;
+
+                if (BytesUpToLastFrame+GuardBand_Before<BytesUpToNextFrame)
+                    break;
+
+                // In case previous frame was PCM
+                Frame_Count++;
+                GuardBand_Before-=BytesUpToNextFrame-BytesUpToLastFrame;
+            }
+            GuardBand_After=BytesUpToNextFrame-BytesUpToLastFrame;
+            int64u ToRemove=GuardBand_Before+(BitDepth>>1)+Element_Size; // Guardband + AES3 header + Dolby E frame
+            if (ToRemove<GuardBand_After)
+                GuardBand_After-=ToRemove;
+            else
+                GuardBand_After=0;
+            GuardBand_After/=BitDepth/4;
+            GuardBand_After*=BitDepth/4;
+
+            Element_Info1(GuardBand_Before);
+            float64 GuardBand_Before_Duration=((float64)GuardBand_Before)/BytesPerSecond;
+            Ztring GuardBand_Before_String=__T("GuardBand_Begin ")+Ztring::ToZtring(GuardBand_Before)+__T(" (")+Ztring::ToZtring(GuardBand_Before_Duration*1000000, 0)+Ztring().From_UTF8(" \0xC20xB5s"); //0xC20xB5 = micro sign
+            Element_Info1(GuardBand_Before_String);
+            }
+        }
+
         if (!Status[IsAccepted])
         {
             Accept("Dolby E");
@@ -820,16 +865,44 @@ void File_DolbyE::Block()
         switch (BitDepth)
         {
             case 16 :
-                        if (!Descramble_16bit())
-                            return;
+                        {
+                        int16u ScrambleMask;
+                        Get_S2 (16, ScrambleMask, "Scramble Mask");
+                        int16u metadata_segment_size=((BigEndian2int16u(Buffer+Buffer_Offset+(size_t)Element_Size-Data_BS_Remain()/8)^ScrambleMask)>>2)&0x3FF;
+
+                        if (Data_BS_Remain()<((size_t)metadata_segment_size+1)*(size_t)BitDepth) //+1 for CRC
+                            return; //There is a problem
+
+                        int8u* Temp=Descrambled_Buffer+(size_t)Element_Size-Data_BS_Remain()/8;
+                        for (int16u Pos=0; Pos<metadata_segment_size+1; Pos++)
+                            int16u2BigEndian(Temp+Pos*2, BigEndian2int16u(Temp+Pos*2)^ScrambleMask);
+                        }
                         break;
             case 20 :
-                        if (!Descramble_20bit())
-                            return;
+                        {
+                        int32u ScrambleMask;
+                        Get_S3 (20, ScrambleMask, "Scramble Mask");
+                        int16u metadata_segment_size=((BigEndian2int16u(Buffer+Buffer_Offset+(size_t)Element_Size-Data_BS_Remain()/8)^(ScrambleMask>>4))>>2)&0x3FF;
+
+                        if (Data_BS_Remain()<((size_t)metadata_segment_size+1)*(size_t)BitDepth) //+1 for CRC
+                            return; //There is a problem
+
+                        Descramble_20bit(ScrambleMask, metadata_segment_size);
+                        }
                         break;
             case 24 :
-                        if (!Descramble_24bit())
-                            return;
+                        {
+                        int32u ScrambleMask;
+                        Get_S3 (24, ScrambleMask, "Scramble Mask");
+                        int32u metadata_segment_size=((BigEndian2int16u(Buffer+Buffer_Offset+(size_t)Element_Size-Data_BS_Remain()/8)^ScrambleMask)>>2)&0x3FF;
+
+                        if (Data_BS_Remain()<((size_t)metadata_segment_size+1)*BitDepth) //+1 for CRC
+                            return; //There is a problem
+
+                        int8u* Temp=Descrambled_Buffer+(size_t)Element_Size-Data_BS_Remain()/8;
+                        for (int16u Pos=0; Pos<metadata_segment_size+1; Pos++)
+                            int24u2BigEndian(Temp+Pos*2, BigEndian2int24u(Temp+Pos*2)^ScrambleMask);
+                        }
                         break;
             default :   ;
         }
@@ -873,8 +946,6 @@ void File_DolbyE::Block()
     Get_S1 (2, Frames_Tens,                                     "Frames (Tens)");
     Get_S1 (4, Frames_Units,                                    "Frames (Units)");
 
-    Skip_BS(Data_BS_Remain(),                                   "Unknown");
-
     if (Hours_Tens<3)
     {
         int64u TimeCode=(int64u)(Hours_Tens     *10*60*60*1000
@@ -898,66 +969,23 @@ void File_DolbyE::Block()
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-bool File_DolbyE::Descramble_16bit ()
+void File_DolbyE::Descramble_20bit (int32u key, int16u size)
 {
-    int16u ScrambleMask;
-    Get_S2 (16, ScrambleMask, "Scramble mask");
-    int16u Size=((BigEndian2int16u(Buffer+Buffer_Offset+(size_t)Element_Size-Data_BS_Remain()/8)^ScrambleMask)>>2)&0x3FF;
-
-    if (Data_BS_Remain()<(size_t)((Size+1)*BitDepth)) //+1 for additional unknown word
-        return false; //There is a problem
-
     int8u* Temp=Descrambled_Buffer+(size_t)Element_Size-Data_BS_Remain()/8;
-    for (int16u Pos=0; Pos<Size; Pos++)
-        int16u2BigEndian(Temp+Pos*2, BigEndian2int16u(Temp+Pos*2)^ScrambleMask);
-
-    return true;
-}
-
-//---------------------------------------------------------------------------
-bool File_DolbyE::Descramble_20bit ()
-{
-    int32u ScrambleMask;
-    Get_S3 (20, ScrambleMask, "Scramble mask");
-    int16u Size=((BigEndian2int16u(Buffer+Buffer_Offset+(size_t)Element_Size-Data_BS_Remain()/8)^(ScrambleMask>>4))>>2)&0x3FF;
-
-    if (Data_BS_Remain()<(size_t)((Size+1)*BitDepth)) //+1 for additional unknown word
-        return false; //There is a problem
-
-    int8u* Temp=Descrambled_Buffer+(size_t)Element_Size-Data_BS_Remain()/8;
-    int64u ScrambleMasks=(((int64u)ScrambleMask)<<20)|ScrambleMask;
+    int64u keys=(((int64u)key)<<20)|key;
     bool Half;
     if (Data_BS_Remain()%8)
     {
         Temp--;
-        int24u2BigEndian(Temp, BigEndian2int24u(Temp)^(ScrambleMask));
+        int24u2BigEndian(Temp, BigEndian2int24u(Temp)^(key));
         Half=true;
     }
     else
         Half=false;
-    for (int16u Pos=0; Pos<Size-(Half?1:0); Pos+=2)
-        int40u2BigEndian(Temp+(Half?3:0)+Pos*5/2, BigEndian2int40u(Temp+(Half?3:0)+Pos*5/2)^ScrambleMasks);
-    if ((Size-((Size && Half)?1:0))%2==0)
-        int24u2BigEndian(Temp+(Half?3:0)+(Size-((Size && Half)?1:0))*5/2, BigEndian2int24u(Temp+(Half?3:0)+(Size-((Size && Half)?1:0))*5/2)^(((int32u)ScrambleMasks)<<4));
-
-    return true;
-}
-
-//---------------------------------------------------------------------------
-bool File_DolbyE::Descramble_24bit ()
-{
-    int32u ScrambleMask;
-    Get_S3 (24, ScrambleMask, "Scramble mask");
-    int32u Size=((BigEndian2int24u(Buffer+Buffer_Offset+(size_t)Element_Size-Data_BS_Remain()/8)^ScrambleMask)>>2)&0x3FF;
-
-    if (Data_BS_Remain()<(size_t)((Size+1)*BitDepth)) //+1 for additional unknown word
-        return false; //There is a problem
-
-    int8u* Temp=Descrambled_Buffer+(size_t)Element_Size-Data_BS_Remain()/8;
-    for (int16u Pos=0; Pos<Size; Pos++)
-        int24u2BigEndian(Temp+Pos*2, BigEndian2int24u(Temp+Pos*2)^ScrambleMask);
-
-    return true;
+    for (int16u Pos=0; Pos<size-(Half?1:0); Pos+=2)
+        int40u2BigEndian(Temp+(Half?3:0)+Pos*5/2, BigEndian2int40u(Temp+(Half?3:0)+Pos*5/2)^keys);
+    if ((size-((size && Half)?1:0))%2==0)
+        int24u2BigEndian(Temp+(Half?3:0)+(size-((size && Half)?1:0))*5/2, BigEndian2int24u(Temp+(Half?3:0)+(size-((size && Half)?1:0))*5/2)^(key<<4));
 }
 
 //***************************************************************************
diff --git a/Source/MediaInfo/Audio/File_DolbyE.h b/Source/MediaInfo/Audio/File_DolbyE.h
index 0ab35e6..269d315 100644
--- a/Source/MediaInfo/Audio/File_DolbyE.h
+++ b/Source/MediaInfo/Audio/File_DolbyE.h
@@ -30,8 +30,10 @@ class File_DolbyE : public File__Analyze
 {
 public :
     //In
-    int64u GuardBand_Before;
-    int64u GuardBand_After;
+    int64s GuardBand_Before;
+    
+    //Out
+    int64s GuardBand_After;
 
     //Constructor/Destructor
     File_DolbyE();
@@ -52,9 +54,7 @@ private :
     void Block();
 
     //Helpers
-    bool Descramble_16bit();
-    bool Descramble_20bit();
-    bool Descramble_24bit();
+    void Descramble_20bit(int32u key, int16u size);
 
     //Temp
     int64u  SMPTE_time_code_StartTimecode;
diff --git a/Source/MediaInfo/Audio/File_Dts.cpp b/Source/MediaInfo/Audio/File_Dts.cpp
index fd290da..8b5ea97 100644
--- a/Source/MediaInfo/Audio/File_Dts.cpp
+++ b/Source/MediaInfo/Audio/File_Dts.cpp
@@ -40,21 +40,21 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char*  DTS_FrameType[]=
+static const char*  DTS_FrameType[]=
 {
     "Termination",
     "Normal",
 };
 
 //---------------------------------------------------------------------------
-const int32u DTS_SamplingRate[]=
+static const int32u DTS_SamplingRate[]=
 {
         0,  8000,  16000,  32000,      0,      0,  11025,  22050,
     44100,     0,      0,  12000,  24000,  48000,  96000, 192000,
 };
 
 //---------------------------------------------------------------------------
-const int32u DTS_BitRate[]=
+static const int32u DTS_BitRate[]=
 {
       32000,   56000,   64000,   96000,  112000,  128000,  192000,  224000,
      256000,  320000,  384000,  448000,  512000,  576000,  640000,  754500,
@@ -63,14 +63,14 @@ const int32u DTS_BitRate[]=
 };
 
 //---------------------------------------------------------------------------
-const int8u DTS_Channels[]=
+static const int8u DTS_Channels[]=
 {
     1, 2, 2, 2, 2, 3, 3, 4,
     4, 5, 6, 6, 6, 7, 8, 8,
 };
 
 //---------------------------------------------------------------------------
-const int8u DTS_Resolution[]=
+static const int8u DTS_Resolution[]=
 {16, 20, 24, 24};
 
 //---------------------------------------------------------------------------
@@ -116,7 +116,7 @@ const char*  DTS_ChannelPositions2[16]=
 };
 
 //---------------------------------------------------------------------------
-const char*  DTS_ChannelLayout[16]=
+static const char*  DTS_ChannelLayout[16]=
 {
     "C",
     "1+1",
@@ -137,7 +137,7 @@ const char*  DTS_ChannelLayout[16]=
 };
 
 //---------------------------------------------------------------------------
-const char* DTS_ExtensionAudioDescriptor[]=
+static const char* DTS_ExtensionAudioDescriptor[]=
 {
     "Channel Extension",
     "Reserved",
@@ -150,7 +150,7 @@ const char* DTS_ExtensionAudioDescriptor[]=
 };
 
 //---------------------------------------------------------------------------
-const char* DTS_HD_RefClockCode[]=
+static const char* DTS_HD_RefClockCode[]=
 {
     "1/32000",
     "1/44100",
@@ -290,7 +290,7 @@ std::string DTS_HD_SpeakerActivityMask2 (int16u SpeakerActivityMask, bool AddCs=
 }
 
 //---------------------------------------------------------------------------
-const char* DTS_HD_TypeDescriptor[]=
+static const char* DTS_HD_TypeDescriptor[]=
 {
     "Music",
     "Effects",
@@ -311,7 +311,7 @@ const char* DTS_HD_TypeDescriptor[]=
 };
 
 //---------------------------------------------------------------------------
-int32u DTS_HD_MaximumSampleRate[]=
+static int32u DTS_HD_MaximumSampleRate[]=
 {
       8000,
      16000,
diff --git a/Source/MediaInfo/Audio/File_OpenMG.cpp b/Source/MediaInfo/Audio/File_OpenMG.cpp
index f41481f..a82a7f4 100644
--- a/Source/MediaInfo/Audio/File_OpenMG.cpp
+++ b/Source/MediaInfo/Audio/File_OpenMG.cpp
@@ -38,7 +38,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* OpenMG_CodecID_Format (int8u CodecID)
+static const char* OpenMG_CodecID_Format (int8u CodecID)
 {
     switch (CodecID)
     {
@@ -53,7 +53,7 @@ const char* OpenMG_CodecID_Format (int8u CodecID)
 }
 
 //---------------------------------------------------------------------------
-const char* OpenMG_CodecID_Encryption (int8u CodecID)
+static const char* OpenMG_CodecID_Encryption (int8u CodecID)
 {
     switch (CodecID)
     {
@@ -63,7 +63,7 @@ const char* OpenMG_CodecID_Encryption (int8u CodecID)
 }
 
 //---------------------------------------------------------------------------
-int32u OpenMG_SamplingRate (int8u SamplingRate_Code)
+static int32u OpenMG_SamplingRate (int8u SamplingRate_Code)
 {
     switch (SamplingRate_Code)
     {
@@ -77,7 +77,7 @@ int32u OpenMG_SamplingRate (int8u SamplingRate_Code)
 }
 
 //---------------------------------------------------------------------------
-int8u OpenMG_Channels (int8u Channels_Code)
+static int8u OpenMG_Channels (int8u Channels_Code)
 {
     if (Channels_Code<=4)
         return Channels_Code;
@@ -86,7 +86,7 @@ int8u OpenMG_Channels (int8u Channels_Code)
 }
 
 //---------------------------------------------------------------------------
-const char* OpenMG_ChannelPositions (int8u Channels_Code)
+static const char* OpenMG_ChannelPositions (int8u Channels_Code)
 {
     switch (Channels_Code)
     {
diff --git a/Source/MediaInfo/Audio/File_Opus.cpp b/Source/MediaInfo/Audio/File_Opus.cpp
index 608506e..9ddc605 100644
--- a/Source/MediaInfo/Audio/File_Opus.cpp
+++ b/Source/MediaInfo/Audio/File_Opus.cpp
@@ -37,7 +37,7 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-const char*  Opus_ChannelPositions[]=
+static const char*  Opus_ChannelPositions[]=
 {
     "",
     "Front: C",
@@ -51,7 +51,7 @@ const char*  Opus_ChannelPositions[]=
 };
 
 //---------------------------------------------------------------------------
-const char*  Opus_ChannelPositions2[]=
+static const char*  Opus_ChannelPositions2[]=
 {
     "",
     "1/0/0",
diff --git a/Source/MediaInfo/Audio/File_Pcm.cpp b/Source/MediaInfo/Audio/File_Pcm.cpp
index 9b88795..e6e8e16 100644
--- a/Source/MediaInfo/Audio/File_Pcm.cpp
+++ b/Source/MediaInfo/Audio/File_Pcm.cpp
@@ -35,7 +35,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Smpte_St0302_ChannelsPositions(int8u Channels)
+static const char* Smpte_St0302_ChannelsPositions(int8u Channels)
 {
     switch (Channels)
     {
@@ -48,7 +48,7 @@ const char* Smpte_St0302_ChannelsPositions(int8u Channels)
 }
 
 //---------------------------------------------------------------------------
-const char* Smpte_St0302_ChannelsPositions2(int8u Channels)
+static const char* Smpte_St0302_ChannelsPositions2(int8u Channels)
 {
     switch (Channels)
     {
@@ -393,25 +393,32 @@ void File_Pcm::Data_Parse()
     #if MEDIAINFO_DEMUX
     if (Frame_Count_Valid_Demux)
     {
-        Frame_Count+=Frame_Count_Valid_Demux-1;
+        FrameInfo_Next=frame_info();
+        Frame_Count+=Frame_Count_Valid_Demux;
         if (Frame_Count_NotParsedIncluded!=(int64u)-1)
-            Frame_Count_NotParsedIncluded+=Frame_Count_Valid_Demux-1;
-        FrameInfo.DUR/=Frame_Count_Valid_Demux;
-        if (FrameInfo.DTS!=(int64u)-1)
-            FrameInfo.DTS+=FrameInfo.DUR*Frame_Count;
+            Frame_Count_NotParsedIncluded+=Frame_Count_Valid_Demux;
+        if (FrameInfo.DTS!=(int64u)-1 && FrameInfo.DUR!=(int64u)-1)
+        {
+            FrameInfo.DUR/=Frame_Count_Valid_Demux;
+            if (FrameInfo.DTS!=(int64u)-1)
+                FrameInfo.DTS+=FrameInfo.DUR*Frame_Count;
+        }
         Frame_Count_Valid_Demux=0;
     }
+    else
     #endif //MEDIAINFO_DEMUX
-    Frame_Count++;
-    if (Frame_Count_NotParsedIncluded!=(int64u)-1)
-        Frame_Count_NotParsedIncluded++;
-    if (FrameInfo.DTS!=(int64u)-1 && FrameInfo.DUR!=(int64u)-1)
     {
-        if (BitDepth && Channels && SamplingRate)
-            FrameInfo.DTS+=Element_Size*1000000000*8/BitDepth/Channels/SamplingRate;
-        else
-            FrameInfo.DTS+=FrameInfo.DUR;
-        FrameInfo.PTS=FrameInfo.DTS;
+        if (FrameInfo.DTS!=(int64u)-1 && FrameInfo.DUR!=(int64u)-1)
+        {
+            if (BitDepth && Channels && SamplingRate)
+                FrameInfo.DTS+=Element_Size*1000000000*8/BitDepth/Channels/SamplingRate;
+            else
+                FrameInfo.DTS+=FrameInfo.DUR;
+            FrameInfo.PTS=FrameInfo.DTS;
+        }
+        Frame_Count++;
+        if (Frame_Count_NotParsedIncluded!=(int64u)-1)
+            Frame_Count_NotParsedIncluded++;
     }
     if ((!Status[IsAccepted] && Frame_Count>=Frame_Count_Valid) || File_Offset+Buffer_Size>=File_Size)
     {
diff --git a/Source/MediaInfo/Audio/File_Pcm_M2ts.cpp b/Source/MediaInfo/Audio/File_Pcm_M2ts.cpp
index d6f7e14..ab9dbcf 100644
--- a/Source/MediaInfo/Audio/File_Pcm_M2ts.cpp
+++ b/Source/MediaInfo/Audio/File_Pcm_M2ts.cpp
@@ -35,7 +35,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-int8u Pcm_M2TS_channel_assignment[16]=
+static int8u Pcm_M2TS_channel_assignment[16]=
 {
         0,
         1,
@@ -56,7 +56,7 @@ int8u Pcm_M2TS_channel_assignment[16]=
 };
 
 //---------------------------------------------------------------------------
-int32u Pcm_M2TS_sampling_frequency[16]=
+static int32u Pcm_M2TS_sampling_frequency[16]=
 {
         0,
     48000,
@@ -77,7 +77,7 @@ int32u Pcm_M2TS_sampling_frequency[16]=
 };
 
 //---------------------------------------------------------------------------
-int8u Pcm_M2TS_bits_per_sample[4]=
+static int8u Pcm_M2TS_bits_per_sample[4]=
 {
         0,
        16,
diff --git a/Source/MediaInfo/Audio/File_Pcm_Vob.cpp b/Source/MediaInfo/Audio/File_Pcm_Vob.cpp
index eb94b69..e19439d 100644
--- a/Source/MediaInfo/Audio/File_Pcm_Vob.cpp
+++ b/Source/MediaInfo/Audio/File_Pcm_Vob.cpp
@@ -35,7 +35,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-int32u Pcm_VOB_BitDepth[]=
+static int32u Pcm_VOB_BitDepth[]=
 {
     16,
     20,
@@ -44,7 +44,7 @@ int32u Pcm_VOB_BitDepth[]=
 };
 
 //---------------------------------------------------------------------------
-int32u Pcm_VOB_Frequency[]=
+static int32u Pcm_VOB_Frequency[]=
 {
     48000,
     32000,
diff --git a/Source/MediaInfo/Audio/File_SmpteSt0302.cpp b/Source/MediaInfo/Audio/File_SmpteSt0302.cpp
index 319cd3d..7af6a48 100644
--- a/Source/MediaInfo/Audio/File_SmpteSt0302.cpp
+++ b/Source/MediaInfo/Audio/File_SmpteSt0302.cpp
@@ -53,6 +53,10 @@ File_SmpteSt0302::File_SmpteSt0302()
     #endif //MEDIAINFO_EVENTS
     PTS_DTS_Needed=true;
     IsRawStream=true;
+    #if MEDIAINFO_EVENTS
+        pid=(int16u)-1;
+        stream_id=(int8u)-1;
+    #endif MEDIAINFO_EVENTS
 }
 
 //---------------------------------------------------------------------------
@@ -83,6 +87,9 @@ void File_SmpteSt0302::Streams_Accept()
                 SmpteSt0337->Demux_UnpacketizeContainer=true;
             }
         #endif //MEDIAINFO_DEMUX
+        #if MEDIAINFO_EVENTS
+            SmpteSt0337->IgnoreGuardBandTest=true;
+        #endif //MEDIAINFO_EVENTS
         Parsers.push_back(SmpteSt0337);
     }
 
diff --git a/Source/MediaInfo/Audio/File_SmpteSt0302.h b/Source/MediaInfo/Audio/File_SmpteSt0302.h
index 7ed5fd6..2d711dd 100644
--- a/Source/MediaInfo/Audio/File_SmpteSt0302.h
+++ b/Source/MediaInfo/Audio/File_SmpteSt0302.h
@@ -33,6 +33,11 @@ public :
     File_SmpteSt0302();
     ~File_SmpteSt0302();
 
+    #if MEDIAINFO_EVENTS
+        int16u pid;
+        int8u  stream_id;
+    #endif MEDIAINFO_EVENTS
+
 private :
     //Streams management
     void Streams_Accept();
diff --git a/Source/MediaInfo/Audio/File_SmpteSt0331.cpp b/Source/MediaInfo/Audio/File_SmpteSt0331.cpp
index e26f375..3560e36 100644
--- a/Source/MediaInfo/Audio/File_SmpteSt0331.cpp
+++ b/Source/MediaInfo/Audio/File_SmpteSt0331.cpp
@@ -44,7 +44,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Smpte_St0331_ChannelsPositions(int8u number_channels)
+static const char* Smpte_St0331_ChannelsPositions(int8u number_channels)
 {
     switch (number_channels)
     {
@@ -57,7 +57,7 @@ const char* Smpte_St0331_ChannelsPositions(int8u number_channels)
 }
 
 //---------------------------------------------------------------------------
-const char* Smpte_St0331_ChannelsPositions2(int8u number_channels)
+static const char* Smpte_St0331_ChannelsPositions2(int8u number_channels)
 {
     switch (number_channels)
     {
diff --git a/Source/MediaInfo/Audio/File_SmpteSt0337.cpp b/Source/MediaInfo/Audio/File_SmpteSt0337.cpp
index 51bc414..b86bce5 100644
--- a/Source/MediaInfo/Audio/File_SmpteSt0337.cpp
+++ b/Source/MediaInfo/Audio/File_SmpteSt0337.cpp
@@ -51,7 +51,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Smpte_St0337_data_type[32]= // SMPTE ST 338
+static const char* Smpte_St0337_data_type[32]= // SMPTE ST 338
 {
     "",
     "AC-3",
@@ -88,7 +88,7 @@ const char* Smpte_St0337_data_type[32]= // SMPTE ST 338
 };
 
 //---------------------------------------------------------------------------
-stream_t Smpte_St0337_data_type_StreamKind[32]= // SMPTE 338M
+static stream_t Smpte_St0337_data_type_StreamKind[32]= // SMPTE 338M
 {
     Stream_Max,
     Stream_Audio,
@@ -153,6 +153,12 @@ File_SmpteSt0337::File_SmpteSt0337()
     GuardBand_After=0;
     NullPadding_Size=0;
 
+    #if MEDIAINFO_EVENTS
+        pid=(int16u)-1;
+        stream_id=(int8u)-1;
+        IgnoreGuardBandTest=false;
+    #endif MEDIAINFO_EVENTS
+
     // Parser
     Parser=NULL;
 
@@ -582,18 +588,28 @@ bool File_SmpteSt0337::Synchronize()
             Buffer_Offset++;
     }
 
-    // Guard band
-    GuardBand_Before+=Buffer_Offset-Buffer_Offset_Base;
-
     // Parsing last bytes if needed
     if (Buffer_Offset+16>Buffer_Size)
     {
+        if (!Status[IsAccepted])
+            GuardBand_Before+=Buffer_Offset;
         return false;
     }
 
     if (!Status[IsAccepted])
         Accept("SMPTE ST 337");
 
+    // Guard band
+    GuardBand_Before+=Buffer_Offset-Buffer_Offset_Base;
+    if (GuardBand_After)
+    {
+        if (GuardBand_Before>GuardBand_After)
+            GuardBand_Before-=GuardBand_After;
+        else
+            GuardBand_Before=0;
+        GuardBand_After=0;
+    }
+
     // Synched
     return true;
 }
@@ -601,6 +617,9 @@ bool File_SmpteSt0337::Synchronize()
 //---------------------------------------------------------------------------
 bool File_SmpteSt0337::Synched_Test()
 {
+    // Guard band
+    size_t Buffer_Offset_Base=Buffer_Offset;
+
     // Skip NULL padding
     size_t Buffer_Offset_Temp=Buffer_Offset;
     if (Aligned)
@@ -718,8 +737,6 @@ bool File_SmpteSt0337::Synched_Test()
         {
             Element_Size=Buffer_Offset_Temp-Buffer_Offset;
             Skip_XX(Buffer_Offset_Temp-Buffer_Offset,           "Guard band");
-
-            GuardBand_Before+=Buffer_Offset_Temp-Buffer_Offset;
         }
     #endif // MEDIAINFO_TRACE
     Buffer_Offset=Buffer_Offset_Temp;
@@ -786,6 +803,17 @@ bool File_SmpteSt0337::Synched_Test()
         default    : ; // Should never happen
     }
 
+    // Guard band
+    GuardBand_Before+=Buffer_Offset-Buffer_Offset_Base;
+    if (GuardBand_After)
+    {
+        if (GuardBand_Before>GuardBand_After)
+            GuardBand_Before-=GuardBand_After;
+        else
+            GuardBand_Before=0;
+        GuardBand_After=0;
+    }
+
     // We continue
     return true;
 }
@@ -869,7 +897,6 @@ void File_SmpteSt0337::Header_Parse()
     if (Container_Bits!=Stream_Bits)
     {
         Size*=Container_Bits; Size/=Stream_Bits;
-        GuardBand_Before*=Container_Bits; GuardBand_Before/=Stream_Bits;
     }
 
     // Coherency test
@@ -903,10 +930,6 @@ void File_SmpteSt0337::Header_Parse()
     // Filling
     Header_Fill_Size(Container_Bits*4/8+Size/8);
     Header_Fill_Code(0, "SMPTE ST 337");
-
-    //Guard band
-    if (IsSub && FrameInfo.DTS!=(int64u)-1)
-        GuardBand_After+=Element_Size-(Container_Bits*4/8+Size/8);
 }
 
 //---------------------------------------------------------------------------
@@ -1261,13 +1284,17 @@ void File_SmpteSt0337::Data_Parse()
         }
      #endif //MEDIAINFO_DEMUX
 
+    // Guard band
+    GuardBand_After=0;
+
     if (Parser && !Parser->Status[IsFinished])
     {
         switch(data_type)
         {
             case 28 :
-                        ((File_DolbyE*)Parser)->GuardBand_Before+=GuardBand_Before;
-                        ((File_DolbyE*)Parser)->GuardBand_After+=GuardBand_After;
+                        ((File_DolbyE*)Parser)->GuardBand_Before=GuardBand_Before;
+                        ((File_DolbyE*)Parser)->GuardBand_Before*=Stream_Bits;
+                        ((File_DolbyE*)Parser)->GuardBand_Before/=Container_Bits;
                         break;
             default : ;
         }
@@ -1283,6 +1310,16 @@ void File_SmpteSt0337::Data_Parse()
                 FrameInfo.DTS=(int64u)-1;
             FrameInfo.PTS=FrameInfo.DTS;
         #endif // MEDIAINFO_DEMUX
+
+        switch (data_type)
+        {
+            case 28 :
+                        GuardBand_After=((File_DolbyE*)Parser)->GuardBand_After;
+                        GuardBand_After*=Container_Bits;
+                        GuardBand_After/=Stream_Bits;
+                        break;
+            default : ;
+        }
     }
     else
     {
@@ -1313,7 +1350,6 @@ void File_SmpteSt0337::Data_Parse()
 
     // Guard band
     GuardBand_Before=0;
-    GuardBand_After=0;
 }
 
 //***************************************************************************
diff --git a/Source/MediaInfo/Audio/File_SmpteSt0337.h b/Source/MediaInfo/Audio/File_SmpteSt0337.h
index 5987e4f..e190187 100644
--- a/Source/MediaInfo/Audio/File_SmpteSt0337.h
+++ b/Source/MediaInfo/Audio/File_SmpteSt0337.h
@@ -34,6 +34,12 @@ public :
     int8u   Endianness;
     bool    Aligned;
 
+    #if MEDIAINFO_EVENTS
+        int16u pid;
+        int8u  stream_id;
+        bool   IgnoreGuardBandTest;
+    #endif MEDIAINFO_EVENTS
+
     // Constructor/Destructor
     File_SmpteSt0337();
     ~File_SmpteSt0337();
@@ -69,8 +75,8 @@ private :
     int8u   Stream_Bits;
     int8u   data_type;
     std::map<int64u, int64u> FrameSizes;
-    int64u  GuardBand_Before;
-    int64u  GuardBand_After;
+    int64s  GuardBand_Before;
+    int64s  GuardBand_After;
     size_t  NullPadding_Size;
 
     // Parser
diff --git a/Source/MediaInfo/Audio/File_TwinVQ.cpp b/Source/MediaInfo/Audio/File_TwinVQ.cpp
index 9895065..91f10f0 100644
--- a/Source/MediaInfo/Audio/File_TwinVQ.cpp
+++ b/Source/MediaInfo/Audio/File_TwinVQ.cpp
@@ -40,7 +40,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* TwinVQ_samplerate(int32u samplerate)
+static const char* TwinVQ_samplerate(int32u samplerate)
 {
     switch (samplerate)
     {
diff --git a/Source/MediaInfo/Audio/File_Vorbis.cpp b/Source/MediaInfo/Audio/File_Vorbis.cpp
index 9311214..06c7948 100644
--- a/Source/MediaInfo/Audio/File_Vorbis.cpp
+++ b/Source/MediaInfo/Audio/File_Vorbis.cpp
@@ -36,7 +36,7 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-int8u ilog(int32u Value)
+static int8u ilog(int32u Value)
 {
     int8u ToReturn=0;
     while(Value)
diff --git a/Source/MediaInfo/Audio/File_Wvpk.cpp b/Source/MediaInfo/Audio/File_Wvpk.cpp
index 3cb843c..eee8438 100644
--- a/Source/MediaInfo/Audio/File_Wvpk.cpp
+++ b/Source/MediaInfo/Audio/File_Wvpk.cpp
@@ -38,7 +38,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const int16u Wvpk_Resolution[]=
+static const int16u Wvpk_Resolution[]=
 {
      8,
     16,
@@ -47,7 +47,7 @@ const int16u Wvpk_Resolution[]=
 };
 
 //---------------------------------------------------------------------------
-const int32u Wvpk_SamplingRate[]=
+static const int32u Wvpk_SamplingRate[]=
 {
       6000,
       8000,
@@ -68,7 +68,7 @@ const int32u Wvpk_SamplingRate[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Wvpk_id(int8u ID)
+static const char* Wvpk_id(int8u ID)
 {
     switch (ID)
     {
@@ -576,7 +576,7 @@ void File_Wvpk::id_07()
 
     FILLING_BEGIN();
         if (Retrieve(Stream_Audio, 0, Audio_Compression_Mode).empty())
-            Fill(Stream_Audio, 0, Audio_Compression_Mode, "Lossless");
+            Fill(Stream_Audio, 0, Audio_Compression_Mode, "Lossless", Unlimited, true, true);
     FILLING_END();
 }
 
diff --git a/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.cpp b/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.cpp
index fddcf06..21b3dfa 100644
--- a/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.cpp
+++ b/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.cpp
@@ -44,7 +44,7 @@ namespace MediaInfoLib
 // Init: int32u CRC_32 = 0xFFFFFFFF;
 // for each data byte do
 //     CRC_32=(CRC_32<<8) ^ CRC_32_Table[(CRC_32>>24)^(data_byte)];
-extern int32u Psi_CRC_32_Table[256];
+extern const int32u Psi_CRC_32_Table[256];
 
 //***************************************************************************
 // Constructor/Destructor
diff --git a/Source/MediaInfo/Export/Export_Mpeg7.cpp b/Source/MediaInfo/Export/Export_Mpeg7.cpp
index e297ff9..4ee0e4f 100644
--- a/Source/MediaInfo/Export/Export_Mpeg7.cpp
+++ b/Source/MediaInfo/Export/Export_Mpeg7.cpp
@@ -84,7 +84,7 @@ const Char* Mpeg7_Type(MediaInfo_Internal &MI) //TO ADAPT
         return __T("Video");
     if (Format==__T("MPEG Audio") || Format==__T("Wave"))
         return __T("Audio");
-    if (Format==__T("BMP") || Format==__T("GIF") || Format==__T("JPEG") || Format==__T("JPEG 2000") || Format==__T("JPEG 2000") || Format==__T("PNG") || Format==__T("TIFF"))
+    if (Format==__T("BMP") || Format==__T("GIF") || Format==__T("JPEG") || Format==__T("JPEG 2000") || Format==__T("PNG") || Format==__T("TIFF"))
         return __T("Image");
     return __T("Multimedia");
 }
diff --git a/Source/MediaInfo/File__Analyze.cpp b/Source/MediaInfo/File__Analyze.cpp
index 6e8438a..dee33d3 100644
--- a/Source/MediaInfo/File__Analyze.cpp
+++ b/Source/MediaInfo/File__Analyze.cpp
@@ -52,6 +52,95 @@ extern MediaInfo_Config Config;
 //---------------------------------------------------------------------------
 
 //***************************************************************************
+// Info
+//***************************************************************************
+
+//---------------------------------------------------------------------------
+extern const wchar_t ISO_6937_2_Tables[] = // ISO 6937-2 to Unicode
+{   //  0xC0-xCF (6937-2 diacritical marks) x 0x40-0x7F (ASCII letters)
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //4 //C0
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x00C0', L'\x0000', L'\x0000', L'\x0000', L'\x00C8', L'\x0000', L'\x0000', L'\x0000', L'\x00CC', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00D2', //4 //C1
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00D9', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x00E0', L'\x0000', L'\x0000', L'\x0000', L'\x00E8', L'\x0000', L'\x0000', L'\x0000', L'\x00EC', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00F2', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00F9', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x00C1', L'\x0000', L'\x0106', L'\x0000', L'\x00C9', L'\x0000', L'\x0000', L'\x0000', L'\x00CD', L'\x0000', L'\x0000', L'\x0139', L'\x0000', L'\x0143', L'\x00D3', //4 //C2
+    L'\x0000', L'\x0000', L'\x0154', L'\x015A', L'\x0000', L'\x00DA', L'\x0000', L'\x0000', L'\x0000', L'\x00DD', L'\x0179', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x00E1', L'\x0000', L'\x0107', L'\x0000', L'\x00E9', L'\x0000', L'\x0000', L'\x0000', L'\x00ED', L'\x0000', L'\x0000', L'\x013A', L'\x0000', L'\x0144', L'\x00F3', //6
+    L'\x0000', L'\x0155', L'\x015B', L'\x0000', L'\x0000', L'\x00FA', L'\x0000', L'\x0000', L'\x0000', L'\x00FD', L'\x017A', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x00C2', L'\x0000', L'\x0108', L'\x0000', L'\x00CA', L'\x0000', L'\x011C', L'\x0124', L'\x00CE', L'\x0134', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00D4', //4 //C3
+    L'\x0000', L'\x0000', L'\x0000', L'\x015C', L'\x0000', L'\x00DB', L'\x0000', L'\x0174', L'\x0000', L'\x0176', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x00E2', L'\x0000', L'\x0109', L'\x0000', L'\x00EA', L'\x0000', L'\x011D', L'\x0125', L'\x00EE', L'\x0135', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00F4', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x015D', L'\x0000', L'\x00FB', L'\x0000', L'\x0175', L'\x0000', L'\x0177', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x00C3', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0128', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00D1', L'\x00D5', //4 //C4
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0168', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x00E3', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0129', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00F1', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0169', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x0100', L'\x0000', L'\x0000', L'\x0000', L'\x0112', L'\x0000', L'\x0000', L'\x0000', L'\x012A', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //4 //C5
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x016A', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x0101', L'\x0000', L'\x0000', L'\x0000', L'\x0113', L'\x0000', L'\x0000', L'\x0000', L'\x012B', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x014D', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x016B', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x0102', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x011E', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //4 //C6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x016C', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x0103', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x011F', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x016D', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x0000', L'\x0000', L'\x010A', L'\x0000', L'\x0116', L'\x0000', L'\x0120', L'\x0000', L'\x0130', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //4 //C7
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x017B', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x0000', L'\x0000', L'\x010B', L'\x0000', L'\x0117', L'\x0000', L'\x0121', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x017C', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x00C4', L'\x0000', L'\x0000', L'\x0000', L'\x00CB', L'\x0000', L'\x0000', L'\x0000', L'\x00CF', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00D6', //4 //C8
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00DC', L'\x0000', L'\x0000', L'\x0000', L'\x0178', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x00E4', L'\x0000', L'\x0000', L'\x0000', L'\x00EB', L'\x0000', L'\x0000', L'\x0000', L'\x00EF', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00F6', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x00FC', L'\x0000', L'\x0000', L'\x0000', L'\x00FF', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //4 //C9
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x00C5', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //4 //CA
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x016E', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x00E5', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x016F', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x0000', L'\x0000', L'\x00C7', L'\x0000', L'\x0000', L'\x0000', L'\x0122', L'\x0000', L'\x0000', L'\x0000', L'\x0136', L'\x013B', L'\x0000', L'\x0145', L'\x0000', //4 //CB
+    L'\x0000', L'\x0000', L'\x0156', L'\x015E', L'\x0162', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x0162', L'\x0000', L'\x00E7', L'\x0000', L'\x0000', L'\x0000', L'\x0123', L'\x0000', L'\x0000', L'\x0000', L'\x0137', L'\x013C', L'\x0000', L'\x0146', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0157', L'\x015F', L'\x0163', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //4 //CC
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0150', //4 //CD
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0170', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0151', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0171', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0104', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0118', L'\x0000', L'\x0000', L'\x0000', L'\x012E', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //4 //CE
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0172', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0105', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0119', L'\x0000', L'\x0000', L'\x0000', L'\x012F', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0173', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+    //     0          1          2          3          4          5          6          7          8          9          A          B          C          D          E          F
+    L'\x0000', L'\x0000', L'\x0000', L'\x010C', L'\x010E', L'\x011A', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x013D', L'\x0000', L'\x0147', L'\x0000', //4 //CF
+    L'\x0000', L'\x0000', L'\x0158', L'\x0160', L'\x0164', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x017D', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //5
+    L'\x0000', L'\x0000', L'\x0000', L'\x010D', L'\x010F', L'\x011B', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x013E', L'\x0000', L'\x0148', L'\x0000', //6
+    L'\x0000', L'\x0000', L'\x0159', L'\x0161', L'\x0165', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x017E', L'\x0000', L'\x0000', L'\x0000', L'\x0000', L'\x0000', //7
+};
+
+//***************************************************************************
 // Constructor/Destructor
 //***************************************************************************
 
diff --git a/Source/MediaInfo/File__Analyze.h b/Source/MediaInfo/File__Analyze.h
index 4077d7c..50427f6 100644
--- a/Source/MediaInfo/File__Analyze.h
+++ b/Source/MediaInfo/File__Analyze.h
@@ -1051,7 +1051,12 @@ public :
     #ifdef SIZE_T_IS_LONG
     inline void Fill (stream_t StreamKind, size_t StreamPos, const char* Parameter, size_t         Value, int8u Radix=10, bool Replace=false) {Fill(StreamKind, StreamPos, Parameter, Ztring::ToZtring(Value, Radix).MakeUpperCase(), Replace);}
     #endif //SIZE_T_IS_LONG
-    ZtringListList Fill_Temp;
+    struct fill_temp_item
+    {
+        Ztring Parameter;
+        Ztring Value;
+    };
+    vector<fill_temp_item> Fill_Temp[Stream_Max+1]; // +1 because Fill_Temp[Stream_Max] is used when StreamKind is unknown
     void Fill_Flush ();
     static size_t Fill_Parameter(stream_t StreamKind, generic StreamPos);
 
@@ -1115,6 +1120,10 @@ public :
     void CodecID_Fill           (const Ztring &Value, stream_t StreamKind, size_t StreamPos, infocodecid_format_t Format, stream_t StreamKind_CodecID=Stream_Max);
     void PixelAspectRatio_Fill  (const Ztring &Value, stream_t StreamKind, size_t StreamPos, size_t Parameter_Width, size_t Parameter_Height, size_t Parameter_PixelAspectRatio, size_t Parameter_DisplayAspectRatio);
     void DisplayAspectRatio_Fill(const Ztring &Value, stream_t StreamKind, size_t StreamPos, size_t Parameter_Width, size_t Parameter_Height, size_t Parameter_PixelAspectRatio, size_t Parameter_DisplayAspectRatio);
+    #if MEDIAINFO_EVENTS
+    static stream_t Streamkind_Get(int8u* ParserIDs, size_t StreamIDs_Size) {if ((ParserIDs[StreamIDs_Size-1]&0xF0)==0x80) return Stream_Video; if ((ParserIDs[StreamIDs_Size-1]&0xF0)==0xA0) return Stream_Audio; return Stream_Max;}
+    stream_t Streamkind_Get() {return Streamkind_Get(ParserIDs, StreamIDs_Size);}
+    #endif //MEDIAINFO_EVENTS
 
     //***************************************************************************
     // Finalize
@@ -1229,6 +1238,9 @@ protected :
     bool Synchronize_0x000001();
 public:
     void TestContinuousFileNames(size_t CountOfFiles=24, Ztring FileExtension=Ztring(), bool SkipComputeDelay=false);
+    #if MEDIAINFO_FIXITY
+    bool FixFile(int64u FileOffsetForWriting, const int8u* ToWrite, const size_t ToWrite_Size);
+    #endif// MEDIAINFO_FIXITY
 
 private :
 
@@ -1442,7 +1454,11 @@ public :
         {
 
     #define FILLING_BEGIN_PRECISE() \
-        if (Element_IsOK() && Element_Offset==Element_Size) \
+        if (Element_Offset!=Element_Size) \
+        { \
+            Trusted_IsNot("Size is wrong"); \
+        } \
+        if (Element_IsOK()) \
         {
 
     //Else
diff --git a/Source/MediaInfo/File__Analyze_Buffer.cpp b/Source/MediaInfo/File__Analyze_Buffer.cpp
index 3d4e3f9..1c8878a 100644
--- a/Source/MediaInfo/File__Analyze_Buffer.cpp
+++ b/Source/MediaInfo/File__Analyze_Buffer.cpp
@@ -1672,6 +1672,7 @@ void File__Analyze::Get_Local(int64u Bytes, Ztring &Info, const char* Name)
 }
 
 //---------------------------------------------------------------------------
+extern const wchar_t ISO_6937_2_Tables[];
 void File__Analyze::Get_ISO_6937_2(int64u Bytes, Ztring &Info, const char* Name)
 {
     INTEGRITY_SIZE_ATLEAST_STRING(Bytes);
@@ -1765,9 +1766,14 @@ void File__Analyze::Get_ISO_6937_2(int64u Bytes, Ztring &Info, const char* Name)
         {
             if (Pos+1<End)
             {
+                if (Buffer[Pos]>=0xC0 && Buffer[Pos]<=0xCF && Buffer[Pos+1]>=0x40 && Buffer[Pos+1]<=0x7F)
+                    Info+=Ztring().From_Unicode(ISO_6937_2_Tables[((Buffer[Pos]-0xC0))*0x40+(Buffer[Pos+1]-0x40)]);
+                else
+                {
                 Info+=(Char)(Buffer[Pos+1]);
                 Info+=Ztring().From_Unicode(&EscapeChar, 1); //(EscapeChar) after new ZenLib release
-                EscapeChar=L'\x0000';
+                }
+                EscapeChar=__T('\x0000');
                 Pos++;
             }
         }
diff --git a/Source/MediaInfo/File__Analyze_Buffer_MinimizeSize.cpp b/Source/MediaInfo/File__Analyze_Buffer_MinimizeSize.cpp
index 2f10737..61e61b8 100644
--- a/Source/MediaInfo/File__Analyze_Buffer_MinimizeSize.cpp
+++ b/Source/MediaInfo/File__Analyze_Buffer_MinimizeSize.cpp
@@ -1243,6 +1243,7 @@ void File__Analyze::Get_Local(int64u Bytes, Ztring &Info)
 }
 
 //---------------------------------------------------------------------------
+extern const wchar_t ISO_6937_2_Tables[];
 void File__Analyze::Get_ISO_6937_2(int64u Bytes, Ztring &Info)
 {
     INTEGRITY_SIZE_ATLEAST_STRING(Bytes);
@@ -1336,15 +1337,19 @@ void File__Analyze::Get_ISO_6937_2(int64u Bytes, Ztring &Info)
         {
             if (Pos+1<End)
             {
+                if (Buffer[Pos]>=0xC0 && Buffer[Pos]<=0xCF && Buffer[Pos+1]>=0x40 && Buffer[Pos+1]<=0x7F)
+                    Info+=Ztring().From_Unicode(ISO_6937_2_Tables[((Buffer[Pos]-0xC0))*0x40+(Buffer[Pos+1]-0x40)]);
+                else
+                {
                 Info+=(Char)(Buffer[Pos+1]);
                 Info+=Ztring().From_Unicode(&EscapeChar, 1); //(EscapeChar) after new ZenLib release
+                }
                 EscapeChar=__T('\x0000');
                 Pos++;
             }
         }
         else if (NewChar)
             Info+=Ztring().From_Unicode(&NewChar, 1); //(NewChar) after new ZenLib release
-
     }
     Element_Offset+=Bytes;
 }
diff --git a/Source/MediaInfo/File__Analyze_Element.cpp b/Source/MediaInfo/File__Analyze_Element.cpp
index ec6a98c..274a782 100644
--- a/Source/MediaInfo/File__Analyze_Element.cpp
+++ b/Source/MediaInfo/File__Analyze_Element.cpp
@@ -760,7 +760,7 @@ int element_details::Element_Node::Print_Micro_Xml(std::ostringstream& ss, size_
     else
         ss << " s=\"" << Size << "\">";
 
-	level += 4;
+    level += 4;
 print_children:
     for (size_t i = 0; i < Children.size(); ++i)
         Children[i]->Print_Micro_Xml(ss, level);
@@ -836,7 +836,7 @@ int element_details::Element_Node::Print_Xml(std::ostringstream& ss, size_t leve
 
     ss << "\n";
 
-	level += 4;
+    level += 4;
 print_children:
     for (size_t i = 0; i < Children.size(); ++i)
         Children[i]->Print_Xml(ss, level);
@@ -925,7 +925,7 @@ int element_details::Element_Node::Print_Tree(std::ostringstream& ss, size_t lev
 
     ss << "\n";
 
-	level += 1;
+    level += 1;
 print_children:
     for (size_t i = 0; i < Children.size(); ++i)
         Children[i]->Print_Tree(ss, level);
diff --git a/Source/MediaInfo/File__Analyze_MinimizeSize.h b/Source/MediaInfo/File__Analyze_MinimizeSize.h
index b0add6b..47481db 100644
--- a/Source/MediaInfo/File__Analyze_MinimizeSize.h
+++ b/Source/MediaInfo/File__Analyze_MinimizeSize.h
@@ -340,18 +340,19 @@ public :
     //***************************************************************************
 
     //Param - Main
-    #define Param1(_A)
-    #define Param2(_A,_B)
-    #define Param3(_A,_B,_C)
+    inline void noop() {}
+    #define Param1(_A) noop()
+    #define Param2(_A,_B) noop()
+    #define Param3(_A,_B,_C) noop()
 
     //Param - Info
-    #define Param_Info1(_A)
-    #define Param_Info2(_A,_B)
-    #define Param_Info3(_A,_B,_C)
-    #define Param_Info1C(_CONDITION,_A)
-    #define Param_Info2C(_CONDITION,_A,_B)
-    #define Param_Info3C(_CONDITION,_A,_B,_C)
-    #define Param_Info_From_Milliseconds(A)
+    #define Param_Info1(_A) noop()
+    #define Param_Info2(_A,_B) noop()
+    #define Param_Info3(_A,_B,_C) noop()
+    #define Param_Info1C(_CONDITION,_A) noop()
+    #define Param_Info2C(_CONDITION,_A,_B) noop()
+    #define Param_Info3C(_CONDITION,_A,_B,_C) noop()
+    #define Param_Info_From_Milliseconds(A) noop()
 
     //***************************************************************************
     // Information
@@ -1054,7 +1055,12 @@ public :
     #ifdef SIZE_T_IS_LONG
     inline void Fill (stream_t StreamKind, size_t StreamPos, const char* Parameter, size_t         Value, int8u Radix=10, bool Replace=false) {Fill(StreamKind, StreamPos, Parameter, Ztring::ToZtring(Value, Radix).MakeUpperCase(), Replace);}
     #endif //SIZE_T_IS_LONG
-    ZtringListList Fill_Temp;
+    struct fill_temp_item
+    {
+        Ztring Parameter;
+        Ztring Value;
+    };
+    vector<fill_temp_item> Fill_Temp[Stream_Max+1]; // +1 because Fill_Temp[Stream_Max] is used when StreamKind is unknown
     void Fill_Flush ();
     static size_t Fill_Parameter(stream_t StreamKind, generic StreamPos);
 
@@ -1127,6 +1133,10 @@ public :
     void CodecID_Fill           (const Ztring &Value, stream_t StreamKind, size_t StreamPos, infocodecid_format_t Format, stream_t StreamKind_CodecID=Stream_Max);
     void PixelAspectRatio_Fill  (const Ztring &Value, stream_t StreamKind, size_t StreamPos, size_t Parameter_Width, size_t Parameter_Height, size_t Parameter_PixelAspectRatio, size_t Parameter_DisplayAspectRatio);
     void DisplayAspectRatio_Fill(const Ztring &Value, stream_t StreamKind, size_t StreamPos, size_t Parameter_Width, size_t Parameter_Height, size_t Parameter_PixelAspectRatio, size_t Parameter_DisplayAspectRatio);
+    #if MEDIAINFO_EVENTS
+    static stream_t Streamkind_Get(int8u* ParserIDs, size_t StreamIDs_Size) {if ((ParserIDs[StreamIDs_Size-1]&0xF0)==0x80) return Stream_Video; if ((ParserIDs[StreamIDs_Size-1]&0xF0)==0xA0) return Stream_Audio; return Stream_Max;}
+    stream_t Streamkind_Get() {return Streamkind_Get(ParserIDs, StreamIDs_Size);}
+    #endif //MEDIAINFO_EVENTS
 
     //***************************************************************************
     // Finalize
@@ -1238,6 +1248,9 @@ protected :
     bool Synchronize_0x000001();
 public:
     void TestContinuousFileNames(size_t CountOfFiles=24, Ztring FileExtension=Ztring(), bool SkipComputeDelay=false);
+    #if MEDIAINFO_FIXITY
+    bool FixFile(int64u FileOffsetForWriting, const int8u* ToWrite, const size_t ToWrite_Size);
+    #endif// MEDIAINFO_FIXITY
 
 private :
 
diff --git a/Source/MediaInfo/File__Analyze_Streams.cpp b/Source/MediaInfo/File__Analyze_Streams.cpp
index b6a0a13..411b881 100644
--- a/Source/MediaInfo/File__Analyze_Streams.cpp
+++ b/Source/MediaInfo/File__Analyze_Streams.cpp
@@ -44,7 +44,7 @@ extern MediaInfo_Config Config;
 size_t File__Analyze::Stream_Prepare (stream_t KindOfStream, size_t StreamPos)
 {
     //Integrity
-    if (!Status[IsAccepted] || KindOfStream>Stream_Max)
+    if (KindOfStream>Stream_Max)
         return Error;
 
     //Clear
@@ -169,18 +169,19 @@ size_t File__Analyze::Stream_Prepare (stream_t KindOfStream, size_t StreamPos)
         Fill (Stream_General, 0, General_FileSize, File_Size);
 
     //Fill with already ready data
-    for (size_t Pos=0; Pos<Fill_Temp.size(); Pos++)
-        if (Fill_Temp(Pos, 0).IsNumber())
-            Fill(StreamKind_Last, StreamPos_Last, Fill_Temp(Pos, 0).To_int32u(), Fill_Temp(Pos, 1));
+    stream_t Fill_Temp_StreamKind=(Fill_Temp[StreamKind_Last].empty()?Stream_Max:StreamKind_Last);
+    for (size_t Pos=0; Pos<Fill_Temp[Fill_Temp_StreamKind].size(); Pos++)
+        if (Fill_Temp[Fill_Temp_StreamKind][Pos].Parameter.IsNumber())
+            Fill(StreamKind_Last, StreamPos_Last, Fill_Temp[Fill_Temp_StreamKind][Pos].Parameter.To_int32u(), Fill_Temp[Fill_Temp_StreamKind][Pos].Value);
         else
         {
-            Fill(StreamKind_Last, StreamPos_Last, Fill_Temp(Pos, 0).To_UTF8().c_str(), Fill_Temp(Pos, 1));
+            Fill(StreamKind_Last, StreamPos_Last, Fill_Temp[Fill_Temp_StreamKind][Pos].Parameter.To_UTF8().c_str(), Fill_Temp[Fill_Temp_StreamKind][Pos].Value);
             #if MEDIAINFO_DEMUX
                 if (!Retrieve(KindOfStream, StreamPos_Last, "Demux_InitBytes").empty())
                     (*Stream_More)[KindOfStream][StreamPos_Last](Ztring().From_Local("Demux_InitBytes"), Info_Options)=__T("N NT"); //TODO: find a better way to hide additional fields by default
             #endif //MEDIAINFO_DEMUX
         }
-    Fill_Temp.clear();
+    Fill_Temp[Fill_Temp_StreamKind].clear();
 
     return StreamPos_Last; //The position in the stream count
 }
@@ -188,7 +189,7 @@ size_t File__Analyze::Stream_Prepare (stream_t KindOfStream, size_t StreamPos)
 size_t File__Analyze::Stream_Erase (stream_t KindOfStream, size_t StreamPos)
 {
     //Integrity
-    if (!Status[IsAccepted] || KindOfStream>Stream_Max || StreamPos>=Count_Get(KindOfStream))
+    if (KindOfStream>Stream_Max || StreamPos>=Count_Get(KindOfStream))
         return Error;
 
     //Filling Lists & Counts
@@ -257,16 +258,55 @@ void File__Analyze::Fill (stream_t StreamKind, size_t StreamPos, size_t Paramete
     }
 
     //Integrity
-    if (!Status[IsAccepted] || StreamKind>Stream_Max || Parameter==(size_t)-1)
+    if (StreamKind>Stream_Max || Parameter==(size_t)-1)
         return;
 
+    //Handling values with \r\n inside
+    if (Value.find(__T('\r'))!=string::npos || Value.find(__T('\n'))!=string::npos)
+    {
+        Ztring NewValue=Value;
+        NewValue.FindAndReplace(__T("\r\n"), __T(" / "), 0, Ztring_Recursive);
+        NewValue.FindAndReplace(__T("\r"), __T(" / "), 0, Ztring_Recursive);
+        NewValue.FindAndReplace(__T("\n"), __T(" / "), 0, Ztring_Recursive);
+        if (NewValue.size()>=3 && NewValue.rfind(__T(" / "))==NewValue.size()-3)
+            NewValue.resize(NewValue.size()-3);
+        Fill(StreamKind, StreamPos, Parameter, NewValue, Replace);
+        return;
+    }
+
     //Handle Value before StreamKind
     if (StreamKind==Stream_Max || StreamPos>=(*Stream)[StreamKind].size())
     {
-        ZtringList NewList;
-        NewList.push_back(Ztring().From_Number(Parameter));
-        NewList.push_back(Value);
-        Fill_Temp.push_back(NewList);
+        size_t StreamKindS=(size_t)StreamKind;
+        if (StreamKind!=Stream_Max)
+        {
+            //Stream kind is found, moving content
+            for (size_t Pos=0; Pos<Fill_Temp[Stream_Max].size(); Pos++)
+                Fill_Temp[StreamKind].push_back(Fill_Temp[Stream_Max][Pos]);
+            Fill_Temp[Stream_Max].clear();
+        }
+        else
+        {
+            //Stream kind is not found, checking if it was found previously
+            for (StreamKindS=(size_t)Stream_General+1; StreamKindS<(size_t)Stream_Max; StreamKindS++)
+                if (!Fill_Temp[StreamKindS].empty())
+                    break;
+        }
+
+        if (Replace)
+        {
+            Ztring Parameter_String=Ztring::ToZtring(Parameter);
+            for (size_t Pos=0; Pos<Fill_Temp[StreamKindS].size(); Pos++)
+                if (Fill_Temp[StreamKindS][Pos].Parameter==Parameter_String)
+                {
+                    Fill_Temp[StreamKindS][Pos].Value=Value;
+                    return;
+                }
+        }
+        fill_temp_item NewList;
+        NewList.Parameter=Ztring::ToZtring(Parameter);
+        NewList.Value=Value;
+        Fill_Temp[StreamKindS].push_back(NewList);
         return; //No streams
     }
 
@@ -861,24 +901,55 @@ void File__Analyze::Fill (stream_t StreamKind, size_t StreamPos, size_t Paramete
 void File__Analyze::Fill (stream_t StreamKind, size_t StreamPos, const char* Parameter, const Ztring &Value, bool Replace)
 {
     //Integrity
-    if (!Status[IsAccepted] || StreamKind>Stream_Max || Parameter==NULL || Parameter[0]=='\0')
+    if (StreamKind>Stream_Max || Parameter==NULL || Parameter[0]=='\0')
         return;
 
+    //Handling values with \r\n inside
+    if (Value.find(__T('\r'))!=string::npos || Value.find(__T('\n'))!=string::npos)
+    {
+        Ztring NewValue=Value;
+        NewValue.FindAndReplace(__T("\r\n"), __T(" / "), 0, Ztring_Recursive);
+        NewValue.FindAndReplace(__T("\r"), __T(" / "), 0, Ztring_Recursive);
+        NewValue.FindAndReplace(__T("\n"), __T(" / "), 0, Ztring_Recursive);
+        if (NewValue.size()>=3 && NewValue.rfind(__T(" / "))==NewValue.size()-3)
+            NewValue.resize(NewValue.size()-3);
+        Fill(StreamKind, StreamPos, Parameter, NewValue, Replace);
+        return;
+    }
+
     //Handle Value before StreamKind
     if (StreamKind==Stream_Max || StreamPos>=(*Stream)[StreamKind].size())
     {
-        Ztring ParameterZ=Ztring().From_UTF8(Parameter);
+        size_t StreamKindS=(size_t)StreamKind;
+        if (StreamKind!=Stream_Max)
+        {
+            //Stream kind is found, moving content
+            for (size_t Pos=0; Pos<Fill_Temp[Stream_Max].size(); Pos++)
+                Fill_Temp[StreamKind].push_back(Fill_Temp[Stream_Max][Pos]);
+            Fill_Temp[Stream_Max].clear();
+        }
+        else
+        {
+            //Stream kind is not found, checking if it was found previously
+            for (StreamKindS=(size_t)Stream_General+1; StreamKindS<(size_t)Stream_Max; StreamKindS++)
+                if (!Fill_Temp[StreamKindS].empty())
+                    break;
+        }
+
         if (Replace)
-            for (size_t Pos=0; Pos<Fill_Temp.size(); Pos++)
-                if (Fill_Temp[Pos](0)==ParameterZ)
+        {
+            Ztring Parameter_String=Ztring().From_UTF8(Parameter);
+            for (size_t Pos=0; Pos<Fill_Temp[StreamKindS].size(); Pos++)
+                if (Fill_Temp[StreamKindS][Pos].Parameter==Parameter_String)
                 {
-                    Fill_Temp.erase(Fill_Temp.begin()+Pos);
-                    Pos--;
+                    Fill_Temp[StreamKindS][Pos].Value=Value;
+                    return;
                 }
-        ZtringList NewList;
-        NewList.push_back(ParameterZ);
-        NewList.push_back(Value);
-        Fill_Temp.push_back(NewList);
+        }
+        fill_temp_item NewList;
+        NewList.Parameter=Ztring().From_UTF8(Parameter);
+        NewList.Value=Value;
+        Fill_Temp[StreamKindS].push_back(NewList);
         return; //No streams
     }
 
@@ -1006,9 +1077,13 @@ void File__Analyze::Clear (stream_t StreamKind, size_t StreamPos, const char* Pa
 
     if (StreamPos>=(*Stream)[StreamKind].size())
     {
-        size_t Pos=Fill_Temp.Find(Ztring().From_UTF8(Parameter));
-        if (Pos!=string::npos)
-            Fill_Temp.erase(Fill_Temp.begin()+Pos);
+        Ztring Parameter_String=Ztring().From_UTF8(Parameter);
+        for (size_t Pos=0; Pos<Fill_Temp[StreamKind].size(); Pos++)
+            if (Fill_Temp[StreamKind][Pos].Parameter==Parameter_String)
+            {
+                Fill_Temp[StreamKind].erase(Fill_Temp[StreamKind].begin() + Pos);
+                return;
+            }
         return;
     }
 
@@ -1120,7 +1195,8 @@ void File__Analyze::Clear (stream_t StreamKind)
 void File__Analyze::Fill_Flush()
 {
     Stream_Prepare(Stream_Max); //clear filling
-    Fill_Temp.clear();
+    for (size_t StreamKind=(size_t)Stream_General; StreamKind<(size_t)Stream_Max+1; StreamKind++) // +1 because Fill_Temp[Stream_Max] is used when StreamKind is unknown
+        Fill_Temp[StreamKind].clear();
 }
 
 //---------------------------------------------------------------------------
@@ -1208,7 +1284,7 @@ size_t File__Analyze::Merge(File__Analyze &ToAdd, bool Erase)
 size_t File__Analyze::Merge(File__Analyze &ToAdd, stream_t StreamKind, size_t StreamPos_From, size_t StreamPos_To, bool Erase)
 {
     //Integrity
-    if (!Status[IsAccepted] || &ToAdd==NULL || StreamKind>=Stream_Max || !ToAdd.Stream || StreamPos_From>=(*ToAdd.Stream)[StreamKind].size())
+    if (&ToAdd==NULL || StreamKind>=Stream_Max || !ToAdd.Stream || StreamPos_From>=(*ToAdd.Stream)[StreamKind].size())
         return 0;
 
     //Destination
diff --git a/Source/MediaInfo/File__Analyze_Streams_Finish.cpp b/Source/MediaInfo/File__Analyze_Streams_Finish.cpp
index 768d4e3..4602a99 100644
--- a/Source/MediaInfo/File__Analyze_Streams_Finish.cpp
+++ b/Source/MediaInfo/File__Analyze_Streams_Finish.cpp
@@ -31,6 +31,12 @@
 #if MEDIAINFO_IBI
     #include "MediaInfo/Multiple/File_Ibi.h"
 #endif //MEDIAINFO_IBI
+#if MEDIAINFO_FIXITY
+    #ifndef WINDOWS
+    //ZenLib has File::Copy only for Windows for the moment. //TODO: support correctly (including meta)
+    #include <fstream>
+    #endif //WINDOWS
+#endif //MEDIAINFO_FIXITY
 using namespace ZenLib;
 //---------------------------------------------------------------------------
 
@@ -113,6 +119,9 @@ void File__Analyze::TestContinuousFileNames(size_t CountOfFiles, Ztring FileExte
     size_t Pos_Base = (size_t)-1;
     bool AlreadyPresent=Config->File_Names.size()==1?true:false;
     FileName FileToTest(Config->File_Names.Read(Config->File_Names.size()-1));
+    #ifdef WIN32
+        FileToTest.FindAndReplace(__T("/"), __T("\\"), 0, Ztring_Recursive); // "/" is sometimes used on Windows and it is considered as valid
+    #endif //WIN32
     Ztring FileToTest_Name=FileToTest.Name_Get();
     Ztring FileToTest_Name_After=FileToTest_Name;
     size_t FileNameToTest_End=FileToTest_Name.size();
@@ -287,6 +296,44 @@ void File__Analyze::TestContinuousFileNames(size_t CountOfFiles, Ztring FileExte
 }
 
 //---------------------------------------------------------------------------
+#if MEDIAINFO_FIXITY
+bool File__Analyze::FixFile(int64u FileOffsetForWriting, const int8u* ToWrite, const size_t ToWrite_Size)
+{
+    if (Config->File_Names.empty())
+        return false; //Streams without file names are not supported
+        
+    #ifdef WINDOWS
+    File::Copy(Config->File_Names[0], Config->File_Names[0]+__T(".Fixed"));
+    #else //WINDOWS
+    //ZenLib has File::Copy only for Windows for the moment. //TODO: support correctly (including meta)
+    if (!File::Exists(Config->File_Names[0]+__T(".Fixed")))
+    {
+        std::ofstream  Dest(Ztring(Config->File_Names[0]+__T(".Fixed")).To_Local().c_str(), std::ios::binary);
+        if (Dest.fail())
+            return false;
+        std::ifstream  Source(Config->File_Names[0].To_Local().c_str(), std::ios::binary);
+        if (Source.fail())
+            return false;
+        Dest << Source.rdbuf();
+        if (Dest.fail())
+            return false;
+    }
+    #endif //WINDOWS
+
+    File F;
+    if (!F.Open(Config->File_Names[0]+__T(".Fixed"), File::Access_Write))
+        return false;
+
+    if (!F.GoTo(FileOffsetForWriting))
+        return false;
+
+    F.Write(ToWrite, ToWrite_Size);
+
+    return true;
+}
+#endif //MEDIAINFO_FIXITY
+
+//---------------------------------------------------------------------------
 void File__Analyze::Streams_Finish_StreamOnly()
 {
     //Generic
diff --git a/Source/MediaInfo/HashWrapper.h b/Source/MediaInfo/HashWrapper.h
index a9df6f3..4623d35 100644
--- a/Source/MediaInfo/HashWrapper.h
+++ b/Source/MediaInfo/HashWrapper.h
@@ -24,8 +24,9 @@
 #include <string>
 #include <bitset>
 #include "ZenLib/Conf.h"
-using namespace std;
 using namespace ZenLib;
+using std::bitset;
+using std::string;
 //---------------------------------------------------------------------------
 
 namespace MediaInfoLib
diff --git a/Source/MediaInfo/Image/File_Bmp.cpp b/Source/MediaInfo/Image/File_Bmp.cpp
index 9ce3bdd..8711021 100644
--- a/Source/MediaInfo/Image/File_Bmp.cpp
+++ b/Source/MediaInfo/Image/File_Bmp.cpp
@@ -41,13 +41,13 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Bmp_CompressionMethod(int32u CompressionMethod)
+static const char* Bmp_CompressionMethod(int32u CompressionMethod)
 {
     switch(CompressionMethod)
     {
         case 0 : return "RGB";
-        case 1 : return "RLE";
-        case 2 : return "RLE";
+        case 1 : return "RLE8";
+        case 2 : return "RLE4";
         case 3 : return "Bit field";
         case 4 : return "JPEG";
         case 5 : return "PNG";
@@ -220,7 +220,12 @@ void File_Bmp::BitmapInfoHeader(int8u Version)
             BitsPerPixel=8; //It is a palette
 
         Fill(Stream_Image, 0, Image_Width, Width);
-        Fill(Stream_Image, 0, Image_Height, Height);
+	const int32s sHeight = int32s(Height);
+	Fill(Stream_Image, 0, Image_Height, std::abs(sHeight));
+	if (sHeight < 0)
+	{
+		Fill(Stream_Image, 0, "Method", "Top down");
+	}
         Fill(Stream_Image, 0, Image_BitDepth, BitsPerPixel);
         Fill(Stream_Image, 0, Image_Format, Bmp_CompressionMethod(CompressionMethod));
         Fill(Stream_Image, 0, Image_Codec, Bmp_CompressionMethod(CompressionMethod));
diff --git a/Source/MediaInfo/Image/File_Bpg.cpp b/Source/MediaInfo/Image/File_Bpg.cpp
index 40d0873..abf5e1b 100644
--- a/Source/MediaInfo/Image/File_Bpg.cpp
+++ b/Source/MediaInfo/Image/File_Bpg.cpp
@@ -36,7 +36,7 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-const char* Bpg_ColorSpace(int8u ColorSpace)
+static const char* Bpg_ColorSpace(int8u ColorSpace)
 {
     switch (ColorSpace)
     {
@@ -50,7 +50,7 @@ const char* Bpg_ColorSpace(int8u ColorSpace)
 };
 
 //---------------------------------------------------------------------------
-const char* Bpg_colour_primaries(int8u ColorSpace)
+static const char* Bpg_colour_primaries(int8u ColorSpace)
 {
     switch (ColorSpace)
     {
@@ -62,7 +62,7 @@ const char* Bpg_colour_primaries(int8u ColorSpace)
 };
 
 //---------------------------------------------------------------------------
-const char* Bpg_Pixel_format(int8u PixelFormat)
+static const char* Bpg_Pixel_format(int8u PixelFormat)
 {
     switch (PixelFormat)
     {
diff --git a/Source/MediaInfo/Image/File_Dpx.cpp b/Source/MediaInfo/Image/File_Dpx.cpp
index b93b0f8..d27bf45 100644
--- a/Source/MediaInfo/Image/File_Dpx.cpp
+++ b/Source/MediaInfo/Image/File_Dpx.cpp
@@ -33,7 +33,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* DPX_Orientation[]=
+static const char* DPX_Orientation[]=
 {
     "Left to right, Top to bottom",
     "Right to left, Top to bottom",
@@ -47,7 +47,7 @@ const char* DPX_Orientation[]=
 };
 
 //---------------------------------------------------------------------------
-const char* DPX_Descriptors0[]=
+static const char* DPX_Descriptors0[]=
 {
     "User defined (or unspecified single component)",
     "Red (R)",
@@ -61,14 +61,14 @@ const char* DPX_Descriptors0[]=
     "Composite video"
 };
 
-const char* DPX_Descriptors50[]=
+static const char* DPX_Descriptors50[]=
 {
     "R,G,B",
     "R,G,B, Alpha (A)",
     "A, B, G, R"
 };
 
-const char* DPX_Descriptors100[]=
+static const char* DPX_Descriptors100[]=
 {
     "CB, Y, CR, Y (4:2:2) ---- based on SMPTE 125M",
     "CB, Y, A, CR, Y, A (4:2:2:4)",
@@ -87,7 +87,7 @@ const char* DPX_Descriptors150[]=
     "User-defined 8-component element"
 };
 
-const char* DPX_Descriptors(int8u i)
+static const char* DPX_Descriptors(int8u i)
 {
     if(i<10)
         return DPX_Descriptors0[i];
@@ -107,7 +107,7 @@ const char* DPX_Descriptors(int8u i)
 }
 
 //---------------------------------------------------------------------------
-const char* DPX_Descriptors_ColorSpace(int8u i)
+static const char* DPX_Descriptors_ColorSpace(int8u i)
 {
     switch (i)
     {
@@ -130,7 +130,7 @@ const char* DPX_Descriptors_ColorSpace(int8u i)
 }
 
 //---------------------------------------------------------------------------
-const char* DPX_Descriptors_ChromaSubsampling(int8u i)
+static const char* DPX_Descriptors_ChromaSubsampling(int8u i)
 {
     switch (i)
     {
@@ -142,7 +142,7 @@ const char* DPX_Descriptors_ChromaSubsampling(int8u i)
 
 //---------------------------------------------------------------------------
 const char* Mpegv_transfer_characteristics(int8u transfer_characteristics);
-const char* DPX_TransferCharacteristic(int8u TransferCharacteristic)
+static const char* DPX_TransferCharacteristic(int8u TransferCharacteristic)
 {
     switch (TransferCharacteristic)
     {
@@ -164,7 +164,7 @@ const char* DPX_TransferCharacteristic(int8u TransferCharacteristic)
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 const char* Mpegv_colour_primaries(int8u colour_primaries);
-const char* DPX_ColorimetricSpecification(int8u ColorimetricSpecification)
+static const char* DPX_ColorimetricSpecification(int8u ColorimetricSpecification)
 {
     switch (ColorimetricSpecification)
     {
@@ -180,7 +180,7 @@ const char* DPX_ColorimetricSpecification(int8u ColorimetricSpecification)
 }
 
 //---------------------------------------------------------------------------
-const char* DPX_ValidBitDephs(int8u i)
+static const char* DPX_ValidBitDephs(int8u i)
 {
     switch(i)
     {
@@ -200,7 +200,7 @@ const char* DPX_ValidBitDephs(int8u i)
 }
 
 //---------------------------------------------------------------------------
-const char* DPX_ComponentDataPackingMethod[]=
+static const char* DPX_ComponentDataPackingMethod[]=
 {
     "Packed into 32-bit words",
     "Filled to 32-bit words, method A",
@@ -213,7 +213,7 @@ const char* DPX_ComponentDataPackingMethod[]=
 };
 
 //---------------------------------------------------------------------------
-const char* DPX_ComponentDataEncodingMethod[]=
+static const char* DPX_ComponentDataEncodingMethod[]=
 {
     "No encoding applied",
     "Run-length encoded",
@@ -226,7 +226,7 @@ const char* DPX_ComponentDataEncodingMethod[]=
 };
 
 //---------------------------------------------------------------------------
-const char* DPX_VideoSignalStandard0[]=
+static const char* DPX_VideoSignalStandard0[]=
 {
     "Undefined",
     "NTSC",
@@ -235,19 +235,19 @@ const char* DPX_VideoSignalStandard0[]=
     "SECAM"
 };
 
-const char* DPX_VideoSignalStandard50[]=
+static const char* DPX_VideoSignalStandard50[]=
 {
     "YCBCR ITU-R 601-5 525-line, 2:1 interlace, 4:3 aspect ratio",
     "YCBCR ITU-R 601-5 625-line, 2:1 interlace, 4:3 aspect ratio"
 };
 
-const char* DPX_VideoSignalStandard100[]=
+static const char* DPX_VideoSignalStandard100[]=
 {
     "YCBCR ITU-R 601-5 525-line, 2:1 interlace, 16:9 aspect ratio",
     "YCBCR ITU-R 601-5 625-line, 2:1 interlace, 16:9 aspect ratio"
 };
 
-const char* DPX_VideoSignalStandard150[]=
+static const char* DPX_VideoSignalStandard150[]=
 {
     "YCBCR 1050-line, 2:1 interlace, 16:9 aspect ratio",
     "YCBCR 1125-line, 2:1 interlace, 16:9 aspect ratio (SMPTE 274M)",
@@ -255,7 +255,7 @@ const char* DPX_VideoSignalStandard150[]=
     "YCBCR 1125-line, 2:1 interlace, 16:9 aspect ratio (SMPTE 240M)"
 };
 
-const char* DPX_VideoSignalStandard200[]=
+static const char* DPX_VideoSignalStandard200[]=
 {
     "YCBCR 525-line, 1:1 progressive, 16:9 aspect ratio",
     "YCBCR 625-line, 1:1 progressive, 16:9 aspect ratio",
@@ -263,7 +263,7 @@ const char* DPX_VideoSignalStandard200[]=
     "YCBCR 1125-line, 1:1 progressive, 16:9 aspect ratio (SMPTE 274M)"
 };
 
-const char* DPX_VideoSignalStandard(int8u i)
+static const char* DPX_VideoSignalStandard(int8u i)
 {
     if(i<5)
         return DPX_VideoSignalStandard0[i];
diff --git a/Source/MediaInfo/Image/File_Pcx.cpp b/Source/MediaInfo/Image/File_Pcx.cpp
index 414863b..43c934d 100644
--- a/Source/MediaInfo/Image/File_Pcx.cpp
+++ b/Source/MediaInfo/Image/File_Pcx.cpp
@@ -40,7 +40,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Pcx_VersionInfo(int16u Version)
+static const char* Pcx_VersionInfo(int16u Version)
 {
     switch(Version)
     {
diff --git a/Source/MediaInfo/Image/File_Png.cpp b/Source/MediaInfo/Image/File_Png.cpp
index 51f855d..90eec4d 100644
--- a/Source/MediaInfo/Image/File_Png.cpp
+++ b/Source/MediaInfo/Image/File_Png.cpp
@@ -41,7 +41,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Png_Colour_type(int8u Colour_type)
+static const char* Png_Colour_type(int8u Colour_type)
 {
     switch (Colour_type)
     {
diff --git a/Source/MediaInfo/Image/File_Psd.cpp b/Source/MediaInfo/Image/File_Psd.cpp
index 7d5e34e..f738a6a 100644
--- a/Source/MediaInfo/Image/File_Psd.cpp
+++ b/Source/MediaInfo/Image/File_Psd.cpp
@@ -42,7 +42,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Psd_ColorMode(int16u ColorMode)
+static const char* Psd_ColorMode(int16u ColorMode)
 {
     switch(ColorMode)
     {
diff --git a/Source/MediaInfo/Image/File_Tga.cpp b/Source/MediaInfo/Image/File_Tga.cpp
index 4af0d7d..7702e27 100644
--- a/Source/MediaInfo/Image/File_Tga.cpp
+++ b/Source/MediaInfo/Image/File_Tga.cpp
@@ -41,7 +41,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Tga_Image_Type_Compression(int8u Image_Type)
+static const char* Tga_Image_Type_Compression(int8u Image_Type)
 {
     switch (Image_Type)
     {
@@ -58,7 +58,7 @@ const char* Tga_Image_Type_Compression(int8u Image_Type)
 }
 
 //---------------------------------------------------------------------------
-const char* Tga_Image_Type_ColorSpace(int8u Image_Type)
+static const char* Tga_Image_Type_ColorSpace(int8u Image_Type)
 {
     switch (Image_Type)
     {
diff --git a/Source/MediaInfo/Image/File_Tiff.cpp b/Source/MediaInfo/Image/File_Tiff.cpp
index 949a9f8..1012534 100644
--- a/Source/MediaInfo/Image/File_Tiff.cpp
+++ b/Source/MediaInfo/Image/File_Tiff.cpp
@@ -58,7 +58,7 @@ namespace Tiff_Tag
 }
 
 //---------------------------------------------------------------------------
-const char* Tiff_Tag_Name(int32u Tag)
+static const char* Tiff_Tag_Name(int32u Tag)
 {
     switch (Tag)
     {
@@ -83,7 +83,7 @@ namespace Tiff_Type
 }
 
 //---------------------------------------------------------------------------
-const char* Tiff_Type_Name(int32u Type)
+static const char* Tiff_Type_Name(int32u Type)
 {
     switch (Type)
     {
@@ -95,7 +95,7 @@ const char* Tiff_Type_Name(int32u Type)
 }
 
 //---------------------------------------------------------------------------
-const int8u Tiff_Type_Size(int32u Type)
+static const int8u Tiff_Type_Size(int32u Type)
 {
     switch (Type)
     {
@@ -107,7 +107,7 @@ const int8u Tiff_Type_Size(int32u Type)
 }
 
 //---------------------------------------------------------------------------
-const char* Tiff_Compression(int32u Compression)
+static const char* Tiff_Compression(int32u Compression)
 {
     switch (Compression)
     {
@@ -122,7 +122,7 @@ const char* Tiff_Compression(int32u Compression)
 }
 
 //---------------------------------------------------------------------------
-const char* Tiff_Compression_Mode(int32u Compression)
+static const char* Tiff_Compression_Mode(int32u Compression)
 {
     switch (Compression)
     {
@@ -136,7 +136,7 @@ const char* Tiff_Compression_Mode(int32u Compression)
 }
 
 //---------------------------------------------------------------------------
-const char* Tiff_PhotometricInterpretation(int32u PhotometricInterpretation)
+static const char* Tiff_PhotometricInterpretation(int32u PhotometricInterpretation)
 {
     switch (PhotometricInterpretation)
     {
@@ -153,7 +153,7 @@ const char* Tiff_PhotometricInterpretation(int32u PhotometricInterpretation)
 }
 
 //---------------------------------------------------------------------------
-const char* Tiff_PhotometricInterpretation_ColorSpace (int32u PhotometricInterpretation)
+static const char* Tiff_PhotometricInterpretation_ColorSpace (int32u PhotometricInterpretation)
 {
     switch (PhotometricInterpretation)
     {
@@ -169,7 +169,7 @@ const char* Tiff_PhotometricInterpretation_ColorSpace (int32u PhotometricInterpr
     }
 }
 
-const char* Tiff_ExtraSamples(int32u ExtraSamples)
+static const char* Tiff_ExtraSamples(int32u ExtraSamples)
 {
     switch (ExtraSamples)
     {
@@ -180,7 +180,7 @@ const char* Tiff_ExtraSamples(int32u ExtraSamples)
     }
 }
 
-const char* Tiff_ExtraSamples_ColorSpace(int32u ExtraSamples)
+static const char* Tiff_ExtraSamples_ColorSpace(int32u ExtraSamples)
 {
     switch (ExtraSamples)
     {
diff --git a/Source/MediaInfo/MediaInfo_Config.cpp b/Source/MediaInfo/MediaInfo_Config.cpp
index 590e662..ad321c5 100644
--- a/Source/MediaInfo/MediaInfo_Config.cpp
+++ b/Source/MediaInfo/MediaInfo_Config.cpp
@@ -105,8 +105,8 @@
         _TOAPPEND; \
         Debug_Close();
 #else // MEDIAINFO_DEBUG
-    #define MEDIAINFO_DEBUG1(_NAME,__TOAPPEND)
-    #define MEDIAINFO_DEBUG2(_NAME,__TOAPPEND)
+    #define MEDIAINFO_DEBUG1(_NAME,_TOAPPEND)
+    #define MEDIAINFO_DEBUG2(_NAME,_TOAPPEND)
 #endif // MEDIAINFO_DEBUG
 
 //---------------------------------------------------------------------------
@@ -125,7 +125,7 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-const Char*  MediaInfo_Version=__T("MediaInfoLib - v0.7.88");
+const Char*  MediaInfo_Version=__T("MediaInfoLib - v0.7.90");
 const Char*  MediaInfo_Url=__T("http://MediaArea.net/MediaInfo");
       Ztring EmptyZtring;       //Use it when we can't return a reference to a true Ztring
 const Ztring EmptyZtring_Const; //Use it when we can't return a reference to a true Ztring, const version
@@ -240,6 +240,9 @@ void MediaInfo_Config::Init()
         Ssh_IgnoreSecurity=false;
         Ssl_IgnoreSecurity=false;
     #endif //defined(MEDIAINFO_LIBCURL_YES)
+    #if MEDIAINFO_FIXITY
+        TryToFix=false;
+    #endif //MEDIAINFO_FIXITY
 
     CS.Leave();
 
@@ -1001,6 +1004,15 @@ Ztring MediaInfo_Config::Option (const String &Option, const String &Value_Raw)
             return __T("Libcurl support is disabled due to compilation options");
         #endif // defined(MEDIAINFO_LIBCURL_YES)
     }
+    else if (Option_Lower==__T("trytofix"))
+    {
+        #if MEDIAINFO_FIXITY
+            TryToFix_Set(!(Value==__T("0") || Value.empty()));
+            return Ztring();
+        #else //MEDIAINFO_FIXITY
+            return __T("Fixity support is disabled due to compilation options");
+        #endif //MEDIAINFO_FIXITY
+    }
     else
         return __T("Option not known");
 }
@@ -2433,7 +2445,15 @@ void MediaInfo_Config::Event_Send (const int8u* Data_Content, size_t Data_Size)
     CriticalSectionLocker CSL(CS);
 
     if (Event_CallBackFunction)
+    {
+        MEDIAINFO_DEBUG1(   "Event",
+                            Debug+=", EventID=";Debug+=Ztring::ToZtring(LittleEndian2int32u(Data_Content), 16).To_UTF8();)
+
         Event_CallBackFunction ((unsigned char*)Data_Content, Data_Size, Event_UserHandler);
+
+        MEDIAINFO_DEBUG2(   "Event",
+                            )
+    }
 }
 #endif //MEDIAINFO_EVENTS
 
@@ -2627,7 +2647,22 @@ bool MediaInfo_Config::Ssl_IgnoreSecurity_Get ()
     CriticalSectionLocker CSL(CS);
     return Ssl_IgnoreSecurity;
 }
-
 #endif //defined(MEDIAINFO_LIBCURL_YES)
 
+
+#if MEDIAINFO_FIXITY
+//---------------------------------------------------------------------------
+void MediaInfo_Config::TryToFix_Set (bool NewValue)
+{
+    CriticalSectionLocker CSL(CS);
+    TryToFix=NewValue;
+}
+
+bool MediaInfo_Config::TryToFix_Get ()
+{
+    CriticalSectionLocker CSL(CS);
+    return TryToFix;
+}
+#endif //MEDIAINFO_FIXITY
+
 } //NameSpace
diff --git a/Source/MediaInfo/MediaInfo_Config.h b/Source/MediaInfo/MediaInfo_Config.h
index 7429558..d68aa4a 100644
--- a/Source/MediaInfo/MediaInfo_Config.h
+++ b/Source/MediaInfo/MediaInfo_Config.h
@@ -270,6 +270,10 @@ public :
           void      Ssl_IgnoreSecurity_Set (bool NewValue);
           bool      Ssl_IgnoreSecurity_Get ();
     #endif //defined(MEDIAINFO_LIBCURL_YES)
+    #if MEDIAINFO_FIXITY
+          void      TryToFix_Set (bool NewValue);
+          bool      TryToFix_Get ();
+    #endif //MEDIAINFO_FIXITY
 
 private :
     int64u          FormatDetection_MaximumOffset;
@@ -361,6 +365,10 @@ private :
           bool      Ssl_IgnoreSecurity;
     #endif //defined(MEDIAINFO_LIBCURL_YES)
 
+    #if MEDIAINFO_FIXITY
+        bool        TryToFix;
+    #endif //MEDIAINFO_SEEK
+
     //Constructor
     MediaInfo_Config (const MediaInfo_Config&);             // Prevent copy-construction
     MediaInfo_Config& operator=(const MediaInfo_Config&);   // Prevent assignment
diff --git a/Source/MediaInfo/MediaInfo_Config_Automatic.cpp b/Source/MediaInfo/MediaInfo_Config_Automatic.cpp
index 5bc098f..b65ddd4 100644
--- a/Source/MediaInfo/MediaInfo_Config_Automatic.cpp
+++ b/Source/MediaInfo/MediaInfo_Config_Automatic.cpp
@@ -1227,7 +1227,7 @@ void MediaInfo_Config_Format (InfoMap &Info)
     "DolbyE;;;A;Aes3;;dde\n"
     "DTS;;;A;Dts;Digital Theater Systems;dts;;;Lossy\n"
     "DTS-HD;;;A;Dts;Digital Theater Systems;dts;;;Lossy\n"
-    "E-AC-3;;;A;Ac3;Audio Coding 3;dd+ ec3;audio/eac3;;Lossy\n"
+    "E-AC-3;;;A;Ac3;Enhanced Audio Coding 3;dd+ ec3;audio/eac3;;Lossy\n"
     "Extended Module;;;A;ExtendedModule;;xm;;\n"
     "FLAC;;;A;Flac;Free Lossless Audio Codec;flac;;http://flac.sourceforge.net/\n"
     "G.719;;;A;;;;audio/G719;;Lossy\n"
@@ -1429,22 +1429,38 @@ void MediaInfo_Config_CodecID_Video_Mpeg4 (InfoMap &Info)
     "ap4c;ProRes;;;http://www.apple.com/quicktime/download/standalone.html;4444;;;4:4:4\n"
     "ap4h;ProRes;;;http://www.apple.com/quicktime/download/standalone.html;4444;;;4:4:4\n"
     "ap4x;ProRes;;;http://www.apple.com/quicktime/download/standalone.html;4444 XQ;;;4:4:4\n"
-    "ai11;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;\n"
-    "ai12;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;\n"
-    "ai13;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;\n"
-    "ai14;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;\n"
-    "ai15;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;\n"
-    "ai1q;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;\n"
-    "ai26;AVC;;;;;\n"
-    "ai5q;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;\n"
+    "ai12;AVC;;Advanced Video Coding;;;\n"
+    "ai13;AVC;;Advanced Video Coding;;;\n"
+    "ai15;AVC;;Advanced Video Coding;;;\n"
+    "ai16;AVC;;Advanced Video Coding;;;\n"
+    "ai1p;AVC;;Advanced Video Coding;;;\n"
+    "ai1q;AVC;;Advanced Video Coding;;;\n"
+    "ai22;AVC;;Advanced Video Coding;;;\n"
+    "ai23;AVC;;Advanced Video Coding;;;\n"
+    "ai25;AVC;;Advanced Video Coding;;;\n"
+    "ai26;AVC;;Advanced Video Coding;;;\n"
+    "ai2p;AVC;;Advanced Video Coding;;;\n"
+    "ai2q;AVC;;Advanced Video Coding;;;\n"
+    "ai52;AVC;;Advanced Video Coding;;;\n"
+    "ai53;AVC;;Advanced Video Coding;;;\n"
+    "ai55;AVC;;Advanced Video Coding;;;\n"
+    "ai56;AVC;;Advanced Video Coding;;;\n"
+    "ai5p;AVC;;Advanced Video Coding;;;\n"
+    "ai5q;AVC;;Advanced Video Coding;;;\n"
     "AV1x;YUV;;;;;;YUV;4:2:2\n"
-    "avc1;AVC;;Advanced Video Coding;http://www.apple.com/quicktime/download/standalone.html;;;\n"
-    "avcp;AVC;;Advanced Video Coding Parameters;http://www.apple.com/quicktime/download/standalone.html;;;\n"
+    "avc1;AVC;;Advanced Video Coding;;;;\n"
+    "avc2;AVC;;Advanced Video Coding;;;;\n"
+    "avc3;AVC;;Advanced Video Coding;;;;\n"
+    "avc4;AVC;;Advanced Video Coding;;;;\n"
+    "avcp;AVC;;Advanced Video Coding Parameters;;;\n"
     "AVDJ;JPEG;;Avid\n"
     "AVdv;DV;;Avid;http://www.apple.com/quicktime/download/standalone.html;;;YUV;4:2:2\n"
     "AVd1;DV;;Avid;http://www.apple.com/quicktime/download/standalone.html;;\n"
-    "AVdn;VC-3;DNxHD;Avid;http://www.apple.com/quicktime/download/standalone.html;;;\n"
+    "AVdn;VC-3;DNxHD;Avid;http://www.apple.com/quicktime/download/standalone.html;;;YUV;4:2:2\n"
+    "AVin;AVC;;Advanced Video Coding;;;;\n"
+    "AVJI;Avid Meridien Compressed;;;;;\n"
     "AVmp;MPEG Video;Avid IMX;;;;Version 2;;\n"
+    "AVUI;Avid Meridien Uncompressed;;;;;\n"
     "avr ;JPEG;;;;;;\n"
     "AVrp;RGB;Avid;;;;;RGB\n"
     "b16g;Gray;;;;;;Y;16\n"
@@ -1547,6 +1563,8 @@ void MediaInfo_Config_CodecID_Video_Mpeg4 (InfoMap &Info)
     "Shr2;SheerVideo;;SheerVideo Y'CbCr[A] 4:4:4;http://www.bitjazz.com/;;;\n"
     "Shr3;SheerVideo;;SheerVideo Y'CbCr 4:2:2;http://www.bitjazz.com/;;;\n"
     "Shr4;SheerVideo;;SheerVideo Y'CbCr 4:2:2;http://www.bitjazz.com/;;;\n"
+    "SJDS;SoftImage DS Compressed;;;;;\n"
+    "SUDS;SoftImage DS Uncompressed;;;;;\n"
     "SV10;Sorenson;;Sorenson Media Video R1;http://www.apple.com/quicktime/download/standalone.html;;;\n"
     "SVQ1;Sorenson 1;;Sorenson Media Video 1 (Apple QuickTime 3);http://www.apple.com/quicktime/download/standalone.html;;;\n"
     "SVQ2;Sorenson 2;;Sorenson Media Video 2 (Apple QuickTime 4);http://www.apple.com/quicktime/download/standalone.html;;;\n"
@@ -1962,6 +1980,7 @@ void MediaInfo_Config_CodecID_Video_Riff (InfoMap &Info)
     "MHFY;YUV;;A.M.Paredes mhuffyYUV (LossLess);http://mirror01.iptelecom.net.ua/~video/codecs/Pinnacle.ReelTime.v2.5.software.only.codec.exe;;;YUV\n"
     "MJ2C;JPEG 2000;;Morgan Multimedia JPEG 2000 Compression;http://mirror01.iptelecom.net.ua/~video/codecs/Pinnacle.ReelTime.v2.5.software.only.codec.exe;;;\n"
     "MJPA;JPEG;Pinacle;Pinnacle ReelTime MJPG hardware;http://mediaxw.sourceforge.net;;;YUV\n"
+    "mjp2;JPEG 2000;;;;;;\n"
     "MJPB;JPEG;Pinacle B;;;;;YUV\n"
     "MJPG;JPEG;;;;;;YUV\n"
     "mJPG;JPEG;IBM;Including Huffman Tables;;;;YUV\n"
@@ -4012,13 +4031,13 @@ void MediaInfo_Config_General (ZtringListList &Info)
     "UniqueID/String;;;Y NT;;;The unique ID for this stream, should be copied with stream copy\n"
     "MenuID;;;N YIY;;;The menu ID for this stream in this file\n"
     "MenuID/String;;;Y NT;;;The menu ID for this stream in this file\n"
-    "GeneralCount;1;;N NI;;;Number of general streams\n"
-    "VideoCount;;;N NI;;;Number of video streams\n"
-    "AudioCount;;;N NI;;;Number of audio streams\n"
-    "TextCount;;;N NI;;;Number of text streams\n"
-    "OtherCount;;;N NI;;;Number of other streams\n"
-    "ImageCount;;;N NI;;;Number of image streams\n"
-    "MenuCount;;;N NI;;;Number of menu streams\n"
+    "GeneralCount;1;;N NIY;;;Number of general streams\n"
+    "VideoCount;;;N NIY;;;Number of video streams\n"
+    "AudioCount;;;N NIY;;;Number of audio streams\n"
+    "TextCount;;;N NIY;;;Number of text streams\n"
+    "OtherCount;;;N NIY;;;Number of other streams\n"
+    "ImageCount;;;N NIY;;;Number of image streams\n"
+    "MenuCount;;;N NIY;;;Number of menu streams\n"
     "Video_Format_List;;;N NT;;;Video Codecs in this file, separated by /\n"
     "Video_Format_WithHint_List;;;N NT;;;Video Codecs in this file with popular name (hint), separated by /\n"
     "Video_Codec_List;;;N NT;;;Deprecated, do not use in new projects\n"
diff --git a/Source/MediaInfo/MediaInfo_Config_MediaInfo.cpp b/Source/MediaInfo/MediaInfo_Config_MediaInfo.cpp
index aade1ba..7f1e98f 100644
--- a/Source/MediaInfo/MediaInfo_Config_MediaInfo.cpp
+++ b/Source/MediaInfo/MediaInfo_Config_MediaInfo.cpp
@@ -120,8 +120,8 @@ using namespace std;
         _TOAPPEND; \
         Debug_Close();
 #else // MEDIAINFO_DEBUG
-    #define MEDIAINFO_DEBUG1(_NAME,__TOAPPEND)
-    #define MEDIAINFO_DEBUG2(_NAME,__TOAPPEND)
+    #define MEDIAINFO_DEBUG1(_NAME,_TOAPPEND)
+    #define MEDIAINFO_DEBUG2(_NAME,_TOAPPEND)
 #endif // MEDIAINFO_DEBUG
 
 namespace MediaInfoLib
@@ -254,6 +254,9 @@ MediaInfo_Config_MediaInfo::MediaInfo_Config_MediaInfo()
     File_DtvccTransport_Stream_IsPresent=false;
     File_DtvccTransport_Descriptor_IsPresent=false;
     #endif //defined(MEDIAINFO_EIA608_YES) || defined(MEDIAINFO_EIA708_YES)
+    #if defined(MEDIAINFO_MPEGPS_YES)
+    File_MpegPs_PTS_Begin_IsNearZero=false;
+    #endif //defined(MEDIAINFO_MPEGPS_YES)
     File_Current_Offset=0;
     File_Current_Size=(int64u)-1;
     File_IgnoreEditsBefore=0;
@@ -278,6 +281,9 @@ MediaInfo_Config_MediaInfo::MediaInfo_Config_MediaInfo()
     #if MEDIAINFO_SEEK
         File_GoTo_IsFrameOffset=false;
     #endif //MEDIAINFO_SEEK
+    #if MEDIAINFO_FIXITY
+        TryToFix=false;
+    #endif //MEDIAINFO_SEEK
 }
 
 MediaInfo_Config_MediaInfo::~MediaInfo_Config_MediaInfo()
@@ -406,6 +412,15 @@ Ztring MediaInfo_Config_MediaInfo::Option (const String &Option, const String &V
     {
         return File_ID_OnlyRoot_Get()?"1":"0";
     }
+    else if (Option_Lower==__T("file_ignoresequencefilesize"))
+    {
+        #if MEDIAINFO_ADVANCED
+            File_IgnoreSequenceFileSize_Set(!(Value==__T("0") || Value.empty()));
+            return Ztring();
+        #else //MEDIAINFO_ADVANCED
+            return __T("Disabled due to compilation options");
+        #endif //MEDIAINFO_ADVANCED
+    }
     else if (Option_Lower==__T("file_ignoresequencefilescount"))
     {
         #if MEDIAINFO_ADVANCED
@@ -433,6 +448,15 @@ Ztring MediaInfo_Config_MediaInfo::Option (const String &Option, const String &V
             return __T("File_DefaultFrameRate is disabled due to compilation options");
         #endif //MEDIAINFO_ADVANCED
     }
+    else if (Option_Lower==__T("file_defaulttimecode"))
+    {
+        #if MEDIAINFO_ADVANCED
+            File_DefaultTimeCode_Set(Ztring(Value).To_UTF8());
+            return Ztring();
+        #else //MEDIAINFO_ADVANCED
+            return __T("File_DefaultTimeCode is disabled due to compilation options");
+        #endif //MEDIAINFO_ADVANCED
+    }
     else if (Option_Lower==__T("file_source_list"))
     {
         #if MEDIAINFO_ADVANCED
@@ -1057,6 +1081,11 @@ Ztring MediaInfo_Config_MediaInfo::Option (const String &Option, const String &V
     {
         return Ztring::ToZtring(File_GrowingFile_Delay_Get());
     }
+    else if (Option_Lower==__T("file_growingfile_force"))
+    {
+        File_GrowingFile_Force_Set(Ztring(Value).To_float64());
+        return Ztring();
+    }
     else if (Option_Lower==__T("file_curl"))
     {
         #if defined(MEDIAINFO_LIBCURL_YES)
@@ -1066,6 +1095,15 @@ Ztring MediaInfo_Config_MediaInfo::Option (const String &Option, const String &V
             return __T("Libcurl support is disabled due to compilation options");
         #endif //defined(MEDIAINFO_LIBCURL_YES)
     }
+    else if (Option_Lower==__T("file_trytofix"))
+    {
+        #if MEDIAINFO_FIXITY
+            TryToFix_Set(!(Value==__T("0") || Value.empty()));
+            return Ztring();
+        #else //MEDIAINFO_FIXITY
+            return __T("Fixity support is disabled due to compilation options");
+        #endif //MEDIAINFO_FIXITY
+    }
     else if (Option_Lower.find(__T("file_curl,"))==0 || Option_Lower.find(__T("file_curl;"))==0)
     {
         #if defined(MEDIAINFO_LIBCURL_YES)
@@ -1433,6 +1471,21 @@ float64 MediaInfo_Config_MediaInfo::File_DefaultFrameRate_Get ()
 
 //---------------------------------------------------------------------------
 #if MEDIAINFO_ADVANCED
+void MediaInfo_Config_MediaInfo::File_DefaultTimeCode_Set(string NewValue)
+{
+    CriticalSectionLocker CSL(CS);
+    File_DefaultTimeCode = NewValue;
+}
+
+string MediaInfo_Config_MediaInfo::File_DefaultTimeCode_Get()
+{
+    CriticalSectionLocker CSL(CS);
+    return File_DefaultTimeCode;
+}
+#endif //MEDIAINFO_ADVANCED
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_ADVANCED
 void MediaInfo_Config_MediaInfo::File_Source_List_Set (bool NewValue)
 {
     CriticalSectionLocker CSL(CS);
@@ -1956,6 +2009,21 @@ bool MediaInfo_Config_MediaInfo::Ibi_Create_Get ()
 }
 #endif //MEDIAINFO_IBIUSAGE
 
+#if MEDIAINFO_FIXITY
+//---------------------------------------------------------------------------
+void MediaInfo_Config_MediaInfo::TryToFix_Set (bool NewValue)
+{
+    CriticalSectionLocker CSL(CS);
+    TryToFix=NewValue;
+}
+
+bool MediaInfo_Config_MediaInfo::TryToFix_Get ()
+{
+    CriticalSectionLocker CSL(CS);
+    return TryToFix || MediaInfoLib::Config.TryToFix_Get();
+}
+#endif //MEDIAINFO_FIXITY
+
 //***************************************************************************
 // Encryption
 //***************************************************************************
@@ -2655,6 +2723,65 @@ void MediaInfo_Config_MediaInfo::Event_SubFile_Start(const Ztring &FileName_Abso
 
     Event_Send(NULL, (const int8u*)&Event, Event.EventSize);
 }
+
+//---------------------------------------------------------------------------
+void MediaInfo_Config_MediaInfo::Event_SubFile_Missing(const Ztring &FileName_Relative)
+{
+    struct MediaInfo_Event_General_SubFile_Missing_0 Event;
+    memset(&Event, 0xFF, sizeof(struct MediaInfo_Event_Generic));
+    Event.EventCode=MediaInfo_EventCode_Create(0, MediaInfo_Event_General_SubFile_Missing, 0);
+    Event.EventSize=sizeof(struct MediaInfo_Event_General_SubFile_Start_0);
+    Event.StreamIDs_Size=0;
+
+    std::string FileName_Relative_Ansi=FileName_Relative.To_UTF8();
+    std::wstring FileName_Relative_Unicode=FileName_Relative.To_Unicode();
+    Event.FileName_Relative=FileName_Relative_Ansi.c_str();
+    Event.FileName_Relative_Unicode=FileName_Relative_Unicode.c_str();
+    Event.FileName_Absolute=NULL;
+    Event.FileName_Absolute_Unicode=NULL;
+
+    Event_Send(NULL, (const int8u*)&Event, Event.EventSize);
+}
+
+//---------------------------------------------------------------------------
+void MediaInfo_Config_MediaInfo::Event_SubFile_Missing_Absolute(const Ztring &FileName_Absolute)
+{
+    Ztring FileName_Relative;
+    if (File_Names_RootDirectory.empty())
+    {
+        FileName FN(FileName_Absolute);
+        FileName_Relative=FN.Name_Get();
+        if (!FN.Extension_Get().empty())
+        {
+            FileName_Relative+=__T('.');
+            FileName_Relative+=FN.Extension_Get();
+        }
+    }
+    else
+    {
+        Ztring Root=File_Names_RootDirectory+PathSeparator;
+        FileName_Relative=FileName_Absolute;
+        if (FileName_Relative.find(Root)==0)
+            FileName_Relative.erase(0, Root.size());
+    }
+
+    struct MediaInfo_Event_General_SubFile_Missing_0 Event;
+    memset(&Event, 0xFF, sizeof(struct MediaInfo_Event_Generic));
+    Event.EventCode=MediaInfo_EventCode_Create(0, MediaInfo_Event_General_SubFile_Missing, 0);
+    Event.EventSize=sizeof(struct MediaInfo_Event_General_SubFile_Missing_0);
+    Event.StreamIDs_Size=0;
+
+    std::string FileName_Relative_Ansi=FileName_Relative.To_UTF8();
+    std::wstring FileName_Relative_Unicode=FileName_Relative.To_Unicode();
+    std::string FileName_Absolute_Ansi=FileName_Absolute.To_UTF8();
+    std::wstring FileName_Absolute_Unicode=FileName_Absolute.To_Unicode();
+    Event.FileName_Relative=FileName_Relative_Ansi.c_str();
+    Event.FileName_Relative_Unicode=FileName_Relative_Unicode.c_str();
+    Event.FileName_Absolute=FileName_Absolute_Ansi.c_str();
+    Event.FileName_Absolute_Unicode=FileName_Absolute_Unicode.c_str();
+
+    Event_Send(NULL, (const int8u*)&Event, Event.EventSize);
+}
 #endif //MEDIAINFO_EVENTS
 
 //***************************************************************************
@@ -2843,6 +2970,22 @@ float64 MediaInfo_Config_MediaInfo::File_GrowingFile_Delay_Get ()
 }
 
 //---------------------------------------------------------------------------
+void MediaInfo_Config_MediaInfo::File_GrowingFile_Force_Set (float64 NewValue)
+{
+    CriticalSectionLocker CSL(CS);
+    if (NewValue)
+    {
+        File_IsGrowing=true;
+        File_IsNotGrowingAnymore=false;
+    }
+    else
+    {
+        File_IsGrowing=false;
+        File_IsNotGrowingAnymore=true;
+    }
+}
+
+//---------------------------------------------------------------------------
 #if defined(MEDIAINFO_LIBCURL_YES)
 void MediaInfo_Config_MediaInfo::File_Curl_Set (const Ztring &NewValue)
 {
diff --git a/Source/MediaInfo/MediaInfo_Config_MediaInfo.h b/Source/MediaInfo/MediaInfo_Config_MediaInfo.h
index 9c0313a..167f2fe 100644
--- a/Source/MediaInfo/MediaInfo_Config_MediaInfo.h
+++ b/Source/MediaInfo/MediaInfo_Config_MediaInfo.h
@@ -31,7 +31,6 @@
 #include "ZenLib/Translation.h"
 #include "ZenLib/InfoMap.h"
 using namespace ZenLib;
-using namespace std;
 //---------------------------------------------------------------------------
 
 namespace MediaInfoLib
@@ -130,6 +129,8 @@ public :
     #if MEDIAINFO_ADVANCED
         void          File_DefaultFrameRate_Set (float64 NewValue);
         float64       File_DefaultFrameRate_Get ();
+        void          File_DefaultTimeCode_Set (string NewValue);
+        string        File_DefaultTimeCode_Get ();
     #endif //MEDIAINFO_ADVANCED
 
     #if MEDIAINFO_ADVANCED
@@ -257,6 +258,8 @@ public :
     void          Event_Send(File__Analyze* Source, const int8u* Data_Content, size_t Data_Size, const Ztring &File_Name=Ztring());
     void          Event_Accepted(File__Analyze* Source);
     void          Event_SubFile_Start(const Ztring &FileName_Absolute);
+    void          Event_SubFile_Missing(const Ztring &FileName_Relative);
+    void          Event_SubFile_Missing_Absolute(const Ztring &FileName_Absolute);
     #endif //MEDIAINFO_EVENTS
 
     #if MEDIAINFO_DEMUX
@@ -293,6 +296,10 @@ public :
     void          Ibi_Create_Set (bool NewValue);
     bool          Ibi_Create_Get ();
     #endif //MEDIAINFO_IBIUSAGE
+    #if MEDIAINFO_FIXITY
+    void          TryToFix_Set (bool NewValue);
+    bool          TryToFix_Get ();
+    #endif //MEDIAINFO_FIXITY
 
     //Specific
     void          File_MpegTs_ForceMenu_Set (bool NewValue);
@@ -325,6 +332,7 @@ public :
     #endif //MEDIAINFO_MACROBLOCKS
     void          File_GrowingFile_Delay_Set(float64 Value);
     float64       File_GrowingFile_Delay_Get();
+    void          File_GrowingFile_Force_Set(float64 Value);
     #if defined(MEDIAINFO_LIBCURL_YES)
     void          File_Curl_Set (const Ztring &NewValue);
     void          File_Curl_Set (const Ztring &Field, const Ztring &NewValue);
@@ -367,6 +375,9 @@ public :
     bool          File_DtvccTransport_Stream_IsPresent;
     bool          File_DtvccTransport_Descriptor_IsPresent;
     #endif //defined(MEDIAINFO_EIA608_YES) || defined(MEDIAINFO_EIA708_YES)
+    #if defined(MEDIAINFO_MPEGPS_YES)
+    bool          File_MpegPs_PTS_Begin_IsNearZero;
+    #endif //defined(MEDIAINFO_MPEGPS_YES)
     int64u        File_Current_Offset;
     int64u        File_Current_Size;
     int64u        File_IgnoreEditsBefore;
@@ -410,6 +421,7 @@ private :
         bool                File_IgnoreSequenceFilesCount;
         int64u              File_SequenceFilesSkipFrames;
         float64             File_DefaultFrameRate;
+        string              File_DefaultTimeCode;
         bool                File_Source_List;
         bool                File_RiskyBitRateEstimation;
         bool                File_MergeBitRateInfo;
@@ -514,6 +526,9 @@ private :
     #if MEDIAINFO_IBIUSAGE
     bool                    Ibi_Create;
     #endif //MEDIAINFO_IBIUSAGE
+    #if MEDIAINFO_FIXITY
+    bool                    TryToFix;
+    #endif //MEDIAINFO_SEEK
 
     //Specific
     bool                    File_MpegTs_ForceMenu;
diff --git a/Source/MediaInfo/MediaInfo_Config_PerPackage.cpp b/Source/MediaInfo/MediaInfo_Config_PerPackage.cpp
index e3f4e5e..d2a8596 100644
--- a/Source/MediaInfo/MediaInfo_Config_PerPackage.cpp
+++ b/Source/MediaInfo/MediaInfo_Config_PerPackage.cpp
@@ -67,6 +67,13 @@ Ztring MediaInfo_Config_PerPackage::Option (const String &Option, const String &
         return __T("Option not known");
 }
 
+//---------------------------------------------------------------------------
+#if MEDIAINFO_EVENTS
+void MediaInfo_Config_PerPackage::Unsynch ()
+{
+}
+#endif //MEDIAINFO_EVENTS
+
 //***************************************************************************
 // Event
 //***************************************************************************
@@ -132,4 +139,18 @@ void MediaInfo_Config_PerPackage::Event_Send (File__Analyze* Source, const int8u
 }
 #endif //MEDIAINFO_EVENTS
 
+//---------------------------------------------------------------------------
+#if MEDIAINFO_EVENTS
+void MediaInfo_Config_PerPackage::FrameForAlignment (File__Analyze* Source, bool IsClosedGop)
+{
+}
+#endif //MEDIAINFO_EVENTS
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_EVENTS
+void MediaInfo_Config_PerPackage::IsClosedGOP (File__Analyze* Source)
+{
+}
+#endif //MEDIAINFO_EVENTS
+
 } //NameSpace
diff --git a/Source/MediaInfo/MediaInfo_Config_PerPackage.h b/Source/MediaInfo/MediaInfo_Config_PerPackage.h
index 5e17f58..5f957fa 100644
--- a/Source/MediaInfo/MediaInfo_Config_PerPackage.h
+++ b/Source/MediaInfo/MediaInfo_Config_PerPackage.h
@@ -53,8 +53,12 @@ public :
 
     //General
     Ztring Option (const String &Option, const String &Value=Ztring());
+    #if MEDIAINFO_EVENTS
+    void   Unsynch();
+    #endif //MEDIAINFO_EVENTS
 
     #if MEDIAINFO_EVENTS
+    void          FrameForAlignment (File__Analyze* Source, bool IsClosedGop);
     void          IsClosedGOP (File__Analyze* Source);
     #endif //MEDIAINFO_EVENTS
 
@@ -63,7 +67,6 @@ public :
     Ztring        Event_CallBackFunction_Set (const Ztring &Value);
     Ztring        Event_CallBackFunction_Get ();
     void          Event_Send(File__Analyze* Source, const int8u* Data_Content, size_t Data_Size, const Ztring &File_Name=Ztring());
-    void          Event_SubFile_Start(const Ztring &FileName_Absolute);
     #endif //MEDIAINFO_EVENTS
 
     //Internal
diff --git a/Source/MediaInfo/MediaInfo_Events.h b/Source/MediaInfo/MediaInfo_Events.h
index fae49f2..b1b1fe3 100644
--- a/Source/MediaInfo/MediaInfo_Events.h
+++ b/Source/MediaInfo/MediaInfo_Events.h
@@ -9,6 +9,12 @@
 #ifndef MediaInfo_EventsH
 #define MediaInfo_EventsH
 
+#ifdef __cplusplus
+#include <stdlib.h>
+#include <string.h>
+#include <sstream>
+#endif //__cplusplus
+
 /***************************************************************************/
 /* Platforms (from libzen)                                                 */
 /***************************************************************************/
@@ -692,6 +698,19 @@ struct MediaInfo_Event_DvDif_Analysis_Frame_0
 
 #define MediaInfo_Parser_Eia608         0xF0
 
+/*-------------------------------------------------------------------------*/
+/* MediaInfo_Event_Eia608_Content                                          */
+#define MediaInfo_Event_Eia608_CC_Content 0xA000
+struct MediaInfo_Event_Eia608_CC_Content_0
+{
+    MEDIAINFO_EVENT_GENERIC
+    MediaInfo_int8u     Field;
+    MediaInfo_int8u     MuxingMode;
+    MediaInfo_int8u     Service;
+    wchar_t             Row_Values[15][33]; /*offset 32 is for \0*/
+    MediaInfo_int8u     Row_Attributes[15][32];
+};
+
 /***************************************************************************/
 /* DTVCC Transport (CEA-708, formely IEA-708)                              */
 /***************************************************************************/
@@ -705,6 +724,31 @@ struct MediaInfo_Event_DvDif_Analysis_Frame_0
 
 #define MediaInfo_Parser_DtvccCaption   0xF2
 
+/*-------------------------------------------------------------------------*/
+/* MediaInfo_Event_DtvccCaption_Content_Minimal                            */
+#define MediaInfo_Event_DtvccCaption_Content_Minimal 0xA000
+struct MediaInfo_Event_DtvccCaption_Content_Minimal_0
+{
+    MEDIAINFO_EVENT_GENERIC
+    MediaInfo_int8u     MuxingMode;
+    MediaInfo_int8u     Service;
+    wchar_t             Row_Values[15][65]; /*offset 32 (4:3) or 42 (16:9) is for \0, reserving data after 42 for future extensions*/
+    MediaInfo_int8u     Row_Attributes[15][64];
+};
+
+/*-------------------------------------------------------------------------*/
+/* MediaInfo_Event_DtvccCaption_Window_Content_Minimal                     */
+#define MediaInfo_Event_DtvccCaption_Window_Content_Minimal 0xA001
+struct MediaInfo_Event_DtvccCaption_Window_Content_Minimal_0
+{
+    MEDIAINFO_EVENT_GENERIC
+    MediaInfo_int8u     MuxingMode;
+    MediaInfo_int8u     Service;
+    MediaInfo_int8u     Window;
+    wchar_t             Row_Values[15][33]; /*offset 32 is for \0*/
+    MediaInfo_int8u     Row_Attributes[15][32];
+};
+
 /***************************************************************************/
 /* CDP                                                                     */
 /***************************************************************************/
@@ -771,4 +815,154 @@ struct MediaInfo_Event_DvDif_Analysis_Frame_0
 
 #define MediaInfo_Parser_Sdp            0xFD
 
+/*-------------------------------------------------------------------------*/
+/* Utilities                                                               */
+/*-------------------------------------------------------------------------*/
+
+// Flags: bit 0 = has ID containing 2 numbers (e.g. 0x00010002, main ID is 1 and subID is 2) 
+#define MediaInfo_ID_FromEvent_int MediaInfo_ID_FromEvent_intA
+inline MediaInfo_int64u MediaInfo_ID_FromEvent_intA (MediaInfo_Event_Generic* Event, int) // Flags)
+{
+    if (Event->StreamIDs_Size>=2 && Event->ParserIDs[0]==MediaInfo_Parser_MpegPs && Event->ParserIDs[1]==MediaInfo_Parser_MpegPs_Ext)   // DVD-Video
+        return (Event->StreamIDs[0]<<16) | Event->StreamIDs[1];
+    if (Event->StreamIDs_Size>=2 && Event->ParserIDs[0]==MediaInfo_Parser_HdsF4m && Event->StreamIDs_Width[1])                          // HDS F4M having more than one stream per referenced file
+        return Event->StreamIDs[0]<<16 | Event->StreamIDs[1];
+    if (Event->StreamIDs_Size>=3 && Event->ParserIDs[0]==MediaInfo_Parser_HlsIndex)                                                     // HLS Index
+    {
+        if (Event->ParserIDs[1]==MediaInfo_Parser_Hls)
+            return (Event->StreamIDs[0]<<16) | Event->StreamIDs[2];
+        else
+            return (Event->StreamIDs[0]<<16) | Event->StreamIDs[1];
+    }
+    if (Event->StreamIDs_Size>=2 && Event->ParserIDs[0]==MediaInfo_Parser_Hls)                                                          // HLS Sequence
+        return Event->StreamIDs[1];
+    if (Event->StreamIDs_Size>=2 && Event->ParserIDs[0]==MediaInfo_Parser_Ism && Event->StreamIDs_Width[1])                             // ISM having more than one stream per referenced file
+        return Event->StreamIDs[0]<<16 | Event->StreamIDs[1];
+    if (Event->StreamIDs_Size>=3 && Event->ParserIDs[0]==MediaInfo_Parser_Dxw && Event->ParserIDs[1]==MediaInfo_Parser_MpegTs)          // DXW with MPEG-TS
+        return (Event->StreamIDs[0]<<16) | Event->StreamIDs[1];
+    if (Event->StreamIDs_Size>=3 && Event->ParserIDs[0]==MediaInfo_Parser_DcpAm)                                                        // DCP/IMF AM
+        return (Event->StreamIDs[0]<<24) | (Event->StreamIDs[1]<<16) | Event->StreamIDs[2];
+    if (Event->StreamIDs_Size>=3 && Event->ParserIDs[0]==MediaInfo_Parser_DcpPkl)                                                       // DCP/IMF PKL
+        return (Event->StreamIDs[0]<<24) | (Event->StreamIDs[1]<<16) | Event->StreamIDs[2];
+    if (Event->StreamIDs_Size>=2 && Event->ParserIDs[0]==MediaInfo_Parser_DcpCpl)                                                       // DCP/IMF CPL
+        return (Event->StreamIDs[0]<<16) | Event->StreamIDs[1];
+    if (Event->StreamIDs_Size)
+        return Event->StreamIDs[0];
+    return (MediaInfo_int64u)-1; // No identifier
+}
+
+#ifdef __cplusplus
+#define MediaInfo_ID_FromEvent_string MediaInfo_ID_FromEvent_stringA
+inline std::string MediaInfo_ID_FromEvent_stringA (MediaInfo_Event_Generic* Event, int) // Flags)
+{
+    std::stringstream ToReturn;
+
+    if (Event->StreamIDs_Size>=2 && Event->ParserIDs[0]==MediaInfo_Parser_MpegPs && Event->ParserIDs[1]==MediaInfo_Parser_MpegPs_Ext)        // DVD-Video
+    {
+        ToReturn<<Event->StreamIDs[0];
+        ToReturn<<'-';
+        ToReturn<<Event->StreamIDs[1];
+    }
+    else if (Event->StreamIDs_Size>=2 && Event->ParserIDs[0]==MediaInfo_Parser_HdsF4m && Event->StreamIDs_Width[1])                          // HDS F4M having more than one stream per referenced file
+    {
+        ToReturn<<Event->StreamIDs[0];
+        ToReturn<<'-';
+        ToReturn<<Event->StreamIDs[1];
+    }
+    else if (Event->StreamIDs_Size>=3 && Event->ParserIDs[0]==MediaInfo_Parser_HlsIndex)                                                     // HLS Index
+    {
+        ToReturn<<Event->StreamIDs[0];
+        ToReturn<<'-';
+        if (Event->ParserIDs[1]==MediaInfo_Parser_Hls)
+            ToReturn<<Event->StreamIDs[2];
+        else
+            ToReturn<<Event->StreamIDs[1];
+    }
+    else if (Event->StreamIDs_Size>=2 && Event->ParserIDs[0]==MediaInfo_Parser_Hls)                                                          // HLS Sequence
+    {
+        ToReturn<<Event->StreamIDs[1];
+    }
+    else if (Event->StreamIDs_Size>=2 && Event->ParserIDs[0]==MediaInfo_Parser_Ism && Event->StreamIDs_Width[1])                             // ISM having more than one stream per referenced file
+    {
+        ToReturn<<Event->StreamIDs[0];
+        ToReturn<<'-';
+        ToReturn<<Event->StreamIDs[1];
+    }
+    else if (Event->StreamIDs_Size>=3 && Event->ParserIDs[0]==MediaInfo_Parser_Dxw && Event->ParserIDs[1]==MediaInfo_Parser_MpegTs)          // DXW with MPEG-TS
+    {
+        ToReturn<<Event->StreamIDs[0];
+        ToReturn<<'-';
+        ToReturn<<Event->StreamIDs[1];
+    }
+    else if (Event->StreamIDs_Size>=3 && Event->ParserIDs[0]==MediaInfo_Parser_DcpAm)                                                        // DCP/IMF AM
+    {
+        ToReturn<<Event->StreamIDs[0];
+        ToReturn<<'-';
+        ToReturn<<Event->StreamIDs[1];
+        ToReturn<<'-';
+        ToReturn<<Event->StreamIDs[2];
+    }
+    else if (Event->StreamIDs_Size>=3 && Event->ParserIDs[0]==MediaInfo_Parser_DcpPkl)                                                       // DCP/IMF PKL
+    {
+        ToReturn<<Event->StreamIDs[0];
+        ToReturn<<'-';
+        ToReturn<<Event->StreamIDs[1];
+        ToReturn<<'-';
+        ToReturn<<Event->StreamIDs[2];
+    }
+    else if (Event->StreamIDs_Size>=3 && Event->ParserIDs[0]==MediaInfo_Parser_DcpCpl)                                                       // DCP/IMF CPL
+    {
+        ToReturn<<Event->StreamIDs[0];
+        ToReturn<<'-';
+        ToReturn<<Event->StreamIDs[1];
+    }
+    else if (Event->StreamIDs_Size)
+    {
+        ToReturn<<Event->StreamIDs[0];
+    }
+    return ToReturn.str();
+}
+#endif //__cplusplus
+
+#define MediaInfo_ID_FromGet_int MediaInfo_ID_FromGet_intA
+inline MediaInfo_int64u MediaInfo_ID_FromGet_intA (const char* ID, const char* ContainerFormat, const char* MuxingMode)
+{
+    MediaInfo_int64u ToReturn;
+    const char* SubID;
+
+    ToReturn=(MediaInfo_int64u)atoi(ID);
+    SubID=strstr(ID, "-");
+    if (SubID)
+    {
+        MediaInfo_int64u ToReturn2;
+
+        ToReturn2=atoi(SubID+1);
+
+        SubID=strstr(SubID+1, "-");
+        if (SubID)
+        {
+            MediaInfo_int64u ToReturn3;
+
+            ToReturn3=atoi(SubID+1);
+            if (strcmp(ContainerFormat, "DCP AM")==0                                            // DCP AM
+             || strcmp(ContainerFormat, "DCP PKL")==0                                           // DCP PKL
+             || strcmp(ContainerFormat, "IMF AM")==0                                            // IMF AM
+             || strcmp(ContainerFormat, "IMF PKL")==0)                                          // IMF PKL
+                ToReturn=(ToReturn<<24) | (ToReturn2<<16) | ToReturn3;
+        }
+        else if (
+            strcmp(MuxingMode, "DVD-Video")==0                                                  // DVD-Video
+         || strcmp(ContainerFormat, "HDS F4M")==0                                               // HDS F4M having more than one stream per referenced file
+         || strcmp(ContainerFormat, "HLS")==0 && strstr(MuxingMode, "HLS")==MuxingMode          // HLS Index
+         || strcmp(ContainerFormat, "HLS")==0 && strstr(MuxingMode, "MPEG-TS")==MuxingMode      // HLS Index
+         || strcmp(ContainerFormat, "ISM")==0                                                   // ISM having more than one stream per referenced file
+         || strcmp(ContainerFormat, "DXW")==0 && strstr(MuxingMode, "MPEG-TS")==MuxingMode      // DXW with MPEG-TS
+         || strcmp(ContainerFormat, "DCP CPL")==0                                               // DCP CPL
+         || strcmp(ContainerFormat, "IMF CPL")==0)                                              // IMF CPL
+            ToReturn=(ToReturn<<16) | ToReturn2;
+    }
+
+    return ToReturn;
+}
+
 #endif //MediaInfo_EventsH
diff --git a/Source/MediaInfo/MediaInfo_Events_Internal.h b/Source/MediaInfo/MediaInfo_Events_Internal.h
index b4bcc12..6987fb9 100644
--- a/Source/MediaInfo/MediaInfo_Events_Internal.h
+++ b/Source/MediaInfo/MediaInfo_Events_Internal.h
@@ -11,7 +11,6 @@
 #include "MediaInfo/TimeCode.h"
 #include <cstring>
 using namespace MediaInfoLib;
-using namespace std;
 
 //---------------------------------------------------------------------------
 // Generic
@@ -31,6 +30,72 @@ using namespace std;
     EVENT_END  ()
 
 //---------------------------------------------------------------------------
+// MPEG-TS
+#define MEDIAINFO_EVENT_MPEGTS_BEGIN(_EVENTID, _EVENTVERSION, _TEST) \
+if (_TEST) \
+{ \
+    StreamIDs[StreamIDs_Size-1]=pid; \
+    EVENT_BEGIN (MpegTs, _EVENTID, _EVENTVERSION) \
+
+#define MEDIAINFO_EVENT_MPEGTS_BEGI2(_EVENTID, _EVENTVERSION, _TEST) \
+MEDIAINFO_EVENT_MPEGTS_BEGIN(_EVENTID, _EVENTVERSION, _TEST) \
+    StreamIDs[StreamIDs_Size-1]=pid; \
+    EVENT_BEGIN (MpegTs, _EVENTID, _EVENTVERSION) \
+
+#define MEDIAINFO_EVENT_MPEGTS_END(_EVENTID, _EVENTVERSION) \
+    EVENT_END   () \
+}
+
+#define MEDIAINFO_EVENT_MPEGTS(_EVENTID, _EVENTVERSION, _TEST) \
+    MEDIAINFO_EVENT_MPEGTS_BEGIN(_EVENTID, _EVENTVERSION, _TEST) \
+    MEDIAINFO_EVENT_MPEGTS_END  (_EVENTID, _EVENTVERSION)
+
+//---------------------------------------------------------------------------
+// MPEG-PS
+#define MEDIAINFO_EVENT_MPEGPS_BEGIN(_EVENTID, _EVENTVERSION, _TEST) \
+if (_TEST) \
+{ \
+    EVENT_BEGIN (MpegPs, _EVENTID, 0) \
+
+#define MEDIAINFO_EVENT_MPEGPS_END(_EVENTID, _EVENTVERSION) \
+    EVENT_END   () \
+}
+
+#define MEDIAINFO_EVENT_MPEGPS(_EVENTID, _EVENTVERSION, _TEST) \
+    MEDIAINFO_EVENT_MPEGPS_BEGIN(_EVENTID, _EVENTVERSION, _TEST) \
+    MEDIAINFO_EVENT_MPEGPS_END  (_EVENTID, _EVENTVERSION)
+
+//---------------------------------------------------------------------------
+// AVC
+#define MEDIAINFO_EVENT_AVC_BEGIN(_EVENTID, _EVENTVERSION, _TEST) \
+if (_TEST) \
+{ \
+    EVENT_BEGIN (Avc, _EVENTID, 0) \
+
+#define MEDIAINFO_EVENT_AVC_END(_EVENTID, _EVENTVERSION) \
+    EVENT_END   () \
+}
+
+#define MEDIAINFO_EVENT_AVC(_EVENTID, _EVENTVERSION, _TEST) \
+    MEDIAINFO_EVENT_AVC_BEGIN(_EVENTID, _EVENTVERSION, _TEST) \
+    MEDIAINFO_EVENT_AVC_END  (_EVENTID, _EVENTVERSION)
+
+//---------------------------------------------------------------------------
+// Dolby E
+#define MEDIAINFO_EVENT_DOLBYE_BEGIN(_EVENTID, _EVENTVERSION, _TEST) \
+if (_TEST) \
+{ \
+    EVENT_BEGIN (DolbyE, _EVENTID, 0) \
+
+#define MEDIAINFO_EVENT_DOLBYE_END(_EVENTID, _EVENTVERSION) \
+    EVENT_END   () \
+}
+
+#define MEDIAINFO_EVENT_DOLBYE(_EVENTID, _EVENTVERSION, _TEST) \
+    MEDIAINFO_EVENT_DOLBYE_BEGIN(_EVENTID, _EVENTVERSION, _TEST) \
+    MEDIAINFO_EVENT_DOLBYE_END  (_EVENTID, _EVENTVERSION)
+
+//---------------------------------------------------------------------------
 // Helpers
 namespace MediaInfoLib
 {
diff --git a/Source/MediaInfo/MediaInfo_Internal.cpp b/Source/MediaInfo/MediaInfo_Internal.cpp
index 4b9b70c..3849843 100644
--- a/Source/MediaInfo/MediaInfo_Internal.cpp
+++ b/Source/MediaInfo/MediaInfo_Internal.cpp
@@ -746,7 +746,11 @@ size_t MediaInfo_Internal::Open_Buffer_Init (int64u File_Size_, int64u File_Offs
     if (Config.File_Names.size()<=1) //If analyzing multiple files, theses members are adapted in File_Reader.cpp
     {
         if (File_Size_!=(int64u)-1)
+        {
             Config.File_Size=Config.File_Current_Size=File_Size_;
+            if (Info && !Info->Retrieve(Stream_General, 0, General_FileSize).empty())
+                Info->Fill(Stream_General, 0, General_FileSize, File_Size_, 10, true); //TODO: avoid multiple tests of file size field, refactor it in order to have a single place for file size info
+        }
     }
 
     if (Info==NULL || File_Size_!=(int64u)-1)
@@ -926,6 +930,12 @@ size_t MediaInfo_Internal::Open_Buffer_Finalize ()
     {
         delete[] Config.File_Buffer; Config.File_Buffer=NULL; Config.File_Buffer_Size=0; Config.File_Buffer_Size_Max=0;
     }
+    #if MEDIAINFO_EVENTS
+        if (!Config.File_IsReferenced_Get()) //TODO: get its own metadata in order to know if it was created by this instance
+        {
+            delete Config.Config_PerPackage; Config.Config_PerPackage=NULL;
+        }
+    #endif //MEDIAINFO_EVENTS
 
     EXECUTE_SIZE_T(1, Debug+=__T("Open_Buffer_Finalize, will return 1"))
 }
diff --git a/Source/MediaInfo/Multiple/File_Aaf.cpp b/Source/MediaInfo/Multiple/File_Aaf.cpp
index cd789fd..2935ad0 100644
--- a/Source/MediaInfo/Multiple/File_Aaf.cpp
+++ b/Source/MediaInfo/Multiple/File_Aaf.cpp
@@ -38,7 +38,7 @@ namespace MediaInfoLib
 // Info
 //***************************************************************************
 
-const char* AAf_tagSTGTY (int8u tagSTGTY)
+static const char* AAf_tagSTGTY (int8u tagSTGTY)
 {
     switch (tagSTGTY)
     {
@@ -52,7 +52,7 @@ const char* AAf_tagSTGTY (int8u tagSTGTY)
     }
 }
 
-const char* AAf_tagDECOLOR (int8u tagDECOLOR)
+static const char* AAf_tagDECOLOR (int8u tagDECOLOR)
 {
     switch (tagDECOLOR)
     {
diff --git a/Source/MediaInfo/Multiple/File_Aaf.h b/Source/MediaInfo/Multiple/File_Aaf.h
index 7ba6644..ee530ae 100644
--- a/Source/MediaInfo/Multiple/File_Aaf.h
+++ b/Source/MediaInfo/Multiple/File_Aaf.h
@@ -109,7 +109,7 @@ private :
         int8u* Buffer;
         vector<int32u> StreamOffsets;
 
-        stream(const Ztring Name_, size_t Directory_Pos_, int64u Size_)
+        stream(const Ztring& Name_, size_t Directory_Pos_, int64u Size_)
             :
             Name(Name_),
             Directory_Pos(Directory_Pos_),
@@ -121,6 +121,7 @@ private :
 
     private:
         stream &operator=(const stream &v);
+        stream(const stream&);
         stream();
     } stream;
     vector<stream*> Streams;
diff --git a/Source/MediaInfo/Multiple/File_Ancillary.cpp b/Source/MediaInfo/Multiple/File_Ancillary.cpp
index c642354..6823539 100644
--- a/Source/MediaInfo/Multiple/File_Ancillary.cpp
+++ b/Source/MediaInfo/Multiple/File_Ancillary.cpp
@@ -53,7 +53,7 @@ namespace MediaInfoLib
 // Infos
 //***************************************************************************
 
-const char* Ancillary_DataID(int8u DataID, int8u SecondaryDataID)
+static const char* Ancillary_DataID(int8u DataID, int8u SecondaryDataID)
 {
     // TODO: check http://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.1364-2-201003-I!!PDF-E.pdf
     switch (DataID)
diff --git a/Source/MediaInfo/Multiple/File_Bdmv.cpp b/Source/MediaInfo/Multiple/File_Bdmv.cpp
index 263a526..9845a35 100644
--- a/Source/MediaInfo/Multiple/File_Bdmv.cpp
+++ b/Source/MediaInfo/Multiple/File_Bdmv.cpp
@@ -60,7 +60,7 @@ namespace Elements
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Clpi_Offsets[]=
+static const char* Clpi_Offsets[]=
 {
     "ClipInfo",
     "SequenceInfo",
@@ -74,7 +74,7 @@ const char* Clpi_Offsets[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Indx_Offsets[]=
+static const char* Indx_Offsets[]=
 {
     "AppInfoBDMV",
     "Indexes",
@@ -88,7 +88,7 @@ const char* Indx_Offsets[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mobj_Offsets[]=
+static const char* Mobj_Offsets[]=
 {
     "MovieObjects",
     "Reserved",
@@ -102,7 +102,7 @@ const char* Mobj_Offsets[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpls_Offsets[]=
+static const char* Mpls_Offsets[]=
 {
     "AppInfoPlayList",
     "PlayList",
@@ -116,7 +116,7 @@ const char* Mpls_Offsets[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Bdmv_Type(int32u Type_Indicator, size_t Start_Adress_Pos)
+static const char* Bdmv_Type(int32u Type_Indicator, size_t Start_Adress_Pos)
 {
     switch (Type_Indicator)
     {
@@ -129,7 +129,7 @@ const char* Bdmv_Type(int32u Type_Indicator, size_t Start_Adress_Pos)
 }
 
 //---------------------------------------------------------------------------
-const char* Clpi_Format(int8u StreamType)
+static const char* Clpi_Format(int8u StreamType)
 {
     switch (StreamType)
     {
@@ -157,7 +157,7 @@ const char* Clpi_Format(int8u StreamType)
 }
 
 //---------------------------------------------------------------------------
-const char* Clpi_Format_Profile(int8u StreamType)
+static const char* Clpi_Format_Profile(int8u StreamType)
 {
     switch (StreamType)
     {
@@ -169,7 +169,7 @@ const char* Clpi_Format_Profile(int8u StreamType)
 }
 
 //---------------------------------------------------------------------------
-stream_t Clpi_Type(int8u StreamType)
+static stream_t Clpi_Type(int8u StreamType)
 {
     switch (StreamType)
     {
@@ -197,7 +197,7 @@ stream_t Clpi_Type(int8u StreamType)
 }
 
 //---------------------------------------------------------------------------
-const char* Clpi_Video_Format[]=
+static const char* Clpi_Video_Format[]=
 {
     "",
     "480i",
@@ -218,7 +218,7 @@ const char* Clpi_Video_Format[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Clpi_Video_Interlacement[]=
+static const char* Clpi_Video_Interlacement[]=
 {
     "",
     "Interlaced",
@@ -239,7 +239,7 @@ const char* Clpi_Video_Interlacement[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Clpi_Video_Standard[]=
+static const char* Clpi_Video_Standard[]=
 {
     "",
     "NTSC",
@@ -260,7 +260,7 @@ const char* Clpi_Video_Standard[]=
 };
 
 //---------------------------------------------------------------------------
-int16u Clpi_Video_Width[]=
+static const int16u Clpi_Video_Width[]=
 {
     0,
     720,
@@ -281,7 +281,7 @@ int16u Clpi_Video_Width[]=
 };
 
 //---------------------------------------------------------------------------
-int16u Clpi_Video_Height[]=
+static const int16u Clpi_Video_Height[]=
 {
     0,
     480,
@@ -302,7 +302,7 @@ int16u Clpi_Video_Height[]=
 };
 
 //---------------------------------------------------------------------------
-float32 Clpi_Video_FrameRate[]=
+static const float32 Clpi_Video_FrameRate[]=
 {
     (float32) 0.000,
     (float32)23.976,
@@ -323,7 +323,7 @@ float32 Clpi_Video_FrameRate[]=
 };
 
 //---------------------------------------------------------------------------
-float32 Clpi_Video_AspectRatio[]=
+static const float32 Clpi_Video_AspectRatio[]=
 {
     (float32)0.000,
     (float32)0.000,
@@ -344,7 +344,7 @@ float32 Clpi_Video_AspectRatio[]=
 };
 
 //---------------------------------------------------------------------------
-int8u Clpi_Audio_Channels[]=
+static const int8u Clpi_Audio_Channels[]=
 {
     0,
     1,
@@ -365,7 +365,7 @@ int8u Clpi_Audio_Channels[]=
 };
 
 //---------------------------------------------------------------------------
-int32u Clpi_Audio_SamplingRate[]=
+static const int32u Clpi_Audio_SamplingRate[]=
 {
         0,
     48000,
@@ -386,7 +386,7 @@ int32u Clpi_Audio_SamplingRate[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Indx_object_type[]=
+static const char* Indx_object_type[]=
 {
     "",
     "HDMV",
@@ -395,7 +395,7 @@ const char* Indx_object_type[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Indx_playback_type[4][4]=
+static const char* Indx_playback_type[4][4]=
 {
     {"",            "",             "",             "",             },
     {"Movie",       "Interactive",  "",             "",             },
@@ -404,7 +404,7 @@ const char* Indx_playback_type[4][4]=
 };
 
 //---------------------------------------------------------------------------
-const char* Indx_title_search[]=
+static const char* Indx_title_search[]=
 {
     "Permitted",
     "Prohibited1",
@@ -413,7 +413,7 @@ const char* Indx_title_search[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpls_playback_type[]=
+static const char* Mpls_playback_type[]=
 {
     "Sequential",
     "Random",
@@ -422,7 +422,7 @@ const char* Mpls_playback_type[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpls_PlayListMarks_Mark_type(int8u type)
+static const char* Mpls_PlayListMarks_Mark_type(int8u type)
 {
     switch (type)
     {
@@ -437,7 +437,7 @@ const char* Mpls_PlayListMarks_Mark_type(int8u type)
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-Ztring Bdmv_Decimal_Hexa(int64u Number)
+static Ztring Bdmv_Decimal_Hexa(int64u Number)
 {
     Ztring Temp;
     Temp.From_Number(Number);
diff --git a/Source/MediaInfo/Multiple/File_DashMpd.cpp b/Source/MediaInfo/Multiple/File_DashMpd.cpp
index 9274206..7bc6492 100644
--- a/Source/MediaInfo/Multiple/File_DashMpd.cpp
+++ b/Source/MediaInfo/Multiple/File_DashMpd.cpp
@@ -45,7 +45,7 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-void DashMpd_Transform (Ztring &Value, std::map<Ztring, Ztring> &Attributes)
+static void DashMpd_Transform (Ztring &Value, std::map<Ztring, Ztring> &Attributes)
 {
     size_t Pos1=0;
     for (;;)
@@ -78,7 +78,7 @@ void DashMpd_Transform (Ztring &Value, std::map<Ztring, Ztring> &Attributes)
 }
 
 //---------------------------------------------------------------------------
-stream_t DashMpd_mimeType_StreamKind (const char* mimeType)
+static stream_t DashMpd_mimeType_StreamKind (const char* mimeType)
 {
     Ztring StreamKind; StreamKind.From_UTF8(mimeType);
         if (StreamKind.find(__T("video"))==0)
@@ -92,7 +92,7 @@ stream_t DashMpd_mimeType_StreamKind (const char* mimeType)
 }
 
 //---------------------------------------------------------------------------
-Ztring DashMpd_codecid_CodecID (const char* codecid)
+static Ztring DashMpd_codecid_CodecID (const char* codecid)
 {
     Ztring CodecID;
 
diff --git a/Source/MediaInfo/Multiple/File_DcpCpl.cpp b/Source/MediaInfo/Multiple/File_DcpCpl.cpp
index f01c235..f79219d 100644
--- a/Source/MediaInfo/Multiple/File_DcpCpl.cpp
+++ b/Source/MediaInfo/Multiple/File_DcpCpl.cpp
@@ -38,6 +38,10 @@ using namespace std;
 namespace MediaInfoLib
 {
 
+//---------------------------------------------------------------------------
+extern string Jpeg2000_Rsiz(int16u Rsiz);
+//---------------------------------------------------------------------------
+
 //***************************************************************************
 // Constructor/Destructor
 //***************************************************************************
@@ -156,6 +160,10 @@ bool File_DcpCpl::FileHeader_Begin()
     //Parsing main elements
     for (XMLElement* CompositionPlaylist_Item=Root->FirstChildElement(); CompositionPlaylist_Item; CompositionPlaylist_Item=CompositionPlaylist_Item->NextSiblingElement())
     {
+        const char* CompositionPlaylist_Item_Value=CompositionPlaylist_Item->Value();
+        if (!CompositionPlaylist_Item_Value)
+            continue;
+
         //CompositionTimecode
         if (IsImf && MatchQName(CompositionPlaylist_Item, "CompositionTimecode", NameSpace))
         {
@@ -208,6 +216,87 @@ bool File_DcpCpl::FileHeader_Begin()
                 Fill(Stream_Other, StreamPos_Last, Info->first.c_str(), Info->second);
         }
 
+        #if MEDIAINFO_ADVANCED
+            //EssenceDescriptorList
+            if (IsImf && !strcmp(CompositionPlaylist_Item_Value, "EssenceDescriptorList"))
+            {
+                for (XMLElement* EssenceDescriptorList_Item=CompositionPlaylist_Item->FirstChildElement(); EssenceDescriptorList_Item; EssenceDescriptorList_Item=EssenceDescriptorList_Item->NextSiblingElement())
+                {
+                const char* EssenceDescriptorList_Item_Value=EssenceDescriptorList_Item->Value();
+                if (!EssenceDescriptorList_Item_Value)
+                    continue;
+
+                    //TimecodeDropFrame
+                    if (!strcmp(EssenceDescriptorList_Item_Value, "EssenceDescriptor"))
+                    {
+                        string Id;
+                        descriptor* Descriptor=new descriptor;
+
+                        for (XMLElement* EssenceDescriptor_Item=EssenceDescriptorList_Item->FirstChildElement(); EssenceDescriptor_Item; EssenceDescriptor_Item=EssenceDescriptor_Item->NextSiblingElement())
+                        {
+                            const char* EssenceDescriptor_Item_Value=EssenceDescriptor_Item->Value();
+                            const char* EssenceDescriptor_Item_Text=EssenceDescriptor_Item->GetText();
+                            if (!EssenceDescriptor_Item_Value)
+                                continue;
+
+                            //Id
+                            if (EssenceDescriptor_Item_Text && !strcmp(EssenceDescriptor_Item_Value, "Id"))
+                                Id=EssenceDescriptor_Item_Text;
+
+                            //CDCIDescriptor
+                            if (!strcmp(EssenceDescriptor_Item_Value, "m:RGBADescriptor") || !strcmp(EssenceDescriptor_Item_Value, "m:CDCIDescriptor"))
+                            {
+                                for (XMLElement* Descriptor_Item=EssenceDescriptor_Item->FirstChildElement(); Descriptor_Item; Descriptor_Item=Descriptor_Item->NextSiblingElement())
+                                {
+                                    const char* Descriptor_Item_Value=Descriptor_Item->Value();
+                                    if (!Descriptor_Item_Value)
+                                        continue;
+
+                                    //SubDescriptors
+                                    if (!strcmp(Descriptor_Item_Value, "m:SubDescriptors"))
+                                    {
+                                        for (XMLElement* SubDescriptors_Item=Descriptor_Item->FirstChildElement(); SubDescriptors_Item; SubDescriptors_Item=SubDescriptors_Item->NextSiblingElement())
+                                        {
+                                            const char* SubDescriptors_Item_Value=SubDescriptors_Item->Value();
+                                            if (!SubDescriptors_Item_Value)
+                                                continue;
+
+                                            descriptor* SubDescriptor=new descriptor;
+
+                                            //JPEG2000PictureSubDescriptor
+                                            if (!strcmp(SubDescriptors_Item_Value, "m:JPEG2000PictureSubDescriptor"))
+                                            {
+                                                for (XMLElement* JPEG2000PictureSubDescriptor_Item=SubDescriptors_Item->FirstChildElement(); JPEG2000PictureSubDescriptor_Item; JPEG2000PictureSubDescriptor_Item=JPEG2000PictureSubDescriptor_Item->NextSiblingElement())
+                                                {
+                                                    const char* JPEG2000PictureSubDescriptor_Item_Value=JPEG2000PictureSubDescriptor_Item->Value();
+                                                    const char* JPEG2000PictureSubDescriptor_Item_Text=JPEG2000PictureSubDescriptor_Item->GetText();
+                                                    if (!JPEG2000PictureSubDescriptor_Item_Value || !JPEG2000PictureSubDescriptor_Item_Text)
+                                                        continue;
+
+                                                    //Xsiz
+                                                    if (!strcmp(JPEG2000PictureSubDescriptor_Item_Value, "m:Rsiz"))
+                                                    {
+                                                        SubDescriptor->Jpeg2000_Rsiz=(int16u)atoi(JPEG2000PictureSubDescriptor_Item_Text);
+                                                    }
+                                                }
+                                            }
+
+                                            Descriptor->SubDescriptors.push_back(SubDescriptor);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+
+                        if (!Id.empty())
+                            EssenceDescriptorList[Id]=Descriptor;
+                        else
+                            delete Descriptor; // Can not be associated
+                    }
+                }
+            }
+        #endif //MEDIAINFO_ADVANCED
+
         //ReelList / SegmentList
         if (MatchQName(CompositionPlaylist_Item, IsDcp?"ReelList":"SegmentList", NameSpace))
         {
@@ -304,6 +393,12 @@ bool File_DcpCpl::FileHeader_Begin()
                                                         if (!strcmp(ResItemName, "SourceDuration"))
                                                             Resource->IgnoreEditsAfter=Resource->IgnoreEditsBefore+atoi(ResText);
 
+                                                        #if MEDIAINFO_ADVANCED
+                                                            //SourceEncoding
+                                                            if (!strcmp(ResItemName, "SourceEncoding"))
+                                                                Resource->SourceEncodings.push_back(ResText);
+                                                        #endif //MEDIAINFO_ADVANCED
+
                                                         //TrackFileId
                                                         if (!strcmp(ResItemName, "TrackFileId"))
                                                             Resource->FileNames.push_back(Ztring().From_UTF8(ResText));
@@ -373,6 +468,12 @@ bool File_DcpCpl::FileHeader_Begin()
 
     ReferenceFiles->FilesForStorage=true;
 
+    #if MEDIAINFO_ADVANCED
+        for (std::map<string, descriptor*>::iterator EssenceDescriptor = EssenceDescriptorList.begin(); EssenceDescriptor != EssenceDescriptorList.end(); ++EssenceDescriptor)
+            for (std::vector<descriptor*>::iterator SubDescriptor = EssenceDescriptor->second->SubDescriptors.begin(); SubDescriptor != EssenceDescriptor->second->SubDescriptors.end(); ++SubDescriptor)
+                ReferenceFiles->UpdateMetaDataFromSourceEncoding(EssenceDescriptor->first, "Format_Profile", Jpeg2000_Rsiz((*SubDescriptor)->Jpeg2000_Rsiz));
+    #endif //MEDIAINFO_ADVANCED
+
     //All should be OK...
     return true;
 }
diff --git a/Source/MediaInfo/Multiple/File_DcpCpl.h b/Source/MediaInfo/Multiple/File_DcpCpl.h
index 31af019..23a18cd 100644
--- a/Source/MediaInfo/Multiple/File_DcpCpl.h
+++ b/Source/MediaInfo/Multiple/File_DcpCpl.h
@@ -55,6 +55,25 @@ private :
 
     //Temp
     File__ReferenceFilesHelper*     ReferenceFiles;
+    #if MEDIAINFO_ADVANCED
+        struct descriptor
+        {
+            std::vector<descriptor*> SubDescriptors;
+            int16u Jpeg2000_Rsiz;
+
+            descriptor()
+            : Jpeg2000_Rsiz((int16u)-1)
+            {
+            }
+
+            ~descriptor()
+            {
+                for (std::vector<descriptor*>::iterator SubDescriptor=SubDescriptors.begin(); SubDescriptor!=SubDescriptors.end(); ++SubDescriptor)
+                    delete *SubDescriptor; //*SubDescriptor=NULL;
+            }
+        };
+        std::map<string, descriptor*> EssenceDescriptorList;
+    #endif //MEDIAINFO_ADVANCED
 };
 
 } //NameSpace
diff --git a/Source/MediaInfo/Multiple/File_DvDif.cpp b/Source/MediaInfo/Multiple/File_DvDif.cpp
index 4b3f940..405f23f 100644
--- a/Source/MediaInfo/Multiple/File_DvDif.cpp
+++ b/Source/MediaInfo/Multiple/File_DvDif.cpp
@@ -35,7 +35,7 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-const char*  Dv_sct[]=
+static const char*  Dv_sct[]=
 {
     "Header",
     "Subcode",
@@ -63,7 +63,7 @@ const char* Dv_Ssyb_Pc0(int8u Pc0)
 }
 
 //---------------------------------------------------------------------------
-const char*  Dv_Disp[]=
+static const char*  Dv_Disp[]=
 {
     "4/3",                              //S306M, S314M
     "16/9",                             //S306M
@@ -76,7 +76,7 @@ const char*  Dv_Disp[]=
 };
 
 //---------------------------------------------------------------------------
-const int32u  Dv_Audio_SamplingRate[]=
+static const int32u  Dv_Audio_SamplingRate[]=
 {
     48000,
     44100,
@@ -89,14 +89,14 @@ const int32u  Dv_Audio_SamplingRate[]=
 };
 
 //---------------------------------------------------------------------------
-const char*  Dv_StereoMode[]=
+static const char*  Dv_StereoMode[]=
 {
     "Multi-Stero",
     "Lumped",
 };
 
 //---------------------------------------------------------------------------
-const int32u  Dv_Audio_BitDepth[]=
+static const int32u  Dv_Audio_BitDepth[]=
 {
     16,
     12,
@@ -109,7 +109,7 @@ const int32u  Dv_Audio_BitDepth[]=
 };
 
 //---------------------------------------------------------------------------
-const int8u  Dv_ChannelsPerBlock[]=
+static const int8u  Dv_ChannelsPerBlock[]=
 {
     1,
     2,
@@ -118,14 +118,14 @@ const int8u  Dv_ChannelsPerBlock[]=
 };
 
 //---------------------------------------------------------------------------
-const char*  Dv_Pair[]=
+static const char*  Dv_Pair[]=
 {
     "One pair of channels",
     "Independent channels",
 };
 
 //---------------------------------------------------------------------------
-const char*  Dv_CopyGenerationManagementSystem[]=
+static const char*  Dv_CopyGenerationManagementSystem[]=
 {
     "Unrestricted",
     "Not used",
@@ -134,7 +134,7 @@ const char*  Dv_CopyGenerationManagementSystem[]=
 };
 
 //---------------------------------------------------------------------------
-const char*  Dv_InputType[]=
+static const char*  Dv_InputType[]=
 {
     "Analog",
     "Digital",
@@ -143,7 +143,7 @@ const char*  Dv_InputType[]=
 };
 
 //---------------------------------------------------------------------------
-const char*  Dv_CompressionTimes[]=
+static const char*  Dv_CompressionTimes[]=
 {
     "Once",
     "Twice",
@@ -152,7 +152,7 @@ const char*  Dv_CompressionTimes[]=
 };
 
 //---------------------------------------------------------------------------
-const char*  Dv_Emphasis[]=
+static const char*  Dv_Emphasis[]=
 {
     "Enphasis off",
     "Enphasis on",
@@ -161,7 +161,7 @@ const char*  Dv_Emphasis[]=
 };
 
 //---------------------------------------------------------------------------
-const char*  Dv_consumer_camera_1_ae_mode[]=
+static const char*  Dv_consumer_camera_1_ae_mode[]=
 {
     "full automatic",
     "gain priority mode",
@@ -182,7 +182,7 @@ const char*  Dv_consumer_camera_1_ae_mode[]=
 };
 
 //---------------------------------------------------------------------------
-const char*  Dv_consumer_camera_1_wb_mode[]=
+static const char*  Dv_consumer_camera_1_wb_mode[]=
 {
     "automatic",
     "hold",
@@ -211,7 +211,7 @@ const char* Dv_consumer_camera_1_white_balance(int8u white_balance)
 }
 
 //---------------------------------------------------------------------------
-const char*  Dv_consumer_camera_1_fcm[]=
+static const char*  Dv_consumer_camera_1_fcm[]=
 {
     "auto focus",
     "manual focus",
diff --git a/Source/MediaInfo/Multiple/File_Dvdv.cpp b/Source/MediaInfo/Multiple/File_Dvdv.cpp
index b0c0243..754e42c 100644
--- a/Source/MediaInfo/Multiple/File_Dvdv.cpp
+++ b/Source/MediaInfo/Multiple/File_Dvdv.cpp
@@ -44,13 +44,13 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-const char*  IFO_VTS_Category[]=
+static const char*  IFO_VTS_Category[]=
 {
     "Normal",
     "Karaoke",
 };
 
-const char*  IFO_Format_V[]=
+static const char*  IFO_Format_V[]=
 {
     "MPEG Video",
     "MPEG Video",
@@ -58,7 +58,7 @@ const char*  IFO_Format_V[]=
     "",
 };
 
-const char*  IFO_Format_Version_V[]=
+static const char*  IFO_Format_Version_V[]=
 {
     "Version 1",
     "Version 2",
@@ -66,7 +66,7 @@ const char*  IFO_Format_Version_V[]=
     "",
 };
 
-const char*  IFO_CodecV[]=
+static const char*  IFO_CodecV[]=
 {
     "MPEG-1V",
     "MPEG-2V",
@@ -74,7 +74,7 @@ const char*  IFO_CodecV[]=
     "",
 };
 
-const char*  IFO_Standard[]=
+static const char*  IFO_Standard[]=
 {
     "NTSC",
     "PAL",
@@ -82,7 +82,7 @@ const char*  IFO_Standard[]=
     "",
 };
 
-float32  IFO_AspectRatio[]=
+static const float32  IFO_AspectRatio[]=
 {
     (float32)1.333,
     (float32)0.000,
@@ -90,26 +90,26 @@ float32  IFO_AspectRatio[]=
     (float32)1.778,
 };
 
-const char*  IFO_BitRate_Mode[]=
+static const char*  IFO_BitRate_Mode[]=
 {
     "VBR",
     "CBR",
 };
 
-const size_t IFO_Width[]=
+static const size_t IFO_Width[]=
 {720, 704, 352, 352,   0,   0,   0,   0};
 
-const size_t IFO_Height[4][8]=
+static const size_t IFO_Height[4][8]=
 {{480, 480, 480, 240,   0,   0,   0,   0}, //NTSC
  {576, 576, 576, 288,   0,   0,   0,   0}, //PAL
  {  0,   0,   0,   0,   0,   0,   0,   0}, //Unknown
  {  0,   0,   0,   0,   0,   0,   0,   0}, //Unknown
  };
 
-const float64 IFO_FrameRate[]=
+static const float64 IFO_FrameRate[]=
 {29.970, 25.000};
 
-const char*  IFO_Format_A[]=
+static const char*  IFO_Format_A[]=
 {
     "AC-3",
     "",
@@ -121,7 +121,7 @@ const char*  IFO_Format_A[]=
     "SDDS",
 };
 
-const char*  IFO_Format_Profile_A[]=
+static const char*  IFO_Format_Profile_A[]=
 {
     "",
     "",
@@ -133,7 +133,7 @@ const char*  IFO_Format_Profile_A[]=
     "",
 };
 
-const char*  IFO_CodecA[]=
+static const char*  IFO_CodecA[]=
 {
     "AC3",
     "",
@@ -145,7 +145,7 @@ const char*  IFO_CodecA[]=
     "SDDS",
 };
 
-const char*  IFO_ModeA[]=
+static const char*  IFO_ModeA[]=
 {
     "",
     "Karaoke",
@@ -153,7 +153,7 @@ const char*  IFO_ModeA[]=
     "",
 };
 
-const char*  IFO_ResolutionA[]=
+static const char*  IFO_ResolutionA[]=
 {
     "16",
     "20",
@@ -161,10 +161,10 @@ const char*  IFO_ResolutionA[]=
     "DRC",
 };
 
-const int16u IFO_SamplingRate[]=
+static const int16u IFO_SamplingRate[]=
 {48000, 0, 0, 0, 0, 0, 0, 0};
 
-const char*  IFO_Language_MoreA[]=
+static const char*  IFO_Language_MoreA[]=
 {
     "",
     "",
@@ -176,7 +176,7 @@ const char*  IFO_Language_MoreA[]=
     "",
 };
 
-const char*  IFO_Format_T[]=
+static const char*  IFO_Format_T[]=
 {
     "RLE",
     "",
@@ -188,7 +188,7 @@ const char*  IFO_Format_T[]=
     "",
 };
 
-const char*  IFO_Resolution_T[]=
+static const char*  IFO_Resolution_T[]=
 {
     "2",
     "",
@@ -200,7 +200,7 @@ const char*  IFO_Resolution_T[]=
     "",
 };
 
-const char*  IFO_CodecT[]=
+static const char*  IFO_CodecT[]=
 {
     "2-bit RLE",
     "",
@@ -212,7 +212,7 @@ const char*  IFO_CodecT[]=
     "",
 };
 
-const char*  IFO_Language_MoreT[]=
+static const char*  IFO_Language_MoreT[]=
 {
     "",
     "Normal",
@@ -232,10 +232,10 @@ const char*  IFO_Language_MoreT[]=
     "Director comments children",
 };
 
-const size_t IFO_PlaybackTime_FrameRate[]=
+static const size_t IFO_PlaybackTime_FrameRate[]=
 {1, 25, 1, 30};
 
-const char*  IFO_MenuType[]=
+static const char*  IFO_MenuType[]=
 {
     "",
     "",
diff --git a/Source/MediaInfo/Multiple/File_Dxw.cpp b/Source/MediaInfo/Multiple/File_Dxw.cpp
index a001463..0729192 100644
--- a/Source/MediaInfo/Multiple/File_Dxw.cpp
+++ b/Source/MediaInfo/Multiple/File_Dxw.cpp
@@ -147,6 +147,12 @@ bool File_Dxw::FileHeader_Begin()
                                  Sequence->IsMain=true;
                         }
 
+                        Attribute=Track->Attribute("default_timecode");
+                        if (Attribute)
+                        {
+                            Sequence->Config["File_DefaultTimeCode"].From_UTF8(Attribute);
+                        }
+
                         Sequence->StreamID=ReferenceFiles->Sequences_Size()+1;
                     }
 
diff --git a/Source/MediaInfo/Multiple/File_Flv.cpp b/Source/MediaInfo/Multiple/File_Flv.cpp
index 5c3dec8..1ad7a30 100644
--- a/Source/MediaInfo/Multiple/File_Flv.cpp
+++ b/Source/MediaInfo/Multiple/File_Flv.cpp
@@ -61,19 +61,19 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-const int16u  Flv_Channels[]=
+static const int16u  Flv_Channels[]=
 {
     1,
     2,
 };
 
-const int16u  Flv_Resolution[]=
+static const int16u  Flv_Resolution[]=
 {
     8,
     16,
 };
 
-const int16u Flv_SamplingRate[]=
+static const int16u Flv_SamplingRate[]=
 {
     5500,
     11025,
@@ -82,7 +82,7 @@ const int16u Flv_SamplingRate[]=
     8000, //Special case for Nellymoser 8kHz mono
 };
 
-const char* Flv_Format_Audio[16]=
+static const char* Flv_Format_Audio[16]=
 {
     "PCM",
     "ADPCM",
@@ -102,7 +102,7 @@ const char* Flv_Format_Audio[16]=
     "",
 };
 
-const char* Flv_Format_Profile_Audio[16]=
+static const char* Flv_Format_Profile_Audio[16]=
 {
     "",
     "",
@@ -122,7 +122,7 @@ const char* Flv_Format_Profile_Audio[16]=
     "",
 };
 
-const char* Flv_Codec_Audio[16]=
+static const char* Flv_Codec_Audio[16]=
 {
     "Uncompressed",
     "ADPCM",
@@ -142,7 +142,7 @@ const char* Flv_Codec_Audio[16]=
     "",
 };
 
-const char* Flv_CodecID_Hint_Audio[16]=
+static const char* Flv_CodecID_Hint_Audio[16]=
 {
     "",
     "",
@@ -162,7 +162,7 @@ const char* Flv_CodecID_Hint_Audio[16]=
     "",
 };
 
-const char* Flv_Format_Video[16]=
+static const char* Flv_Format_Video[16]=
 {
     "",
     "",
@@ -182,7 +182,7 @@ const char* Flv_Format_Video[16]=
     "",
 };
 
-const char* Flv_Format_Profile_Video[16]=
+static const char* Flv_Format_Profile_Video[16]=
 {
     "",
     "",
@@ -202,7 +202,7 @@ const char* Flv_Format_Profile_Video[16]=
     "",
 };
 
-const char* Flv_Codec_Video[16]=
+static const char* Flv_Codec_Video[16]=
 {
     "",
     "",
@@ -222,7 +222,7 @@ const char* Flv_Codec_Video[16]=
     "",
 };
 
-const char* Flv_CodecID_Hint_Video[16]=
+static const char* Flv_CodecID_Hint_Video[16]=
 {
     "",
     "",
@@ -242,7 +242,7 @@ const char* Flv_CodecID_Hint_Video[16]=
     "",
 };
 
-const char* Flv_H263_PictureSize[]=
+static const char* Flv_H263_PictureSize[]=
 {
     "custom, 1 byte",
     "custom, 2 bytes",
@@ -254,7 +254,7 @@ const char* Flv_H263_PictureSize[]=
     "",
 };
 
-const int16u Flv_H263_WidthHeight[8][2]=
+static const int16u Flv_H263_WidthHeight[8][2]=
 {
     {  0,   0},
     {  0,   0},
@@ -266,26 +266,26 @@ const int16u Flv_H263_WidthHeight[8][2]=
     {0, 0},
 };
 
-const char* Flv_H263_PictureType[]=
+static const char* Flv_H263_PictureType[]=
 {
     "IntraFrame",
     "InterFrame",
     "InterFrame (Disposable)",
     "",
 };
-const char* Flv_VP6_FrameMode[]=
+static const char* Flv_VP6_FrameMode[]=
 {
     "IntraFrame",
     "",
 };
 
-const char* Flv_VP6_Marker[]=
+static const char* Flv_VP6_Marker[]=
 {
     "VP6.1/6.2",
     "VP6.0",
 };
 
-const char* Flv_VP6_Version[]=
+static const char* Flv_VP6_Version[]=
 {
     "",
     "",
@@ -321,7 +321,7 @@ const char* Flv_VP6_Version[]=
     "",
 };
 
-const char* Flv_VP6_Version2[]=
+static const char* Flv_VP6_Version2[]=
 {
     "VP6.0",
     "",
@@ -329,7 +329,7 @@ const char* Flv_VP6_Version2[]=
     "VP6.1/6.2",
 };
 
-const char* Flv_FrameType[]=
+static const char* Flv_FrameType[]=
 {
     "",
     "KeyFrame",
@@ -349,7 +349,7 @@ const char* Flv_FrameType[]=
     "",
 };
 
-const char* Flv_TagType[]=
+static const char* Flv_TagType[]=
 {
     "DOUBLE",
     "UI8",
@@ -371,7 +371,7 @@ const char* Flv_TagType[]=
     "AMF3 data",
 };
 
-const char* Flv_Amf3Type[]=
+static const char* Flv_Amf3Type[]=
 {
     "Undefined",
     "Null",
@@ -388,7 +388,7 @@ const char* Flv_Amf3Type[]=
     "ByteArray",
 };
 
-const char* Flv_AVCPacketType(int8u Value)
+static const char* Flv_AVCPacketType(int8u Value)
 {
     switch (Value)
     {
@@ -399,7 +399,7 @@ const char* Flv_AVCPacketType(int8u Value)
     }
 }
 
-const char* Flv_AACPacketType(int8u Value)
+static const char* Flv_AACPacketType(int8u Value)
 {
     switch (Value)
     {
diff --git a/Source/MediaInfo/Multiple/File_Gxf.cpp b/Source/MediaInfo/Multiple/File_Gxf.cpp
index 28a7c20..e387501 100644
--- a/Source/MediaInfo/Multiple/File_Gxf.cpp
+++ b/Source/MediaInfo/Multiple/File_Gxf.cpp
@@ -59,7 +59,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Gxf_Tag_Name(int8u Tag)
+static const char* Gxf_Tag_Name(int8u Tag)
 {
     switch (Tag)
     {
@@ -87,7 +87,7 @@ const char* Gxf_Tag_Name(int8u Tag)
 }
 
 //---------------------------------------------------------------------------
-const char* Gxf_MediaTypes(int8u Type)
+static const char* Gxf_MediaTypes(int8u Type)
 {
     switch (Type)
     {
@@ -117,7 +117,7 @@ const char* Gxf_MediaTypes(int8u Type)
 }
 
 //---------------------------------------------------------------------------
-stream_t Gxf_MediaTypes_StreamKind(int8u Type)
+static stream_t Gxf_MediaTypes_StreamKind(int8u Type)
 {
     switch (Type)
     {
@@ -147,7 +147,7 @@ stream_t Gxf_MediaTypes_StreamKind(int8u Type)
 }
 
 //---------------------------------------------------------------------------
-const char* Gxf_MediaTypes_Format(int8u Type)
+static const char* Gxf_MediaTypes_Format(int8u Type)
 {
     switch (Type)
     {
@@ -189,7 +189,7 @@ double Gxf_FrameRate(int32u Content)
 }
 
 //---------------------------------------------------------------------------
-int32u Gxf_LinesPerFrame_Height(int32u Content)
+static int32u Gxf_LinesPerFrame_Height(int32u Content)
 {
     switch (Content)
     {
@@ -202,7 +202,7 @@ int32u Gxf_LinesPerFrame_Height(int32u Content)
 }
 
 //---------------------------------------------------------------------------
-int32u Gxf_LinesPerFrame_Width(int32u Content)
+static int32u Gxf_LinesPerFrame_Width(int32u Content)
 {
     switch (Content)
     {
@@ -215,7 +215,7 @@ int32u Gxf_LinesPerFrame_Width(int32u Content)
 }
 
 //---------------------------------------------------------------------------
-const char* Gxf_FieldsPerFrame(int32u Tag)
+static const char* Gxf_FieldsPerFrame(int32u Tag)
 {
     switch (Tag)
     {
@@ -1053,6 +1053,7 @@ void File_Gxf::map()
                         case 22 :
                         case 23 :   //MPEG Video
                                      {
+                                        #ifdef MEDIAINFO_MPEGV_YES
                                         File__Analyze* Parser=new File_Mpegv();
                                         ((File_Mpegv*)Parser)->FrameIsAlwaysComplete=true;
                                         ((File_Mpegv*)Parser)->Ancillary=&Ancillary;
@@ -1061,6 +1062,7 @@ void File_Gxf::map()
 
                                         Parsers_Count++;
                                         Streams[TrackID].Searching_Payload=true;
+                                        #endif //MEDIAINFO_MPEGV_YES
                                      }
                                     break;
                         case 13 :
@@ -1095,6 +1097,7 @@ void File_Gxf::map()
                                     break;
                         case 21 :   //Ancillary Metadata
                                     {
+                                        #ifdef MEDIAINFO_RIFF_YES
                                         File__Analyze* Parser=new File_Riff();
                                         ((File_Riff*)Parser)->Ancillary=&Ancillary;
                                         Open_Buffer_Init(Parser);
@@ -1110,6 +1113,7 @@ void File_Gxf::map()
                                         AncillaryData_StreamID=TrackID;
                                         if (SizeToAnalyze<8*16*1024*1024)
                                             SizeToAnalyze*=8; //10x more, to be sure to find captions
+                                        #endif //MEDIAINFO_RIFF_YES
                                     }
                                     break;
                         default :   ;
diff --git a/Source/MediaInfo/Multiple/File_Gxf_TimeCode.cpp b/Source/MediaInfo/Multiple/File_Gxf_TimeCode.cpp
index 26414ba..33ee3ea 100644
--- a/Source/MediaInfo/Multiple/File_Gxf_TimeCode.cpp
+++ b/Source/MediaInfo/Multiple/File_Gxf_TimeCode.cpp
@@ -54,7 +54,7 @@ namespace MediaInfoLib
 #endif //defined(MEDIAINFO_GXF_YES)
 
 //---------------------------------------------------------------------------
-const char* Atc_PayloadType (int8u PayloadType)
+static const char* Atc_PayloadType (int8u PayloadType)
 {
     switch (PayloadType)
     {
diff --git a/Source/MediaInfo/Multiple/File_Lxf.cpp b/Source/MediaInfo/Multiple/File_Lxf.cpp
index 5cfbc79..955c511 100644
--- a/Source/MediaInfo/Multiple/File_Lxf.cpp
+++ b/Source/MediaInfo/Multiple/File_Lxf.cpp
@@ -74,7 +74,7 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-const char* Lxf_Format_Video[16]=
+static const char* Lxf_Format_Video[16]=
 {
     "JPEG",
     "MPEG Video", //Version 1
@@ -95,7 +95,7 @@ const char* Lxf_Format_Video[16]=
 };
 
 //---------------------------------------------------------------------------
-const char* Lxf_PictureType[4]=
+static const char* Lxf_PictureType[4]=
 {
     "I", //Closed
     "I", //Open
@@ -104,7 +104,7 @@ const char* Lxf_PictureType[4]=
 };
 
 //---------------------------------------------------------------------------
-extern const float64 Mpegv_frame_rate[]; //In Video/File_Mpegv.cpp
+extern const float64 Mpegv_frame_rate[16]; //In Video/File_Mpegv.cpp
 
 //***************************************************************************
 // Constructor/Destructor
@@ -640,6 +640,9 @@ void File_Lxf::Header_Parse()
     //Parsing
     int64u BlockSize=0, TimeStamp=0, Duration=0;
     int32u HeaderSize, Type;
+    int32u Size; //Video and Audio
+    int8u VideoFormat, GOP_M, PictureType; //Video
+    int8u Channels_Count=0; //Audio
     Skip_C8(                                                    "Signature");
     Get_L4 (Version,                                            "Version"); //0=start and duration are in field, 1=in 27 MHz values
     Get_L4 (HeaderSize,                                         "Header size");
@@ -674,8 +677,8 @@ void File_Lxf::Header_Parse()
                     }
                     break;
         case 1 :
-            Get_L8 (TimeStamp,                          "TimeStamp"); Param_Info3(((float64)TimeStamp)/720000, " s", 3); FrameInfo.DTS=FrameInfo.PTS=float64_int64s(((float64)TimeStamp)*1000000/720);
-            Get_L8 (Duration,                           "Duration"); Param_Info3(((float64)Duration)/720000, " s", 3); FrameInfo.DUR=float64_int64s(((float64)Duration)*1000000/720);
+                    Get_L8 (TimeStamp,                          "TimeStamp"); Param_Info3(((float64)TimeStamp)/720000, " s", 3); FrameInfo.DTS=FrameInfo.PTS=float64_int64s(((float64)TimeStamp)*1000000/720);
+                    Get_L8 (Duration,                           "Duration"); Param_Info3(((float64)Duration)/720000, " s", 3); FrameInfo.DUR=float64_int64s(((float64)Duration)*1000000/720);
                     break;
         default:    ;
     }
@@ -684,8 +687,6 @@ void File_Lxf::Header_Parse()
         case 0  :   //Video
                     {
                     Video_Sizes.resize(3);
-                    int32u Size;
-                    int8u VideoFormat, GOP_M, PictureType;
                     BS_Begin_LE();
                     Get_T1 (4, VideoFormat,                     "Format"); Param_Info1(Lxf_Format_Video[VideoFormat]);
                     Skip_T1(7,                                  "GOP (N)");
@@ -708,44 +709,10 @@ void File_Lxf::Header_Parse()
                     if (!Video_Sizes.empty())
                         Video_Sizes[0]=Size;
                     BlockSize+=Size;
-                    if (Videos_Header.TimeStamp_Begin==(int64u)-1)
-                        Videos_Header.TimeStamp_Begin=TimeStamp;
-                    Videos_Header.TimeStamp_End=TimeStamp+Duration;
-                    Videos_Header.Duration=Duration;
-                    if (TimeStamp==LastAudio_TimeOffset.TimeStamp_Begin)
-                        TimeOffsets[LastAudio_BufferOffset]=stream_header(TimeStamp, TimeStamp+Duration, Duration, PictureType);
-                    else
-                        TimeOffsets[File_Offset+Buffer_Offset]=stream_header(TimeStamp, TimeStamp+Duration, Duration, PictureType);
-                    int64u PTS_Computing=TimeStamp;
-                    #if MEDIAINFO_DEMUX
-                        switch (PictureType)
-                        {
-                            case 2 :
-                            case 3 : Demux_random_access=false; break; //P-Frame, B-Frame
-                            default: Demux_random_access=true ;        //I-Frame
-                        }
-                    #endif //MEDIAINFO_DEMUX
-                    if (2>Videos.size())
-                        Videos.resize(2+1);
-                    if (!Video_Sizes.empty())
-                        Videos[2].Format=VideoFormat;
-                    if (GOP_M>1) //With B-frames
-                    {
-                        switch (PictureType)
-                        {
-                            case 2 : PTS_Computing+=GOP_M*Duration; break; //P-Frame
-                            case 3 :                                break; //B-Frame
-                            default: PTS_Computing+=Duration;              //I-Frame
-                        }
-                    }
-                    FrameInfo.PTS=float64_int64s(((float64)PTS_Computing)*1000000000/TimeStamp_Rate);
                     }
                     break;
         case 1  :   //Audio
                     {
-                    int32u Size;
-                    int8u Channels_Count=0;
-
                     if (Version==0)
                     {
                         Skip_L4(                                "First Active Field");
@@ -778,17 +745,6 @@ void File_Lxf::Header_Parse()
                     for (size_t Pos=0; Pos<Audio_Sizes.size(); Pos++)
                         Audio_Sizes[Pos]=Size;
                     BlockSize=Size*Channels_Count;
-                    if (Audios_Header.TimeStamp_Begin==(int64u)-1)
-                        Audios_Header.TimeStamp_Begin=TimeStamp;
-                    Audios_Header.TimeStamp_End=TimeStamp+Duration;
-                    Audios_Header.Duration=Duration;
-                    if (Audios_Header.Duration_First==(int64u)-1 && Duration)
-                        Audios_Header.Duration_First=Duration;
-                    LastAudio_BufferOffset=File_Offset+Buffer_Offset;
-                    LastAudio_TimeOffset=stream_header(TimeStamp, TimeStamp+Duration, Duration, (int8u)-1);
-                    #if MEDIAINFO_DEMUX
-                        Demux_random_access=true;
-                    #endif //MEDIAINFO_DEMUX
                     }
                     break;
         case 2  :   //Header
@@ -820,20 +776,77 @@ void File_Lxf::Header_Parse()
     if (Element_Offset<HeaderSize)
         Skip_XX(Header_Size-Element_Offset,                     "Unknown");
 
-    if (Buffer_Offset+Element_Offset+BlockSize>Buffer_Size)
-    {
-        //Hints
-        if (File_Buffer_Size_Hint_Pointer)
-        {
-            size_t Buffer_Size_Target=(size_t)(Buffer_Offset+0x48+BlockSize+0x48); //+0x48 for next packet header
-            if ((*File_Buffer_Size_Hint_Pointer)<Buffer_Size_Target)
-                (*File_Buffer_Size_Hint_Pointer)=Buffer_Size_Target;
-        }
-    }
-
     //Filling
     Header_Fill_Code(Type, Ztring::ToZtring(Type));
     Header_Fill_Size(HeaderSize+BlockSize);
+
+    FILLING_BEGIN();
+        if (Buffer_Offset+Element_Offset+BlockSize>Buffer_Size)
+        {
+            //Hints
+            if (File_Buffer_Size_Hint_Pointer)
+            {
+                size_t Buffer_Size_Target=(size_t)(Buffer_Offset+0x48+BlockSize+0x48); //+0x48 for next packet header
+                if ((*File_Buffer_Size_Hint_Pointer)<Buffer_Size_Target)
+                    (*File_Buffer_Size_Hint_Pointer)=Buffer_Size_Target;
+            }
+        }
+
+        switch(Type)
+        {
+            case 0  :   //Video
+                        {
+                        if (Videos_Header.TimeStamp_Begin==(int64u)-1)
+                            Videos_Header.TimeStamp_Begin=TimeStamp;
+                        Videos_Header.TimeStamp_End=TimeStamp+Duration;
+                        Videos_Header.Duration=Duration;
+                        if (TimeStamp==LastAudio_TimeOffset.TimeStamp_Begin)
+                            TimeOffsets[LastAudio_BufferOffset]=stream_header(TimeStamp, TimeStamp+Duration, Duration, PictureType);
+                        else
+                            TimeOffsets[File_Offset+Buffer_Offset]=stream_header(TimeStamp, TimeStamp+Duration, Duration, PictureType);
+                        int64u PTS_Computing=TimeStamp;
+                        #if MEDIAINFO_DEMUX
+                            switch (PictureType)
+                            {
+                                case 2 :
+                                case 3 : Demux_random_access=false; break; //P-Frame, B-Frame
+                                default: Demux_random_access=true ;        //I-Frame
+                            }
+                        #endif //MEDIAINFO_DEMUX
+                        if (2>Videos.size())
+                            Videos.resize(2+1);
+                        if (!Video_Sizes.empty())
+                            Videos[2].Format=VideoFormat;
+                        if (GOP_M>1) //With B-frames
+                        {
+                            switch (PictureType)
+                            {
+                                case 2 : PTS_Computing+=GOP_M*Duration; break; //P-Frame
+                                case 3 :                                break; //B-Frame
+                                default: PTS_Computing+=Duration;              //I-Frame
+                            }
+                        }
+                        FrameInfo.PTS=float64_int64s(((float64)PTS_Computing)*1000000000/TimeStamp_Rate);
+                        }
+                        break;
+            case 1  :   //Audio
+                        {
+                        if (Audios_Header.TimeStamp_Begin==(int64u)-1)
+                            Audios_Header.TimeStamp_Begin=TimeStamp;
+                        Audios_Header.TimeStamp_End=TimeStamp+Duration;
+                        Audios_Header.Duration=Duration;
+                        if (Audios_Header.Duration_First==(int64u)-1 && Duration)
+                            Audios_Header.Duration_First=Duration;
+                        LastAudio_BufferOffset=File_Offset+Buffer_Offset;
+                        LastAudio_TimeOffset=stream_header(TimeStamp, TimeStamp+Duration, Duration, (int8u)-1);
+                        #if MEDIAINFO_DEMUX
+                            Demux_random_access=true;
+                        #endif //MEDIAINFO_DEMUX
+                        }
+                        break;
+            default :   BlockSize=0;
+        }
+    FILLING_END();
 }
 
 //---------------------------------------------------------------------------
diff --git a/Source/MediaInfo/Multiple/File_Mk.cpp b/Source/MediaInfo/Multiple/File_Mk.cpp
index 525e97d..4ae219e 100644
--- a/Source/MediaInfo/Multiple/File_Mk.cpp
+++ b/Source/MediaInfo/Multiple/File_Mk.cpp
@@ -90,6 +90,7 @@
 #endif //MEDIAINFO_EVENTS
 #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
 #include <cstring>
+#include <cmath>
 #include <algorithm>
 #include "base64.h"
 //---------------------------------------------------------------------------
@@ -280,7 +281,14 @@ namespace Elements
     const int64u Segment_Tracks_TrackEntry_Video_DisplayUnit=0x14B2;
     const int64u Segment_Tracks_TrackEntry_Video_DisplayWidth=0x14B0;
     const int64u Segment_Tracks_TrackEntry_Video_FlagInterlaced=0x1A;
+    const int64u Segment_Tracks_TrackEntry_Video_FieldOrder=0x1D;
     const int64u Segment_Tracks_TrackEntry_Video_FrameRate=0x383E3;
+    const int64u Segment_Tracks_TrackEntry_Video_Colour=0x15B0;
+    const int64u Segment_Tracks_TrackEntry_Video_Colour_MatrixCoefficients=0x15B1;
+    const int64u Segment_Tracks_TrackEntry_Video_Colour_BitsPerChannel=0x15B2;
+    const int64u Segment_Tracks_TrackEntry_Video_Colour_Range=0x15B9;
+    const int64u Segment_Tracks_TrackEntry_Video_Colour_TransferCharacteristics=0x15BA;
+    const int64u Segment_Tracks_TrackEntry_Video_Colour_Primaries=0x15BB;
     const int64u Segment_Tracks_TrackEntry_Video_PixelCropBottom=0x14AA;
     const int64u Segment_Tracks_TrackEntry_Video_PixelCropLeft=0x14CC;
     const int64u Segment_Tracks_TrackEntry_Video_PixelCropRight=0x14DD;
@@ -304,7 +312,7 @@ namespace Elements
 // for each data byte do
 //     CRC32=(CRC32>>8) ^ Mk_CRC32_Table[(CRC32&0xFF)^*Buffer_Current++];
 // End: CRC32 ^= 0;
-int32u Mk_CRC32_Table[256] =
+static const int32u Mk_CRC32_Table[256] =
 {
     0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
     0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
@@ -373,7 +381,54 @@ int32u Mk_CRC32_Table[256] =
 };
 
 //---------------------------------------------------------------------------
-const char* Mk_ContentCompAlgo(int64u Algo)
+static void Matroska_CRC32_Compute(int32u &CRC32, const int8u* Buffer_Current, const int8u* Buffer_End)
+{
+    while (Buffer_Current<Buffer_End)
+        CRC32 = (CRC32 >> 8) ^ Mk_CRC32_Table[(CRC32 & 0xFF) ^ *Buffer_Current++];
+}
+
+//---------------------------------------------------------------------------
+static void Matroska_CRC32_Compute(int32u &CRC32, int32u Init, const int8u* Buffer_Current, const int8u* Buffer_End)
+{
+    CRC32 ^= Init;
+
+    Matroska_CRC32_Compute(CRC32, Buffer_Current, Buffer_End);
+
+    CRC32 ^= Init;
+}
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_FIXITY
+static size_t Matroska_TryToFixCRC(int8u* Buffer, size_t Buffer_Size, int32u CRCExpected, int8u& Modified)
+{
+    //looking for a bit flip
+    vector<size_t> BitPositions;
+    size_t BitPosition_Max=Buffer_Size*8;
+    for (size_t BitPosition=0; BitPosition<BitPosition_Max; BitPosition++)
+    {
+        size_t BytePosition=BitPosition>>3;
+        size_t BitInBytePosition=BitPosition&0x7;
+        Buffer[BytePosition]^=1<<BitInBytePosition;
+        int32u CRC32Computed=0xFFFFFFFF;
+        Matroska_CRC32_Compute(CRC32Computed, Buffer, Buffer+Buffer_Size);
+        CRC32Computed ^= 0xFFFFFFFF;
+        if (CRC32Computed==CRCExpected)
+        {
+            BitPositions.push_back(BitPosition);
+        }
+        Buffer[BytePosition]^=1<<BitInBytePosition;
+    }
+
+    if (BitPositions.size()!=1)
+        return (size_t)-1;
+        
+    Modified=Buffer[BitPositions[0]>>3]; //Save the byte here as we already have the content
+    return BitPositions[0];
+}
+#endif //MEDIAINFO_FIXITY
+
+//---------------------------------------------------------------------------
+static const char* Mk_ContentCompAlgo(int64u Algo)
 {
     switch (Algo)
     {
@@ -386,7 +441,7 @@ const char* Mk_ContentCompAlgo(int64u Algo)
 }
 
 //---------------------------------------------------------------------------
-const char* Mk_StereoMode(int64u StereoMode)
+static const char* Mk_StereoMode(int64u StereoMode)
 {
     switch (StereoMode)
     {
@@ -410,7 +465,7 @@ const char* Mk_StereoMode(int64u StereoMode)
 }
 
 //---------------------------------------------------------------------------
-const char* Mk_StereoMode_v2(int64u StereoMode)
+static const char* Mk_StereoMode_v2(int64u StereoMode)
 {
     switch (StereoMode)
     {
@@ -423,7 +478,7 @@ const char* Mk_StereoMode_v2(int64u StereoMode)
 }
 
 //---------------------------------------------------------------------------
-const char* Mk_OriginalSourceMedium_From_Source_ID (const Ztring &Value)
+static const char* Mk_OriginalSourceMedium_From_Source_ID (const Ztring &Value)
 {
     if (Value.size()==6 && Value[0] == __T('0') && Value[1] == __T('0'))
         return "Blu-ray";
@@ -433,7 +488,7 @@ const char* Mk_OriginalSourceMedium_From_Source_ID (const Ztring &Value)
 }
 
 //---------------------------------------------------------------------------
-Ztring Mk_ID_From_Source_ID (const Ztring &Value)
+static Ztring Mk_ID_From_Source_ID (const Ztring &Value)
 {
     if (Value.size()==6 && Value[0] == __T('0') && Value[1] == __T('0'))
     {
@@ -483,7 +538,7 @@ Ztring Mk_ID_From_Source_ID (const Ztring &Value)
 }
 
 //---------------------------------------------------------------------------
-Ztring Mk_ID_String_From_Source_ID (const Ztring &Value)
+static Ztring Mk_ID_String_From_Source_ID (const Ztring &Value)
 {
     if (Value.size()==6 && Value[0] == __T('0') && Value[1] == __T('0'))
     {
@@ -766,7 +821,7 @@ void File_Mk::Streams_Finish()
                     float64 Duration_1000 = Statistics_FrameCount / float64_int64s(FrameRate_FromTags) * 1.001001;
                     bool CanBe1001 = false;
                     bool CanBe1000 = false;
-                    if (abs((Duration_1000 - Duration_1001) * 10000) >= 15)
+                    if (fabs((Duration_1000 - Duration_1001) * 10000) >= 15)
                     {
                         Ztring DurationS; DurationS.From_Number(Statistics_Duration, 3);
                         Ztring DurationS_1001; DurationS_1001.From_Number(Duration_1001, 3);
@@ -1097,6 +1152,30 @@ void File_Mk::Header_Parse()
     Get_EB (Name,                                               "Name");
     Get_EB (Size,                                               "Size");
 
+    //Detection of 0-sized Segment expected to be -1-sized (unlimited)
+    if (Name==Elements::Segment && Size==0)
+    {
+        Param_Info1("Incoherent, changed to unlimited");
+        Size=0xFFFFFFFFFFFFFFLL; //Unlimited
+        Fill(Stream_General, 0, "SegmentSizeIsZero", "Yes");
+
+        #if MEDIAINFO_FIXITY
+            if (Config->TryToFix_Get())
+            {
+                size_t Pos=(size_t)(Element_Offset-1);
+                while (!Buffer[Buffer_Offset+Pos])
+                    Pos--;
+                size_t ToWrite_Size=Element_Offset-Pos; 
+                if (ToWrite_Size<=8)
+                {
+                    int8u ToWrite[8];
+                    int64u2BigEndian(ToWrite, ((int64u)-1)>>(ToWrite_Size-1));
+                    FixFile(File_Offset+Buffer_Offset+Pos, ToWrite, ToWrite_Size)?Param_Info1("Fixed"):Param_Info1("Not fixed");
+                }
+            }
+        #endif //MEDIAINFO_FIXITY
+    }
+
     //Filling
     Header_Fill_Code(Name, Ztring().From_Number(Name, 16));
     Header_Fill_Size(Element_Offset+Size);
@@ -1408,7 +1487,16 @@ void File_Mk::Data_Parse()
                     ATOM(Segment_Tracks_TrackEntry_Video_DisplayUnit)
                     ATOM(Segment_Tracks_TrackEntry_Video_DisplayWidth)
                     ATOM(Segment_Tracks_TrackEntry_Video_FlagInterlaced)
+                    ATOM(Segment_Tracks_TrackEntry_Video_FieldOrder)
                     ATOM(Segment_Tracks_TrackEntry_Video_FrameRate)
+                    LIST(Segment_Tracks_TrackEntry_Video_Colour)
+                        ATOM_BEGIN
+                        ATOM(Segment_Tracks_TrackEntry_Video_Colour_MatrixCoefficients)
+                        ATOM(Segment_Tracks_TrackEntry_Video_Colour_BitsPerChannel)
+                        ATOM(Segment_Tracks_TrackEntry_Video_Colour_Range)
+                        ATOM(Segment_Tracks_TrackEntry_Video_Colour_TransferCharacteristics)
+                        ATOM(Segment_Tracks_TrackEntry_Video_Colour_Primaries)
+                        ATOM_END_MK
                     ATOM(Segment_Tracks_TrackEntry_Video_PixelCropBottom)
                     ATOM(Segment_Tracks_TrackEntry_Video_PixelCropLeft)
                     ATOM(Segment_Tracks_TrackEntry_Video_PixelCropRight)
@@ -3680,6 +3768,15 @@ void File_Mk::Segment_Tracks_TrackEntry_Video_FlagInterlaced()
 }
 
 //---------------------------------------------------------------------------
+void File_Mk::Segment_Tracks_TrackEntry_Video_FieldOrder()
+{
+    Element_Name("FieldOrder");
+
+    //Parsing
+    UInteger_Info();
+}
+
+//---------------------------------------------------------------------------
 void File_Mk::Segment_Tracks_TrackEntry_Video_FrameRate()
 {
     Element_Name("FrameRate");
@@ -3696,6 +3793,57 @@ void File_Mk::Segment_Tracks_TrackEntry_Video_FrameRate()
 }
 
 //---------------------------------------------------------------------------
+void File_Mk::Segment_Tracks_TrackEntry_Video_Colour()
+{
+    Element_Name("Colour");
+}
+
+//---------------------------------------------------------------------------
+void File_Mk::Segment_Tracks_TrackEntry_Video_Colour_MatrixCoefficients()
+{
+    Element_Name("MatrixCoefficients");
+
+    //Parsing
+    UInteger_Info();
+}
+
+//---------------------------------------------------------------------------
+void File_Mk::Segment_Tracks_TrackEntry_Video_Colour_BitsPerChannel()
+{
+    Element_Name("BitsPerChannel");
+
+    //Parsing
+    UInteger_Info();
+}
+
+//---------------------------------------------------------------------------
+void File_Mk::Segment_Tracks_TrackEntry_Video_Colour_Range()
+{
+    Element_Name("Range");
+
+    //Parsing
+    UInteger_Info();
+}
+
+//---------------------------------------------------------------------------
+void File_Mk::Segment_Tracks_TrackEntry_Video_Colour_TransferCharacteristics()
+{
+    Element_Name("TransferCharacteristics");
+
+    //Parsing
+    UInteger_Info();
+}
+
+//---------------------------------------------------------------------------
+void File_Mk::Segment_Tracks_TrackEntry_Video_Colour_Primaries()
+{
+    Element_Name("Primaries");
+
+    //Parsing
+    UInteger_Info();
+}
+
+//---------------------------------------------------------------------------
 void File_Mk::Segment_Tracks_TrackEntry_Video_PixelCropBottom()
 {
     Element_Name("PixelCropBottom");
@@ -4455,7 +4603,7 @@ void File_Mk::CRC32_Check ()
     for (size_t i = 0; i<CRC32Compute.size(); i++)
         if (CRC32Compute[i].UpTo && File_Offset + Buffer_Offset - (size_t)Header_Size >= CRC32Compute[i].From)
         {
-            CRC32_Compute(CRC32Compute[i].Computed, Buffer + Buffer_Offset - (size_t)Header_Size, Buffer + Buffer_Offset + (size_t)(Element_WantNextLevel?Element_Offset:Element_Size));
+            Matroska_CRC32_Compute(CRC32Compute[i].Computed, Buffer + Buffer_Offset - (size_t)Header_Size, Buffer + Buffer_Offset + (size_t)(Element_WantNextLevel?Element_Offset:Element_Size));
             if (File_Offset + Buffer_Offset + (Element_WantNextLevel?Element_Offset:Element_Size) >= CRC32Compute[i].UpTo)
             {
                 CRC32Compute[i].Computed ^= 0xFFFFFFFF;
@@ -4471,6 +4619,31 @@ void File_Mk::CRC32_Check ()
                         {
                             std::string ToSearchInInfo=std::string("Not tested ")+Ztring::ToZtring(i).To_UTF8()+' '+Ztring::ToZtring(CRC32Compute[i].Expected).To_UTF8();
                             CRC32_Check_In_Node(ToSearchInInfo, CRC32Compute[i].Computed == CRC32Compute[i].Expected?"OK":"NOK", node);
+
+                            #if MEDIAINFO_FIXITY
+                                if (Config->TryToFix_Get() && CRC32Compute[i].Computed!=CRC32Compute[i].Expected)
+                                {
+                                    size_t NewBuffer_Size=(size_t)(CRC32Compute[i].UpTo-CRC32Compute[i].From);
+                                    int8u* NewBuffer=new int8u[NewBuffer_Size];
+                                    File F;
+                                    if (F.Open(File_Name))
+                                    {
+                                        F.GoTo(CRC32Compute[i].From);
+                                        F.Read(NewBuffer, NewBuffer_Size);
+                                        int8u Modified=0;
+                                        size_t BitPosition=Matroska_TryToFixCRC(NewBuffer, NewBuffer_Size, CRC32Compute[i].Expected, Modified);
+                                        if (BitPosition!=(size_t)-1)
+                                        {
+                                            size_t BytePosition=BitPosition>>3;
+                                            size_t BitInBytePosition=BitPosition&0x7;
+                                            Modified^=1<<BitInBytePosition;
+                                            FixFile(CRC32Compute[i].From+BytePosition, &Modified, 1)?Param_Info1("Fixed"):Param_Info1("Not fixed");
+                                        }
+                                    }
+                                    delete[] NewBuffer; //NewBuffer=NULL;
+                                }
+                            #endif //MEDIAINFO_FIXITY
+
                         }
 
                         //Debug
@@ -4491,23 +4664,6 @@ void File_Mk::CRC32_Check ()
         }
 }
 
-//---------------------------------------------------------------------------
-void File_Mk::CRC32_Compute(int32u &CRC32, int32u Init, const int8u* Buffer_Current, const int8u* Buffer_End)
-{
-    CRC32 ^= Init;
-
-    CRC32_Compute(CRC32, Buffer_Current, Buffer_End);
-
-    CRC32 ^= Init;
-}
-
-//---------------------------------------------------------------------------
-void File_Mk::CRC32_Compute(int32u &CRC32, const int8u* Buffer_Current, const int8u* Buffer_End)
-{
-    while(Buffer_Current<Buffer_End)
-        CRC32=(CRC32>>8) ^ Mk_CRC32_Table[(CRC32&0xFF)^*Buffer_Current++];
-}
-
 } //NameSpace
 
 #endif //MEDIAINFO_MK_YES
diff --git a/Source/MediaInfo/Multiple/File_Mk.h b/Source/MediaInfo/Multiple/File_Mk.h
index c669f5c..441936c 100644
--- a/Source/MediaInfo/Multiple/File_Mk.h
+++ b/Source/MediaInfo/Multiple/File_Mk.h
@@ -215,7 +215,14 @@ private :
     void Segment_Tracks_TrackEntry_Video_DisplayUnit();
     void Segment_Tracks_TrackEntry_Video_DisplayWidth();
     void Segment_Tracks_TrackEntry_Video_FlagInterlaced();
+    void Segment_Tracks_TrackEntry_Video_FieldOrder();
     void Segment_Tracks_TrackEntry_Video_FrameRate();
+    void Segment_Tracks_TrackEntry_Video_Colour();
+    void Segment_Tracks_TrackEntry_Video_Colour_MatrixCoefficients();
+    void Segment_Tracks_TrackEntry_Video_Colour_BitsPerChannel();
+    void Segment_Tracks_TrackEntry_Video_Colour_Range();
+    void Segment_Tracks_TrackEntry_Video_Colour_TransferCharacteristics();
+    void Segment_Tracks_TrackEntry_Video_Colour_Primaries();
     void Segment_Tracks_TrackEntry_Video_PixelCropBottom();
     void Segment_Tracks_TrackEntry_Video_PixelCropLeft();
     void Segment_Tracks_TrackEntry_Video_PixelCropRight();
@@ -384,8 +391,6 @@ private :
     void JumpTo(int64u GoTo);
     void TestMultipleInstances(size_t* Instances=NULL);
     void CRC32_Check();
-    void CRC32_Compute(int32u &CRC32, int32u Init, const int8u* Buffer_Begin, const int8u* Buffer_End);
-    void CRC32_Compute(int32u &CRC32, const int8u* Buffer_Begin, const int8u* Buffer_End);
 #if MEDIAINFO_TRACE
     bool CRC32_Check_In_Node(const std::string& ToSearchInInfo, const std::string& info, element_details::Element_Node *node);
 #endif // MEDIAINFO_TRACE
diff --git a/Source/MediaInfo/Multiple/File_Mpeg4.cpp b/Source/MediaInfo/Multiple/File_Mpeg4.cpp
index 3b37031..80d59ff 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg4.cpp
+++ b/Source/MediaInfo/Multiple/File_Mpeg4.cpp
@@ -41,6 +41,7 @@
     #include "MediaInfo/Multiple/File__ReferenceFilesHelper.h"
 #endif //MEDIAINFO_REFERENCES_YES
 #include "MediaInfo/Multiple/File_Mpeg4_TimeCode.h"
+#include "MediaInfo/TimeCode.h"
 #include "ZenLib/Format/Http/Http_Utils.h"
 #include <algorithm>    // std::sort
 //---------------------------------------------------------------------------
@@ -158,7 +159,7 @@ namespace Elements
 }
 
 //---------------------------------------------------------------------------
-Ztring Mpeg4_Encoded_Library(int32u Vendor)
+static Ztring Mpeg4_Encoded_Library(int32u Vendor)
 {
     switch (Vendor)
     {
@@ -172,7 +173,7 @@ Ztring Mpeg4_Encoded_Library(int32u Vendor)
 }
 
 //---------------------------------------------------------------------------
-Ztring Mpeg4_Language_Apple(int16u Language)
+static Ztring Mpeg4_Language_Apple(int16u Language)
 {
     switch (Language)
     {
@@ -1310,7 +1311,7 @@ void File_Mpeg4::Read_Buffer_Unsynched()
         IsParsing_mdat=false;
         return;
     }
-    IsParsing_mdat=true;
+    IsParsing_mdat_Set();
 
     #if MEDIAINFO_SEEK
         //Searching the ID of the first stream to be demuxed
@@ -1413,6 +1414,12 @@ void File_Mpeg4::Read_Buffer_Unsynched()
 
                         break;
                     }
+
+            if (Stream->second.Demux_Level&(1<<6))
+            {
+                Stream->second.Demux_Level|= (1<<7); //Add the flag, SPS/PPS must be sent
+                Stream->second.Demux_Level&=~(1<<6); //In case of seek again, no need to do it again
+            }
         #endif //MEDIAINFO_SEEK && MEDIAINFO_DEMUX
     }
 }
@@ -1621,7 +1628,7 @@ size_t File_Mpeg4::Read_Buffer_Seek (size_t Method, int64u Value, int64u ID)
                             {
                                 int64u CountOfChunks=(Value-SamplePos)/Stsc->SamplesPerChunk;
                                 size_t stco_Pos=(size_t)(Stsc->FirstChunk-1+CountOfChunks); //-1 because first chunk is number 1
-                                if (stco_Pos>Stream->second.stco.size())
+                                if (stco_Pos>=Stream->second.stco.size())
                                     return 2; //Invalid value
                                 int64u Offset=Stream->second.stco[stco_Pos];
 
@@ -1867,6 +1874,27 @@ struct Mpeg4_muxing
         MaximalOffset=0;
     }
 };
+struct stream_temp
+{
+    size_t stco_Pos; //Chunk Offset
+    size_t stsc_Pos; //Sample to Chunk
+    size_t stsc_SampleNumber;
+    int64u stsc_SampleSizeOffset;
+    size_t stts_Durations_Pos; //Time to Sample
+    int64u stts_Current;
+    size_t stsz_Pos;
+
+    stream_temp()
+    {
+        stco_Pos=0;
+        stsc_Pos=0;
+        stsc_SampleNumber=0;
+        stsc_SampleSizeOffset=0;
+        stts_Durations_Pos=0;
+        stts_Current=0;
+        stsz_Pos=0;
+    }
+};
 bool File_Mpeg4::BookMark_Needed()
 {
     #if MEDIAINFO_HASH
@@ -1882,7 +1910,7 @@ bool File_Mpeg4::BookMark_Needed()
         }
     #endif //MEDIAINFO_HASH
 
-    if (!mdat_MustParse)
+    if (!mdat_MustParse || File_GoTo!=(int64u)-1)
         return false;
 
     //Handling of some wrong stsz and stsc atoms (ADPCM)
@@ -1947,6 +1975,10 @@ bool File_Mpeg4::BookMark_Needed()
                        continue;
              }
 
+            // TODO: correctly demux timecodes spanned accross the file
+            if (Temp->second.TimeCode && Temp->second.stco.size()>1)
+                Temp->second.stco.resize(1);
+
             if (!Temp->second.stsz.empty() || Temp->second.stsz_Sample_Size)
             {
                 if (!stco_IsDifferent)
@@ -2111,6 +2143,130 @@ bool File_Mpeg4::BookMark_Needed()
                     StreamOffset_Jump[Streams[Muxing_2->first].stco[0]]=Streams[Muxing_2->first].stco[stco_Count-1];
                 }
             }
+            else if (!mdat_Pos.empty() && Config->ParseSpeed>=1)
+            {
+                //Trying to see if we must interleave manually
+                int64u stco_Video_First=(int64u)-1;
+                int64u stco_Video_Last=0;
+                int64u stco_Audio_First=(int64u)-1;
+                int64u stco_Audio_Last=0;
+                int64u stco_Audio_Last4=0;
+                std::vector<int32u> Videos;
+                std::vector<int32u> Audios;
+                for (streams::iterator Stream=Streams.begin(); Stream!=Streams.end(); Stream++)
+                {
+                    if (!Stream->second.stco.empty())
+                    {
+                        if (Stream->second.StreamKind==Stream_Video)
+                        {
+                            if (Stream->second.stco[0]<stco_Audio_First)
+                                stco_Video_First=Stream->second.stco[0];
+                            if (Stream->second.stco[Stream->second.stco.size()-1]>stco_Video_Last)
+                                stco_Video_Last=Stream->second.stco[Stream->second.stco.size()-1];
+                            Videos.push_back(Stream->first);
+                        }
+                        if (Stream->second.StreamKind==Stream_Audio)
+                        {
+                            if (Stream->second.stco[0]<stco_Audio_First)
+                                stco_Audio_First=Stream->second.stco[0];
+                            if (Stream->second.stco[Stream->second.stco.size()-1]>stco_Video_Last)
+                                stco_Audio_Last=Stream->second.stco[Stream->second.stco.size()-1];
+                            float32 DurationPerStco=((float32)Stream->second.mdhd_Duration)/Stream->second.mdhd_TimeScale/Stream->second.stco.size();
+                            size_t MaxCountOfStcoPerInterleave=2/DurationPerStco; //2 seconds, arbitrary chosen
+                            if (MaxCountOfStcoPerInterleave<4)
+                                MaxCountOfStcoPerInterleave=4;
+                            if (Stream->second.stco.size()>MaxCountOfStcoPerInterleave && Stream->second.stco[Stream->second.stco.size()-MaxCountOfStcoPerInterleave]>stco_Audio_Last4)
+                                stco_Audio_Last4=Stream->second.stco[Stream->second.stco.size()-MaxCountOfStcoPerInterleave];
+                            Audios.push_back(Stream->first);
+                        }
+                    }
+                }
+
+                if (stco_Video_Last!=(int64u)-1 && stco_Audio_Last!=0 && (stco_Video_Last<stco_Audio_First || stco_Video_Last<stco_Audio_Last4) && !Videos.empty() && !Audios.empty())
+                {
+                    //We need to interleave
+                    std::map<int32u, stream_temp> StreamsTemp;
+
+                    int64u CurrentPos=mdat_Pos.begin()->Offset;
+                    for (;;)
+                    {
+                        bool IsInterleaving=false;
+                        for (std::vector<int32u>::iterator Temp=Audios.begin(); Temp!=Audios.end(); Temp++)
+                        {
+                            if (StreamsTemp[*Temp].stco_Pos<Streams[*Temp].stco.size() && ((float64)StreamsTemp[*Temp].stts_Current)/Streams[*Temp].mdhd_TimeScale<=((float64)StreamsTemp[Videos[0]].stts_Current+Streams[Videos[0]].stts_Durations[StreamsTemp[Videos[0]].stts_Durations_Pos].SampleDuration)/Streams[Videos[0]].mdhd_TimeScale)
+                            {
+                                int64u NextPos=Streams[*Temp].stco[StreamsTemp[*Temp].stco_Pos];
+                                if (CurrentPos!=NextPos)
+                                {
+                                    StreamOffset_Jump[CurrentPos]=NextPos;
+                                    CurrentPos=NextPos;
+                                }
+                                for (size_t Pos=0; Pos<mdat_Pos.size(); ++Pos)
+                                    if (mdat_Pos[Pos].Offset==CurrentPos)
+                                    {
+                                        ++Pos;
+                                        if (Pos<mdat_Pos.size())
+                                            CurrentPos=mdat_Pos[Pos].Offset;
+                                        else
+                                            CurrentPos=File_Size;
+                                        break;
+                                    }
+                                ++StreamsTemp[*Temp].stco_Pos;
+                                StreamsTemp[*Temp].stts_Current+=Streams[*Temp].stts_Durations[StreamsTemp[*Temp].stts_Durations_Pos].SampleDuration;
+                                IsInterleaving=true;
+                            }
+                        }
+                        for (std::vector<int32u>::iterator Temp=Videos.begin(); Temp!=Videos.end(); Temp++)
+                        {
+                            if (StreamsTemp[*Temp].stco_Pos<Streams[*Temp].stco.size())
+                            {
+                                int64u NextPos=Streams[*Temp].stco[StreamsTemp[*Temp].stco_Pos]+StreamsTemp[*Temp].stsc_SampleSizeOffset;
+                                if (CurrentPos!=NextPos)
+                                {
+                                    StreamOffset_Jump[CurrentPos]=NextPos;
+                                    CurrentPos=NextPos;
+                                }
+                                for (size_t Pos=0; Pos<mdat_Pos.size(); ++Pos)
+                                    if (mdat_Pos[Pos].Offset==CurrentPos)
+                                    {
+                                        ++Pos;
+                                        if (Pos<mdat_Pos.size())
+                                            CurrentPos=mdat_Pos[Pos].Offset;
+                                        else
+                                            CurrentPos=File_Size;
+                                        break;
+                                    }
+                                ++StreamsTemp[*Temp].stsc_SampleNumber;
+                                if (Streams[*Temp].stsz.empty())
+                                    StreamsTemp[*Temp].stsc_SampleSizeOffset+=Streams[*Temp].stsz_Sample_Size;
+                                else
+                                {
+                                    StreamsTemp[*Temp].stsc_SampleSizeOffset+=Streams[*Temp].stsz[StreamsTemp[*Temp].stsz_Pos];
+                                    ++StreamsTemp[*Temp].stsz_Pos;
+                                }
+                                if (StreamsTemp[*Temp].stsc_SampleNumber>=Streams[*Temp].stsc[StreamsTemp[*Temp].stsc_Pos].SamplesPerChunk)
+                                {
+                                    StreamsTemp[*Temp].stsc_SampleNumber=0;
+                                    StreamsTemp[*Temp].stsc_SampleSizeOffset=0;
+                                    ++StreamsTemp[*Temp].stco_Pos;
+                                    if (StreamsTemp[*Temp].stsc_Pos+1<Streams[*Temp].stsc.size() && StreamsTemp[*Temp].stco_Pos+1>=Streams[*Temp].stsc[StreamsTemp[*Temp].stsc_Pos+1].FirstChunk)
+                                        StreamsTemp[*Temp].stsc_Pos++;
+                                }
+                                StreamsTemp[*Temp].stts_Current+=Streams[*Temp].stts_Durations[StreamsTemp[*Temp].stts_Durations_Pos].SampleDuration;
+                                IsInterleaving=true;
+                            }
+                        }
+
+                        if (!IsInterleaving)
+                        {
+                            //The last one, in order not to loop
+                            StreamOffset_Jump[CurrentPos]=File_Size;
+
+                            break;
+                        }
+                    }
+                }
+            }
         #endif //MEDIAINFO_DEMUX
     }
     if (mdat_Pos.empty())
@@ -2135,7 +2291,7 @@ bool File_Mpeg4::BookMark_Needed()
 
                 mdat_Pos_Temp=Temp;
                 GoTo(Temp->Offset);
-                IsParsing_mdat=true;
+                IsParsing_mdat_Set();
             }
         }
         mdat_Pos_ToParseInPriority_StreamIDs.erase(mdat_Pos_ToParseInPriority_StreamIDs.begin());
@@ -2150,16 +2306,37 @@ bool File_Mpeg4::BookMark_Needed()
         Element_ThisIsAList();
 
         mdat_Pos_Temp=&mdat_Pos[0];
+        int64u ToJump=mdat_Pos_Temp->Offset;
+        #if MEDIAINFO_DEMUX
+            if (Config->ParseSpeed==1)
+            {
+                std::map<int64u, int64u>::iterator StreamOffset_Jump_Temp=StreamOffset_Jump.find(ToJump);
+                if (StreamOffset_Jump_Temp!=StreamOffset_Jump.end())
+                {
+                    ToJump=StreamOffset_Jump_Temp->second;
+                    while (mdat_Pos_Temp<mdat_Pos_Max && mdat_Pos_Temp->Offset!=ToJump)
+                        mdat_Pos_Temp++;
+
+                    #if MEDIAINFO_HASH
+                        if (Config->File_Hash_Get().to_ulong())
+                        {
+                            // Hash can not be computed with jumps.
+                            delete Hash; Hash=NULL;
+                        }
+                    #endif //MEDIAINFO_HASH
+                }
+            }
+        #endif // MEDIAINFO_DEMUX
         #if MEDIAINFO_HASH
             if (Config->File_Hash_Get().to_ulong())
             {
                 GoTo(0);
-                Hash_ParseUpTo=mdat_Pos_Temp->Offset;
+                Hash_ParseUpTo=ToJump;
             }
             else
         #endif //MEDIAINFO_HASH
-                GoTo(mdat_Pos_Temp->Offset);
-        IsParsing_mdat=true;
+                GoTo(ToJump);
+        IsParsing_mdat_Set();
         mdat_Pos_NormalParsing=true;
     }
 
@@ -2315,9 +2492,9 @@ File_Mpeg4::method File_Mpeg4::Metadata_Get(std::string &Parameter, const std::s
     else if (Meta=="DATE") Parameter="Encoded_Date";
     else if (Meta=="iTunEXTC") Parameter="ContentRating";
     else if (Meta=="iTunMOVI") Parameter="iTunMOVI";
-    else if (Meta=="iTunNORM") Parameter="";
-    else if (Meta=="iTunes_CDDB_IDs") Parameter="";
-    else if (Meta=="iTunSMPB") Parameter="";
+    else if (Meta=="iTunNORM") Parameter.clear();
+    else if (Meta=="iTunes_CDDB_IDs") Parameter.clear();
+    else if (Meta=="iTunSMPB") Parameter.clear();
     else if (Meta=="PERFORMER") Parameter="Performer";
     else if (Meta=="PUBLISHER") Parameter="Publisher";
     else Parameter=Meta;
@@ -2410,6 +2587,121 @@ void File_Mpeg4::TimeCode_Associate(int32u TrackID)
         }
  }
 
+//---------------------------------------------------------------------------
+void File_Mpeg4::IsParsing_mdat_Set()
+{
+    IsParsing_mdat=true;
+
+#if MEDIAINFO_ADVANCED
+    //Checking if we need a fake time code track
+    string TimeCode_String = Config->File_DefaultTimeCode_Get();
+    if (TimeCode_String.size()==11
+     &&  TimeCode_String[ 0] >= '0' && TimeCode_String[ 0] <= '9'
+     &&  TimeCode_String[ 1] >= '0' && TimeCode_String[ 1] <= '9'
+     &&  TimeCode_String[ 2] == ':'
+     &&  TimeCode_String[ 3] >= '0' && TimeCode_String[ 3] <= '9'
+     &&  TimeCode_String[ 4] >= '0' && TimeCode_String[ 4] <= '9'
+     &&  TimeCode_String[ 5] >= ':'
+     &&  TimeCode_String[ 6] >= '0' && TimeCode_String[ 6] <= '9'
+     &&  TimeCode_String[ 7] >= '0' && TimeCode_String[ 7] <= '9'
+     && (TimeCode_String[ 8] >= ':' || TimeCode_String[ 8] == ';')
+     &&  TimeCode_String[ 9] >= '0' && TimeCode_String[ 9] <= '9'
+     &&  TimeCode_String[10] >= '0' && TimeCode_String[10] <= '9' )
+    {
+        bool TimeCode_IsPresent = false;
+        int32u TimeCode_ID = 0;
+        for (std::map<int32u, stream>::iterator StreamTemp = Streams.begin(); StreamTemp != Streams.end(); ++StreamTemp)
+        {
+            if (StreamTemp->second.TimeCode)
+                TimeCode_IsPresent = true;
+            else if (StreamTemp->first >= TimeCode_ID)
+                TimeCode_ID = StreamTemp->first + 1;
+        }
+
+        if (!TimeCode_IsPresent && TimeCode_ID)
+        {
+            stream::timecode *tc = new stream::timecode();
+            tc->DropFrame = false;
+            tc->H24 = false;
+            tc->NegativeTimes = false;
+            for (std::map<int32u, stream>::iterator StreamTemp = Streams.begin(); StreamTemp != Streams.end(); ++StreamTemp)
+                if (StreamTemp->second.StreamKind = Stream_Video)
+                {
+                    tc->TimeScale = StreamTemp->second.mdhd_TimeScale;
+                    tc->FrameDuration = StreamTemp->second.stts_Min;
+                    tc->NumberOfFrames = (int8u)float64_int64s(((float64)StreamTemp->second.mdhd_TimeScale) / StreamTemp->second.stts_Min);
+                    break;
+                }
+
+            Stream_Prepare(Stream_Other);
+            Fill(Stream_Other, StreamPos_Last, Other_Type, "Time code");
+            Fill(Stream_Other, StreamPos_Last, Other_Format, "QuickTime TC");
+            Fill(Stream_Other, StreamPos_Last, Other_Title, "Fake");
+            Streams[TimeCode_ID].StreamKind = Stream_Other;
+            Streams[TimeCode_ID].StreamPos = StreamPos_Last;
+
+            //Filling
+            Streams[TimeCode_ID].TimeCode = tc;
+
+            //Preparing TimeCode parser
+            File_Mpeg4_TimeCode* Parser = new File_Mpeg4_TimeCode;
+            Open_Buffer_Init(Parser);
+
+            ((File_Mpeg4_TimeCode*)Parser)->NumberOfFrames = tc->NumberOfFrames;
+            ((File_Mpeg4_TimeCode*)Parser)->DropFrame = tc->DropFrame;
+            ((File_Mpeg4_TimeCode*)Parser)->NegativeTimes = tc->NegativeTimes;
+
+            int32u TimeCode_Value = TimeCode((TimeCode_String[ 0]-'0') * 10 + (TimeCode_String[ 1]-'0'),
+                                             (TimeCode_String[ 3]-'0') * 10 + (TimeCode_String[ 4]-'0'),
+                                             (TimeCode_String[ 6]-'0') * 10 + (TimeCode_String[ 7]-'0'),
+                                             (TimeCode_String[ 9]-'0') * 10 + (TimeCode_String[10]-'0'),
+                                             tc->NumberOfFrames,
+                                              TimeCode_String[ 8]==';').ToFrames();
+
+            
+            int8u Buffer[4];
+            int32u2BigEndian(Buffer, TimeCode_Value);
+            Open_Buffer_Continue(Parser, Buffer, 4);
+            Open_Buffer_Finalize(Parser);
+            Merge(*Parser, Stream_Other, StreamPos_Last, 0);
+
+            Streams[TimeCode_ID].Parsers.push_back(Parser);
+            for (std::map<int32u, stream>::iterator Strea=Streams.begin(); Strea!=Streams.end(); ++Strea)
+                Strea->second.TimeCode_TrackID=TimeCode_ID; //For all tracks actually
+
+            #if MEDIAINFO_DEMUX
+            TimeCodeTrack_Check(Streams[TimeCode_ID], 0, TimeCode_ID);
+            #endif //MEDIAINFO_DEMUX
+        }
+    }
+#endif //MEDIAINFO_ADVANCED
+}
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_DEMUX
+void File_Mpeg4::TimeCodeTrack_Check(stream &Stream_Temp, size_t Pos, int32u StreamID)
+{
+    if (Stream_Temp.TimeCode) //If this is a TimeCode track
+    {
+        if (((File_Mpeg4_TimeCode*)Stream_Temp.Parsers[Pos])->Pos!=(int32u)-1)
+        {
+            for (std::map<int32u, stream>::iterator StreamTemp=Streams.begin(); StreamTemp!=Streams.end(); ++StreamTemp)
+                if (StreamTemp->second.TimeCode_TrackID==StreamID)
+                {
+                    TimeCode_FrameOffset=((File_Mpeg4_TimeCode*)Stream_Temp.Parsers[Pos])->Pos;
+                    float64 FrameRate_WithDF=Stream_Temp.TimeCode->NumberOfFrames;
+                    if (Stream_Temp.TimeCode->DropFrame)
+                    {
+                        float64 FramesPerHour_NDF=FrameRate_WithDF*60*60;
+                        FrameRate_WithDF*=(FramesPerHour_NDF-108)/FramesPerHour_NDF;
+                    }
+                    TimeCode_DtsOffset=float64_int64s(((float64)TimeCode_FrameOffset)*1000000000/FrameRate_WithDF);
+                }
+        }
+    }
+}
+#endif //MEDIAINFO_DEMUX
+
 //***************************************************************************
 // C++
 //***************************************************************************
diff --git a/Source/MediaInfo/Multiple/File_Mpeg4.h b/Source/MediaInfo/Multiple/File_Mpeg4.h
index 865dca4..9a9d696 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg4.h
+++ b/Source/MediaInfo/Multiple/File_Mpeg4.h
@@ -155,9 +155,11 @@ private :
     void moov_trak_mdia_minf_stbl_stsd_xxxxText();
     void moov_trak_mdia_minf_stbl_stsd_xxxxVideo();
     void moov_trak_mdia_minf_stbl_stsd_xxxx_alac();
+    void moov_trak_mdia_minf_stbl_stsd_xxxx_AALP();
     void moov_trak_mdia_minf_stbl_stsd_xxxx_ACLR();
     void moov_trak_mdia_minf_stbl_stsd_xxxx_APRG();
     void moov_trak_mdia_minf_stbl_stsd_xxxx_ARES();
+    void moov_trak_mdia_minf_stbl_stsd_xxxx_AORD();
     void moov_trak_mdia_minf_stbl_stsd_xxxx_avcC();
     void moov_trak_mdia_minf_stbl_stsd_xxxx_bitr();
     void moov_trak_mdia_minf_stbl_stsd_xxxx_btrt();
@@ -352,6 +354,7 @@ private :
         {
             int32u TimeScale;
             int32u FrameDuration;
+            int8u  NumberOfFrames;
             bool   DropFrame;
             bool   H24;
             bool   NegativeTimes;
@@ -445,6 +448,7 @@ private :
         #if MEDIAINFO_DEMUX
             bool            PtsDtsAreSame;
             bool            Demux_EventWasSent;
+            int32u          CodecID;
         #endif //MEDIAINFO_DEMUX
 
         stream()
@@ -479,6 +483,7 @@ private :
             IsPriorityStream=false;
             IsFilled=false;
             IsChapter=false;
+            IsEnabled=false;
             IsExcluded=false;
             HasForcedSamples=false;
             AllForcedSamples=false;
@@ -494,6 +499,7 @@ private :
             #if MEDIAINFO_DEMUX
                 PtsDtsAreSame=false;
                 Demux_EventWasSent=false;
+                CodecID=0x00000000;
             #endif //MEDIAINFO_DEMUX
         }
 
@@ -529,6 +535,10 @@ private :
     };
     typedef std::vector<mdat_Pos_Type> mdat_pos;
     static bool mdat_pos_sort (const File_Mpeg4::mdat_Pos_Type &i,const File_Mpeg4::mdat_Pos_Type &j) { return (i.Offset<j.Offset); }
+    void IsParsing_mdat_Set();
+    #if MEDIAINFO_DEMUX
+    void TimeCodeTrack_Check(stream &Stream_Temp, size_t Pos, int32u StreamID);
+    #endif //MEDIAINFO_DEMUX
     mdat_pos mdat_Pos;
     mdat_Pos_Type* mdat_Pos_Temp;
     mdat_Pos_Type* mdat_Pos_Max;
diff --git a/Source/MediaInfo/Multiple/File_Mpeg4_Descriptors.cpp b/Source/MediaInfo/Multiple/File_Mpeg4_Descriptors.cpp
index 2c78209..da6ff66 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg4_Descriptors.cpp
+++ b/Source/MediaInfo/Multiple/File_Mpeg4_Descriptors.cpp
@@ -85,7 +85,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_Descriptors_Predefined(int8u ID)
+static const char* Mpeg4_Descriptors_Predefined(int8u ID)
 {
     switch (ID)
     {
@@ -97,7 +97,7 @@ const char* Mpeg4_Descriptors_Predefined(int8u ID)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_Descriptors_ObjectTypeIndication(int8u ID)
+static const char* Mpeg4_Descriptors_ObjectTypeIndication(int8u ID)
 {
     switch (ID)
     {
@@ -150,7 +150,7 @@ const char* Mpeg4_Descriptors_ObjectTypeIndication(int8u ID)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_Descriptors_StreamType(int8u ID)
+static const char* Mpeg4_Descriptors_StreamType(int8u ID)
 {
     switch (ID)
     {
@@ -172,13 +172,13 @@ const char* Mpeg4_Descriptors_StreamType(int8u ID)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_Descriptors_ODProfileLevelIndication(int8u /*ID*/)
+static const char* Mpeg4_Descriptors_ODProfileLevelIndication(int8u /*ID*/)
 {
     return "";
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_Descriptors_SceneProfileLevelIndication(int8u ID)
+static const char* Mpeg4_Descriptors_SceneProfileLevelIndication(int8u ID)
 {
     switch (ID)
     {
@@ -198,7 +198,7 @@ const char* Mpeg4_Descriptors_SceneProfileLevelIndication(int8u ID)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_Descriptors_AudioProfileLevelIndication(int8u ID)
+static const char* Mpeg4_Descriptors_AudioProfileLevelIndication(int8u ID)
 {
     switch (ID)
     {
@@ -259,7 +259,7 @@ const char* Mpeg4_Descriptors_AudioProfileLevelIndication(int8u ID)
 extern const char* Mpeg4v_Profile_Level(int32u Profile_Level);
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_Descriptors_GraphicsProfileLevelIndication(int8u ID)
+static const char* Mpeg4_Descriptors_GraphicsProfileLevelIndication(int8u ID)
 {
     switch (ID)
     {
diff --git a/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp b/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp
index fd6e0b5..54178ad 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp
+++ b/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp
@@ -119,7 +119,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_Meta_Kind(int32u Kind)
+static const char* Mpeg4_Meta_Kind(int32u Kind)
 {
     switch (Kind)
     {
@@ -136,7 +136,7 @@ const char* Mpeg4_Meta_Kind(int32u Kind)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_TypeModifierName(int32u TypeModifierName)
+static const char* Mpeg4_TypeModifierName(int32u TypeModifierName)
 {
     switch (TypeModifierName)
     {
@@ -153,7 +153,7 @@ const char* Mpeg4_TypeModifierName(int32u TypeModifierName)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_sample_depends_on[]=
+static const char* Mpeg4_sample_depends_on[]=
 {
     "",
     "this sample does depend on others (not an I picture)",
@@ -162,7 +162,7 @@ const char* Mpeg4_sample_depends_on[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_sample_is_depended_on[]=
+static const char* Mpeg4_sample_is_depended_on[]=
 {
     "",
     "other samples depend on this one (not disposable)",
@@ -171,7 +171,7 @@ const char* Mpeg4_sample_is_depended_on[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_sample_has_redundancy[]=
+static const char* Mpeg4_sample_has_redundancy[]=
 {
     "",
     "there is redundant coding in this sample",
@@ -180,7 +180,7 @@ const char* Mpeg4_sample_has_redundancy[]=
 };
 
 //---------------------------------------------------------------------------
-Ztring Mpeg4_Vendor(int32u Vendor)
+static Ztring Mpeg4_Vendor(int32u Vendor)
 {
     switch (Vendor)
     {
@@ -334,7 +334,7 @@ const char* Mpeg4_chan_Layout(int16u Ordering)
 }
 
 //---------------------------------------------------------------------------
-std::string Mpeg4_chan_ChannelDescription (int64u ChannelLabels)
+static std::string Mpeg4_chan_ChannelDescription (int64u ChannelLabels)
 {
     std::string Text;
     if ((ChannelLabels&0x000E)!=0x0000)
@@ -394,7 +394,7 @@ std::string Mpeg4_chan_ChannelDescription (int64u ChannelLabels)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_chan_ChannelDescription_Layout (int32u ChannelLabel)
+static const char* Mpeg4_chan_ChannelDescription_Layout (int32u ChannelLabel)
 {
     switch(ChannelLabel)
     {
@@ -452,7 +452,7 @@ const char* Mpeg4_chan_ChannelDescription_Layout (int32u ChannelLabel)
 }
 
 //---------------------------------------------------------------------------
-std::string Mpeg4_chan_ChannelBitmap (int32u ChannelBitmap)
+static std::string Mpeg4_chan_ChannelBitmap (int32u ChannelBitmap)
 {
     std::string Text;
     if ((ChannelBitmap&0x0007)!=0x0000)
@@ -487,7 +487,7 @@ std::string Mpeg4_chan_ChannelBitmap (int32u ChannelBitmap)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_chan_ChannelBitmap_Layout (int32u ChannelBitmap)
+static const char* Mpeg4_chan_ChannelBitmap_Layout (int32u ChannelBitmap)
 {
     switch(ChannelBitmap)
     {
@@ -514,7 +514,7 @@ const char* Mpeg4_chan_ChannelBitmap_Layout (int32u ChannelBitmap)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_jp2h_METH(int8u METH)
+static const char* Mpeg4_jp2h_METH(int8u METH)
 {
     switch (METH)
     {
@@ -525,7 +525,7 @@ const char* Mpeg4_jp2h_METH(int8u METH)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_jp2h_EnumCS(int32u EnumCS)
+static const char* Mpeg4_jp2h_EnumCS(int32u EnumCS)
 {
     switch (EnumCS)
     {
@@ -688,9 +688,11 @@ namespace Elements
     const int64u moov_trak_mdia_minf_stbl_stsd_tx3g=0x74783367;
     const int64u moov_trak_mdia_minf_stbl_stsd_tx3g_ftab=0x66746162;
     const int64u moov_trak_mdia_minf_stbl_stsd_xxxx_alac=0x616C6163;
+    const int64u moov_trak_mdia_minf_stbl_stsd_xxxx_AALP=0x41414C50;
     const int64u moov_trak_mdia_minf_stbl_stsd_xxxx_ACLR=0x41434C52;
     const int64u moov_trak_mdia_minf_stbl_stsd_xxxx_APRG=0x41505247;
     const int64u moov_trak_mdia_minf_stbl_stsd_xxxx_ARES=0x41524553;
+    const int64u moov_trak_mdia_minf_stbl_stsd_xxxx_AORD=0x414F5244;
     const int64u moov_trak_mdia_minf_stbl_stsd_xxxx_avcC=0x61766343;
     const int64u moov_trak_mdia_minf_stbl_stsd_xxxx_bitr=0x62697472;
     const int64u moov_trak_mdia_minf_stbl_stsd_xxxx_btrt=0x62747274;
@@ -838,7 +840,7 @@ namespace Elements
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg4_Description(int32u Description)
+static const char* Mpeg4_Description(int32u Description)
 {
     switch (Description)
     {
@@ -1022,9 +1024,11 @@ void File_Mpeg4::Data_Parse()
                             LIST_DEFAULT(moov_trak_mdia_minf_stbl_stsd_xxxx)
                                 ATOM_BEGIN
                                 ATOM(moov_trak_mdia_minf_stbl_stsd_xxxx_alac)
+                                ATOM(moov_trak_mdia_minf_stbl_stsd_xxxx_AALP)
                                 ATOM(moov_trak_mdia_minf_stbl_stsd_xxxx_ACLR)
                                 ATOM(moov_trak_mdia_minf_stbl_stsd_xxxx_APRG)
                                 ATOM(moov_trak_mdia_minf_stbl_stsd_xxxx_ARES)
+                                ATOM(moov_trak_mdia_minf_stbl_stsd_xxxx_AORD)
                                 ATOM(moov_trak_mdia_minf_stbl_stsd_xxxx_avcC)
                                 ATOM(moov_trak_mdia_minf_stbl_stsd_xxxx_bitr)
                                 ATOM(moov_trak_mdia_minf_stbl_stsd_xxxx_btrt)
@@ -1346,17 +1350,10 @@ void File_Mpeg4::free()
     Element_Name("Free space");
 
     //Parsing
-    #if MEDIAINFO_TRACE
-        if (Trace_Activated)
-            Param("Data", Ztring("(")+Ztring::ToZtring(Element_TotalSize_Get())+Ztring(" bytes)"));
-    #endif //MEDIAINFO_TRACE
+    Skip_XX(Element_TotalSize_Get(),                            "Data");
     #if MEDIAINFO_HASH
-        if (!Hash || (!IsSecondPass && FirstMdatPos<FirstMoovPos))
-    #endif //MEDIAINFO_HASH
-            GoTo(File_Offset+Buffer_Offset+Element_TotalSize_Get()); //Not using Skip_XX() because we want to skip data we don't have, and Skip_XX() does a test on size of buffer
-    #if MEDIAINFO_HASH
-        else
-            Element_Offset=Element_TotalSize_Get();
+        if (Hash && !IsSecondPass)
+            GoTo(File_Offset+Buffer_Offset+Element_TotalSize_Get()); //Hash will be done during second pass
     #endif //MEDIAINFO_HASH
 
     //ISM
@@ -1602,7 +1599,7 @@ void File_Mpeg4::mdat()
     {
         //Next piece of data
         mdat_Pos_Temp=&mdat_Pos[0];
-        IsParsing_mdat=true;
+        IsParsing_mdat_Set();
         mdat_StreamJump();
 
         return; //Only if have something in this mdat
@@ -1623,17 +1620,10 @@ void File_Mpeg4::mdat()
         LastMdatPos=File_Offset+Buffer_Offset+Element_TotalSize_Get();
 
     //Parsing
-    #if MEDIAINFO_TRACE
-        if (Trace_Activated)
-            Param("Data", Ztring("(")+Ztring::ToZtring(Element_TotalSize_Get())+Ztring(" bytes)"));
-    #endif //MEDIAINFO_TRACE
+    Skip_XX(Element_TotalSize_Get(),                            "Data");
     #if MEDIAINFO_HASH
-        if (!Hash || (!IsSecondPass && FirstMdatPos<FirstMoovPos))
-    #endif //MEDIAINFO_HASH
-            GoTo(File_Offset+Buffer_Offset+Element_TotalSize_Get()); //Not using Skip_XX() because we want to skip data we don't have, and Skip_XX() does a test on size of buffer
-    #if MEDIAINFO_HASH
-        else
-            Element_Offset=Element_TotalSize_Get();
+        if (Hash && !IsSecondPass)
+            GoTo(File_Offset+Buffer_Offset+Element_TotalSize_Get()); //Hash will be done during second pass
     #endif //MEDIAINFO_HASH
 
     //ISM
@@ -1726,8 +1716,66 @@ void File_Mpeg4::mdat_xxxx()
                 Stream_Temp.stts_FramePos++;
             }
 
-            Demux_Level=Stream_Temp.Demux_Level;
-            Demux(Buffer+Buffer_Offset+Stream_Temp.Demux_Offset, (size_t)(Element_Size-Stream_Temp.Demux_Offset), ContentType_MainStream);
+            bool ShouldDemux=true;
+            if (Stream_Temp.Demux_Level&(1<<7) && Element_Size-Stream_Temp.Demux_Offset)
+            {
+                if (Stream_Temp.Parsers[0]->Status[IsAccepted])
+                    ShouldDemux=false;
+                else
+                {
+                    //Checking if we need to add SPS/PPS
+                    size_t CheckMax=Stream_Temp.Demux_Offset+0x10; //SPS uses to be in the first bytes only
+                    if (CheckMax>Element_Size-4)
+                        CheckMax=Element_Size-4;
+                    ShouldDemux=false;
+                    for (size_t i=Stream_Temp.Demux_Offset; i<CheckMax; i++)
+                        if (Buffer[i]==0x00 && Buffer[i+1]==0x00 && Buffer[i+2]==0x01 && Buffer[i+3]==0x67)
+                        {
+                            Stream_Temp.Demux_Level&=~((1<<7)|(1<<6)); //Remove the flag, SPS/PPS detected
+                            ShouldDemux=true;
+                            break;
+                        }
+                }
+
+                if (!ShouldDemux)
+                {
+                    if (Stream_Temp.CodecID==0x4156696E) //AVin
+                    {
+                        int32u Height=Retrieve(Stream_Video, Stream_Temp.StreamPos, Video_Height).To_int32u();
+                        int32u Fields;
+                        if (Retrieve(Stream_Video, Stream_Temp.StreamPos, Video_ScanType)==__T("Progressive"))
+                            Fields=1;
+                        else if (Retrieve(Stream_Video, Stream_Temp.StreamPos, Video_ScanType)==__T("Interlaced"))
+                            Fields=2;
+                        else
+                            Fields=0;
+                        int32u SampleDuration;
+                        if (Stream_Temp.stts.size()==1)
+                            SampleDuration=Stream_Temp.stts[0].SampleDuration;
+                        else
+                            SampleDuration=0;
+                        Stream_Temp.CodecID=File_Avc::AVC_Intra_CodecID_FromMeta(Height, Fields, SampleDuration, Stream_Temp.mdhd_TimeScale, Stream_Temp.stsz_Sample_Size);
+                    }
+
+                    //Stream_Temp.Demux_Level|= (1<<6); //In case of seek, we need to send again SPS/PPS //Deactivated because Hydra does not decode after a seek + 1 SPS/PPS only.
+                    //Stream_Temp.Demux_Level&=~(1<<7); //Remove the flag, SPS/PPS sent
+                    Demux_Level=Stream_Temp.Demux_Level;
+                    File_Avc::avcintra_header AvcIntraHeader=File_Avc::AVC_Intra_Headers_Data(Stream_Temp.CodecID);
+                    size_t Buffer_Temp_Size=AvcIntraHeader.Size+(size_t)(Element_Size-Stream_Temp.Demux_Offset);
+                    int8u* Buffer_Temp_Data=new int8u[Buffer_Temp_Size];
+                    if (AvcIntraHeader.Data)
+                        memcpy(Buffer_Temp_Data, AvcIntraHeader.Data, AvcIntraHeader.Size);
+                    memcpy(Buffer_Temp_Data+AvcIntraHeader.Size, Buffer+Buffer_Offset+Stream_Temp.Demux_Offset, (size_t)(Element_Size-Stream_Temp.Demux_Offset));
+                    Demux(Buffer_Temp_Data, Buffer_Temp_Size, ContentType_MainStream);
+                    Open_Buffer_Continue(Stream_Temp.Parsers[0], AvcIntraHeader.Data, AvcIntraHeader.Size);
+                    ShouldDemux = false;
+                }
+            }
+            if (ShouldDemux)
+            {
+                Demux_Level=Stream_Temp.Demux_Level;
+                Demux(Buffer+Buffer_Offset+Stream_Temp.Demux_Offset, (size_t)(Element_Size-Stream_Temp.Demux_Offset), ContentType_MainStream);
+            }
         }
     #endif //MEDIAINFO_DEMUX
 
@@ -1832,30 +1880,32 @@ void File_Mpeg4::mdat_xxxx()
 //---------------------------------------------------------------------------
 void File_Mpeg4::mdat_StreamJump()
 {
-    //Finding right file offset
-    int64u ToJump=File_Size;
-    if (!mdat_Pos.empty() && mdat_Pos_Temp!=mdat_Pos_Max)
-    {
-        ToJump=mdat_Pos_Temp->Offset;
-        #if MEDIAINFO_DEMUX
-            if (Config->ParseSpeed==1)
+    #if MEDIAINFO_DEMUX
+        if (Config->ParseSpeed==1 && !mdat_Pos.empty())
+        {
+            int64u ToJump=File_Offset+Buffer_Offset+Element_Size;
+            if (mdat_Pos_Temp!=mdat_Pos_Max)
+                ToJump=mdat_Pos_Temp->Offset;
+            std::map<int64u, int64u>::iterator StreamOffset_Jump_Temp=StreamOffset_Jump.find(ToJump);
+            if (StreamOffset_Jump_Temp!=StreamOffset_Jump.end())
             {
-                std::map<int64u, int64u>::iterator StreamOffset_Jump_Temp=StreamOffset_Jump.find(ToJump);
-                if (StreamOffset_Jump_Temp!=StreamOffset_Jump.end())
+                ToJump=StreamOffset_Jump_Temp->second;
+                if (!mdat_Pos.empty())
                 {
-                    ToJump=StreamOffset_Jump_Temp->second;
-                    if (!mdat_Pos.empty())
-                    {
-                        mdat_Pos_Temp=&mdat_Pos[0];
-                        while (mdat_Pos_Temp<mdat_Pos_Max && mdat_Pos_Temp->Offset!=ToJump)
-                            mdat_Pos_Temp++;
-                    }
-                    else
-                        mdat_Pos_Temp=NULL;
+                    mdat_Pos_Temp=&mdat_Pos[0];
+                    while (mdat_Pos_Temp<mdat_Pos_Max && mdat_Pos_Temp->Offset!=ToJump)
+                        mdat_Pos_Temp++;
                 }
+                else
+                    mdat_Pos_Temp=NULL;
             }
-        #endif // MEDIAINFO_DEMUX
-    }
+        }
+    #endif // MEDIAINFO_DEMUX
+
+    //Finding right file offset
+    int64u ToJump=File_Size;
+    if (!mdat_Pos.empty() && mdat_Pos_Temp!=mdat_Pos_Max)
+        ToJump=mdat_Pos_Temp->Offset;
     if (ToJump>File_Size)
         ToJump=File_Size;
     if (ToJump!=File_Offset+Buffer_Offset+Element_Size)
@@ -1863,7 +1913,7 @@ void File_Mpeg4::mdat_StreamJump()
         if (!Status[IsAccepted])
             Data_Accept("MPEG-4");
         #if MEDIAINFO_HASH
-            if (Config->File_Hash_Get().to_ulong() && ((IsSecondPass && mdat_Pos_NormalParsing) || FirstMoovPos<FirstMdatPos))
+            if (Config->File_Hash_Get().to_ulong() && (IsSecondPass && mdat_Pos_NormalParsing))
                 Hash_ParseUpTo=ToJump;
             else
         #endif //MEDIAINFO_HASH
@@ -1943,17 +1993,10 @@ void File_Mpeg4::moof()
 
     if (IsSecondPass)
     {
-        #if MEDIAINFO_TRACE
-            if (Trace_Activated)
-                Param("Data", Ztring("(")+Ztring::ToZtring(Element_TotalSize_Get())+Ztring(" bytes)"));
-        #endif //MEDIAINFO_TRACE
-        #if MEDIAINFO_HASH
-            if (!Hash || (!IsSecondPass && FirstMdatPos<FirstMoovPos))
-        #endif //MEDIAINFO_HASH
-                GoTo(File_Offset+Buffer_Offset+Element_TotalSize_Get()); //Not using Skip_XX() because we want to skip data we don't have, and Skip_XX() does a test on size of buffer
+        Skip_XX(Element_TotalSize_Get(),                        "Data");
         #if MEDIAINFO_HASH
-            else
-                Element_Offset=Element_TotalSize_Get();
+            if (Hash && !IsSecondPass)
+                GoTo(File_Offset+Buffer_Offset+Element_TotalSize_Get()); //Hash will be done during second pass
         #endif //MEDIAINFO_HASH
         return;
     }
@@ -2124,17 +2167,10 @@ void File_Mpeg4::moov()
 
     if (IsSecondPass || FirstMoovPos!=(int64u)-1) //Currently, the 1 moov atom is used
     {
-        #if MEDIAINFO_TRACE
-            if (Trace_Activated)
-                Param("Data", Ztring("(")+Ztring::ToZtring(Element_TotalSize_Get())+Ztring(" bytes)"));
-        #endif //MEDIAINFO_TRACE
+        Skip_XX(Element_TotalSize_Get(),                        "Data");
         #if MEDIAINFO_HASH
-            if (!Hash || (!IsSecondPass && FirstMdatPos<FirstMoovPos))
-        #endif //MEDIAINFO_HASH
-                GoTo(File_Offset+Buffer_Offset+Element_TotalSize_Get()); //Not using Skip_XX() because we want to skip data we don't have, and Skip_XX() does a test on size of buffer
-        #if MEDIAINFO_HASH
-            else
-                Element_Offset=Element_TotalSize_Get();
+            if (Hash && !IsSecondPass)
+                GoTo(File_Offset+Buffer_Offset+Element_TotalSize_Get()); //Hash will be done during second pass
         #endif //MEDIAINFO_HASH
         return;
     }
@@ -3503,6 +3539,16 @@ void File_Mpeg4::moov_trak_mdia_minf_hmhd()
     Skip_B4(                                                    "maxbitrate");
     Skip_B4(                                                    "avgbitrate");
     Skip_B4(                                                    "reserved");
+
+    FILLING_BEGIN();
+        if (StreamKind_Last==Stream_Max) //Note: some files have both vmhd and hmhd, I don't know the meaning of such header, so skipping hmhd for the moment
+        {
+            Stream_Prepare(Stream_Other);
+            Fill(Stream_Other, StreamPos_Last, Other_Type, "Hint");
+            Streams[moov_trak_tkhd_TrackID].StreamKind=Stream_Other;
+            Streams[moov_trak_tkhd_TrackID].StreamPos=StreamPos_Last;
+        }
+    FILLING_END();
 }
 
 //---------------------------------------------------------------------------
@@ -3999,6 +4045,7 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_tmcd_name()
 void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_tx3g()
 {
     Element_Name("Text");
+
     //Parsing
     bool tx3gallforced, tx3ghasforced;
     int32u Flags;
@@ -4056,6 +4103,7 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_tx3g()
         Streams[moov_trak_tkhd_TrackID].AllForcedSamples = tx3gallforced;
         Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Codec), "tx3g", Unlimited, true, true);
         Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Format), "Timed Text", Unlimited, true, true);
+
         #ifdef MEDIAINFO_TIMEDTEXT_YES
             File_TimedText* Parser=new File_TimedText;
             int64u Elemen_Code_Save=Element_Code;
@@ -4150,6 +4198,7 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx()
                                     default                                           : Skip_XX(Element_TotalSize_Get()-Element_Offset, "Unknown");
                                 }
         }
+
         if (Element_IsWaitingForMoreData())
             return;
 
@@ -4702,11 +4751,44 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxxVideo()
                     File_Avc* Parser=new File_Avc;
                     Parser->FrameIsAlwaysComplete=true;
                     #if MEDIAINFO_DEMUX
-                        if (Config->Demux_Avc_Transcode_Iso14496_15_to_Iso14496_10_Get())
+                        switch ((int32u)Element_Code)
                         {
-                            Streams[moov_trak_tkhd_TrackID].Demux_Level=4; //Intermediate
-                            Parser->Demux_Level=2; //Container
-                            Parser->Demux_UnpacketizeContainer=true;
+                            case  0x61693132: //ai12
+                            case  0x61693232: //ai22
+                            case  0x61693133: //ai13
+                            case  0x61693233: //ai23
+                            case  0x61693135: //ai15
+                            case  0x61693235: //ai25
+                            case  0x61693236: //ai26
+                            case  0x61693136: //ai16
+                            case  0x61693270: //ai2p
+                            case  0x61693170: //ai1p
+                            case  0x61693171: //ai1q
+                            case  0x61693271: //ai2q
+                            case  0x61693532: //ai52
+                            case  0x61693533: //ai53
+                            case  0x61693535: //ai55
+                            case  0x61693536: //ai56
+                            case  0x61693570: //ai5p
+                            case  0x61693571: //ai5q
+                            case  0x4156696E: //AVin
+                                                Streams[moov_trak_tkhd_TrackID].Demux_Level|=(1<<7); //Add the flag, SPS/PPS must be sent
+                                                Streams[moov_trak_tkhd_TrackID].CodecID=((int32u)Element_Code);
+                                                switch ((Element_Code>>8)&0xF)
+                                                {
+                                                    case 1 : Fill(Stream_Video, StreamPos_Last, Video_Format_Commercial_IfAny, "AVC-Intra 100"); break;
+                                                    case 2 : Fill(Stream_Video, StreamPos_Last, Video_Format_Commercial_IfAny, "AVC-Intra 200"); break;
+                                                    case 5 : Fill(Stream_Video, StreamPos_Last, Video_Format_Commercial_IfAny, "AVC-Intra 50"); break;
+                                                    default: Fill(Stream_Video, StreamPos_Last, Video_Format_Commercial_IfAny, "AVC-Intra"); break;
+                                                }
+                                                break;
+                            default       :
+                                                if (Config->Demux_Avc_Transcode_Iso14496_15_to_Iso14496_10_Get())
+                                                {
+                                                    Streams[moov_trak_tkhd_TrackID].Demux_Level=4; //Intermediate
+                                                    Parser->Demux_Level=2; //Container
+                                                    Parser->Demux_UnpacketizeContainer=true;
+                                                }
                         }
                     #endif //MEDIAINFO_DEMUX
                     Streams[moov_trak_tkhd_TrackID].Parsers.push_back(Parser);
@@ -4894,45 +4976,66 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx_alac()
 }
 
 //---------------------------------------------------------------------------
+void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx_AALP()
+{
+    Element_Name("Avid Alpha Coding Type");
+
+    //Parsing
+    int32u NumberOfTypes;
+    Skip_C4(                                                    "Tag");
+    Skip_C4(                                                    "Version");
+    Get_B4 (NumberOfTypes,                                      "Number of types");
+    for (int32u i=0; i<NumberOfTypes; i++)
+        Skip_C4(                                                "Encoding type");
+}
+
+//---------------------------------------------------------------------------
 void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx_ACLR()
 {
-    Element_Name("Avid ACLR");
+    Element_Name("Avid Color Sampling Type");
 
     //Parsing
-    Skip_C4(                                                    "tag");
-    Skip_C4(                                                    "vers");
-    Skip_B4(                                                    "yuv range"); //full 1 / normal 2
-    Skip_B4(                                                    "unknown (always 0?)");
+    Skip_C4(                                                    "Tag");
+    Skip_C4(                                                    "Version");
+    Skip_B4(                                                    "YUV range"); // 1 = In CCIR; 2 = In Full Range; 3 = In 709 (what is it?)
+    Skip_B4(                                                    "Reserved"); // Must be 0
 }
 
 //---------------------------------------------------------------------------
 void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx_APRG()
 {
-    Element_Name("Avid APRG");
+    Element_Name("Avid Progressive Type");
 
     //Parsing
-    Skip_C4(                                                    "tag");
-    Skip_C4(                                                    "vers");
-    Skip_B4(                                                    "unknown (always 1?)");
-    Skip_B4(                                                    "unknown (always 0?)");
+    int32u ScanType;
+    Skip_C4("Tag");
+    Skip_C4(                                                    "Version");
+    Get_B4 (ScanType,                                           "Number of fields"); Param_Info1(ScanType==1?"Progressive":ScanType==2?"Interlaced":"");
+    Skip_B4(                                                    "Reserved"); // Must be 0
 }
 
 //---------------------------------------------------------------------------
 void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx_ARES()
 {
-    Element_Name("Avid ARES");
+    Element_Name("Avid Resolution Coding Type");
 
     //Parsing
     //Source: http://lists.apple.com/archives/quicktime-api/2012/Mar/msg00039.html
     int32u x1;
-    Skip_C4(                                                    "tag");
-    Skip_C4(                                                    "vers");
-    Skip_B4(                                                    "cid"); //Compression ID, From inspection this is 160 for MPEG 50, 161 for MPEG 40 and 162 for MPEG 30. 171 for raw?
-    Skip_B4(                                                    "width");
-    Skip_B4(                                                    "height"); //Of a field
-    Get_B4 (x1,                                                 "x1");  //1=Progressive, 2=Interlaced
-    Skip_B4(                                                    "zero");
-    Skip_B4(                                                    "x2"); //4=Interlaced, 5=Progressive 1080, 6 Progressive not 1080?
+    Skip_C4(                                                    "Tag");
+    Skip_C4(                                                    "Version");
+    Skip_B4(                                                    "Compression ID"); //Compression ID, From inspection this is 160 for MPEG 50, 161 for MPEG 40 and 162 for MPEG 30. 171 for raw?
+    Skip_B4(                                                    "Field width");
+    Skip_B4(                                                    "Field height");
+    Get_B4 (x1,                                                 "Number of fields"); Param_Info1(x1==1?"Progressive":x1==2?"Interlaced":"");
+    Skip_B4(                                                    "Number of black lines");
+    Skip_B4(                                                    "Video format"); // 1 = NTSC, 2 = PAL, 3 = Custom, 4 = 1080i, 5 = 1080p, 6 = 720p
+    Skip_B4(                                                    "Compression table ID");
+    Skip_B4(                                                    "Render min scale factor (part 1)");
+    Skip_B4(                                                    "Render min scale factor (part 2)");
+    Skip_B4(                                                    "Render min scale factor (part 3)");
+    Skip_String(32,                                             "Name");
+    Skip_String(32,                                             "Format");
 
     switch (x1)
     {
@@ -4943,6 +5046,21 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx_ARES()
 }
 
 //---------------------------------------------------------------------------
+void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx_AORD()
+{
+    Element_Name("Avid Ordering Type");
+
+    //Parsing
+    Skip_C4(                                                    "Tag");
+    Skip_C4(                                                    "Version");
+    Skip_B4(                                                    "Field structure ordering"); // 1 = Split fields, 2 = Interlaced fields
+    Skip_B4(                                                    "Field time ordering"); // 1 = First field in buffer is odd (timecode 1), 2 = First field in buffer is even (timecode 2)
+    Skip_B4(                                                    "Field display ordering"); // 1 = First field in time display first line, 2 = First field in time display second line, 
+    Skip_B4(                                                    "Byte ordering"); // 1 = YCbCr, 2 = CbYCrY
+    Skip_B4(                                                    "Reserved"); // Must be 0
+}
+
+//---------------------------------------------------------------------------
 void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx_avcC()
 {
     Element_Name("AVC decode");
diff --git a/Source/MediaInfo/Multiple/File_MpegPs.cpp b/Source/MediaInfo/Multiple/File_MpegPs.cpp
index d2c1e31..7d3abbc 100644
--- a/Source/MediaInfo/Multiple/File_MpegPs.cpp
+++ b/Source/MediaInfo/Multiple/File_MpegPs.cpp
@@ -105,14 +105,14 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* MpegPs_System_Fixed[]=
+static const char* MpegPs_System_Fixed[]=
 {
     "CBR",
     "VBR",
 };
 
 //---------------------------------------------------------------------------
-const char* MpegPs_stream_id(int8u Element_Name)
+static const char* MpegPs_stream_id(int8u Element_Name)
 {
          if (Element_Name>=0xC0
           && Element_Name<=0xDF) return "MPEG Audio";
@@ -127,7 +127,7 @@ const char* MpegPs_stream_id(int8u Element_Name)
 }
 
 //---------------------------------------------------------------------------
-const char* MpegPs_Codec(int8u Element_Name)
+static const char* MpegPs_Codec(int8u Element_Name)
 {
          if (Element_Name>=0xC0
           && Element_Name<=0xDF) return "MPEG-A";
@@ -137,7 +137,7 @@ const char* MpegPs_Codec(int8u Element_Name)
 }
 
 //---------------------------------------------------------------------------
-int32u MpegPs_Default_stream_type(int8u Element_Name, int8u Mpeg_Version)
+static int32u MpegPs_Default_stream_type(int8u Element_Name, int8u Mpeg_Version)
 {
          if (Element_Name>=0xC0
           && Element_Name<=0xDF) return Mpeg_Version==0x02?0x04:0x03;
@@ -147,7 +147,7 @@ int32u MpegPs_Default_stream_type(int8u Element_Name, int8u Mpeg_Version)
 }
 
 //---------------------------------------------------------------------------
-const char* MpegPs_trick_mode_control_values[8]=
+static const char* MpegPs_trick_mode_control_values[8]=
 {
     "Fast forward",
     "Slow motion",
@@ -160,7 +160,7 @@ const char* MpegPs_trick_mode_control_values[8]=
 };
 
 //---------------------------------------------------------------------------
-const char* MpegPs_stream_id_extension(int8u stream_id_extension)
+static const char* MpegPs_stream_id_extension(int8u stream_id_extension)
 {
     switch (stream_id_extension)
     {
@@ -1587,6 +1587,16 @@ void File_MpegPs::Header_Parse_PES_packet_MPEG1(int8u stream_id)
                 FrameInfo.PTS=(((int64u)PTS_32)<<30)
                             | (((int64u)PTS_29)<<15)
                             | (((int64u)PTS_14));
+
+        //Incoherencies test
+        if (!Config->File_MpegPs_PTS_Begin_IsNearZero && Frame_Count<16)
+        {
+            if (FrameInfo.PTS<90000 || FrameInfo.PTS>0x200000000LL-90000) // 1 second before and after 
+                Config->File_MpegPs_PTS_Begin_IsNearZero=true;
+        }
+        if (Config->File_MpegPs_PTS_Begin_IsNearZero && FrameInfo.PTS>0x200000000LL-90000)
+            FrameInfo.PTS=0; //TODO: find a better method for synchronizing streams, Hack in case DTS is negative (currently not supported by MI). TODO: negative DTS.
+
         if (Streams[stream_id].Searching_TimeStamp_End && stream_id!=0xBD && stream_id!=0xFD) //0xBD and 0xFD can contain multiple streams, TimeStamp management is in Streams management
         {
             if (Streams[stream_id].TimeStamp_End.PTS.TimeStamp==(int64u)-1)
@@ -1638,6 +1648,16 @@ void File_MpegPs::Header_Parse_PES_packet_MPEG1(int8u stream_id)
                 FrameInfo.PTS=(((int64u)PTS_32)<<30)
                             | (((int64u)PTS_29)<<15)
                             | (((int64u)PTS_14));
+
+        //Incoherencies test
+        if (!Config->File_MpegPs_PTS_Begin_IsNearZero && Frame_Count<16)
+        {
+            if (FrameInfo.PTS<90000 || FrameInfo.PTS>0x200000000LL-90000) // 1 second before and after 
+                Config->File_MpegPs_PTS_Begin_IsNearZero=true;
+        }
+        if (Config->File_MpegPs_PTS_Begin_IsNearZero && FrameInfo.PTS>0x200000000LL-90000)
+            FrameInfo.PTS=0; //TODO: find a better method for synchronizing streams, Hack in case DTS is negative (currently not supported by MI). TODO: negative DTS.
+
         if (Streams[stream_id].Searching_TimeStamp_End)
         {
             if (Streams[stream_id].TimeStamp_End.PTS.TimeStamp==(int64u)-1)
@@ -1680,8 +1700,16 @@ void File_MpegPs::Header_Parse_PES_packet_MPEG1(int8u stream_id)
         FrameInfo.DTS=(((int64u)DTS_32)<<30)
                     | (((int64u)DTS_29)<<15)
                     | (((int64u)DTS_14));
-        if (Frame_Count<16 &&FrameInfo.DTS>=0x100000000LL) //Hack in case DTS is negative (currently not supported by MI). TODO: negative DTS.
-            FrameInfo.DTS=0;
+
+        //Incoherencies test
+        if (!Config->File_MpegPs_PTS_Begin_IsNearZero && Frame_Count<16)
+        {
+            if (FrameInfo.DTS<90000 || FrameInfo.DTS>0x200000000LL-90000) // 1 second before and after 
+                Config->File_MpegPs_PTS_Begin_IsNearZero=true;
+        }
+        if (Config->File_MpegPs_PTS_Begin_IsNearZero && FrameInfo.DTS>0x200000000LL-90000)
+            FrameInfo.DTS=0; //TODO: find a better method for synchronizing streams, Hack in case DTS is negative (currently not supported by MI). TODO: negative DTS.
+
         if (Streams[stream_id].Searching_TimeStamp_End)
         {
             if (Streams[stream_id].TimeStamp_End.DTS.TimeStamp==(int64u)-1)
@@ -1767,15 +1795,15 @@ void File_MpegPs::Header_Parse_PES_packet_MPEG2(int8u stream_id)
             return;
         }
         Buffer_Pos_Flags++;
-        PTS_DTS_flags               = Buffer[Buffer_Pos_Flags] >> 6;
-        ESCR_flag                   = (Buffer[Buffer_Pos_Flags] & 0x20) ? true: false;
-        ES_rate_flag                = (Buffer[Buffer_Pos_Flags] & 0x10) ? true: false;
-        DSM_trick_mode_flag         = (Buffer[Buffer_Pos_Flags] & 0x08) ? true: false;
-        additional_copy_info_flag   = (Buffer[Buffer_Pos_Flags] & 0x04) ? true: false;
-        PES_CRC_flag                = (Buffer[Buffer_Pos_Flags] & 0x02) ? true: false;
-        PES_extension_flag          = (Buffer[Buffer_Pos_Flags] & 0x01) ? true: false;
+        PTS_DTS_flags               =Buffer[Buffer_Pos_Flags]>>6;
+        ESCR_flag                   =Buffer[Buffer_Pos_Flags]&0x20?true:false;
+        ES_rate_flag                =Buffer[Buffer_Pos_Flags]&0x10?true:false;
+        DSM_trick_mode_flag         =Buffer[Buffer_Pos_Flags]&0x08?true:false;
+        additional_copy_info_flag   =Buffer[Buffer_Pos_Flags]&0x04?true:false;
+        PES_CRC_flag                =Buffer[Buffer_Pos_Flags]&0x02?true:false;
+        PES_extension_flag          =Buffer[Buffer_Pos_Flags]&0x01?true:false;
         Buffer_Pos_Flags++;
-        PES_header_data_length      = Buffer[Buffer_Pos_Flags];
+        PES_header_data_length      =Buffer[Buffer_Pos_Flags];
         Element_Offset+=3;
     #if MEDIAINFO_TRACE
     }
@@ -1846,6 +1874,15 @@ void File_MpegPs::Header_Parse_PES_packet_MPEG2(int8u stream_id)
         }
         #endif //MEDIAINFO_TRACE
 
+        //Incoherencies test
+        if (!Config->File_MpegPs_PTS_Begin_IsNearZero && Frame_Count<16)
+        {
+            if (FrameInfo.PTS<90000 || FrameInfo.PTS>0x200000000LL-90000) // 1 second before and after 
+                Config->File_MpegPs_PTS_Begin_IsNearZero=true;
+        }
+        if (Config->File_MpegPs_PTS_Begin_IsNearZero && FrameInfo.PTS>0x200000000LL-90000)
+            FrameInfo.PTS=0; //TODO: find a better method for synchronizing streams, Hack in case DTS is negative (currently not supported by MI). TODO: negative DTS.
+
         //Filling
         if (Streams[stream_id].Searching_TimeStamp_End)
         {
@@ -1929,6 +1966,15 @@ void File_MpegPs::Header_Parse_PES_packet_MPEG2(int8u stream_id)
         }
         #endif //MEDIAINFO_TRACE
 
+        //Incoherencies test
+        if (!Config->File_MpegPs_PTS_Begin_IsNearZero && Frame_Count<16)
+        {
+            if (FrameInfo.PTS<90000 || FrameInfo.PTS>0x200000000LL-90000) // 1 second before and after 
+                Config->File_MpegPs_PTS_Begin_IsNearZero=true;
+        }
+        if (Config->File_MpegPs_PTS_Begin_IsNearZero && FrameInfo.PTS>0x200000000LL-90000)
+            FrameInfo.PTS=0; //TODO: find a better method for synchronizing streams, Hack in case DTS is negative (currently not supported by MI). TODO: negative DTS.
+
         //Filling
         if (Streams[stream_id].Searching_TimeStamp_End)
         {
@@ -2004,6 +2050,15 @@ void File_MpegPs::Header_Parse_PES_packet_MPEG2(int8u stream_id)
         }
         #endif //MEDIAINFO_TRACE
 
+        //Incoherencies test
+        if (!Config->File_MpegPs_PTS_Begin_IsNearZero && Frame_Count<16)
+        {
+            if (FrameInfo.DTS<90000 || FrameInfo.DTS>0x200000000LL-90000) // 1 second before and after 
+                Config->File_MpegPs_PTS_Begin_IsNearZero=true;
+        }
+        if (Config->File_MpegPs_PTS_Begin_IsNearZero && FrameInfo.DTS>0x200000000LL-90000)
+            FrameInfo.DTS=0; //TODO: find a better method for synchronizing streams, Hack in case DTS is negative (currently not supported by MI). TODO: negative DTS.
+
         //Filling
         if (Streams[stream_id].Searching_TimeStamp_End)
         {
diff --git a/Source/MediaInfo/Multiple/File_MpegTs.cpp b/Source/MediaInfo/Multiple/File_MpegTs.cpp
index 0ef36d2..ba02494 100644
--- a/Source/MediaInfo/Multiple/File_MpegTs.cpp
+++ b/Source/MediaInfo/Multiple/File_MpegTs.cpp
@@ -33,6 +33,7 @@
 #if MEDIAINFO_EVENTS
     #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
     #include "MediaInfo/MediaInfo_Events_Internal.h"
+    #include "MediaInfo/MediaInfo_Config_PerPackage.h"
 #endif //MEDIAINFO_EVENTS
 #if MEDIAINFO_IBIUSAGE && MEDIAINFO_SEEK
     #include "MediaInfo/Multiple/File_Ibi.h"
@@ -58,7 +59,7 @@ namespace Elements
     const int64u    Config_VbrDetection_Occurences=4;
 #endif // MEDIAINFO_ADVANCED
 
-const char* Scte128_tag (int8u tag)
+static const char* Scte128_tag (int8u tag)
 {
     switch (tag)
     {
@@ -110,7 +111,7 @@ extern const char* Mpeg_Descriptors_CA_system_ID(int16u CA_system_ID);
 const size_t MpegTs_DtsNeural_2_Count=9;
 const size_t MpegTs_DtsNeural_6_Count=4;
 
-const int8u MpegTs_DtsNeural_Channels_2[MpegTs_DtsNeural_2_Count]=
+static const int8u MpegTs_DtsNeural_Channels_2[MpegTs_DtsNeural_2_Count]=
 {
     0,
     3,
@@ -123,7 +124,7 @@ const int8u MpegTs_DtsNeural_Channels_2[MpegTs_DtsNeural_2_Count]=
     7,
 };
 
-const int8u MpegTs_DtsNeural_Channels_6[MpegTs_DtsNeural_6_Count]=
+static const int8u MpegTs_DtsNeural_Channels_6[MpegTs_DtsNeural_6_Count]=
 {
     0,
     6,
@@ -131,7 +132,7 @@ const int8u MpegTs_DtsNeural_Channels_6[MpegTs_DtsNeural_6_Count]=
     8,
 };
 
-const int8u MpegTs_DtsNeural_Channels(int8u Channels, int8u config_id)
+static const int8u MpegTs_DtsNeural_Channels(int8u Channels, int8u config_id)
 {
     if (config_id==0)
         return 0;
@@ -150,7 +151,7 @@ const int8u MpegTs_DtsNeural_Channels(int8u Channels, int8u config_id)
     }
 }
 
-const char* MpegTs_DtsNeural_ChannelPositions_2[MpegTs_DtsNeural_2_Count]=
+static const char* MpegTs_DtsNeural_ChannelPositions_2[MpegTs_DtsNeural_2_Count]=
 {
     "",
     "Front: L R, LFE",
@@ -163,7 +164,7 @@ const char* MpegTs_DtsNeural_ChannelPositions_2[MpegTs_DtsNeural_2_Count]=
     "Front: L R, Side: L R, Back: L R, LFE",
 };
 
-const char* MpegTs_DtsNeural_ChannelPositions_6[MpegTs_DtsNeural_6_Count]=
+static const char* MpegTs_DtsNeural_ChannelPositions_6[MpegTs_DtsNeural_6_Count]=
 {
     "",
     "Front: L C R, Side: L R",
@@ -171,7 +172,7 @@ const char* MpegTs_DtsNeural_ChannelPositions_6[MpegTs_DtsNeural_6_Count]=
     "Front: L C R, Side: L R, Back: L R",
 };
 
-const char* MpegTs_DtsNeural_ChannelPositions(int8u Channels, int8u config_id)
+static const char* MpegTs_DtsNeural_ChannelPositions(int8u Channels, int8u config_id)
 {
     if (config_id==0)
         return "";
@@ -190,7 +191,7 @@ const char* MpegTs_DtsNeural_ChannelPositions(int8u Channels, int8u config_id)
     }
 }
 
-const char* MpegTs_DtsNeural_ChannelPositions2_2[MpegTs_DtsNeural_2_Count]=
+static const char* MpegTs_DtsNeural_ChannelPositions2_2[MpegTs_DtsNeural_2_Count]=
 {
     "",
     "2/0/0.1",
@@ -203,7 +204,7 @@ const char* MpegTs_DtsNeural_ChannelPositions2_2[MpegTs_DtsNeural_2_Count]=
     "2/2/2.1",
 };
 
-const char* MpegTs_DtsNeural_ChannelPositions2_6[MpegTs_DtsNeural_6_Count]=
+static const char* MpegTs_DtsNeural_ChannelPositions2_6[MpegTs_DtsNeural_6_Count]=
 {
     "",
     "3/2/0.1",
@@ -211,7 +212,7 @@ const char* MpegTs_DtsNeural_ChannelPositions2_6[MpegTs_DtsNeural_6_Count]=
     "3/2/2.1",
 };
 
-const char* MpegTs_DtsNeural_ChannelPositions2(int8u Channels, int8u config_id)
+static const char* MpegTs_DtsNeural_ChannelPositions2(int8u Channels, int8u config_id)
 {
     if (config_id==0)
         return "";
@@ -231,7 +232,7 @@ const char* MpegTs_DtsNeural_ChannelPositions2(int8u Channels, int8u config_id)
 }
 
 //---------------------------------------------------------------------------
-Ztring Decimal_Hexa(int64u Number)
+static Ztring Decimal_Hexa(int64u Number)
 {
     Ztring Temp;
     Temp.From_Number(Number);
@@ -315,7 +316,7 @@ void File_MpegTs::Streams_Accept()
             Config->Demux_EventWasSent=true;
     #endif //MEDIAINFO_DEMUX && MEDIAINFO_NEXTPACKET
 
-    if (!IsSub)
+    if (!IsSub && !Config->File_IsReferenced_Get())
     {
         #if MEDIAINFO_ADVANCED
             // TODO: temporary disabling theses options for MPEG-TS, because it does not work as expected
@@ -540,7 +541,7 @@ void File_MpegTs::Streams_Update_Programs()
                         {
                             Ztring LawRating_Temp=Complete_Stream->Streams[elementary_PID]->Parser->Retrieve(Stream_General, 0, General_LawRating);
                             if (!LawRating_Temp.empty())
-                                LawRating+=LawRating_Temp+__T(" / ");;
+                                LawRating+=LawRating_Temp+__T(" / ");
                             Ztring Title_Temp=Complete_Stream->Streams[elementary_PID]->Parser->Retrieve(Stream_General, 0, General_Title);
                             if (!Title_Temp.empty())
                                 Title+=Title_Temp+__T(" / ");
@@ -926,9 +927,10 @@ void File_MpegTs::Streams_Update_Programs_PerStream(size_t StreamID)
     }
 
     //Teletext
-    if (StreamKind_Last==Stream_Max)
+    bool RelyOnTsInfo=(StreamKind_Last==Stream_Max);
+    for (std::map<int16u, teletext>::iterator Teletext=Temp->Teletexts.begin(); Teletext!=Temp->Teletexts.end(); ++Teletext)
     {
-        for (std::map<int16u, teletext>::iterator Teletext=Temp->Teletexts.begin(); Teletext!=Temp->Teletexts.end(); ++Teletext)
+        if (RelyOnTsInfo)
         {
             std::map<std::string, Ztring>::iterator Info_Format=Teletext->second.Infos.find("Format");
             Stream_Prepare((Info_Format!=Teletext->second.Infos.end() && Info_Format->second==__T("Teletext"))?Stream_Other:Stream_Text);
@@ -940,17 +942,33 @@ void File_MpegTs::Streams_Update_Programs_PerStream(size_t StreamID)
                 Fill(StreamKind_Last, StreamPos_Last, General_MenuID, Temp->program_numbers[Pos], 10, Pos==0);
                 Fill(StreamKind_Last, StreamPos_Last, General_MenuID_String, Decimal_Hexa(Temp->program_numbers[Pos]), Pos==0);
             }
+        }
+        else
+        {
+            StreamKind_Last=Stream_Max;
+            StreamPos_Last=(size_t)-1;
+            Ztring ID=Ztring::ToZtring(StreamID)+__T('-')+Ztring::ToZtring(Teletext->first);
+            for (size_t StreamKind=Stream_General+1; StreamKind<Stream_Max; StreamKind++)
+                for (size_t StreamPos=0; StreamPos<Count_Get((stream_t)StreamKind); StreamPos++)
+                    if (Retrieve((stream_t)StreamKind, StreamPos, General_ID) == ID)
+                    {
+                        StreamKind_Last=(stream_t)StreamKind;
+                        StreamPos_Last=StreamPos;
+                    }
+        }
 
-            //TS info
+        //TS info
+        if (StreamKind_Last!=Stream_Max)
+        {
             for (std::map<std::string, ZenLib::Ztring>::iterator Info=Teletext->second.Infos.begin(); Info!=Teletext->second.Infos.end(); ++Info)
             {
                 if (Retrieve(StreamKind_Last, StreamPos_Last, Info->first.c_str()).empty())
                     Fill(StreamKind_Last, StreamPos_Last, Info->first.c_str(), Info->second);
             }
             Teletext->second.Infos.clear();
-            Teletext->second.StreamKind=StreamKind_Last;
-            Teletext->second.StreamPos=StreamPos_Last;
         }
+        Teletext->second.StreamKind=StreamKind_Last;
+        Teletext->second.StreamPos=StreamPos_Last;
     }
 
     //Law rating
@@ -1738,7 +1756,12 @@ bool File_MpegTs::Synched_Test()
                                 && (File_Offset+Buffer_Offset-Buffer_TotalBytes_FirstSynched)*2<File_Size)
                                 {
                                     if (program_clock_reference<Complete_Stream->Streams[pid]->TimeStamp_Start)
-                                        program_clock_reference+=0x200000000LL*300; //33 bits, cyclic
+                                    {
+                                        if (Complete_Stream->Streams[pid]->TimeStamp_Start-program_clock_reference<10LL*90000*300) //Testing if difference is less that 10 seconds (value arbitrary choosen)
+                                            Complete_Stream->Streams[pid]->TimeStamp_Start=program_clock_reference; //Looks like we have a small jump in the past in a buggy file, accepting it.
+                                        else
+                                            program_clock_reference+=0x200000000LL*300; //33 bits, cyclic
+                                    }
                                     if ((program_clock_reference-Complete_Stream->Streams[pid]->TimeStamp_Start)>Begin_MaxDuration)
                                     {
                                         Complete_Stream->Streams[pid]->EndTimeStampMoreThanxSeconds=true;
@@ -1898,6 +1921,10 @@ void File_MpegTs::Read_Buffer_Unsynched()
     Clear(Stream_General, 0, General_Duration_End);
     for (size_t StreamPos=0; StreamPos<Count_Get(Stream_Menu); StreamPos++)
         Clear(Stream_Menu, StreamPos, Menu_Duration);
+    #if MEDIAINFO_EVENTS
+        if (Config->Config_PerPackage)
+            Config->Config_PerPackage->Unsynch();
+    #endif //MEDIAINFO_EVENTS
 }
 
 //---------------------------------------------------------------------------
@@ -1992,13 +2019,17 @@ void File_MpegTs::Read_Buffer_AfterParsing()
                     {
                         complete_stream::stream* &Stream=*It;
 
-                        if (Stream && Stream->Kind==complete_stream::stream::pes && Stream->TimeStamp_Start!=(int64u)-1)
+                        if (Stream && Stream->Kind==complete_stream::stream::pes && Stream->TimeStamp_Start!=(int64u)-1 && Stream->TimeStamp_End!=(int64u)-1 && Stream->TimeStamp_Start!=Stream->TimeStamp_End)
                         {
                             int64u Duration=Stream->TimeStamp_End-Stream->TimeStamp_Start;
                             if (Duration<27000000*2) // 2 seconds
                             {
-                                int64u Ratio=(27000000*2)/Duration;
+                                int64u Ratio = 0;
+                                if (Duration) 
+                                    Ratio = (27000000 * 2) / Duration; 
                                 MpegTs_JumpTo_End*=Ratio;
+                                if (MpegTs_JumpTo_End>MediaInfoLib::Config.MpegTs_MaximumOffset_Get()/4)
+                                    MpegTs_JumpTo_End=MediaInfoLib::Config.MpegTs_MaximumOffset_Get()/4;
                                 break; //Using the first PES found
                             }
                         }
@@ -2537,7 +2568,12 @@ void File_MpegTs::Header_Parse_AdaptationField()
                     && (File_Offset+Buffer_Offset-Buffer_TotalBytes_FirstSynched)*2<File_Size)
                     {
                         if (program_clock_reference<Complete_Stream->Streams[pid]->TimeStamp_Start)
-                            program_clock_reference+=0x200000000LL*300; //33 bits, cyclic
+                        {
+                            if (Complete_Stream->Streams[pid]->TimeStamp_Start-program_clock_reference<10LL*90000*300) //Testing if difference is less that 10 seconds (value arbitrary choosen)
+                                Complete_Stream->Streams[pid]->TimeStamp_Start=program_clock_reference; //Looks like we have a small jump in the past in a buggy file, accepting it.
+                            else
+                                program_clock_reference+=0x200000000LL*300; //33 bits, cyclic
+                        }
                         if ((program_clock_reference-Complete_Stream->Streams[pid]->TimeStamp_Start)>Begin_MaxDuration)
                         {
                             Complete_Stream->Streams[pid]->EndTimeStampMoreThanxSeconds=true;
@@ -2775,7 +2811,12 @@ void File_MpegTs::Header_Parse_AdaptationField()
                     && (File_Offset+Buffer_Offset-Buffer_TotalBytes_FirstSynched)*2<File_Size)
                     {
                         if (program_clock_reference<Complete_Stream->Streams[pid]->TimeStamp_Start)
-                            program_clock_reference+=0x200000000LL*300; //33 bits, cyclic
+                        {
+                            if (Complete_Stream->Streams[pid]->TimeStamp_Start-program_clock_reference<10LL*90000*300) //Testing if difference is less that 10 seconds (value arbitrary choosen)
+                                Complete_Stream->Streams[pid]->TimeStamp_Start=program_clock_reference; //Looks like we have a small jump in the past in a buggy file, accepting it.
+                            else
+                                program_clock_reference+=0x200000000LL*300; //33 bits, cyclic
+                        }
                         if ((program_clock_reference-Complete_Stream->Streams[pid]->TimeStamp_Start)>Begin_MaxDuration)
                         {
                             Complete_Stream->Streams[pid]->EndTimeStampMoreThanxSeconds=true;
@@ -3211,6 +3252,9 @@ void File_MpegTs::PSI()
     //Initializing
     if (payload_unit_start_indicator)
     {
+        #if MEDIAINFO_EVENTS
+            StreamIDs[StreamIDs_Size-1]=pid;
+        #endif //MEDIAINFO_EVENTS
         delete ((File_Mpeg_Psi*)Complete_Stream->Streams[pid]->Parser); Complete_Stream->Streams[pid]->Parser=new File_Mpeg_Psi;
         Open_Buffer_Init(Complete_Stream->Streams[pid]->Parser);
         ((File_Mpeg_Psi*)Complete_Stream->Streams[pid]->Parser)->Complete_Stream=Complete_Stream;
@@ -3440,13 +3484,13 @@ void File_MpegTs::transport_private_data(int8u transport_private_data_length)
                                             if (EBP_time_flag)
                                             {
                                                 Element_Begin1("EBP_acquisition_time");
-                                                if (Complete_Stream->Streams[pid] && !Complete_Stream->Streams[pid]->EBP_IsPresent)
+                                                if (Complete_Stream->Streams[pid] && !Complete_Stream->Streams[pid]->EBP_Marker_Detected)
                                                 {
                                                     int32u Seconds, Fraction;
                                                     Get_B4 (Seconds, "Seconds");  Param_Info1(Ztring().Date_From_Seconds_1970((int32u)(Seconds-2208988800))); //Param_Info1(Ztring().Date_From_Seconds_1900(Seconds)); //Temp for old ZenLib
                                                     Get_B4 (Fraction, "Fraction"); Param_Info1(Ztring::ToZtring(((float64)Fraction)/0x100000000LL, 9));
                                                     Complete_Stream->Streams[pid]->Infos["EBP_AcquisitionTime"]=Ztring().Date_From_Seconds_1970((int32u)(Seconds-2208988800))+__T('.')+Ztring::ToZtring(((float64)Fraction)/0x100000000LL, 9).substr(2); //.Date_From_Seconds_1900(Seconds)); //Temp for old ZenLib
-                                                    Complete_Stream->Streams[pid]->EBP_IsPresent=true;
+                                                    Complete_Stream->Streams[pid]->EBP_Marker_Detected=true;
                                                 }
                                                 else
                                                 {
diff --git a/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.cpp b/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.cpp
index f191ab5..a0431d3 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.cpp
+++ b/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.cpp
@@ -857,7 +857,7 @@ const char* Mpeg_Descriptors_MPEG_4_audio_profile_and_level(int8u MPEG_4_audio_p
 }
 
 //---------------------------------------------------------------------------
-extern const float64 Mpegv_frame_rate[]; //In Video/File_Mpegv.cpp
+extern const float64 Mpegv_frame_rate[16]; //In Video/File_Mpegv.cpp
 extern const char*  Mpegv_Colorimetry_format[]; //In Video/File_Mpegv.cpp
 extern const char*  Mpegv_profile_and_level_indication_profile[]; //In Video/File_Mpegv.cpp
 extern const char*  Mpegv_profile_and_level_indication_level[]; //In Video/File_Mpegv.cpp
@@ -876,7 +876,7 @@ extern const int8u  AC3_Channels[]; //In Audio/File_Ac3.cpp
 extern const char*  AC3_Mode[]; //In Audio/File_Ac3.cpp
 extern const char*  AC3_Surround[]; //In Audio/File_Ac3.cpp
 
-const char* Mpeg_Descriptors_AC3_Channels[]=
+static const char* Mpeg_Descriptors_AC3_Channels[]=
 {
     "1",
     "2",
@@ -888,7 +888,7 @@ const char* Mpeg_Descriptors_AC3_Channels[]=
     "",
 };
 
-const char* Mpeg_Descriptors_AC3_Priority[]=
+static const char* Mpeg_Descriptors_AC3_Priority[]=
 {
     "",
     "Primary Audio",
@@ -897,7 +897,7 @@ const char* Mpeg_Descriptors_AC3_Priority[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Descriptors_bandwidth[]=
+static const char* Mpeg_Descriptors_bandwidth[]=
 {
     "8 MHz",
     "7 MHz",
@@ -910,7 +910,7 @@ const char* Mpeg_Descriptors_bandwidth[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Descriptors_constellation[]=
+static const char* Mpeg_Descriptors_constellation[]=
 {
     "QPSK",
     "16-QAM",
@@ -919,7 +919,7 @@ const char* Mpeg_Descriptors_constellation[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Descriptors_hierarchy_information[]=
+static const char* Mpeg_Descriptors_hierarchy_information[]=
 {
     "non-hierarchical, native interleaver",
     "1, native interleaver",
@@ -932,7 +932,7 @@ const char* Mpeg_Descriptors_hierarchy_information[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Descriptors_code_rate[]=
+static const char* Mpeg_Descriptors_code_rate[]=
 {
     "1/2",
     "2/3",
@@ -945,7 +945,7 @@ const char* Mpeg_Descriptors_code_rate[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Descriptors_guard_interval[]=
+static const char* Mpeg_Descriptors_guard_interval[]=
 {
     "1/32",
     "1/16",
@@ -954,7 +954,7 @@ const char* Mpeg_Descriptors_guard_interval[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Descriptors_transmission_mode[]=
+static const char* Mpeg_Descriptors_transmission_mode[]=
 {
     "2k mode",
     "8k mode",
@@ -1172,7 +1172,7 @@ const char* Mpeg_Descriptors_CA_system_ID(int16u CA_system_ID)
 }
 
 //---------------------------------------------------------------------------
-bool Mpeg_Descriptors_CA_system_ID_MustSkipSlices(int16u CA_system_ID)
+static bool Mpeg_Descriptors_CA_system_ID_MustSkipSlices(int16u CA_system_ID)
 {
     switch (CA_system_ID)
     {
@@ -1652,7 +1652,9 @@ void File_Mpeg_Descriptors::Descriptor_05()
                             //Coherency
                             if (stream_type==0x81 && Complete_Stream->Streams[elementary_PID]->registration_format_identifier==Elements::BSSD)
                                 Complete_Stream->Streams[elementary_PID]->registration_format_identifier=0x00000000; //Reseting it, this combinaision is not possible but a stream has it
-                        } else {
+                        }
+                        else
+                        {
                             //Per program
                             Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension].registration_format_identifier=format_identifier;
                         }
diff --git a/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.h b/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.h
index 6fe5a87..cc05099 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.h
+++ b/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.h
@@ -373,7 +373,7 @@ struct complete_stream
         bool                                        IsUpdated_IsRegistered;
         bool                                        IsUpdated_Info;
         bool                                        CA_system_ID_MustSkipSlices;
-        bool                                        EBP_IsPresent;
+        bool                                        EBP_Marker_Detected;
         size_t                                      Scrambled_Count;
         int16u                                      CA_system_ID;
         int16u                                      SubStream_pid;
@@ -444,7 +444,7 @@ struct complete_stream
             Scrambled_Count=0;
             CA_system_ID_MustSkipSlices=false;
             CA_system_ID=0x0000;
-            EBP_IsPresent=false;
+            EBP_Marker_Detected=false;
             SubStream_pid=0x0000;
             #if MEDIAINFO_IBIUSAGE
                 Ibi_SynchronizationOffset_BeginOfFrame=(int64u)-1;
diff --git a/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp b/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp
index b59d74b..98720f7 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp
+++ b/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp
@@ -53,7 +53,7 @@ namespace Elements
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Psi_ATSC_table_type(int16u ID)
+static const char* Mpeg_Psi_ATSC_table_type(int16u ID)
 {
     switch (ID)
     {
@@ -519,7 +519,7 @@ const char* Mpeg_Psi_table_id(int8u table_id)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Psi_atsc_service_type(int8u service_type)
+static const char* Mpeg_Psi_atsc_service_type(int8u service_type)
 {
     switch (service_type)
     {
@@ -533,7 +533,7 @@ const char* Mpeg_Psi_atsc_service_type(int8u service_type)
 }
 
 //---------------------------------------------------------------------------
-string Mpeg_Psi_atsc_modulation_mode(int8u modulation_mode)
+static string Mpeg_Psi_atsc_modulation_mode(int8u modulation_mode)
 {
     switch (modulation_mode)
     {
@@ -547,7 +547,7 @@ string Mpeg_Psi_atsc_modulation_mode(int8u modulation_mode)
 }
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Psi_table_id_extension(int8u table_id)
+static const char* Mpeg_Psi_table_id_extension(int8u table_id)
 {
     switch (table_id)
     {
@@ -609,7 +609,7 @@ const char* Mpeg_Psi_table_id_extension(int8u table_id)
 // Init: int32u CRC_32 = 0xFFFFFFFF;
 // for each data byte do
 //     CRC_32=(CRC_32<<8) ^ CRC_32_Table[(CRC_32>>24)^(data_byte)];
-int32u Psi_CRC_32_Table[256] =
+extern const int32u Psi_CRC_32_Table[256] =
 {
   0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,
   0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
@@ -678,7 +678,7 @@ int32u Psi_CRC_32_Table[256] =
 };
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Psi_running_status[]=
+static const char* Mpeg_Psi_running_status[]=
 {
     "",
     "Not running",
@@ -694,7 +694,7 @@ const char* Mpeg_Psi_running_status[]=
 extern const char* Mpeg_Descriptors_original_network_id(int16u original_network_id);
 
 //---------------------------------------------------------------------------
-const char* Mpeg_Psi_splice_command_type(int8u splice_command_type)
+static const char* Mpeg_Psi_splice_command_type(int8u splice_command_type)
 {
     switch (splice_command_type)
     {
diff --git a/Source/MediaInfo/Multiple/File_Mxf.cpp b/Source/MediaInfo/Multiple/File_Mxf.cpp
index 7d4487c..058e1a8 100644
--- a/Source/MediaInfo/Multiple/File_Mxf.cpp
+++ b/Source/MediaInfo/Multiple/File_Mxf.cpp
@@ -337,7 +337,7 @@ namespace Elements
     UUID(060E2B34, 02050101, 0D010201, 01040400, 0000, "SMPTE ST 377-1", ClosedCompleteFooterPartition, "")
     UUID(060E2B34, 02050101, 0D010201, 01050100, 0000, "SMPTE ST 377-1", Primer, "")
     UUID(060E2B34, 02530101, 0D010201, 01100100, 0000, "SMPTE ST 377-1", IndexTableSegment, "")
-    UUID(060E2B34, 02050101, 0D010201, 01110100, 0000, "SMPTE ST 377-1", RandomIndexMetadata, "")
+    UUID(060E2B34, 02050101, 0D010201, 01110100, 0000, "SMPTE ST 377-1", RandomIndexPack, "")
 
     //                           03 - ?
     //                             01 - ?
@@ -437,7 +437,18 @@ namespace Elements
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_Category(int8u Category)
+extern const char* Mpegv_profile_and_level_indication_profile[];
+extern const char* Mpegv_profile_and_level_indication_level[];
+extern const char* Mpeg4v_Profile_Level(int32u Profile_Level);
+extern string Jpeg2000_Rsiz(int16u Rsiz);
+
+//---------------------------------------------------------------------------
+extern const char* AfdBarData_active_format[];
+extern const char* AfdBarData_active_format_4_3[];
+extern const char* AfdBarData_active_format_16_9[];
+
+//---------------------------------------------------------------------------
+static const char* Mxf_Category(int8u Category)
 {
     switch(Category)
     {
@@ -450,7 +461,7 @@ const char* Mxf_Category(int8u Category)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_Registry(int8u Category, int8u Registry)
+static const char* Mxf_Registry(int8u Category, int8u Registry)
 {
     switch(Category)
     {
@@ -481,7 +492,7 @@ const char* Mxf_Registry(int8u Category, int8u Registry)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_Structure(int8u Category, int8u Registry, int8u Structure)
+static const char* Mxf_Structure(int8u Category, int8u Registry, int8u Structure)
 {
     switch(Category)
     {
@@ -501,7 +512,7 @@ const char* Mxf_Structure(int8u Category, int8u Registry, int8u Structure)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_MPEG2_CodedContentType(int8u CodedContentType)
+static const char* Mxf_MPEG2_CodedContentType(int8u CodedContentType)
 {
     switch(CodedContentType)
     {
@@ -513,7 +524,7 @@ const char* Mxf_MPEG2_CodedContentType(int8u CodedContentType)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_OperationalPattern(const int128u OperationalPattern)
+static const char* Mxf_OperationalPattern(const int128u OperationalPattern)
 {
     //Item and Package Complexity
     int32u Code_Compare4=(int32u)OperationalPattern.lo;
@@ -546,7 +557,7 @@ const char* Mxf_OperationalPattern(const int128u OperationalPattern)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_EssenceElement(const int128u EssenceElement)
+static const char* Mxf_EssenceElement(const int128u EssenceElement)
 {
     if ((EssenceElement.hi&0xFFFFFFFFFFFFFF00LL)!=0x060E2B3401020100LL)
         return "";
@@ -636,7 +647,7 @@ const char* Mxf_EssenceElement(const int128u EssenceElement)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_EssenceContainer(const int128u EssenceContainer)
+static const char* Mxf_EssenceContainer(const int128u EssenceContainer)
 {
     if ((EssenceContainer.hi&0xFFFFFFFFFFFFFF00LL)!=0x060E2B3404010100LL)
         return "";
@@ -743,7 +754,7 @@ const char* Mxf_EssenceContainer(const int128u EssenceContainer)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_EssenceContainer_Mapping(int8u Code6, int8u Code7, int8u Code8)
+static const char* Mxf_EssenceContainer_Mapping(int8u Code6, int8u Code7, int8u Code8)
 {
     switch (Code6)
     {
@@ -824,7 +835,7 @@ const char* Mxf_EssenceContainer_Mapping(int8u Code6, int8u Code7, int8u Code8)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_EssenceCompression(const int128u EssenceCompression)
+static const char* Mxf_EssenceCompression(const int128u EssenceCompression)
 {
     if ((EssenceCompression.hi&0xFFFFFFFFFFFFFF00LL)!=0x060E2B3404010100LL || !((EssenceCompression.lo&0xFF00000000000000LL)==0x0400000000000000LL || (EssenceCompression.lo&0xFF00000000000000LL)==0x0E00000000000000LL))
         return "";
@@ -1024,7 +1035,61 @@ const char* Mxf_EssenceCompression(const int128u EssenceCompression)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_EssenceCompression_Version(const int128u EssenceCompression)
+static const char* Mxf_EssenceCompression_Profile(const int128u EssenceCompression)
+{
+    int8u Code2=(int8u)((EssenceCompression.lo&0x00FF000000000000LL)>>48);
+    int8u Code3=(int8u)((EssenceCompression.lo&0x0000FF0000000000LL)>>40);
+    int8u Code4=(int8u)((EssenceCompression.lo&0x000000FF00000000LL)>>32);
+    int8u Code5=(int8u)((EssenceCompression.lo&0x00000000FF000000LL)>>24);
+    int8u Code6=(int8u)((EssenceCompression.lo&0x0000000000FF0000LL)>>16);
+    int8u Code7=(int8u)((EssenceCompression.lo&0x000000000000FF00LL)>> 8);
+    int8u Code8=(int8u)((EssenceCompression.lo&0x00000000000000FFLL)    );
+
+    switch (Code2)
+    {
+        case 0x01 : //Picture
+                    switch (Code3)
+                    {
+                        case 0x02 : //Coding characteristics
+                                    switch (Code4)
+                                    {
+                                        case 0x02 : //Compressed coding
+                                                    switch (Code5)
+                                                    {
+                                                        case 0x01 : //MPEG Compression
+                                                                    switch (Code6)
+                                                                    {
+                                                                        case 0x20 : //MPEG-4 Visual
+                                                                                    switch (Code7)
+                                                                                    {
+                                                                                        case 0x10 : //
+                                                                                                    switch (Code8)
+                                                                                                    {
+                                                                                                        case 0x01 :
+                                                                                                        case 0x02 :
+                                                                                                        case 0x03 :
+                                                                                                        case 0x04 :
+                                                                                                                    return Mpeg4v_Profile_Level(B8(11100000)+Code8);
+                                                                                                        case 0x05 :
+                                                                                                        case 0x06 :
+                                                                                                                    return Mpeg4v_Profile_Level(B8(11101011)-5+Code8);
+                                                                                                        default   : return "";
+                                                                                                    }
+                                                                                        default   : return "";
+                                                                                    }
+                                                                        default   : return "";
+                                                                    }
+                                                        default   : return "";
+                                                    }
+                                         default   : return "";
+                                    }
+                         default   : return "";
+                    }
+        default   : return "";
+    }
+}
+//---------------------------------------------------------------------------
+static const char* Mxf_EssenceCompression_Version(const int128u EssenceCompression)
 {
     int8u Code2=(int8u)((EssenceCompression.lo&0x00FF000000000000LL)>>48);
     int8u Code3=(int8u)((EssenceCompression.lo&0x0000FF0000000000LL)>>40);
@@ -1093,7 +1158,7 @@ const char* Mxf_EssenceCompression_Version(const int128u EssenceCompression)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_Sequence_DataDefinition(const int128u DataDefinition)
+static const char* Mxf_Sequence_DataDefinition(const int128u DataDefinition)
 {
     int8u Code4=(int8u)((DataDefinition.lo&0x000000FF00000000LL)>>32);
     int8u Code5=(int8u)((DataDefinition.lo&0x00000000FF000000LL)>>24);
@@ -1122,7 +1187,7 @@ const char* Mxf_Sequence_DataDefinition(const int128u DataDefinition)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_FrameLayout(int8u FrameLayout)
+static const char* Mxf_FrameLayout(int8u FrameLayout)
 {
     switch (FrameLayout)
     {
@@ -1136,7 +1201,7 @@ const char* Mxf_FrameLayout(int8u FrameLayout)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_FrameLayout_ScanType(int8u FrameLayout)
+static const char* Mxf_FrameLayout_ScanType(int8u FrameLayout)
 {
     switch (FrameLayout)
     {
@@ -1150,7 +1215,7 @@ const char* Mxf_FrameLayout_ScanType(int8u FrameLayout)
 }
 
 //---------------------------------------------------------------------------
-int8u Mxf_FrameLayout_Multiplier(int8u FrameLayout)
+static int8u Mxf_FrameLayout_Multiplier(int8u FrameLayout)
 {
     switch (FrameLayout)
     {
@@ -1164,7 +1229,7 @@ int8u Mxf_FrameLayout_Multiplier(int8u FrameLayout)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_ColorPrimaries(const int128u ColorPrimaries)
+static const char* Mxf_ColorPrimaries(const int128u ColorPrimaries)
 {
     int32u Code_Compare4=(int32u)ColorPrimaries.lo;
     switch ((int8u)(Code_Compare4>>16))
@@ -1177,7 +1242,7 @@ const char* Mxf_ColorPrimaries(const int128u ColorPrimaries)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_TransferCharacteristic(const int128u TransferCharacteristic)
+static const char* Mxf_TransferCharacteristic(const int128u TransferCharacteristic)
 {
     int32u Code_Compare4=(int32u)TransferCharacteristic.lo;
     switch ((int8u)(Code_Compare4>>16))
@@ -1194,7 +1259,7 @@ const char* Mxf_TransferCharacteristic(const int128u TransferCharacteristic)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_CodingEquations(const int128u CodingEquations)
+static const char* Mxf_CodingEquations(const int128u CodingEquations)
 {
     int32u Code_Compare4=(int32u)CodingEquations.lo;
     switch ((int8u)(Code_Compare4>>16))
@@ -1207,7 +1272,7 @@ const char* Mxf_CodingEquations(const int128u CodingEquations)
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_ChannelAssignment_ChannelPositions(const int128u ChannelLayout, int32u ChannelsCount)
+static const char* Mxf_ChannelAssignment_ChannelPositions(const int128u ChannelLayout, int32u ChannelsCount)
 {
     //Sound Channel Labeling
     if ((ChannelLayout.hi&0xFFFFFFFFFFFFFF00LL)!=0x060E2B3404010100LL && (ChannelLayout.lo&0xFFFFFFFF00000000LL)!=0x0402021000000000LL)
@@ -1254,7 +1319,7 @@ const char* Mxf_ChannelAssignment_ChannelPositions(const int128u ChannelLayout,
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_ChannelAssignment_ChannelPositions2(const int128u ChannelLayout, int32u ChannelsCount=(int32u)-1)
+static const char* Mxf_ChannelAssignment_ChannelPositions2(const int128u ChannelLayout, int32u ChannelsCount=(int32u)-1)
 {
     //Sound Channel Labeling
     if ((ChannelLayout.hi&0xFFFFFFFFFFFFFF00LL)!=0x060E2B3404010100LL && (ChannelLayout.lo&0xFFFFFFFF00000000LL)!=0x0402021000000000LL)
@@ -1301,7 +1366,7 @@ const char* Mxf_ChannelAssignment_ChannelPositions2(const int128u ChannelLayout,
 }
 
 //---------------------------------------------------------------------------
-const char* Mxf_ChannelAssignment_ChannelLayout(const int128u ChannelLayout, int32u ChannelsCount=(int32u)-1)
+static const char* Mxf_ChannelAssignment_ChannelLayout(const int128u ChannelLayout, int32u ChannelsCount=(int32u)-1)
 {
     //Sound Channel Labeling
     if ((ChannelLayout.hi&0xFFFFFFFFFFFFFF00LL)!=0x060E2B3404010100LL && (ChannelLayout.lo&0xFFFFFFFF00000000LL)!=0x0402021000000000LL)
@@ -1346,15 +1411,15 @@ const char* Mxf_ChannelAssignment_ChannelLayout(const int128u ChannelLayout, int
         default   : return "";
     }
 }
-const char* Mxf_ChannelAssignment_ChannelLayout(const int128u ChannelLayout)
+static const char* Mxf_ChannelAssignment_ChannelLayout(const int128u ChannelLayout)
 {
     return Mxf_ChannelAssignment_ChannelLayout(ChannelLayout, (int32u)-1);
 }
 
-string MXF_MCALabelDictionaryID_ChannelPositions(const std::vector<int128u> &MCALabelDictionaryIDs)
+static string MXF_MCALabelDictionaryID_ChannelPositions(const std::vector<int128u> &MCALabelDictionaryIDs)
 {
     string ToReturn;
-    bitset<8> Front, Side, Back, Lfe;
+    std::bitset<8> Front, Side, Back, Lfe;
     bool IsOk=true;
 
     for (size_t Pos=0; Pos<MCALabelDictionaryIDs.size(); Pos++)
@@ -1490,7 +1555,7 @@ string MXF_MCALabelDictionaryID_ChannelPositions(const std::vector<int128u> &MCA
     return ToReturn;
 }
 
-string MXF_MCALabelDictionaryID_ChannelLayout(const std::vector<int128u> &MCALabelDictionaryIDs)
+static string MXF_MCALabelDictionaryID_ChannelLayout(const std::vector<int128u> &MCALabelDictionaryIDs)
 {
     string ToReturn;
 
@@ -1572,7 +1637,7 @@ string MXF_MCALabelDictionaryID_ChannelLayout(const std::vector<int128u> &MCALab
 
 //---------------------------------------------------------------------------
 const size_t Mxf_AS11_ClosedCaptionType_Count=2;
-const char* Mxf_AS11_ClosedCaptionType[Mxf_AS11_ClosedCaptionType_Count]=
+static const char* Mxf_AS11_ClosedCaptionType[Mxf_AS11_ClosedCaptionType_Count]=
 {
     "Hard of Hearing",
     "Translation",
@@ -1580,7 +1645,7 @@ const char* Mxf_AS11_ClosedCaptionType[Mxf_AS11_ClosedCaptionType_Count]=
 
 //---------------------------------------------------------------------------
 const size_t Mxf_AS11_AudioTrackLayout_Count=0x35;
-const char* Mxf_AS11_AudioTrackLayout[Mxf_AS11_AudioTrackLayout_Count]=
+static const char* Mxf_AS11_AudioTrackLayout[Mxf_AS11_AudioTrackLayout_Count]=
 {
     "EBU R 48: 1a",
     "EBU R 48: 1b",
@@ -1641,7 +1706,7 @@ struct mxf_as11_audiotracklayout_assignment
     size_t Count;
     const char* Assign[16];
 };
-const mxf_as11_audiotracklayout_assignment Mxf_AS11_AudioTrackLayout_ChannelPositions[Mxf_AS11_AudioTrackLayout_Count]=
+static const mxf_as11_audiotracklayout_assignment Mxf_AS11_AudioTrackLayout_ChannelPositions[Mxf_AS11_AudioTrackLayout_Count]=
 {
     {  2, "Front: C", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, //48 1a
     {  4, "Front: C", NULL, "Front: C", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, //48 1b
@@ -1697,7 +1762,7 @@ const mxf_as11_audiotracklayout_assignment Mxf_AS11_AudioTrackLayout_ChannelPosi
     { 16, "Front: L", "Front: R", "Front: C", "LFE", "Side: L", "Side: R", "Front: L", "Front: R", "Front: C", "LFE", "Side: L", "Side: R", "Side: L", "Side: R", "Side: L", "Side: R", }, //123 16e
     { 16, "Front: L", "Front: R", NULL, NULL, "Front: L", "Front: R", NULL, NULL, "Front: L", "Front: R", NULL, NULL, "Front: L", "Front: R", "Front: L", "Front: R", }, //123 16f
 };
-const mxf_as11_audiotracklayout_assignment Mxf_AS11_AudioTrackLayout_ChannelLayout[Mxf_AS11_AudioTrackLayout_Count]=
+static const mxf_as11_audiotracklayout_assignment Mxf_AS11_AudioTrackLayout_ChannelLayout[Mxf_AS11_AudioTrackLayout_Count]=
 {
     {  2, "C", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, //48 1a
     {  4, "C", NULL, "C", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, //48 1b
@@ -1757,7 +1822,7 @@ const mxf_as11_audiotracklayout_assignment Mxf_AS11_AudioTrackLayout_ChannelLayo
 
 //---------------------------------------------------------------------------
 const size_t Mxf_AS11_FpaPass_Count=3;
-const char* Mxf_AS11_FpaPass[Mxf_AS11_FpaPass_Count]=
+static const char* Mxf_AS11_FpaPass[Mxf_AS11_FpaPass_Count]=
 {
     "Yes",
     "No",
@@ -1766,7 +1831,7 @@ const char* Mxf_AS11_FpaPass[Mxf_AS11_FpaPass_Count]=
 
 //---------------------------------------------------------------------------
 const size_t Mxf_AS11_SigningPresent_Count=3;
-const char* Mxf_AS11_SigningPresent[Mxf_AS11_SigningPresent_Count]=
+static const char* Mxf_AS11_SigningPresent[Mxf_AS11_SigningPresent_Count]=
 {
     "Yes",
     "No",
@@ -1775,7 +1840,7 @@ const char* Mxf_AS11_SigningPresent[Mxf_AS11_SigningPresent_Count]=
 
 //---------------------------------------------------------------------------
 const size_t Mxf_AS11_3D_Type_Count=4;
-const char* Mxf_AS11_3D_Type[Mxf_AS11_3D_Type_Count]=
+static const char* Mxf_AS11_3D_Type[Mxf_AS11_3D_Type_Count]=
 {
     "Side by side",
     "Dual",
@@ -1785,7 +1850,7 @@ const char* Mxf_AS11_3D_Type[Mxf_AS11_3D_Type_Count]=
 
 //---------------------------------------------------------------------------
 const size_t Mxf_AS11_AudioLoudnessStandard_Count=2;
-const char* Mxf_AS11_AudioLoudnessStandard[Mxf_AS11_AudioLoudnessStandard_Count]=
+static const char* Mxf_AS11_AudioLoudnessStandard[Mxf_AS11_AudioLoudnessStandard_Count]=
 {
     "",
     "EBU R 128",
@@ -1793,7 +1858,7 @@ const char* Mxf_AS11_AudioLoudnessStandard[Mxf_AS11_AudioLoudnessStandard_Count]
 
 //---------------------------------------------------------------------------
 const size_t Mxf_AS11_AudioDescriptionType_Count=2;
-const char* Mxf_AS11_AudioDescriptionType[Mxf_AS11_AudioDescriptionType_Count]=
+static const char* Mxf_AS11_AudioDescriptionType[Mxf_AS11_AudioDescriptionType_Count]=
 {
     "Control data / Narration",
     "AD Mix",
@@ -1801,7 +1866,7 @@ const char* Mxf_AS11_AudioDescriptionType[Mxf_AS11_AudioDescriptionType_Count]=
 
 //---------------------------------------------------------------------------
 const size_t Mxf_AS11_OpenCaptionsType_Count=2;
-const char* Mxf_AS11_OpenCaptionsType[Mxf_AS11_OpenCaptionsType_Count]=
+static const char* Mxf_AS11_OpenCaptionsType[Mxf_AS11_OpenCaptionsType_Count]=
 {
     "Hard of Hearing",
     "Translation",
@@ -1809,7 +1874,7 @@ const char* Mxf_AS11_OpenCaptionsType[Mxf_AS11_OpenCaptionsType_Count]=
 
 //---------------------------------------------------------------------------
 const size_t Mxf_AS11_SignLanguage_Count=2;
-const char* Mxf_AS11_SignLanguage[Mxf_AS11_SignLanguage_Count]=
+static const char* Mxf_AS11_SignLanguage[Mxf_AS11_SignLanguage_Count]=
 {
     "BSL (British Sign Language)",
     "BSL (Makaton)",
@@ -1818,7 +1883,7 @@ const char* Mxf_AS11_SignLanguage[Mxf_AS11_SignLanguage_Count]=
 
 //---------------------------------------------------------------------------
 // EBU Tech 3349
-string Mxf_CameraUnitMetadata_GammaforCDL(int8u Value)
+static string Mxf_CameraUnitMetadata_GammaforCDL(int8u Value)
 {
     switch(Value)
     {
@@ -1833,7 +1898,7 @@ string Mxf_CameraUnitMetadata_GammaforCDL(int8u Value)
 
 //---------------------------------------------------------------------------
 // EBU Tech 3349
-string Mxf_CameraUnitMetadata_NeutralDensityFilterWheelSetting(int16u Value)
+static string Mxf_CameraUnitMetadata_NeutralDensityFilterWheelSetting(int16u Value)
 {
     switch(Value)
     {
@@ -1844,7 +1909,7 @@ string Mxf_CameraUnitMetadata_NeutralDensityFilterWheelSetting(int16u Value)
 
 //---------------------------------------------------------------------------
 // EBU Tech 3349
-string Mxf_CameraUnitMetadata_ImageSensorReadoutMode(int8u Value)
+static string Mxf_CameraUnitMetadata_ImageSensorReadoutMode(int8u Value)
 {
     switch(Value)
     {
@@ -1858,7 +1923,7 @@ string Mxf_CameraUnitMetadata_ImageSensorReadoutMode(int8u Value)
 
 //---------------------------------------------------------------------------
 // EBU Tech 3349
-string Mxf_CameraUnitMetadata_CaptureGammaEquation(int128u Value)
+static string Mxf_CameraUnitMetadata_CaptureGammaEquation(int128u Value)
 {
     switch(Value.lo)
     {
@@ -1922,7 +1987,7 @@ string Mxf_CameraUnitMetadata_CaptureGammaEquation(int128u Value)
 
 //---------------------------------------------------------------------------
 // RDD 18
-string Mxf_CameraUnitMetadata_AutoExposureMode(int128u Value)
+static string Mxf_CameraUnitMetadata_AutoExposureMode(int128u Value)
 {
     switch(Value.lo)
     {
@@ -1944,7 +2009,7 @@ string Mxf_CameraUnitMetadata_AutoExposureMode(int128u Value)
 
 //---------------------------------------------------------------------------
 // RDD 18
-string Mxf_CameraUnitMetadata_AutoFocusSensingAreaSetting(int8u Value)
+static string Mxf_CameraUnitMetadata_AutoFocusSensingAreaSetting(int8u Value)
 {
     switch(Value)
     {
@@ -1959,7 +2024,7 @@ string Mxf_CameraUnitMetadata_AutoFocusSensingAreaSetting(int8u Value)
 
 //---------------------------------------------------------------------------
 // RDD 18
-string Mxf_CameraUnitMetadata_ColorCorrectionFilterWheelSetting(int8u Value)
+static string Mxf_CameraUnitMetadata_ColorCorrectionFilterWheelSetting(int8u Value)
 {
     switch(Value)
     {
@@ -1974,7 +2039,7 @@ string Mxf_CameraUnitMetadata_ColorCorrectionFilterWheelSetting(int8u Value)
 
 //---------------------------------------------------------------------------
 // RDD 18
-string Mxf_CameraUnitMetadata_AutoWhiteBalanceMode(int8u Value)
+static string Mxf_CameraUnitMetadata_AutoWhiteBalanceMode(int8u Value)
 {
     switch(Value)
     {
@@ -1988,7 +2053,7 @@ string Mxf_CameraUnitMetadata_AutoWhiteBalanceMode(int8u Value)
 
 //---------------------------------------------------------------------------
 // CameraUnitMetadata
-string Mxf_AcquisitionMetadata_ElementName(int16u Value, bool IsSony=false)
+static string Mxf_AcquisitionMetadata_ElementName(int16u Value, bool IsSony=false)
 {
     if (IsSony)
         switch (Value)
@@ -2019,6 +2084,10 @@ string Mxf_AcquisitionMetadata_ElementName(int16u Value, bool IsSony=false)
         case 0x8005: return "LensZoomActualFocalLength";
         case 0x8006: return "OpticalExtenderMagnification";
         case 0x8007: return "LensAttributes";
+        case 0x8008: return "IrisTNumber";
+        case 0x8009: return "IrisRingPosition";
+        case 0x800A: return "FocusRingPosition";
+        case 0x800B: return "ZoomRingPosition";
         case 0x8100: return "AutoExposureMode";
         case 0x8101: return "AutoFocusSensingAreaSetting";
         case 0x8102: return "ColorCorrectionFilterWheelSetting";
@@ -2043,6 +2112,7 @@ string Mxf_AcquisitionMetadata_ElementName(int16u Value, bool IsSony=false)
         case 0x8115: return "ExposureIndexofPhotoMeter";
         case 0x8116: return "GammaForCDL";
         case 0x8117: return "ASC_CDL_V12";
+        case 0x8118: return "ColorMatrix";
         default:     return Ztring(Ztring::ToZtring(Value, 16)).To_UTF8();
     }
 }
@@ -2050,7 +2120,7 @@ string Mxf_AcquisitionMetadata_ElementName(int16u Value, bool IsSony=false)
 //---------------------------------------------------------------------------
 // CameraUnitMetadata - Sony E201 (Values are internal MI)
 const size_t Mxf_AcquisitionMetadata_Sony_E201_ElementCount = 11;
-const char* Mxf_AcquisitionMetadata_Sony_E201_ElementName[Mxf_AcquisitionMetadata_Sony_E201_ElementCount] =
+static const char* Mxf_AcquisitionMetadata_Sony_E201_ElementName[Mxf_AcquisitionMetadata_Sony_E201_ElementCount] =
 {
     "FocusDistance",
     "ApertureValue",
@@ -2067,7 +2137,7 @@ const char* Mxf_AcquisitionMetadata_Sony_E201_ElementName[Mxf_AcquisitionMetadat
 
 //---------------------------------------------------------------------------
 // Read from SR Viewer program
-string Mxf_AcquisitionMetadata_Sony_CameraProcessDiscriminationCode(int16u Value)
+static string Mxf_AcquisitionMetadata_Sony_CameraProcessDiscriminationCode(int16u Value)
 {
     switch (Value)
     {
@@ -2080,7 +2150,7 @@ string Mxf_AcquisitionMetadata_Sony_CameraProcessDiscriminationCode(int16u Value
 
 //---------------------------------------------------------------------------
 // Read from SR Viewer program
-string Mxf_AcquisitionMetadata_Sony_MonitoringBaseCurve(int128u Value)
+static string Mxf_AcquisitionMetadata_Sony_MonitoringBaseCurve(int128u Value)
 {
     switch(Value.lo)
     {
@@ -2096,16 +2166,6 @@ string Mxf_AcquisitionMetadata_Sony_MonitoringBaseCurve(int128u Value)
     }
 }
 
-//---------------------------------------------------------------------------
-extern const char* Mpegv_profile_and_level_indication_profile[];
-extern const char* Mpegv_profile_and_level_indication_level[];
-extern const char* Mpeg4v_Profile_Level(int32u Profile_Level);
-
-//---------------------------------------------------------------------------
-extern const char* AfdBarData_active_format[];
-extern const char* AfdBarData_active_format_4_3[];
-extern const char* AfdBarData_active_format_16_9[];
-
 //***************************************************************************
 // Constructor/Destructor
 //***************************************************************************
@@ -2133,7 +2193,7 @@ File_Mxf::File_Mxf()
     #endif //MEDIAINFO_DEMUX
 
     //Temp
-    RandomIndexMetadatas_AlreadyParsed=false;
+    RandomIndexPacks_AlreadyParsed=false;
     Streams_Count=(size_t)-1;
     OperationalPattern=0;
     Buffer_Begin=(int64u)-1;
@@ -2153,7 +2213,7 @@ File_Mxf::File_Mxf()
     IdIsAlwaysSame_Offset=0;
     PartitionMetadata_PreviousPartition=(int64u)-1;
     PartitionMetadata_FooterPartition=(int64u)-1;
-    RandomIndexMetadatas_MaxOffset=(int64u)-1;
+    RandomIndexPacks_MaxOffset=(int64u)-1;
     DTS_Delay=0;
     SDTI_TimeCode_RepetitionCount=0;
     SDTI_SizePerFrame=0;
@@ -2535,12 +2595,18 @@ void File_Mxf::Streams_Finish()
                 {
                     case 0x8001 : //FocusPosition_ImagePlane
                     case 0x8002 : //FocusPosition_FrontLensVertex
-                    case 0x8004 : //LensZoom_35mmStillCameraEquivalent
-                    case 0x8005 : //LensZoom_ActualFocalLength
                         (*Stream_More)[Stream_Other][0](Ztring().From_UTF8(ElementName_FirstFrame.c_str()), Info_Options)=__T("N NT");
                         Fill(Stream_Other, 0, (ElementName_FirstFrame+"/String").c_str(), (*AcquisitionMetadataLists[Pos])[0].Value+" m");
                         break;
+                    case 0x8004 : //LensZoom35mmStillCameraEquivalent
+                    case 0x8005 : //LensZoomActualFocalLength
+                        (*Stream_More)[Stream_Other][0](Ztring().From_UTF8(ElementName_FirstFrame.c_str()), Info_Options)=__T("N NT");
+                        Fill(Stream_Other, 0, (ElementName_FirstFrame+"/String").c_str(), (*AcquisitionMetadataLists[Pos])[0].Value+" mm");
+                        break;
                     case 0x8006 : //OpticalExtenderMagnification
+                    case 0x8009 : //IrisRingPosition
+                    case 0x800A : //FocusRingPosition
+                    case 0x800B : //ZoomRingPosition
                     case 0x810C : //ElectricalExtenderMagnification
                     case 0x810F : //CameraMasterBlackLevel
                     case 0x8110 : //CameraKneePoint
@@ -2941,7 +3007,7 @@ void File_Mxf::Streams_Finish_Essence(int32u EssenceUID, int128u TrackUID)
 
         //Positioning other streams
         for (essences::iterator Essence_Temp=Essence; Essence_Temp!=Essences.end(); ++Essence_Temp)
-            if (*(Essence_Temp->second.Parsers.begin()) && (*(Essence_Temp->second.Parsers.begin()))->Count_Get(Stream_Audio))
+            if (!Essence_Temp->second.Parsers.empty() && Essence_Temp->second.Parsers[0]->Count_Get(Stream_Audio))
             {
                 Essence_Temp->second.StreamPos-=2; //ChannelGrouping
                 Essence_Temp->second.StreamPos+=(*(Essence_Temp->second.Parsers.begin()))->Count_Get(Stream_Audio);
@@ -3636,7 +3702,23 @@ void File_Mxf::Streams_Finish_Descriptor(const int128u DescriptorUID, const int1
                                                     Fill(Stream_Audio, StreamPos_Last, Info->first.c_str(), Info->second, true);
                                                 break;
                         default:                ;
+                                                #if MEDIAINFO_ADVANCED
+                                                    if (SubDescriptor->second.Jpeg2000_Rsiz!=(int16u)-1 && !Retrieve(StreamKind_Last, StreamPos_Last, "Format_Profile").empty() && Jpeg2000_Rsiz(SubDescriptor->second.Jpeg2000_Rsiz)!=Retrieve(StreamKind_Last, StreamPos_Last, "Format_Profile").To_UTF8())
+                                                    {
+                                                        Fill(StreamKind_Last, StreamPos_Last, "Format_Profile_FromStream", Retrieve(StreamKind_Last, StreamPos_Last, "Format_Profile"));
+                                                        Fill(StreamKind_Last, StreamPos_Last, "Format_Profile_FromContainer", Jpeg2000_Rsiz(SubDescriptor->second.Jpeg2000_Rsiz));
+                                                    }
+                                                #endif //MEDIAINFO_ADVANCED
                     }
+
+                    for (std::map<std::string, Ztring>::iterator Info=SubDescriptor->second.Infos.begin(); Info!=SubDescriptor->second.Infos.end(); ++Info)
+                        if (Retrieve(StreamKind_Last, StreamPos_Last, Info->first.c_str()).empty())
+                            Fill(StreamKind_Last, StreamPos_Last, Info->first.c_str(), Info->second);
+                        else if (Retrieve(StreamKind_Last, StreamPos_Last, Info->first.c_str()) != Info->second)
+                        {
+                            Fill(StreamKind_Last, StreamPos_Last, (Info->first+"_Original").c_str(), Retrieve(StreamKind_Last, StreamPos_Last, Info->first.c_str()));
+                            Fill(StreamKind_Last, StreamPos_Last, Info->first.c_str(), Info->second, true);
+                        }
                 }
             }
 
@@ -3744,7 +3826,7 @@ void File_Mxf::Streams_Finish_CommercialNames ()
 }
 
 //---------------------------------------------------------------------------
-void File_Mxf::Streams_Finish_Component(const int128u ComponentUID, float64 EditRate, int32u TrackID, int64u Origin)
+void File_Mxf::Streams_Finish_Component(const int128u ComponentUID, float64 EditRate, int32u TrackID, int64s Origin)
 {
     components::iterator Component=Components.find(ComponentUID);
     if (Component==Components.end())
@@ -3807,7 +3889,7 @@ void File_Mxf::Streams_Finish_Component(const int128u ComponentUID, float64 Edit
 }
 
 //---------------------------------------------------------------------------
-void File_Mxf::Streams_Finish_Component_ForTimeCode(const int128u ComponentUID, float64 EditRate, int32u TrackID, int64u Origin, bool IsSourcePackage)
+void File_Mxf::Streams_Finish_Component_ForTimeCode(const int128u ComponentUID, float64 EditRate, int32u TrackID, int64s Origin, bool IsSourcePackage)
 {
     components::iterator Component=Components.find(ComponentUID);
     if (Component==Components.end())
@@ -3871,7 +3953,7 @@ void File_Mxf::Streams_Finish_Component_ForTimeCode(const int128u ComponentUID,
 }
 
 //---------------------------------------------------------------------------
-void File_Mxf::Streams_Finish_Component_ForAS11(const int128u ComponentUID, float64 EditRate, int32u TrackID, int64u Origin)
+void File_Mxf::Streams_Finish_Component_ForAS11(const int128u ComponentUID, float64 EditRate, int32u TrackID, int64s Origin)
 {
     components::iterator Component=Components.find(ComponentUID);
     if (Component==Components.end())
@@ -4399,7 +4481,7 @@ void File_Mxf::Read_Buffer_AfterParsing()
 
         if (IsParsingEnd)
         {
-            if (PartitionMetadata_PreviousPartition && RandomIndexMetadatas.empty() && !RandomIndexMetadatas_AlreadyParsed)
+            if (PartitionMetadata_PreviousPartition && RandomIndexPacks.empty() && !RandomIndexPacks_AlreadyParsed)
             {
                 Partitions_Pos=0;
                 while (Partitions_Pos<Partitions.size() && Partitions[Partitions_Pos].StreamOffset!=PartitionMetadata_PreviousPartition)
@@ -5046,7 +5128,7 @@ bool File_Mxf::FileHeader_Begin()
         return false;
     }
 
-    //DCA uses buffer interface without filename
+    //In case of buffer interface without filename
     if (File_Name.empty())
         File_Name=Config->File_FileName_Get();
 
@@ -5207,6 +5289,8 @@ bool File_Mxf::Header_Begin()
                             DemuxedSampleCount_Current=Config->File_IgnoreEditsAfter-DemuxedSampleCount_Total;
                             Element_Size=DemuxedSampleCount_Current*SingleDescriptor->second.BlockAlign;
                         }
+                        if (DemuxedSampleCount_Total+DemuxedSampleCount_Current+1==IgnoreSamplesAfter)
+                            DemuxedSampleCount_Current++; //Avoid rounding issues (sometimes it remains only 1 sample)
                     }
                 #endif //MEDIAINFO_DEMUX
             }
@@ -5671,7 +5755,7 @@ void File_Mxf::Data_Parse()
     ELEMENT(ClosedCompleteFooterPartition,                      "Closed and Complete Footer Partition Pack")
     ELEMENT(Primer,                                             "Primer")
     ELEMENT(IndexTableSegment,                                  "Index Table (Segment)")
-    ELEMENT(RandomIndexMetadata,                                "Random Index Metadata")
+    ELEMENT(RandomIndexPack,                                    "Random Index Pack")
     ELEMENT(SDTI_SystemMetadataPack,                            "SDTI System Metadata Pack")
     else if (Code_Compare1==Elements::SDTI_SystemMetadataPack1
           && ((Code_Compare2)&0xFF00FFFF)==(Elements::SDTI_SystemMetadataPack2&0xFF00FFFF)
@@ -5771,7 +5855,7 @@ void File_Mxf::Data_Parse()
 
         if (IsParsingEnd)
         {
-            NextRandomIndexMetadata();
+            NextRandomIndexPack();
             return;
         }
 
@@ -6284,8 +6368,8 @@ void File_Mxf::Data_Parse()
         Open_Buffer_Unsynch();
     }
 
-    if (File_Offset+Buffer_Offset+Element_Size>=RandomIndexMetadatas_MaxOffset)
-        NextRandomIndexMetadata();
+    if (File_Offset+Buffer_Offset+Element_Size>=RandomIndexPacks_MaxOffset)
+        NextRandomIndexPack();
 }
 
 //***************************************************************************
@@ -6364,8 +6448,8 @@ void File_Mxf::CDCIEssenceDescriptor()
         default: GenericPictureEssenceDescriptor();
     }
 
-    if (Descriptors[InstanceUID].Infos["ColorSpace"].empty())
-        Descriptors[InstanceUID].Infos["ColorSpace"]="YUV";
+    if (Descriptors[InstanceUID].Infos.find("ColorSpace")==Descriptors[InstanceUID].Infos.end())
+        Descriptor_Fill("ColorSpace", "YUV");
 }
 
 //---------------------------------------------------------------------------
@@ -7061,52 +7145,46 @@ void File_Mxf::RGBAEssenceDescriptor()
         default: GenericPictureEssenceDescriptor();
     }
 
-    if (Descriptors[InstanceUID].Infos["ColorSpace"].empty())
-        Descriptors[InstanceUID].Infos["ColorSpace"]="RGB";
+    if (Descriptors[InstanceUID].Infos.find("ColorSpace")==Descriptors[InstanceUID].Infos.end())
+        Descriptor_Fill("ColorSpace", "RGB");
 }
 
 //---------------------------------------------------------------------------
-void File_Mxf::RandomIndexMetadata()
+void File_Mxf::RandomIndexPack()
 {
-    if (RandomIndexMetadatas_AlreadyParsed)
-    {
-        Skip_XX(Element_Size,                                   "(Already parsed)");
-        return;
-    }
-
     //Parsing
     while (Element_Offset+4<Element_Size)
     {
         Element_Begin1("PartitionArray");
-        randomindexmetadata RandomIndexMetadata;
-        Get_B4 (RandomIndexMetadata.BodySID,                    "BodySID"); Element_Info1(RandomIndexMetadata.BodySID);
-        Get_B8 (RandomIndexMetadata.ByteOffset,                 "ByteOffset"); Element_Info1(Ztring::ToZtring(RandomIndexMetadata.ByteOffset, 16));
+        randomindexpack RandomIndexPack;
+        Get_B4 (RandomIndexPack.BodySID,                        "BodySID"); Element_Info1(RandomIndexPack.BodySID);
+        Get_B8 (RandomIndexPack.ByteOffset,                     "ByteOffset"); Element_Info1(Ztring::ToZtring(RandomIndexPack.ByteOffset, 16));
         Element_End0();
 
         FILLING_BEGIN();
-            if (!RandomIndexMetadatas_AlreadyParsed && PartitionPack_AlreadyParsed.find(RandomIndexMetadata.ByteOffset)==PartitionPack_AlreadyParsed.end())
-                RandomIndexMetadatas.push_back(RandomIndexMetadata);
+            if (!RandomIndexPacks_AlreadyParsed && PartitionPack_AlreadyParsed.find(RandomIndexPack.ByteOffset)==PartitionPack_AlreadyParsed.end())
+                RandomIndexPacks.push_back(RandomIndexPack);
         FILLING_END();
     }
     Skip_B4(                                                    "Length");
 
     FILLING_BEGIN();
-        if (MediaInfoLib::Config.ParseSpeed_Get()<1.0 && !RandomIndexMetadatas_AlreadyParsed && !RandomIndexMetadatas.empty() && Config->File_Mxf_ParseIndex_Get())
+        if (MediaInfoLib::Config.ParseSpeed_Get()<1.0 && !RandomIndexPacks_AlreadyParsed && !RandomIndexPacks.empty() && Config->File_Mxf_ParseIndex_Get())
         {
             IsParsingEnd=true;
-            GoTo(RandomIndexMetadatas[0].ByteOffset);
-            RandomIndexMetadatas.erase(RandomIndexMetadatas.begin());
+            GoTo(RandomIndexPacks[0].ByteOffset);
+            RandomIndexPacks.erase(RandomIndexPacks.begin());
             Open_Buffer_Unsynch();
 
             //Hints
             if (File_Buffer_Size_Hint_Pointer)
                 (*File_Buffer_Size_Hint_Pointer)=64*1024;
         }
-        else if (!RandomIndexMetadatas_AlreadyParsed && !Partitions_IsFooter && !RandomIndexMetadatas.empty() && (!RandomIndexMetadatas[RandomIndexMetadatas.size()-1].BodySID || File_Offset+Buffer_Offset-Header_Size-RandomIndexMetadatas[RandomIndexMetadatas.size()-1].ByteOffset<16*1024*1024)) // If footer was not parsed but is available
+        else if (!RandomIndexPacks_AlreadyParsed && !Partitions_IsFooter && !RandomIndexPacks.empty() && (!RandomIndexPacks[RandomIndexPacks.size()-1].BodySID || File_Offset+Buffer_Offset-Header_Size-RandomIndexPacks[RandomIndexPacks.size()-1].ByteOffset<16*1024*1024)) // If footer was not parsed but is available
         {
-            GoTo(RandomIndexMetadatas[RandomIndexMetadatas.size()-1].ByteOffset);
+            GoTo(RandomIndexPacks[RandomIndexPacks.size()-1].ByteOffset);
         }
-        RandomIndexMetadatas_AlreadyParsed=true;
+        RandomIndexPacks_AlreadyParsed=true;
     FILLING_END();
 }
 
@@ -8082,6 +8160,10 @@ void File_Mxf::LensUnitMetadata()
         ELEMENT(8005, LensUnitMetadata_LensZoomActualFocalLength,           "LensZoom (Actual Focal Length)")
         ELEMENT(8006, LensUnitMetadata_OpticalExtenderMagnification,        "Optical Extender Magnification")
         ELEMENT(8007, LensUnitMetadata_LensAttributes,                      "Lens Attributes")
+        ELEMENT(8008, LensUnitMetadata_IrisTNumber,                         "Iris (T)")
+        ELEMENT(8009, LensUnitMetadata_IrisRingPosition,                    "Iris Ring Position")
+        ELEMENT(800A, LensUnitMetadata_FocusRingPosition,                   "Focus Ring Position")
+        ELEMENT(800B, LensUnitMetadata_ZoomRingPosition,                    "Zoom Ring Position")
         default:
                     GenerationInterchangeObject();
     }
@@ -8119,7 +8201,8 @@ void File_Mxf::CameraUnitMetadata()
         ELEMENT(8114, CameraUnitMetadata_CameraAttributes,                  "Camera Attributes")
         ELEMENT(8115, CameraUnitMetadata_ExposureIndexofPhotoMeter,         "Exposure Index of Photo Meter")
         ELEMENT(8116, CameraUnitMetadata_GammaForCDL,                       "Gamma for CDL")
-        ELEMENT(8117, CameraUnitMetadata_ASC_CDL_V12,                        "ASC CDL V1.2")
+        ELEMENT(8117, CameraUnitMetadata_ASC_CDL_V12,                       "ASC CDL V1.2")
+        ELEMENT(8118, CameraUnitMetadata_ColorMatrix,                       "ColorMatrix")
         default:
                     GenerationInterchangeObject();
     }
@@ -8539,11 +8622,7 @@ void File_Mxf::CDCIEssenceDescriptor_ComponentDepth()
     Get_B4 (Data,                                                "Data"); Element_Info1(Data);
 
     FILLING_BEGIN();
-        if (!Partitions_IsFooter || Descriptors[InstanceUID].Infos["BitDepth"].empty())
-        {
-            if (Data)
-                Descriptors[InstanceUID].Infos["BitDepth"].From_Number(Data);
-        }
+        Descriptor_Fill("BitDepth", Ztring().From_Number(Data));
     FILLING_END();
 }
 
@@ -8764,7 +8843,7 @@ void File_Mxf::FileDescriptor_SampleRate()
 
     FILLING_BEGIN();
         if (Descriptors[InstanceUID].SampleRate && Descriptors[InstanceUID].Duration!=(int64u)-1)
-            Descriptors[InstanceUID].Infos["Duration"].From_Number(Descriptors[InstanceUID].Duration/Descriptors[InstanceUID].SampleRate*1000, 0);
+            Descriptor_Fill("Duration", Ztring().From_Number(Descriptors[InstanceUID].Duration/Descriptors[InstanceUID].SampleRate*1000, 0));
     FILLING_END();
 }
 
@@ -8800,7 +8879,7 @@ void File_Mxf::FileDescriptor_EssenceContainer()
         int8u Code8=(int8u)((EssenceContainer.lo&0x00000000000000FFLL)    );
 
         Descriptors[InstanceUID].EssenceContainer=EssenceContainer;
-        Descriptors[InstanceUID].Infos["Format_Settings_Wrapping"].From_UTF8(Mxf_EssenceContainer_Mapping(Code6, Code7, Code8));
+        Descriptor_Fill("Format_Settings_Wrapping", Mxf_EssenceContainer_Mapping(Code6, Code7, Code8));
 
         if (!DataMustAlwaysBeComplete && Descriptors[InstanceUID].Infos["Format_Settings_Wrapping"].find(__T("Frame"))!=string::npos)
             DataMustAlwaysBeComplete=true;
@@ -8877,7 +8956,11 @@ void File_Mxf::InterchangeObject_InstanceUID()
                 //Merging
                 Descriptor->second.Infos.insert(Descriptor_Previous->second.Infos.begin(), Descriptor_Previous->second.Infos.end()); //TODO: better implementation
             }
+            for (std::map<std::string, Ztring>::iterator Info = Descriptor->second.Infos.begin(); Info != Descriptor->second.Infos.end(); ++Info) //Note: can not be mapped directly because there are some tests done in Descriptor_Fill
+                Descriptor_Fill(Info->first.c_str(), Info->second);
+            std::map<std::string, Ztring> Infos_Temp=Descriptors[InstanceUID].Infos; //Quick method for copying the whole descriptor without erasing the modifications made by Descriptor_Fill(). TODO: a better method in order to be more generic
             Descriptors[InstanceUID]=Descriptor->second;
+            Descriptors[InstanceUID].Infos=Infos_Temp;
             Descriptors.erase(Descriptor);
         }
         locators::iterator Locator=Locators.find(0);
@@ -9002,8 +9085,9 @@ void File_Mxf::GenericPictureEssenceDescriptor_PictureEssenceCoding()
     FILLING_BEGIN();
         Descriptors[InstanceUID].EssenceCompression=Data;
         Descriptors[InstanceUID].StreamKind=Stream_Video;
-        Descriptors[InstanceUID].Infos["Format"]=Mxf_EssenceCompression(Data);
-        Descriptors[InstanceUID].Infos["Format_Version"]=Mxf_EssenceCompression_Version(Data);
+        Descriptor_Fill("Format", Mxf_EssenceCompression(Data));
+        Descriptor_Fill("Format_Version", Mxf_EssenceCompression_Version(Data));
+        Descriptor_Fill("Format_Profile", Mxf_EssenceCompression_Profile(Data));
     FILLING_END();
 }
 
@@ -9219,7 +9303,7 @@ void File_Mxf::GenericPictureEssenceDescriptor_AspectRatio()
         if (Data)
         {
             Descriptors[InstanceUID].DisplayAspectRatio=Data;
-            Descriptors[InstanceUID].Infos["DisplayAspectRatio"].From_Number(Data, 3);
+            Descriptor_Fill("DisplayAspectRatio", Ztring().From_Number(Data, 3));
         }
     FILLING_END();
 }
@@ -9241,7 +9325,7 @@ void File_Mxf::GenericPictureEssenceDescriptor_TransferCharacteristic()
     Get_UL(Data,                                                "Data", Mxf_TransferCharacteristic);  Element_Info1(Mxf_TransferCharacteristic(Data));
 
     FILLING_BEGIN();
-        Descriptors[InstanceUID].Infos["transfer_characteristics"]=Mxf_TransferCharacteristic(Data);
+        Descriptor_Fill("transfer_characteristics", Mxf_TransferCharacteristic(Data));
     FILLING_END();
 }
 
@@ -9347,7 +9431,7 @@ void File_Mxf::GenericPictureEssenceDescriptor_ColorPrimaries()
     Get_UL(Data,                                                "Data", Mxf_ColorPrimaries);  Element_Info1(Mxf_ColorPrimaries(Data));
 
     FILLING_BEGIN();
-        Descriptors[InstanceUID].Infos["colour_primaries"]=Mxf_ColorPrimaries(Data);
+        Descriptor_Fill("colour_primaries", Mxf_ColorPrimaries(Data));
     FILLING_END();
 }
 
@@ -9360,7 +9444,7 @@ void File_Mxf::GenericPictureEssenceDescriptor_CodingEquations()
     Get_UL(Data,                                                "Data", Mxf_CodingEquations);  Element_Info1(Mxf_CodingEquations(Data));
 
     FILLING_BEGIN();
-        Descriptors[InstanceUID].Infos["matrix_coefficients"]=Mxf_CodingEquations(Data);
+        Descriptor_Fill("matrix_coefficients", Mxf_CodingEquations(Data));
     FILLING_END();
 }
 
@@ -9375,7 +9459,7 @@ void File_Mxf::GenericSoundEssenceDescriptor_QuantizationBits()
     FILLING_BEGIN();
         if (Data)
         {
-            Descriptors[InstanceUID].Infos["BitDepth"].From_Number(Data);
+            Descriptor_Fill("BitDepth", Ztring().From_Number(Data));
             Descriptors[InstanceUID].QuantizationBits=Data;
         }
     FILLING_END();
@@ -9386,7 +9470,12 @@ void File_Mxf::GenericSoundEssenceDescriptor_QuantizationBits()
 void File_Mxf::GenericSoundEssenceDescriptor_Locked()
 {
     //Parsing
-    Info_B1(Data,                                               "Data"); Element_Info1(Data?"Yes":"No");
+    int8u Data;
+    Get_B1 (Data,                                               "Data"); Element_Info1(Data?"Yes":"No");
+
+    FILLING_BEGIN();
+        Descriptor_Fill("Locked", Data?"Yes":"No");
+    FILLING_END();
 }
 
 //---------------------------------------------------------------------------
@@ -9398,7 +9487,7 @@ void File_Mxf::GenericSoundEssenceDescriptor_AudioSamplingRate()
     Get_Rational(Data); Element_Info1(Data);
 
     FILLING_BEGIN();
-        Descriptors[InstanceUID].Infos["SamplingRate"].From_Number(Data, 0);
+        Descriptor_Fill("SamplingRate", Ztring().From_Number(Data, 0));
     FILLING_END();
 }
 
@@ -9429,10 +9518,10 @@ void File_Mxf::GenericSoundEssenceDescriptor_SoundEssenceCompression()
     FILLING_BEGIN();
         Descriptors[InstanceUID].EssenceCompression=Data;
         Descriptors[InstanceUID].StreamKind=Stream_Audio;
-        Descriptors[InstanceUID].Infos["Format"]=Mxf_EssenceCompression(Data);
-        Descriptors[InstanceUID].Infos["Format_Version"]=Mxf_EssenceCompression_Version(Data);
+        Descriptor_Fill("Format", Mxf_EssenceCompression(Data));
+        Descriptor_Fill("Format_Version", Mxf_EssenceCompression_Version(Data));
         if ((Data.lo&0xFFFFFFFFFF000000LL)==0x040202017e000000LL)
-            Descriptors[InstanceUID].Infos["Format_Settings_Endianness"]=__T("Big");
+            Descriptor_Fill("Format_Settings_Endianness", "Big");
     FILLING_END();
 }
 
@@ -9446,7 +9535,7 @@ void File_Mxf::GenericSoundEssenceDescriptor_ChannelCount()
 
     FILLING_BEGIN();
         Descriptors[InstanceUID].ChannelCount=Value;
-        Descriptors[InstanceUID].Infos["Channel(s)"].From_Number(Value);
+        Descriptor_Fill("Channel(s)", Ztring().From_Number(Value));
 
         //if (Descriptors[InstanceUID].ChannelAssignment.lo!=(int64u)-1)
         //{
@@ -9803,8 +9892,9 @@ void File_Mxf::IndexTableSegment_IndexStartPosition()
                         IndexTables.erase(IndexTables.begin()+Pos);
                     else
                     {
-                        IndexTables.erase(IndexTables.begin()+IndexTables.size()-1);
-                        Element_Offset=Element_Size;
+                        //Removed in order to get all indexes, even the duplicated ones (in order to check duplicated index in the footer)
+                        //IndexTables.erase(IndexTables.begin()+IndexTables.size()-1);
+                        //Element_Offset=Element_Size;
                     }
 
                     return;
@@ -9853,8 +9943,17 @@ void File_Mxf::IndexTableSegment_8002()
 // 0x8001
 void File_Mxf::JPEG2000PictureSubDescriptor_Rsiz()
 {
-    //Parsing
-    Info_B2(Data,                                                "Data"); Element_Info1(Data);
+    #if MEDIAINFO_ADVANCED
+        //Parsing
+        int16u Data;
+        Get_B2 (Data,                                            "Data"); Element_Info1(Data);
+
+        FILLING_BEGIN();
+            Descriptors[InstanceUID].Jpeg2000_Rsiz=Data;
+        FILLING_END();
+    #else //MEDIAINFO_ADVANCED
+        Info_B2(Data,                                            "Data"); Element_Info1(Data);
+    #endif //MEDIAINFO_ADVANCED
 }
 
 //---------------------------------------------------------------------------
@@ -10039,7 +10138,7 @@ void File_Mxf::RFC5646AudioLanguageCode()
     Get_Local (Length2-(SizeIsPresent?4:0), Value,              "Value"); Element_Info1(Value);
 
     FILLING_BEGIN();
-        Descriptors[InstanceUID].Infos["Language"]=Value;
+        Descriptor_Fill("Language", Value);
     FILLING_END();
 }
 
@@ -10110,7 +10209,13 @@ void File_Mxf::MPEG2VideoDescriptor_IdenticalGOP()
 void File_Mxf::MPEG2VideoDescriptor_MaxGOP()
 {
     //Parsing
-    Info_B2(Data,                                               "Data"); Element_Info1(Data);
+    int16u Data;
+    Get_B2 (Data,                                               "Data"); Element_Info1(Data);
+
+    FILLING_BEGIN();
+        if (Data==1)
+            Descriptors[InstanceUID].Infos["Format_Settings_GOP"]=__T("N=1");
+    FILLING_END();
 }
 
 //---------------------------------------------------------------------------
@@ -10140,7 +10245,7 @@ void File_Mxf::MPEG2VideoDescriptor_ProfileAndLevel()
 
     FILLING_BEGIN();
         if (profile_and_level_indication_profile && profile_and_level_indication_level)
-            Descriptors[InstanceUID].Infos["Format_Profile"]=Ztring().From_Local(Mpegv_profile_and_level_indication_profile[profile_and_level_indication_profile])+__T("@")+Ztring().From_Local(Mpegv_profile_and_level_indication_level[profile_and_level_indication_level]);
+            Descriptor_Fill("Format_Profile", Ztring().From_UTF8(Mpegv_profile_and_level_indication_profile[profile_and_level_indication_profile])+__T("@")+Ztring().From_UTF8(Mpegv_profile_and_level_indication_level[profile_and_level_indication_level]));
     FILLING_END();
 }
 
@@ -10150,11 +10255,11 @@ void File_Mxf::Mpeg4VisualDescriptor_ProfileAndLevel()
 {
     //Parsing
     int8u profile_and_level_indication;
-    Get_B1 (profile_and_level_indication,                       "profile_and_level_indication"); Param_Info1(Mpeg4v_Profile_Level(profile_and_level_indication));
+    Get_B1 (profile_and_level_indication,                       "profile_and_level_indication"); Param_Info1(Mpeg4v_Profile_Level(profile_and_level_indication)); Element_Info1(Mpeg4v_Profile_Level(profile_and_level_indication));
 
     FILLING_BEGIN();
         if (profile_and_level_indication)
-            Descriptors[InstanceUID].Infos["Format_Profile"]=Ztring().From_Local(Mpeg4v_Profile_Level(profile_and_level_indication));
+            Descriptor_Fill("Format_Profile", Mpeg4v_Profile_Level(profile_and_level_indication));
     FILLING_END();
 }
 
@@ -10167,7 +10272,7 @@ void File_Mxf::MPEG2VideoDescriptor_BitRate()
     Get_B4 (Data,                                               "Data"); Element_Info1(Data);
 
     FILLING_BEGIN();
-        Descriptors[InstanceUID].Infos["BitRate"].From_Number(Data);
+        Descriptor_Fill("BitRate", Ztring().From_Number(Data));
     FILLING_END();
 }
 
@@ -10302,7 +10407,7 @@ void File_Mxf::PartitionMetadata()
         if (IsParsingEnd)
         {
             //Parsing only index
-            RandomIndexMetadatas_MaxOffset=File_Offset+Buffer_Offset+Element_Size+HeaderByteCount+IndexByteCount;
+            RandomIndexPacks_MaxOffset=File_Offset+Buffer_Offset+Element_Size+HeaderByteCount+IndexByteCount;
 
             //Hints
             if (File_Buffer_Size_Hint_Pointer && Buffer_Offset+Element_Size+HeaderByteCount+IndexByteCount>=Buffer_Size)
@@ -10936,11 +11041,10 @@ void File_Mxf::Track_Origin()
 {
     //Parsing
     int64u Data;
-    Get_B8 (Data,                                                "Data"); Element_Info1(Data);
+    Get_B8 (Data,                                                "Data"); Element_Info1(Data); //Note: Origin is signed but there is no signed Get_* in MediaInfo
 
     FILLING_BEGIN();
-        if (Data!=(int64u)-1)
-            Tracks[InstanceUID].Origin=Data;
+        Tracks[InstanceUID].Origin=(int64s)Data; //Origin is signed
     FILLING_END();
 }
 
@@ -10953,7 +11057,7 @@ void File_Mxf::WaveAudioDescriptor_AvgBps()
     Get_B4 (Data,                                               "Data"); Element_Info1(Data);
 
     FILLING_BEGIN();
-        Descriptors[InstanceUID].Infos["BitRate"].From_Number(Data*8);
+        Descriptor_Fill("BitRate", Ztring().From_Number(Data*8));
         Descriptors[InstanceUID].ByteRate=Data;
     FILLING_END();
 }
@@ -11084,17 +11188,42 @@ void File_Mxf::LensUnitMetadata_IrisFNumber()
     Get_B2(Value,                                               "Value");
 
     FILLING_BEGIN();
-        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(0x100000*(1-(log(float(Value))-log(2.0))/8), 0).To_UTF8());
+        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(std::pow(2, 8*(1-(float(Value)/0x10000))), 6).To_UTF8());
     FILLING_END();
 }
 
 //---------------------------------------------------------------------------
+// Big Endian - float 16 bits
+// TODO: remove it when Linux version of ZenLib is updated
+float32 BigEndian2float16lens(const char* Liste)
+{
+    //exponent      4 bit
+    //significand  12 bit
+
+    //Retrieving data
+    int16u Integer=BigEndian2int16s(Liste);
+
+    //Retrieving elements
+    int Exponent=(Integer>>12)&0x0F;
+    if (Exponent>=8)
+        Exponent=-(((~Exponent)&0x7)+1);
+    int32u Mantissa= Integer&0x0FFF;
+
+    //Some computing
+    float64 Answer=((float64)Mantissa)*std::pow((float64)10, Exponent);
+
+    return (float32)Answer;
+}
+inline float32 BigEndian2float16lens(const int8u* List) {return BigEndian2float16lens((const char*)List);}
+
+//---------------------------------------------------------------------------
 //
 void File_Mxf::LensUnitMetadata_FocusPositionFromImagePlane()
 {
     //Parsing
     float32 Value;
-    Get_BF2(Value,                                              "Value");
+    Value=BigEndian2float16lens(Buffer+Buffer_Offset+(size_t)Element_Offset);
+    Skip_B2(                                                    "Value");
 
     FILLING_BEGIN();
         AcquisitionMetadata_Add(Code2, Ztring::ToZtring(Value, 3).To_UTF8());
@@ -11107,7 +11236,8 @@ void File_Mxf::LensUnitMetadata_FocusPositionFromFrontLensVertex()
 {
     //Parsing
     float32 Value;
-    Get_BF2(Value,                                              "Value");
+    Value=BigEndian2float16lens(Buffer+Buffer_Offset+(size_t)Element_Offset);
+    Skip_B2(                                                    "Value");
 
     FILLING_BEGIN();
         AcquisitionMetadata_Add(Code2, Ztring::ToZtring(Value, 3).To_UTF8());
@@ -11133,10 +11263,11 @@ void File_Mxf::LensUnitMetadata_LensZoom35mmStillCameraEquivalent()
 {
     //Parsing
     float32 Value;
-    Get_BF2(Value,                                              "Value");
+    Value=BigEndian2float16lens(Buffer+Buffer_Offset+(size_t)Element_Offset);
+    Skip_B2(                                                    "Value");
 
     FILLING_BEGIN();
-        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(Value, 3).To_UTF8());
+        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(Value*1000, 3).To_UTF8());
     FILLING_END();
 }
 
@@ -11146,10 +11277,11 @@ void File_Mxf::LensUnitMetadata_LensZoomActualFocalLength()
 {
     //Parsing
     float32 Value;
-    Get_BF2(Value,                                              "Value");
+    Value=BigEndian2float16lens(Buffer+Buffer_Offset+(size_t)Element_Offset);
+    Skip_B2(                                                    "Value");
 
     FILLING_BEGIN();
-        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(Value, 3).To_UTF8());
+        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(Value * 1000, 3).To_UTF8());
     FILLING_END();
 }
 
@@ -11181,6 +11313,58 @@ void File_Mxf::LensUnitMetadata_LensAttributes()
 
 //---------------------------------------------------------------------------
 //
+void File_Mxf::LensUnitMetadata_IrisTNumber()
+{
+    //Parsing
+    int16u Value;
+    Get_B2(Value,                                               "Value");
+
+    FILLING_BEGIN();
+        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(std::pow(2, 8*(1-(float(Value)/0x10000))), 6).To_UTF8());
+    FILLING_END();
+}
+
+//---------------------------------------------------------------------------
+//
+void File_Mxf::LensUnitMetadata_IrisRingPosition()
+{
+    //Parsing
+    int16u Value;
+    Get_B2(Value,                                               "Value");
+
+    FILLING_BEGIN();
+        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(((float)Value)/65536*100, 4).To_UTF8());
+    FILLING_END();
+}
+
+//---------------------------------------------------------------------------
+//
+void File_Mxf::LensUnitMetadata_FocusRingPosition()
+{
+    //Parsing
+    int16u Value;
+    Get_B2(Value,                                               "Value");
+
+    FILLING_BEGIN();
+        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(((float)Value)/65536*100, 4).To_UTF8());
+    FILLING_END();
+}
+
+//---------------------------------------------------------------------------
+//
+void File_Mxf::LensUnitMetadata_ZoomRingPosition()
+{
+    //Parsing
+    int16u Value;
+    Get_B2(Value,                                               "Value");
+
+    FILLING_BEGIN();
+        AcquisitionMetadata_Add(Code2, Ztring::ToZtring(((float)Value)/65536*100, 4).To_UTF8());
+    FILLING_END();
+}
+
+//---------------------------------------------------------------------------
+//
 void File_Mxf::CameraUnitMetadata_CaptureGammaEquation()
 {
     //Parsing
@@ -11265,7 +11449,6 @@ void File_Mxf::CameraUnitMetadata_ImageSensorDimensionEffectiveWidth()
 void File_Mxf::CameraUnitMetadata_ImageSensorDimensionEffectiveHeight()
 {
     //Parsing
-    //Parsing
     int16u Value;
     Get_B2(Value,                                               "Value");
 
@@ -11530,6 +11713,48 @@ void File_Mxf::CameraUnitMetadata_ASC_CDL_V12()
 
 //---------------------------------------------------------------------------
 //
+void File_Mxf::CameraUnitMetadata_ColorMatrix()
+{
+    //Parsing
+    //Vector
+    int32u Count, Length;
+    Get_B4 (Count,                                              "Count");
+    Get_B4 (Length,                                             "Length");
+    if (Count!=9 || Length!=8)
+    {
+        Skip_XX (Length2-8,                                     "Data");
+        return;
+    }
+    int32u RR_N, RR_D, GR_N, GR_D, BR_N, BR_D, RG_N, RG_D, GG_N, GG_D, BG_N, BG_D, RB_N, RB_D, GB_N, GB_D, BB_N, BB_D;
+    Get_B4 (RR_N,                                               "RR Num");
+    Get_B4 (RR_D,                                               "RR Den");
+    Get_B4 (GR_N,                                               "GR Num");
+    Get_B4 (GR_D,                                               "GR Den");
+    Get_B4 (BR_N,                                               "BR Num");
+    Get_B4 (BR_D,                                               "BR Den");
+    Get_B4 (RG_N,                                               "RG Num");
+    Get_B4 (RG_D,                                               "RG Den");
+    Get_B4 (GG_N,                                               "GG Num");
+    Get_B4 (GG_D,                                               "GG Den");
+    Get_B4 (BG_N,                                               "BG Num");
+    Get_B4 (BG_D,                                               "BG Den");
+    Get_B4 (RB_N,                                               "RB Num");
+    Get_B4 (RB_D,                                               "RB Den");
+    Get_B4 (GB_N,                                               "GB Num");
+    Get_B4 (GB_D,                                               "GB Den");
+    Get_B4 (BB_N,                                               "BB Num");
+    Get_B4 (BB_D,                                               "BB Den");
+
+    FILLING_BEGIN();
+        Ztring ValueS=__T("RR=")+Ztring::ToZtring(((float)RR_N)/RR_D, 3)+__T(" GR=")+Ztring::ToZtring(((float)GR_N)/GR_D, 3)+__T(" BR=")+Ztring::ToZtring(((float)BR_N)/BR_D, 3)
+                   + __T(" RG=")+Ztring::ToZtring(((float)RG_N)/RG_D, 3)+__T(" GG=")+Ztring::ToZtring(((float)GG_N)/GG_D, 3)+__T(" BG=")+Ztring::ToZtring(((float)BG_N)/BG_D, 3)
+                   + __T(" RB=")+Ztring::ToZtring(((float)RB_N)/RB_D, 3)+__T(" GB=")+Ztring::ToZtring(((float)GB_N)/GB_D, 3)+__T(" BB=")+Ztring::ToZtring(((float)BB_N)/BB_D, 3);
+        AcquisitionMetadata_Add(Code2, ValueS.To_UTF8());
+    FILLING_END();
+}
+
+//---------------------------------------------------------------------------
+//
 void File_Mxf::UserDefinedAcquisitionMetadata_UdamSetIdentifier()
 {
     //Parsing
@@ -16664,13 +16889,13 @@ void File_Mxf::Locators_Test()
 #endif //defined(MEDIAINFO_REFERENCES_YES)
 
 //---------------------------------------------------------------------------
-void File_Mxf::NextRandomIndexMetadata()
+void File_Mxf::NextRandomIndexPack()
 {
     //We have the necessary for indexes, jumping to next index
     Skip_XX(Element_Size-Element_Offset,                        "Data");
-    if (RandomIndexMetadatas.empty())
+    if (RandomIndexPacks.empty())
     {
-        if (!RandomIndexMetadatas_AlreadyParsed)
+        if (!RandomIndexPacks_AlreadyParsed)
         {
             Partitions_Pos=0;
             while (Partitions_Pos<Partitions.size() && Partitions[Partitions_Pos].StreamOffset!=PartitionMetadata_PreviousPartition)
@@ -16688,12 +16913,12 @@ void File_Mxf::NextRandomIndexMetadata()
     }
     else
     {
-        GoTo(RandomIndexMetadatas[0].ByteOffset);
-        RandomIndexMetadatas.erase(RandomIndexMetadatas.begin());
+        GoTo(RandomIndexPacks[0].ByteOffset);
+        RandomIndexPacks.erase(RandomIndexPacks.begin());
         Open_Buffer_Unsynch();
     }
 
-    RandomIndexMetadatas_MaxOffset=(int64u)-1;
+    RandomIndexPacks_MaxOffset=(int64u)-1;
 }
 
 //---------------------------------------------------------------------------
@@ -16714,6 +16939,28 @@ void File_Mxf::TryToFinish()
     Finish();
 }
 
+//---------------------------------------------------------------------------
+void File_Mxf::Descriptor_Fill(const char* Name, const Ztring& Value)
+{
+    descriptor& Descriptor = Descriptors[InstanceUID];
+    std::map<std::string, Ztring>::iterator Info = Descriptor.Infos.find(Name);
+
+    //Ignore value if header partition has aleady a value
+    if (Partitions_IsFooter && InstanceUID != int128u() && Info != Descriptor.Infos.end())
+    {
+        //Test
+        if (Value != Info->second)
+            Descriptor.Infos[string(Name)+"_Footer"] = Value;
+
+        return;
+    }
+
+    if (Info == Descriptor.Infos.end())
+        Descriptor.Infos[Name] = Value;
+    else
+        Info->second = Value;
+}
+
 } //NameSpace
 
 #endif //MEDIAINFO_MXF_*
diff --git a/Source/MediaInfo/Multiple/File_Mxf.h b/Source/MediaInfo/Multiple/File_Mxf.h
index 3f864f7..806fbd7 100644
--- a/Source/MediaInfo/Multiple/File_Mxf.h
+++ b/Source/MediaInfo/Multiple/File_Mxf.h
@@ -25,7 +25,6 @@
 #include <vector>
 #include <set>
 #include <bitset>
-using namespace std;
 //---------------------------------------------------------------------------
 
 namespace MediaInfoLib
@@ -82,9 +81,9 @@ protected :
     void Streams_Finish_Essence_FillID (int32u EssenceUID, int128u TrackUID);
     void Streams_Finish_Descriptor (const int128u DescriptorUID, const int128u PackageUID);
     void Streams_Finish_Locator (const int128u DescriptorUID, const int128u LocatorUID);
-    void Streams_Finish_Component (const int128u ComponentUID, float64 EditRate, int32u TrackID, int64u Origin);
-    void Streams_Finish_Component_ForTimeCode (const int128u ComponentUID, float64 EditRate, int32u TrackID, int64u Origin, bool IsSourcePackage);
-    void Streams_Finish_Component_ForAS11 (const int128u ComponentUID, float64 EditRate, int32u TrackID, int64u Origin);
+    void Streams_Finish_Component (const int128u ComponentUID, float64 EditRate, int32u TrackID, int64s Origin);
+    void Streams_Finish_Component_ForTimeCode (const int128u ComponentUID, float64 EditRate, int32u TrackID, int64s Origin, bool IsSourcePackage);
+    void Streams_Finish_Component_ForAS11 (const int128u ComponentUID, float64 EditRate, int32u TrackID, int64s Origin);
     void Streams_Finish_Identification (const int128u IdentificationUID);
     void Streams_Finish_CommercialNames ();
 
@@ -192,7 +191,7 @@ protected :
     void ClosedCompleteFooterPartition();
     void Primer();
     void IndexTableSegment();
-    void RandomIndexMetadata();
+    void RandomIndexPack();
     void SDTI_SystemMetadataPack();
     void SDTI_PackageMetadataSet();
     void SDTI_PictureMetadataSet();
@@ -420,6 +419,10 @@ protected :
     void LensUnitMetadata_LensZoomActualFocalLength();          //8005
     void LensUnitMetadata_OpticalExtenderMagnification();       //8006
     void LensUnitMetadata_LensAttributes();                     //8007
+    void LensUnitMetadata_IrisTNumber();                        //8008
+    void LensUnitMetadata_IrisRingPosition();                   //8009
+    void LensUnitMetadata_FocusRingPosition();                  //800A
+    void LensUnitMetadata_ZoomRingPosition();                   //800B
     void CameraUnitMetadata_CaptureGammaEquation();             //3210
     void CameraUnitMetadata_AutoExposureMode();                 //8100
     void CameraUnitMetadata_AutoFocusSensingAreaSetting();      //8101
@@ -445,6 +448,7 @@ protected :
     void CameraUnitMetadata_ExposureIndexofPhotoMeter();        //8115
     void CameraUnitMetadata_GammaForCDL();                      //8116
     void CameraUnitMetadata_ASC_CDL_V12();                      //8117
+    void CameraUnitMetadata_ColorMatrix();                      //8118
     void UserDefinedAcquisitionMetadata_UdamSetIdentifier();    //E000
     void UserDefinedAcquisitionMetadata_Sony_8007();
     void UserDefinedAcquisitionMetadata_Sony_E101();
@@ -564,13 +568,13 @@ protected :
     };
 
     // Temp
-    struct randomindexmetadata
+    struct randomindexpack
     {
         int64u ByteOffset;
         int32u BodySID;
     };
-    std::vector<randomindexmetadata> RandomIndexMetadatas;
-    bool                             RandomIndexMetadatas_AlreadyParsed;
+    std::vector<randomindexpack>     RandomIndexPacks;
+    bool                             RandomIndexPacks_AlreadyParsed;
     std::set<int64u>                 PartitionPack_AlreadyParsed;
     size_t Streams_Count;
     int128u Code;
@@ -663,7 +667,7 @@ protected :
         int32u TrackNumber;
         float64 EditRate_Real; //Before demux adaptation
         float64 EditRate;
-        int64u  Origin;
+        int64s  Origin;
         bool   Stream_Finish_Done;
 
         track()
@@ -727,7 +731,7 @@ protected :
     };
     typedef std::map<int32u, essence> essences; //Key is TrackNumber
     essences Essences;
-    bitset<Stream_Max+1> StreamPos_StartAtZero; //information about the base of StreamPos (0 or 1, 1 is found in 1 file) TODO: per Essence code (last 4 bytes of the Essence header 0xTTXXTTXX)
+    std::bitset<Stream_Max+1> StreamPos_StartAtZero; //information about the base of StreamPos (0 or 1, 1 is found in 1 file) TODO: per Essence code (last 4 bytes of the Essence header 0xTTXXTTXX)
 
     //Descriptor
     struct descriptor
@@ -782,7 +786,9 @@ protected :
         bool HasMPEG2VideoDescriptor;
         bool IsAes3Descriptor;
         int32u ByteRate;
-
+        #if MEDIAINFO_ADVANCED
+            int16u Jpeg2000_Rsiz;
+        #endif //MEDIAINFO_ADVANCED
 
         //MCALabelSubDescriptor specific (including SoundfieldGroupLabelSubDescriptor...)
         int128u     MCALabelDictionaryID;
@@ -836,6 +842,9 @@ protected :
             HasMPEG2VideoDescriptor=false;
             IsAes3Descriptor=false;
             ByteRate=(int32u)-1;
+            #if MEDIAINFO_ADVANCED
+                Jpeg2000_Rsiz=(int16u)-1;
+            #endif //MEDIAINFO_ADVANCED
 
             //MCALabelSubDescriptor specific (including SoundfieldGroupLabelSubDescriptor...)
             MCALabelDictionaryID.hi=(int64u)-1;
@@ -850,6 +859,7 @@ protected :
     };
     typedef std::map<int128u, descriptor> descriptors; //Key is InstanceUID of Descriptor
     descriptors Descriptors;
+    void Descriptor_Fill(const char* Name, const Ztring& Value);
 
     //Locator
     struct locator
@@ -1101,14 +1111,14 @@ protected :
         inline void Locators_CleanUp() {}
         inline void Locators_Test() {}
     #endif //defined(MEDIAINFO_REFERENCES_YES)
-    void NextRandomIndexMetadata();
+    void NextRandomIndexPack();
     void TryToFinish();
 
     //Temp
     int128u EssenceContainer_FromPartitionMetadata;
     int64u PartitionMetadata_PreviousPartition;
     int64u PartitionMetadata_FooterPartition;
-    int64u RandomIndexMetadatas_MaxOffset;
+    int64u RandomIndexPacks_MaxOffset;
     mxftimecode MxfTimeCodeForDelay;
     mxftimecode MxfTimeCodeMaterial;
     float64 DTS_Delay; //In seconds
diff --git a/Source/MediaInfo/Multiple/File_Pmp.cpp b/Source/MediaInfo/Multiple/File_Pmp.cpp
index ab8b0ae..c264e12 100644
--- a/Source/MediaInfo/Multiple/File_Pmp.cpp
+++ b/Source/MediaInfo/Multiple/File_Pmp.cpp
@@ -38,7 +38,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Pmp_video_format(int32u video_format)
+static const char* Pmp_video_format(int32u video_format)
 {
     switch (video_format)
     {
@@ -49,7 +49,7 @@ const char* Pmp_video_format(int32u video_format)
 }
 
 //---------------------------------------------------------------------------
-const char* Pmp_audio_format(int32u audio_format)
+static const char* Pmp_audio_format(int32u audio_format)
 {
     switch (audio_format)
     {
diff --git a/Source/MediaInfo/Multiple/File_Riff.cpp b/Source/MediaInfo/Multiple/File_Riff.cpp
index 933120e..34834d5 100644
--- a/Source/MediaInfo/Multiple/File_Riff.cpp
+++ b/Source/MediaInfo/Multiple/File_Riff.cpp
@@ -935,6 +935,13 @@ void File_Riff::Header_Parse()
         if (Name==Elements::RF64)
             IsRIFF64=true;
         Get_C4 (Name,                                           "Real Name");
+
+        //Handling buggy files
+        if (Size_Complete>=8 && Size_Complete<12) //Not possible (would contain only the name of the RIFF block + the name of the sub-element, no size)
+        {
+            Size_Complete=Element_TotalSize_Get()-8;
+            Fill(Stream_General, 0, "BuggyHeader", Ztring().From_CC4(Name));
+        }
     }
 
     //Integrity
diff --git a/Source/MediaInfo/Multiple/File_Riff_Elements.cpp b/Source/MediaInfo/Multiple/File_Riff_Elements.cpp
index 88fd582..4525e62 100644
--- a/Source/MediaInfo/Multiple/File_Riff_Elements.cpp
+++ b/Source/MediaInfo/Multiple/File_Riff_Elements.cpp
@@ -2028,10 +2028,13 @@ void File_Riff::AVI__hdlr_strl_strh()
     switch (fccType)
     {
         case Elements::AVI__hdlr_strl_strh_vids :
-            if (FrameRate>0)  Fill(Stream_Video, StreamPos_Last, "FrameRate", FrameRate, 3);
+            if (FrameRate>0)  Fill(Stream_Video, StreamPos_Last, Video_FrameRate, FrameRate, 3);
+            if (Right-Left>0) Fill(Stream_Video, StreamPos_Last, Video_Width,  Right-Left, 10, true);
+            if (Bottom-Top>0) Fill(Stream_Video, StreamPos_Last, Video_Height, Bottom-Top, 10, true);
+            break;
         case Elements::AVI__hdlr_strl_strh_txts :
-            if (Right-Left>0) Fill(Stream_Text, StreamPos_Last, "Width",  Right-Left, 10, true);
-            if (Bottom-Top>0) Fill(Stream_Text, StreamPos_Last, "Height", Bottom-Top, 10, true);
+            if (Right-Left>0) Fill(Stream_Text, StreamPos_Last, Text_Width,  Right-Left, 10, true);
+            if (Bottom-Top>0) Fill(Stream_Text, StreamPos_Last, Text_Height, Bottom-Top, 10, true);
             break;
         default: ;
     }
diff --git a/Source/MediaInfo/Multiple/File_SequenceInfo.cpp b/Source/MediaInfo/Multiple/File_SequenceInfo.cpp
index bc9727e..e4583a7 100644
--- a/Source/MediaInfo/Multiple/File_SequenceInfo.cpp
+++ b/Source/MediaInfo/Multiple/File_SequenceInfo.cpp
@@ -223,7 +223,8 @@ bool File_SequenceInfo::FileHeader_Begin()
                     }
                     while (DirNumber<1000000000);
 
-                    ReferenceFiles->AddSequence(Sequence);
+                    if (!Sequence->FileNames.empty())
+                        ReferenceFiles->AddSequence(Sequence);
                 }
             }
         }
diff --git a/Source/MediaInfo/Multiple/File_Swf.cpp b/Source/MediaInfo/Multiple/File_Swf.cpp
index cc616ef..c9e1670 100644
--- a/Source/MediaInfo/Multiple/File_Swf.cpp
+++ b/Source/MediaInfo/Multiple/File_Swf.cpp
@@ -34,21 +34,21 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const int8u  Swf_SoundType[]=
+static const int8u  Swf_SoundType[]=
 {
     1,
     2,
 };
 
 //---------------------------------------------------------------------------
-const int8u  Swf_SoundSize[]=
+static const int8u  Swf_SoundSize[]=
 {
      8,
     16,
 };
 
 //---------------------------------------------------------------------------
-const int16u Swf_SoundRate[]=
+static const int16u Swf_SoundRate[]=
 {
      5500,
     11025,
@@ -57,7 +57,7 @@ const int16u Swf_SoundRate[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Swf_Format_Audio[]=
+static const char* Swf_Format_Audio[]=
 {
     "PCM",
     "ADPCM",
@@ -78,7 +78,7 @@ const char* Swf_Format_Audio[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Swf_Format_Version_Audio[]=
+static const char* Swf_Format_Version_Audio[]=
 {
     "",
     "",
@@ -99,7 +99,7 @@ const char* Swf_Format_Version_Audio[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Swf_Format_Profile_Audio[]=
+static const char* Swf_Format_Profile_Audio[]=
 {
     "",
     "",
@@ -120,7 +120,7 @@ const char* Swf_Format_Profile_Audio[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Swf_SoundFormat[]=
+static const char* Swf_SoundFormat[]=
 {
     "Uncompressed",
     "SWF ADPCM",
@@ -141,7 +141,7 @@ const char* Swf_SoundFormat[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Swf_Format_Video[]=
+static const char* Swf_Format_Video[]=
 {
     "",
     "",
@@ -162,7 +162,7 @@ const char* Swf_Format_Video[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Swf_Format_Profile_Video[]=
+static const char* Swf_Format_Profile_Video[]=
 {
     "",
     "",
@@ -183,7 +183,7 @@ const char* Swf_Format_Profile_Video[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Swf_Codec_Video[]=
+static const char* Swf_Codec_Video[]=
 {
     "",
     "",
diff --git a/Source/MediaInfo/Multiple/File_Wm_Elements.cpp b/Source/MediaInfo/Multiple/File_Wm_Elements.cpp
index 6c1b657..59cc573 100644
--- a/Source/MediaInfo/Multiple/File_Wm_Elements.cpp
+++ b/Source/MediaInfo/Multiple/File_Wm_Elements.cpp
@@ -55,7 +55,7 @@ namespace MediaInfoLib
 // Constants
 //***************************************************************************
 
-const char* Wm_CodecList_Kind(int32u Kind)
+static const char* Wm_CodecList_Kind(int32u Kind)
 {
     switch (Kind)
     {
@@ -65,7 +65,7 @@ const char* Wm_CodecList_Kind(int32u Kind)
     }
 }
 
-const char* Wm_BannerImageData_Type(int32u Type)
+static const char* Wm_BannerImageData_Type(int32u Type)
 {
     switch (Type)
     {
@@ -134,7 +134,7 @@ namespace Elements
     UUID(Mutex_Bitrate,                                         D6E22A01, 35DA, 11D1, 9034, 00A0C90349BE);
 }
 
-const char* Wm_StreamType(const int128u Kind)
+static const char* Wm_StreamType(const int128u Kind)
 {
     switch (Kind.hi)
     {
@@ -149,7 +149,7 @@ const char* Wm_StreamType(const int128u Kind)
     }
 }
 
-const char* Wm_ExclusionType(const int128u ExclusionType)
+static const char* Wm_ExclusionType(const int128u ExclusionType)
 {
     switch (ExclusionType.hi)
     {
diff --git a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.cpp b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.cpp
index 03d7386..ac2db3a 100644
--- a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.cpp
+++ b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.cpp
@@ -315,6 +315,20 @@ void File__ReferenceFilesHelper::UpdateFileName(const Ztring& OldFileName, const
     }
 }
 
+//---------------------------------------------------------------------------
+#if MEDIAINFO_ADVANCED
+void File__ReferenceFilesHelper::UpdateMetaDataFromSourceEncoding(const string& SourceEncoding, const string& Name, const string& Value)
+{
+    size_t Sequences_Size=Sequences.size();
+    for (size_t Sequences_Pos=0; Sequences_Pos<Sequences_Size; ++Sequences_Pos)
+    {
+        sequence* Sequence=Sequences[Sequences_Pos];
+
+        Sequence->UpdateMetaDataFromSourceEncoding(SourceEncoding, Name, Value);
+    }
+}
+#endif //MEDIAINFO_ADVANCED
+
 //***************************************************************************
 // Streams management
 //***************************************************************************
@@ -606,6 +620,9 @@ void File__ReferenceFilesHelper::ParseReferences()
             else
             {
                 Sequences[Sequences_Current]->Status.set(File__Analyze::IsFinished);
+                #if MEDIAINFO_EVENTS
+                    Config->Event_SubFile_Missing(Sequences[Sequences_Current]->Source);
+                #endif //MEDIAINFO_EVENTS
                 if (Sequences[Sequences_Current]->StreamKind!=Stream_Max && !Sequences[Sequences_Current]->Source.empty())
                 {
                     MI->Fill(Sequences[Sequences_Current]->StreamKind, Sequences[Sequences_Current]->StreamPos, "Source_Info", "Missing");
@@ -750,7 +767,8 @@ void File__ReferenceFilesHelper::ParseReferences()
                             else
                                 DTS_Temp=0;
                         }
-                        DTS_Temp+=(*ReferenceTemp)->Resources[(*ReferenceTemp)->Resources_Current]->Demux_Offset_DTS;
+                        if ((*ReferenceTemp)->Resources_Current<(*ReferenceTemp)->Resources.size())
+                            DTS_Temp+=(*ReferenceTemp)->Resources[(*ReferenceTemp)->Resources_Current]->Demux_Offset_DTS;
                         if (DTS_Minimal>DTS_Temp)
                             DTS_Minimal=DTS_Temp;
                     }
@@ -927,6 +945,9 @@ bool File__ReferenceFilesHelper::ParseReference_Init()
         #endif //MEDIAINFO_EVENTS
         if (!Sequences[Sequences_Current]->MI->Open(Sequences[Sequences_Current]->FileNames.Read()))
         {
+            #if MEDIAINFO_EVENTS
+                Config->Event_SubFile_Missing(Sequences[Sequences_Current]->Source);
+            #endif //MEDIAINFO_EVENTS
             if (Sequences[Sequences_Current]->StreamKind!=Stream_Max)
                 MI->Fill(Sequences[Sequences_Current]->StreamKind, Sequences[Sequences_Current]->StreamPos, "Source_Info", "Missing", Unlimited, true, true);
             if (!Config->File_KeepInfo_Get())
@@ -1185,6 +1206,9 @@ void File__ReferenceFilesHelper::ParseReference_Finalize_PerStream ()
         int64u FrameCount_Temp=0;
         int64u StreamSize_Temp=0;
         int64u FileSize_Temp=0;
+        #if MEDIAINFO_ADVANCED
+            std::vector<string> Format_Profiles_FromStream, Format_Profiles_FromContainer, Format_Profiles_FromPlaylist;
+        #endif //MEDIAINFO_ADVANCED
         for (size_t Pos=0; Pos<Sequences[Sequences_Current]->Resources.size(); Pos++)
         {
             MediaInfo_Internal MI2;
@@ -1235,7 +1259,65 @@ void File__ReferenceFilesHelper::ParseReference_Finalize_PerStream ()
                 FileSize_Temp=(int64u)-1;
                 break;
             }
+
+            #if MEDIAINFO_ADVANCED
+                //Profile
+                map<string, string>::iterator MetadataFromPlaylist_Item=Sequences[Sequences_Current]->Resources[Pos]->MetadataFromPlaylist.find("Format_Profile");
+                if (MetadataFromPlaylist_Item!=Sequences[Sequences_Current]->Resources[Pos]->MetadataFromPlaylist.end())
+                    Format_Profiles_FromPlaylist.push_back(MetadataFromPlaylist_Item->second);
+                else
+                    Format_Profiles_FromPlaylist.push_back(string());
+                Format_Profiles_FromContainer.push_back(MI2.Get(StreamKind_Last, StreamPos_From, __T("Format_Profile_FromContainer")).To_UTF8());
+                Format_Profiles_FromStream.push_back(MI2.Get(StreamKind_Last, StreamPos_From, MI->Fill_Parameter(StreamKind_Last, Generic_Format_Profile)).To_UTF8());
+            #endif //MEDIAINFO_ADVANCED
         }
+        #if MEDIAINFO_ADVANCED
+            //Test of coherency between Playlist and Stream
+            //Test of same values for all resources
+            bool Format_Profile_NotSame=false;
+            bool Format_Profile_CoherencyIssue=false;
+            bool Format_Profile_FromContainer_IsPresent=false;
+            for (size_t Pos=0; Pos<Format_Profiles_FromStream.size(); Pos++)
+            {
+                if (Format_Profiles_FromStream[Pos]!=Format_Profiles_FromStream[0])
+                    Format_Profile_NotSame=true;
+                if (!Format_Profiles_FromPlaylist[Pos].empty() && Format_Profiles_FromStream[Pos]!=Format_Profiles_FromPlaylist[Pos])
+                    Format_Profile_CoherencyIssue=true;
+                if (!Format_Profiles_FromContainer[Pos].empty())
+                    Format_Profile_FromContainer_IsPresent=true;
+            }
+            if (Format_Profile_NotSame)
+            {
+                MI->Clear(StreamKind_Last, StreamPos_To, "Format_Profile");
+                for (size_t Pos=0; Pos<Format_Profiles_FromStream.size(); Pos++)
+                    MI->Fill(StreamKind_Last, StreamPos_To, "Format_Profile", Format_Profiles_FromStream[Pos]);
+                MI->Fill(StreamKind_Last, StreamPos_To, "Format_Profile_EssencesMismatch", "Yes");
+            }
+            if (Format_Profile_CoherencyIssue)
+            {
+                MI->Clear(StreamKind_Last, StreamPos_To, "Format_Profile_FromStream");
+                if (Format_Profile_FromContainer_IsPresent)
+                    MI->Clear(StreamKind_Last, StreamPos_To, "Format_Profile_FromContainer");
+                MI->Clear(StreamKind_Last, StreamPos_To, "Format_Profile_FromPlaylist");
+                for (size_t Pos=0; Pos<Format_Profiles_FromStream.size(); Pos++)
+                {
+                    MI->Fill(StreamKind_Last, StreamPos_To, "Format_Profile_FromStream", Format_Profiles_FromStream[Pos]);
+                    if (Format_Profile_FromContainer_IsPresent)
+                        MI->Fill(StreamKind_Last, StreamPos_To, "Format_Profile_FromContainer", Format_Profiles_FromContainer[Pos].empty()?Format_Profiles_FromStream[Pos]:Format_Profiles_FromContainer[Pos]);
+                    MI->Fill(StreamKind_Last, StreamPos_To, "Format_Profile_FromPlaylist", Format_Profiles_FromPlaylist[Pos]);
+                }
+            }
+            else if (Format_Profile_FromContainer_IsPresent)
+            {
+                MI->Clear(StreamKind_Last, StreamPos_To, "Format_Profile_FromStream");
+                MI->Clear(StreamKind_Last, StreamPos_To, "Format_Profile_FromContainer");
+                for (size_t Pos=0; Pos<Format_Profiles_FromStream.size(); Pos++)
+                {
+                    MI->Fill(StreamKind_Last, StreamPos_To, "Format_Profile_FromStream", Format_Profiles_FromStream[Pos]);
+                    MI->Fill(StreamKind_Last, StreamPos_To, "Format_Profile_FromContainer", Format_Profiles_FromContainer[Pos].empty()?Format_Profiles_FromStream[Pos]:Format_Profiles_FromContainer[Pos]);
+                }
+            }
+        #endif //MEDIAINFO_ADVANCED
 
         if (Duration_Temp!=(int64u)-1)
             MI->Fill(StreamKind_Last, StreamPos_To, MI->Fill_Parameter(StreamKind_Last, Generic_Duration), Duration_Temp, 10, true);
@@ -1286,7 +1368,7 @@ void File__ReferenceFilesHelper::ParseReference_Finalize_PerStream ()
             {
                 Sequences[Sequences_Current]->MenuPos=MI->Stream_Prepare(Stream_Menu);
                 MI->Fill(Stream_Menu, Sequences[Sequences_Current]->MenuPos, General_ID, ID_Base);
-                MI->Fill(Stream_Menu, Sequences[Sequences_Current]->StreamPos, "Source", Sequences[Sequences_Current]->Source);
+                MI->Fill(Stream_Menu, Sequences[Sequences_Current]->MenuPos, "Source", Sequences[Sequences_Current]->Source);
             }
             Ztring List=Sequences[Sequences_Current]->MI->Get(StreamKind_Last, StreamPos_From, General_ID);
             Ztring List_String=Sequences[Sequences_Current]->MI->Get(StreamKind_Last, StreamPos_From, General_ID_String);
@@ -1471,6 +1553,8 @@ MediaInfo_Internal* File__ReferenceFilesHelper::MI_Create()
 {
     //Configuration
     MediaInfo_Internal* MI_Temp=new MediaInfo_Internal();
+    for (std::map<string, Ztring>::iterator Config_Item=Sequences[Sequences_Current]->Config.begin(); Config_Item!=Sequences[Sequences_Current]->Config.end(); ++Config_Item)
+        MI_Temp->Option(Ztring().From_UTF8(Config_Item->first.c_str()), Config_Item->second);
     MI_Temp->Option(__T("File_IsReferenced"), __T("1"));
     MI_Temp->Option(__T("File_FileNameFormat"), __T("CSV"));
     MI_Temp->Option(__T("File_KeepInfo"), __T("1"));
@@ -1593,6 +1677,11 @@ void File__ReferenceFilesHelper::Read_Buffer_Unsynched()
         DTS_Minimal=(int64u)-1;
         Config->Demux_EventWasSent=true; //We want not try to read new data from the file
     #endif //MEDIAINFO_DEMUX
+
+    #if MEDIAINFO_EVENTS
+        if (Config->Config_PerPackage)
+            Config->Config_PerPackage->Unsynch();
+    #endif //MEDIAINFO_EVENTS
 }
 
 //---------------------------------------------------------------------------
@@ -1634,13 +1723,21 @@ size_t File__ReferenceFilesHelper::Seek (size_t Method, int64u Value, int64u ID)
                             //Init
                             if (!Duration)
                             {
+                                Ztring FileName;
+                                if (HasMainFile)
+                                    for (size_t Sequences_Pos = 0; Sequences_Pos < Sequences.size(); Sequences_Pos++)
+                                        if (Sequences[Sequences_Pos]->IsMain && !Sequences[Sequences_Pos]->FileNames.empty())
+                                            FileName=Sequences[Sequences_Pos]->FileNames[0];
+                                if (FileName.empty())
+                                    FileName=MI->File_Name;
+
                                 MediaInfo_Internal MI2;
                                 MI2.Option(__T("File_KeepInfo"), __T("1"));
                                 Ztring ParseSpeed_Save=MI2.Option(__T("ParseSpeed_Get"), __T(""));
                                 Ztring Demux_Save=MI2.Option(__T("Demux_Get"), __T(""));
                                 MI2.Option(__T("ParseSpeed"), __T("0"));
                                 MI2.Option(__T("Demux"), Ztring());
-                                size_t MiOpenResult=MI2.Open(MI->File_Name);
+                                size_t MiOpenResult=MI2.Open(FileName);
                                 MI2.Option(__T("ParseSpeed"), ParseSpeed_Save); //This is a global value, need to reset it. TODO: local value
                                 MI2.Option(__T("Demux"), Demux_Save); //This is a global value, need to reset it. TODO: local value
                                 if (!MiOpenResult)
@@ -1721,13 +1818,21 @@ size_t File__ReferenceFilesHelper::Seek (size_t Method, int64u Value, int64u ID)
                         //Init
                         if (!Duration)
                         {
+                            Ztring FileName;
+                            if (HasMainFile)
+                                for (size_t Sequences_Pos = 0; Sequences_Pos < Sequences.size(); Sequences_Pos++)
+                                    if (Sequences[Sequences_Pos]->IsMain && !Sequences[Sequences_Pos]->FileNames.empty())
+                                        FileName=Sequences[Sequences_Pos]->FileNames[0];
+                            if (FileName.empty())
+                                FileName=MI->File_Name;
+
                             MediaInfo_Internal MI2;
                             MI2.Option(__T("File_KeepInfo"), __T("1"));
                             Ztring ParseSpeed_Save=MI2.Option(__T("ParseSpeed_Get"), __T(""));
                             Ztring Demux_Save=MI2.Option(__T("Demux_Get"), __T(""));
                             MI2.Option(__T("ParseSpeed"), __T("0"));
                             MI2.Option(__T("Demux"), Ztring());
-                            size_t MiOpenResult=MI2.Open(MI->File_Name);
+                            size_t MiOpenResult=MI2.Open(FileName);
                             MI2.Option(__T("ParseSpeed"), ParseSpeed_Save); //This is a global value, need to reset it. TODO: local value
                             MI2.Option(__T("Demux"), Demux_Save); //This is a global value, need to reset it. TODO: local value
                             if (!MiOpenResult)
diff --git a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.h b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.h
index ac04585..a0ba96c 100644
--- a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.h
+++ b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.h
@@ -34,6 +34,7 @@ public :
     //In
     void                            AddSequence(sequence* NewSequence);
     void                            UpdateFileName(const Ztring& OldFileName, const Ztring& NewFileName);
+    void                            UpdateMetaDataFromSourceEncoding(const string& SourceEncoding, const string& Name, const string& Value);
     bool                            TestContinuousFileNames;
     bool                            ContainerHasNoId;
     int64u                          ID_Max;
diff --git a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Resource.cpp b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Resource.cpp
index bd45c4b..601f5d9 100644
--- a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Resource.cpp
+++ b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Resource.cpp
@@ -88,6 +88,17 @@ void resource::UpdateFileName(const Ztring& OldFileName, const Ztring& NewFileNa
             FileNames[Pos]=NewFileName;
 }
 
+//---------------------------------------------------------------------------
+#if MEDIAINFO_ADVANCED
+void resource::UpdateMetaDataFromSourceEncoding(const string& SourceEncoding, const string& Name, const string& Value)
+{
+    size_t SourceEncoding_Size=SourceEncodings.size();
+    for (size_t Pos=0; Pos<SourceEncoding_Size; Pos++)
+        if (SourceEncodings[Pos]==SourceEncoding)
+            MetadataFromPlaylist[Name]=Value;
+}
+#endif //MEDIAINFO_ADVANCED
+
 } //NameSpace
 
 #endif //MEDIAINFO_REFERENCES_YES
diff --git a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Resource.h b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Resource.h
index 552da0f..666394a 100644
--- a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Resource.h
+++ b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Resource.h
@@ -33,6 +33,11 @@ public:
     //In
     void                            UpdateFileName(const Ztring& OldFileName, const Ztring& NewFileName);
     ZtringList                      FileNames; //Source file name (relative path)
+    #if MEDIAINFO_ADVANCED
+    void                            UpdateMetaDataFromSourceEncoding(const string& SourceEncoding, const string& Name, const string& Value);
+    std::vector<string>             SourceEncodings; //Source unique IDs, associated to a file name
+    std::map<string, string>        MetadataFromPlaylist;
+    #endif //MEDIAINFO_ADVANCED
     float64                         EditRate;
     int64u                          IgnoreEditsBefore;
     int64u                          IgnoreEditsAfter;
diff --git a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Sequence.cpp b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Sequence.cpp
index c7dff78..bed97ad 100644
--- a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Sequence.cpp
+++ b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Sequence.cpp
@@ -120,6 +120,20 @@ void sequence::UpdateFileName(const Ztring& OldFileName, const Ztring& NewFileNa
 }
 
 //---------------------------------------------------------------------------
+#if MEDIAINFO_ADVANCED
+void sequence::UpdateMetaDataFromSourceEncoding(const string& SourceEncoding, const string& Name, const string& Value)
+{
+    size_t Resources_Size=Resources.size();
+    for (size_t Resources_Pos=0; Resources_Pos<Resources_Size; ++Resources_Pos)
+    {
+        resource* Resource=Resources[Resources_Pos];
+
+        Resource->UpdateMetaDataFromSourceEncoding(SourceEncoding, Name, Value);
+    }
+}
+#endif //MEDIAINFO_ADVANCED
+
+//---------------------------------------------------------------------------
 void sequence::FrameRate_Set(float64 NewFrameRate)
 {
     FrameRate=NewFrameRate;
diff --git a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Sequence.h b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Sequence.h
index 1b7ade4..fc0d9c3 100644
--- a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Sequence.h
+++ b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper_Sequence.h
@@ -37,12 +37,16 @@ public:
     void                            AddFileName(const Ztring& FileName, size_t Pos=(size_t)-1);
     void                            AddResource(resource* NewResource, size_t Pos=(size_t)-1);
     void                            UpdateFileName(const Ztring& OldFileName, const Ztring& NewFileName);
+    #if MEDIAINFO_ADVANCED
+    void                            UpdateMetaDataFromSourceEncoding(const string& SourceEncoding, const string& Name, const string& Value);
+    #endif //MEDIAINFO_ADVANCED
     stream_t                        StreamKind;
     size_t                          StreamPos;
     int64u                          StreamID;
     size_t                          MenuPos;
     bool                            Enabled;
     bool                            IsMain;
+    std::map<std::string, Ztring>   Config;
     std::map<std::string, Ztring>   Infos;
     void                            FrameRate_Set(float64 NewFrameRate);
 
diff --git a/Source/MediaInfo/Reader/Reader_File.cpp b/Source/MediaInfo/Reader/Reader_File.cpp
index efec908..53b1c4c 100644
--- a/Source/MediaInfo/Reader/Reader_File.cpp
+++ b/Source/MediaInfo/Reader/Reader_File.cpp
@@ -510,6 +510,8 @@ size_t Reader_File::Format_Test_PerParser_Continue (MediaInfo_Internal* MI)
                     MI->Config.File_Buffer_Size_Max=1;
                 while (MI->Config.File_Buffer_Size_ToRead>MI->Config.File_Buffer_Size_Max)
                     MI->Config.File_Buffer_Size_Max*=2;
+                if (MI->Config.File_Buffer_Size_Max>=64*1024*1024)
+                    MI->Config.File_Buffer_Size_Max=64*1024*1024; //limitation of the buffer in order to avoid to big memory usage
                 MI->Config.File_Buffer=new int8u[MI->Config.File_Buffer_Size_Max];
             }
 
@@ -533,11 +535,18 @@ size_t Reader_File::Format_Test_PerParser_Continue (MediaInfo_Internal* MI)
                     F.Open(MI->Config.File_Names[MI->Config.File_Names_Pos]);
                     while (!F.Opened_Get())
                     {
+                        #if MEDIAINFO_EVENTS
+                            MI->Config.Event_SubFile_Missing_Absolute(MI->Config.File_Names[MI->Config.File_Names_Pos]);
+                        #endif //MEDIAINFO_EVENTS
                         if (MI->Config.File_Names_Pos+1<MI->Config.File_Names.size())
                         {
                             MI->Config.File_Names_Pos++;
                             F.Open(MI->Config.File_Names[MI->Config.File_Names_Pos]);
                         }
+                        else //break the otherwise infinite loop
+                        {
+                            break;
+                        }
                     }
                     if (MI->Config.File_Names_Pos>=MI->Config.File_Sizes.size())
                     {
@@ -654,26 +663,22 @@ size_t Reader_File::Format_Test_PerParser_Continue (MediaInfo_Internal* MI)
             {
                 for (size_t CountOfSeconds=0; CountOfSeconds<(size_t)MI->Config.File_GrowingFile_Delay_Get(); CountOfSeconds++)
                 {
-                    if (MI->Config.File_Names.size()==1)
-                    {
-                        Growing_Temp=F.Size_Get();
-                        if (MI->Config.File_Size!=Growing_Temp)
-                        {
-                            MI->Config.File_Current_Size=MI->Config.File_Size=Growing_Temp;
-                            MI->Open_Buffer_Init(MI->Config.File_Size, MI->Config.File_Current_Offset+F.Position_Get()-MI->Config.File_Buffer_Size);
-                            break;
-                        }
-                    }
-                    else
+                    int64u LastFile_Size_Old=MI->Config.File_Sizes[MI->Config.File_Sizes.size()-1];
+                    size_t Files_Count_Old=MI->Config.File_Names.size();
+                    MI->TestContinuousFileNames();
+                    int64u LastFile_Size_New=F.Size_Get();
+                    size_t Files_Count_New=MI->Config.File_Names.size();
+
+                    if (LastFile_Size_New!=LastFile_Size_Old || Files_Count_New!=Files_Count_Old)
                     {
-                        Growing_Temp=MI->Config.File_Names.size();
-                        MI->TestContinuousFileNames();
-                        if (MI->Config.File_Names.size()!=Growing_Temp)
+                        if (MI->Config.File_Names.size()==1) //if more than 1 file, file size config is already done in TestContinuousFileNames()
                         {
+                            MI->Config.File_Current_Size=MI->Config.File_Size=LastFile_Size_New;
                             MI->Open_Buffer_Init(MI->Config.File_Size, MI->Config.File_Current_Offset+F.Position_Get()-MI->Config.File_Buffer_Size);
-                            break;
                         }
+                        break;
                     }
+
                     #ifdef WINDOWS
                         Sleep(1000);
                     #endif //WINDOWS
diff --git a/Source/MediaInfo/Reader/Reader_libcurl.cpp b/Source/MediaInfo/Reader/Reader_libcurl.cpp
index 98f3b1c..d2f2b92 100644
--- a/Source/MediaInfo/Reader/Reader_libcurl.cpp
+++ b/Source/MediaInfo/Reader/Reader_libcurl.cpp
@@ -190,7 +190,7 @@ struct Reader_libcurl::curl_data
     bool                Ssh_IgnoreSecurity;
     bool                Init_AlreadyDone;
     bool                Init_NotAFile;
-#if MEDIAINFO_NEXTPACKET
+    #if MEDIAINFO_NEXTPACKET
         bool            NextPacket;
     #endif //MEDIAINFO_NEXTPACKET
     time_t              Time_Max;
diff --git a/Source/MediaInfo/Setup.h b/Source/MediaInfo/Setup.h
index ad86d55..d128632 100644
--- a/Source/MediaInfo/Setup.h
+++ b/Source/MediaInfo/Setup.h
@@ -322,6 +322,20 @@
         #define MEDIAINFO_READTHREAD 1
     #endif
 #endif
+#if !defined(MEDIAINFO_FIXITY)
+    #if defined(MEDIAINFO_FIXITY_NO) && defined(MEDIAINFO_FIXITY_YES)
+        #undef MEDIAINFO_FIXITY_NO //MEDIAINFO_FIXITY_YES has priority
+    #endif
+    #if defined(MEDIAINFO_FIXITY_NO)
+        #define MEDIAINFO_FIXITY 0
+    #else
+        #if MEDIAINFO_ADVANCED
+            #define MEDIAINFO_FIXITY 1
+        #else //MEDIAINFO_ADVANCED
+            #define MEDIAINFO_FIXITY 0
+        #endif //MEDIAINFO_ADVANCED
+    #endif
+#endif
 
 //***************************************************************************
 // Precise configuration
diff --git a/Source/MediaInfo/Text/File_AribStdB24B37.cpp b/Source/MediaInfo/Text/File_AribStdB24B37.cpp
index 50b56bb..38cd78f 100644
--- a/Source/MediaInfo/Text/File_AribStdB24B37.cpp
+++ b/Source/MediaInfo/Text/File_AribStdB24B37.cpp
@@ -30,6 +30,11 @@
     #undef __TEXT
     #include "windows.h"
 #endif // __WINDOWS__
+
+#if MEDIAINFO_EVENTS
+    #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
+    #include "MediaInfo/MediaInfo_Events_Internal.h"
+#endif //MEDIAINFO_EVENTS
 //---------------------------------------------------------------------------
 
 namespace MediaInfoLib
@@ -40,7 +45,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_Caption_conversion_type(int8u Caption_conversion_type)
+static const char* AribStdB24B37_Caption_conversion_type(int8u Caption_conversion_type)
 {
     switch (Caption_conversion_type)
     {
@@ -54,7 +59,7 @@ const char* AribStdB24B37_Caption_conversion_type(int8u Caption_conversion_type)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_Caption_DataIdentifier(int8u DataIdentifier)
+static const char* AribStdB24B37_Caption_DataIdentifier(int8u DataIdentifier)
 {
     switch (DataIdentifier)
     {
@@ -71,7 +76,7 @@ const char* AribStdB24B37_Caption_DataIdentifier(int8u DataIdentifier)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_DRCS_conversion_type(int8u DRCS_conversion_type)
+static const char* AribStdB24B37_DRCS_conversion_type(int8u DRCS_conversion_type)
 {
     switch (DRCS_conversion_type)
     {
@@ -84,7 +89,7 @@ const char* AribStdB24B37_DRCS_conversion_type(int8u DRCS_conversion_type)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_data_group_id(int8u data_group_id)
+static const char* AribStdB24B37_data_group_id(int8u data_group_id)
 {
     switch (data_group_id)
     {
@@ -102,7 +107,7 @@ const char* AribStdB24B37_data_group_id(int8u data_group_id)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_TMD(int8u TMD)
+static const char* AribStdB24B37_TMD(int8u TMD)
 {
     switch (TMD)
     {
@@ -114,7 +119,7 @@ const char* AribStdB24B37_TMD(int8u TMD)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_DMF_reception(int8u DMF_reception)
+static const char* AribStdB24B37_DMF_reception(int8u DMF_reception)
 {
     switch (DMF_reception)
     {
@@ -127,7 +132,7 @@ const char* AribStdB24B37_DMF_reception(int8u DMF_reception)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_DMF_recording(int8u DMF_recording)
+static const char* AribStdB24B37_DMF_recording(int8u DMF_recording)
 {
     switch (DMF_recording)
     {
@@ -139,7 +144,7 @@ const char* AribStdB24B37_DMF_recording(int8u DMF_recording)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_format(int8u format)
+static const char* AribStdB24B37_format(int8u format)
 {
     switch (format)
     {
@@ -161,7 +166,7 @@ const char* AribStdB24B37_format(int8u format)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_TCS(int8u TCS)
+static const char* AribStdB24B37_TCS(int8u TCS)
 {
     switch (TCS)
     {
@@ -172,7 +177,7 @@ const char* AribStdB24B37_TCS(int8u TCS)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_rollup_mode(int8u rollup_mode)
+static const char* AribStdB24B37_rollup_mode(int8u rollup_mode)
 {
     switch (rollup_mode)
     {
@@ -183,7 +188,7 @@ const char* AribStdB24B37_rollup_mode(int8u rollup_mode)
 }
 
 //---------------------------------------------------------------------------
-const char* AribStdB24B37_data_unit_parameter(int8u data_unit_parameter)
+static const char* AribStdB24B37_data_unit_parameter(int8u data_unit_parameter)
 {
     switch (data_unit_parameter)
     {
@@ -248,7 +253,7 @@ static const int8u AribStdB24B37_DefaultMacros_size[] =
 // for each data byte do
 //     CRC_CCIT_Xmodem=(CRC_CCIT_Xmodem<<8) ^ CRC_CCIT_Xmodem_Table[(CRC_CCIT_Xmodem>>8)^(data_byte)];
 // Array built with the help of http://www.sanity-free.com/133/crc_16_ccitt_in_csharp.html
-int16u AribStdB24B37_CRC_CCIT_Xmodem_Table[256] =
+static int16u AribStdB24B37_CRC_CCIT_Xmodem_Table[256] =
 {
     0x0000, 0x1021, 0x2042, 0x3063,
     0x4084, 0x50A5, 0x60C6, 0x70E7,
@@ -335,6 +340,9 @@ File_AribStdB24B37::File_AribStdB24B37()
     HasCcis=false;
     ParseCcis=false;
     IsAncillaryData=false;
+    #if MEDIAINFO_EVENTS
+        MuxingMode=(int8u)-1;
+    #endif //MEDIAINFO_EVENTS
 
     //Config
     Caption_conversion_type=(int8u)-1;
@@ -722,6 +730,28 @@ void File_AribStdB24B37::caption_statement() //caption_data()
         Element_End0();
     }
 
+    // Output
+    #if MEDIAINFO_EVENTS
+            if (MuxingMode==(int8u)-1)
+            {
+                if (StreamIDs_Size>=6 && ParserIDs[StreamIDs_Size-6]==MediaInfo_Parser_Mxf && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_MpegTs)
+                    MuxingMode=HasCcis?9:8; // "Ancillary data / CCIS" or "Ancillary data"
+                else
+                    MuxingMode=HasCcis?7:(int8u)-1; // "CCIS" or nothing
+            }
+        Frame_Count_NotParsedIncluded=Frame_Count;
+        EVENT_BEGIN (Global, SimpleText, 0)
+            Event.Content=Streams[(size_t)(Element_Code-1)].Line.c_str();
+            Event.Flags=0;
+            Event.MuxingMode=MuxingMode;
+            Event.Service=(int8u)Element_Code;
+            Event.Row_Max=0;
+            Event.Column_Max=0;
+            Event.Row_Values=NULL;
+            Event.Row_Attributes=NULL;
+        EVENT_END   ()
+    #endif //MEDIAINFO_EVENTS
+
     Frame_Count++;
     Frame_Count_NotParsedIncluded++;
 }
diff --git a/Source/MediaInfo/Text/File_AribStdB24B37.h b/Source/MediaInfo/Text/File_AribStdB24B37.h
index 8170ab0..4834681 100644
--- a/Source/MediaInfo/Text/File_AribStdB24B37.h
+++ b/Source/MediaInfo/Text/File_AribStdB24B37.h
@@ -37,6 +37,9 @@ public :
     bool    HasCcis;
     bool    ParseCcis;
     bool    IsAncillaryData;
+    #if MEDIAINFO_EVENTS
+        int8u   MuxingMode;
+    #endif //MEDIAINFO_EVENTS
 
     //enums
     enum graphic_set
diff --git a/Source/MediaInfo/Text/File_Cdp.cpp b/Source/MediaInfo/Text/File_Cdp.cpp
index 7466fa7..f543b62 100644
--- a/Source/MediaInfo/Text/File_Cdp.cpp
+++ b/Source/MediaInfo/Text/File_Cdp.cpp
@@ -42,7 +42,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Cdp_cc_type(int8u cc_type)
+static const char* Cdp_cc_type(int8u cc_type)
 {
     switch (cc_type)
     {
@@ -55,7 +55,7 @@ const char* Cdp_cc_type(int8u cc_type)
 }
 
 //---------------------------------------------------------------------------
-float32 Cdp_cdp_frame_rate(int8u cdp_frame_rate)
+static float32 Cdp_cdp_frame_rate(int8u cdp_frame_rate)
 {
     switch (cdp_frame_rate)
     {
diff --git a/Source/MediaInfo/Text/File_DtvccTransport.cpp b/Source/MediaInfo/Text/File_DtvccTransport.cpp
index 0da3c4b..9a1b4fe 100644
--- a/Source/MediaInfo/Text/File_DtvccTransport.cpp
+++ b/Source/MediaInfo/Text/File_DtvccTransport.cpp
@@ -46,7 +46,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* DtvccTransport_cc_type (int8u cc_type)
+static const char* DtvccTransport_cc_type (int8u cc_type)
 {
     switch (cc_type)
     {
diff --git a/Source/MediaInfo/Text/File_DvbSubtitle.cpp b/Source/MediaInfo/Text/File_DvbSubtitle.cpp
index d68ff8c..0dccd30 100644
--- a/Source/MediaInfo/Text/File_DvbSubtitle.cpp
+++ b/Source/MediaInfo/Text/File_DvbSubtitle.cpp
@@ -32,7 +32,7 @@ namespace MediaInfoLib
 // Info
 //***************************************************************************
 
-const int8u DvbSubtitle_region_depth[8]=
+static const int8u DvbSubtitle_region_depth[8]=
 {
     0,
     2,
diff --git a/Source/MediaInfo/Text/File_Eia608.cpp b/Source/MediaInfo/Text/File_Eia608.cpp
index efbdafe..096d752 100644
--- a/Source/MediaInfo/Text/File_Eia608.cpp
+++ b/Source/MediaInfo/Text/File_Eia608.cpp
@@ -23,6 +23,10 @@
 //---------------------------------------------------------------------------
 #include "MediaInfo/Text/File_Eia608.h"
 #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
+#if MEDIAINFO_EVENTS
+    #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
+    #include "MediaInfo/MediaInfo_Events_Internal.h"
+#endif //MEDIAINFO_EVENTS
 using namespace std;
 //---------------------------------------------------------------------------
 
@@ -70,6 +74,9 @@ File_Eia608::File_Eia608()
 
     //In
     cc_type=(int8u)-1;
+    #if MEDIAINFO_EVENTS
+        MuxingMode=(int8u)-1;
+    #endif //MEDIAINFO_EVENTS
 
     //Temp
     XDS_Level=(size_t)-1;
@@ -213,6 +220,29 @@ void File_Eia608::Read_Buffer_Init()
             FrameInfo.PTS=0;
     }
 
+    #if MEDIAINFO_EVENTS
+        if (MuxingMode==(int8u)-1)
+        {
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Mpegv && StreamIDs[StreamIDs_Size-3]==0x4741393400000003LL)
+                MuxingMode=0; //A/53 / DTVCC Transport
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Mpegv && StreamIDs[StreamIDs_Size-3]==0x0000000300000000LL)
+                MuxingMode=1; //SCTE 20
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Mpegv && StreamIDs[StreamIDs_Size-3]==0x434301F800000000LL)
+                MuxingMode=2; //DVD-Video
+            if (StreamIDs_Size>=4 && (ParserIDs[StreamIDs_Size-4]==MediaInfo_Parser_Gxf || ParserIDs[StreamIDs_Size-4]==MediaInfo_Parser_Lxf || ParserIDs[StreamIDs_Size-4]==MediaInfo_Parser_Mxf) && ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_Cdp)
+                MuxingMode=3; //Ancillary data / CDP
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Avc)
+                MuxingMode=4; //SCTE 128 / DTVCC Transport
+            if (StreamIDs_Size>=2 && ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_DvDif)
+                MuxingMode=5; //DV
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Mpeg4 && ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_Cdp)
+                MuxingMode=6; //Final Cut / CDP
+            if (StreamIDs_Size>=2 && ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_Scc)
+                MuxingMode=10; //SCC
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Mpeg4 && ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_Mpeg4)
+                MuxingMode=14; //Final Cut / cdat
+        }
+    #endif //MEDIAINFO_EVENTS
 }
 
 //---------------------------------------------------------------------------
@@ -544,6 +574,7 @@ void File_Eia608::Special(int8u cc_data_1, int8u cc_data_2)
     }
 
     cc_data_1&=0xF7;
+
     if (cc_data_1==0x15 && (cc_data_2&0xF0)==0x20)
         cc_data_1=0x14;
 
@@ -1089,6 +1120,24 @@ void File_Eia608::Character_Fill(wchar_t Character)
 //---------------------------------------------------------------------------
 void File_Eia608::HasChanged()
 {
+    #if MEDIAINFO_EVENTS
+            size_t StreamPos=TextMode*2+DataChannelMode;
+            if (StreamPos<Streams.size() && Streams[StreamPos])
+            EVENT_BEGIN (Eia608, CC_Content, 0)
+                Event.Field=1+cc_type;
+                Event.MuxingMode=MuxingMode;
+                Event.Service=1+(TextMode?1:0)*2+(DataChannelMode?1:0);
+                for (size_t Pos_Y=0; Pos_Y<Streams[StreamPos]->CC_Displayed.size(); Pos_Y++)
+                {
+                    for (size_t Pos_X=0; Pos_X<Streams[StreamPos]->CC_Displayed[Pos_Y].size(); Pos_X++)
+                    {
+                        Event.Row_Values[Pos_Y][Pos_X]=Streams[StreamPos]->CC_Displayed[Pos_Y][Pos_X].Value;
+                        Event.Row_Attributes[Pos_Y][Pos_X]=Streams[StreamPos]->CC_Displayed[Pos_Y][Pos_X].Attribute;
+                    }
+                    Event.Row_Values[Pos_Y][32]=L'\0';
+                }
+            EVENT_END   ()
+    #endif //MEDIAINFO_EVENTS
 }
 
 //---------------------------------------------------------------------------
diff --git a/Source/MediaInfo/Text/File_Eia608.h b/Source/MediaInfo/Text/File_Eia608.h
index f4a270d..d842d0c 100644
--- a/Source/MediaInfo/Text/File_Eia608.h
+++ b/Source/MediaInfo/Text/File_Eia608.h
@@ -35,6 +35,9 @@ class File_Eia608 : public File__Analyze
 public :
     //In
     int8u   cc_type;
+    #if MEDIAINFO_EVENTS
+        int8u   MuxingMode;
+    #endif //MEDIAINFO_EVENTS
 
     //Constructor/Destructor
     File_Eia608();
diff --git a/Source/MediaInfo/Text/File_Eia708.cpp b/Source/MediaInfo/Text/File_Eia708.cpp
index 8731654..7f04cf6 100644
--- a/Source/MediaInfo/Text/File_Eia708.cpp
+++ b/Source/MediaInfo/Text/File_Eia708.cpp
@@ -23,6 +23,11 @@
 //---------------------------------------------------------------------------
 #include "MediaInfo/Text/File_Eia708.h"
 #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
+
+#if MEDIAINFO_EVENTS
+    #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
+    #include "MediaInfo/MediaInfo_Events_Internal.h"
+#endif //MEDIAINFO_EVENTS
 //---------------------------------------------------------------------------
 
 namespace MediaInfoLib
@@ -43,6 +48,9 @@ File_Eia708::File_Eia708()
     //In
     cc_type=(int8u)-1;
     AspectRatio=((float32)4)/3; //Default to 4:3
+    #if MEDIAINFO_EVENTS
+        MuxingMode=(int8u)-1;
+    #endif //MEDIAINFO_EVENTS
     ParserName="EIA-708";
 
     //Stream
@@ -153,6 +161,27 @@ bool File_Eia708::Synched_Test()
 //---------------------------------------------------------------------------
 void File_Eia708::Read_Buffer_Init()
 {
+    #if MEDIAINFO_EVENTS
+        if (MuxingMode==(int8u)-1)
+        {
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Mpegv && StreamIDs[StreamIDs_Size-3]==0x4741393400000003LL)
+                MuxingMode=0; //A/53 / DTVCC Transport
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Mpegv && StreamIDs[StreamIDs_Size-3]==0x0000000300000000LL)
+                MuxingMode=1; //SCTE 20
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Mpegv && StreamIDs[StreamIDs_Size-3]==0x434301F800000000LL)
+                MuxingMode=2; //DVD-Video
+            if (StreamIDs_Size>=4 && (ParserIDs[StreamIDs_Size-4]==MediaInfo_Parser_Gxf || ParserIDs[StreamIDs_Size-4]==MediaInfo_Parser_Lxf || ParserIDs[StreamIDs_Size-4]==MediaInfo_Parser_Mxf) && ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_Cdp)
+                MuxingMode=3; //Ancillary data / CDP
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Avc)
+                MuxingMode=4; //SCTE 128 / DTVCC Transport
+            if (StreamIDs_Size>=2 && ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_DvDif)
+                MuxingMode=5; //DV
+            if (StreamIDs_Size>=3 && ParserIDs[StreamIDs_Size-3]==MediaInfo_Parser_Mpeg4 && ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_Cdp)
+                MuxingMode=6; //Final Cut / CDP
+            if (StreamIDs_Size>=2 && ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_Scc)
+                MuxingMode=7; //SCC
+        }
+    #endif //MEDIAINFO_EVENTS
 }
 
 //---------------------------------------------------------------------------
@@ -1047,7 +1076,7 @@ void File_Eia708::DLW()
     StandAloneCommand=false;
 
     //Bug in some files
-    bool Bug_WindowOffset=false;
+    //bool Bug_WindowOffset=false;
 
     Element_Begin1("DeleteWindows");
     BS_Begin();
@@ -1060,13 +1089,13 @@ void File_Eia708::DLW()
         Get_SB (   IsSet,                                       Ztring(__T("window ")+Ztring::ToZtring(WindowID)).To_Local().c_str());
 
         //Bug in some files
-        if (IsSet && WindowID==1 && Streams[service_number]->Windows[0]!=NULL && Streams[service_number]->Windows[1]==NULL) //Mix between Windows 0 and 1
-        {
-            Bug_WindowOffset=true;
-            //Fill(Stream_Text, 0, "Bug", "WindowID_Bug", Unlimited, true, true);
-        }
-        if (!IsSet && WindowID==0 && Bug_WindowOffset)
-            IsSet=true;
+        //if (IsSet && WindowID==1 && Streams[service_number]->Windows[0]!=NULL && Streams[service_number]->Windows[1]==NULL) //Mix between Windows 0 and 1
+        //{
+        //    Bug_WindowOffset=true;
+        //    //Fill(Stream_Text, 0, "Bug", "WindowID_Bug", Unlimited, true, true);
+        //}
+        //if (!IsSet && WindowID==0 && Bug_WindowOffset)
+        //    IsSet=true;
 
         if (IsSet)
         {
@@ -1318,7 +1347,7 @@ void File_Eia708::DFx(int8u WindowID)
     if (relative_positioning)
     {
         Window->Minimal.Window_y=(int8u)(((float)15)*anchor_vertical/100);
-        Window->Minimal.Window_x=(int8u)(24*AspectRatio*anchor_horizontal/100);;
+        Window->Minimal.Window_x=(int8u)(24*AspectRatio*anchor_horizontal/100);
     }
     else
     {
@@ -1449,11 +1478,51 @@ void File_Eia708::Character_Fill(wchar_t Character)
 //---------------------------------------------------------------------------
 void File_Eia708::Window_HasChanged()
 {
+    int8u WindowID=Streams[service_number]->WindowID;
+    if (WindowID==(int8u)-1)
+        return; //Must wait for the corresponding CWx
+    window* Window=Streams[service_number]->Windows[WindowID];
+    if (Window==NULL)
+        return; //Must wait for the corresponding DFx
+
+    #if MEDIAINFO_EVENTS
+        EVENT_BEGIN (DtvccCaption, Window_Content_Minimal, 0)
+            Event.MuxingMode=MuxingMode;
+            Event.Service=service_number;
+            Event.Window=Streams[service_number]->WindowID;
+            for (size_t Pos_Y=0; Pos_Y<Window->Minimal.CC.size(); Pos_Y++)
+            {
+                for (size_t Pos_X=0; Pos_X<Window->Minimal.CC[Pos_Y].size(); Pos_X++)
+                {
+                    Event.Row_Values[Pos_Y][Pos_X]=Window->Minimal.CC[Pos_Y][Pos_X].Value;
+                    Event.Row_Attributes[Pos_Y][Pos_X]=Window->Minimal.CC[Pos_Y][Pos_X].Attribute;
+                }
+                Event.Row_Values[Pos_Y][Window->Minimal.CC[Pos_Y].size()]=L'\0';
+            }
+            for (size_t Pos_Y=Window->Minimal.CC.size(); Pos_Y<15; Pos_Y++)
+                Event.Row_Values[Pos_Y][0]=L'\0';
+        EVENT_END   ()
+    #endif //MEDIAINFO_EVENTS
 }
 
 //---------------------------------------------------------------------------
 void File_Eia708::HasChanged()
 {
+    #if MEDIAINFO_EVENTS
+        EVENT_BEGIN (DtvccCaption, Content_Minimal, 0)
+            Event.MuxingMode=MuxingMode;
+            Event.Service=service_number;
+            for (size_t Pos_Y=0; Pos_Y<Streams[service_number]->Minimal.CC.size(); Pos_Y++)
+            {
+                for (size_t Pos_X=0; Pos_X<Streams[service_number]->Minimal.CC[Pos_Y].size(); Pos_X++)
+                {
+                    Event.Row_Values[Pos_Y][Pos_X]=Streams[service_number]->Minimal.CC[Pos_Y][Pos_X].Value;
+                    Event.Row_Attributes[Pos_Y][Pos_X]=Streams[service_number]->Minimal.CC[Pos_Y][Pos_X].Attribute;
+                }
+                Event.Row_Values[Pos_Y][(size_t)(24*AspectRatio)]=L'\0';
+            }
+        EVENT_END   ()
+    #endif //MEDIAINFO_EVENTS
 }
 
 //---------------------------------------------------------------------------
diff --git a/Source/MediaInfo/Text/File_Eia708.h b/Source/MediaInfo/Text/File_Eia708.h
index 029707d..5b847b3 100644
--- a/Source/MediaInfo/Text/File_Eia708.h
+++ b/Source/MediaInfo/Text/File_Eia708.h
@@ -34,6 +34,9 @@ public :
     //In
     int8u cc_type;
     float64 AspectRatio;
+    #if MEDIAINFO_EVENTS
+        int8u   MuxingMode;
+    #endif //MEDIAINFO_EVENTS
 
     //Constructor/Destructor
     File_Eia708();
diff --git a/Source/MediaInfo/Text/File_Kate.cpp b/Source/MediaInfo/Text/File_Kate.cpp
index cad4755..cf0d71d 100644
--- a/Source/MediaInfo/Text/File_Kate.cpp
+++ b/Source/MediaInfo/Text/File_Kate.cpp
@@ -39,7 +39,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-Ztring Kate_Category(const Ztring &Category)
+static Ztring Kate_Category(const Ztring &Category)
 {
     //http://wiki.xiph.org/index.php/OggText#Categories_of_Text_Codecs
     if (Category==__T("CC"))
diff --git a/Source/MediaInfo/Text/File_N19.cpp b/Source/MediaInfo/Text/File_N19.cpp
index 8dd5f08..40cde58 100644
--- a/Source/MediaInfo/Text/File_N19.cpp
+++ b/Source/MediaInfo/Text/File_N19.cpp
@@ -37,7 +37,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* N19_CodePageNumber(int32u CPN)
+static const char* N19_CodePageNumber(int32u CPN)
 {
     switch (CPN)
     {
@@ -51,7 +51,7 @@ const char* N19_CodePageNumber(int32u CPN)
 }
 
 //---------------------------------------------------------------------------
-const char* N19_CharacterCodeTable(int16u CCT)
+static const char* N19_CharacterCodeTable(int16u CCT)
 {
     switch (CCT)
     {
@@ -65,20 +65,26 @@ const char* N19_CharacterCodeTable(int16u CCT)
 }
 
 //---------------------------------------------------------------------------
-float64 N19_DiskFormatCode_FrameRate(int64u DFC)
+static float64 N19_DiskFormatCode_FrameRate(int64u DFC)
 {
     switch (DFC)
     {
-        case 0x53544C32332E3031LL : return (float64)24000 / (float64)1001; 
+        case 0x53544C32332E3031LL : return (float64)24000/(float64)1001;
+        case 0x53544C32342E3031LL : return (float64)24;
         case 0x53544C32352E3031LL : return (float64)25;
-        case 0x53544C32392E3031LL : return (float64)30000 / (float64)1001;
+        case 0x53544C32392E3031LL : return (float64)30000/(float64)1001;
         case 0x53544C33302E3031LL : return (float64)30;
+        case 0x53544C34372E3031LL : return (float64)48000/(float64)1001;
+        case 0x53544C34382E3031LL : return (float64)48;
+        case 0x53544C35350E3031LL : return (float64)50;
+        case 0x53544C35392E3031LL : return (float64)60000/(float64)1001;
+        case 0x53544C36302E3031LL : return (float64)60;
         default                   : return (float64) 0;
     }
 }
 
 //---------------------------------------------------------------------------
-const char* N19_DisplayStandardCode(int8u DSC)
+static const char* N19_DisplayStandardCode(int8u DSC)
 {
     switch (DSC)
     {
@@ -90,7 +96,7 @@ const char* N19_DisplayStandardCode(int8u DSC)
 }
 
 //---------------------------------------------------------------------------
-const char* N19_LanguageCode(int16u LC)
+static const char* N19_LanguageCode(int16u LC)
 {
     switch (LC)
     {
@@ -214,6 +220,24 @@ File_N19::File_N19()
         ParserIDs[0]=MediaInfo_Parser_N19;
         StreamIDs_Width[0]=0;
     #endif //MEDIAINFO_EVENTS
+
+    #if MEDIAINFO_DEMUX
+        TCP_Offset=0;
+        Row_Values=NULL;
+    #endif //MEDIAINFO_DEMUX
+}
+
+//---------------------------------------------------------------------------
+File_N19::~File_N19()
+{
+    #if MEDIAINFO_DEMUX
+        if (Row_Values)
+        {
+            for (int8u Row_Pos=0; Row_Pos<Row_Max; ++Row_Pos)
+                delete[] Row_Values[Row_Pos];
+            delete[] Row_Values;
+        }
+    #endif //MEDIAINFO_DEMUX
 }
 
 //***************************************************************************
@@ -255,10 +279,10 @@ void File_N19::FileHeader_Parse()
     Ztring OPT, RD, TNS, MNC, MNR, CO, EN;
     string TCP;
     int16u LC;
-    int8u TCS;
+    int8u  DSC, TCS;
     Info_C3   (    CPN,                                         "CPN - Code Page Number"); Param_Info1(N19_CodePageNumber(CPN));
     Get_C8    (    DFC,                                         "DFC - Disk Format Code"); Param_Info1(N19_DiskFormatCode_FrameRate(DFC));
-    Info_C1   (    DSC,                                         "DSC - Display Standard Code"); Param_Info1(N19_DisplayStandardCode(DSC));
+    Get_C1    (    DSC,                                         "DSC - Display Standard Code"); Param_Info1(N19_DisplayStandardCode(DSC));
     Get_C2    (    CCT,                                         "CCT - Character Code Table number"); Param_Info1(N19_CharacterCodeTable(CCT));
     Get_C2    (    LC,                                          "LC - Language Code"); Param_Info1(N19_LanguageCode(LC));
     Get_Local (32, OPT,                                         "OPT - Original Programme Title");
@@ -327,10 +351,15 @@ void File_N19::FileHeader_Parse()
                 Frames+=(((int8u)TCP[7])-'0');
                 Delay+=float64_int64s(Frames*1000/N19_DiskFormatCode_FrameRate(DFC));
                 //Fill(Stream_Text, 0, Text_Delay, Delay); //TODO is 0???
-                /*TCP.insert(':', 2);
-                TCP.insert(':', 5);
-                TCP.insert(':', 8);
-                Fill(Stream_Text, 0, "Delay/String4", TCP);*/
+                TCP.insert(TCP.begin()+2, ':');
+                TCP.insert(TCP.begin()+5, ':');
+                TCP.insert(TCP.begin()+8, ':');
+                //Fill(Stream_Text, 0, "Delay/String4", TCP);
+                Fill(Stream_Text, 0, "TimeCode_First", TCP);
+
+#if MEDIAINFO_DEMUX
+				TCP_Offset=Delay;
+#endif
             }
         }
         Fill(Stream_Text, 0, Text_Width, MNC.To_int32u());
@@ -342,6 +371,21 @@ void File_N19::FileHeader_Parse()
         #if MEDIAINFO_DEMUX
             Frame_Count=0;
             TCO_Latest=(int64u)-1;
+            Row_Max=MNR.To_int8u();
+            if ((DSC=='1' || DSC=='2') && Row_Max<23)
+            {
+                Row_Max=23;
+                IsTeletext=true;
+            }
+            else
+                IsTeletext=false;
+            Column_Max=MNC.To_int8u();
+            Row_Values=new wchar_t*[Row_Max];
+            for (int8u Row_Pos=0; Row_Pos<Row_Max; ++Row_Pos)
+            {
+                Row_Values[Row_Pos]=new wchar_t[Column_Max+1];
+                Row_Values[Row_Pos][Column_Max]=__T('\0');
+            }
         #endif //MEDIAINFO_DEMUX
     FILLING_END();
 }
@@ -382,6 +426,7 @@ void File_N19::Data_Parse()
     //Parsing
     Ztring TF;
     int32u TCI, TCO;
+    int8u  VP, JC;
     Skip_B1   (                                                 "SGN - Subtitle Group Number");
     Skip_B2   (                                                 "SN - Subtitle Number");
     Skip_B1   (                                                 "EBN - Extension Block Number");
@@ -390,16 +435,22 @@ void File_N19::Data_Parse()
     TCI=((TCI>>24)&0xFF)*60*60*1000
       + ((TCI>>16)&0xFF)   *60*1000
       + ((TCI>>8 )&0xFF)      *1000
-      +  float64_int64s((TCI     &0xFF)      *1000/N19_DiskFormatCode_FrameRate(DFC));
+      +  (int32u)float64_int64s((TCI     &0xFF)      *1000/N19_DiskFormatCode_FrameRate(DFC));
     Param_Info1(Ztring().Duration_From_Milliseconds((int64u)TCI));
     Get_B4    (TCO,                                             "TCO - Time Code Out");
     TCO=((TCO>>24)&0xFF)*60*60*1000
       + ((TCO>>16)&0xFF)   *60*1000
       + ((TCO>>8 )&0xFF)      *1000
-      +  float64_int64s((TCO     &0xFF)      *1000/N19_DiskFormatCode_FrameRate(DFC));
+      +  (int32u)float64_int64s((TCO     &0xFF)      *1000/N19_DiskFormatCode_FrameRate(DFC));
     Param_Info1(Ztring().Duration_From_Milliseconds((int64u)TCO));
-    Skip_B1   (                                                 "VP - Vertical Position");
-    Skip_B1   (                                                 "JC - Justification Code");
+    Get_B1    (VP,                                              "VP - Vertical Position");
+    if (VP 
+#if MEDIAINFO_DEMUX
+		&& IsTeletext
+#endif
+		)
+        VP--; //1-Based
+    Get_B1    (JC,                                              "JC - Justification Code");
     Skip_B1   (                                                 "CF - Comment Flag");
     switch (CCT)
     {
@@ -437,6 +488,128 @@ void File_N19::Data_Parse()
     #endif //MEDIAINFO_TRACE
 
     FILLING_BEGIN();
+        #if MEDIAINFO_DEMUX
+        for (size_t i = 0; i < TF.size(); ++i)
+            switch (TF[i])
+            {
+                case 0x8A:  //EOL
+                            TF[i] = EOL[0]; 
+                            {
+                                size_t j = 1;
+                                while (EOL[j] != __T('\0'))
+                                    TF.insert(++i, 1, EOL[j++]);
+                            };
+                            break;
+                case 0x8F:  // Padding
+                            TF.erase(i--, 1);
+                            break;
+                default:
+                    if ( TF[i]< 0x20
+                     || (TF[i]>=0x80 && TF[i]<0xA0))
+                        TF.erase(i--, 1);
+            }
+            Frame_Count_NotParsedIncluded=Frame_Count;
+
+            int8u Row_Pos=0;
+            for (; Row_Pos<Row_Max; ++Row_Pos)
+                for (int8u Column_Pos=0; Column_Pos<Column_Max; ++Column_Pos)
+                    Row_Values[Row_Pos][Column_Pos]=__T(' ');
+
+            if (TCO_Latest!=(int64u)-1 && TCI!=TCO_Latest)
+            {
+                EVENT_BEGIN (Global, SimpleText, 0)
+                    Event.DTS=((int64u)(TCO_Latest))*1000000; // "-TCP_Offset" removed for the moment. TODO: find a way for when TCP_Offset should be removed and when it should not
+                    Event.PTS=Event.DTS;
+                    Event.DUR=((int64u)(TCI-TCO_Latest))*1000000;
+                    Event.Content=__T("");
+                    Event.Flags=0;
+                    Event.MuxingMode=(int8u)-1;
+                    Event.Service=(int8u)-1;
+                    Event.Row_Max=Row_Max;
+                    Event.Column_Max=Column_Max;
+                    Event.Row_Values=Row_Values;
+                    Event.Row_Attributes=NULL;
+                EVENT_END   ()
+            }
+
+            ZtringList List;
+            List.Separator_Set(0, EOL);
+            List.Write(TF);
+            Row_Pos=0;
+            if (VP+List.size()>Row_Max)
+            {
+                if (List.size()<=Row_Max)
+                    VP=Row_Max-(int8u)List.size();
+                else
+                {
+                    VP=0;
+                    List.resize(Row_Max);
+                }
+            }
+            Row_Pos=VP;
+            for (; Row_Pos<Row_Max; ++Row_Pos)
+            {
+                if (Row_Pos-VP>=(int8u)List.size())
+                    break;
+                if (List[Row_Pos-VP].size()>Column_Max)
+                    List[Row_Pos-VP].resize(Column_Max);
+
+                switch (JC)
+                {
+                    case 1 :    //Left-justified
+                    case 0 :    //Unchanged
+                                for (int8u Column_Pos=0; Column_Pos<Column_Max; ++Column_Pos)
+                                {
+                                    if (JC==1) //Left-justified
+                                        List[Row_Pos-VP].Trim();    
+                                    if (Column_Pos>=List[Row_Pos-VP].size())
+                                        break;
+                                    if (List[Row_Pos-VP][Column_Pos]>=0x20)
+                                        Row_Values[Row_Pos][Column_Pos]=List[Row_Pos-VP][Column_Pos];
+                                }
+                                break;
+                    case 2 :    //Centered
+                                for (int8u Column_Pos=(Column_Max-(int8u)List[Row_Pos-VP].size())/2; Column_Pos<Column_Max; ++Column_Pos)
+                                {
+                                    List[Row_Pos-VP].Trim();    
+                                    if (Column_Pos-(Column_Max-List[Row_Pos-VP].size())/2>=List[Row_Pos-VP].size())
+                                        break;
+                                    if (List[Row_Pos-VP][Column_Pos-(Column_Max-List[Row_Pos-VP].size())/2]>=0x20)
+                                        Row_Values[Row_Pos][Column_Pos]=List[Row_Pos-VP][Column_Pos-(Column_Max-List[Row_Pos-VP].size())/2];
+                                }
+                                break;
+                    case 3 :    //Right-justified
+                                for (int8u Column_Pos=Column_Max-(int8u)List[Row_Pos-VP].size(); Column_Pos<Column_Max; ++Column_Pos)
+                                {
+                                    List[Row_Pos-VP].Trim();    
+                                    if (Column_Pos-(Column_Max-List[Row_Pos-VP].size())>=List[Row_Pos-VP].size())
+                                        break;
+                                    if (List[Row_Pos-VP][Column_Pos-(Column_Max-List[Row_Pos-VP].size())]>=0x20)
+                                        Row_Values[Row_Pos][Column_Pos]=List[Row_Pos-VP][Column_Pos-(Column_Max-List[Row_Pos-VP].size())];
+                                }
+                                break;
+                    default:    ;
+                }
+            }
+
+            EVENT_BEGIN (Global, SimpleText, 0)
+                Event.DTS=((int64u)(TCI))*1000000; // "-TCP_Offset" removed for the moment. TODO: find a way for when TCP_Offset should be removed and when it should not
+                Event.PTS=Event.DTS;
+                Event.DUR=((int64u)(TCO-TCI))*1000000;
+                Event.Content=TF.c_str();
+                Event.Flags=0;
+                Event.MuxingMode=(int8u)-1;
+                Event.Service=(int8u)-1;
+                Event.Row_Max=Row_Max;
+                Event.Column_Max=Column_Max;
+                Event.Row_Values=Row_Values;
+                Event.Row_Attributes=NULL;
+            EVENT_END   ()
+
+            Frame_Count++;
+            TCO_Latest=TCO;
+        #endif //MEDIAINFO_DEMUX
+
         if (FirstFrame_TCI==(int64u)-1)
         {
             FirstFrame_TCI=TCI;
diff --git a/Source/MediaInfo/Text/File_N19.h b/Source/MediaInfo/Text/File_N19.h
index 3c79dbc..011bbac 100644
--- a/Source/MediaInfo/Text/File_N19.h
+++ b/Source/MediaInfo/Text/File_N19.h
@@ -30,6 +30,7 @@ class File_N19 : public File__Analyze
 {
 public :
     File_N19();
+    ~File_N19();
 
 private :
     //Buffer - File header
@@ -50,7 +51,12 @@ private :
     int64u DFC;
     int16u CCT;
     #if MEDIAINFO_DEMUX
+        int64u TCP_Offset;
         int64u TCO_Latest;
+        int8u  Row_Max;
+        int8u  Column_Max;
+        bool   IsTeletext;
+        wchar_t** Row_Values;
     #endif //MEDIAINFO_DEMUX
 };
 
diff --git a/Source/MediaInfo/Text/File_Pdf.cpp b/Source/MediaInfo/Text/File_Pdf.cpp
index 9c91f47..0888a0a 100644
--- a/Source/MediaInfo/Text/File_Pdf.cpp
+++ b/Source/MediaInfo/Text/File_Pdf.cpp
@@ -79,6 +79,7 @@ bool File_Pdf::FileHeader_Begin()
     //Temp
     Catalog_Level=0;
     Offsets_Max=0;
+    Objects_Current=Objects.end();
 
     //All should be OK...
     return true;
@@ -192,6 +193,9 @@ void File_Pdf::Data_Parse()
 
     for (;;)
     {
+        if (Objects_Current==Objects.end())
+            break;
+
         Objects_Current->second.BottomPos++;
         if (Objects_Current->second.BottomPos>=Objects_Current->second.Bottoms.size())
         {
@@ -341,7 +345,7 @@ void File_Pdf::trailer()
     objects::iterator Object_Top=Objects.find((int32u)-1);
     if (Offsets.empty() || Object_Top==Objects.end())
     {
-        Finish();
+        ForceFinish();
         return;
     }
 
diff --git a/Source/MediaInfo/Text/File_Scc.cpp b/Source/MediaInfo/Text/File_Scc.cpp
index 6a08446..880b5f0 100644
--- a/Source/MediaInfo/Text/File_Scc.cpp
+++ b/Source/MediaInfo/Text/File_Scc.cpp
@@ -33,9 +33,9 @@ namespace MediaInfoLib
 // Utils
 //***************************************************************************
 
-int64u Scc_str2timecode(const char* Value)
+static int64u Scc_str2timecode(const char* Value)
 {
-    size_t Length=strlen(Value);
+    const size_t Length=strlen(Value);
          if (Length==11
      && Value[0]>='0' && Value[0]<='9'
      && Value[1]>='0' && Value[1]<='9'
diff --git a/Source/MediaInfo/Text/File_Scte20.cpp b/Source/MediaInfo/Text/File_Scte20.cpp
index ccdd123..6c78f2a 100644
--- a/Source/MediaInfo/Text/File_Scte20.cpp
+++ b/Source/MediaInfo/Text/File_Scte20.cpp
@@ -41,7 +41,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Scte20_field_number (int8u field_number)
+static const char* Scte20_field_number (int8u field_number)
 {
     switch (field_number)
     {
diff --git a/Source/MediaInfo/Text/File_SubRip.cpp b/Source/MediaInfo/Text/File_SubRip.cpp
index 33c88a9..9e83ea4 100644
--- a/Source/MediaInfo/Text/File_SubRip.cpp
+++ b/Source/MediaInfo/Text/File_SubRip.cpp
@@ -101,6 +101,9 @@ File_SubRip::File_SubRip()
     //Temp
     IsVTT=false;
     HasBOM=false;
+    #if MEDIAINFO_DEMUX
+        Items_Pos=0;
+    #endif //MEDIAINFO_DEMUX
 }
 
 //***************************************************************************
@@ -232,6 +235,9 @@ bool File_SubRip::FileHeader_Begin()
 size_t File_SubRip::Read_Buffer_Seek (size_t Method, int64u Value, int64u ID)
 {
     GoTo(0);
+    #if MEDIAINFO_DEMUX
+        Items_Pos=0;
+    #endif //MEDIAINFO_DEMUX
     Open_Buffer_Unsynch();
     return 1;
 }
@@ -244,6 +250,46 @@ void File_SubRip::Read_Buffer_Continue()
         Demux(Buffer+(HasBOM?3:0), Buffer_Size-((HasBOM && Buffer_Size>=3)?3:0), ContentType_MainStream);
     #endif //MEDIAINFO_DEMUX
 
+    // Output
+    #if MEDIAINFO_EVENTS
+        for (; Items_Pos<Items.size(); Items_Pos++)
+        {
+            Frame_Count_NotParsedIncluded=Frame_Count;
+            EVENT_BEGIN (Global, SimpleText, 0)
+                Event.DTS=Items[Items_Pos].PTS_Begin;
+                Event.PTS=Event.DTS;
+                Event.DUR=Items[Items_Pos].PTS_End-Items[Items_Pos].PTS_Begin;
+                Event.Content=Items[Items_Pos].Content.c_str();
+                Event.Flags=IsVTT?1:0;
+                Event.MuxingMode=(int8u)-1;
+                Event.Service=(int8u)-1;
+                Event.Row_Max=0;
+                Event.Column_Max=0;
+                Event.Row_Values=NULL;
+                Event.Row_Attributes=NULL;
+            EVENT_END   ()
+            
+            if (Items_Pos+1==Items.size() || Items[Items_Pos].PTS_End!=Items[Items_Pos+1].PTS_Begin)
+            {
+                EVENT_BEGIN (Global, SimpleText, 0)
+                    Event.DTS=Items[Items_Pos].PTS_End;
+                    Event.PTS=Event.DTS;
+                    Event.DUR=0;
+                    Event.Content=__T("");
+                    Event.Flags=IsVTT?1:0;
+                    Event.MuxingMode=(int8u)-1;
+                    Event.Service=(int8u)-1;
+                    Event.Row_Max=0;
+                    Event.Column_Max=0;
+                    Event.Row_Values=NULL;
+                    Event.Row_Attributes=NULL;
+                EVENT_END   ()
+            }
+
+            Frame_Count++;
+        }
+    #endif //MEDIAINFO_EVENTS
+
     Buffer_Offset=Buffer_Size;
 }
 
diff --git a/Source/MediaInfo/Text/File_SubRip.h b/Source/MediaInfo/Text/File_SubRip.h
index dadfd09..4b9faf4 100644
--- a/Source/MediaInfo/Text/File_SubRip.h
+++ b/Source/MediaInfo/Text/File_SubRip.h
@@ -53,6 +53,7 @@ private :
         Ztring Content;
     };
     std::vector<item> Items;
+    size_t Items_Pos;
     #endif //MEDIAINFO_DEMUX
 };
 
diff --git a/Source/MediaInfo/Text/File_Teletext.cpp b/Source/MediaInfo/Text/File_Teletext.cpp
index 976dedb..34120ec 100644
--- a/Source/MediaInfo/Text/File_Teletext.cpp
+++ b/Source/MediaInfo/Text/File_Teletext.cpp
@@ -89,6 +89,7 @@ void File_Teletext::Streams_Finish()
     //TODO: filter subtitles and non subtitles, some files have normal teletext in subtitles block.
     if (Parser)
     {
+        Parser->Finish();
         for (size_t StreamKind=Stream_General+1; StreamKind<Stream_Max; StreamKind++)
             for (size_t StreamPos=0; StreamPos<Parser->Count_Get((stream_t)StreamKind); StreamPos++)
             {
@@ -573,7 +574,7 @@ void File_Teletext::Header_Parse()
             Stream_HasChanged=0;
         }
 
-		if (C[4] && PageNumber!=0xFF)
+        if (C[4] && PageNumber!=0xFF)
         {
             stream &Stream=Streams[(X<<8)|PageNumber];
             for (size_t PosY=0; PosY<26; ++PosY)
@@ -722,6 +723,35 @@ void File_Teletext::Data_Parse()
 //---------------------------------------------------------------------------
 void File_Teletext::HasChanged()
 {
+    #if MEDIAINFO_EVENTS
+        EVENT_BEGIN (Global, SimpleText, 0)
+            wstring Content;
+            stream &Stream=Streams[Stream_HasChanged];
+            const wchar_t* Row_Values[26];
+            for (size_t PosY=0; PosY<26; ++PosY)
+            {
+                if (PosY)
+                    Content+=EOL;
+                Content+=Stream.CC_Displayed_Values[PosY];
+                Row_Values[PosY]=Stream.CC_Displayed_Values[PosY].c_str();
+            }
+            Event.StreamIDs[StreamIDs_Size-1]=Stream_HasChanged;
+            Event.DTS=FrameInfo.DTS;
+            Event.PTS=Event.DTS;
+            Event.DUR=(int64u)-1;
+            Event.Content=Content.c_str();
+            Event.Flags=0;
+            if (StreamIDs_Size>1 && Event.ParserIDs[StreamIDs_Size-2]==MediaInfo_Parser_Sdp)
+                Event.MuxingMode=12; //Ancillary data / OP-47 / SDP
+            else
+                Event.MuxingMode=14; //Usually Teletext in MPEG-TS
+            Event.Service=(int8u)-1;
+            Event.Row_Max=26;
+            Event.Column_Max=40;
+            Event.Row_Values=(wchar_t**)&Row_Values;
+            Event.Row_Attributes=NULL;
+        EVENT_END   ()
+    #endif //MEDIAINFO_EVENTS
 }
 
 //***************************************************************************
diff --git a/Source/MediaInfo/Text/File_Ttml.cpp b/Source/MediaInfo/Text/File_Ttml.cpp
index 0e89e1e..65b8c8f 100644
--- a/Source/MediaInfo/Text/File_Ttml.cpp
+++ b/Source/MediaInfo/Text/File_Ttml.cpp
@@ -242,7 +242,77 @@ void File_Ttml::Read_Buffer_Continue()
                 ContentUtf8+=printer.CStr();
                 while (!ContentUtf8.empty() && (ContentUtf8[ContentUtf8.size()-1]=='\r' || ContentUtf8[ContentUtf8.size()-1]=='\n'))
                     ContentUtf8.resize(ContentUtf8.size()-1);
-                Ztring Content; if (p->FirstChild()) Content.From_UTF8(p->FirstChild()->Value());
+                Ztring Content; Content.From_UTF8(ContentUtf8.c_str());
+
+                Frame_Count_NotParsedIncluded=Frame_Count;
+                EVENT_BEGIN (Global, SimpleText, 0)
+                    //Hack: remove "p", "span", "br"
+                    Content.FindAndReplace(__T("\r"), Ztring(), 0, ZenLib::Ztring_Recursive);
+                    Content.FindAndReplace(__T("\n"), Ztring(), 0, ZenLib::Ztring_Recursive);
+                    for (;;)
+                    {
+                        size_t Span_Begin=Content.find(__T("<p"));
+                        if (Span_Begin==string::npos)
+                            break;
+                        
+                        size_t Span_End=Content.find(__T(">"), Span_Begin+5);
+                        if (Span_End==string::npos)
+                            break;
+
+                        size_t ShlashSpan_Begin=Content.find(__T("</p>"), Span_End+1);
+                        if (ShlashSpan_Begin==string::npos)
+                            break;
+
+                        Content.erase(ShlashSpan_Begin, 7);
+                        Content.erase(Span_Begin, Span_End-Span_Begin+1);
+                    }
+                    for (;;)
+                    {
+                        size_t Span_Begin=Content.find(__T("<span"));
+                        if (Span_Begin==string::npos)
+                            break;
+                        
+                        size_t Span_End=Content.find(__T(">"), Span_Begin+5);
+                        if (Span_End==string::npos)
+                            break;
+
+                        size_t ShlashSpan_Begin=Content.find(__T("</span>"), Span_End+1);
+                        if (ShlashSpan_Begin==string::npos)
+                            break;
+
+                        Content.erase(ShlashSpan_Begin, 7);
+                        Content.erase(Span_Begin, Span_End-Span_Begin+1);
+                    }
+                    Content.FindAndReplace(__T("<br>"), EOL, 0, ZenLib::Ztring_Recursive);
+                    Content.FindAndReplace(__T("<br/>"), EOL, 0, ZenLib::Ztring_Recursive);
+                    Content.FindAndReplace(__T("<br />"), EOL, 0, ZenLib::Ztring_Recursive);
+
+                    Event.DTS=DTS_Begin;
+                    Event.PTS=Event.DTS;
+                    Event.DUR=DTS_End-DTS_Begin;
+                    Event.Content=Content.c_str();
+                    Event.Flags=0;
+                    Event.MuxingMode=MuxingMode;
+                    Event.Service=(int8u)Element_Code;
+                    Event.Row_Max=0;
+                    Event.Column_Max=0;
+                    Event.Row_Values=NULL;
+                    Event.Row_Attributes=NULL;
+                EVENT_END   ()
+                EVENT_BEGIN (Global, SimpleText, 0)
+                    Event.DTS=DTS_End;
+                    Event.PTS=Event.DTS;
+                    Event.DUR=0;
+                    Event.Content=__T("");
+                    Event.Flags=0;
+                    Event.MuxingMode=MuxingMode;
+                    Event.Service=(int8u)Element_Code;
+                    Event.Row_Max=0;
+                    Event.Column_Max=0;
+                    Event.Row_Values=NULL;
+                    Event.Row_Attributes=NULL;
+                EVENT_END   ()
+
                 Frame_Count++;
             }
         }
diff --git a/Source/MediaInfo/Video/File_Avc.cpp b/Source/MediaInfo/Video/File_Avc.cpp
index b6a0f7c..4c4fd7b 100644
--- a/Source/MediaInfo/Video/File_Avc.cpp
+++ b/Source/MediaInfo/Video/File_Avc.cpp
@@ -78,6 +78,7 @@ const char* Avc_profile_idc(int8u profile_idc)
 #endif //MEDIAINFO_ADVANCED2
 #if MEDIAINFO_EVENTS
     #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
+    #include "MediaInfo/MediaInfo_Config_PerPackage.h"
     #include "MediaInfo/MediaInfo_Events.h"
     #include "MediaInfo/MediaInfo_Events_Internal.h"
 #endif //MEDIAINFO_EVENTS
@@ -141,7 +142,7 @@ const char* Avc_video_full_range[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Avc_primary_pic_type[]=
+static const char* Avc_primary_pic_type[]=
 {
     "I",
     "I, P",
@@ -154,7 +155,7 @@ const char* Avc_primary_pic_type[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Avc_slice_type[]=
+static const char* Avc_slice_type[]=
 {
     "P",
     "B",
@@ -170,7 +171,7 @@ const char* Avc_slice_type[]=
 
 //---------------------------------------------------------------------------
 const int8u Avc_pic_struct_Size=9;
-const char* Avc_pic_struct[]=
+static const char* Avc_pic_struct[]=
 {
     "frame",
     "top field",
@@ -184,7 +185,7 @@ const char* Avc_pic_struct[]=
 };
 
 //---------------------------------------------------------------------------
-const int8u Avc_NumClockTS[]=
+static const int8u Avc_NumClockTS[]=
 {
     1,
     1,
@@ -198,7 +199,7 @@ const int8u Avc_NumClockTS[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Avc_ct_type[]=
+static const char* Avc_ct_type[]=
 {
     "Progressive",
     "Interlaced",
@@ -207,7 +208,7 @@ const char* Avc_ct_type[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Avc_Colorimetry_format_idc[]=
+static const char* Avc_Colorimetry_format_idc[]=
 {
     "monochrome",
     "4:2:0",
@@ -216,7 +217,7 @@ const char* Avc_Colorimetry_format_idc[]=
 };
 
 //---------------------------------------------------------------------------
-const int8u Avc_SubWidthC[]=
+static const int8u Avc_SubWidthC[]=
 {
     1,
     2,
@@ -297,6 +298,85 @@ int32u Avc_MaxDpbMbs(int8u level)
     }
 }
 
+//---------------------------------------------------------------------------
+namespace AVC_Intra_Headers
+{
+    //720p50
+    static const size_t __720p50__50_Size = 4 * 0x10 + 0xA;
+    static const int8u  __720p50__50[__720p50__50_Size] = { 0x00, 0x00, 0x01, 0x67, 0x6E, 0x10, 0x20, 0xA6, 0xD4, 0x20, 0x32, 0x33, 0x0C, 0x71, 0x18, 0x88,
+                                                            0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8C, 0x44, 0x30, 0x21, 0x02, 0x56, 0x4E, 0x6F, 0x37, 0xCD,
+                                                            0xF9, 0xBF, 0x81, 0x6B, 0xF3, 0x7C, 0xDE, 0x6E, 0x6C, 0xD3, 0x3C, 0x0F, 0x01, 0x6E, 0xFF, 0xC0,
+                                                            0x00, 0xC0, 0x01, 0x38, 0xC0, 0x40, 0x40, 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x06,
+                                                            0x48, 0x40, 0x00, 0x00, 0x01, 0x68, 0xEE, 0x31, 0x12, 0x11 };
+    static const size_t __720p50_100_Size = 5 * 0x10 + 0x2;
+    static const int8u  __720p50_100[__720p50_100_Size] = { 0x00, 0x00, 0x01, 0x67, 0x7A, 0x10, 0x29, 0xB6, 0xD4, 0x20, 0x2A, 0x33, 0x1D, 0xC7, 0x62, 0xA1,
+                                                            0x08, 0x40, 0x54, 0x66, 0x3B, 0x8E, 0xC5, 0x42, 0x02, 0x10, 0x25, 0x64, 0x2C, 0x89, 0xE8, 0x85,
+                                                            0xE4, 0x21, 0x4B, 0x90, 0x83, 0x06, 0x95, 0xD1, 0x06, 0x46, 0x97, 0x20, 0xC8, 0xD7, 0x43, 0x08,
+                                                            0x11, 0xC2, 0x1E, 0x4C, 0x91, 0x0F, 0x01, 0x40, 0x16, 0xEC, 0x07, 0x8C, 0x04, 0x04, 0x05, 0x00,
+                                                            0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x64, 0x84, 0x00, 0x00, 0x01, 0x68, 0xCE, 0x31,
+                                                            0x12, 0x11 };
+    //720p60
+    static const size_t __720p60__50_Size = 4 * 0x10 + 0xB;
+    static const int8u  __720p60__50[__720p60__50_Size] = { 0x00, 0x00, 0x01, 0x67, 0x6E, 0x10, 0x20, 0xA6, 0xD4, 0x20, 0x32, 0x33, 0x0C, 0x71, 0x18, 0x88,
+                                                            0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8C, 0x44, 0x30, 0x21, 0x02, 0x56, 0x4E, 0x6F, 0x37, 0xCD,
+                                                            0xF9, 0xBF, 0x81, 0x6B, 0xF3, 0x7C, 0xDE, 0x6E, 0x6C, 0xD3, 0x3C, 0x0F, 0x01, 0x6E, 0xFF, 0xC0,
+                                                            0x00, 0xC0, 0x01, 0x38, 0xC0, 0x40, 0x40, 0x50, 0x00, 0x00, 0x3E, 0x90, 0x00, 0x1D, 0x4C, 0x08,
+                                                            0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xEE, 0x31, 0x12, 0x11 };
+    static const size_t __720p60_100_Size = 5 * 0x10 + 0x1;
+    static const int8u  __720p60_100[__720p60_100_Size] = { 0x00, 0x00, 0x01, 0x67, 0x7A, 0x10, 0x29, 0xB6, 0xD4, 0x20, 0x2A, 0x33, 0x1D, 0xC7, 0x62, 0xA1,
+                                                            0x08, 0x40, 0x54, 0x66, 0x3B, 0x8E, 0xC5, 0x42, 0x02, 0x10, 0x25, 0x64, 0x2C, 0x89, 0xE8, 0x85,
+                                                            0xE4, 0x21, 0x4B, 0x90, 0x83, 0x06, 0x95, 0xD1, 0x06, 0x46, 0x97, 0x20, 0xC8, 0xD7, 0x43, 0x08,
+                                                            0x11, 0xC2, 0x1E, 0x4C, 0x91, 0x0F, 0x01, 0x40, 0x16, 0xEC, 0x07, 0x8C, 0x04, 0x04, 0x05, 0x00,
+                                                            0x00, 0x03, 0x03, 0xE9, 0x00, 0x01, 0xD4, 0xC0, 0x84, 0x00, 0x00, 0x01, 0x68, 0xCE, 0x31, 0x12,
+                                                            0x11 };
+
+    //1080i50
+    static const size_t _1080i50__50_Size = 5 * 0x10 + 0xE;
+    static const int8u  _1080i50__50[_1080i50__50_Size] = { 0x00, 0x00, 0x01, 0x67, 0x6E, 0x10, 0x28, 0xA6, 0xD4, 0x20, 0x32, 0x33, 0x0C, 0x71, 0x18, 0x88,
+                                                            0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8C, 0x44, 0x30, 0x21, 0x02, 0x56, 0x4E, 0x6E, 0x61, 0x87,
+                                                            0x3E, 0x73, 0x4D, 0x98, 0x0C, 0x03, 0x06, 0x9C, 0x0B, 0x73, 0xE6, 0xC0, 0xB5, 0x18, 0x63, 0x0D,
+                                                            0x39, 0xE0, 0x5B, 0x02, 0xD4, 0xC6, 0x19, 0x1A, 0x79, 0x8C, 0x32, 0x34, 0x24, 0xF0, 0x16, 0x81,
+                                                            0x13, 0xF7, 0xFF, 0x80, 0x01, 0x80, 0x02, 0x71, 0x80, 0x80, 0x80, 0xA0, 0x00, 0x00, 0x03, 0x00,
+                                                            0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00, 0x00, 0x01, 0x68, 0xEE, 0x31, 0x12, 0x11 };
+    static const size_t _1080i50_100_Size = 5 * 0x10 + 0xF;
+    static const int8u  _1080i50_100[_1080i50_100_Size] = { 0x00, 0x00, 0x01, 0x67, 0x7A, 0x10, 0x29, 0xB6, 0xD4, 0x20, 0x22, 0x33, 0x19, 0xC6, 0x63, 0x23,
+                                                            0x21, 0x01, 0x11, 0x98, 0xCE, 0x33, 0x19, 0x18, 0x21, 0x03, 0x3A, 0x46, 0x65, 0x6A, 0x65, 0x24,
+                                                            0xAD, 0xE9, 0x12, 0x32, 0x14, 0x1A, 0x26, 0x34, 0xAD, 0xA4, 0x41, 0x82, 0x23, 0x01, 0x50, 0x2B,
+                                                            0x1A, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2E, 0x11, 0x12, 0x08, 0xC6, 0x8C, 0x04, 0x41, 0x28, 0x4C,
+                                                            0x34, 0xF0, 0x1E, 0x01, 0x13, 0xF2, 0xE0, 0x3C, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03, 0x00,
+                                                            0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20, 0x00, 0x00, 0x01, 0x68, 0xCE, 0x33, 0x48, 0xD0 };
+    //1080i60
+    static const size_t _1080i60__50_Size = 5 * 0x10 + 0xD;
+    static const int8u  _1080i60__50[_1080i60__50_Size] = { 0x00, 0x00, 0x01, 0x67, 0x6E, 0x10, 0x28, 0xA6, 0xD4, 0x20, 0x32, 0x33, 0x0C, 0x71, 0x18, 0x88,
+                                                            0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8C, 0x44, 0x30, 0x21, 0x02, 0x56, 0x4E, 0x6E, 0x61, 0x87,
+                                                            0x3E, 0x73, 0x4D, 0x98, 0x0C, 0x03, 0x06, 0x9C, 0x0B, 0x73, 0xE6, 0xC0, 0xB5, 0x18, 0x63, 0x0D,
+                                                            0x39, 0xE0, 0x5B, 0x02, 0xD4, 0xC6, 0x19, 0x1A, 0x79, 0x8C, 0x32, 0x34, 0x24, 0xF0, 0x16, 0x81,
+                                                            0x13, 0xF7, 0xFF, 0x80, 0x01, 0x80, 0x02, 0x71, 0x80, 0x80, 0x80, 0xA0, 0x00, 0x00, 0x7D, 0x20,
+                                                            0x00, 0x1D, 0x4C, 0x10, 0x80, 0x00, 0x00, 0x01, 0x68, 0xEE, 0x31, 0x12, 0x11 };
+    static const size_t _1080i60_100_Size = 5 * 0x10 + 0xD;
+    static const int8u  _1080i60_100[_1080i60_100_Size] = { 0x00, 0x00, 0x01, 0x67, 0x7A, 0x10, 0x29, 0xB6, 0xD4, 0x20, 0x22, 0x33, 0x19, 0xC6, 0x63, 0x23,
+                                                            0x21, 0x01, 0x11, 0x98, 0xCE, 0x33, 0x19, 0x18, 0x21, 0x03, 0x3A, 0x46, 0x65, 0x6A, 0x65, 0x24,
+                                                            0xAD, 0xE9, 0x12, 0x32, 0x14, 0x1A, 0x26, 0x34, 0xAD, 0xA4, 0x41, 0x82, 0x23, 0x01, 0x50, 0x2B,
+                                                            0x1A, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2E, 0x11, 0x12, 0x08, 0xC6, 0x8C, 0x04, 0x41, 0x28, 0x4C,
+                                                            0x34, 0xF0, 0x1E, 0x01, 0x13, 0xF2, 0xE0, 0x3C, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x1F, 0x48,
+                                                            0x00, 0x07, 0x53, 0x04, 0x20, 0x00, 0x00, 0x01, 0x68, 0xCE, 0x33, 0x48, 0xD0 };
+
+    //1080p50
+    static const size_t _1080p50_100_Size = 4 * 0x10 + 0xA;
+    static const int8u  _1080p50_100[_1080p50_100_Size] = { 0x00, 0x00, 0x01, 0x67, 0x7A, 0x10, 0x2A, 0xB6, 0xD4, 0x20, 0x22, 0x33, 0x19, 0xC6, 0x63, 0x23,
+                                                            0x21, 0x01, 0x11, 0x98, 0xCE, 0x33, 0x19, 0x18, 0x21, 0x02, 0x56, 0xB9, 0x3D, 0x7D, 0x7E, 0x4F,
+                                                            0xE3, 0x3F, 0x11, 0xF1, 0x9E, 0x08, 0xB8, 0x8C, 0x54, 0x43, 0xC0, 0x78, 0x02, 0x27, 0xE2, 0x70,
+                                                            0x1E, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x01, 0x92, 0x10,
+                                                            0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0xCE, 0x33, 0x48, 0xD0 };
+    //1080p60
+    static const size_t _1080p60_100_Size = 4 * 0x10 + 0x8;
+    static const int8u  _1080p60_100[_1080p60_100_Size] = { 0x00, 0x00, 0x01, 0x67, 0x7A, 0x10, 0x2A, 0xB6, 0xD4, 0x20, 0x22, 0x33, 0x19, 0xC6, 0x63, 0x23,
+                                                            0x21, 0x01, 0x11, 0x98, 0xCE, 0x33, 0x19, 0x18, 0x21, 0x02, 0x56, 0xB9, 0x3D, 0x7D, 0x7E, 0x4F,
+                                                            0xE3, 0x3F, 0x11, 0xF1, 0x9E, 0x08, 0xB8, 0x8C, 0x54, 0x43, 0xC0, 0x78, 0x02, 0x27, 0xE2, 0x70,
+                                                            0x1E, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00, 0x0F, 0xA4, 0x00, 0x07, 0x53, 0x02, 0x10, 0x00, 0x00,
+                                                            0x00, 0x00, 0x01, 0x68, 0xCE, 0x33, 0x48, 0xD0 };
+};
+
 //***************************************************************************
 // Constructor/Destructor
 //***************************************************************************
@@ -356,6 +436,139 @@ File_Avc::~File_Avc()
 }
 
 //***************************************************************************
+// AVC-Intra hardcoded headers
+//***************************************************************************
+
+//---------------------------------------------------------------------------
+File_Avc::avcintra_header File_Avc::AVC_Intra_Headers_Data(int32u CodecID)
+{
+    switch (CodecID)
+    {
+        case  0x61693132: //ai12
+        case  0x61693232: //ai22
+                            return avcintra_header(AVC_Intra_Headers::_1080p50_100, AVC_Intra_Headers::_1080p50_100_Size);  // AVC-Intra 1080p50 class 100/200
+        case  0x61693133: //ai13
+        case  0x61693233: //ai23
+                            return avcintra_header(AVC_Intra_Headers::_1080p60_100, AVC_Intra_Headers::_1080p60_100_Size);  // AVC-Intra 1080p60 class 100/200
+        case  0x61693135: //ai15
+        case  0x61693235: //ai25
+                            return avcintra_header(AVC_Intra_Headers::_1080i50_100, AVC_Intra_Headers::_1080i50_100_Size);  // AVC-Intra 1080i50 class 100/200
+        case  0x61693136: //ai16
+        case  0x61693236: //ai26
+                            return avcintra_header(AVC_Intra_Headers::_1080i60_100, AVC_Intra_Headers::_1080i60_100_Size);  // AVC-Intra 1080i60 class 100/200
+        case  0x61693170: //ai1p
+        case  0x61693270: //ai2p
+                            return avcintra_header(AVC_Intra_Headers::__720p60_100, AVC_Intra_Headers::__720p60_100_Size);  // AVC-Intra  720p60 class 100/200
+        case  0x61693171: //ai1q
+        case  0x61693271: //ai2q
+                            return avcintra_header(AVC_Intra_Headers::__720p50_100, AVC_Intra_Headers::__720p50_100_Size);  // AVC-Intra  720p50 class 100/200
+      //case  0x61693532: //ai52
+      //                    return avcintra_header(NULL, 0);                                                                // AVC-Intra 1080p25 class  50 (not supported)
+      //case  0x61693533: //ai53
+      //                    return avcintra_header(NULL, 0);                                                                // AVC-Intra 1080p30 class  50 (not supported)
+        case  0x61693535: //ai55
+                            return avcintra_header(AVC_Intra_Headers::_1080i50__50, AVC_Intra_Headers::_1080i50__50_Size);  // AVC-Intra 1080i50 class  50
+        case  0x61693536: //ai56
+                            return avcintra_header(AVC_Intra_Headers::_1080i60__50, AVC_Intra_Headers::_1080i60__50_Size);  // AVC-Intra 1080i60 class  50
+        case  0x61693570: //ai5p
+                            return avcintra_header(AVC_Intra_Headers::__720p60__50, AVC_Intra_Headers::__720p60__50_Size);  // AVC-Intra  720p60 class  50
+        case  0x61693571: //ai5q
+                            return avcintra_header(AVC_Intra_Headers::__720p50__50, AVC_Intra_Headers::__720p50__50_Size);  // AVC-Intra  720p50 class  50
+        default       :
+                            return avcintra_header(NULL, 0);
+    }
+}
+
+//---------------------------------------------------------------------------
+int32u File_Avc::AVC_Intra_CodecID_FromMeta(int32u Height, int32u Fields, int32u SampleDuration, int32u TimeScale, int32u SizePerFrame)
+{
+    // Computing bitrate
+    int64u BitRate=((int64u)SizePerFrame)*8*TimeScale/SampleDuration;
+    int64u SampleRate=float64_int64s(((float64)TimeScale)/SampleDuration);
+    int32u Class=BitRate<=75000000?50:100; //Arbitrary choosen. TODO: check real maximumm bitrate, check class 200
+    switch (Class)
+    {
+        case 100 : 
+                    switch (Height)
+                    {
+                        case 1080 :
+                                    switch (Fields)
+                                    {
+                                        case 1: 
+                                                    switch (SampleRate)
+                                                    {
+                                                        case 50: return 0x61693132; //ai12
+                                                        case 60: return 0x61693133; //ai13
+                                                        default: return 0x4156696E; //AVin (neutral)
+                                                    }
+                                        case 2: 
+                                                    switch (SampleRate)
+                                                    {
+                                                        case 25: return 0x61693135; //ai15 //TODO: check more files in order to know if it should be 1 or 2 fields per sample
+                                                        case 30: return 0x61693136; //ai16 //TODO: check more files in order to know if it should be 1 or 2 fields per sample
+                                                        case 50: return 0x61693135; //ai15 //TODO: check more files in order to know if it should be 1 or 2 fields per sample
+                                                        case 60: return 0x61693136; //ai16 //TODO: check more files in order to know if it should be 1 or 2 fields per sample
+                                                        default: return 0x4156696E; //AVin (neutral)
+                                                    }
+                                        default:    return 0x4156696E; //AVin (neutral)
+                                    }
+                        case  720 :
+                                    switch (Fields)
+                                    {
+                                        case 1: 
+                                                    switch (SampleRate)
+                                                    {
+                                                        case 50: return 0x61693170; //ai1p
+                                                        case 60: return 0x61693171; //ai1q
+                                                        default: return 0x4156696E; //AVin (neutral)
+                                                    }
+                                        default:    return 0x4156696E; //AVin (neutral)
+                                    }
+                        default   : return 0x4156696E; //AVin (neutral)
+                    }
+        case  50 : 
+                    switch (Height)
+                    {
+                        case 1080 :
+                                    switch (Fields)
+                                    {
+                                        case 1: 
+                                                    switch (SampleRate)
+                                                    {
+                                                        case 25: return 0x61693532; //ai52
+                                                        case 30: return 0x61693533; //ai53
+                                                        default: return 0x4156696E; //AVin (neutral)
+                                                    }
+                                        case 2: 
+                                                    switch (SampleRate)
+                                                    {
+                                                        case 25: return 0x61693535; //ai55 //TODO: check more files in order to know if it should be 1 or 2 fields per sample
+                                                        case 30: return 0x61693536; //ai56 //TODO: check more files in order to know if it should be 1 or 2 fields per sample
+                                                        case 50: return 0x61693535; //ai55 //TODO: check more files in order to know if it should be 1 or 2 fields per sample
+                                                        case 60: return 0x61693536; //ai56 //TODO: check more files in order to know if it should be 1 or 2 fields per sample
+                                                        default: return 0x4156696E; //AVin (neutral)
+                                                    }
+                                        default:    return 0x4156696E; //AVin (neutral)
+                                    }
+                        case  720 :
+                                    switch (Fields)
+                                    {
+                                        case 1: 
+                                                    switch (SampleRate)
+                                                    {
+                                                        case 50: return 0x61693570; //ai5p
+                                                        case 60: return 0x61693571; //ai5q
+                                                        default: return 0x4156696E; //AVin (neutral)
+                                                    }
+                                        default:    return 0x4156696E; //AVin (neutral)
+                                    }
+                        default   : return 0x4156696E; //AVin (neutral)
+                    }
+        default: return 0x4156696E; //AVin (neutral)
+    }
+}
+
+//***************************************************************************
 // Streams management
 //***************************************************************************
 
@@ -807,6 +1020,7 @@ bool File_Avc::Demux_UnpacketizeContainer_Test()
 
         //Computing final size
         size_t TranscodedBuffer_Size=0;
+        size_t Buffer_Offset_Save=Buffer_Offset;
         while (Buffer_Offset+SizeOfNALU_Minus1+1+1<=Buffer_Size)
         {
             size_t Size;
@@ -854,7 +1068,7 @@ bool File_Avc::Demux_UnpacketizeContainer_Test()
             TranscodedBuffer_Size+=Size;
             Buffer_Offset+=Size;
         }
-        Buffer_Offset=0;
+        Buffer_Offset=Buffer_Offset_Save;
 
         //Adding SPS/PPS sizes
         if (RandomAccess)
@@ -1013,7 +1227,14 @@ bool File_Avc::Demux_UnpacketizeContainer_Test()
         File_Avc* MI=new File_Avc;
         Element_Code=(int64u)-1;
         Open_Buffer_Init(MI);
+        #ifdef MEDIAINFO_EVENTS
+            MediaInfo_Config_PerPackage* Config_PerPackage_Temp=MI->Config->Config_PerPackage;
+            MI->Config->Config_PerPackage=NULL;
+        #endif //MEDIAINFO_EVENTS
         Open_Buffer_Continue(MI, Buffer, Buffer_Size);
+        #ifdef MEDIAINFO_EVENTS
+            MI->Config->Config_PerPackage=Config_PerPackage_Temp;
+        #endif //MEDIAINFO_EVENTS
         bool IsOk=MI->Status[IsAccepted];
         delete MI;
         if (!IsOk)
@@ -1569,6 +1790,58 @@ void File_Avc::Data_Parse()
         }
     #endif //MEDIAINFO_ADVANCED2
 
+    #if MEDIAINFO_DEMUX
+        if (Demux_Avc_Transcode_Iso14496_15_to_Iso14496_10)
+        {
+            if (Element_Code==0x07)
+            {
+                std::vector<seq_parameter_set_struct*>::iterator Data_Item=seq_parameter_sets.begin();
+                if (Data_Item!=seq_parameter_sets.end() && (*Data_Item))
+                {
+                    delete[] (*Data_Item)->Iso14496_10_Buffer;
+                    (*Data_Item)->Iso14496_10_Buffer_Size=(size_t)(Element_Size+4);
+                    (*Data_Item)->Iso14496_10_Buffer=new int8u[(*Data_Item)->Iso14496_10_Buffer_Size];
+                    (*Data_Item)->Iso14496_10_Buffer[0]=0x00;
+                    (*Data_Item)->Iso14496_10_Buffer[1]=0x00;
+                    (*Data_Item)->Iso14496_10_Buffer[2]=0x01;
+                    (*Data_Item)->Iso14496_10_Buffer[3]=0x67;
+                    std::memcpy((*Data_Item)->Iso14496_10_Buffer+4, Buffer+Buffer_Offset, (size_t)Element_Size);
+                }
+            }
+            if (Element_Code==0x08)
+            {
+                std::vector<pic_parameter_set_struct*>::iterator Data_Item=pic_parameter_sets.begin();
+                if (Data_Item!=pic_parameter_sets.end() && (*Data_Item))
+                {
+                    delete[] (*Data_Item)->Iso14496_10_Buffer;
+                    (*Data_Item)->Iso14496_10_Buffer_Size=(size_t)(Element_Size+4);
+                    (*Data_Item)->Iso14496_10_Buffer=new int8u[(*Data_Item)->Iso14496_10_Buffer_Size];
+                    (*Data_Item)->Iso14496_10_Buffer[0]=0x00;
+                    (*Data_Item)->Iso14496_10_Buffer[1]=0x00;
+                    (*Data_Item)->Iso14496_10_Buffer[2]=0x01;
+                    (*Data_Item)->Iso14496_10_Buffer[3]=0x68;
+                    std::memcpy((*Data_Item)->Iso14496_10_Buffer+4, Buffer+Buffer_Offset, (size_t)Element_Size);
+                }
+            }
+            if (Element_Code==0x0F)
+            {
+                std::vector<seq_parameter_set_struct*>::iterator Data_Item=subset_seq_parameter_sets.begin();
+                if (Data_Item!=subset_seq_parameter_sets.end() && (*Data_Item))
+                {
+                    SizeOfNALU_Minus1=0;
+                    delete[] (*Data_Item)->Iso14496_10_Buffer;
+                    (*Data_Item)->Iso14496_10_Buffer_Size=(size_t)(Element_Size+4);
+                    (*Data_Item)->Iso14496_10_Buffer=new int8u[(*Data_Item)->Iso14496_10_Buffer_Size];
+                    (*Data_Item)->Iso14496_10_Buffer[0]=0x00;
+                    (*Data_Item)->Iso14496_10_Buffer[1]=0x00;
+                    (*Data_Item)->Iso14496_10_Buffer[2]=0x01;
+                    (*Data_Item)->Iso14496_10_Buffer[3]=0x6F;
+                    std::memcpy((*Data_Item)->Iso14496_10_Buffer+4, Buffer+Buffer_Offset, (size_t)Element_Size);
+                }
+            }
+        }
+    #endif //MEDIAINFO_DEMUX
+
     //Trailing zeroes
     Element_Size=Element_Size_SaveBeforeZeroes;
 }
@@ -1632,7 +1905,21 @@ void File_Avc::slice_header()
     Get_UE (first_mb_in_slice,                                  "first_mb_in_slice");
     Get_UE (slice_type,                                         "slice_type"); Param_Info1C((slice_type<10), Avc_slice_type[slice_type]);
     #if MEDIAINFO_EVENTS
+        if (!first_mb_in_slice)
         {
+            switch(Element_Code)
+            {
+                case 5 :    // This is an IDR frame
+                            if (Config->Config_PerPackage && Element_Code==0x05) // First slice of an IDR frame
+                            {
+                                // IDR
+                                Config->Config_PerPackage->FrameForAlignment(this, true);
+                                Config->Config_PerPackage->IsClosedGOP(this);
+                            }
+                            break;
+                default :   ; // This is not an IDR frame
+            }
+
             EVENT_BEGIN (Video, SliceInfo, 0)
                 Event.FieldPosition=Field_Count;
                 Event.SlicePosition=Element_IsOK()?first_mb_in_slice:(int64u)-1;
diff --git a/Source/MediaInfo/Video/File_Avc.h b/Source/MediaInfo/Video/File_Avc.h
index 0b1dca9..9cc34e5 100644
--- a/Source/MediaInfo/Video/File_Avc.h
+++ b/Source/MediaInfo/Video/File_Avc.h
@@ -40,6 +40,20 @@ public :
     File_Avc();
     ~File_Avc();
 
+    //AVC-Intra hardcoded headers
+    struct avcintra_header
+    {
+        const int8u* Data;
+        size_t       Size;
+
+        avcintra_header(const int8u* Data_, size_t Size_)
+            : Data(Data_)
+            , Size(Size_)
+        {}
+    };
+    static avcintra_header AVC_Intra_Headers_Data(int32u CodecID);
+    static int32u AVC_Intra_CodecID_FromMeta(int32u Height, int32u Fields, int32u SampleDuration, int32u TimeScale, int32u SizePerFrame);
+
 private :
     File_Avc(const File_Avc &File_Avc); //No copy
 
diff --git a/Source/MediaInfo/Video/File_AvsV.cpp b/Source/MediaInfo/Video/File_AvsV.cpp
index 3178f9f..2c75323 100644
--- a/Source/MediaInfo/Video/File_AvsV.cpp
+++ b/Source/MediaInfo/Video/File_AvsV.cpp
@@ -67,7 +67,7 @@ Ztring AvsV_level(int8u level_id)
 }
 
 //---------------------------------------------------------------------------
-const float32 AvsV_frame_rate[]=
+static const float32 AvsV_frame_rate[]=
 {
     (float32)0,
     ((float32)24000)/1001,
@@ -88,7 +88,7 @@ const float32 AvsV_frame_rate[]=
 };
 
 //---------------------------------------------------------------------------
-const char* AvsV_chroma_format[]=
+static const char* AvsV_chroma_format[]=
 {
     "",
     "4:2:0",
@@ -97,7 +97,7 @@ const char* AvsV_chroma_format[]=
 };
 
 //---------------------------------------------------------------------------
-const char* AvsV_extension_start_code_identifier[]=
+static const char* AvsV_extension_start_code_identifier[]=
 {
     "",
     "",
@@ -118,7 +118,7 @@ const char* AvsV_extension_start_code_identifier[]=
 };
 
 //---------------------------------------------------------------------------
-const char* AvsV_video_format[]=
+static const char* AvsV_video_format[]=
 {
     "Component",
     "PAL",
@@ -131,7 +131,7 @@ const char* AvsV_video_format[]=
 };
 
 //---------------------------------------------------------------------------
-const float32 AvsV_aspect_ratio[]=
+static const float32 AvsV_aspect_ratio[]=
 {
     (float32)0,
     (float32)1,
@@ -152,7 +152,7 @@ const float32 AvsV_aspect_ratio[]=
 };
 
 //---------------------------------------------------------------------------
-const char* AvsV_picture_coding_type[]=
+static const char* AvsV_picture_coding_type[]=
 {
     "",
     "P",
diff --git a/Source/MediaInfo/Video/File_Ffv1.cpp b/Source/MediaInfo/Video/File_Ffv1.cpp
index ace1d66..8e27164 100644
--- a/Source/MediaInfo/Video/File_Ffv1.cpp
+++ b/Source/MediaInfo/Video/File_Ffv1.cpp
@@ -40,16 +40,64 @@ using namespace std;
 namespace MediaInfoLib
 {
 
+using namespace FFV1;
+
 //***************************************************************************
 // Const
 //***************************************************************************
 
-extern int32u Psi_CRC_32_Table[256];
+extern const int32u Psi_CRC_32_Table[256];
 const int32u Slice::Context::N0 = 128;
 const int32s Slice::Context::Cmax = 127;
 const int32s Slice::Context::Cmin = -128;
 
 //***************************************************************************
+// Helpers
+//***************************************************************************
+
+//---------------------------------------------------------------------------
+static int32u FFv1_CRC_Compute(const int8u* Buffer, size_t Start, size_t Size)
+{
+    int32u CRC_32 = 0;
+    const int8u* CRC_32_Buffer=Buffer+Start;
+    const int8u* CRC_32_Buffer_End=CRC_32_Buffer+Size;
+
+    while(CRC_32_Buffer<CRC_32_Buffer_End)
+    {
+        CRC_32=(CRC_32<<8) ^ Psi_CRC_32_Table[(CRC_32>>24)^(*CRC_32_Buffer)];
+        CRC_32_Buffer++;
+    }
+    return CRC_32;
+}
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_FIXITY
+static size_t Ffv1_TryToFixCRC(const int8u* Buffer, size_t Buffer_Size)
+{
+    //looking for a bit flip
+    int8u* Buffer2=new int8u[Buffer_Size];
+    memcpy(Buffer2, Buffer, Buffer_Size);
+    vector<size_t> BitPositions;
+    size_t BitPosition_Max=Buffer_Size*8;
+    for (size_t BitPosition=0; BitPosition<BitPosition_Max; BitPosition++)
+    {
+        size_t BytePosition=BitPosition>>3;
+        size_t BitInBytePosition=BitPosition&0x7;
+        Buffer2[BytePosition]^=1<<BitInBytePosition;
+        int32u crc_left_New=FFv1_CRC_Compute(Buffer2, 0, Buffer_Size);
+        if (!crc_left_New)
+        {
+            BitPositions.push_back(BitPosition);
+        }
+        Buffer2[BytePosition]^=1<<BitInBytePosition;
+    }
+    delete[] Buffer2; //Buffer2=NULL
+
+    return BitPositions.size()==1?BitPositions[0]:(size_t)-1;
+}
+#endif //MEDIAINFO_FIXITY
+
+//***************************************************************************
 // RangeCoder
 //***************************************************************************
 
@@ -591,7 +639,7 @@ void File_Ffv1::Read_Buffer_OutOfBand()
 {
     ConfigurationRecordIsPresent=true;
 
-    int32u CRC_32=CRC_Compute((size_t)Element_Size);
+    int32u CRC_32=FFv1_CRC_Compute(Buffer+Buffer_Offset, (size_t)Element_Offset, (size_t)Element_Size);
 
     if (Buffer_Size < 4 || CRC_32)
     {
@@ -692,12 +740,13 @@ void File_Ffv1::Read_Buffer_Continue()
     for (size_t Pos = 0; Pos < Slices_BufferSizes.size(); Pos++)
     {
         Element_Begin1("Slice");
+        int64u Element_Offset_Begin=Element_Offset;
         int64u Element_Size_Save=Element_Size;
         Element_Size=Element_Offset+Slices_BufferSizes[Pos]-tail;
         int32u crc_left=0;
 
         if (error_correction == 1)
-            crc_left=CRC_Compute(Slices_BufferSizes[Pos]);
+            crc_left=FFv1_CRC_Compute(Buffer+Buffer_Offset, (size_t)Element_Offset, Slices_BufferSizes[Pos]);
 
         if (Pos)
         {
@@ -712,12 +761,10 @@ void File_Ffv1::Read_Buffer_Continue()
 #if MEDIAINFO_TRACE
         if (!Frame_Count || Trace_Activated) // Parse slice only if trace feature is activated
         {
-            int64u Start=Element_Offset;
-
             if (!slice(States))
             {
-                int64u SliceRealSize=Element_Offset-Start;
-                Element_Offset=Start;
+                int64u SliceRealSize=Element_Offset-Element_Offset_Begin;
+                Element_Offset=Element_Offset_Begin;
                 Skip_XX(SliceRealSize,                          "slice_data");
                 if (Trusted_Get() && !RC->Underrun() && Element_Offset==Element_Size)
                     Param_Info1("OK");
@@ -739,7 +786,24 @@ void File_Ffv1::Read_Buffer_Continue()
             if (!crc_left)
                 Param_Info1("OK");
             else
+            {
                 Param_Info1("NOK");
+
+                #if MEDIAINFO_FIXITY
+                    if (Config->TryToFix_Get())
+                    {
+                        size_t BitPosition=Ffv1_TryToFixCRC(Buffer+Buffer_Offset+(size_t)Element_Offset_Begin, Element_Offset-Element_Offset_Begin);
+                        if (BitPosition!=(size_t)-1)
+                        {
+                            size_t BytePosition=BitPosition>>3;
+                            size_t BitInBytePosition=BitPosition&0x7;
+                            int8u Modified=Buffer[Buffer_Offset+(size_t)Element_Offset_Begin+BytePosition];
+                            Modified^=1<<BitInBytePosition;
+                            FixFile(File_Offset+Buffer_Offset+(size_t)Element_Offset_Begin+BytePosition, &Modified, 1)?Param_Info1("Fixed"):Param_Info1("Not fixed");
+                        }
+                    }
+                #endif //MEDIAINFO_FIXITY
+            }
         }
         Element_End0();
     }
@@ -806,7 +870,7 @@ void File_Ffv1::FrameHeader()
     if (coder_type == 2) //Range coder with custom state transition table
     {
         Element_Begin1("state_transition_deltas");
-        for (int16u i = 1; i < state_transitions_size; i++)
+        for (size_t i = 1; i < state_transitions_size; i++)
         {
             int32s state_transition_delta;
             Get_RS (States, state_transition_delta,             "state_transition_delta");
@@ -863,7 +927,7 @@ void File_Ffv1::FrameHeader()
             context_count[i] = context_count[0];
         }
     }
-    memset(quant_tables+quant_table_count, 0x00, (MAX_QUANT_TABLES-quant_table_count)*MAX_CONTEXT_INPUTS*256*sizeof(int16s));
+    memset(quant_tables+quant_table_count, 0x00, (MAX_QUANT_TABLES-quant_table_count)*MAX_CONTEXT_INPUTS*256*sizeof(pixel_t));
 
     for (size_t i = 0; i < quant_table_count; i++)
     {
@@ -916,6 +980,9 @@ void File_Ffv1::FrameHeader()
             Get_RU (States, intra,                              "intra");
     }
 
+    //Marking handling of 16-bit overflow computing
+    is_overflow_16bit=(colorspace_type==0 && bits_per_raw_sample==16 && (coder_type==1 || coder_type==2))?true:false; //TODO: check in FFmpeg the version when the stream is fixed. Note: only with YUV colorspace
+
     FILLING_BEGIN();
         if (Frame_Count==0)
         {
@@ -1149,7 +1216,7 @@ void File_Ffv1::plane(int32u pos)
     bits_mask2 = 1 << (bits_max - 1);
     bits_mask3 = bits_mask2 - 1;
 
-    int16s *sample[2];
+    pixel_t *sample[2];
     sample[0] = current_slice->sample_buffer + 3;
     sample[1] = sample[0] + current_slice->w + 6;
 
@@ -1195,7 +1262,7 @@ void File_Ffv1::rgb()
 
     size_t c_max = alpha_plane ? 4 : 3;
 
-    int16s *sample[4][2];
+    pixel_t *sample[4][2];
 
     current_slice->run_index = 0;
 
@@ -1262,17 +1329,27 @@ static inline int32s get_median_number(int32s one, int32s two, int32s three)
 }
 
 //---------------------------------------------------------------------------
-static inline int32s predict(int16s *current, int16s *current_top)
+static inline int32s predict(pixel_t *current, pixel_t *current_top, bool is_overflow_16bit)
 {
-    int32s LeftTop = current_top[-1];
-    int32s Top = current_top[0];
-    int32s Left = current[-1];
+    int32s LeftTop, Top, Left;
+    if (is_overflow_16bit)
+    {
+        LeftTop = (int16s)current_top[-1];
+        Top = (int16s)current_top[0];
+        Left = (int16s)current[-1];
+    }
+    else
+    {
+        LeftTop = current_top[-1];
+        Top = current_top[0];
+        Left = current[-1];
+    }
 
     return get_median_number(Left, Left + Top - LeftTop, Top);
 }
 
 //---------------------------------------------------------------------------
-static inline int get_context_3(int16s quant_table[MAX_CONTEXT_INPUTS][256], int16s *src, int16s *last)
+static inline int get_context_3(pixel_t quant_table[MAX_CONTEXT_INPUTS][256], pixel_t *src, pixel_t *last)
 {
     const int LT = last[-1];
     const int T  = last[0];
@@ -1283,7 +1360,7 @@ static inline int get_context_3(int16s quant_table[MAX_CONTEXT_INPUTS][256], int
         + quant_table[1][(LT - T) & 0xFF]
         + quant_table[2][(T - RT) & 0xFF];
 }
-static inline int get_context_5(int16s quant_table[MAX_CONTEXT_INPUTS][256], int16s *src, int16s *last)
+static inline int get_context_5(pixel_t quant_table[MAX_CONTEXT_INPUTS][256], pixel_t *src, pixel_t *last)
 {
     const int LT = last[-1];
     const int T  = last[0];
@@ -1420,15 +1497,15 @@ int32s File_Ffv1::pixel_GR(int32s context)
 }
 
 //---------------------------------------------------------------------------
-void File_Ffv1::line(int pos, int16s *sample[2])
+void File_Ffv1::line(int pos, pixel_t *sample[2])
 {
     // TODO: slice_coding_mode (version 4)
 
     quant_table_struct& quant_table = quant_tables[quant_table_index[pos]];
     bool Is5 = quant_table[3][127] ? true : false;
-    int16s* s0c = sample[0];
-    int16s* s0e = s0c + current_slice->w;
-    int16s* s1c = sample[1];
+    pixel_t* s0c = sample[0];
+    pixel_t* s0e = s0c + current_slice->w;
+    pixel_t* s1c = sample[1];
 
     if (coder_type)
     {
@@ -1438,7 +1515,7 @@ void File_Ffv1::line(int pos, int16s *sample[2])
         {
             int32s context = Is5 ? get_context_5(quant_table, s1c, s0c) : get_context_3(quant_table, s1c, s0c);
 
-            int32s Value = predict(s1c, s0c);
+            int32s Value = predict(s1c, s0c, is_overflow_16bit);
             #if MEDIAINFO_TRACE_FFV1CONTENT
                 if (context >= 0)
                     Value += pixel_RC(context);
@@ -1467,7 +1544,7 @@ void File_Ffv1::line(int pos, int16s *sample[2])
         {
             int32s context = Is5 ? get_context_5(quant_table, s1c, s0c) : get_context_3(quant_table, s1c, s0c);
 
-            *s1c = (predict(s1c, s0c) + (context >= 0 ? pixel_GR(context) : -pixel_GR(-context))) & bits_mask1;
+            *s1c = (predict(s1c, s0c, is_overflow_16bit) + (context >= 0 ? pixel_GR(context) : -pixel_GR(-context))) & bits_mask1;
 
             s0c++;
             s1c++;
@@ -1543,21 +1620,6 @@ void File_Ffv1::read_quant_table(int i, int j, size_t scale)
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-int32u File_Ffv1::CRC_Compute(size_t Size)
-{
-    int32u CRC_32=0;
-    const int8u* CRC_32_Buffer=Buffer+Buffer_Offset+(size_t)Element_Offset;
-    const int8u* CRC_32_Buffer_End=CRC_32_Buffer+Size;
-
-    while(CRC_32_Buffer<CRC_32_Buffer_End)
-    {
-        CRC_32=(CRC_32<<8) ^ Psi_CRC_32_Table[(CRC_32>>24)^(*CRC_32_Buffer)];
-        CRC_32_Buffer++;
-    }
-    return CRC_32;
-}
-
-//---------------------------------------------------------------------------
 int32s File_Ffv1::golomb_rice_decode(int k)
 {
 #if MEDIAINFO_TRACE_FFV1CONTENT
diff --git a/Source/MediaInfo/Video/File_Ffv1.h b/Source/MediaInfo/Video/File_Ffv1.h
index a3358fb..5612e88 100644
--- a/Source/MediaInfo/Video/File_Ffv1.h
+++ b/Source/MediaInfo/Video/File_Ffv1.h
@@ -46,6 +46,11 @@ const int32u RUN_MODE_STOP = 0;
 const int32u RUN_MODE_PROCESSING = 1;
 const int32u RUN_MODE_INTERRUPTED = 2;
 
+namespace FFV1
+{
+    typedef int32s pixel_t;
+}
+
 class Slice
 {
 public:
@@ -77,7 +82,7 @@ public:
             delete [] sample_buffer;
             sample_buffer = NULL;
         }
-        sample_buffer = new int16s[size];
+        sample_buffer = new FFV1::pixel_t[size];
     }
 
     void    run_index_init() { run_index=0; }
@@ -91,7 +96,7 @@ public:
     int32u  run_index;
     int32u  run_mode;
     int32s  run_segment_length;
-    int16s* sample_buffer;
+    FFV1::pixel_t* sample_buffer;
 
     class Context
     {
@@ -169,7 +174,7 @@ public:
 // Class File_Ffv1
 //***************************************************************************
 
-typedef int16s quant_table_struct2[256];
+typedef FFV1::pixel_t quant_table_struct2[256];
 typedef quant_table_struct2 quant_table_struct[MAX_CONTEXT_INPUTS];
 
 class File_Ffv1 : public File__Analyze
@@ -197,11 +202,10 @@ private :
     void   Filling_FrameHeader(int32u intra);
     int    slice(states &States);
     int    slice_header(states &States);
-    int32u CRC_Compute(size_t Size);
     int32s get_symbol_with_bias_correlation(Slice::ContextPtr context);
     void rgb();
     void plane(int32u pos);
-    void line(int pos, int16s *sample[2]);
+    void line(int pos, FFV1::pixel_t *sample[2]);
     int32s pixel_GR(int32s context);
     int32s pixel_RC(int32s context);
     void read_quant_tables(int i);
@@ -266,12 +270,13 @@ private :
     bool    keyframe;
     bool    chroma_planes;
     bool    alpha_plane;
+    bool    is_overflow_16bit;
     state_transitions state_transitions_table;
 
     //TEMP
     static const int32u PREFIX_MAX = 12; //limit
     int8u bits_max;
-    int16u bits_mask1;
+    int32s bits_mask1;
     int32s bits_mask2;
     int32s bits_mask3;
     states_context_plane Context_RC; // Range Coder context
diff --git a/Source/MediaInfo/Video/File_H263.cpp b/Source/MediaInfo/Video/File_H263.cpp
index 963b48e..393897d 100644
--- a/Source/MediaInfo/Video/File_H263.cpp
+++ b/Source/MediaInfo/Video/File_H263.cpp
@@ -36,7 +36,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* H263_Source_Format[]=
+static const char* H263_Source_Format[]=
 {
     "",
     "sub-QCIF",
@@ -49,7 +49,7 @@ const char* H263_Source_Format[]=
 };
 
 //---------------------------------------------------------------------------
-const int16u H263_Source_Format_Width[]=
+static const int16u H263_Source_Format_Width[]=
 {
     0,
     128,
@@ -62,7 +62,7 @@ const int16u H263_Source_Format_Width[]=
 };
 
 //---------------------------------------------------------------------------
-const int16u H263_Source_Format_Height[]=
+static const int16u H263_Source_Format_Height[]=
 {
     0,
     96,
@@ -75,7 +75,7 @@ const int16u H263_Source_Format_Height[]=
 };
 
 //---------------------------------------------------------------------------
-const int8u H263_PAR_W[]=
+static const int8u H263_PAR_W[]=
 {
     0,
     12,
@@ -95,7 +95,7 @@ const int8u H263_PAR_W[]=
     0,
 };
 
-const int8u H263_PAR_H[]=
+static const int8u H263_PAR_H[]=
 {
     0,
     11,
diff --git a/Source/MediaInfo/Video/File_Hevc.cpp b/Source/MediaInfo/Video/File_Hevc.cpp
index 92a653b..ef56525 100644
--- a/Source/MediaInfo/Video/File_Hevc.cpp
+++ b/Source/MediaInfo/Video/File_Hevc.cpp
@@ -32,6 +32,7 @@
 #include <algorithm>
 #if MEDIAINFO_EVENTS
     #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
+    #include "MediaInfo/MediaInfo_Config_PerPackage.h"
     #include "MediaInfo/MediaInfo_Events.h"
     #include "MediaInfo/MediaInfo_Events_Internal.h"
 #endif //MEDIAINFO_EVENTS
@@ -46,7 +47,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const int8u Hevc_SubWidthC[]=
+static const int8u Hevc_SubWidthC[]=
 {
     1,
     2,
@@ -55,7 +56,7 @@ const int8u Hevc_SubWidthC[]=
 };
 
 //---------------------------------------------------------------------------
-const int8u Hevc_SubHeightC[]=
+static const int8u Hevc_SubHeightC[]=
 {
     1,
     2,
@@ -64,13 +65,13 @@ const int8u Hevc_SubHeightC[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Hevc_tier_flag(bool tier_flag)
+static const char* Hevc_tier_flag(bool tier_flag)
 {
     return tier_flag ? "High" : "Main";
 }
 
 //---------------------------------------------------------------------------
-const char* Hevc_profile_idc(int32u profile_idc)
+static const char* Hevc_profile_idc(int32u profile_idc)
 {
     switch (profile_idc)
     {
@@ -83,7 +84,7 @@ const char* Hevc_profile_idc(int32u profile_idc)
 }
 
 //---------------------------------------------------------------------------
-const char* Hevc_chroma_format_idc(int8u chroma_format_idc)
+static const char* Hevc_chroma_format_idc(int8u chroma_format_idc)
 {
     switch (chroma_format_idc)
     {
@@ -96,7 +97,7 @@ const char* Hevc_chroma_format_idc(int8u chroma_format_idc)
 }
 
 //---------------------------------------------------------------------------
-const char* Hevc_pic_type[]=
+static const char* Hevc_pic_type[]=
 {
     "I",
     "I, P",
@@ -111,7 +112,7 @@ const char* Hevc_pic_type[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Hevc_slice_type(int32u slice_type)
+static const char* Hevc_slice_type(int32u slice_type)
 {
     switch (slice_type)
     {
@@ -208,10 +209,12 @@ void File_Hevc::Streams_Fill()
         Fill(Stream_Video, 0, "MaxCLL", Ztring::ToZtring(maximum_content_light_level) + __T(" cd/m2"));
     if (maximum_frame_average_light_level)
         Fill(Stream_Video, 0, "MaxFALL", Ztring::ToZtring(maximum_frame_average_light_level) + __T(" cd/m2"));
-    if (chroma_sample_loc_type_top_field!=(int32u)-1)
-        Fill(Stream_Video, 0, "ChromaSubsampling_Position", __T("Type ") + Ztring::ToZtring(chroma_sample_loc_type_top_field));
-    if (chroma_sample_loc_type_bottom_field!=(int32u)-1 && chroma_sample_loc_type_bottom_field!=chroma_sample_loc_type_bottom_field)
-        Fill(Stream_Video, 0, "ChromaSubsampling_Position", __T("Type ") + Ztring::ToZtring(chroma_sample_loc_type_bottom_field));
+    if (chroma_sample_loc_type_top_field != (int32u)-1)
+    {
+	Fill(Stream_Video, 0, "ChromaSubsampling_Position", __T("Type ") + Ztring::ToZtring(chroma_sample_loc_type_top_field));
+	if (chroma_sample_loc_type_bottom_field != (int32u)-1 && chroma_sample_loc_type_bottom_field != chroma_sample_loc_type_top_field)
+		Fill(Stream_Video, 0, "ChromaSubsampling_Position", __T("Type ") + Ztring::ToZtring(chroma_sample_loc_type_bottom_field));
+    }
 }
 
 //---------------------------------------------------------------------------
@@ -413,6 +416,7 @@ bool File_Hevc::Demux_UnpacketizeContainer_Test()
 
         //Computing final size
         size_t TranscodedBuffer_Size=0;
+        size_t Buffer_Offset_Save=Buffer_Offset;
         while (Buffer_Offset+lengthSizeMinusOne+1+1<=Buffer_Size)
         {
             size_t Size;
@@ -480,7 +484,7 @@ bool File_Hevc::Demux_UnpacketizeContainer_Test()
             TranscodedBuffer_Size+=Size;
             Buffer_Offset+=Size;
         }
-        Buffer_Offset=0;
+        Buffer_Offset=Buffer_Offset_Save;
 
         //Adding VPS/SPS/PPS sizes
         if (RandomAccess)
@@ -678,7 +682,14 @@ bool File_Hevc::Demux_UnpacketizeContainer_Test()
         File_Hevc* MI=new File_Hevc;
         Element_Code=(int64u)-1;
         Open_Buffer_Init(MI);
+        #ifdef MEDIAINFO_EVENTS
+            MediaInfo_Config_PerPackage* Config_PerPackage_Temp=MI->Config->Config_PerPackage;
+            MI->Config->Config_PerPackage=NULL;
+        #endif //MEDIAINFO_EVENTS
         Open_Buffer_Continue(MI, Buffer, Buffer_Size);
+        #ifdef MEDIAINFO_EVENTS
+            MI->Config->Config_PerPackage=Config_PerPackage_Temp;
+        #endif //MEDIAINFO_EVENTS
         bool IsOk=MI->Status[IsAccepted];
         delete MI;
         if (!IsOk)
@@ -2195,6 +2206,25 @@ void File_Hevc::slice_segment_header()
     Skip_BS(Data_BS_Remain(),                                   "(ToDo)");
 
     Element_End0();
+
+    #if MEDIAINFO_EVENTS
+        if (first_slice_segment_in_pic_flag)
+        {
+            switch(Element_Code)
+            {
+                case 19 :
+                case 20 :   // This is an IDR frame
+                            if (Config->Config_PerPackage && Element_Code==0x05) // First slice of an IDR frame
+                            {
+                                // IDR
+                                Config->Config_PerPackage->FrameForAlignment(this, true);
+                                Config->Config_PerPackage->IsClosedGOP(this);
+                            }
+                            break;
+                default:    ; // This is not an IDR frame
+            }
+        }
+    #endif //MEDIAINFO_EVENTS
 }
 
 //---------------------------------------------------------------------------
diff --git a/Source/MediaInfo/Video/File_HuffYuv.cpp b/Source/MediaInfo/Video/File_HuffYuv.cpp
index c03395e..703c527 100644
--- a/Source/MediaInfo/Video/File_HuffYuv.cpp
+++ b/Source/MediaInfo/Video/File_HuffYuv.cpp
@@ -42,7 +42,7 @@ namespace MediaInfoLib
 // Info
 //***************************************************************************
 
-const char* HuffYUV_ColorSpace (int16u BitCount)
+static const char* HuffYUV_ColorSpace (int16u BitCount)
 {
     switch (BitCount&0xFFF8)
     {
@@ -54,7 +54,7 @@ const char* HuffYUV_ColorSpace (int16u BitCount)
     }
 }
 
-const char* HuffYUV_ChromaSubsampling (int16u BitCount)
+static const char* HuffYUV_ChromaSubsampling (int16u BitCount)
 {
     switch (BitCount&0xFFF8)
     {
@@ -64,7 +64,7 @@ const char* HuffYUV_ChromaSubsampling (int16u BitCount)
     }
 }
 
-const string HuffYUV_ColorSpace(bool rgb, bool chroma, bool alpha)
+static const string HuffYUV_ColorSpace(bool rgb, bool chroma, bool alpha)
 {
     string ToReturn;
 
@@ -83,7 +83,7 @@ const string HuffYUV_ColorSpace(bool rgb, bool chroma, bool alpha)
     return ToReturn;
 }
 
-const char* HuffYUV_method (int16u BitCount, int8u method)
+static const char* HuffYUV_method (int16u BitCount, int8u method)
 {
     switch (BitCount&0x0007)
     {
diff --git a/Source/MediaInfo/Video/File_Mpeg4v.cpp b/Source/MediaInfo/Video/File_Mpeg4v.cpp
index c65a61a..7153531 100644
--- a/Source/MediaInfo/Video/File_Mpeg4v.cpp
+++ b/Source/MediaInfo/Video/File_Mpeg4v.cpp
@@ -35,6 +35,9 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
+extern const float64 Mpegv_frame_rate[16];
+
+//---------------------------------------------------------------------------
 const char* Mpeg4v_Profile_Level(int32u Profile_Level)
 {
     switch (Profile_Level)
@@ -91,6 +94,8 @@ const char* Mpeg4v_Profile_Level(int32u Profile_Level)
         case B8(11100110) : return "Core Studio at L2";
         case B8(11100111) : return "Core Studio at L3";
         case B8(11101000) : return "Core Studio at L4";
+        case B8(11101011) : return "Simple Studio at L5";
+        case B8(11101100) : return "Simple Studio at L6";
         case B8(11110000) : return "Advanced Simple at L0";
         case B8(11110001) : return "Advanced Simple at L1";
         case B8(11110010) : return "Advanced Simple at L2";
@@ -142,8 +147,8 @@ const char* Mpeg4v_Colorimetry[]=
 {
     "",
     "4:2:0",
-    "",
-    "",
+    "4:2:2",
+    "4:4:4",
 };
 
 //---------------------------------------------------------------------------
@@ -313,6 +318,8 @@ void File_Mpeg4v::Synched_Init()
     fixed_vop_time_increment=0;
     Time_Begin_Seconds=(int32u)-1;
     Time_End_Seconds=(int32u)-1;
+    bit_rate=(int32u)-1;
+    vbv_buffer_size=(int32u)-1;
     Time_Begin_MilliSeconds=(int16u)-1;
     Time_End_MilliSeconds=(int16u)-1;
     object_layer_width=0;
@@ -332,6 +339,7 @@ void File_Mpeg4v::Synched_Init()
     colour_primaries=(int8u)-1;
     transfer_characteristics=(int8u)-1;
     matrix_coefficients=(int8u)-1;
+    frame_rate_code=(int8u)-1;
     quarter_sample=false;
     low_delay=false;
     load_intra_quant_mat=false;
@@ -340,6 +348,7 @@ void File_Mpeg4v::Synched_Init()
     load_nonintra_quant_mat_grayscale=false;
     interlaced=false;
     newpred_enable=0;
+    visual_object_type=0;
     time_size=0;
     reduced_resolution_vop_enable=0;
     scalability=0;
@@ -368,6 +377,7 @@ void File_Mpeg4v::Synched_Init()
     sadct=false;
     quarterpel=false;
     quant_type=false;
+    rgb_components=false;
 
     if (!IsSub)
         FrameInfo.DTS=0;
@@ -375,10 +385,13 @@ void File_Mpeg4v::Synched_Init()
     //Default stream values
     Streams.resize(0x100);
     Streams[0x00].Searching_Payload=true; //video_object_start
-    Streams[0x20].Searching_Payload=true; //video_object_layer_start
+    if (!IsRawStream) //TODO: better detection in all cases. Currently there are too many false-positives if we test all files
+        Streams[0x20].Searching_Payload=true; //video_object_layer_start
     Streams[0xB0].Searching_Payload=true; //visual_object_sequence_start
-    Streams[0xB5].Searching_Payload=true; //visual_object_start
-    NextCode_Add(0x20); //video_object_layer_start
+    NextCode_Add(0x00); //video_object_start
+    if (!IsRawStream) //TODO: better detection in all cases. Currently there are too many false-positives if we test all files
+        NextCode_Add(0x20); //video_object_layer_start
+    NextCode_Add(0xB0); //visual_object_sequence_start
     for (int8u Pos=0xFF; Pos>=0xB9; Pos--)
         Streams[Pos].Searching_Payload=true; //Testing MPEG-PS
 }
@@ -401,6 +414,12 @@ void File_Mpeg4v::Streams_Fill()
         Fill(Stream_Video, 0, Video_Codec_Profile, Mpeg4v_Profile_Level(profile_and_level_indication));
     }
 
+    if (frame_rate_code!=(int8u)-1)
+        Fill(Stream_Video, StreamPos_Last, Video_FrameRate, Mpegv_frame_rate[frame_rate_code]);
+    if (bit_rate!=(int32u)-1)
+        Fill(Stream_Video, StreamPos_Last, Video_BitRate_Nominal, bit_rate*400);
+    if (vbv_buffer_size!=(int32u)-1)
+        Fill(Stream_Video, StreamPos_Last, Video_BufferSize, vbv_buffer_size*2048);
     if (fixed_vop_time_increment && vop_time_increment_resolution)
         Fill(Stream_Video, StreamPos_Last, Video_FrameRate, ((float)vop_time_increment_resolution)/fixed_vop_time_increment);
     if (object_layer_height)
@@ -417,7 +436,7 @@ void File_Mpeg4v::Streams_Fill()
         Fill(Stream_Video, 0, Video_PixelAspectRatio, PixelAspectRatio_Value, 3, true);
         Fill(Stream_Video, StreamPos_Last, Video_DisplayAspectRatio, ((float)object_layer_width)/object_layer_height*PixelAspectRatio_Value, 3, true);
     }
-    Fill(Stream_Video, 0, Video_ColorSpace, "YUV");
+    Fill(Stream_Video, 0, Video_ColorSpace, rgb_components?"RGB":"YUV");
     Fill(Stream_Video, 0, Video_BitDepth, bits_per_pixel);
     if (chroma_format<4)
         Fill(Stream_Video, 0, Video_Colorimetry, Mpeg4v_Colorimetry[chroma_format]);
@@ -827,6 +846,16 @@ void File_Mpeg4v::video_object_start()
         Trusted_IsNot("size is wrong");
         return;
     }
+
+    FILLING_BEGIN();
+        //NextCode
+        NextCode_Test();
+        NextCode_Clear();
+        NextCode_Add(0x20); //video_object_layer_start
+
+        //Autorisation of other streams
+        Streams[0x20].Searching_Payload=true; //video_object_layer_start
+    FILLING_END();
 }
 
 //---------------------------------------------------------------------------
@@ -846,6 +875,55 @@ void File_Mpeg4v::video_object_layer_start()
     BS_Begin();
     Skip_SB(                                                    "random_accessible_vol");
     Skip_S1(8,                                                  "video_object_type_indication");
+    if (profile_and_level_indication>=B8(11100001) && profile_and_level_indication<=B8(11101000)) // Test if "Studio" profile
+    {
+        Get_S1 ( 4, visual_object_verid,                        "video_object_layer_verid");  Param_Info1(Mpeg4v_video_object_layer_verid[video_object_layer_verid]);
+        Get_S1 (2, shape,                                       "video_object_layer_shape");
+        Get_S1 (4, shape_extension,                             "video_object_layer_shape_extension");
+        Get_SB (interlaced,                                     "progressive_sequence");
+        interlaced=!interlaced; //this is progressive_sequence so the opposite
+        if (shape!=2) //Shape!=BinaryOnly
+        {
+            Get_SB (   rgb_components,                          "rgb_components");
+            Get_S1 (2, chroma_format,                           "chroma_format"); Param_Info1(Mpeg4v_Colorimetry[chroma_format]);
+            Get_S1 (4, bits_per_pixel,                          "bits_per_pixel");
+        }
+        if (shape==0) //Shape=Rectangular
+        {
+            Mark_1 ();
+            Get_S2 (14, object_layer_width,                     "video_object_layer_width");
+            Mark_1 ();
+            Get_S2 (14, object_layer_height,                    "video_object_layer_height");
+            Mark_1 ();
+        }
+        Get_S1 (4, aspect_ratio_info,                           "aspect_ratio_info");
+        if (aspect_ratio_info==0x0F)
+        {
+            Get_S1 (8, par_width,                               "par_width");
+            Get_S1 (8, par_height,                              "par_height");
+        }
+        Get_S1 (4, frame_rate_code,                             "frame_rate_code"); Param_Info1(Mpegv_frame_rate[frame_rate_code]);
+            int16u first_half_bit_rate, latter_half_bit_rate, first_half_vbv_buffer_size, latter_half_vbv_buffer_size;
+            Get_S2 (15, first_half_bit_rate,                    "first_half_bit_rate");
+            Mark_1 ();
+            Get_S2(15, latter_half_bit_rate,                    "latter_half_bit_rate");
+            Mark_1 ();
+            Get_S2 (15, first_half_vbv_buffer_size,             "first_half_vbv_buffer_size");
+            Mark_1 ();
+            Get_S2 ( 3, latter_half_vbv_buffer_size,            "latter_half_vbv_buffer_size");
+            Skip_S2(11,                                         "first_half_vbv_occupancy");
+            Mark_1 ();
+            Skip_S2(15,                                         "latter_half_vbv_occupancy");
+            Mark_1 ();
+            bit_rate=first_half_bit_rate*0x8000+latter_half_bit_rate;
+            vbv_buffer_size=first_half_vbv_buffer_size*0x8+latter_half_vbv_buffer_size;
+        Get_SB (   low_delay,                                   "low_delay");
+        Skip_SB(                                                "mpeg2_stream");
+        BS_End();
+        Skip_XX(Element_Size-Element_Offset,                    "(TODO)");
+    }
+    else
+    {
     TEST_SB_SKIP(                                               "is_object_layer_identifier");
         Get_S1 (4, video_object_layer_verid,                    "video_object_layer_verid"); Param_Info1(Mpeg4v_video_object_layer_verid[video_object_layer_verid]);
         Skip_S1(3,                                              "video_object_layer_priority");
@@ -857,20 +935,23 @@ void File_Mpeg4v::video_object_layer_start()
         Get_S1 (8, par_height,                                  "par_height");
     }
     TEST_SB_SKIP(                                               "vol_control_parameters");
-        Get_S1 (2, chroma_format,                               "chroma_format");
+        Get_S1 (2, chroma_format,                               "chroma_format"); Param_Info1(Mpeg4v_Colorimetry[chroma_format]);
         Get_SB (   low_delay,                                   "low_delay");
         TEST_SB_SKIP(                                           "vbv_parameters");
-            Skip_S2(15,                                         "first_half_bit_rate");
+            int16u first_half_bit_rate, latter_half_bit_rate, first_half_vbv_buffer_size, latter_half_vbv_buffer_size;
+            Get_S2 (15, first_half_bit_rate,                    "first_half_bit_rate");
             Mark_1 ();
-            Skip_S2(15,                                         "latter_half_bit_rate");
+            Get_S2(15, latter_half_bit_rate,                    "latter_half_bit_rate");
             Mark_1 ();
-            Skip_S2(15,                                         "first_half_vbv_Element_Size");
+            Get_S2 (15, first_half_vbv_buffer_size,             "first_half_vbv_buffer_size");
             Mark_1 ();
-            Skip_S1( 3,                                         "latter_half_vbv_Element_Size");
+            Get_S2 ( 3, latter_half_vbv_buffer_size,            "latter_half_vbv_buffer_size");
             Skip_S2(11,                                         "first_half_vbv_occupancy");
             Mark_1 ();
             Skip_S2(15,                                         "latter_half_vbv_occupancy");
             Mark_1 ();
+            bit_rate=first_half_bit_rate*0x8+latter_half_bit_rate;
+            vbv_buffer_size=first_half_vbv_buffer_size*0x8000+latter_half_vbv_buffer_size;
         TEST_SB_END();
     TEST_SB_END();
     Get_S1 (2, shape,                                           "video_object_layer_shape");
@@ -1131,9 +1212,10 @@ void File_Mpeg4v::video_object_layer_start()
         Skip_SB(                                                "resync_marker_disable");
     }
     BS_End();
+    }
 
     //Coherancy
-    if (object_layer_width==0 || object_layer_height==0 || ((float32)object_layer_width)/object_layer_height<((float32)0.1) || object_layer_width/object_layer_height>10)
+    if (shape!=2 && shape==0 && (object_layer_width==0 || object_layer_height==0 || ((float32)object_layer_width)/object_layer_height<((float32)0.1) || object_layer_width/object_layer_height>10))
         Trusted_IsNot("Problem with width and height!");
 
     FILLING_BEGIN();
@@ -1176,13 +1258,13 @@ void File_Mpeg4v::visual_object_sequence_start()
     Get_B1 (profile_and_level_indication,                       "profile_and_level_indication"); Param_Info1(Mpeg4v_Profile_Level(profile_and_level_indication));
 
     //Integrity
-    if (Element_Size>1)
+    if (profile_and_level_indication==0)
     {
-        Trusted_IsNot("Size is wrong");
+        Trusted_IsNot("profile_and_level_indication is wrong");
         return;
     }
 
-    FILLING_BEGIN();
+    FILLING_BEGIN_PRECISE();
         //NextCode
         NextCode_Clear();
         NextCode_Add(0xB1); //visual_object_sequence_end
@@ -1192,6 +1274,7 @@ void File_Mpeg4v::visual_object_sequence_start()
         //Autorisation of other streams
         Streams[0xB1].Searching_Payload=true, //visual_object_sequence_end
         Streams[0xB2].Searching_Payload=true; //user_data
+        Streams[0xB5].Searching_Payload=true; //visual_object_start
     FILLING_END();
 }
 
@@ -1201,7 +1284,7 @@ void File_Mpeg4v::visual_object_sequence_end()
 {
     Element_Name("visual_object_sequence_end");
 
-    FILLING_BEGIN();
+    FILLING_BEGIN_PRECISE();
         //NextCode
         NextCode_Clear();
         NextCode_Add(0xB0); //visual_object_sequence_start
@@ -1394,6 +1477,7 @@ void File_Mpeg4v::group_of_vop_start()
         NextCode_Clear();
         for (int8u Pos=0x00; Pos<0x1F; Pos++)
             NextCode_Add(Pos); //video_object_start
+        NextCode_Add(0xB6); //vop_start
     FILLING_END();
 }
 
@@ -1411,14 +1495,20 @@ void File_Mpeg4v::visual_object_start()
     Element_Name("visual_object_start");
 
     //Parsing
-    int8u visual_object_type;
     BS_Begin();
+    if (profile_and_level_indication>=B8(11100001) && profile_and_level_indication<=B8(11101000)) // Test if "Studio" profile
+    {
+        Get_S1 ( 4, visual_object_verid,                        "visual_object_verid");  Param_Info1(Mpeg4v_visual_object_verid[visual_object_verid]);
+    }
+    else
+    {
     TEST_SB_SKIP(                                               "is_visual_object_identifier");
         Get_S1 ( 4, visual_object_verid,                        "visual_object_verid");  Param_Info1(Mpeg4v_visual_object_verid[visual_object_verid]);
         Skip_BS( 3,                                             "visual_object_priority");
     TEST_SB_END();
+    }
     Get_S1 ( 4, visual_object_type,                             "visual_object_type"); Param_Info1(Mpeg4v_visual_object_type[visual_object_type]);
-    if (visual_object_type==1 || visual_object_type==2)
+    if (profile_and_level_indication<B8(11100001) || profile_and_level_indication>B8(11101000) && (visual_object_type==1 || visual_object_type==2))
     {
         TEST_SB_SKIP(                                           "video_signal_type");
             Skip_S1(3,                                          "video_format");
@@ -1429,14 +1519,17 @@ void File_Mpeg4v::visual_object_start()
                 Get_S1 (8, matrix_coefficients,                 "matrix_coefficients"); Param_Info1(Mpegv_matrix_coefficients(matrix_coefficients));
             TEST_SB_END();
         TEST_SB_END();
-        BS_End();
+    }
+    BS_End();
 
-        //Integrity
-        if (Element_Offset<Element_Size)
-            Trusted_IsNot("Size is wrong");
+    //Integrity
+    if (profile_and_level_indication>=B8(11100001) && profile_and_level_indication<=B8(11101000) && visual_object_type!=1)
+    {
+        Param_Info1("Not in specs"); 
+        Trusted_IsNot("Not in specs");
     }
 
-    FILLING_BEGIN();
+    FILLING_BEGIN_PRECISE();
         //NextCode
         NextCode_Clear();
         NextCode_Add(0xB2); //user_data
@@ -1474,11 +1567,89 @@ void File_Mpeg4v::vop_start()
     int32u vop_time_increment;
     int8u vop_coding_type;
     bool  vop_coded;
+    int8u modulo_time_base=0;
     BS_Begin();
+    if (profile_and_level_indication>=B8(11100001) && profile_and_level_indication<=B8(11101000)) // Test if "Studio" profile
+    {
+        Element_Begin1("time_code_smpte12m");
+        int8u Frames_Units, Frames_Tens, Seconds_Units, Seconds_Tens, Minutes_Units, Minutes_Tens, Hours_Units, Hours_Tens;
+        bool  DropFrame;
+        BS_Begin();
+
+        Skip_SB(                                                "CF - Color fame");
+        Get_SB (   DropFrame,                                   "DP - Drop frame");
+        Get_S1 (2, Frames_Tens,                                 "Frames (Tens)");
+        Get_S1 (4, Frames_Units,                                "Frames (Units)");
+
+        Skip_SB(                                                "FP - Field Phase / BGF0");
+        Get_S1 (3, Seconds_Tens,                                "Seconds (Tens)");
+        Get_S1 (4, Seconds_Units,                               "Seconds (Units)");
+
+        Mark_1();
+
+        Skip_SB(                                                "BGF0 / BGF2");
+        Get_S1 (3, Minutes_Tens,                                "Minutes (Tens)");
+        Get_S1 (4, Minutes_Units,                               "Minutes (Units)");
+
+        Skip_SB(                                                "BGF2 / Field Phase");
+        Skip_SB(                                                "BGF1");
+        Get_S1 (2, Hours_Tens,                                  "Hours (Tens)");
+        Get_S1 (4, Hours_Units,                                 "Hours (Units)");
+
+        Mark_1();
+
+        Skip_S1(4,                                              "BG2");
+        Skip_S1(4,                                              "BG1");
+
+        Skip_S1(4,                                              "BG4");
+        Skip_S1(4,                                              "BG3");
+
+        Mark_1();
+
+        Skip_S1(4,                                              "BG6");
+        Skip_S1(4,                                              "BG5");
+
+        Skip_S1(4,                                              "BG8");
+        Skip_S1(4,                                              "BG7");
+
+        Mark_1();
+        Skip_S4(4,                                              "reserved_bits");
+        Element_End0();
+
+        Skip_S2(10,                                             "temporal_reference");
+        Skip_S1(2,                                              "vop_structure");
+        Get_S1 (2, vop_coding_type,                             "vop_coding_type"); Param_Info1(Mpeg4v_vop_coding_type[vop_coding_type]);
+        Get_SB (   vop_coded,                                   "vop_coded");
+        if (vop_coded)
+        {
+            if (shape!=0) //Shape!=Rectangular
+            {
+                if (sprite_enable==1    //Sprite_Enable=Static
+                 && vop_coding_type==0) //Type=I
+                {
+                    Skip_S2(14,                                     "vop_width");
+                    Mark_1 ();
+                    Skip_S2(14,                                     "vop_height");
+                    Mark_1 ();
+                    Skip_S2(14,                                     "vop_horizontal_mc_spatial_ref");
+                    Mark_1 ();
+                    Skip_S2(14,                                     "vop_vertical_mc_spatial_ref");
+                    Mark_1 ();
+                }
+                }
+            Skip_SB(                                            "top_field_first");
+            Skip_SB(                                            "repeat_first_field");
+            Skip_SB(                                            "progressive_frame");
+                
+            BS_End();
+            Skip_XX(Element_Size-Element_Offset,                "(TODO)");
+        }
+    }
+    else
+    {
     Get_S1 (2, vop_coding_type,                                 "vop_coding_type"); Param_Info1(Mpeg4v_vop_coding_type[vop_coding_type]);
     Element_Info1(Mpeg4v_vop_coding_type[vop_coding_type]);
     bool modulo_time_base_Continue;
-    int8u modulo_time_base=0;
     do
     {
         Get_SB (modulo_time_base_Continue,                      "modulo_time_base");
@@ -1656,6 +1827,8 @@ void File_Mpeg4v::vop_start()
         }
         //...
     }
+    BS_End();
+    }
 
     if (!vop_coded)              //VOP with no data
         NVOP_Count++;
@@ -1684,7 +1857,7 @@ void File_Mpeg4v::vop_start()
 
     FILLING_BEGIN();
         //Duration
-        if (vop_time_increment_resolution)
+        if (!Mpeg4v_visual_object_type[visual_object_type][0] && vop_time_increment_resolution)
         {
             int16u Time=modulo_time_base*1000+(int16u)vop_time_increment*1000/vop_time_increment_resolution;
             while (Time_End_MilliSeconds!=(int16u)-1 && Time+500<Time_End_MilliSeconds)
diff --git a/Source/MediaInfo/Video/File_Mpeg4v.h b/Source/MediaInfo/Video/File_Mpeg4v.h
index 330d49b..4acf8ab 100644
--- a/Source/MediaInfo/Video/File_Mpeg4v.h
+++ b/Source/MediaInfo/Video/File_Mpeg4v.h
@@ -118,11 +118,14 @@ private :
     int32u fixed_vop_time_increment;
     int32u Time_Begin_Seconds;
     int32u Time_End_Seconds;
+    int32u bit_rate;
+    int32u vbv_buffer_size;
     int16u Time_Begin_MilliSeconds;
     int16u Time_End_MilliSeconds;
     int16u object_layer_width;
     int16u object_layer_height;
     int16u vop_time_increment_resolution;
+    int8u  visual_object_type;
     int8u  time_size;
     int8u  visual_object_verid;
     int8u  profile_and_level_indication;
@@ -138,6 +141,7 @@ private :
     int8u  colour_primaries;
     int8u  transfer_characteristics;
     int8u  matrix_coefficients;
+    int8u  frame_rate_code;
     bool   quarter_sample;
     bool   low_delay;
     bool   load_intra_quant_mat;
@@ -177,6 +181,7 @@ private :
     bool   data_partitioned;
     bool   reversible_vlc;
     bool   colour_description;
+    bool   rgb_components;
 
     //From user_data
     Ztring Library;
diff --git a/Source/MediaInfo/Video/File_Mpegv.cpp b/Source/MediaInfo/Video/File_Mpegv.cpp
index 477c47a..c77ffc6 100644
--- a/Source/MediaInfo/Video/File_Mpegv.cpp
+++ b/Source/MediaInfo/Video/File_Mpegv.cpp
@@ -42,6 +42,10 @@ extern const char* Mpegv_colour_primaries(int8u colour_primaries)
         case  7 : return "SMPTE 240M"; //Same as BT.601 NTSC
         case  8 : return "Generic film";
         case  9 : return "BT.2020";                                     //Added in HEVC
+        case 10 : return "XYZ";                                         //Added in HEVC 2014
+        case 11 : return "SMPTE RP 431-2";                              //Added in ISO 23001-8:201x/PDAM1
+        case 12 : return "SMPTE EG 432-1";                              //Added in ISO 23001-8:201x/PDAM1
+        case 22 : return "EBU Tech 3213";                               //Added in ISO 23001-8:201x/PDAM1
         default : return "";
     }
 }
@@ -66,6 +70,7 @@ extern const char* Mpegv_transfer_characteristics(int8u transfer_characteristics
         case 15 : return "BT.2020";                                     //Added in HEVC
         case 16 : return "SMPTE ST 2084";                               //Added in HEVC 2015
         case 17 : return "SMPTE ST 428-1";                              //Added in HEVC 2015
+        case 18 : return "HLG";                                         //Added in ISO 23001-8:201x/PDAM1
         default : return "";
     }
 }
@@ -84,6 +89,8 @@ extern const char* Mpegv_matrix_coefficients(int8u matrix_coefficients)
         case  8 : return "YCgCo";                                       //Added in AVC
         case  9 : return "BT.2020 non-constant";                        //Added in HEVC
         case 10 : return "BT.2020 constant";                            //Added in HEVC
+        case 11 : return "Chroma-derived non-constant";                 //Added in ISO 23001-8:201x/PDAM1
+        case 12 : return "Chroma-derived constant";                     //Added in ISO 23001-8:201x/PDAM1
         default : return "";
     }
 }
@@ -246,7 +253,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const float32 Mpegv_aspect_ratio1[]=
+static const float32 Mpegv_aspect_ratio1[]=
 {
     (float32)0,
     (float32)1,
@@ -267,7 +274,7 @@ const float32 Mpegv_aspect_ratio1[]=
 };
 
 //---------------------------------------------------------------------------
-const float32 Mpegv_aspect_ratio2[]=
+static const float32 Mpegv_aspect_ratio2[]=
 {
     (float32)0,
     (float32)1,
@@ -288,7 +295,7 @@ const float32 Mpegv_aspect_ratio2[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpegv_video_format[]=
+static const char* Mpegv_video_format[]=
 {
     "Component",
     "PAL",
@@ -301,7 +308,7 @@ const char* Mpegv_video_format[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Mpegv_picture_structure[]=
+static const char* Mpegv_picture_structure[]=
 {
     "",
     "T", //Top Field
@@ -309,7 +316,7 @@ const char* Mpegv_picture_structure[]=
     "F", //Frame
 };
 
-const char* Mpegv_picture_coding_type[]=
+static const char* Mpegv_picture_coding_type[]=
 {
     "",
     "I",
@@ -321,7 +328,7 @@ const char* Mpegv_picture_coding_type[]=
     "",
 };
 
-const char* Mpegv_extension_start_code_identifier[]=
+static const char* Mpegv_extension_start_code_identifier[]=
 {
     "",
     "Sequence",
@@ -343,7 +350,7 @@ const char* Mpegv_extension_start_code_identifier[]=
 
 //---------------------------------------------------------------------------
 #if MEDIAINFO_MACROBLOCKS
-const int8u Mpegv_block_count[4]=
+static const int8u Mpegv_block_count[4]=
 {
     0,
     6,
@@ -1265,6 +1272,8 @@ void File_Mpegv::Streams_Fill()
     //BitRate
     if (vbv_delay==0xFFFF || (MPEG_Version==1 && bit_rate_value==0x3FFFF))
         Fill(Stream_Video, 0, Video_BitRate_Mode, "VBR");
+    else
+        Fill(Stream_Video, 0, Video_BitRate_Mode, "CBR");
     if (bit_rate_value_IsValid && (bit_rate_extension>0 || bit_rate_value!=0x3FFFF))
         Fill(Stream_Video, 0, Video_BitRate_Maximum, ((((int32u)bit_rate_extension<<12))+bit_rate_value)*400);
 
@@ -3666,6 +3675,7 @@ void File_Mpegv::sequence_header()
 
         //Setting as OK
         sequence_header_IsParsed=true;
+        FirstFieldFound=false;
         if (Frame_Count==0 && FrameInfo.DTS==(int64u)-1)
             FrameInfo.DTS=0; //No DTS in container
 
diff --git a/Source/MediaInfo/Video/File_ProRes.cpp b/Source/MediaInfo/Video/File_ProRes.cpp
index 7a1066e..9a0f834 100644
--- a/Source/MediaInfo/Video/File_ProRes.cpp
+++ b/Source/MediaInfo/Video/File_ProRes.cpp
@@ -37,7 +37,7 @@ const char* Mpegv_transfer_characteristics(int8u transfer_characteristics);
 const char* Mpegv_matrix_coefficients(int8u matrix_coefficients);
 
 //---------------------------------------------------------------------------
-const char* ProRes_chrominance_factor(int8u chrominance_factor)
+static const char* ProRes_chrominance_factor(int8u chrominance_factor)
 {
     switch (chrominance_factor)
     {
@@ -48,7 +48,7 @@ const char* ProRes_chrominance_factor(int8u chrominance_factor)
 }
 
 //---------------------------------------------------------------------------
-const char* ProRes_frame_type_ScanType(int8u frame_type)
+static const char* ProRes_frame_type_ScanType(int8u frame_type)
 {
     switch (frame_type)
     {
@@ -60,7 +60,7 @@ const char* ProRes_frame_type_ScanType(int8u frame_type)
 }
 
 //---------------------------------------------------------------------------
-const char* ProRes_frame_type_ScanOrder(int8u frame_type)
+static const char* ProRes_frame_type_ScanOrder(int8u frame_type)
 {
     switch (frame_type)
     {
@@ -71,7 +71,7 @@ const char* ProRes_frame_type_ScanOrder(int8u frame_type)
 }
 
 //---------------------------------------------------------------------------
-Ztring ProRes_creatorID(int32u creatorID)
+static Ztring ProRes_creatorID(int32u creatorID)
 {
     switch (creatorID)
     {
diff --git a/Source/MediaInfo/Video/File_Vc1.cpp b/Source/MediaInfo/Video/File_Vc1.cpp
index 001cef5..c8734d9 100644
--- a/Source/MediaInfo/Video/File_Vc1.cpp
+++ b/Source/MediaInfo/Video/File_Vc1.cpp
@@ -54,7 +54,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const char* Vc1_Profile[]=
+static const char* Vc1_Profile[]=
 {
     "Simple",
     "Main",
@@ -63,7 +63,7 @@ const char* Vc1_Profile[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Vc1_ColorimetryFormat[]=
+static const char* Vc1_ColorimetryFormat[]=
 {
     "",
     "4:2:0",
@@ -72,7 +72,7 @@ const char* Vc1_ColorimetryFormat[]=
 };
 
 //---------------------------------------------------------------------------
-const float32 Vc1_PixelAspectRatio[]=
+static const float32 Vc1_PixelAspectRatio[]=
 {
     (float32)1, //Reserved
     (float32)1,
@@ -93,7 +93,7 @@ const float32 Vc1_PixelAspectRatio[]=
 };
 
 //---------------------------------------------------------------------------
-int32u Vc1_FrameRate_enr(int8u Code)
+static int32u Vc1_FrameRate_enr(int8u Code)
 {
     switch (Code)
     {
@@ -109,7 +109,7 @@ int32u Vc1_FrameRate_enr(int8u Code)
 }
 
 //---------------------------------------------------------------------------
-int16u Vc1_FrameRate_dr(int8u Code)
+static int16u Vc1_FrameRate_dr(int8u Code)
 {
     switch (Code)
     {
@@ -120,7 +120,7 @@ int16u Vc1_FrameRate_dr(int8u Code)
 }
 
 //---------------------------------------------------------------------------
-const char* Vc1_Type[]=
+static const char* Vc1_Type[]=
 {
     "I",
     "P",
@@ -130,7 +130,7 @@ const char* Vc1_Type[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Vc1_PictureFormat[]=
+static const char* Vc1_PictureFormat[]=
 {
     "Progressive frame",
     "Interlaced frame",
@@ -139,7 +139,7 @@ const char* Vc1_PictureFormat[]=
 };
 
 //---------------------------------------------------------------------------
-const int8u Vc1_FieldTypeTable[][2]=
+static const int8u Vc1_FieldTypeTable[][2]=
 {
     {0, 0},
     {0, 1},
@@ -164,7 +164,7 @@ const File__Analyze::vlc Vc1_ptype[]=
 };
 
 //---------------------------------------------------------------------------
-int32u Vc1_bfraction(int8u Size, int32u Value)
+static int32u Vc1_bfraction(int8u Size, int32u Value)
 {
     switch (Size)
     {
@@ -550,7 +550,7 @@ bool File_Vc1::Demux_UnpacketizeContainer_Test()
                     if (Buffer[Header_End  ]==0x00
                      && Buffer[Header_End+1]==0x00
                      && Buffer[Header_End+2]==0x01
-                     && Buffer[Header_End+2]==0x0D)
+                     && Buffer[Header_End+3]==0x0D)
                     break;
 
                 switch (Config->Demux_InitData_Get())
@@ -1108,7 +1108,7 @@ void File_Vc1::SequenceHeader()
             TEST_SB_END();
             TEST_SB_GET(framerate_present,                      "framerate_flag");
                 TESTELSE_SB_GET(framerate_form,                 "framerateind");
-                Get_S2 (16, framerateexp,                   "framerateexp"); Param_Info3((float32)((framerateexp+1)/32.0), " fps", 3);
+                    Get_S2 (16, framerateexp,                   "framerateexp"); Param_Info3((float32)((framerateexp+1)/32.0), " fps", 3);
                 TESTELSE_SB_ELSE(                               "framerateind");
                     Get_S1 ( 8, frameratecode_enr,              "frameratenr"); Param_Info1(Vc1_FrameRate_enr(frameratecode_enr));
                     Get_S1 ( 4, frameratecode_dr,               "frameratedr"); Param_Info1(Vc1_FrameRate_dr(frameratecode_dr));
diff --git a/Source/MediaInfo/Video/File_Vc3.cpp b/Source/MediaInfo/Video/File_Vc3.cpp
index eccbc04..a5feeea 100644
--- a/Source/MediaInfo/Video/File_Vc3.cpp
+++ b/Source/MediaInfo/Video/File_Vc3.cpp
@@ -35,7 +35,7 @@ namespace MediaInfoLib
 //***************************************************************************
 
 //---------------------------------------------------------------------------
-const bool Vc3_FromCID_IsSupported (int32u CompressionID)
+static const bool Vc3_FromCID_IsSupported (int32u CompressionID)
 {
     switch (CompressionID)
     {
@@ -59,7 +59,7 @@ const bool Vc3_FromCID_IsSupported (int32u CompressionID)
 }
 
 //---------------------------------------------------------------------------
-const int32u Vc3_CompressedFrameSize(int32u CompressionID)
+static const int32u Vc3_CompressedFrameSize(int32u CompressionID)
 {
     switch (CompressionID)
     {
@@ -83,7 +83,7 @@ const int32u Vc3_CompressedFrameSize(int32u CompressionID)
 };
 
 //---------------------------------------------------------------------------
-const int8u Vc3_SBD(int32u SBD) //Sample Bit Depth
+static const int8u Vc3_SBD(int32u SBD) //Sample Bit Depth
 {
     switch (SBD)
     {
@@ -94,7 +94,7 @@ const int8u Vc3_SBD(int32u SBD) //Sample Bit Depth
 };
 
 //---------------------------------------------------------------------------
-const int8u Vc3_SBD_FromCID (int32u CompressionID)
+static const int8u Vc3_SBD_FromCID (int32u CompressionID)
 {
     switch (CompressionID)
     {
@@ -119,7 +119,7 @@ const int8u Vc3_SBD_FromCID (int32u CompressionID)
 }
 
 //---------------------------------------------------------------------------
-const char* Vc3_FFC[4]=
+static const char* Vc3_FFC[4]=
 {
     "",
     "Progressive",
@@ -128,7 +128,7 @@ const char* Vc3_FFC[4]=
 };
 
 //---------------------------------------------------------------------------
-const char* Vc3_FFC_ScanOrder[4]=
+static const char* Vc3_FFC_ScanOrder[4]=
 {
     "",
     "",
@@ -137,21 +137,21 @@ const char* Vc3_FFC_ScanOrder[4]=
 };
 
 //---------------------------------------------------------------------------
-const char* Vc3_FFE[2]=
+static const char* Vc3_FFE[2]=
 {
     "Interlaced",
     "Progressive",
 };
 
 //---------------------------------------------------------------------------
-const char* Vc3_SST[2]=
+static const char* Vc3_SST[2]=
 {
     "Progressive",
     "Interlaced",
 };
 
 //---------------------------------------------------------------------------
-const char* Vc3_SST_FromCID (int32u CompressionID)
+static const char* Vc3_SST_FromCID (int32u CompressionID)
 {
     switch (CompressionID)
     {
@@ -172,7 +172,7 @@ const char* Vc3_SST_FromCID (int32u CompressionID)
 }
 
 //---------------------------------------------------------------------------
-const int16u Vc3_SPL_FromCID (int32u CompressionID)
+static const int16u Vc3_SPL_FromCID (int32u CompressionID)
 {
     switch (CompressionID)
     {
@@ -193,7 +193,7 @@ const int16u Vc3_SPL_FromCID (int32u CompressionID)
 }
 
 //---------------------------------------------------------------------------
-const int16u Vc3_ALPF_PerFrame_FromCID (int32u CompressionID)
+static const int16u Vc3_ALPF_PerFrame_FromCID (int32u CompressionID)
 {
     switch (CompressionID)
     {
@@ -214,7 +214,7 @@ const int16u Vc3_ALPF_PerFrame_FromCID (int32u CompressionID)
 }
 
 //---------------------------------------------------------------------------
-const char* Vc3_CLR[8]=
+static const char* Vc3_CLR[8]=
 {
     "YUV",
     "RGB",
@@ -227,7 +227,7 @@ const char* Vc3_CLR[8]=
 };
 
 //---------------------------------------------------------------------------
-const char* Vc3_CLR_FromCID (int32u CompressionID)
+static const char* Vc3_CLR_FromCID (int32u CompressionID)
 {
     switch (CompressionID)
     {
@@ -252,14 +252,14 @@ const char* Vc3_CLR_FromCID (int32u CompressionID)
 };
 
 //---------------------------------------------------------------------------
-const char* Vc3_SSC[2]=
+static const char* Vc3_SSC[2]=
 {
     "4:2:2",
     "4:4:4",
 };
 
 //---------------------------------------------------------------------------
-const char* Vc3_SSC_FromCID (int32u CompressionID)
+static const char* Vc3_SSC_FromCID (int32u CompressionID)
 {
     switch (CompressionID)
     {
diff --git a/Source/MediaInfo/XmlUtils.cpp b/Source/MediaInfo/XmlUtils.cpp
index fd400f9..6749164 100644
--- a/Source/MediaInfo/XmlUtils.cpp
+++ b/Source/MediaInfo/XmlUtils.cpp
@@ -48,6 +48,8 @@ namespace MediaInfoLib
 const char *LocalName(const XMLElement* Elem)
 {
     const char* Name=Elem->Name();
+    if (!Name)
+        return "";
     const char* Colon=strrchr(Name, ':');
     return Colon ? Colon+1 : Name;
 }
@@ -57,6 +59,8 @@ const char *LocalName(const XMLElement* Elem)
 const char *LocalName(const XMLElement* Elem, const char* &Ns /* out */)
 {
     const char* Name=Elem->Name();
+    if (!Name)
+        return "";
     if (const char* Colon=strrchr(Name, ':'))
     {
         // Search element and ancestors for given namespace prefix
diff --git a/Source/Resource/Text/DataBase/CodecID_Video_Mpeg4.csv b/Source/Resource/Text/DataBase/CodecID_Video_Mpeg4.csv
index fa9fedd..bdc7692 100644
--- a/Source/Resource/Text/DataBase/CodecID_Video_Mpeg4.csv
+++ b/Source/Resource/Text/DataBase/CodecID_Video_Mpeg4.csv
@@ -11,21 +11,38 @@ apco;ProRes;;;http://www.apple.com/quicktime/download/standalone.html;422 Proxy;
 ap4c;ProRes;;;http://www.apple.com/quicktime/download/standalone.html;4444;;;4:4:4
 ap4h;ProRes;;;http://www.apple.com/quicktime/download/standalone.html;4444;;;4:4:4
 ap4x;ProRes;;;http://www.apple.com/quicktime/download/standalone.html;4444 XQ;;;4:4:4
-ai11;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;;
-ai12;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;;
-ai13;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;;
-ai14;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;;
-ai15;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;;
-ai1q;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;;
-ai5q;AVC;;Advanced Video Coding;http://ffdshow-tryout.sourceforge.net;;;
+ai12;AVC;;Advanced Video Coding;;;;
+ai13;AVC;;Advanced Video Coding;;;;
+ai15;AVC;;Advanced Video Coding;;;;
+ai16;AVC;;Advanced Video Coding;;;;
+ai1p;AVC;;Advanced Video Coding;;;;
+ai1q;AVC;;Advanced Video Coding;;;;
+ai22;AVC;;Advanced Video Coding;;;;
+ai23;AVC;;Advanced Video Coding;;;;
+ai25;AVC;;Advanced Video Coding;;;;
+ai26;AVC;;Advanced Video Coding;;;;
+ai2p;AVC;;Advanced Video Coding;;;;
+ai2q;AVC;;Advanced Video Coding;;;;
+ai52;AVC;;Advanced Video Coding;;;;
+ai53;AVC;;Advanced Video Coding;;;;
+ai55;AVC;;Advanced Video Coding;;;;
+ai56;AVC;;Advanced Video Coding;;;;
+ai5p;AVC;;Advanced Video Coding;;;;
+ai5q;AVC;;Advanced Video Coding;;;;
 AV1x;YUV;;;;;;YUV;4:2:2
-avc1;AVC;;Advanced Video Coding;http://www.apple.com/quicktime/download/standalone.html;;;;
-avcp;AVC;;Advanced Video Coding Parameters;http://www.apple.com/quicktime/download/standalone.html;;;;
+avc1;AVC;;Advanced Video Coding;;;;;
+avc2;AVC;;Advanced Video Coding;;;;;
+avc3;AVC;;Advanced Video Coding;;;;;
+avc4;AVC;;Advanced Video Coding;;;;;
+avcp;AVC;;Advanced Video Coding Parameters;;;;
 AVDJ;JPEG;;Avid
 AVdv;DV;;Avid;http://www.apple.com/quicktime/download/standalone.html;;;YUV;4:2:2
 AVd1;DV;;Avid;http://www.apple.com/quicktime/download/standalone.html;;;
-AVdn;VC-3;DNxHD;Avid;http://www.apple.com/quicktime/download/standalone.html;;;;
+AVdn;VC-3;DNxHD;Avid;http://www.apple.com/quicktime/download/standalone.html;;;YUV;4:2:2
+AVin;AVC;;Advanced Video Coding;;;;;
+AVJI;Avid Meridien Compressed;;;;;;
 AVmp;MPEG Video;Avid IMX;;;;Version 2;;;
+AVUI;Avid Meridien Uncompressed;;;;;;
 avr ;JPEG;;;;;;;
 AVrp;RGB;Avid;;;;;RGB;
 b16g;Gray;;;;;;Y;16
@@ -128,6 +145,8 @@ Shr1;SheerVideo;;SheerVideo RGB;http://www.bitjazz.com/;;;;
 Shr2;SheerVideo;;SheerVideo Y'CbCr[A] 4:4:4;http://www.bitjazz.com/;;;;
 Shr3;SheerVideo;;SheerVideo Y'CbCr 4:2:2;http://www.bitjazz.com/;;;;
 Shr4;SheerVideo;;SheerVideo Y'CbCr 4:2:2;http://www.bitjazz.com/;;;;
+SJDS;SoftImage DS Compressed;;;;;;
+SUDS;SoftImage DS Uncompressed;;;;;;
 SV10;Sorenson;;Sorenson Media Video R1;http://www.apple.com/quicktime/download/standalone.html;;;;
 SVQ1;Sorenson 1;;Sorenson Media Video 1 (Apple QuickTime 3);http://www.apple.com/quicktime/download/standalone.html;;;;
 SVQ2;Sorenson 2;;Sorenson Media Video 2 (Apple QuickTime 4);http://www.apple.com/quicktime/download/standalone.html;;;;
diff --git a/Source/Resource/Text/DataBase/CodecID_Video_Riff.csv b/Source/Resource/Text/DataBase/CodecID_Video_Riff.csv
index 008346e..f884d8e 100644
--- a/Source/Resource/Text/DataBase/CodecID_Video_Riff.csv
+++ b/Source/Resource/Text/DataBase/CodecID_Video_Riff.csv
@@ -343,6 +343,7 @@ MDVF;DV;Pinnacle;Pinnacle DV/DV50/DVHD100;;;;YUV;
 MHFY;YUV;;A.M.Paredes mhuffyYUV (LossLess);http://mirror01.iptelecom.net.ua/~video/codecs/Pinnacle.ReelTime.v2.5.software.only.codec.exe;;;YUV;
 MJ2C;JPEG 2000;;Morgan Multimedia JPEG 2000 Compression;http://mirror01.iptelecom.net.ua/~video/codecs/Pinnacle.ReelTime.v2.5.software.only.codec.exe;;;;
 MJPA;JPEG;Pinacle;Pinnacle ReelTime MJPG hardware;http://mediaxw.sourceforge.net;;;YUV
+mjp2;JPEG 2000;;;;;;
 MJPB;JPEG;Pinacle B;;;;;YUV
 MJPG;JPEG;;;;;;YUV
 mJPG;JPEG;IBM;Including Huffman Tables;;;;YUV
diff --git a/Source/Resource/Text/DataBase/Format.csv b/Source/Resource/Text/DataBase/Format.csv
index a67c436..52fbe39 100644
--- a/Source/Resource/Text/DataBase/Format.csv
+++ b/Source/Resource/Text/DataBase/Format.csv
@@ -70,7 +70,7 @@ AU;;;A;Au;uLaw/AU Audio File;au;audio/basic;;
 DolbyE;;;A;Aes3;;dde
 DTS;;;A;Dts;Digital Theater Systems;dts;;;Lossy
 DTS-HD;;;A;Dts;Digital Theater Systems;dts;;;Lossy
-E-AC-3;;;A;Ac3;Audio Coding 3;dd+ ec3;audio/eac3;;Lossy
+E-AC-3;;;A;Ac3;Enhanced Audio Coding 3;dd+ ec3;audio/eac3;;Lossy
 Extended Module;;;A;ExtendedModule;;xm;;;
 FLAC;;;A;Flac;Free Lossless Audio Codec;flac;;http://flac.sourceforge.net/;
 G.719;;;A;;;;audio/G719;;Lossy
diff --git a/Source/Resource/Text/Stream/General.csv b/Source/Resource/Text/Stream/General.csv
index 0f200a6..c2c81d8 100644
--- a/Source/Resource/Text/Stream/General.csv
+++ b/Source/Resource/Text/Stream/General.csv
@@ -16,13 +16,13 @@ UniqueID;;;N YIY;;;The unique ID for this stream, should be copied with stream c
 UniqueID/String;;;Y NT;;;The unique ID for this stream, should be copied with stream copy
 MenuID;;;N YIY;;;The menu ID for this stream in this file
 MenuID/String;;;Y NT;;;The menu ID for this stream in this file
-GeneralCount;1;;N NI;;;Number of general streams
-VideoCount;;;N NI;;;Number of video streams
-AudioCount;;;N NI;;;Number of audio streams
-TextCount;;;N NI;;;Number of text streams
-OtherCount;;;N NI;;;Number of other streams
-ImageCount;;;N NI;;;Number of image streams
-MenuCount;;;N NI;;;Number of menu streams
+GeneralCount;1;;N NIY;;;Number of general streams
+VideoCount;;;N NIY;;;Number of video streams
+AudioCount;;;N NIY;;;Number of audio streams
+TextCount;;;N NIY;;;Number of text streams
+OtherCount;;;N NIY;;;Number of other streams
+ImageCount;;;N NIY;;;Number of image streams
+MenuCount;;;N NIY;;;Number of menu streams
 Video_Format_List;;;N NT;;;Video Codecs in this file, separated by /
 Video_Format_WithHint_List;;;N NT;;;Video Codecs in this file with popular name (hint), separated by /
 Video_Codec_List;;;N NT;;;Deprecated, do not use in new projects

-- 
libmediainfo packaging



More information about the pkg-multimedia-commits mailing list