[SCM] libmediainfo/master: Imported Upstream version 0.7.91

hyperair at users.alioth.debian.org hyperair at users.alioth.debian.org
Thu Dec 1 16:49:04 UTC 2016


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

    Imported Upstream version 0.7.91

diff --git a/History_DLL.txt b/History_DLL.txt
index 6767ddb..5d81fef 100644
--- a/History_DLL.txt
+++ b/History_DLL.txt
@@ -8,6 +8,18 @@ bug reports and feature request are here:
 https://sourceforge.net/p/mediainfo/_list/tickets
 
 
+Version 0.7.91, 2016-11-30
+--------------
++ IMF and PTX: more languages detected from file names (but the full list of common languages tags still need to be added)
++ IMF and PTX: support of non-standard but common "LAS" = "Spanish (Latin America)" language code
++ MXF: Support of color primaries, transfer characteristic, coding equations defined in SMPTE ST 2067-21:2016 e.g. xvYCC or BT.2020
++ Minor performance optimizations and cleanup (Thanks to Pavel Pimenov)
++ MediaTrace optimization for Matroska
+x Fixed parsing of FFV1 v0/v1
+x PTX: fix crash due to bad parsing of some file names while looking for track language
+
+
+
 Version 0.7.90, 2016-10-31
 --------------
 + #M94, WAV: support of file with a buggy RIFF header
diff --git a/Project/CMake/CMakeLists.txt b/Project/CMake/CMakeLists.txt
index 1731b3e..0b63a65 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 90)
+set(MediaInfoLib_PATCH_VERSION 91)
 set(MediaInfoLib_VERSION ${MediaInfoLib_MAJOR_VERSION}.${MediaInfoLib_MINOR_VERSION}.${MediaInfoLib_PATCH_VERSION})
 
 if (NOT WIN32)
diff --git a/Project/GNU/Library/configure.ac b/Project/GNU/Library/configure.ac
index 60e2dc1..ea38f2a 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.90])
+AC_INIT([libmediainfo], [0.7.91])
 
 dnl -------------------------------------------------------------------------
 dnl Test if we are at the good place
diff --git a/Project/GNU/PKGBUILD b/Project/GNU/PKGBUILD
index 8eda25c..ab5a21d 100644
--- a/Project/GNU/PKGBUILD
+++ b/Project/GNU/PKGBUILD
@@ -3,13 +3,13 @@
 # Contributor: hydro <hydro at freenet.de>
 
 pkgname=libmediainfo
-pkgver=0.7.90
+pkgver=0.7.91
 pkgrel=1
 pkgdesc="shared library for mediainfo"
 arch=('i686' 'x86_64')
 url="http://mediaarea.net"
 license=('GPL')
-depends=( 'curl' 'libmms' 'libzen>=0.4.33')
+depends=( 'curl' 'libmms' 'libzen>=0.4.34')
 makedepends=('libtool' 'automake' 'autoconf')
 source=(${pkgname}_${pkgver}.orig.tar.xz)
 md5sums=('00000000000000000000000000000000')
diff --git a/Project/GNU/libmediainfo.dsc b/Project/GNU/libmediainfo.dsc
index 27dd66d..2d17a68 100644
--- a/Project/GNU/libmediainfo.dsc
+++ b/Project/GNU/libmediainfo.dsc
@@ -2,13 +2,13 @@ Format: 3.0 (quilt)
 Source: libmediainfo
 Binary: libmediainfo-dev, libmediainfo0, python-mediainfodll, python3-mediainfodll, libmediainfo-doc libmediainfo0-dbg
 Architecture: any all
-Version: 0.7.90-1
+Version: 0.7.91-1
 Maintainer: MediaArea.net SARL <info at mediaarea.net>
 Homepage: http://MediaArea.net/MediaInfo
 Standards-Version: 3.9.6
 Vcs-Browser: https://github.com/MediaArea/MediaInfoLib
 Vcs-Git: https://github.com/MediaArea/MediaInfoLib.git
-Build-Depends: debhelper (>= 9), dpkg-dev (>= 1.16.1), python-all (>= 2.6.6-3~), python3-all, dh-autoreconf, doxygen, tofrodos, libzen-dev (>= 0.4.33), libcurl4-gnutls-dev, libmms-dev, libglib2.0-dev, zlib1g-dev, pkg-config
+Build-Depends: debhelper (>= 9), dpkg-dev (>= 1.16.1), python-all (>= 2.6.6-3~), python3-all, dh-autoreconf, doxygen, tofrodos, libzen-dev (>= 0.4.34), libcurl4-gnutls-dev, libmms-dev, libglib2.0-dev, zlib1g-dev, pkg-config
 Package-List:
  libmediainfo-dev deb libdevel optional arch=any
  libmediainfo-doc deb doc optional arch=all
@@ -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.90.orig.tar.xz
- 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.90-1.debian.tar.xz
+ 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.91.orig.tar.xz
+ 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.91-1.debian.tar.xz
 Checksums-Sha256:
- 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
- 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.90-1.debian.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.91.orig.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.91-1.debian.tar.xz
 Files:
- 00000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
- 00000000000000000000000000000000 000000 libmediainfo_0.7.90-1.debian.tar.xz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.91.orig.tar.xz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.91-1.debian.tar.xz
diff --git a/Project/GNU/libmediainfo.spec b/Project/GNU/libmediainfo.spec
index db158be..5f2fd60 100644
--- a/Project/GNU/libmediainfo.spec
+++ b/Project/GNU/libmediainfo.spec
@@ -1,5 +1,5 @@
-%define libmediainfo_version      0.7.90
-%define libzen_version            0.4.33
+%define libmediainfo_version      0.7.91
+%define libzen_version            0.4.34
 
 %if 0%{?fedora} || 0%{?centos_version} >= 600 || 0%{?rhel_version} >= 600
 %define package_with_0_ending 0
@@ -231,7 +231,7 @@ rm -f %{buildroot}%{_libdir}/%{name_without_0_ending}.la
 %{_libdir}/%{name_without_0_ending}.so
 
 %changelog
-* Sun Jan 01 2012 MediaArea.net SARL <info at mediaarea.net> - 0.7.90-0
+* Sun Jan 01 2012 MediaArea.net SARL <info at mediaarea.net> - 0.7.91-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 720f92d..1f1ecdc 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,90,0
- PRODUCTVERSION 0,7,90,0
+ FILEVERSION 0,7,91,0
+ PRODUCTVERSION 0,7,91,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.90.0"
+            VALUE "FileVersion", "0.7.91.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.90.0"
+            VALUE "ProductVersion", "0.7.91.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2013/Example/HowToUse.rc b/Project/MSVC2013/Example/HowToUse.rc
index 720f92d..1f1ecdc 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,90,0
- PRODUCTVERSION 0,7,90,0
+ FILEVERSION 0,7,91,0
+ PRODUCTVERSION 0,7,91,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.90.0"
+            VALUE "FileVersion", "0.7.91.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.90.0"
+            VALUE "ProductVersion", "0.7.91.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2013/ShellExtension/MediaInfoShellExt.rc b/Project/MSVC2013/ShellExtension/MediaInfoShellExt.rc
index 720f92d..1f1ecdc 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,90,0
- PRODUCTVERSION 0,7,90,0
+ FILEVERSION 0,7,91,0
+ PRODUCTVERSION 0,7,91,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.90.0"
+            VALUE "FileVersion", "0.7.91.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.90.0"
+            VALUE "ProductVersion", "0.7.91.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2015/Dll/MediaInfo.rc b/Project/MSVC2015/Dll/MediaInfo.rc
index 8bd3ccf..9005fdd 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,90,0
- PRODUCTVERSION 0,7,90,0
+ FILEVERSION 0,7,91,0
+ PRODUCTVERSION 0,7,91,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.90.0"
+            VALUE "FileVersion", "0.7.91.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.90.0"
+            VALUE "ProductVersion", "0.7.91.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2015/Example/HowToUse.rc b/Project/MSVC2015/Example/HowToUse.rc
index 8bd3ccf..9005fdd 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,90,0
- PRODUCTVERSION 0,7,90,0
+ FILEVERSION 0,7,91,0
+ PRODUCTVERSION 0,7,91,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.90.0"
+            VALUE "FileVersion", "0.7.91.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.90.0"
+            VALUE "ProductVersion", "0.7.91.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/MSVC2015/ShellExtension/MediaInfoShellExt.rc b/Project/MSVC2015/ShellExtension/MediaInfoShellExt.rc
index 8bd3ccf..9005fdd 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,90,0
- PRODUCTVERSION 0,7,90,0
+ FILEVERSION 0,7,91,0
+ PRODUCTVERSION 0,7,91,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.90.0"
+            VALUE "FileVersion", "0.7.91.0"
             VALUE "LegalCopyright", "Copyright (C) 2002-2015 MediaArea.net SARL"
             VALUE "ProductName", "MediaInfo"
-            VALUE "ProductVersion", "0.7.90.0"
+            VALUE "ProductVersion", "0.7.91.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Project/OBS/deb6.debian/changelog b/Project/OBS/deb6.debian/changelog
index 3612d86..32516f1 100644
--- a/Project/OBS/deb6.debian/changelog
+++ b/Project/OBS/deb6.debian/changelog
@@ -1,4 +1,4 @@
-libmediainfo (0.7.90) unstable; urgency=low
+libmediainfo (0.7.91) unstable; urgency=low
 
   * See History.txt for more info and real dates
 
diff --git a/Project/OBS/deb6.dsc b/Project/OBS/deb6.dsc
index ee37013..f8533c8 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.90-1deb6
+Version: 0.7.91-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
+Build-Depends: debhelper (>= 5), doxygen, tofrodos, libzen-dev (>= 0.4.34), zlib1g-dev, pkg-config, automake, autoconf, libtool
 Files: 
- 00000000000000000000000000000000 000000 libmediainfo_0.7.90-1deb6.tar.gz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.91-1deb6.tar.gz
diff --git a/Project/OBS/deb9.debian/changelog b/Project/OBS/deb9.debian/changelog
index beae681..e2abba9 100644
--- a/Project/OBS/deb9.debian/changelog
+++ b/Project/OBS/deb9.debian/changelog
@@ -1,6 +1,6 @@
-libmediainfo (0.7.90-1) experimental; urgency=medium
+libmediainfo (0.7.91-1) experimental; urgency=medium
 
-  * Upstream version 0.7.90
+  * Upstream version 0.7.91
     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/control b/Project/OBS/deb9.debian/control
index ba98b3d..792f8b2 100644
--- a/Project/OBS/deb9.debian/control
+++ b/Project/OBS/deb9.debian/control
@@ -8,7 +8,7 @@ Build-Depends: debhelper (>= 9),
                dh-autoreconf,
                doxygen,
                tofrodos,
-               libzen-dev (>= 0.4.33),
+               libzen-dev (>= 0.4.34),
                libcurl4-gnutls-dev,
                libmms-dev,
                libglib2.0-dev,
diff --git a/Project/OBS/deb9.dsc b/Project/OBS/deb9.dsc
index 7f6ac21..704f98f 100644
--- a/Project/OBS/deb9.dsc
+++ b/Project/OBS/deb9.dsc
@@ -2,13 +2,13 @@ Format: 3.0 (quilt)
 Source: libmediainfo
 Binary: libmediainfo-dev, libmediainfo0v5, python-mediainfodll, python3-mediainfodll, libmediainfo-doc libmediainfo0v5-dbg
 Architecture: any all
-Version: 0.7.90-1deb9
+Version: 0.7.91-1deb9
 Maintainer: MediaArea.net SARL <info at mediaarea.net>
 Homepage: http://MediaArea.net/MediaInfo
 Standards-Version: 3.9.6
 Vcs-Browser: https://github.com/MediaArea/MediaInfoLib
 Vcs-Git: https://github.com/MediaArea/MediaInfoLib.git
-Build-Depends: debhelper (>= 9), dpkg-dev (>= 1.16.1), python-all (>= 2.6.6-3~), python3-all, dh-autoreconf, doxygen, tofrodos, libzen-dev (>= 0.4.33), libcurl4-gnutls-dev, libmms-dev, libglib2.0-dev, zlib1g-dev, pkg-config
+Build-Depends: debhelper (>= 9), dpkg-dev (>= 1.16.1), python-all (>= 2.6.6-3~), python3-all, dh-autoreconf, doxygen, tofrodos, libzen-dev (>= 0.4.34), libcurl4-gnutls-dev, libmms-dev, libglib2.0-dev, zlib1g-dev, pkg-config
 Package-List:
  libmediainfo-dev deb libdevel optional arch=any
  libmediainfo-doc deb doc optional arch=all
@@ -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.90.orig.tar.xz
- 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.90-1deb9.debian.tar.xz
+ 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.91.orig.tar.xz
+ 0000000000000000000000000000000000000000 000000 libmediainfo_0.7.91-1deb9.debian.tar.xz
 Checksums-Sha256:
- 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
- 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.90-1deb9.debian.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.91.orig.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 000000 libmediainfo_0.7.91-1deb9.debian.tar.xz
 Files:
- 00000000000000000000000000000000 000000 libmediainfo_0.7.90.orig.tar.xz
- 00000000000000000000000000000000 000000 libmediainfo_0.7.90-1deb9.debian.tar.xz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.91.orig.tar.xz
+ 00000000000000000000000000000000 000000 libmediainfo_0.7.91-1deb9.debian.tar.xz
diff --git a/Project/Solaris/mkpkg b/Project/Solaris/mkpkg
index 7e61c0c..de7d096 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.90"
+version="0.7.91"
 Home=`pwd`
 install_prefix=${Home}/mk_package
 packagecreation_prefix=${Home}/create_package
diff --git a/Project/version.txt b/Project/version.txt
index 8bc6633..a936089 100644
--- a/Project/version.txt
+++ b/Project/version.txt
@@ -1 +1 @@
-0.7.90
+0.7.91
diff --git a/Source/Install/MediaInfo_DLL_Windows_i386.nsi b/Source/Install/MediaInfo_DLL_Windows_i386.nsi
index f2ef8dd..73ae44b 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.90"
+!define PRODUCT_VERSION "0.7.91"
 !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 141cd86..01384e1 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.90"
+!define PRODUCT_VERSION "0.7.91"
 !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.h b/Source/MediaInfo/Audio/File_Aac.h
index 8a11608..0e74f03 100644
--- a/Source/MediaInfo/Audio/File_Aac.h
+++ b/Source/MediaInfo/Audio/File_Aac.h
@@ -256,7 +256,7 @@ protected :
     void sbr_envelope                       (bool ch, bool bs_coupling);
     void sbr_noise                          (bool ch, bool bs_coupling);
     void sbr_sinusoidal_coding              (bool ch);
-    int16u sbr_huff_dec                     (sbr_huffman Table, const char* Name);
+    int16u sbr_huff_dec                     (const sbr_huffman& Table, const char* Name);
 
     //Elements - SBR - PS
     void ps_data                            (size_t End);
diff --git a/Source/MediaInfo/Audio/File_Aac_GeneralAudio_Sbr.cpp b/Source/MediaInfo/Audio/File_Aac_GeneralAudio_Sbr.cpp
index 6857f91..5470f13 100644
--- a/Source/MediaInfo/Audio/File_Aac_GeneralAudio_Sbr.cpp
+++ b/Source/MediaInfo/Audio/File_Aac_GeneralAudio_Sbr.cpp
@@ -132,11 +132,11 @@ bool Aac_f_master_Compute_0(int8u &num_env_bands_Master, int8u* f_Master, sbr_ha
 //---------------------------------------------------------------------------
 // Master frequency band table
 // Computing for bs_freq_scale != 0
-int int8u_cmp(const void *a, const void *b)
+static int int8u_cmp(const void *a, const void *b)
 {
     return ((int8u)(*(int8u*)a - *(int8u*)b));
 }
-bool Aac_f_master_Compute(int8u &num_env_bands_Master, int8u* f_Master, sbr_handler *sbr, int8u  k0, int8u  k2)
+static bool Aac_f_master_Compute(int8u &num_env_bands_Master, int8u* f_Master, sbr_handler *sbr, int8u  k0, int8u  k2)
 {
     int8u temp1[]={6, 5, 4 };
     int8u bands=temp1[sbr->bs_freq_scale-1];
@@ -233,7 +233,7 @@ bool Aac_f_master_Compute(int8u &num_env_bands_Master, int8u* f_Master, sbr_hand
 
 //---------------------------------------------------------------------------
 // Derived frequency border tables
-bool Aac_bands_Compute(int8u &num_env_bands_Master, int8u* f_Master, sbr_handler *sbr, int8u  k2)
+static bool Aac_bands_Compute(const int8u &num_env_bands_Master, int8u* f_Master, sbr_handler *sbr, int8u  k2)
 {
     sbr->num_env_bands[1]=num_env_bands_Master-sbr->bs_xover_band;
     sbr->num_env_bands[0]=(sbr->num_env_bands[1]>>1)+(sbr->num_env_bands[1]-((sbr->num_env_bands[1]>>1)<<1));
@@ -254,7 +254,7 @@ bool Aac_bands_Compute(int8u &num_env_bands_Master, int8u* f_Master, sbr_handler
 }
 
 //---------------------------------------------------------------------------
-bool Aac_Sbr_Compute(sbr_handler *sbr, int8u extension_sampling_frequency_index)
+static bool Aac_Sbr_Compute(sbr_handler *sbr, int8u extension_sampling_frequency_index)
 {
     if (extension_sampling_frequency_index>=9)
         return 0; //Not supported
@@ -296,7 +296,7 @@ bool Aac_Sbr_Compute(sbr_handler *sbr, int8u extension_sampling_frequency_index)
 }
 
 //---------------------------------------------------------------------------
-int16u File_Aac::sbr_huff_dec(sbr_huffman Table, const char* Name)
+int16u File_Aac::sbr_huff_dec(const sbr_huffman& Table, const char* Name)
 {
     int8u bit;
     int16s index = 0;
diff --git a/Source/MediaInfo/Audio/File_Als.cpp b/Source/MediaInfo/Audio/File_Als.cpp
index 6a7809a..ba19f3d 100644
--- a/Source/MediaInfo/Audio/File_Als.cpp
+++ b/Source/MediaInfo/Audio/File_Als.cpp
@@ -110,14 +110,8 @@ void File_Als::FileHeader_Parse()
     BS_End();
 
     FILLING_BEGIN();
-        if (SampleRate==0)
-            return;
-        Duration=((int64u)Samples)*1000/SampleRate;
-        if (Duration==0)
-            return;
-        UncompressedSize=((int64u)Samples)*Channels*(BitsPerSample+1/8);
-        if (UncompressedSize==0)
-            return;
+    if (!CalcDurationUncompressedSize(Samples, SampleRate, (BitsPerSample+1)*8, Channels))
+        return;
 
         File__Tags_Helper::Accept("ALS");
 
diff --git a/Source/MediaInfo/Audio/File_Als.h b/Source/MediaInfo/Audio/File_Als.h
index a0d8440..9d7a221 100644
--- a/Source/MediaInfo/Audio/File_Als.h
+++ b/Source/MediaInfo/Audio/File_Als.h
@@ -26,7 +26,7 @@ namespace MediaInfoLib
 // Class File_Als
 //***************************************************************************
 
-class File_Als : public File__Analyze, public File__Tags_Helper
+class File_Als : public File__Analyze, public File__Tags_Helper, protected File__UnCompressedSize_Helper
 {
 public :
     //Constructor/Destructor
@@ -43,9 +43,6 @@ private :
     //Buffer - Global
     void Read_Buffer_Continue()                                                 {File__Tags_Helper::Read_Buffer_Continue();}
 
-    //Temp
-    int64u Duration;
-    int64u UncompressedSize;
 };
 
 } //NameSpace
diff --git a/Source/MediaInfo/Audio/File_Ape.h b/Source/MediaInfo/Audio/File_Ape.h
index 4cfa61a..9b93218 100644
--- a/Source/MediaInfo/Audio/File_Ape.h
+++ b/Source/MediaInfo/Audio/File_Ape.h
@@ -26,7 +26,7 @@ namespace MediaInfoLib
 // Class File_Ape
 //***************************************************************************
 
-class File_Ape : public File__Analyze, public File__Tags_Helper
+class File_Ape : public File__Analyze, public File__Tags_Helper, protected File__UnCompressedSize_Helper
 {
 public :
     //Constructor/Destructor
@@ -43,9 +43,6 @@ private :
     //Buffer - Global
     void Read_Buffer_Continue()                                                 {File__Tags_Helper::Read_Buffer_Continue();}
 
-    //Temp
-    int64u Duration;
-    int64u UncompressedSize;
 };
 
 } //NameSpace
diff --git a/Source/MediaInfo/Audio/File_ChannelGrouping.cpp b/Source/MediaInfo/Audio/File_ChannelGrouping.cpp
index 4c79f4e..dfdecf0 100644
--- a/Source/MediaInfo/Audio/File_ChannelGrouping.cpp
+++ b/Source/MediaInfo/Audio/File_ChannelGrouping.cpp
@@ -141,6 +141,7 @@ void File_ChannelGrouping::Read_Buffer_Init()
             Common->Parsers.push_back(Parser);
         }
 
+#ifdef MEDIAINFO_PCM_YES
         //PCM
         if (CanBePcm)
         {
@@ -165,6 +166,7 @@ void File_ChannelGrouping::Read_Buffer_Init()
             #endif //MEDIAINFO_DEMUX
             Open_Buffer_Init(Common->Parsers[Pos]);
         }
+#endif // MEDIAINFO_PCM_YES
     }
     Common->Instances++;
     Common->Instances_Max++;
diff --git a/Source/MediaInfo/Audio/File_ChannelGrouping.h b/Source/MediaInfo/Audio/File_ChannelGrouping.h
index 920d3cf..7786c10 100644
--- a/Source/MediaInfo/Audio/File_ChannelGrouping.h
+++ b/Source/MediaInfo/Audio/File_ChannelGrouping.h
@@ -28,7 +28,7 @@ namespace MediaInfoLib
 //***************************************************************************
 // Class File_ChannelGrouping
 //***************************************************************************
-
+#ifdef MEDIAINFO_SMPTEST0337_YES
 class File_ChannelGrouping : public File__Analyze
 {
 public :
@@ -127,6 +127,7 @@ private :
     void Read_Buffer_Unsynched ();
 };
 
+#endif // MEDIAINFO_SMPTEST0337_YES
 } //NameSpace
 
 #endif
diff --git a/Source/MediaInfo/Audio/File_La.h b/Source/MediaInfo/Audio/File_La.h
index a373c52..027a639 100644
--- a/Source/MediaInfo/Audio/File_La.h
+++ b/Source/MediaInfo/Audio/File_La.h
@@ -26,7 +26,7 @@ namespace MediaInfoLib
 // Class File_La
 //***************************************************************************
 
-class File_La : public File__Analyze, public File__Tags_Helper
+class File_La : public File__Analyze, public File__Tags_Helper, protected File__UnCompressedSize_Helper
 {
 public :
     //Constructor/Destructor
@@ -43,9 +43,6 @@ private :
     //Buffer - Global
     void Read_Buffer_Continue()                                                 {File__Tags_Helper::Read_Buffer_Continue();}
 
-    //Temp
-    int64u Duration;
-    int64u UncompressedSize;
     bool seekable;
     bool high;
 };
diff --git a/Source/MediaInfo/Audio/File_Rkau.h b/Source/MediaInfo/Audio/File_Rkau.h
index 038d4b9..83ae41d 100644
--- a/Source/MediaInfo/Audio/File_Rkau.h
+++ b/Source/MediaInfo/Audio/File_Rkau.h
@@ -28,7 +28,7 @@ namespace MediaInfoLib
 // Class File_Rkau
 //***************************************************************************
 
-class File_Rkau : public File__Analyze, public File__Tags_Helper
+class File_Rkau : public File__Analyze, public File__Tags_Helper, protected File__UnCompressedSize_Helper
 {
 public :
     //Constructor/Destructor
@@ -45,9 +45,6 @@ private :
     //Buffer - Global
     void Read_Buffer_Continue()                                                 {File__Tags_Helper::Read_Buffer_Continue();}
 
-    //Temp
-    int64u Duration;
-    int64u UncompressedSize;
 };
 
 } //NameSpace
diff --git a/Source/MediaInfo/Audio/File_SmpteSt0302.cpp b/Source/MediaInfo/Audio/File_SmpteSt0302.cpp
index 7af6a48..149cb1f 100644
--- a/Source/MediaInfo/Audio/File_SmpteSt0302.cpp
+++ b/Source/MediaInfo/Audio/File_SmpteSt0302.cpp
@@ -73,6 +73,7 @@ File_SmpteSt0302::~File_SmpteSt0302()
 //---------------------------------------------------------------------------
 void File_SmpteSt0302::Streams_Accept()
 {
+#ifdef MEDIAINFO_SMPTEST0337_YES
     // SMPTE ST 337
     {
         File_SmpteSt0337* SmpteSt0337=new File_SmpteSt0337();
@@ -92,7 +93,8 @@ void File_SmpteSt0302::Streams_Accept()
         #endif //MEDIAINFO_EVENTS
         Parsers.push_back(SmpteSt0337);
     }
-
+#endif // MEDIAINFO_SMPTEST0337_YES
+#ifdef MEDIAINFO_PCM_YES
     // Raw PCM
     {
         File_Pcm* Pcm=new File_Pcm();
@@ -115,6 +117,7 @@ void File_SmpteSt0302::Streams_Accept()
     // Init
     for (size_t Pos=0; Pos<Parsers.size(); Pos++)
         Open_Buffer_Init(Parsers[Pos]);
+#endif // MEDIAINFO_PCM_YES
 
     //Time stamps
     Frequency_b=48000;
diff --git a/Source/MediaInfo/Audio/File_Tta.cpp b/Source/MediaInfo/Audio/File_Tta.cpp
index d77e734..d1d1053 100644
--- a/Source/MediaInfo/Audio/File_Tta.cpp
+++ b/Source/MediaInfo/Audio/File_Tta.cpp
@@ -100,13 +100,7 @@ void File_Tta::FileHeader_Parse()
     Get_L4 (CRC32,                                              "CRC32");
 
     FILLING_BEGIN();
-        if (SampleRate==0)
-            return;
-        Duration=((int64u)Samples)*1000/SampleRate;
-        if (Duration==0)
-            return;
-        UncompressedSize=((int64u)Samples)*Channels*(BitsPerSample/8);
-        if (UncompressedSize==0)
+        if (!CalcDurationUncompressedSize(Samples, SampleRate, BitsPerSample, Channels)) 
             return;
 
         //Filling data
diff --git a/Source/MediaInfo/Audio/File_Tta.h b/Source/MediaInfo/Audio/File_Tta.h
index 72c9c85..d54cb6e 100644
--- a/Source/MediaInfo/Audio/File_Tta.h
+++ b/Source/MediaInfo/Audio/File_Tta.h
@@ -26,7 +26,7 @@ namespace MediaInfoLib
 // Class File_Tta
 //***************************************************************************
 
-class File_Tta : public File__Analyze, public File__Tags_Helper
+class File_Tta : public File__Analyze, public File__Tags_Helper, protected File__UnCompressedSize_Helper
 {
 public :
     //Constructor/Destructor
@@ -43,9 +43,6 @@ private :
     //Buffer - Global
     void Read_Buffer_Continue()                                                 {File__Tags_Helper::Read_Buffer_Continue();}
 
-    //Temp
-    int64u Duration;
-    int64u UncompressedSize;
 };
 
 } //NameSpace
diff --git a/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.cpp b/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.cpp
index 21b3dfa..f4d88fc 100644
--- a/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.cpp
+++ b/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.cpp
@@ -66,46 +66,43 @@ File__Duplicate_MpegTs::File__Duplicate_MpegTs (const Ztring &Target)
 //***************************************************************************
 
 //---------------------------------------------------------------------------
+void File__Duplicate_MpegTs::Internal_Remove_Wanted_Program(int16u Program_number, bool ToRemove)
+{
+    if (ToRemove)
+    {
+        if(Wanted_program_numbers.erase(Program_number) == 0)
+           Remove_program_numbers.insert(Program_number);
+    }
+    else
+    {
+        if(Remove_program_numbers.erase(Program_number) == 0)
+           Wanted_program_numbers.insert(Program_number);
+    }
+    if (!PAT.empty())
+        PAT.begin()->second.ConfigurationHasChanged = true;
+}
+//---------------------------------------------------------------------------
 bool File__Duplicate_MpegTs::Configure (const Ztring &Value, bool ToRemove)
 {
     //Form: "program_number"
     if (Value.find(__T("program_number="))==0)
     {
-        int16u program_number=Ztring(Value.substr(15, std::string::npos)).To_int16u();
-        if (ToRemove)
-        {
-            if (Wanted_program_numbers.find(program_number)!=Wanted_program_numbers.end())
-                Wanted_program_numbers.erase(program_number);
-            else if (Remove_program_numbers.find(program_number)==Remove_program_numbers.end())
-                Remove_program_numbers.insert(program_number);
-        }
-        else
-        {
-            if (Remove_program_numbers.find(program_number)!=Remove_program_numbers.end())
-                Remove_program_numbers.erase(program_number);
-            if (Wanted_program_numbers.find(program_number)==Wanted_program_numbers.end())
-                Wanted_program_numbers.insert(program_number);
-        }
-        if (!PAT.empty())
-            PAT.begin()->second.ConfigurationHasChanged=true;
+        const int16u program_number=Ztring(Value.substr(15, std::string::npos)).To_int16u();
+        Internal_Remove_Wanted_Program(program_number, ToRemove);
     }
     //Form: "program_map_PID"
     else if (Value.find(__T("program_map_PID="))==0)
     {
-        int16u program_map_PID=Ztring(Value.substr(16, std::string::npos)).To_int16u();
+        const int16u program_map_PID=Ztring(Value.substr(16, std::string::npos)).To_int16u();
         if (ToRemove)
         {
-            if (Wanted_program_map_PIDs.find(program_map_PID)!=Wanted_program_map_PIDs.end())
-                Wanted_program_map_PIDs.erase(program_map_PID);
-            else if (Remove_program_map_PIDs.find(program_map_PID)==Remove_program_map_PIDs.end())
-                Remove_program_map_PIDs.insert(program_map_PID);
+            if(Wanted_program_map_PIDs.erase(program_map_PID) == 0)
+               Remove_program_map_PIDs.insert(program_map_PID);
         }
         else
         {
-            if (Remove_program_map_PIDs.find(program_map_PID)!=Remove_program_map_PIDs.end())
-                Remove_program_map_PIDs.erase(program_map_PID);
-            if (Wanted_program_map_PIDs.find(program_map_PID)==Wanted_program_map_PIDs.end())
-                Wanted_program_map_PIDs.insert(program_map_PID);
+             Remove_program_map_PIDs.erase(program_map_PID);
+             Wanted_program_map_PIDs.insert(program_map_PID);
         }
         if (PMT.find(program_map_PID)!=PMT.end())
             PMT[program_map_PID].ConfigurationHasChanged=true;
@@ -113,19 +110,15 @@ bool File__Duplicate_MpegTs::Configure (const Ztring &Value, bool ToRemove)
     //Form: "elementary_PID"
     else if (Value.find(__T("elementary_PID="))==0)
     {
-        int16u elementary_PID=Ztring(Value.substr(15, std::string::npos)).To_int16u();
+        const int16u elementary_PID=Ztring(Value.substr(15, std::string::npos)).To_int16u();
         if (ToRemove)
         {
-            if (Wanted_elementary_PIDs.find(elementary_PID)!=Wanted_elementary_PIDs.end())
-                Wanted_elementary_PIDs.erase(elementary_PID);
-            else if (Remove_elementary_PIDs.find(elementary_PID)==Remove_elementary_PIDs.end())
-                Remove_elementary_PIDs.insert(elementary_PID);
+            if(Wanted_elementary_PIDs.erase(elementary_PID) == 0)
+               Remove_elementary_PIDs.insert(elementary_PID);
         }
         else
         {
-            if (Remove_elementary_PIDs.find(elementary_PID)!=Remove_elementary_PIDs.end())
                 Remove_elementary_PIDs.erase(elementary_PID);
-            if (Wanted_elementary_PIDs.find(elementary_PID)==Wanted_elementary_PIDs.end())
                 Wanted_elementary_PIDs.insert(elementary_PID);
         }
         if (PMT.find(elementary_PIDs_program_map_PIDs[elementary_PID])!=PMT.end())
@@ -134,23 +127,8 @@ bool File__Duplicate_MpegTs::Configure (const Ztring &Value, bool ToRemove)
     //Old
     else
     {
-        int16u program_number=Ztring(Value).To_int16u();
-        if (ToRemove)
-        {
-            if (Wanted_program_numbers.find(program_number)!=Wanted_program_numbers.end())
-                Wanted_program_numbers.erase(program_number);
-            else if (Remove_program_numbers.find(program_number)==Remove_program_numbers.end())
-                Remove_program_numbers.insert(program_number);
-        }
-        else
-        {
-            if (Remove_program_numbers.find(program_number)!=Remove_program_numbers.end())
-                Remove_program_numbers.erase(program_number);
-            if (Wanted_program_numbers.find(program_number)==Wanted_program_numbers.end())
-                Wanted_program_numbers.insert(program_number);
-        }
-        if (!PAT.empty())
-            PAT.begin()->second.ConfigurationHasChanged=true;
+        const int16u program_number=Ztring(Value).To_int16u();
+        Internal_Remove_Wanted_Program(program_number, ToRemove);
     }
 
     //Can be disabled?
@@ -197,10 +175,9 @@ bool File__Duplicate_MpegTs::Manage_PAT (const int8u* ToAdd, size_t ToAdd_Size)
     while (FromTS.Offset+4<=FromTS.End)
     {
         //For each program
-        int16u program_number =CC2(FromTS.Buffer+FromTS.Offset+0);
-        int16u program_map_PID=CC2(FromTS.Buffer+FromTS.Offset+2)&0x1FFF;
-        if (Wanted_program_numbers.find(program_number)  !=Wanted_program_numbers.end()
-         || Wanted_program_map_PIDs.find(program_map_PID)!=Wanted_program_map_PIDs.end())
+        const int16u program_number =CC2(FromTS.Buffer+FromTS.Offset+0);
+        const int16u program_map_PID=CC2(FromTS.Buffer+FromTS.Offset+2)&0x1FFF;
+        if (Is_Wanted(program_number, program_map_PID))
         {
             //Integrating it
             program_map_PIDs[program_map_PID]=1;
@@ -224,21 +201,32 @@ bool File__Duplicate_MpegTs::Manage_PAT (const int8u* ToAdd, size_t ToAdd_Size)
     return true;
 }
 
+
+bool File__Duplicate_MpegTs::Is_Wanted(int16u ProgNum, int16u PID) const
+{
+    bool Wanted = false;
+    if (Wanted_program_numbers.find(ProgNum) != Wanted_program_numbers.end())
+        Wanted = true;
+    else
+    if (Wanted_program_map_PIDs.find(PID) != Wanted_program_map_PIDs.end())
+        Wanted = true;
+    return Wanted;
+}
+
 bool File__Duplicate_MpegTs::Manage_PMT (const int8u* ToAdd, size_t ToAdd_Size)
 {
     if (!Parsing_Begin(ToAdd, ToAdd_Size, PMT))
         return false;
 
     //Testing program_number
-    if (Wanted_program_numbers.find(StreamID)==Wanted_program_numbers.end()
-     && Wanted_program_map_PIDs.find(elementary_PIDs_program_map_PIDs[StreamID]) == Wanted_program_map_PIDs.end())
+    if (!Is_Wanted(StreamID, elementary_PIDs_program_map_PIDs[StreamID]))
     {
         delete[] PMT[StreamID].Buffer; PMT[StreamID].Buffer=NULL;
         return false;
     }
 
     //program_info_length
-    int16u program_info_length=CC2(FromTS.Buffer+FromTS.Offset+2)&0x0FFF;
+    const int16u program_info_length=CC2(FromTS.Buffer+FromTS.Offset+2)&0x0FFF;
     std::memcpy(PMT[StreamID].Buffer+PMT[StreamID].Offset, FromTS.Buffer+FromTS.Offset, 4+program_info_length);
     FromTS.Offset+=4+program_info_length;
     PMT[StreamID].Offset+=4+program_info_length;
@@ -247,8 +235,8 @@ bool File__Duplicate_MpegTs::Manage_PMT (const int8u* ToAdd, size_t ToAdd_Size)
     while (FromTS.Offset+5<=FromTS.End)
     {
         //For each elementary_PID
-        int16u elementary_PID=CC2(FromTS.Buffer+FromTS.Offset+1)&0x1FFF;
-        int16u ES_info_length=CC2(FromTS.Buffer+FromTS.Offset+3)&0x0FFF;
+        const int16u elementary_PID=CC2(FromTS.Buffer+FromTS.Offset+1)&0x1FFF;
+        const int16u ES_info_length=CC2(FromTS.Buffer+FromTS.Offset+3)&0x0FFF;
         if (Wanted_elementary_PIDs.empty() || Wanted_elementary_PIDs.find(elementary_PID)!=Wanted_elementary_PIDs.end())
         {
             //Integrating it
@@ -357,8 +345,7 @@ bool File__Duplicate_MpegTs::Parsing_Begin (const int8u* ToAdd, size_t ToAdd_Siz
         }
 
         //Managing big chunks
-        if (BigBuffers.find(PID)!=BigBuffers.end())
-            BigBuffers.erase(BigBuffers.find(PID));
+        BigBuffers.erase(PID);
 
         Writer.Write(ToModify.Buffer, ToModify.Size);
         return false;
@@ -461,8 +448,7 @@ void File__Duplicate_MpegTs::Parsing_End (std::map<int16u, buffer> &ToModify_)
 
     //Managing big chunks
     int16u PID=((ToModify.Buffer[1]&0x1F)<<8)|ToModify.Buffer[2]; //BigEndian2int16u(ToAdd+1)&0x1FFF;
-    if (BigBuffers.find(PID)!=BigBuffers.end())
-        BigBuffers.erase(BigBuffers.find(PID));
+    BigBuffers.erase(PID);
 }
 
 //***************************************************************************
diff --git a/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.h b/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.h
index d57ebd8..6ec128d 100644
--- a/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.h
+++ b/Source/MediaInfo/Duplicate/File__Duplicate_MpegTs.h
@@ -36,10 +36,10 @@ public :
 
     //Output buffer
     size_t Output_Buffer_Get (unsigned char** Output_Buffer=NULL);
-
-//private :
+    bool Is_Wanted(int16u ProgNum, int16u PID) const;
+private :
     File__Duplicate__Writer Writer;
-
+    void Internal_Remove_Wanted_Program(int16u Program_number, bool ToRemove);
     //Configuration
     std::set<int16u> Wanted_program_numbers;
     std::set<int16u> Wanted_program_map_PIDs;
@@ -49,8 +49,10 @@ public :
     std::set<int16u> Remove_elementary_PIDs;
 
     //Current
+public:
     std::vector<int8u> program_map_PIDs;
     std::vector<int8u> elementary_PIDs;
+private:
     std::vector<int16u> elementary_PIDs_program_map_PIDs;
 
     struct buffer
diff --git a/Source/MediaInfo/Duplicate/File__Duplicate__Writer.cpp b/Source/MediaInfo/Duplicate/File__Duplicate__Writer.cpp
index 2e319f7..1990d88 100644
--- a/Source/MediaInfo/Duplicate/File__Duplicate__Writer.cpp
+++ b/Source/MediaInfo/Duplicate/File__Duplicate__Writer.cpp
@@ -69,9 +69,9 @@ void File__Duplicate__Writer::Configure (const Ztring &Target)
     //Form: "memory://pointer:size"  <--Memory block is specified by user
     //WARNING: pointer must be in ***DECIMAL*** format.
     //Example: "memory://123456789:1316"
-    if (Target.find(__T("memory://"))==0 && Target.find(__T(":"), 9)!=std::string::npos)
+    if (Target.find(__T("memory://"))==0 && Target.find(__T(':'), 9)!=std::string::npos)
     {
-        size_t SemiColumn_Pos=Target.find(__T(":"), 9);
+        size_t SemiColumn_Pos=Target.find(__T(':'), 9);
         Ztring Address=Target.substr(9, SemiColumn_Pos-9);
         Ztring Size=Target.substr(SemiColumn_Pos+1);
         Method=method_buffer;
diff --git a/Source/MediaInfo/Export/Export_EbuCore.cpp b/Source/MediaInfo/Export/Export_EbuCore.cpp
index fa45bcc..92eab45 100644
--- a/Source/MediaInfo/Export/Export_EbuCore.cpp
+++ b/Source/MediaInfo/Export/Export_EbuCore.cpp
@@ -68,9 +68,9 @@ int32u EbuCore_VideoCompressionCodeCS_termID(MediaInfo_Internal &MI, size_t Stre
 
     if (Format==__T("MPEG Video"))
     {
-        if (Version.find(__T("1"))!=string::npos)
+        if (Version.find(__T('1'))!=string::npos)
             return 10000;
-        if (Version.find(__T("2"))!=string::npos)
+        if (Version.find(__T('2'))!=string::npos)
         {
             if (Profile.find(__T("Simple@"))!=string::npos)
             {
@@ -567,23 +567,23 @@ int32u EbuCore_AudioCompressionCodeCS_termID(MediaInfo_Internal &MI, size_t Stre
         return 50000;
     if (Format==__T("MPEG Audio"))
     {
-        if (Version.find(__T("1"))!=string::npos)
+        if (Version.find(__T('1'))!=string::npos)
         {
-            if (Profile.find(__T("1"))!=string::npos)
+            if (Profile.find(__T('1'))!=string::npos)
                 return 70100;
-            if (Profile.find(__T("2"))!=string::npos)
+            if (Profile.find(__T('2'))!=string::npos)
                 return 70200;
-            if (Profile.find(__T("3"))!=string::npos)
+            if (Profile.find(__T('3'))!=string::npos)
                 return 70300;
             return 70000;
         }
-        if (Version.find(__T("2"))!=string::npos)
+        if (Version.find(__T('2'))!=string::npos)
         {
-            if (Profile.find(__T("1"))!=string::npos)
+            if (Profile.find(__T('1'))!=string::npos)
                 return 90100;
-            if (Profile.find(__T("2"))!=string::npos)
+            if (Profile.find(__T('2'))!=string::npos)
                 return 90200;
-            if (Profile.find(__T("3"))!=string::npos)
+            if (Profile.find(__T('3'))!=string::npos)
                 return 90300;
             return 90000;
         }
diff --git a/Source/MediaInfo/Export/Export_Fims.cpp b/Source/MediaInfo/Export/Export_Fims.cpp
index 1e8bcf9..102a42b 100644
--- a/Source/MediaInfo/Export/Export_Fims.cpp
+++ b/Source/MediaInfo/Export/Export_Fims.cpp
@@ -67,9 +67,9 @@ int32u Fims_VideoCompressionCodeCS_termID(MediaInfo_Internal &MI, size_t StreamP
 
     if (Format==__T("MPEG Video"))
     {
-        if (Version.find(__T("1"))!=string::npos)
+        if (Version.find(__T('1'))!=string::npos)
             return 10000;
-        if (Version.find(__T("2"))!=string::npos)
+        if (Version.find(__T('2'))!=string::npos)
         {
             if (Profile.find(__T("Simple@"))!=string::npos)
             {
@@ -566,23 +566,23 @@ int32u Fims_AudioCompressionCodeCS_termID(MediaInfo_Internal &MI, size_t StreamP
         return 50000;
     if (Format==__T("MPEG Audio"))
     {
-        if (Version.find(__T("1"))!=string::npos)
+        if (Version.find(__T('1'))!=string::npos)
         {
-            if (Profile.find(__T("1"))!=string::npos)
+            if (Profile.find(__T('1'))!=string::npos)
                 return 70100;
-            if (Profile.find(__T("2"))!=string::npos)
+            if (Profile.find(__T('2'))!=string::npos)
                 return 70200;
-            if (Profile.find(__T("3"))!=string::npos)
+            if (Profile.find(__T('3'))!=string::npos)
                 return 70300;
             return 70000;
         }
-        if (Version.find(__T("2"))!=string::npos)
+        if (Version.find(__T('2'))!=string::npos)
         {
-            if (Profile.find(__T("1"))!=string::npos)
+            if (Profile.find(__T('1'))!=string::npos)
                 return 90100;
-            if (Profile.find(__T("2"))!=string::npos)
+            if (Profile.find(__T('2'))!=string::npos)
                 return 90200;
-            if (Profile.find(__T("3"))!=string::npos)
+            if (Profile.find(__T('3'))!=string::npos)
                 return 90300;
             return 90000;
         }
diff --git a/Source/MediaInfo/Export/Export_Mpeg7.cpp b/Source/MediaInfo/Export/Export_Mpeg7.cpp
index 4ee0e4f..0e1f166 100644
--- a/Source/MediaInfo/Export/Export_Mpeg7.cpp
+++ b/Source/MediaInfo/Export/Export_Mpeg7.cpp
@@ -115,7 +115,7 @@ int32u Mpeg7_ContentCS_termID(MediaInfo_Internal &MI)
         return 40200;
     if (Format==__T("MPEG Audio") || Format==__T("Wave"))
         return 10000;
-    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 40100;
     return 500000;
 }
@@ -145,9 +145,9 @@ int32u Mpeg7_FileFormatCS_termID_MediaInfo(MediaInfo_Internal &MI)
 
     if (Format==__T("MPEG Audio"))
     {
-        if (MI.Get(Stream_Audio, 0, Audio_Format_Profile).find(__T("2"))!=string::npos)
+        if (MI.Get(Stream_Audio, 0, Audio_Format_Profile).find(__T('2'))!=string::npos)
             return 500000; //mp2
-        if (MI.Get(Stream_Audio, 0, Audio_Format_Profile).find(__T("1"))!=string::npos)
+        if (MI.Get(Stream_Audio, 0, Audio_Format_Profile).find(__T('1'))!=string::npos)
             return 510000; //mp1
         return 0;
     }
@@ -173,10 +173,10 @@ int32u Mpeg7_FileFormatCS_termID(MediaInfo_Internal &MI)
         return 60000;
     if (Format==__T("JPEG"))
         return 10000;
-    if (Format==__T("JPEG 2000") || Format==__T("JPEG 2000"))
+    if (Format==__T("JPEG 2000"))
         return 20000;
     if (Format==__T("MPEG Audio"))
-        return (MI.Get(Stream_Audio, 0, Audio_Format_Profile).find(__T("3"))!=string::npos)?40000:0;
+        return (MI.Get(Stream_Audio, 0, Audio_Format_Profile).find(__T('3'))!=string::npos)?40000:0;
     if (Format==__T("MPEG-4"))
         return 50000;
     if (Format==__T("MPEG-PS"))
@@ -254,9 +254,9 @@ int32u Mpeg7_VisualCodingFormatCS_termID(MediaInfo_Internal &MI, size_t StreamPo
 
     if (Format==__T("MPEG Video"))
     {
-        if (Version.find(__T("1"))!=string::npos)
+        if (Version.find(__T('1'))!=string::npos)
             return 10000;
-        if (Version.find(__T("2"))!=string::npos)
+        if (Version.find(__T('2'))!=string::npos)
         {
             if (Profile.find(__T("Simple@"))!=string::npos)
             {
@@ -783,23 +783,23 @@ int32u Mpeg7_AudioCodingFormatCS_termID(MediaInfo_Internal &MI, size_t StreamPos
         return 20000;
     if (Format==__T("MPEG Audio"))
     {
-        if (Version.find(__T("1"))!=string::npos)
+        if (Version.find(__T('1'))!=string::npos)
         {
-            if (Profile.find(__T("1"))!=string::npos)
+            if (Profile.find(__T('1'))!=string::npos)
                 return 30100;
-            if (Profile.find(__T("2"))!=string::npos)
+            if (Profile.find(__T('2'))!=string::npos)
                 return 30200;
-            if (Profile.find(__T("3"))!=string::npos)
+            if (Profile.find(__T('3'))!=string::npos)
                 return 30300;
             return 30000;
         }
-        if (Version.find(__T("2"))!=string::npos)
+        if (Version.find(__T('2'))!=string::npos)
         {
-            if (Profile.find(__T("1"))!=string::npos)
+            if (Profile.find(__T('1'))!=string::npos)
                 return 40100;
-            if (Profile.find(__T("2"))!=string::npos)
+            if (Profile.find(__T('2'))!=string::npos)
                 return 40200;
-            if (Profile.find(__T("3"))!=string::npos)
+            if (Profile.find(__T('3'))!=string::npos)
                 return 40300;
             return 40000;
         }
diff --git a/Source/MediaInfo/File__Analyze.cpp b/Source/MediaInfo/File__Analyze.cpp
index dee33d3..e3a7b2a 100644
--- a/Source/MediaInfo/File__Analyze.cpp
+++ b/Source/MediaInfo/File__Analyze.cpp
@@ -494,25 +494,30 @@ void File__Analyze::Open_Buffer_OutOfBand (File__Analyze* Sub, const int8u* ToAd
     #endif //MEDIAINFO_DEMUX
 
     #if MEDIAINFO_TRACE
-        if (Trace_Activated)
+        Trace_Details_Handling(Sub);
+    #endif // MEDIAINFO_TRACE
+}
+#if MEDIAINFO_TRACE
+void File__Analyze::Trace_Details_Handling(File__Analyze* Sub)
+{
+    if (Trace_Activated)
+    {
+        //Details handling
+        if ((!Sub->Element[0].TraceNode.Name_Is_Empty() || Sub->Element[0].TraceNode.Children.size()) && !Trace_DoNotSave)
         {
-            //Details handling
-            if ((Sub->Element[0].TraceNode.Get_Name() || Sub->Element[0].TraceNode.Children.size()) && !Trace_DoNotSave)
-            {
-                //From Sub
-                while(Sub->Element_Level)
-                    Sub->Element_End0();
+            //From Sub
+            while (Sub->Element_Level)
+                Sub->Element_End0();
 
-                //Add Sub to this node
-                Element[Element_Level].TraceNode.Add_Child(&Sub->Element[0].TraceNode);
-                Sub->Element[0].TraceNode.Init();
-            }
-            else
-                Element[Element_Level].TraceNode.NoShow=true; //We don't want to show this item because there is no info in it
+            //Add Sub to this node
+            Element[Element_Level].TraceNode.Add_Child(&Sub->Element[0].TraceNode);
+            Sub->Element[0].TraceNode.Init();
         }
-    #endif
+        else
+            Element[Element_Level].TraceNode.NoShow = true; //We don't want to show this item because there is no info in it
+    }
 }
-
+#endif // MEDIAINFO_TRACE
 //---------------------------------------------------------------------------
 void File__Analyze::Open_Buffer_Continue (const int8u* ToAdd, size_t ToAdd_Size)
 {
@@ -1047,21 +1052,8 @@ void File__Analyze::Open_Buffer_Continue (File__Analyze* Sub, const int8u* ToAdd
     }
 
     #if MEDIAINFO_TRACE
-        if (Trace_Activated)
-        {
-            //Details handling
-            if ((Sub->Element[0].TraceNode.Get_Name() || Sub->Element[0].TraceNode.Children.size()) && !Trace_DoNotSave)
-            {
-                //From Sub
-                while(Sub->Element_Level)
-                    Sub->Element_End0();
-                Element[Element_Level].TraceNode.Add_Child(&Sub->Element[0].TraceNode);
-                Sub->Element[0].TraceNode.Init();
-            }
-            else
-                Element[Element_Level].TraceNode.NoShow=true; //We don't want to show this item because there is no info in it
-        }
-    #endif
+        Trace_Details_Handling(Sub);
+    #endif //MEDIAINFO_TRACE
 }
 
 //---------------------------------------------------------------------------
@@ -2249,7 +2241,7 @@ bool File__Analyze::Header_Manage()
     #if MEDIAINFO_TRACE
     if (Trace_Activated)
     {
-        if (!Element[Element_Level-1].TraceNode.Get_Name())
+        if (Element[Element_Level-1].TraceNode.Name_Is_Empty())
             Element[Element_Level-1].TraceNode.Set_Name("Unknown");
         Element[Element_Level].TraceNode.Size=Element_Offset;
         if (Element_Offset==0)
@@ -3446,6 +3438,56 @@ void File__Analyze::Element_DoNotShow ()
 
 //---------------------------------------------------------------------------
 #if MEDIAINFO_TRACE
+void File__Analyze::Element_DoNotShow_Children ()
+{
+    for (size_t i = 0; i < Element[Element_Level].TraceNode.Children.size(); ++i)
+    {
+        if (!Element[Element_Level].TraceNode.Children[i])
+            continue;
+        Element[Element_Level].TraceNode.Children[i]->NoShow=true;
+    }
+}
+#endif //MEDIAINFO_TRACE
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_TRACE
+void File__Analyze::Element_Remove_Children_IfNoErrors ()
+{
+    for (size_t i = 0; i < Element[Element_Level].TraceNode.Children.size(); ++i)
+    {
+        if (!Element[Element_Level].TraceNode.Children[i])
+            continue;
+        delete Element[Element_Level].TraceNode.Children[i];
+        Element[Element_Level].TraceNode.Children[i] = NULL;
+    }
+
+    Element[Element_Level].TraceNode.Children.clear();
+}
+#endif //MEDIAINFO_TRACE
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_TRACE
+void File__Analyze::Element_Children_IfNoErrors ()
+{
+    if (Element[Element_Level].TraceNode.HasError)
+        return;
+
+    //TODO: option to keep the nodes
+    // Element_DoNotShow_Children();
+    Element_Remove_Children_IfNoErrors();
+}
+#endif //MEDIAINFO_TRACE
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_TRACE
+void File__Analyze::Element_Set_Remove_Children_IfNoErrors ()
+{
+    Element[Element_Level].TraceNode.RemoveIfNoErrors = true;
+}
+#endif //MEDIAINFO_TRACE
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_TRACE
 void File__Analyze::Element_Show ()
 {
     Element[Element_Level].TraceNode.NoShow=false;
@@ -3454,6 +3496,19 @@ void File__Analyze::Element_Show ()
 
 //---------------------------------------------------------------------------
 #if MEDIAINFO_TRACE
+void File__Analyze::Element_Show_Children ()
+{
+    for (size_t i = 0; i < Element[Element_Level].TraceNode.Children.size(); ++i)
+    {
+        if (!Element[Element_Level].TraceNode.Children[i])
+            continue;
+        Element[Element_Level].TraceNode.Children[i]->NoShow=false;
+    }
+}
+#endif //MEDIAINFO_TRACE
+
+//---------------------------------------------------------------------------
+#if MEDIAINFO_TRACE
 bool File__Analyze::Element_Show_Get ()
 {
     return !Element[Element_Level].TraceNode.NoShow;
diff --git a/Source/MediaInfo/File__Analyze.h b/Source/MediaInfo/File__Analyze.h
index 50427f6..1f5ff5f 100644
--- a/Source/MediaInfo/File__Analyze.h
+++ b/Source/MediaInfo/File__Analyze.h
@@ -350,6 +350,21 @@ protected :
 
         Element[Element_Level].TraceNode.Infos.push_back(new element_details::Element_Node_Info(Parameter, Measure, AfterComma));
     }
+
+    void Element_Info (const char* Parameter, const char* Measure=NULL, int8u AfterComma=3)
+    {
+        if (Config_Trace_Level<1)
+            return;
+
+        //Needed?
+        if (Config_Trace_Level<=0.7)
+            return;
+
+        if (Parameter && std::string(Parameter) == "NOK")
+            Element[Element_Level].TraceNode.HasError = true;
+
+        Element[Element_Level].TraceNode.Infos.push_back(new element_details::Element_Node_Info(Parameter, Measure, AfterComma));
+    }
 #endif //MEDIAINFO_TRACE
 
     #ifdef SIZE_T_IS_LONG
@@ -414,7 +429,7 @@ public :
         int64u Pos=Element_Offset+BS->OffsetBeforeLastCall_Get();
 
         element_details::Element_Node *node = new element_details::Element_Node;
-        node->Set_Name(Parameter.c_str());
+        node->Set_Name(Parameter);
         node->Pos = Pos==(int64u)-1 ? Pos : (File_Offset+Buffer_Offset+Pos);
         node->Value.set_Option(GenericOption);
         node->Value = Value;
@@ -456,6 +471,26 @@ public :
         else
             Element[Element_Level].TraceNode.Infos.push_back(new element_details::Element_Node_Info(Parameter, Measure, AfterComma));
     }
+
+    void Param_Info(const char* Parameter, const char* Measure=NULL, int8u AfterComma=3)
+    {
+        //Coherancy
+        if (!Trace_Activated)
+            return;
+        if (Element[Element_Level].UnTrusted)
+            return;
+        if (Config_Trace_Level<=0.7)
+            return;
+
+        if (Parameter && std::string(Parameter) == "NOK")
+            Element[Element_Level].TraceNode.HasError = true;
+
+        int32s child = Element[Element_Level].TraceNode.Current_Child;
+        if (child >= 0 && Element[Element_Level].TraceNode.Children[child])
+            Element[Element_Level].TraceNode.Children[child]->Infos.push_back(new element_details::Element_Node_Info(Parameter, Measure, AfterComma));
+        else
+            Element[Element_Level].TraceNode.Infos.push_back(new element_details::Element_Node_Info(Parameter, Measure, AfterComma));
+    }
 #endif //MEDIAINFO_TRACE
 
     #ifdef SIZE_T_IS_LONG
@@ -1098,6 +1133,11 @@ public :
     void Element_DoNotTrust (const char* Reason);
     void Element_DoNotShow ();
     void Element_Show ();
+    void Element_Set_Remove_Children_IfNoErrors ();
+    void Element_Remove_Children_IfNoErrors ();
+    void Element_Children_IfNoErrors ();
+    void Element_DoNotShow_Children ();
+    void Element_Show_Children ();
     bool Element_Show_Get ();
     void Element_Show_Add (File__Analyze* node);
 
@@ -1265,7 +1305,9 @@ protected :
     std::bitset<32> Trace_Layers;
     void Trace_Layers_Update (size_t Layer=(size_t)-1);
 private :
-
+#if MEDIAINFO_TRACE
+    void Trace_Details_Handling(File__Analyze* Sub);
+#endif // MEDIAINFO_TRACE
     //Elements
     size_t Element_Level_Base;      //From other parsers
     std::vector<element_details> Element;
diff --git a/Source/MediaInfo/File__Analyze_Element.cpp b/Source/MediaInfo/File__Analyze_Element.cpp
index 274a782..ff22d31 100644
--- a/Source/MediaInfo/File__Analyze_Element.cpp
+++ b/Source/MediaInfo/File__Analyze_Element.cpp
@@ -598,32 +598,13 @@ std::ostream& operator<<(std::ostream& os, const element_details::Element_Node_D
 //***************************************************************************
 // Element_Node_Info
 //***************************************************************************
-
-//---------------------------------------------------------------------------
-element_details::Element_Node_Info& element_details::Element_Node_Info::operator=(const Element_Node_Info& v)
-{
-    if (this == &v)
-        return *this;
-
-    data = v.data;
-    if (v.Measure)
-    {
-        size_t len = strlen(v.Measure) + 1;
-        Measure = new char[len];
-        std::memcpy(Measure, v.Measure, len);
-    }
-
-    return *this;
-}
-
-//---------------------------------------------------------------------------
 std::ostream& operator<<(std::ostream& os, element_details::Element_Node_Info* v)
 {
     if (!v)
         return os;
 
     os << v->data;
-    if (v->Measure)
+    if (!v->Measure.empty())
         os << v->Measure;
 
     return os;
@@ -634,8 +615,8 @@ std::ostream& operator<<(std::ostream& os, element_details::Element_Node_Info* v
 //***************************************************************************
 //---------------------------------------------------------------------------
 element_details::Element_Node::Element_Node()
-: Pos(0), Size(0), Name(NULL),
-  Current_Child(-1), NoShow(false), OwnChildren(true), IsCat(false)
+: Pos(0), Size(0),
+  Current_Child(-1), NoShow(false), OwnChildren(true), IsCat(false), HasError(false), RemoveIfNoErrors(false)
 {
 }
 
@@ -647,18 +628,7 @@ element_details::Element_Node::Element_Node(const Element_Node& node)
 
     Pos = node.Pos;
     Size = node.Size;
-    if (node.Name)
-    {
-        size_t len = strlen(node.Name);
-        if (len)
-        {
-            len++;
-            Name = new char[len];
-            std::memcpy(Name, node.Name, len);
-        }
-    }
-    else
-        Name = NULL;
+    Name = node.Name;
     Value = node.Value;
     Infos = node.Infos;
     Children = node.Children;
@@ -666,13 +636,13 @@ element_details::Element_Node::Element_Node(const Element_Node& node)
     NoShow = node.NoShow;
     OwnChildren = node.OwnChildren;
     IsCat = node.IsCat;
+    HasError = node.HasError;
+    RemoveIfNoErrors = node.RemoveIfNoErrors;
 }
 
 //---------------------------------------------------------------------------
 element_details::Element_Node::~Element_Node()
 {
-    delete[] Name;
-
     if (!OwnChildren)
         return;
 
@@ -690,11 +660,7 @@ void element_details::Element_Node::Init()
 {
     Pos = 0;
     Size = 0;
-    if (Name)
-    {
-        delete[] Name;
-        Name = NULL;
-    }
+    Name.clear();
     Value.clear();
     if (Children.size() && OwnChildren)
         for (size_t i = 0; i < Children.size(); ++i)
@@ -708,12 +674,17 @@ void element_details::Element_Node::Init()
     NoShow = false;
     OwnChildren = true;
     IsCat = false;
+    HasError = false;
+    RemoveIfNoErrors = false;
 }
 
 //---------------------------------------------------------------------------
 int element_details::Element_Node::Print_Micro_Xml(std::ostringstream& ss, size_t level)
 {
-    if (IsCat || !Name)
+    if (NoShow)
+        return 0;
+
+    if (IsCat || Name_Is_Empty())
         goto print_children;
 
     if (Value.empty())
@@ -737,7 +708,7 @@ int element_details::Element_Node::Print_Micro_Xml(std::ostringstream& ss, size_
     {
         Element_Node_Info* Info = Infos[i];
 
-        if (Info->Measure && !std::strcmp(Info->Measure, "Parser"))
+        if (Info->Measure == "Parser")
         {
             if (!(Info->data == string()))
                 ss << " parser=\"" << Info->data << "\"";
@@ -765,7 +736,7 @@ print_children:
     for (size_t i = 0; i < Children.size(); ++i)
         Children[i]->Print_Micro_Xml(ss, level);
 
-    if (!IsCat && Name)
+    if (!IsCat && !Name_Is_Empty())
     {
         //end tag
         if (Value.empty())
@@ -781,10 +752,13 @@ print_children:
 //---------------------------------------------------------------------------
 int element_details::Element_Node::Print_Xml(std::ostringstream& ss, size_t level)
 {
+    if (NoShow)
+        return 0;
+
     std::string spaces;
     bool Modified = false;
 
-    if (IsCat || !Name)
+    if (IsCat || Name_Is_Empty())
         goto print_children;
 
     spaces.resize(level, ' ');
@@ -811,7 +785,7 @@ int element_details::Element_Node::Print_Xml(std::ostringstream& ss, size_t leve
     {
         Element_Node_Info* Info = Infos[i];
 
-        if (Info->Measure && !std::strcmp(Info->Measure, "Parser"))
+        if (Info->Measure == "Parser")
         {
             if (!(Info->data == string()))
                 ss << " parser=\"" << Info->data << "\"";
@@ -841,7 +815,7 @@ print_children:
     for (size_t i = 0; i < Children.size(); ++i)
         Children[i]->Print_Xml(ss, level);
 
-    if (!IsCat && Name)
+    if (!IsCat && !Name_Is_Empty())
     {
         //end tag
         if (Value.empty())
@@ -882,9 +856,12 @@ int element_details::Element_Node::Print_Tree(std::ostringstream& ss, size_t lev
 {
     std::string spaces;
 
+    if (NoShow)
+        return 0;
+
     if (IsCat)
         return Print_Tree_Cat(ss, level);
-    else if (!Name)
+    else if (Name_Is_Empty())
         goto print_children;
 
     ss << std::setfill('0') << std::setw(8) << std::hex << std::uppercase << Pos << std::nouppercase << std::dec;
@@ -898,7 +875,7 @@ int element_details::Element_Node::Print_Tree(std::ostringstream& ss, size_t lev
     if (!Value.empty())
     {
         ss << ":";
-        int nb_free = NB_SPACES - level - (Name ? 0 : strlen(Name)); // 40 - len(Name) - len(spaces)
+        int nb_free = NB_SPACES - level - (Name_Is_Empty() ? 0 : Name.length()); // 40 - len(Name) - len(spaces)
         spaces.resize(nb_free > 0 ? nb_free : 1, ' ');
         Value.Set_Output_Format(Element_Node_Data::Format_Tree);
         ss << spaces << Value;
@@ -910,7 +887,7 @@ int element_details::Element_Node::Print_Tree(std::ostringstream& ss, size_t lev
     {
         Element_Node_Info* Info = Infos[i];
 
-        if (Info->Measure && !std::strcmp(Info->Measure, "Parser"))
+        if (Info->Measure == "Parser")
         {
             if (!(Info->data == string()))
                 ss << " - Parser=" << Info->data;
@@ -961,51 +938,24 @@ int element_details::Element_Node::Print(MediaInfo_Config::trace_Format Format,
 //---------------------------------------------------------------------------
 void element_details::Element_Node::Add_Child(Element_Node* node)
 {
-    Element_Node *new_node = new Element_Node(*node);
-    node->OwnChildren = false;
-    Children.push_back(new_node);
-}
-
-//---------------------------------------------------------------------------
-void element_details::Element_Node::Set_Name(const char* Name_)
-{
-    delete[] Name;
-
-    if (!Name_)
+    if (node->HasError)
     {
-        Name = NULL;
-        return;
+        HasError = node->HasError;
+        NoShow = false;
     }
 
-    size_t len = strlen(Name_);
-    if (!len)
+    if (RemoveIfNoErrors && !node->HasError)
     {
-        Name = NULL;
+        if (!HasError)
+            NoShow = true;
         return;
     }
 
-    len++;
-    Name = new char[len];
-    std::memcpy(Name, Name_, len);
+    Element_Node *new_node = new Element_Node(*node);
+    node->OwnChildren = false;
+    Children.push_back(new_node);
 }
 
-//---------------------------------------------------------------------------
-void element_details::Element_Node::Set_Name(const string &Name_)
-{
-    delete[] Name;
-
-
-    size_t len = Name_.length();;
-    if (!len)
-    {
-        Name = NULL;
-        return;
-    }
-
-    Name = new char[len + 1];
-    std::memcpy(Name, Name_.c_str(), len);
-    Name[len] = '\0';
-}
 #endif
 
 }
diff --git a/Source/MediaInfo/File__Analyze_Element.h b/Source/MediaInfo/File__Analyze_Element.h
index 3ce2c3f..9d5d1d3 100644
--- a/Source/MediaInfo/File__Analyze_Element.h
+++ b/Source/MediaInfo/File__Analyze_Element.h
@@ -118,29 +118,16 @@ struct element_details
             data.set_Option(Option);
             data = parameter;
             if (_Measure)
-            {
-                size_t len = strlen(_Measure);
-                Measure = new char[len + 1];
-                std::memcpy(Measure, _Measure, len);
-                Measure[len] = '\0';
-            }
-            else
-                Measure = NULL;
-        }
-
-        ~Element_Node_Info()
-        {
-            delete[] Measure;
+                Measure = _Measure;
         }
 
         friend std::ostream& operator<<(std::ostream& os, element_details::Element_Node_Info* v);
 
         Element_Node_Data data;
-        char*             Measure;
-
-        Element_Node_Info& operator=(const Element_Node_Info&);
+        std::string       Measure;
 
     private:
+        Element_Node_Info& operator=(const Element_Node_Info&);
         Element_Node_Info(const Element_Node_Info&);
     };
 
@@ -154,7 +141,7 @@ struct element_details
         int64u                           Pos;             // Position of the element in the file
         int64u                           Size;            // Size of the element (including header and sub-elements)
     private:
-        char*                            Name;            // Name planned for this element
+        std::string                      Name;            // Name planned for this element
     public:
         Element_Node_Data                Value;           // The value (currently used only with Trace XML)
         std::vector<Element_Node_Info*>  Infos;           // More info about the element
@@ -163,12 +150,16 @@ struct element_details
         bool                             NoShow;          // Don't show this element
         bool                             OwnChildren;     // Child is owned by this node
         bool                             IsCat;           // Node is a category
+        bool                             HasError;        // Node or sub-nodes has Nok
+        bool                             RemoveIfNoErrors;// Remove Children Node if no NOK appears
 
         void                             Init();          //Initialize with common values
-        void Add_Child(Element_Node* node);              //Add a subchild to the current node
-        void Set_Name(const char* Name_);
-        void Set_Name(const string &Name_);
-        const char* Get_Name() {return Name;}
+        void Add_Child(Element_Node* node);               //Add a subchild to the current node
+        void Set_Name(const string &Name_)
+        {
+            Name = Name_;
+        }
+        bool Name_Is_Empty() const {return Name.empty();}
 
         // Print
         int  Print(MediaInfo_Config::trace_Format Format, std::string& str);  //Print the node into str
diff --git a/Source/MediaInfo/File__Analyze_Streams.cpp b/Source/MediaInfo/File__Analyze_Streams.cpp
index 411b881..6d98aea 100644
--- a/Source/MediaInfo/File__Analyze_Streams.cpp
+++ b/Source/MediaInfo/File__Analyze_Streams.cpp
@@ -750,7 +750,14 @@ void File__Analyze::Fill (stream_t StreamKind, size_t StreamPos, size_t Paramete
                 {
                     if (Languages[Pos].size()>=1)
                     {
-                        Ztring Language_Translated=MediaInfoLib::Config.Language_Get(__T("Language_")+Languages[Pos][0]);
+                        Ztring Language_Translated;
+                        if (Languages[Pos].size()==2)
+                            Language_Translated=MediaInfoLib::Config.Language_Get(__T("Language_")+Languages[Pos].Read()); //Testing in case the langauge file has the complex form
+                        if (Language_Translated.find(__T("Language_"))==0)
+                            Language_Translated.clear(); //No translation found
+                        if (Language_Translated.empty())
+                        {
+                        Language_Translated=MediaInfoLib::Config.Language_Get(__T("Language_")+Languages[Pos][0]);
                         if (Language_Translated.find(__T("Language_"))==0)
                             Language_Translated=Languages[Pos][0]; //No translation found
                         if (Languages[Pos].size()>=2)
@@ -768,6 +775,7 @@ void File__Analyze::Fill (stream_t StreamKind, size_t StreamPos, size_t Paramete
                                     Language_Translated+=Languages[Pos][Pos2];
                                 }
                         }
+                        }
                         Language1.push_back(Language_Translated);
                         if (Languages[Pos][0].size()==2)
                         {
@@ -807,10 +815,10 @@ void File__Analyze::Fill (stream_t StreamKind, size_t StreamPos, size_t Paramete
         if (Parameter==Fill_Parameter(StreamKind, Generic_ServiceName)
          || Parameter==Fill_Parameter(StreamKind, Generic_ServiceProvider))
         {
-            if (Retrieve(StreamKind, StreamPos, Parameter).find(__T(" - "))==string::npos && (Retrieve(StreamKind, StreamPos, Parameter).find(__T(":"))==2 || Retrieve(StreamKind, StreamPos, Parameter).find(__T(":"))==3))
+            if (Retrieve(StreamKind, StreamPos, Parameter).find(__T(" - "))==string::npos && (Retrieve(StreamKind, StreamPos, Parameter).find(__T(':'))==2 || Retrieve(StreamKind, StreamPos, Parameter).find(__T(':'))==3))
             {
                 Ztring Temp=Retrieve(StreamKind, StreamPos, Parameter);
-                Temp.erase(0, Retrieve(StreamKind, StreamPos, Parameter).find(__T(":"))+1);
+                Temp.erase(0, Retrieve(StreamKind, StreamPos, Parameter).find(__T(':'))+1);
                 (*Stream)[StreamKind][StreamPos](Parameter)=Temp;
             }
         }
@@ -1428,7 +1436,7 @@ size_t File__Analyze::Merge(File__Analyze &ToAdd, stream_t StreamKind, size_t St
         }
         if (!colour_description_present_Temp.empty())
         {
-            if (!colour_description_present_Temp.empty() && !Retrieve(Stream_Video, StreamPos_To, Video_colour_description_present).empty()
+            if (!Retrieve(Stream_Video, StreamPos_To, Video_colour_description_present).empty()
              && (colour_primaries_Temp!=Retrieve(Stream_Video, StreamPos_To, Video_colour_primaries)
               || transfer_characteristics_Temp!=Retrieve(Stream_Video, StreamPos_To, Video_transfer_characteristics)
               || matrix_coefficients_Temp!=Retrieve(Stream_Video, StreamPos_To, Video_matrix_coefficients)))
diff --git a/Source/MediaInfo/HashWrapper.cpp b/Source/MediaInfo/HashWrapper.cpp
index 17accce..8637745 100644
--- a/Source/MediaInfo/HashWrapper.cpp
+++ b/Source/MediaInfo/HashWrapper.cpp
@@ -52,7 +52,8 @@ namespace MediaInfoLib
 // info
 //***************************************************************************
 
-const char* HashWrapper_Hex = "0123456789abcdef";
+static const char HashWrapper_Hex[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
+
 
 //***************************************************************************
 // Constructor/Destructor
diff --git a/Source/MediaInfo/MediaInfo_Config.cpp b/Source/MediaInfo/MediaInfo_Config.cpp
index ad321c5..2b547eb 100644
--- a/Source/MediaInfo/MediaInfo_Config.cpp
+++ b/Source/MediaInfo/MediaInfo_Config.cpp
@@ -125,7 +125,7 @@ namespace MediaInfoLib
 {
 
 //---------------------------------------------------------------------------
-const Char*  MediaInfo_Version=__T("MediaInfoLib - v0.7.90");
+const Char*  MediaInfo_Version=__T("MediaInfoLib - v0.7.91");
 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
@@ -1509,7 +1509,7 @@ void MediaInfo_Config::Language_Set (stream_t StreamKind)
             ToReplace.FindAndReplace(__T("/String9"), Ztring());
             ToReplace.FindAndReplace(__T("/String"),  Ztring());
         }
-        if (!Language_Raw && ToReplace.find(__T("/"))!=Error) //Complex values, like XXX/YYY --> We translate both XXX and YYY
+        if (!Language_Raw && ToReplace.find(__T('/'))!=Error) //Complex values, like XXX/YYY --> We translate both XXX and YYY
         {
             Ztring ToReplace1=ToReplace.SubString(Ztring(), __T("/"));
             Ztring ToReplace2=ToReplace.SubString(__T("/"), Ztring());
diff --git a/Source/MediaInfo/MediaInfo_Config_Automatic.cpp b/Source/MediaInfo/MediaInfo_Config_Automatic.cpp
index b65ddd4..597056a 100644
--- a/Source/MediaInfo/MediaInfo_Config_Automatic.cpp
+++ b/Source/MediaInfo/MediaInfo_Config_Automatic.cpp
@@ -701,6 +701,7 @@ void MediaInfo_Config_DefaultLanguage (Translation &Info)
     "Language_en-us;English (United States)\n"
     "Language_eo;Esperanto\n"
     "Language_es;Spanish\n"
+    "Language_es-419;Spanish (Latin America)\n"
     "Language_et;Estonian\n"
     "Language_eu;Basque\n"
     "Language_fa;Persian\n"
diff --git a/Source/MediaInfo/MediaInfo_Config_MediaInfo.cpp b/Source/MediaInfo/MediaInfo_Config_MediaInfo.cpp
index 7f1e98f..9127158 100644
--- a/Source/MediaInfo/MediaInfo_Config_MediaInfo.cpp
+++ b/Source/MediaInfo/MediaInfo_Config_MediaInfo.cpp
@@ -764,21 +764,21 @@ Ztring MediaInfo_Config_MediaInfo::Option (const String &Option, const String &V
     {
         #if MEDIAINFO_DEMUX
             int64u ValueInt64u;
-            if (Value.find(__T(":"))!=string::npos)
+            if (Value.find(__T(':'))!=string::npos)
             {
                 Ztring ValueZ=Value;
                 ValueInt64u=0;
-                size_t Value_Pos=ValueZ.find(__T(":"));
+                size_t Value_Pos=ValueZ.find(__T(':'));
                 if (Value_Pos==string::npos)
                     Value_Pos=ValueZ.size();
                 ValueInt64u+=Ztring(ValueZ.substr(0, Value_Pos)).To_int64u()*60*60*1000*1000*1000;
                 ValueZ.erase(0, Value_Pos+1);
-                Value_Pos=ValueZ.find(__T(":"));
+                Value_Pos=ValueZ.find(__T(':'));
                 if (Value_Pos==string::npos)
                     Value_Pos=ValueZ.size();
                 ValueInt64u+=Ztring(ValueZ.substr(0, Value_Pos)).To_int64u()*60*1000*1000*1000;
                 ValueZ.erase(0, Value_Pos+1);
-                Value_Pos=ValueZ.find(__T("."));
+                Value_Pos=ValueZ.find(__T('.'));
                 if (Value_Pos==string::npos)
                     Value_Pos=ValueZ.size();
                 ValueInt64u+=Ztring(ValueZ.substr(0, Value_Pos)).To_int64u()*1000*1000*1000;
diff --git a/Source/MediaInfo/MediaInfo_Events.h b/Source/MediaInfo/MediaInfo_Events.h
index b1b1fe3..a81b465 100644
--- a/Source/MediaInfo/MediaInfo_Events.h
+++ b/Source/MediaInfo/MediaInfo_Events.h
@@ -931,14 +931,14 @@ inline MediaInfo_int64u MediaInfo_ID_FromGet_intA (const char* ID, const char* C
     const char* SubID;
 
     ToReturn=(MediaInfo_int64u)atoi(ID);
-    SubID=strstr(ID, "-");
+    SubID= strchr(ID, '-');
     if (SubID)
     {
         MediaInfo_int64u ToReturn2;
 
         ToReturn2=atoi(SubID+1);
 
-        SubID=strstr(SubID+1, "-");
+        SubID= strchr(SubID+1, '-');
         if (SubID)
         {
             MediaInfo_int64u ToReturn3;
diff --git a/Source/MediaInfo/MediaInfo_Inform.cpp b/Source/MediaInfo/MediaInfo_Inform.cpp
index 0b4170f..7b70cbf 100644
--- a/Source/MediaInfo/MediaInfo_Inform.cpp
+++ b/Source/MediaInfo/MediaInfo_Inform.cpp
@@ -589,9 +589,9 @@ Ztring MediaInfo_Internal::Inform (stream_t StreamKind, size_t StreamPos, bool I
 
     //Gestion $xx$
     size_t PosX=0;
-    while (Retour.find(__T("$"), PosX)!=(size_t)-1)
+    while (Retour.find(__T('$'), PosX)!=(size_t)-1)
     {
-        PosX=Retour.find(__T("$"), PosX);
+        PosX=Retour.find(__T('$'), PosX);
         if (Retour.size()>PosX+2 && !(Retour(PosX+1)==__T('i') && Retour(PosX+2)==__T('f') && Retour(PosX+3)==__T('('))) //To keep out "%" without any signification, or "$if(..."
         {
             Ztring ARemplacer=Ztring(__T("$")+Retour.SubString(__T("$"), __T("$"), PosX))+__T("$");
@@ -668,9 +668,9 @@ Ztring MediaInfo_Internal::Inform (stream_t StreamKind, size_t StreamPos, bool I
 
     //Gestion %xxx%
     PosX=0;
-    while (Retour.find(__T("%"), PosX)!=(size_t)-1)
+    while (Retour.find(__T('%'), PosX)!=(size_t)-1)
     {
-        PosX=Retour.find(__T("%"), PosX);
+        PosX=Retour.find(__T('%'), PosX);
         if (Retour.size() > PosX + 2 && Retour[PosX + 1] >= __T('A') && Retour[PosX + 1] <= __T('Z')) //To keep out "%" without any signification
         {
             Ztring ARemplacer = Ztring(__T("%") + Retour.SubString(__T("%"), __T("%"), PosX)) + __T("%");
diff --git a/Source/MediaInfo/MediaInfo_Internal.cpp b/Source/MediaInfo/MediaInfo_Internal.cpp
index 3849843..1d0c040 100644
--- a/Source/MediaInfo/MediaInfo_Internal.cpp
+++ b/Source/MediaInfo/MediaInfo_Internal.cpp
@@ -1280,22 +1280,22 @@ String MediaInfo_Internal::Option (const String &Option, const String &Value)
                     Ztring FrameNumberZ=List[Pos].substr(List[Pos].find(__T("Frame="))+6, string::npos);
                     SeekValue=FrameNumberZ.To_int64u();
                 }
-                else if (!List[Pos].empty() && List[Pos].find(__T(":"))!=string::npos)
+                else if (!List[Pos].empty() && List[Pos].find(__T(':'))!=string::npos)
                 {
                     Method=2;
                     Ztring ValueZ=List[Pos];
                     SeekValue=0;
-                    size_t Value_Pos=ValueZ.find(__T(":"));
+                    size_t Value_Pos=ValueZ.find(__T(':'));
                     if (Value_Pos==string::npos)
                         Value_Pos=ValueZ.size();
                     SeekValue+=Ztring(ValueZ.substr(0, Value_Pos)).To_int64u()*60*60*1000*1000*1000;
                     ValueZ.erase(0, Value_Pos+1);
-                    Value_Pos=ValueZ.find(__T(":"));
+                    Value_Pos=ValueZ.find(__T(':'));
                     if (Value_Pos==string::npos)
                         Value_Pos=ValueZ.size();
                     SeekValue+=Ztring(ValueZ.substr(0, Value_Pos)).To_int64u()*60*1000*1000*1000;
                     ValueZ.erase(0, Value_Pos+1);
-                    Value_Pos=ValueZ.find(__T("."));
+                    Value_Pos=ValueZ.find(__T('.'));
                     if (Value_Pos==string::npos)
                         Value_Pos=ValueZ.size();
                     SeekValue+=Ztring(ValueZ.substr(0, Value_Pos)).To_int64u()*1000*1000*1000;
diff --git a/Source/MediaInfo/MediaInfo_Internal.h b/Source/MediaInfo/MediaInfo_Internal.h
index 7e8035b..2bf8c1d 100644
--- a/Source/MediaInfo/MediaInfo_Internal.h
+++ b/Source/MediaInfo/MediaInfo_Internal.h
@@ -130,6 +130,7 @@ private :
     //Helpers
     void CreateDummy (const String& Value); //Create dummy Information
     MediaInfo_Internal(const MediaInfo_Internal&); // Copy Constructor
+    MediaInfo_Internal &operator =(const MediaInfo_Internal &);
 
     //Open Buffer
     bool Info_IsMultipleParsing;
diff --git a/Source/MediaInfo/Multiple/File_DashMpd.cpp b/Source/MediaInfo/Multiple/File_DashMpd.cpp
index 7bc6492..e302c13 100644
--- a/Source/MediaInfo/Multiple/File_DashMpd.cpp
+++ b/Source/MediaInfo/Multiple/File_DashMpd.cpp
@@ -155,6 +155,8 @@ struct template_generic
 
     template_generic(const template_generic &ToCopy)
     {
+        if (this == &ToCopy)
+            return;
         Sequence=new sequence;
         *Sequence=*ToCopy.Sequence;
         template_generic::BaseURL=ToCopy.BaseURL;
@@ -173,14 +175,14 @@ struct template_generic
     void Representation_Attributes_Parse    (XMLElement* Item);
 
     void Decode ();
+private:
+    template_generic &operator =(const template_generic &);
 };
 
 void template_generic::AdaptationSet_Attributes_Parse (XMLElement* Item)
 {
-    const char* Attribute;
-
     //Attributes - mineType
-    Attribute=Item->Attribute("mimeType");
+    const char* Attribute=Item->Attribute("mimeType");
     if (Attribute)
         Sequence->StreamKind=DashMpd_mimeType_StreamKind(Attribute);
 
@@ -197,10 +199,8 @@ void template_generic::AdaptationSet_Attributes_Parse (XMLElement* Item)
 
 void template_generic::SegmentTemplate_Attributes_Parse (XMLElement* Item)
 {
-    const char* Attribute;
-
     //Attributes - initialization
-    Attribute=Item->Attribute("initialization");
+    const char* Attribute=Item->Attribute("initialization");
     if (Attribute)
     {
         initialization.From_UTF8(Attribute);
@@ -230,11 +230,10 @@ void template_generic::SegmentTemplate_Attributes_Parse (XMLElement* Item)
 
 void template_generic::SegmentTimeline_Attributes_Parse (XMLElement* Item)
 {
-    const char* Attribute;
     segmenttimeline SegmentTimeLine;
 
     //Attributes - t (start time)
-    Attribute=Item->Attribute("t");
+    const char* Attribute=Item->Attribute("t");
     if (Attribute)
     {
         SegmentTimeLine.t=Ztring().From_UTF8(Attribute).To_int64u();
@@ -265,10 +264,8 @@ void template_generic::SegmentTimeline_Attributes_Parse (XMLElement* Item)
 
 void template_generic::Representation_Attributes_Parse (XMLElement* Item)
 {
-    const char* Attribute;
-
     //Attributes - id
-    Attribute=Item->Attribute("id");
+    const char* Attribute=Item->Attribute("id");
     if (Attribute)
     {
         Sequence->StreamID=Ztring().From_UTF8(Attribute).To_int64u(16);
diff --git a/Source/MediaInfo/Multiple/File_DcpCpl.cpp b/Source/MediaInfo/Multiple/File_DcpCpl.cpp
index f79219d..4059e3b 100644
--- a/Source/MediaInfo/Multiple/File_DcpCpl.cpp
+++ b/Source/MediaInfo/Multiple/File_DcpCpl.cpp
@@ -60,6 +60,8 @@ File_DcpCpl::File_DcpCpl()
 
     //Temp
     ReferenceFiles=NULL;
+    //PKL
+    PKL_Pos = (size_t)-1;
 }
 
 //---------------------------------------------------------------------------
diff --git a/Source/MediaInfo/Multiple/File_DvDif.cpp b/Source/MediaInfo/Multiple/File_DvDif.cpp
index 405f23f..5b0820c 100644
--- a/Source/MediaInfo/Multiple/File_DvDif.cpp
+++ b/Source/MediaInfo/Multiple/File_DvDif.cpp
@@ -48,7 +48,7 @@ static const char*  Dv_sct[]=
 };
 
 //---------------------------------------------------------------------------
-const char* Dv_Ssyb_Pc0(int8u Pc0)
+static const char* Dv_Ssyb_Pc0(int8u Pc0)
 {
     switch (Pc0)
     {
diff --git a/Source/MediaInfo/Multiple/File_Gxf.cpp b/Source/MediaInfo/Multiple/File_Gxf.cpp
index e387501..ebed953 100644
--- a/Source/MediaInfo/Multiple/File_Gxf.cpp
+++ b/Source/MediaInfo/Multiple/File_Gxf.cpp
@@ -1610,6 +1610,7 @@ void File_Gxf::Detect_EOF()
 //---------------------------------------------------------------------------
 File__Analyze* File_Gxf::ChooseParser_ChannelGrouping(int8u TrackID)
 {
+#ifdef MEDIAINFO_SMPTEST0337_YES
     File_ChannelGrouping* Parser;
     if (Audio_Count%2)
     {
@@ -1644,10 +1645,11 @@ File__Analyze* File_Gxf::ChooseParser_ChannelGrouping(int8u TrackID)
             Parser->Demux_UnpacketizeContainer=true;
         }
     #endif //MEDIAINFO_DEMUX
-
     return Parser;
+#else
+    return NULL;
+#endif // MEDIAINFO_SMPTEST0337_YES
 }
-
 //---------------------------------------------------------------------------
 void File_Gxf::TryToFinish()
 {
diff --git a/Source/MediaInfo/Multiple/File_HdsF4m.cpp b/Source/MediaInfo/Multiple/File_HdsF4m.cpp
index 3199272..58fbcea 100644
--- a/Source/MediaInfo/Multiple/File_HdsF4m.cpp
+++ b/Source/MediaInfo/Multiple/File_HdsF4m.cpp
@@ -129,10 +129,8 @@ bool File_HdsF4m::FileHeader_Begin()
                 if (string(Root_Item->Value())=="media")
                 {
                     sequence* Sequence=new sequence;
-                    const char* Attribute;
-
                     //Attributes - mineType
-                    Attribute=Root_Item->Attribute("url");
+                    const char* Attribute=Root_Item->Attribute("url");
                     if (Attribute)
                         Sequence->AddFileName(Ztring().From_UTF8(Attribute)+__T("Seg1.f4f"));
 
diff --git a/Source/MediaInfo/Multiple/File_Mk.cpp b/Source/MediaInfo/Multiple/File_Mk.cpp
index 4ae219e..165e681 100644
--- a/Source/MediaInfo/Multiple/File_Mk.cpp
+++ b/Source/MediaInfo/Multiple/File_Mk.cpp
@@ -1127,7 +1127,7 @@ void File_Mk::Header_Parse()
     }
 
     //Parsing
-    int64u Name, Size;
+    int64u Name, Size = 0;
     bool NameIsValid=true;
     if (Element_Offset+1<Element_Size)
     {
@@ -2058,6 +2058,10 @@ void File_Mk::Segment_Cluster()
 {
     Element_Name("Cluster");
 
+#if MEDIAINFO_TRACE
+    Element_Set_Remove_Children_IfNoErrors();
+#endif // MEDIAINFO_TRACE
+
     //For each stream
     std::map<int64u, stream>::iterator Temp=Stream.begin();
     if (!Segment_Cluster_Count)
@@ -2117,15 +2121,17 @@ void File_Mk::Segment_Cluster_BlockGroup()
 //---------------------------------------------------------------------------
 void File_Mk::Segment_Cluster_BlockGroup_Block()
 {
-    Element_Name(Element_Level==3?"SimpleBlock":"Block");
+    bool is_simple_block = Element_Level == 3;
+    Element_Name(is_simple_block?"SimpleBlock":"Block");
 
     //Parsing
     int64u TrackNumber;
     Get_EB (TrackNumber,                                        "TrackNumber");
 
     //Finished?
-    Stream[TrackNumber].PacketCount++;
-    if (Stream[TrackNumber].Searching_Payload || Stream[TrackNumber].Searching_TimeStamps || Stream[TrackNumber].Searching_TimeStamp_Start)
+    stream& streamItem = Stream[TrackNumber];
+    streamItem.PacketCount++;
+    if (streamItem.Searching_Payload || streamItem.Searching_TimeStamps || streamItem.Searching_TimeStamp_Start)
     {
         //Parsing
         int16u TimeCodeU;
@@ -2134,28 +2140,28 @@ void File_Mk::Segment_Cluster_BlockGroup_Block()
         Element_Info1(TimeCodeU);
 
         FILLING_BEGIN();
-            if (Segment_Cluster_TimeCode_Value+TimeCode<Stream[TrackNumber].TimeCode_Start) //Does not work well: Stream[TrackNumber].Searching_TimeStamp_Start)
+            if (Segment_Cluster_TimeCode_Value+TimeCode<streamItem.TimeCode_Start) //Does not work well: streamItem.Searching_TimeStamp_Start)
             {
                 FILLING_BEGIN();
-                    Stream[TrackNumber].TimeCode_Start=Segment_Cluster_TimeCode_Value+TimeCode;
-                    //Stream[TrackNumber].Searching_TimeStamp_Start=false;
+                      streamItem.TimeCode_Start=Segment_Cluster_TimeCode_Value+TimeCode;
+                    //streamItem.Searching_TimeStamp_Start=false;
                 FILLING_END();
             }
-            if (Stream[TrackNumber].Searching_TimeStamps)
+            if (streamItem.Searching_TimeStamps)
             {
-                Stream[TrackNumber].TimeCodes.push_back(Segment_Cluster_TimeCode_Value+TimeCode);
-                if (Stream[TrackNumber].TimeCodes.size()>128)
-                    Stream[TrackNumber].Searching_TimeStamps=false;
+                streamItem.TimeCodes.push_back(Segment_Cluster_TimeCode_Value+TimeCode);
+                if (streamItem.TimeCodes.size()>128)
+                    streamItem.Searching_TimeStamps=false;
             }
 
             if (Segment_Cluster_BlockGroup_BlockDuration_Value!=(int64u)-1)
             {
-                Stream[TrackNumber].Segment_Cluster_BlockGroup_BlockDuration_Counts[Segment_Cluster_BlockGroup_BlockDuration_Value]++;
+                streamItem.Segment_Cluster_BlockGroup_BlockDuration_Counts[Segment_Cluster_BlockGroup_BlockDuration_Value]++;
                 Segment_Cluster_BlockGroup_BlockDuration_Value=(int64u)-1;
             }
         FILLING_END();
 
-        if (Stream[TrackNumber].Searching_Payload)
+        if (streamItem.Searching_Payload)
         {
             std::vector<int64u> Laces;
             int32u Lacing;
@@ -2230,41 +2236,41 @@ void File_Mk::Segment_Cluster_BlockGroup_Block()
                 for (size_t Pos=0; Pos<Laces.size(); Pos++)
                 {
                     //Content compression
-                    if (Stream[TrackNumber].ContentCompAlgo!=(int32u)-1 && Stream[TrackNumber].ContentCompAlgo!=3)
-                        Stream[TrackNumber].Searching_Payload=false; //Unsupported
+                    if (streamItem.ContentCompAlgo!=(int32u)-1 && streamItem.ContentCompAlgo!=3)
+                        streamItem.Searching_Payload=false; //Unsupported
 
                     //Integrity test
                     if (Element_Offset+Laces[Pos]>Element_Size)
-                        Stream[TrackNumber].Searching_Payload=false; //There is a problem
+                        streamItem.Searching_Payload=false; //There is a problem
 
-                    if (Stream[TrackNumber].Searching_Payload)
+                    if (streamItem.Searching_Payload)
                     {
                         Element_Begin1("Data");
-                        Element_Parser(Stream[TrackNumber].Parser->ParserName.c_str());
+                        Element_Parser(streamItem.Parser->ParserName.c_str());
 
                         Element_Code=TrackNumber;
 
                         //Content compression
-                        if (Stream[TrackNumber].ContentCompAlgo==3) //Header Stripping
+                        if (streamItem.ContentCompAlgo==3) //Header Stripping
                         {
-                            Element_Offset-=(size_t)Stream[TrackNumber].ContentCompSettings_Buffer_Size; //This is an extra array, not in the stream
-                            Open_Buffer_Continue(Stream[TrackNumber].Parser, Stream[TrackNumber].ContentCompSettings_Buffer, (size_t)Stream[TrackNumber].ContentCompSettings_Buffer_Size);
-                            Element_Offset+=(size_t)Stream[TrackNumber].ContentCompSettings_Buffer_Size;
-                            Demux(Stream[TrackNumber].ContentCompSettings_Buffer, (size_t)Stream[TrackNumber].ContentCompSettings_Buffer_Size, ContentType_MainStream);
+                            Element_Offset-=(size_t)streamItem.ContentCompSettings_Buffer_Size; //This is an extra array, not in the stream
+                            Open_Buffer_Continue(streamItem.Parser, streamItem.ContentCompSettings_Buffer, (size_t)streamItem.ContentCompSettings_Buffer_Size);
+                            Element_Offset+=(size_t)streamItem.ContentCompSettings_Buffer_Size;
+                            Demux(streamItem.ContentCompSettings_Buffer, (size_t)streamItem.ContentCompSettings_Buffer_Size, ContentType_MainStream);
                         }
 
                         //Parsing
                         #if MEDIAINFO_DEMUX
                             int8u Demux_Level_old=Demux_Level;
-                            if (Stream[TrackNumber].Parser && Stream[TrackNumber].Parser->Demux_Level==2)
+                            if (streamItem.Parser && streamItem.Parser->Demux_Level==2)
                                 Demux_Level=4;
                             Demux(Buffer+Buffer_Offset+(size_t)Element_Offset, (size_t)(Element_Size-Element_Offset), ContentType_MainStream);
                             Demux_Level=Demux_Level_old;
                         #endif //MEDIAINFO_DEMUX
-                        Open_Buffer_Continue(Stream[TrackNumber].Parser, (size_t)Laces[Pos]);
-                        if (Stream[TrackNumber].Parser->Status[IsFinished]
-                         || (Stream[TrackNumber].PacketCount>=300 && MediaInfoLib::Config.ParseSpeed_Get()<1))
-                            Stream[TrackNumber].Searching_Payload=false;
+                        Open_Buffer_Continue(streamItem.Parser, (size_t)Laces[Pos]);
+                        if (streamItem.Parser->Status[IsFinished]
+                         || (streamItem.PacketCount>=300 && MediaInfoLib::Config.ParseSpeed_Get()<1))
+                            streamItem.Searching_Payload=false;
 
                         Element_End0();
                     }
@@ -2281,7 +2287,7 @@ void File_Mk::Segment_Cluster_BlockGroup_Block()
             Skip_XX(Element_Size-Element_Offset,                    "Data");
         }
 
-        if (!Stream[TrackNumber].Searching_Payload && !Stream[TrackNumber].Searching_TimeStamps && !Stream[TrackNumber].Searching_TimeStamp_Start)
+        if (!streamItem.Searching_Payload && !streamItem.Searching_TimeStamps && !streamItem.Searching_TimeStamp_Start)
             Stream_Count--;
     }
     else
@@ -2309,7 +2315,12 @@ void File_Mk::Segment_Cluster_BlockGroup_Block()
         }
     }
 
-    Element_Show(); //For debug
+    Element_Show();
+
+#if MEDIAINFO_TRACE
+    if (is_simple_block)
+        Element_Children_IfNoErrors();
+#endif // MEDIAINFO_TRACE
 }
 
 //---------------------------------------------------------------------------
@@ -3176,9 +3187,10 @@ void File_Mk::Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_Content
     FILLING_BEGIN();
         if (Segment_Info_Count>1)
             return; //First element has the priority
-        Stream[TrackNumber].ContentCompSettings_Buffer=new int8u[(size_t)Element_Size];
-        std::memcpy(Stream[TrackNumber].ContentCompSettings_Buffer, Buffer+Buffer_Offset, (size_t)Element_Size);
-        Stream[TrackNumber].ContentCompSettings_Buffer_Size=(size_t)Element_Size;
+        stream& streamItem = Stream[TrackNumber];
+        streamItem.ContentCompSettings_Buffer=new int8u[(size_t)Element_Size];
+        std::memcpy(streamItem.ContentCompSettings_Buffer, Buffer+Buffer_Offset, (size_t)Element_Size);
+        streamItem.ContentCompSettings_Buffer_Size=(size_t)Element_Size;
     FILLING_END();
 }
 
@@ -3201,7 +3213,6 @@ void File_Mk::Segment_Tracks_TrackEntry_CodecPrivate()
         Skip_XX(Element_Size,                                   "Data (not parsed)");  
         return; //First element has the priority
     }
-
     if (TrackNumber==(int64u)-1 || TrackType==(int64u)-1 || Retrieve(Stream[TrackNumber].StreamKind, Stream[TrackNumber].StreamPos, "CodecID").empty())
     {
         //Codec not already known, saving CodecPrivate
@@ -3220,11 +3231,12 @@ void File_Mk::Segment_Tracks_TrackEntry_CodecPrivate()
 void File_Mk::Segment_Tracks_TrackEntry_CodecPrivate__Parse()
 {
     //Creating the parser
-    if (Stream[TrackNumber].Parser==NULL)
+    stream& streamItem = Stream[TrackNumber];
+    if (streamItem.Parser==NULL)
     {
-        if (Stream[TrackNumber].StreamKind==Stream_Audio && Retrieve(Stream_Audio, Stream[TrackNumber].StreamPos, Audio_CodecID)==__T("A_MS/ACM"))
+        if (streamItem.StreamKind==Stream_Audio && Retrieve(Stream_Audio, streamItem.StreamPos, Audio_CodecID)==__T("A_MS/ACM"))
             Segment_Tracks_TrackEntry_CodecPrivate_auds();
-        else if (Stream[TrackNumber].StreamKind==Stream_Video && Retrieve(Stream_Video, Stream[TrackNumber].StreamPos, Video_CodecID)==__T("V_MS/VFW/FOURCC"))
+        else if (streamItem.StreamKind==Stream_Video && Retrieve(Stream_Video, streamItem.StreamPos, Video_CodecID)==__T("V_MS/VFW/FOURCC"))
             Segment_Tracks_TrackEntry_CodecPrivate_vids();
         else if (Element_Size>0)
             Skip_XX(Element_Size,                 "Unknown");
@@ -3256,12 +3268,12 @@ void File_Mk::Segment_Tracks_TrackEntry_CodecPrivate__Parse()
     #endif // MEDIAINFO_DEMUX
 
     //Parsing
-    Open_Buffer_Continue(Stream[TrackNumber].Parser);
+    Open_Buffer_Continue(streamItem.Parser);
 
     //Filling
-    if (Stream[TrackNumber].Parser->Status[IsFinished]) //Can be finnished here...
+    if (streamItem.Parser->Status[IsFinished]) //Can be finnished here...
     {
-        Stream[TrackNumber].Searching_Payload=false;
+        streamItem.Searching_Payload=false;
         Stream_Count--;
     }
 
@@ -3442,17 +3454,18 @@ void File_Mk::Segment_Tracks_TrackEntry_CodecPrivate_vids()
     if (Data_Remain())
     {
         Element_Begin1("Private data");
-        if (Stream[TrackNumber].Parser)
+        stream& streamItem = Stream[TrackNumber];
+        if (streamItem.Parser)
         {
             #if defined(MEDIAINFO_FFV1_YES)
                 if (Compression==0x46465631) //FFV1
-                    Open_Buffer_OutOfBand(Stream[TrackNumber].Parser);
+                    Open_Buffer_OutOfBand(streamItem.Parser);
             #endif
             #if defined(MEDIAINFO_FFV1_YES)
                 if (Compression==0x46465648) //FFVH
                 {
-                    ((File_HuffYuv*)Stream[TrackNumber].Parser)->IsOutOfBandData=true; //TODO: implement ISOutOfBandData in a generic maner
-                    Open_Buffer_Continue(Stream[TrackNumber].Parser);
+                    ((File_HuffYuv*)streamItem.Parser)->IsOutOfBandData=true; //TODO: implement ISOutOfBandData in a generic maner
+                    Open_Buffer_Continue(streamItem.Parser);
                     Element_Offset=Element_Size;
                 }
             #endif
@@ -3597,15 +3610,16 @@ void File_Mk::Segment_Tracks_TrackEntry_TrackNumber()
         if (Segment_Info_Count>1)
             return; //First element has the priority
         Fill(StreamKind_Last, StreamPos_Last, General_ID, TrackNumber);
+        stream& streamItem = Stream[TrackNumber];
         if (StreamKind_Last!=Stream_Max)
         {
-            Stream[TrackNumber].StreamKind=StreamKind_Last;
-            Stream[TrackNumber].StreamPos=StreamPos_Last;
+            streamItem.StreamKind=StreamKind_Last;
+            streamItem.StreamPos=StreamPos_Last;
         }
         if (TrackVideoDisplayWidth && TrackVideoDisplayHeight)
-            Stream[TrackNumber].DisplayAspectRatio=((float)TrackVideoDisplayWidth)/(float)TrackVideoDisplayHeight;
+            streamItem.DisplayAspectRatio=((float)TrackVideoDisplayWidth)/(float)TrackVideoDisplayHeight;
         if (AvgBytesPerSec)
-            Stream[TrackNumber].AvgBytesPerSec=AvgBytesPerSec;
+            streamItem.AvgBytesPerSec=AvgBytesPerSec;
 
         CodecID_Manage();
         CodecPrivate_Manage();
@@ -3657,8 +3671,9 @@ void File_Mk::Segment_Tracks_TrackEntry_TrackType()
 
         if (TrackNumber!=(int64u)-1 && StreamKind_Last!=Stream_Max)
         {
-            Stream[TrackNumber].StreamKind=StreamKind_Last;
-            Stream[TrackNumber].StreamPos=StreamPos_Last;
+            stream& streamItem = Stream[TrackNumber];
+            streamItem.StreamKind=StreamKind_Last;
+            streamItem.StreamPos=StreamPos_Last;
         }
 
         CodecID_Manage();
@@ -4264,6 +4279,7 @@ void File_Mk::CodecID_Manage()
         CodecID_Fill(CodecID, StreamKind_Last, StreamPos_Last, InfoCodecID_Format_Matroska);
         Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Codec), CodecID);
     }
+    stream& streamItem = Stream[TrackNumber];
 
     //Creating the parser
     #if defined(MEDIAINFO_MPEG4V_YES) || defined(MEDIAINFO_AVC_YES) || defined(MEDIAINFO_HEVC_YES) || defined(MEDIAINFO_VC1_YES) || defined(MEDIAINFO_DIRAC_YES) || defined(MEDIAINFO_MPEGV_YES) || defined(MEDIAINFO_VP8_YES) || defined(MEDIAINFO_OGG_YES) || defined(MEDIAINFO_DTS_YES)
@@ -4273,39 +4289,41 @@ void File_Mk::CodecID_Manage()
     #if defined(MEDIAINFO_MPEG4V_YES)
     else if (Format==__T("MPEG-4 Visual"))
     {
-        Stream[TrackNumber].Parser=new File_Mpeg4v;
-        ((File_Mpeg4v*)Stream[TrackNumber].Parser)->FrameIsAlwaysComplete=true;
+        streamItem.Parser=new File_Mpeg4v;
+        ((File_Mpeg4v*)streamItem.Parser)->FrameIsAlwaysComplete=true;
     }
     #endif
     #if defined(MEDIAINFO_AVC_YES)
     else if (Format==__T("AVC"))
     {
-        Stream[TrackNumber].Parser=new File_Avc;
-        ((File_Avc*)Stream[TrackNumber].Parser)->FrameIsAlwaysComplete=true;
+        File_Avc* parser = new File_Avc;
+        streamItem.Parser= parser;
+        ((File_Avc*)streamItem.Parser)->FrameIsAlwaysComplete=true;
         if (InfoCodecID_Format_Type==InfoCodecID_Format_Matroska)
         {
-            ((File_Avc*)Stream[TrackNumber].Parser)->MustSynchronize=false;
-            ((File_Avc*)Stream[TrackNumber].Parser)->MustParse_SPS_PPS=true;
-            ((File_Avc*)Stream[TrackNumber].Parser)->SizedBlocks=true;
+            parser->MustSynchronize=false;
+            parser->MustParse_SPS_PPS=true;
+            parser->SizedBlocks=true;
         }
     }
     #endif
     #if defined(MEDIAINFO_HEVC_YES)
     else if (Format==__T("HEVC"))
     {
-        Stream[TrackNumber].Parser=new File_Hevc;
-        ((File_Hevc*)Stream[TrackNumber].Parser)->FrameIsAlwaysComplete=true;
+        File_Hevc* parser = new File_Hevc;
+        streamItem.Parser = parser;
+        parser->FrameIsAlwaysComplete=true;
         if (InfoCodecID_Format_Type==InfoCodecID_Format_Matroska)
         {
-            ((File_Hevc*)Stream[TrackNumber].Parser)->MustSynchronize=false;
-            ((File_Hevc*)Stream[TrackNumber].Parser)->MustParse_VPS_SPS_PPS=true;
-            ((File_Hevc*)Stream[TrackNumber].Parser)->MustParse_VPS_SPS_PPS_FromMatroska=true;
-            ((File_Hevc*)Stream[TrackNumber].Parser)->SizedBlocks=true;
+            parser->MustSynchronize=false;
+            parser->MustParse_VPS_SPS_PPS=true;
+            parser->MustParse_VPS_SPS_PPS_FromMatroska=true;
+            parser->SizedBlocks=true;
             #if MEDIAINFO_DEMUX
                 if (Config->Demux_Hevc_Transcode_Iso14496_15_to_AnnexB_Get())
                 {
-                    Stream[TrackNumber].Parser->Demux_Level=2; //Container
-                    Stream[TrackNumber].Parser->Demux_UnpacketizeContainer=true;
+                    streamItem.Parser->Demux_Level=2; //Container
+                    streamItem.Parser->Demux_UnpacketizeContainer=true;
                 }
             #endif //MEDIAINFO_DEMUX
         }
@@ -4314,81 +4332,87 @@ void File_Mk::CodecID_Manage()
     #if defined(MEDIAINFO_FFV1_YES)
     else if (Format==__T("FFV1"))
     {
-        Stream[TrackNumber].Parser=new File_Ffv1;
-        ((File_Ffv1*)Stream[TrackNumber].Parser)->Width=Retrieve(Stream_Video, StreamPos_Last, Video_Width).To_int32u();
-        ((File_Ffv1*)Stream[TrackNumber].Parser)->Height=Retrieve(Stream_Video, StreamPos_Last, Video_Height).To_int32u();
+        File_Ffv1* parser = new File_Ffv1;
+        streamItem.Parser = parser;
+        parser->Width=Retrieve(Stream_Video, StreamPos_Last, Video_Width).To_int32u();
+        parser->Height=Retrieve(Stream_Video, StreamPos_Last, Video_Height).To_int32u();
     }
     #endif
     #if defined(MEDIAINFO_HUFFYUV_YES)
     else if (Format==__T("HuffYUV"))
     {
-        Stream[TrackNumber].Parser=new File_HuffYuv;
+        streamItem.Parser=new File_HuffYuv;
     }
     #endif
     #if defined(MEDIAINFO_VC1_YES)
     else if (Format==__T("VC-1"))
     {
-        Stream[TrackNumber].Parser=new File_Vc1;
-        ((File_Vc1*)Stream[TrackNumber].Parser)->FrameIsAlwaysComplete=true;
+        File_Vc1* parser = new File_Vc1;
+        streamItem.Parser= parser;
+        parser->FrameIsAlwaysComplete=true;
     }
     #endif
     #if defined(MEDIAINFO_DIRAC_YES)
     else if (Format==__T("Dirac"))
     {
-        Stream[TrackNumber].Parser=new File_Dirac;
+        streamItem.Parser=new File_Dirac;
     }
     #endif
     #if defined(MEDIAINFO_MPEGV_YES)
     else if (Format==__T("MPEG Video"))
     {
-        Stream[TrackNumber].Parser=new File_Mpegv;
-        ((File_Mpegv*)Stream[TrackNumber].Parser)->FrameIsAlwaysComplete=true;
+        File_Mpegv* parser = new File_Mpegv;
+        streamItem.Parser = parser;
+        parser->FrameIsAlwaysComplete=true;
     }
     #endif
     #if defined(MEDIAINFO_PRORES_YES)
     else if (Format==__T("ProRes"))
     {
-        Stream[TrackNumber].Parser=new File_ProRes;
+        streamItem.Parser=new File_ProRes;
     }
     #endif
     #if defined(MEDIAINFO_VP8_YES)
     else if (Format==__T("VP8"))
     {
-        Stream[TrackNumber].Parser=new File_Vp8;
+        streamItem.Parser=new File_Vp8;
     }
     #endif
     #if defined(MEDIAINFO_OGG_YES)
     else if (Format==__T("Theora")  || Format==__T("Vorbis"))
     {
-        Stream[TrackNumber].Parser=new File_Ogg;
-        Stream[TrackNumber].Parser->MustSynchronize=false;
-        ((File_Ogg*)Stream[TrackNumber].Parser)->XiphLacing=true;
+        File_Ogg* parser = new File_Ogg;
+        streamItem.Parser = parser;
+        streamItem.Parser->MustSynchronize=false;
+        parser->XiphLacing=true;
     }
     #endif
     #if defined(MEDIAINFO_RM_YES)
     else if (CodecID.find(__T("V_REAL/"))==0)
     {
-        Stream[TrackNumber].Parser=new File_Rm;
-        ((File_Rm*)Stream[TrackNumber].Parser)->FromMKV_StreamType=Stream_Video;
+        File_Rm* parser = new File_Rm;
+        streamItem.Parser = parser;
+        parser->FromMKV_StreamType=Stream_Video;
     }
     #endif
     #if defined(MEDIAINFO_AC3_YES)
     else if (Format==__T("AC-3") || Format==__T("E-AC-3") || Format==__T("TrueHD"))
     {
-        Stream[TrackNumber].Parser=new File_Ac3;
+        streamItem.Parser=new File_Ac3;
     }
     #endif
     #if defined(MEDIAINFO_DTS_YES)
     else if (Format==__T("DTS"))
     {
-        Stream[TrackNumber].Parser=new File_Dts;
+        streamItem.Parser=new File_Dts;
     }
     #endif
     #if defined(MEDIAINFO_AAC_YES)
     else if (CodecID==(__T("A_AAC")))
     {
-        Stream[TrackNumber].Parser=new File_Aac;
-        ((File_Aac*)Stream[TrackNumber].Parser)->Mode=File_Aac::Mode_AudioSpecificConfig;
+        File_Aac* parser = new File_Aac;
+        streamItem.Parser = parser;
+        parser->Mode=File_Aac::Mode_AudioSpecificConfig;
     }
     #endif
     #if defined(MEDIAINFO_AAC_YES)
@@ -4418,65 +4442,70 @@ void File_Mk::CodecID_Manage()
             Fill(Stream_Audio, StreamPos_Last, Audio_Format_Settings_PS, PS?"Yes":"No");
         int64s sampling_frequency=Retrieve(Stream_Audio, StreamPos_Last, Audio_SamplingRate).To_int64s();
 
-        Stream[TrackNumber].Parser=new File_Aac;
-        ((File_Aac*)Stream[TrackNumber].Parser)->Mode=File_Aac::Mode_AudioSpecificConfig;
-        ((File_Aac*)Stream[TrackNumber].Parser)->AudioSpecificConfig_OutOfBand(sampling_frequency, audioObjectType, SBR==1?true:false, PS==1?true:false, SBR==1?true:false, PS==1?true:false);
+        File_Aac* parser = new File_Aac;
+        streamItem.Parser = parser;
+        parser->Mode=File_Aac::Mode_AudioSpecificConfig;
+        parser->AudioSpecificConfig_OutOfBand(sampling_frequency, audioObjectType, SBR==1?true:false, PS==1?true:false, SBR==1?true:false, PS==1?true:false);
     }
     #endif
     #if defined(MEDIAINFO_AAC_YES)
     else if (Format==(__T("AAC")))
     {
-        Stream[TrackNumber].Parser=new File_Aac;
-        ((File_Aac*)Stream[TrackNumber].Parser)->Mode=File_Aac::Mode_ADTS;
+        File_Aac* parser = new File_Aac;
+        streamItem.Parser = parser;
+        parser->Mode=File_Aac::Mode_ADTS;
     }
     #endif
     #if defined(MEDIAINFO_MPEGA_YES)
     else if (Format==__T("MPEG Audio"))
     {
-        Stream[TrackNumber].Parser=new File_Mpega;
+        streamItem.Parser=new File_Mpega;
     }
     #endif
     #if defined(MEDIAINFO_FLAC_YES)
     else if (Format==__T("Flac"))
     {
-        Stream[TrackNumber].Parser=new File_Flac;
+        streamItem.Parser=new File_Flac;
     }
     #endif
     #if defined(MEDIAINFO_OPUS_YES)
     else if (CodecID.find(__T("A_OPUS"))==0) //http://wiki.xiph.org/MatroskaOpus
     {
-        Stream[TrackNumber].Parser=new File_Opus;
+        streamItem.Parser=new File_Opus;
     }
     #endif
     #if defined(MEDIAINFO_WVPK_YES)
     else if (Format==__T("WavPack"))
     {
-        Stream[TrackNumber].Parser=new File_Wvpk;
-        ((File_Wvpk*)Stream[TrackNumber].Parser)->FromMKV=true;
+        File_Wvpk* parser = new File_Wvpk;
+        streamItem.Parser = parser;
+        parser->FromMKV=true;
     }
     #endif
     #if defined(MEDIAINFO_TTA_YES)
     else if (Format==__T("TTA"))
     {
-        //Stream[TrackNumber].Parser=new File_Tta; //Parser is not needed, because header is useless and dropped (the parser analyses only the header)
+        //streamItem.Parser=new File_Tta; //Parser is not needed, because header is useless and dropped (the parser analyses only the header)
     }
     #endif
     #if defined(MEDIAINFO_PCM_YES)
     else if (Format==__T("PCM"))
     {
-        Stream[TrackNumber].Parser=new File_Pcm;
-        ((File_Pcm*)Stream[TrackNumber].Parser)->Codec=CodecID;
+        File_Pcm* parser = new File_Pcm;
+        streamItem.Parser = parser;
+        parser->Codec=CodecID;
     }
     #endif
     #if defined(MEDIAINFO_RM_YES)
     else if (CodecID.find(__T("A_REAL/"))==0)
     {
-        Stream[TrackNumber].Parser=new File_Rm;
-        ((File_Rm*)Stream[TrackNumber].Parser)->FromMKV_StreamType=Stream_Audio;
+        File_Rm* parser = new File_Rm;
+        streamItem.Parser = parser;
+        parser->FromMKV_StreamType=Stream_Audio;
     }
     #endif
     Element_Code=TrackNumber;
-    Open_Buffer_Init(Stream[TrackNumber].Parser);
+    Open_Buffer_Init(streamItem.Parser);
 
     CodecID.clear();
 }
diff --git a/Source/MediaInfo/Multiple/File_Mpeg4.cpp b/Source/MediaInfo/Multiple/File_Mpeg4.cpp
index 80d59ff..6dbdbfd 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg4.cpp
+++ b/Source/MediaInfo/Multiple/File_Mpeg4.cpp
@@ -2647,9 +2647,9 @@ void File_Mpeg4::IsParsing_mdat_Set()
             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;
+            Parser->NumberOfFrames = tc->NumberOfFrames;
+            Parser->DropFrame = tc->DropFrame;
+            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'),
diff --git a/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp b/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp
index 54178ad..1e0e5a2 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp
+++ b/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp
@@ -4004,9 +4004,9 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_tmcd()
         Open_Buffer_Init(Parser);
         mdat_Pos_ToParseInPriority_StreamIDs.push_back(moov_trak_tkhd_TrackID);
         Streams[moov_trak_tkhd_TrackID].IsPriorityStream=true;
-        ((File_Mpeg4_TimeCode*)Parser)->NumberOfFrames=NumberOfFrames; //tc->FrameDuration?(((float64)tc->TimeScale)/tc->FrameDuration):0;
-        ((File_Mpeg4_TimeCode*)Parser)->DropFrame=tc->DropFrame;
-        ((File_Mpeg4_TimeCode*)Parser)->NegativeTimes=tc->NegativeTimes;
+        Parser->NumberOfFrames=NumberOfFrames; //tc->FrameDuration?(((float64)tc->TimeScale)/tc->FrameDuration):0;
+        Parser->DropFrame=tc->DropFrame;
+        Parser->NegativeTimes=tc->NegativeTimes;
         Streams[moov_trak_tkhd_TrackID].Parsers.push_back(Parser);
         mdat_MustParse=true; //Data is in MDAT
     FILLING_ELSE();
@@ -4372,7 +4372,8 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxxSound()
             #endif // MEDIAINFO_DEMUX
 
             //Creating the parser
-            if ((Channels==1 && (StreamPos_Last%2)==0)
+            #if defined(MEDIAINFO_SMPTEST0337_YES)
+                if ((Channels==1 && (StreamPos_Last%2)==0)
              || (Streams.find(moov_trak_tkhd_TrackID-1)!=Streams.end() && Streams[moov_trak_tkhd_TrackID-1].IsPcmMono))
             {
                 File_ChannelGrouping* Parser=new File_ChannelGrouping;
@@ -4394,7 +4395,7 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxxSound()
 
                 Streams[moov_trak_tkhd_TrackID].Parsers.push_back(Parser);
             }
-
+            #endif // MEDIAINFO_SMPTEST0337_YES
             //Specific cases
             #if defined(MEDIAINFO_SMPTEST0337_YES)
             if (Channels==2 && SampleSize<=32 && SampleRate==48000) //Some SMPTE ST 337 streams are hidden in PCM stream
@@ -5988,7 +5989,9 @@ void File_Mpeg4::moov_trak_mdia_minf_stbl_stsd_xxxx_wave_enda()
                     ((File_Pcm*)Streams[moov_trak_tkhd_TrackID].Parsers[0])->Endianness=Endianness?'L':'B';
                 if (Streams[moov_trak_tkhd_TrackID].Parsers.size()==2)
                 {
+#if defined(MEDIAINFO_SMPTEST0337_YES)
                     ((File_ChannelGrouping*)Streams[moov_trak_tkhd_TrackID].Parsers[0])->Endianness=Endianness?'L':'B';
+#endif // MEDIAINFO_SMPTEST0337_YES
                     ((File_Pcm*)Streams[moov_trak_tkhd_TrackID].Parsers[1])->Endianness=Endianness?'L':'B';
                 }
             }
diff --git a/Source/MediaInfo/Multiple/File_MpegTs_Duplicate.cpp b/Source/MediaInfo/Multiple/File_MpegTs_Duplicate.cpp
index 5781899..dcdb09f 100644
--- a/Source/MediaInfo/Multiple/File_MpegTs_Duplicate.cpp
+++ b/Source/MediaInfo/Multiple/File_MpegTs_Duplicate.cpp
@@ -80,16 +80,16 @@ void File_MpegTs::Option_Manage()
                 Complete_Stream->Streams[0x0000]->ShouldDuplicate=true;
 
                 //For each program
-                for (complete_stream::transport_stream::programs::iterator Program=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs.begin(); Program!=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs.end(); ++Program)
+                const complete_stream::transport_stream& transportItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id];
+                for (complete_stream::transport_stream::programs::const_iterator Program= transportItem.Programs.begin(); Program!= transportItem.Programs.end(); ++Program)
                 {
                     //Do we want this program?
                     bool Wanted=false;
-                    for (std::map<const String, File__Duplicate_MpegTs*>::iterator Duplicate=Complete_Stream->Duplicates.begin(); Duplicate!=Complete_Stream->Duplicates.end(); ++Duplicate)
+                    for (std::map<const String, File__Duplicate_MpegTs*>::const_iterator Duplicate=Complete_Stream->Duplicates.begin(); Duplicate!=Complete_Stream->Duplicates.end(); ++Duplicate)
                     {
-                        if (Duplicate->second->Wanted_program_numbers.find(Program->first)!=Duplicate->second->Wanted_program_numbers.end())
-                            Wanted=true;
-                        if (Duplicate->second->Wanted_program_map_PIDs.find(Program->second.pid)!=Duplicate->second->Wanted_program_map_PIDs.end())
-                            Wanted=true;
+                        Wanted = Duplicate->second->Is_Wanted(Program->first, Program->second.pid);
+                        if (Wanted)
+                            break;
                     }
 
                     //Enabling it if wanted
diff --git a/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.cpp b/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.cpp
index a0431d3..a771ccd 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.cpp
+++ b/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.cpp
@@ -1635,13 +1635,14 @@ void File_Mpeg_Descriptors::Descriptor_05()
                         {
                             //Per PES
                             Complete_Stream->Streams[elementary_PID]->registration_format_identifier=format_identifier;
-                            Complete_Stream->Streams[elementary_PID]->Infos["format_identifier"]=Ztring().From_CC4(format_identifier);
-                            if (Complete_Stream->Streams[elementary_PID]->Infos["format_identifier"].size()!=4)
+                            Ztring& infosItem = Complete_Stream->Streams[elementary_PID]->Infos["format_identifier"];
+                            infosItem =Ztring().From_CC4(format_identifier);
+                            if (infosItem.size()!=4)
                             {
                                 Ztring Temp; Temp.From_Number(format_identifier, 16);
                                 if (Temp.size()<8)
                                     Temp.insert(0, 8-Temp.size(), __T('0'));
-                                Complete_Stream->Streams[elementary_PID]->Infos["format_identifier"]=__T("0x")+Temp;
+                                infosItem =__T("0x")+Temp;
                             }
                             Complete_Stream->Streams[elementary_PID]->Infos_Option["format_identifier"]=__T("N NT");
                             if (format_identifier==Elements::KLVA)
@@ -1906,7 +1907,8 @@ void File_Mpeg_Descriptors::Descriptor_1D()
     Get_B1 (IOD_label,                                          "IOD_label");
 
     #ifdef MEDIAINFO_MPEG4_YES
-        if (Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].IOD_ESs.find(IOD_label)==Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].IOD_ESs.end())
+        complete_stream::transport_stream & transportStream =  Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id];
+        if (transportStream.IOD_ESs.find(IOD_label)== transportStream.IOD_ESs.end())
         {
             File_Mpeg4_Descriptors MI;
             MI.Parser_DoNotFreeIt=true;
@@ -1914,8 +1916,8 @@ void File_Mpeg_Descriptors::Descriptor_1D()
             Open_Buffer_Init(&MI);
             Open_Buffer_Continue(&MI);
             Finish(&MI);
-            Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].IOD_ESs[MI.ES_ID].Parser=MI.Parser;
-            Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].IOD_ESs[MI.ES_ID].SLConfig=MI.SLConfig;
+            transportStream.IOD_ESs[MI.ES_ID].Parser=MI.Parser;
+            transportStream.IOD_ESs[MI.ES_ID].SLConfig=MI.SLConfig;
         }
     #else
         Skip_XX(Element_Size-Element_Offset,                    "MPEG-4 Descriptor");
@@ -2080,8 +2082,9 @@ void File_Mpeg_Descriptors::Descriptor_43()
     BS_End();
 
     FILLING_BEGIN();
-        Complete_Stream->Transport_Streams[transport_stream_id].Infos["Frequency"]=Frequency_DVB__BCD(frequency);
-        Complete_Stream->Transport_Streams[transport_stream_id].Infos["OrbitalPosition"]=OrbitalPosition_DVB__BCD(orbital_position)+(west_east_flag?__T('E'):__T('W'));
+        complete_stream::transport_stream& transportStream = Complete_Stream->Transport_Streams[transport_stream_id];
+        transportStream.Infos["Frequency"]=Frequency_DVB__BCD(frequency);
+        transportStream.Infos["OrbitalPosition"]=OrbitalPosition_DVB__BCD(orbital_position)+(west_east_flag?__T('E'):__T('W'));
     FILLING_END();
 }
 
@@ -2101,9 +2104,10 @@ void File_Mpeg_Descriptors::Descriptor_48()
     FILLING_BEGIN();
         if (program_number_IsValid)
         {
-            Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].Infos["ServiceName"]=service_name;
-            Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].Infos["ServiceProvider"]=service_provider_name;
-            Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number].Infos["ServiceType"]=Mpeg_Descriptors_dvb_service_type(service_type);
+            complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[table_id_extension].Programs[program_number];
+            progItem.Infos["ServiceName"]=service_name;
+            progItem.Infos["ServiceProvider"]=service_provider_name;
+            progItem.Infos["ServiceType"]=Mpeg_Descriptors_dvb_service_type(service_type);
         }
     FILLING_END();
 }
@@ -2141,9 +2145,11 @@ void File_Mpeg_Descriptors::Descriptor_4D()
             {
                 Ztring ISO_639_2; ISO_639_2.From_CC3(ISO_639_language_code);
                 const Ztring& ISO_639_1=MediaInfoLib::Config.Iso639_1_Get(ISO_639_2);
-                Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].short_event.event_name=(ISO_639_1.empty()?ISO_639_2:ISO_639_1)+__T(':')+event_name;
-                Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].short_event.text=(ISO_639_1.empty()?ISO_639_2:ISO_639_1)+__T(':')+text;
-                Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks_IsUpdated=true;
+                complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension];
+                complete_stream::transport_stream::program::dvb_epg_block::event& eventItem = progItem.DVB_EPG_Blocks[table_id].Events[event_id];
+                eventItem.short_event.event_name=(ISO_639_1.empty()?ISO_639_2:ISO_639_1)+__T(':')+event_name;
+                eventItem.short_event.text=(ISO_639_1.empty()?ISO_639_2:ISO_639_1)+__T(':')+text;
+                progItem.DVB_EPG_Blocks_IsUpdated=true;
                 Complete_Stream->Programs_IsUpdated=true;
             }
         }
@@ -2205,8 +2211,9 @@ void File_Mpeg_Descriptors::Descriptor_54()
         FILLING_BEGIN();
             if (event_id_IsValid)
             {
-                Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].content=Ztring().From_UTF8(Mpeg_Descriptors_content_nibble_level_2(content_nibble_level_1, content_nibble_level_2))+__T(", ");
-                Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks_IsUpdated=true;
+                complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension];
+                progItem.DVB_EPG_Blocks[table_id].Events[event_id].content=Ztring().From_UTF8(Mpeg_Descriptors_content_nibble_level_2(content_nibble_level_1, content_nibble_level_2))+__T(", ");
+                progItem.DVB_EPG_Blocks_IsUpdated=true;
                 Complete_Stream->Programs_IsUpdated=true;
             }
         FILLING_END();
@@ -2215,10 +2222,12 @@ void File_Mpeg_Descriptors::Descriptor_54()
     FILLING_BEGIN();
         if (event_id_IsValid)
         {
-            if (!Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].content.empty())
+            complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension];
+            complete_stream::transport_stream::program::dvb_epg_block::event& eventItem = progItem.DVB_EPG_Blocks[table_id].Events[event_id];
+            if (!eventItem.content.empty())
             {
-                Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].content.resize(Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].content.size()-2);
-                Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks_IsUpdated=true;
+                eventItem.content.resize(Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].content.size()-2);
+                progItem.DVB_EPG_Blocks_IsUpdated=true;
                 Complete_Stream->Programs_IsUpdated=true;
             }
         }
diff --git a/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.h b/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.h
index cc05099..f3c41b8 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.h
+++ b/Source/MediaInfo/Multiple/File_Mpeg_Descriptors.h
@@ -605,7 +605,7 @@ struct complete_stream
     std::vector<File__Duplicate_MpegTs*>                Duplicates_Speed;
     std::vector<std::vector<File__Duplicate_MpegTs*> >  Duplicates_Speed_FromPID;
     std::map<const String, File__Duplicate_MpegTs*>     Duplicates;
-    bool File__Duplicate_Get_From_PID (int16u pid)
+    bool File__Duplicate_Get_From_PID (int16u pid) const
     {
         if (Duplicates_Speed_FromPID.empty())
             return false;
diff --git a/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp b/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp
index 98720f7..47eeb79 100644
--- a/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp
+++ b/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp
@@ -1111,10 +1111,10 @@ void File_Mpeg_Psi::Table_00()
         Complete_Stream->transport_stream_id=table_id_extension;
         Complete_Stream->transport_stream_id_IsValid=true;
     }
-
-    if (Complete_Stream->Transport_Streams[table_id_extension].Programs_NotParsedCount==(size_t)-1)
-        Complete_Stream->Transport_Streams[table_id_extension].Programs_NotParsedCount=0;
-    Complete_Stream->Transport_Streams[table_id_extension].programs_List.clear();
+    complete_stream::transport_stream& transportStream = Complete_Stream->Transport_Streams[table_id_extension];
+    if (transportStream.Programs_NotParsedCount==(size_t)-1)
+        transportStream.Programs_NotParsedCount=0;
+    transportStream.programs_List.clear();
 
     //Saving previous status
     std::map<int16u, complete_stream::transport_stream::program> program_numbers_Previous=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs;
@@ -1186,14 +1186,16 @@ void File_Mpeg_Psi::Table_01()
 void File_Mpeg_Psi::Table_02()
 {
     //Informing PSI is parsed
-    if (!Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension].IsParsed && Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs_NotParsedCount)
+    complete_stream::transport_stream& transportStream = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id];
+    complete_stream::transport_stream::program& progItem = transportStream.Programs[table_id_extension];
+    if (!progItem.IsParsed && transportStream.Programs_NotParsedCount)
     {
-        Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs_NotParsedCount--;
-        Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension].IsParsed=true;
+        transportStream.Programs_NotParsedCount--;
+        progItem.IsParsed=true;
     }
 
     //Saving previous status
-    std::vector<int16u> elementary_PIDs_Previous=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension].elementary_PIDs;
+    std::vector<int16u> elementary_PIDs_Previous= progItem.elementary_PIDs;
 
     //Parsing
     int16u PCR_PID;
@@ -1269,9 +1271,10 @@ void File_Mpeg_Psi::Table_02()
                                 IsAlreadyPresent=true;
                         if (!IsAlreadyPresent)
                         {
-                            Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].elementary_PIDs.push_back(elementary_PID);
+                            complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
+                            progItem.elementary_PIDs.push_back(elementary_PID);
                             Complete_Stream->Streams[elementary_PID]->program_numbers.push_back(program_number);
-                            Complete_Stream->Streams[elementary_PID]->registration_format_identifier=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].registration_format_identifier;
+                            Complete_Stream->Streams[elementary_PID]->registration_format_identifier= progItem.registration_format_identifier;
                         }
                         if (Complete_Stream->Streams[elementary_PID]->Kind!=complete_stream::stream::pes)
                         {
@@ -1409,14 +1412,14 @@ void File_Mpeg_Psi::Table_02()
                 }
             #endif //MEDIAINFO_MPEGTS_ALLSTREAMS_YES
         }
-
+        complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
         if (Buffer_Offset>=4)
         {
-            Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].ExtraInfos_Content["pointer_field"].From_Number(Buffer_Offset-4);
-            Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].ExtraInfos_Option["pointer_field"]=__T("N NT");
+            progItem.ExtraInfos_Content["pointer_field"].From_Number(Buffer_Offset-4);
+            progItem.ExtraInfos_Option["pointer_field"]=__T("N NT");
         }
-        Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].ExtraInfos_Content["section_length"].From_Number(Element_Size+4);
-        Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].ExtraInfos_Option["section_length"]=__T("N NT");
+        progItem.ExtraInfos_Content["section_length"].From_Number(Element_Size+4);
+        progItem.ExtraInfos_Option["section_length"]=__T("N NT");
     FILLING_END();
 }
 
@@ -1529,8 +1532,9 @@ void File_Mpeg_Psi::Table_46()
 void File_Mpeg_Psi::Table_4E()
 {
     //Clearing
-    Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events.clear();
-    Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks_IsUpdated=true;
+    complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension];
+    progItem.DVB_EPG_Blocks[table_id].Events.clear();
+    progItem.DVB_EPG_Blocks_IsUpdated=true;
     Complete_Stream->Programs_IsUpdated=true;
 
     //Parsing
@@ -1569,10 +1573,12 @@ void File_Mpeg_Psi::Table_4E()
         Element_End1(Ztring::ToZtring_From_CC2(event_id));
 
         FILLING_BEGIN();
-            Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].start_time=__T("UTC ")+Date_MJD(date)+__T(" ")+Time_BCD(time);
-            Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].duration=Time_BCD(duration);
+            complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension];
+            complete_stream::transport_stream::program::dvb_epg_block::event& eventItem = progItem.DVB_EPG_Blocks[table_id].Events[event_id];
+            eventItem.start_time=__T("UTC ")+Date_MJD(date)+__T(" ")+Time_BCD(time);
+            eventItem.duration=Time_BCD(duration);
             if (running_status)
-                Complete_Stream->Transport_Streams[transport_stream_id].Programs[table_id_extension].DVB_EPG_Blocks[table_id].Events[event_id].running_status=Mpeg_Psi_running_status[running_status];
+                eventItem.running_status=Mpeg_Psi_running_status[running_status];
         FILLING_END();
     }
 }
@@ -2491,9 +2497,10 @@ void File_Mpeg_Psi::program_number_Update()
 void File_Mpeg_Psi::program_number_Remove()
 {
     //Removing this program_number from the list of program_numbers for each elementary_PID
-    for (size_t Pos=0; Pos<Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].elementary_PIDs.size(); Pos++)
+    complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
+    for (size_t Pos=0; Pos<progItem.elementary_PIDs.size(); Pos++)
     {
-        int16u elementary_PID_Temp=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].elementary_PIDs[Pos];
+        const int16u elementary_PID_Temp= progItem.elementary_PIDs[Pos];
 
         //Removing this program_number from the list of program_numbers for this elementary_PID
         for (size_t Pos=0; Pos<Complete_Stream->Streams[elementary_PID_Temp]->program_numbers.size(); Pos++)
@@ -2524,13 +2531,13 @@ void File_Mpeg_Psi::program_number_Remove()
     }
 
     //Removing program_number
-    size_t StreamPos=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].StreamPos;
+    size_t StreamPos= progItem.StreamPos;
     if (StreamPos!=(size_t)-1)
     {
         Complete_Stream->StreamPos_ToRemove[Stream_Menu].push_back(StreamPos);
-        Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].StreamPos=(size_t)-1;
+        progItem.StreamPos=(size_t)-1;
     }
-    int16u program_number_pid=Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].pid;
+    const int16u program_number_pid= progItem.pid;
     if (program_number_pid)
     {
         for (size_t Pos=0; Pos<Complete_Stream->Streams[program_number_pid]->program_numbers.size(); Pos++)
@@ -2566,16 +2573,17 @@ void File_Mpeg_Psi::elementary_PID_Update(int16u PCR_PID)
         if (Complete_Stream->Streams_NotParsedCount==(size_t)-1)
             Complete_Stream->Streams_NotParsedCount=0;
         Complete_Stream->Streams_NotParsedCount++;
-        if (stream_type==0x86 && Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension].registration_format_identifier==Elements::CUEI)
+        complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension];
+        if (stream_type==0x86 && progItem.registration_format_identifier==Elements::CUEI)
         {
-            Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension].HasNotDisplayableStreams=true;
+            progItem.HasNotDisplayableStreams=true;
             Complete_Stream->Streams[elementary_PID]->Kind=complete_stream::stream::psi;
             Complete_Stream->Streams[elementary_PID]->Table_IDs.resize(0x100);
             Complete_Stream->Streams[elementary_PID]->Table_IDs[0xFC]=new complete_stream::stream::table_id; //Splice
-            if (Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension].Scte35==NULL)
+            if (progItem.Scte35==NULL)
             {
-                Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension].Scte35=new complete_stream::transport_stream::program::scte35;
-                Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[table_id_extension].Scte35->pid=elementary_PID;
+                progItem.Scte35=new complete_stream::transport_stream::program::scte35;
+                progItem.Scte35->pid=elementary_PID;
             }
             #if MEDIAINFO_TRACE
                 Complete_Stream->Streams[elementary_PID]->Element_Info1="PSI";
@@ -2609,9 +2617,10 @@ void File_Mpeg_Psi::elementary_PID_Update(int16u PCR_PID)
             IsAlreadyPresent=true;
     if (!IsAlreadyPresent)
     {
-        Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].elementary_PIDs.push_back(elementary_PID);
+        complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
+        progItem.elementary_PIDs.push_back(elementary_PID);
         Complete_Stream->Streams[elementary_PID]->program_numbers.push_back(program_number);
-        if (ForceStreamDisplay || (Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].registration_format_identifier==Elements::HDMV && Complete_Stream->Streams[elementary_PID]->stream_type==0x90)) //Testing if forcing display of all streams or if it is a PGS from Blu-ray
+        if (ForceStreamDisplay || (progItem.registration_format_identifier==Elements::HDMV && Complete_Stream->Streams[elementary_PID]->stream_type==0x90)) //Testing if forcing display of all streams or if it is a PGS from Blu-ray
             Complete_Stream->PES_PIDs.insert(elementary_PID); //Adding it for sure
     }
 }
@@ -2620,9 +2629,10 @@ void File_Mpeg_Psi::elementary_PID_Update(int16u PCR_PID)
 void File_Mpeg_Psi::elementary_PID_Remove()
 {
     //Removing this elementary_PID from the list of elementary_PIDs for this program_number
-    for (size_t Pos=0; Pos<Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].elementary_PIDs.size(); Pos++)
-        if (Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].elementary_PIDs[Pos]==elementary_PID)
-            Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].elementary_PIDs.erase(Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number].elementary_PIDs.begin()+Pos);
+    complete_stream::transport_stream::program& progItem = Complete_Stream->Transport_Streams[Complete_Stream->transport_stream_id].Programs[program_number];
+    for (size_t Pos=0; Pos<progItem.elementary_PIDs.size(); Pos++)
+        if (progItem.elementary_PIDs[Pos]==elementary_PID)
+            progItem.elementary_PIDs.erase(progItem.elementary_PIDs.begin()+Pos);
 
     //Removing this program_number from the list of program_numbers for this elementary_PID
     for (size_t Pos=0; Pos<Complete_Stream->Streams[elementary_PID]->program_numbers.size(); Pos++)
diff --git a/Source/MediaInfo/Multiple/File_Mxf.cpp b/Source/MediaInfo/Multiple/File_Mxf.cpp
index 058e1a8..644a369 100644
--- a/Source/MediaInfo/Multiple/File_Mxf.cpp
+++ b/Source/MediaInfo/Multiple/File_Mxf.cpp
@@ -1035,7 +1035,7 @@ static const char* Mxf_EssenceCompression(const int128u EssenceCompression)
 }
 
 //---------------------------------------------------------------------------
-static const char* Mxf_EssenceCompression_Profile(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);
@@ -1089,7 +1089,7 @@ static const char* Mxf_EssenceCompression_Profile(const int128u EssenceCompressi
     }
 }
 //---------------------------------------------------------------------------
-static const char* Mxf_EssenceCompression_Version(const int128u EssenceCompression)
+static const char* Mxf_EssenceCompression_Version(const int128u& EssenceCompression)
 {
     int8u Code2=(int8u)((EssenceCompression.lo&0x00FF000000000000LL)>>48);
     int8u Code3=(int8u)((EssenceCompression.lo&0x0000FF0000000000LL)>>40);
@@ -1237,6 +1237,8 @@ static const char* Mxf_ColorPrimaries(const int128u ColorPrimaries)
         case 0x01 : return "BT.601 NTSC";
         case 0x02 : return "BT.470 System B";
         case 0x03 : return "BT.709";
+        case 0x04 : return "BT.2020";
+        case 0x06 : return "P3D65";
         default   : return "";
     }
 }
@@ -1254,6 +1256,9 @@ static const char* Mxf_TransferCharacteristic(const int128u TransferCharacterist
         case 0x05 : return "BT.1361 extended colour gamut system";
         case 0x06 : return "Linear";
         case 0x07 : return "SMPTE 428M";
+        case 0x08 : return "xvYCC";
+        case 0x09 : return "BT.2020";
+        case 0x0A : return "SMPTE ST 2084";
         default   : return "";
     }
 }
@@ -1267,6 +1272,7 @@ static const char* Mxf_CodingEquations(const int128u CodingEquations)
         case 0x01 : return "BT.601";
         case 0x02 : return "BT.709";
         case 0x03 : return "SMPTE 240M";
+        case 0x06 : return "BT.2020";
         default   : return "";
     }
 }
@@ -1319,7 +1325,7 @@ static const char* Mxf_ChannelAssignment_ChannelPositions(const int128u ChannelL
 }
 
 //---------------------------------------------------------------------------
-static 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)
@@ -1366,7 +1372,7 @@ static const char* Mxf_ChannelAssignment_ChannelPositions2(const int128u Channel
 }
 
 //---------------------------------------------------------------------------
-static 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)
@@ -2890,14 +2896,9 @@ void File_Mxf::Streams_Finish_Essence(int32u EssenceUID, int128u TrackUID)
 
     for (std::map<std::string, Ztring>::iterator Info=Essence->second.Infos.begin(); Info!=Essence->second.Infos.end(); ++Info)
         Fill(StreamKind_Last, StreamPos_Last, Info->first.c_str(), Info->second, true);
-    if (MxfTimeCodeForDelay.RoundedTimecodeBase && MxfTimeCodeForDelay.StartTimecode!=(int64u)-1)
+    if (MxfTimeCodeForDelay.IsInit())
     {
-        float64 TimeCode_StartTimecode_Temp=((float64)(MxfTimeCodeForDelay.StartTimecode+Config->File_IgnoreEditsBefore))/MxfTimeCodeForDelay.RoundedTimecodeBase;
-        if (MxfTimeCodeForDelay.DropFrame)
-        {
-            TimeCode_StartTimecode_Temp*=1001;
-            TimeCode_StartTimecode_Temp/=1000;
-        }
+        const float64 TimeCode_StartTimecode_Temp = MxfTimeCodeForDelay.Get_TimeCode_StartTimecode_Temp(Config->File_IgnoreEditsBefore);
         Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Delay), TimeCode_StartTimecode_Temp*1000, 0, true);
         Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Delay_Source), "Container");
         Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Delay_DropFrame), MxfTimeCodeForDelay.DropFrame?"Yes":"No");
@@ -3084,14 +3085,9 @@ void File_Mxf::Streams_Finish_Essence(int32u EssenceUID, int128u TrackUID)
                 Stream_Prepare(Stream_Audio);
                 size_t Pos=Count_Get(Stream_Audio)-1;
                 (*Parser)->Finish();
-                if (MxfTimeCodeForDelay.RoundedTimecodeBase && MxfTimeCodeForDelay.StartTimecode!=(int64u)-1)
+                if (MxfTimeCodeForDelay.IsInit())
                 {
-                    float64 TimeCode_StartTimecode_Temp=((float64)(MxfTimeCodeForDelay.StartTimecode+Config->File_IgnoreEditsBefore))/MxfTimeCodeForDelay.RoundedTimecodeBase;
-                    if (MxfTimeCodeForDelay.DropFrame)
-                    {
-                        TimeCode_StartTimecode_Temp*=1001;
-                        TimeCode_StartTimecode_Temp/=1000;
-                    }
+                    const float64 TimeCode_StartTimecode_Temp = MxfTimeCodeForDelay.Get_TimeCode_StartTimecode_Temp(Config->File_IgnoreEditsBefore);
                     Fill(Stream_Audio, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Delay), TimeCode_StartTimecode_Temp*1000, 0, true);
                     Fill(Stream_Audio, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Delay_Source), "Container");
                 }
@@ -3124,14 +3120,9 @@ void File_Mxf::Streams_Finish_Essence(int32u EssenceUID, int128u TrackUID)
             Fill_Flush();
             Stream_Prepare(Stream_Text);
             (*Parser)->Finish();
-            if (MxfTimeCodeForDelay.RoundedTimecodeBase && MxfTimeCodeForDelay.StartTimecode!=(int64u)-1)
+            if (MxfTimeCodeForDelay.IsInit())
             {
-                float64 TimeCode_StartTimecode_Temp=((float64)(MxfTimeCodeForDelay.StartTimecode+Config->File_IgnoreEditsBefore))/MxfTimeCodeForDelay.RoundedTimecodeBase;
-                if (MxfTimeCodeForDelay.DropFrame)
-                {
-                    TimeCode_StartTimecode_Temp*=1001;
-                    TimeCode_StartTimecode_Temp/=1000;
-                }
+                const float64 TimeCode_StartTimecode_Temp= MxfTimeCodeForDelay.Get_TimeCode_StartTimecode_Temp(Config->File_IgnoreEditsBefore);
                 Fill(Stream_Text, Parser_Text_Pos, Fill_Parameter(StreamKind_Last, Generic_Delay), TimeCode_StartTimecode_Temp*1000, 0, true);
                 Fill(Stream_Text, Parser_Text_Pos, Fill_Parameter(StreamKind_Last, Generic_Delay_Source), "Container");
             }
@@ -3492,7 +3483,7 @@ void File_Mxf::Streams_Finish_Descriptor(const int128u DescriptorUID, const int1
                 //Special case
                 if (Info->first=="BitRate" && Retrieve(StreamKind_Last, StreamPos_Last, General_ID).find(__T(" / "))!=string::npos)
                 {
-                    if (Retrieve(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_BitRate)).empty() || Retrieve(StreamKind_Last, StreamPos_Last, General_ID).find(__T("-"))!=string::npos)
+                    if (Retrieve(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_BitRate)).empty() || Retrieve(StreamKind_Last, StreamPos_Last, General_ID).find(__T('-'))!=string::npos)
                         Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_BitRate_Encoded), Info->second.To_int64u()*2, 10, true);
                     else
                         Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_BitRate), Info->second.To_int64u()*2, 10, true);
@@ -3851,7 +3842,7 @@ void File_Mxf::Streams_Finish_Component(const int128u ComponentUID, float64 Edit
             FrameCount-=File_IgnoreEditsBefore;
         }
         Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Duration), FrameCount*1000/EditRate, 0, true);
-        size_t ID_SubStreamInfo_Pos=Retrieve(StreamKind_Last, StreamPos_Last, General_ID).find(__T("-"));
+        size_t ID_SubStreamInfo_Pos=Retrieve(StreamKind_Last, StreamPos_Last, General_ID).find(__T('-'));
         if (ID_SubStreamInfo_Pos!=string::npos)
         {
             Ztring ID=Retrieve(StreamKind_Last, StreamPos_Last, General_ID);
@@ -3963,7 +3954,7 @@ void File_Mxf::Streams_Finish_Component_ForAS11(const int128u ComponentUID, floa
     int64u TC_Temp=0;
     int8u FrameRate_TempI;
     bool DropFrame_Temp;
-    if (MxfTimeCodeMaterial.RoundedTimecodeBase && MxfTimeCodeMaterial.StartTimecode!=(int64u)-1)
+    if (MxfTimeCodeMaterial.IsInit())
     {
         TC_Temp=MxfTimeCodeMaterial.StartTimecode;
         FrameRate_TempI=(int8u)MxfTimeCodeMaterial.RoundedTimecodeBase;
diff --git a/Source/MediaInfo/Multiple/File_Mxf.h b/Source/MediaInfo/Multiple/File_Mxf.h
index 806fbd7..ffca358 100644
--- a/Source/MediaInfo/Multiple/File_Mxf.h
+++ b/Source/MediaInfo/Multiple/File_Mxf.h
@@ -548,23 +548,35 @@ protected :
     //TimeCode
     struct mxftimecode
     {
-        int16u  RoundedTimecodeBase;
         int64u  StartTimecode;
+        int16u  RoundedTimecodeBase;
         bool    DropFrame;
 
-        mxftimecode()
-            : RoundedTimecodeBase(0)
-            , StartTimecode((int64u)-1)
-            , DropFrame(false)
-        {
-        }
-
-        mxftimecode(int16u RoundedTimecodeBase_, int64u StartTimecode_, bool DropFrame_)
+        mxftimecode(int16u RoundedTimecodeBase_ = 0, int64u StartTimecode_ = (int64u)-1, bool DropFrame_ = false)
             : RoundedTimecodeBase(RoundedTimecodeBase_)
             , StartTimecode(StartTimecode_)
             , DropFrame(DropFrame_)
         {
         }
+        bool IsInit() const
+        {
+            return RoundedTimecodeBase && StartTimecode != (int64u)-1;
+        }
+        float64 Get_TimeCode_StartTimecode_Temp(const int64u& File_IgnoreEditsBefore) const
+        {
+            if (RoundedTimecodeBase)
+            {
+                float64 TimeCode_StartTimecode_Temp = ((float64)(StartTimecode + File_IgnoreEditsBefore)) / RoundedTimecodeBase;
+                if (DropFrame)
+                {
+                    TimeCode_StartTimecode_Temp *= 1001;
+                    TimeCode_StartTimecode_Temp /= 1000;
+                }
+                return TimeCode_StartTimecode_Temp;
+            }
+            else
+                return 0.0;
+        }
     };
 
     // Temp
@@ -1058,6 +1070,7 @@ protected :
             CompletionDate=(int64u)-1;
             TextlessElementsExist=(int8u)-1;
             ProgrammeHasText=(int8u)-1;
+            FpaPass=(int8u)-1;
         }
 
         ~as11()
diff --git a/Source/MediaInfo/Multiple/File_Riff.h b/Source/MediaInfo/Multiple/File_Riff.h
index b73c543..3f75465 100644
--- a/Source/MediaInfo/Multiple/File_Riff.h
+++ b/Source/MediaInfo/Multiple/File_Riff.h
@@ -117,7 +117,7 @@ private :
     };
     std::map<int32u, stream> Stream;
     int32u                   Stream_ID;
-
+    void Open_Buffer_Init_All();
     struct stream_structure
     {
         int64u                  Name;
diff --git a/Source/MediaInfo/Multiple/File_Riff_Elements.cpp b/Source/MediaInfo/Multiple/File_Riff_Elements.cpp
index 4525e62..aa04013 100644
--- a/Source/MediaInfo/Multiple/File_Riff_Elements.cpp
+++ b/Source/MediaInfo/Multiple/File_Riff_Elements.cpp
@@ -722,6 +722,7 @@ void File_Riff::AIFF_COMM()
     }
     #endif
 
+    stream& StreamItem = Stream[Stream_ID];
     #if defined(MEDIAINFO_PCM_YES)
         File_Pcm* Parser=new File_Pcm;
         Parser->Codec=Retrieve(Stream_Audio, StreamPos_Last, Audio_CodecID);
@@ -740,9 +741,9 @@ void File_Riff::AIFF_COMM()
         #else //MEDIAINFO_DEMUX
             Parser->Frame_Count_Valid=(int64u)-1; //Disabling it, waiting for SMPTE ST 337 parser reject
         #endif //MEDIAINFO_DEMUX
-        Stream[Stream_ID].Parsers.push_back(Parser);
-        Stream[Stream_ID].IsPcm=true;
-        Stream[Stream_ID].StreamKind=Stream_Audio;
+        StreamItem.Parsers.push_back(Parser);
+        StreamItem.IsPcm=true;
+        StreamItem.StreamKind=Stream_Audio;
     #endif
     #if MEDIAINFO_DEMUX
         BlockAlign=numChannels*sampleSize/8;
@@ -750,8 +751,7 @@ void File_Riff::AIFF_COMM()
     #endif //MEDIAINFO_DEMUX
 
     Element_Code=(int64u)-1;
-    for (size_t Pos=0; Pos<Stream[Stream_ID].Parsers.size(); Pos++)
-        Open_Buffer_Init(Stream[Stream_ID].Parsers[Pos]);
+    Open_Buffer_Init_All();
 }
 
 //---------------------------------------------------------------------------
@@ -1148,6 +1148,7 @@ void File_Riff::AVI__hdlr_strl_indx_SuperIndex(int32u Entry_Count, int32u ChunkI
     Skip_L4(                                                    "Reserved0");
     Skip_L4(                                                    "Reserved1");
     Skip_L4(                                                    "Reserved2");
+    stream& StreamItem = Stream[Stream_ID];
     for (int32u Pos=0; Pos<Entry_Count; Pos++)
     {
         int32u Duration;
@@ -1156,7 +1157,7 @@ void File_Riff::AVI__hdlr_strl_indx_SuperIndex(int32u Entry_Count, int32u ChunkI
         Skip_L4(                                                "Size"); //Size of index chunk at this offset
         Get_L4 (Duration,                                       "Duration"); //time span in stream ticks
         Index_Pos[Offset]=ChunkId;
-        Stream[Stream_ID].indx_Duration+=Duration;
+        StreamItem.indx_Duration+=Duration;
         Element_End0();
     }
 
@@ -1185,7 +1186,8 @@ void File_Riff::AVI__hdlr_strl_strf()
     Element_Name("Stream format");
 
     //Parse depending of kind of stream
-    switch (Stream[Stream_ID].fccType)
+    stream& StreamItem = Stream[Stream_ID];
+    switch (StreamItem.fccType)
     {
         case Elements::AVI__hdlr_strl_strh_auds : AVI__hdlr_strl_strf_auds(); break;
         case Elements::AVI__hdlr_strl_strh_iavs : AVI__hdlr_strl_strf_iavs(); break;
@@ -1196,8 +1198,8 @@ void File_Riff::AVI__hdlr_strl_strf()
     }
 
     //Registering stream
-    Stream[Stream_ID].StreamKind=StreamKind_Last;
-    Stream[Stream_ID].StreamPos=StreamPos_Last;
+    StreamItem.StreamKind=StreamKind_Last;
+    StreamItem.StreamPos=StreamPos_Last;
 }
 
 //---------------------------------------------------------------------------
@@ -1236,7 +1238,8 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
 
     //Filling
     Stream_Prepare(Stream_Audio);
-    Stream[Stream_ID].Compression=FormatTag;
+    stream& StreamItem = Stream[Stream_ID];
+    StreamItem.Compression=FormatTag;
     Ztring Codec; Codec.From_Number(FormatTag, 16);
     Codec.MakeUpperCase();
     CodecID_Fill(Codec, Stream_Audio, StreamPos_Last, InfoCodecID_Format_Riff);
@@ -1250,7 +1253,7 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
         Fill(Stream_Audio, StreamPos_Last, Audio_BitRate, AvgBytesPerSec*8);
     if (BitsPerSample)
         Fill(Stream_Audio, StreamPos_Last, Audio_BitDepth, BitsPerSample);
-    Stream[Stream_ID].AvgBytesPerSec=AvgBytesPerSec; //Saving bitrate for each stream
+    StreamItem.AvgBytesPerSec=AvgBytesPerSec; //Saving bitrate for each stream
     if (SamplesPerSec && TimeReference!=(int64u)-1)
     {
         Fill(Stream_Audio, 0, Audio_Delay, float64_int64s(((float64)TimeReference)*1000/SamplesPerSec));
@@ -1274,7 +1277,7 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
                     Demux_Level=4; //Intermediate
                 }
             #endif //MEDIAINFO_DEMUX
-            Stream[Stream_ID].Parsers.push_back(Parser);
+            StreamItem.Parsers.push_back(Parser);
         }
         #endif
 
@@ -1292,7 +1295,7 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
                     Demux_Level=4; //Intermediate
                 }
             #endif //MEDIAINFO_DEMUX
-            Stream[Stream_ID].Parsers.push_back(Parser);
+            StreamItem.Parsers.push_back(Parser);
         }
         #endif
     }
@@ -1306,7 +1309,7 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
         File_Mpega* Parser=new File_Mpega;
         Parser->CalculateDelay=true;
         Parser->ShouldContinueParsing=true;
-        Stream[Stream_ID].Parsers.push_back(Parser);
+        StreamItem.Parsers.push_back(Parser);
     }
     #endif
     #if defined(MEDIAINFO_AC3_YES)
@@ -1316,7 +1319,7 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
         Parser->Frame_Count_Valid=2;
         Parser->CalculateDelay=true;
         Parser->ShouldContinueParsing=true;
-        Stream[Stream_ID].Parsers.push_back(Parser);
+        StreamItem.Parsers.push_back(Parser);
     }
     #endif
     #if defined(MEDIAINFO_DTS_YES)
@@ -1325,7 +1328,7 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
         File_Dts* Parser=new File_Dts;
         Parser->Frame_Count_Valid=2;
         Parser->ShouldContinueParsing=true;
-        Stream[Stream_ID].Parsers.push_back(Parser);
+        StreamItem.Parsers.push_back(Parser);
     }
     #endif
     #if defined(MEDIAINFO_AAC_YES)
@@ -1335,7 +1338,7 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
         Parser->Mode=File_Aac::Mode_ADTS;
         Parser->Frame_Count_Valid=1;
         Parser->ShouldContinueParsing=true;
-        Stream[Stream_ID].Parsers.push_back(Parser);
+        StreamItem.Parsers.push_back(Parser);
     }
     #endif
     #if defined(MEDIAINFO_PCM_YES)
@@ -1357,8 +1360,9 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
         #else //MEDIAINFO_DEMUX
             Parser->Frame_Count_Valid=(int64u)-1; //Disabling it, waiting for SMPTE ST 337 parser reject
         #endif //MEDIAINFO_DEMUX
-        Stream[Stream_ID].Parsers.push_back(Parser);
-        Stream[Stream_ID].IsPcm=true;
+        stream& StreamItem = Stream[Stream_ID];
+        StreamItem.Parsers.push_back(Parser);
+        StreamItem.IsPcm=true;
     }
     #endif
     #if defined(MEDIAINFO_ADPCM_YES)
@@ -1383,11 +1387,10 @@ void File_Riff::AVI__hdlr_strl_strf_auds()
     {
         File_Ogg* Parser=new File_Ogg;
         Parser->ShouldContinueParsing=true;
-        Stream[Stream_ID].Parsers.push_back(Parser);
+        StreamItem.Parsers.push_back(Parser);
     }
     #endif
-    for (size_t Pos=0; Pos<Stream[Stream_ID].Parsers.size(); Pos++)
-        Open_Buffer_Init(Stream[Stream_ID].Parsers[Pos]);
+    Open_Buffer_Init_All();
 
     //Options
     if (Element_Offset+2>Element_Size)
@@ -1508,10 +1511,11 @@ void File_Riff::AVI__hdlr_strl_strf_auds_Vorbis2()
     Skip_XX(8,                                                  "Vorbis Unknown");
     Element_Begin1("Vorbis options");
     #if defined(MEDIAINFO_OGG_YES)
-        Open_Buffer_Continue(Stream[Stream_ID].Parsers[0]);
-        Open_Buffer_Continue(Stream[Stream_ID].Parsers[0], 0);
-        Finish(Stream[Stream_ID].Parsers[0]);
-        Merge(*Stream[Stream_ID].Parsers[0], StreamKind_Last, 0, StreamPos_Last);
+        stream& StreamItem = Stream[Stream_ID];
+        Open_Buffer_Continue(StreamItem.Parsers[0]);
+        Open_Buffer_Continue(StreamItem.Parsers[0], 0);
+        Finish(StreamItem.Parsers[0]);
+        Merge(*StreamItem.Parsers[0], StreamKind_Last, 0, StreamPos_Last);
         Element_Show();
     #else //MEDIAINFO_MPEG4_YES
         Skip_XX(Element_Size-Element_Offset,                    "(Vorbis headers)");
@@ -1555,13 +1559,12 @@ void File_Riff::AVI__hdlr_strl_strf_auds_ExtensibleWave()
                         Demux_Level=4; //Intermediate
                     }
                 #endif //MEDIAINFO_DEMUX
-                Stream[Stream_ID].Parsers.push_back(Parser);
-                Stream[Stream_ID].IsPcm=true;
+                stream& StreamItem = Stream[Stream_ID];
+                StreamItem.Parsers.push_back(Parser);
+                StreamItem.IsPcm=true;
             }
             #endif
-
-            for (size_t Pos=0; Pos<Stream[Stream_ID].Parsers.size(); Pos++)
-                Open_Buffer_Init(Stream[Stream_ID].Parsers[Pos]);
+            Open_Buffer_Init_All();
         }
         else
         {
@@ -1620,8 +1623,9 @@ void File_Riff::AVI__hdlr_strl_strf_iavs()
         Finish(DV_FromHeader);
 
         Stream_Prepare(Stream_Video);
-        Stream[Stream_ID].Parsers.push_back(new File_DvDif);
-        Open_Buffer_Init(Stream[Stream_ID].Parsers[0]);
+        stream& StreamItem = Stream[Stream_ID];
+        StreamItem.Parsers.push_back(new File_DvDif);
+        Open_Buffer_Init(StreamItem.Parsers[0]);
 
     #else //MEDIAINFO_DVDIF_YES
         //Parsing
@@ -1692,15 +1696,15 @@ void File_Riff::AVI__hdlr_strl_strf_txts()
         if (Element_Size==0)
         {
             //Creating the parser
+            stream& StreamItem = Stream[Stream_ID];
             #if defined(MEDIAINFO_SUBRIP_YES)
-                Stream[Stream_ID].Parsers.push_back(new File_SubRip);
+            StreamItem.Parsers.push_back(new File_SubRip);
             #endif
             #if defined(MEDIAINFO_OTHERTEXT_YES)
-                Stream[Stream_ID].Parsers.push_back(new File_OtherText); //For SSA
+            StreamItem.Parsers.push_back(new File_OtherText); //For SSA
             #endif
 
-            for (size_t Pos=0; Pos<Stream[Stream_ID].Parsers.size(); Pos++)
-                Open_Buffer_Init(Stream[Stream_ID].Parsers[Pos]);
+            Open_Buffer_Init_All();
         }
         else
         {
@@ -1874,8 +1878,7 @@ void File_Riff::AVI__hdlr_strl_strf_vids()
         Stream[Stream_ID].Parsers.push_back(Parser);
     }
     #endif
-    for (size_t Pos=0; Pos<Stream[Stream_ID].Parsers.size(); Pos++)
-        Open_Buffer_Init(Stream[Stream_ID].Parsers[Pos]);
+    Open_Buffer_Init_All();
 
     //Options
     if (Element_Offset>=Element_Size)
@@ -1899,7 +1902,8 @@ void File_Riff::AVI__hdlr_strl_strf_vids_Avc()
     Element_Begin1("AVC options");
     #if defined(MEDIAINFO_AVC_YES)
         //Can be sized block or with 000001
-        File_Avc* Parser=(File_Avc*)Stream[Stream_ID].Parsers[0];
+        stream& StreamItem = Stream[Stream_ID];
+        File_Avc* Parser=(File_Avc*)StreamItem.Parsers[0];
         Parser->MustParse_SPS_PPS=false;
         Parser->SizedBlocks=false;
         Parser->MustSynchronize=true;
@@ -1908,8 +1912,8 @@ void File_Riff::AVI__hdlr_strl_strf_vids_Avc()
         if (!Parser->Status[IsAccepted])
         {
             Element_Offset=Element_Offset_Save;
-            delete Stream[Stream_ID].Parsers[0]; Stream[Stream_ID].Parsers[0]=new File_Avc;
-            Parser=(File_Avc*)Stream[Stream_ID].Parsers[0];
+            delete StreamItem.Parsers[0]; StreamItem.Parsers[0]=new File_Avc;
+            Parser=(File_Avc*)StreamItem.Parsers[0];
             Open_Buffer_Init(Parser);
             Parser->FrameIsAlwaysComplete=true;
             Parser->MustParse_SPS_PPS=true;
@@ -2038,12 +2042,13 @@ void File_Riff::AVI__hdlr_strl_strh()
             break;
         default: ;
     }
-    Stream[Stream_ID].fccType=fccType;
-    Stream[Stream_ID].fccHandler=fccHandler;
-    Stream[Stream_ID].Scale=Scale;
-    Stream[Stream_ID].Rate=Rate;
-    Stream[Stream_ID].Start=Start;
-    Stream[Stream_ID].Length=Length;
+    stream& StreamItem = Stream[Stream_ID];
+    StreamItem.fccType=fccType;
+    StreamItem.fccHandler=fccHandler;
+    StreamItem.Scale=Scale;
+    StreamItem.Rate=Rate;
+    StreamItem.Start=Start;
+    StreamItem.Length=Length;
 }
 
 //---------------------------------------------------------------------------
@@ -2506,13 +2511,14 @@ void File_Riff::AVI__movi_xxxx()
         return;
     }
 
+    stream& StreamItem = Stream[Stream_ID];
     #if MEDIAINFO_DEMUX
-        if (Stream[Stream_ID].Rate) //AVI
+        if (StreamItem.Rate) //AVI
         {
             int64u Element_Code_Old=Element_Code;
             Element_Code=((Element_Code_Old>>24)&0xF)*10+((Element_Code_Old>>16)&0xF);
-            Frame_Count_NotParsedIncluded=Stream[Stream_ID].PacketPos;
-            FrameInfo.DTS=Frame_Count_NotParsedIncluded*1000000000*Stream[Stream_ID].Scale/Stream[Stream_ID].Rate;
+            Frame_Count_NotParsedIncluded= StreamItem.PacketPos;
+            FrameInfo.DTS=Frame_Count_NotParsedIncluded*1000000000* StreamItem.Scale/ StreamItem.Rate;
             Demux(Buffer+Buffer_Offset, (size_t)Element_Size, ContentType_MainStream);
             Element_Code=Element_Code_Old;
             Frame_Count_NotParsedIncluded=(int64u)-1;
@@ -2523,10 +2529,10 @@ void File_Riff::AVI__movi_xxxx()
         }
     #endif //MEDIAINFO_DEMUX
 
-    Stream[Stream_ID].PacketPos++;
+        StreamItem.PacketPos++;
 
     //Finished?
-    if (!Stream[Stream_ID].SearchingPayload)
+    if (!StreamItem.SearchingPayload)
     {
         Element_DoNotShow();
         AVI__movi_StreamJump();
@@ -2558,37 +2564,37 @@ void File_Riff::AVI__movi_xxxx()
     }
 
     //Parsing
-    for (size_t Pos=0; Pos<Stream[Stream_ID].Parsers.size(); Pos++)
-        if (Stream[Stream_ID].Parsers[Pos])
+    for (size_t Pos=0; Pos<StreamItem.Parsers.size(); Pos++)
+        if (StreamItem.Parsers[Pos])
         {
             if (FrameInfo.PTS!=(int64u)-1)
-                Stream[Stream_ID].Parsers[Pos]->FrameInfo.PTS=FrameInfo.PTS;
+                StreamItem.Parsers[Pos]->FrameInfo.PTS=FrameInfo.PTS;
             if (FrameInfo.DTS!=(int64u)-1)
-                Stream[Stream_ID].Parsers[Pos]->FrameInfo.DTS=FrameInfo.DTS;
+                StreamItem.Parsers[Pos]->FrameInfo.DTS=FrameInfo.DTS;
 
-            Open_Buffer_Continue(Stream[Stream_ID].Parsers[Pos], Buffer+Buffer_Offset+(size_t)Element_Offset, (size_t)(Element_Size-Element_Offset));
+            Open_Buffer_Continue(StreamItem.Parsers[Pos], Buffer+Buffer_Offset+(size_t)Element_Offset, (size_t)(Element_Size-Element_Offset));
             Element_Show();
-            if (Stream[Stream_ID].Parsers.size()==1 && Stream[Stream_ID].Parsers[Pos]->Buffer_Size>0)
-                Stream[Stream_ID].ChunksAreComplete=false;
+            if (StreamItem.Parsers.size()==1 && StreamItem.Parsers[Pos]->Buffer_Size>0)
+                StreamItem.ChunksAreComplete=false;
 
-            if (Stream[Stream_ID].Parsers.size()>1)
+            if (StreamItem.Parsers.size()>1)
             {
-                if (!Stream[Stream_ID].Parsers[Pos]->Status[IsAccepted] && Stream[Stream_ID].Parsers[Pos]->Status[IsFinished])
+                if (!StreamItem.Parsers[Pos]->Status[IsAccepted] && StreamItem.Parsers[Pos]->Status[IsFinished])
                 {
-                    delete *(Stream[Stream_ID].Parsers.begin()+Pos);
-                    Stream[Stream_ID].Parsers.erase(Stream[Stream_ID].Parsers.begin()+Pos);
+                    delete *(StreamItem.Parsers.begin()+Pos);
+                    StreamItem.Parsers.erase(StreamItem.Parsers.begin()+Pos);
                     Pos--;
                 }
-                else if (Stream[Stream_ID].Parsers.size()>1 && Stream[Stream_ID].Parsers[Pos]->Status[IsAccepted])
+                else if (StreamItem.Parsers.size()>1 && StreamItem.Parsers[Pos]->Status[IsAccepted])
                 {
-                    File__Analyze* Parser=Stream[Stream_ID].Parsers[Pos];
-                    for (size_t Pos2=0; Pos2<Stream[Stream_ID].Parsers.size(); Pos2++)
+                    File__Analyze* Parser= StreamItem.Parsers[Pos];
+                    for (size_t Pos2=0; Pos2<StreamItem.Parsers.size(); Pos2++)
                     {
                         if (Pos2!=Pos)
-                            delete *(Stream[Stream_ID].Parsers.begin()+Pos2);
+                            delete *(StreamItem.Parsers.begin()+Pos2);
                     }
-                    Stream[Stream_ID].Parsers.clear();
-                    Stream[Stream_ID].Parsers.push_back(Parser);
+                    StreamItem.Parsers.clear();
+                    StreamItem.Parsers.push_back(Parser);
                     Pos=0;
                 }
             }
@@ -2596,7 +2602,7 @@ void File_Riff::AVI__movi_xxxx()
             #if MEDIAINFO_DEMUX
                 if (Config->Demux_EventWasSent)
                 {
-                    Demux_Parser=Stream[Stream_ID].Parsers[Pos];
+                    Demux_Parser= StreamItem.Parsers[Pos];
                     return;
                 }
             #endif //MEDIAINFO_DEMUX
@@ -2623,11 +2629,12 @@ void File_Riff::AVI__movi_xxxx()
 void File_Riff::AVI__movi_xxxx___dc()
 {
     //Finish (if requested)
-    if (Stream[Stream_ID].Parsers.empty()
-     || Stream[Stream_ID].Parsers[0]->Status[IsFinished]
-     || (Stream[Stream_ID].PacketPos>=300 && MediaInfoLib::Config.ParseSpeed_Get()<1.00))
+    stream& StreamItem = Stream[Stream_ID];
+    if (StreamItem.Parsers.empty()
+     || StreamItem.Parsers[0]->Status[IsFinished]
+     || (StreamItem.PacketPos>=300 && MediaInfoLib::Config.ParseSpeed_Get()<1.00))
     {
-        Stream[Stream_ID].SearchingPayload=false;
+        StreamItem.SearchingPayload=false;
         stream_Count--;
         return;
     }
@@ -2664,12 +2671,13 @@ void File_Riff::AVI__movi_xxxx___tx()
 void File_Riff::AVI__movi_xxxx___wb()
 {
     //Finish (if requested)
-    if (Stream[Stream_ID].PacketPos>=4 //For having the chunk alignement
-     && (Stream[Stream_ID].Parsers.empty()
-      || Stream[Stream_ID].Parsers[0]->Status[IsFinished]
-      || (Stream[Stream_ID].PacketPos>=300 && MediaInfoLib::Config.ParseSpeed_Get()<1.00)))
+    stream& StreamItem = Stream[Stream_ID];
+    if (StreamItem.PacketPos>=4 //For having the chunk alignement
+     && (StreamItem.Parsers.empty()
+      || StreamItem.Parsers[0]->Status[IsFinished]
+      || (StreamItem.PacketPos>=300 && MediaInfoLib::Config.ParseSpeed_Get()<1.00)))
     {
-        Stream[Stream_ID].SearchingPayload=false;
+        StreamItem.SearchingPayload=false;
         stream_Count--;
     }
 }
@@ -3814,7 +3822,12 @@ void File_Riff::W3DI()
     Fill(Stream_General, 0, General_Comment, Comment);
     Fill(Stream_General, 0, General_Track_Position, TrackPos);
 }
-
+void File_Riff::Open_Buffer_Init_All()
+{
+    stream& StreamItem = Stream[Stream_ID];
+    for (size_t Pos = 0; Pos<StreamItem.Parsers.size(); Pos++)
+        Open_Buffer_Init(StreamItem.Parsers[Pos]);
+}
 //***************************************************************************
 // C++
 //***************************************************************************
diff --git a/Source/MediaInfo/Multiple/File_Wm_Elements.cpp b/Source/MediaInfo/Multiple/File_Wm_Elements.cpp
index 59cc573..db3193a 100644
--- a/Source/MediaInfo/Multiple/File_Wm_Elements.cpp
+++ b/Source/MediaInfo/Multiple/File_Wm_Elements.cpp
@@ -134,7 +134,7 @@ namespace Elements
     UUID(Mutex_Bitrate,                                         D6E22A01, 35DA, 11D1, 9034, 00A0C90349BE);
 }
 
-static const char* Wm_StreamType(const int128u Kind)
+static const char* Wm_StreamType(const int128u& Kind)
 {
     switch (Kind.hi)
     {
@@ -149,7 +149,7 @@ static const char* Wm_StreamType(const int128u Kind)
     }
 }
 
-static const char* Wm_ExclusionType(const int128u ExclusionType)
+static const char* Wm_ExclusionType(const int128u& ExclusionType)
 {
     switch (ExclusionType.hi)
     {
@@ -320,10 +320,11 @@ void File_Wm::Header_StreamProperties ()
         Skip_XX(ErrorCorrectionTypeLength,                      "Error Correction Data");
 
     //Filling
-    Stream[Stream_Number].StreamKind=StreamKind_Last;
-    Stream[Stream_Number].StreamPos=StreamPos_Last;
-    Stream[Stream_Number].Info["ID"].From_Number(Stream_Number);
-    Stream[Stream_Number].Info["StreamOrder"].From_Number(Header_StreamProperties_StreamOrder);
+    stream& StreamItem = Stream[Stream_Number];
+    StreamItem.StreamKind=StreamKind_Last;
+    StreamItem.StreamPos=StreamPos_Last;
+    StreamItem.Info["ID"].From_Number(Stream_Number);
+    StreamItem.Info["StreamOrder"].From_Number(Header_StreamProperties_StreamOrder);
     Header_StreamProperties_StreamOrder++;
 }
 
@@ -362,9 +363,11 @@ void File_Wm::Header_StreamProperties_Audio ()
         #if defined(MEDIAINFO_MPEGA_YES)
         else if (MediaInfoLib::Config.CodecID_Get(Stream_Audio, InfoCodecID_Format_Riff, Ztring::ToZtring(CodecID, 16))==__T("MPEG Audio"))
         {
-            Stream[Stream_Number].Parser=new File_Mpega;
-            ((File_Mpega*)Stream[Stream_Number].Parser)->Frame_Count_Valid=8;
-            Stream[Stream_Number].Parser->ShouldContinueParsing=true;
+            stream& StreamItem = Stream[Stream_Number];
+            File_Mpega* Parser = new File_Mpega;
+            StreamItem.Parser= Parser;
+            Parser->Frame_Count_Valid=8;
+            StreamItem.Parser->ShouldContinueParsing=true;
         }
         #endif
         Open_Buffer_Init(Stream[Stream_Number].Parser);
@@ -487,14 +490,16 @@ void File_Wm::Header_StreamProperties_Video ()
     #if defined(MEDIAINFO_VC1_YES)
     else if (MediaInfoLib::Config.CodecID_Get(Stream_Video, InfoCodecID_Format_Riff, Ztring().From_CC4(Compression), InfoCodecID_Format)==__T("VC-1"))
     {
-        Stream[Stream_Number].Parser=new File_Vc1;
+        stream& StreamItem = Stream[Stream_Number];
+        File_Vc1* Parser = new File_Vc1;
+        StreamItem.Parser= Parser;
         if (Compression==CC4("WMV3"))
         {
-            ((File_Vc1*)Stream[Stream_Number].Parser)->From_WMV3=true;
-            ((File_Vc1*)Stream[Stream_Number].Parser)->MustSynchronize=false;
+            Parser->From_WMV3=true;
+            Parser->MustSynchronize=false;
         }
-        ((File_Vc1*)Stream[Stream_Number].Parser)->FrameIsAlwaysComplete=true; //Warning: this is not always the case, see data parsing
-        Open_Buffer_Init(Stream[Stream_Number].Parser);
+        Parser->FrameIsAlwaysComplete=true; //Warning: this is not always the case, see data parsing
+        Open_Buffer_Init(StreamItem.Parser);
         if (Data_Size>40)
         {
 
@@ -518,18 +523,18 @@ void File_Wm::Header_StreamProperties_Video ()
                     default :   ;
                 }
             #endif //MEDIAINFO_DEMUX
-
-            Open_Buffer_Continue(Stream[Stream_Number].Parser, (size_t)(Data_Size-40));
-            if (Stream[Stream_Number].Parser->Status[IsFinished])
+            stream& StreamItem = Stream[Stream_Number];
+            Open_Buffer_Continue(StreamItem.Parser, (size_t)(Data_Size-40));
+            if (StreamItem.Parser->Status[IsFinished])
             {
-                Finish(Stream[Stream_Number].Parser);
-                Merge(*Stream[Stream_Number].Parser, Stream_Video, 0, StreamPos_Last);
-                delete Stream[Stream_Number].Parser; Stream[Stream_Number].Parser=NULL;
+                Finish(StreamItem.Parser);
+                Merge(*StreamItem.Parser, Stream_Video, 0, StreamPos_Last);
+                delete StreamItem.Parser; StreamItem.Parser=NULL;
             }
             else
             {
-                ((File_Vc1*)Stream[Stream_Number].Parser)->Only_0D=true;
-                ((File_Vc1*)Stream[Stream_Number].Parser)->MustSynchronize=false;
+                ((File_Vc1*)StreamItem.Parser)->Only_0D=true;
+                ((File_Vc1*)StreamItem.Parser)->MustSynchronize=false;
             }
         }
     }
@@ -537,9 +542,11 @@ void File_Wm::Header_StreamProperties_Video ()
     #if defined(MEDIAINFO_MPEGV_YES)
     else if (MediaInfoLib::Config.Codec_Get(Ztring().From_CC4(Compression), InfoCodec_KindofCodec).find(__T("MPEG-2"))==0)
     {
-        Stream[Stream_Number].Parser=new File_Mpegv;
-        ((File_Mpegv*)Stream[Stream_Number].Parser)->Frame_Count_Valid=30; //For searching Pulldown
-        Open_Buffer_Init(Stream[Stream_Number].Parser);
+        stream& StreamItem = Stream[Stream_Number];
+        File_Mpegv* Parser = new File_Mpegv;
+        StreamItem.Parser  = Parser;
+        Parser->Frame_Count_Valid=30; //For searching Pulldown
+        Open_Buffer_Init(StreamItem.Parser);
     }
     #endif
     else if (Data_Size>40) //TODO: see "The Mummy_e"
@@ -699,9 +706,10 @@ void File_Wm::Header_HeaderExtension_ExtendedStreamProperties()
     }
 
     //Filling
-    Stream[StreamNumber].LanguageID=LanguageID;
-    Stream[StreamNumber].AverageBitRate=DataBitrate;
-    Stream[StreamNumber].AverageTimePerFrame=AverageTimePerFrame;
+    stream& StreamItem = Stream[StreamNumber];
+    StreamItem.LanguageID=LanguageID;
+    StreamItem.AverageBitRate=DataBitrate;
+    StreamItem.AverageTimePerFrame=AverageTimePerFrame;
 }
 
 //---------------------------------------------------------------------------
@@ -1248,8 +1256,9 @@ void File_Wm::Header_StreamBitRate()
         Element_End0();
 
         //Filling
-        if (Stream[StreamNumber].AverageBitRate==0) //Prefere Average bitrate of Extended Stream Properties if present
-            Stream[StreamNumber].AverageBitRate=AverageBitRate;
+        stream& StreamItem = Stream[StreamNumber];
+        if (StreamItem.AverageBitRate==0) //Prefere Average bitrate of Extended Stream Properties if present
+            StreamItem.AverageBitRate=AverageBitRate;
     }
 }
 
@@ -1532,7 +1541,8 @@ void File_Wm::Data_Packet()
             Demux(Buffer+(size_t)Element_Offset, (size_t)PayloadLength, ContentType_MainStream);
 
             //Analyzing
-            if (Stream[Stream_Number].Parser && Stream[Stream_Number].SearchingPayload)
+            stream& StreamItem = Stream[Stream_Number];
+            if (StreamItem.Parser && StreamItem.SearchingPayload)
             {
                 //Handling of spanned on multiple chunks
                 #if defined(MEDIAINFO_VC1_YES)
@@ -1556,16 +1566,16 @@ void File_Wm::Data_Packet()
 
                 //Codec specific
                 #if defined(MEDIAINFO_VC1_YES)
-                if (Retrieve(Stream[Stream_Number].StreamKind, Stream[Stream_Number].StreamPos, Fill_Parameter(Stream[Stream_Number].StreamKind, Generic_Format))==__T("VC-1"))
-                    ((File_Vc1*)Stream[Stream_Number].Parser)->FrameIsAlwaysComplete=FrameIsAlwaysComplete;
+                if (Retrieve(StreamItem.StreamKind, StreamItem.StreamPos, Fill_Parameter(StreamItem.StreamKind, Generic_Format))==__T("VC-1"))
+                    ((File_Vc1*)StreamItem.Parser)->FrameIsAlwaysComplete=FrameIsAlwaysComplete;
                 #endif
 
-                Open_Buffer_Continue(Stream[Stream_Number].Parser, (size_t)PayloadLength);
-                if (Stream[Stream_Number].Parser->Status[IsFinished]
-                 || (Stream[Stream_Number].PresentationTimes.size()>=300 && MediaInfoLib::Config.ParseSpeed_Get()<1))
+                Open_Buffer_Continue(StreamItem.Parser, (size_t)PayloadLength);
+                if (StreamItem.Parser->Status[IsFinished]
+                 || (StreamItem.PresentationTimes.size()>=300 && MediaInfoLib::Config.ParseSpeed_Get()<1))
                 {
-                    Stream[Stream_Number].Parser->Open_Buffer_Unsynch();
-                    Stream[Stream_Number].SearchingPayload=false;
+                    StreamItem.Parser->Open_Buffer_Unsynch();
+                    StreamItem.SearchingPayload=false;
                     Streams_Count--;
                 }
 
@@ -1574,10 +1584,10 @@ void File_Wm::Data_Packet()
             else
             {
                 Skip_XX(PayloadLength,                              "Data");
-                if (Stream[Stream_Number].SearchingPayload
-                 && (Stream[Stream_Number].StreamKind==Stream_Video && Stream[Stream_Number].PresentationTimes.size()>=300))
+                if (StreamItem.SearchingPayload
+                 && (StreamItem.StreamKind==Stream_Video && StreamItem.PresentationTimes.size()>=300))
                 {
-                    Stream[Stream_Number].SearchingPayload=false;
+                    StreamItem.SearchingPayload=false;
                     Streams_Count--;
                 }
             }
@@ -1604,20 +1614,21 @@ void File_Wm::Data_Packet_ReplicatedData(int32u Size)
 {
     Element_Begin1("Replicated Data");
     int64u Element_Offset_Final=Element_Offset+Size;
-    for (size_t Pos=0; Pos<Stream[Stream_Number].Payload_Extension_Systems.size(); Pos++)
+    stream& StreamItem = Stream[Stream_Number];
+    for (size_t Pos=0; Pos<StreamItem.Payload_Extension_Systems.size(); Pos++)
     {
         Element_Begin0();
-        switch (Stream[Stream_Number].Payload_Extension_Systems[Pos].ID.hi)
+        switch (StreamItem.Payload_Extension_Systems[Pos].ID.hi)
         {
             case Elements::Payload_Extension_System_TimeStamp :     Data_Packet_ReplicatedData_TimeStamp(); break;
             default :                                               //Not enough info to validate this algorithm
-                                                                    //if (Stream[Stream_Number].Payload_Extension_Systems[Pos].Size!=(int16u)-1)
+                                                                    //if (StreamItem.Payload_Extension_Systems[Pos].Size!=(int16u)-1)
                                                                     //{
                                                                     //    Element_Name("Unknown");
-                                                                    //    Skip_XX(Stream[Stream_Number].Payload_Extension_Systems[Pos].Size, "Unknown");
+                                                                    //    Skip_XX(StreamItem.Payload_Extension_Systems[Pos].Size, "Unknown");
                                                                     //}
                                                                     //else
-                                                                        Pos=Stream[Stream_Number].Payload_Extension_Systems.size(); //Disabling the rest, all is unknown
+                                                                        Pos=StreamItem.Payload_Extension_Systems.size(); //Disabling the rest, all is unknown
         }
         Element_End0();
     }
@@ -1653,9 +1664,9 @@ void File_Wm::Data_Packet_ReplicatedData_TimeStamp()
     Skip_L4(                                                    "Unknown");
     Skip_L4(                                                    "Unknown");
     Skip_L4(                                                    "Unknown");
-
-    if (Stream[Stream_Number].TimeCode_First==(int64u)-1 && TS0!=(int64u)-1)
-        Stream[Stream_Number].TimeCode_First=TS0/10000;
+    stream& StreamItem = Stream[Stream_Number];
+    if (StreamItem.TimeCode_First==(int64u)-1 && TS0!=(int64u)-1)
+        StreamItem.TimeCode_First=TS0/10000;
 }
 
 //---------------------------------------------------------------------------
diff --git a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.cpp b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.cpp
index ac2db3a..e100319 100644
--- a/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.cpp
+++ b/Source/MediaInfo/Multiple/File__ReferenceFilesHelper.cpp
@@ -115,6 +115,7 @@ void File__ReferenceFilesHelper_InfoFromFileName (sequences &Sequences)
     ZtringListList List;
     vector<size_t> Iterators;
 
+    size_t ItemsValid=0;
     for (size_t Sequences_Pos=0; Sequences_Pos<Sequences.size(); Sequences_Pos++)
     {
         ZtringList List2;
@@ -139,153 +140,171 @@ void File__ReferenceFilesHelper_InfoFromFileName (sequences &Sequences)
                 List2[Pos].MakeLowerCase();
             List.push_back(List2);
             Iterators.push_back(Sequences_Pos);
+            ItemsValid++;
         }
+        else
+            List.push_back(Ztring());
     }
 
-    if (List.size()<2)
+    if (ItemsValid<2)
         return;
 
-    size_t ChannelLayout_Pos=(size_t)-1;
-    size_t Language_Pos=(size_t)-1;
-    for (size_t Pos2=0; Pos2<List[0].size(); Pos2++)
+    for (size_t Pos2=0; Pos2<List.size(); Pos2++)
     {
-        bool IsChannelLayout=true;
-        bool IsLanguage=true;
-        for (size_t Pos=0; Pos<List.size(); Pos++)
+        size_t ChannelLayout_Pos=(size_t)-1;
+        size_t Language_Pos=(size_t)-1;
+        
+        //Pos = index file parts
+        for (size_t Pos=0; Pos<List[Pos2].size(); Pos++)
         {
-            if (Pos2>=List[Pos].size())
+            if (Pos>=List[Pos2].size())
                 break; //Maybe begin of title
-            const Ztring &Test=List[Pos][List[Pos].size()-1-Pos2];
+            const Ztring &Test=List[Pos2][List[Pos2].size()-1-Pos];
 
             //ChannelLayout
             if (ChannelLayout_Pos==(size_t)-1
-             && Test!=__T("l")
-             && Test!=__T("r")
-             && Test!=__T("lt")
-             && Test!=__T("rt")
-             && Test!=__T("c")
-             && Test!=__T("lf")
-             && Test!=__T("lfe")
-             && Test!=__T("sub")
-             && Test!=__T("ls")
-             && Test!=__T("rs")
-             && Test!=__T("b")
-             && Test!=__T("mono"))
-                IsChannelLayout=false;
+             && (Test==__T("l")
+             || Test==__T("r")
+             || Test==__T("lt")
+             || Test==__T("rt")
+             || Test==__T("c")
+             || Test==__T("lf")
+             || Test==__T("lfe")
+             || Test==__T("sub")
+             || Test==__T("ls")
+             || Test==__T("rs")
+             || Test==__T("lsr")
+             || Test==__T("rsr")             
+             || Test==__T("b")
+             || Test==__T("mono")))
+            {
+                ChannelLayout_Pos = Pos;
+            }
 
             //Language
             if (Language_Pos==(size_t)-1
-             && Test!=__T("ara")
-             && Test!=__T("deu")
-             && Test!=__T("eng")
-             && Test!=__T("fra")
-             && Test!=__T("fre")
-             && Test!=__T("ita")
-             && Test!=__T("jpn")
-             && Test!=__T("rus")
-             && Test!=__T("spa"))
-                IsLanguage=false;
-        }
+             && (Test==__T("ara")
+             || Test==__T("deu")
+             || Test==__T("eng")
+             || Test==__T("fra")
+             || Test==__T("fre")
+             || Test==__T("ger")
+             || Test==__T("ita")
+             || Test==__T("jpn")
+             || Test==__T("las") //Latin America Spanish
+             || Test==__T("rus")
+             || Test==__T("spa")))
+            {
+                Language_Pos = Pos;
+            }
 
-        if (IsChannelLayout && ChannelLayout_Pos==(size_t)-1)
-            ChannelLayout_Pos=Pos2;
-        if (IsLanguage && Language_Pos==(size_t)-1)
-            Language_Pos=Pos2;
-        if (ChannelLayout_Pos!=(size_t)-1 && Language_Pos!=(size_t)-1)
-            break;
-    }
+            if (ChannelLayout_Pos!=(size_t)-1 && Language_Pos!=(size_t)-1)
+                break;
+        }
 
-    //ChannelLayout
-    if (ChannelLayout_Pos!=(size_t)-1)
-        for (size_t Pos=0; Pos<List.size(); Pos++)
+        //ChannelLayout
+        if (ChannelLayout_Pos!=(size_t)-1)
         {
             Ztring ChannelPositions, ChannelPositions2, ChannelLayout;
-            if (List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("l"))
+            if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("l"))
             {
                 ChannelPositions=__T("Front: L");
                 ChannelPositions2=__T("1/0/0");
                 ChannelLayout=__T("L");
             }
-            if (List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("lt"))
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("lt"))
             {
                 ChannelPositions=__T("Front: Lt");
                 ChannelPositions2=__T("1/0/0");
                 ChannelLayout=__T("Lt");
             }
-            if (List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("rt"))
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("rt"))
             {
                 ChannelPositions=__T("Front: Rt");
                 ChannelPositions2=__T("1/0/0");
                 ChannelLayout=__T("Rt");
             }
-            if (List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("r"))
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("r"))
             {
                 ChannelPositions=__T("Front: R");
                 ChannelPositions2=__T("1/0/0");
                 ChannelLayout=__T("R");
             }
-            if (List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("c") || List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("mono"))
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("c") || List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("mono"))
             {
                 ChannelPositions=__T("Front: C");
                 ChannelPositions2=__T("1/0/0");
                 ChannelLayout=__T("C");
             }
-            if (List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("lf") || List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("lfe") || List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("sub"))
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("lf") || List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("lfe") || List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("sub"))
             {
                 ChannelPositions=__T("LFE");
                 ChannelPositions2=__T(".1");
                 ChannelLayout=__T("LFE");
             }
-            if (List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("ls"))
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("ls"))
             {
                 ChannelPositions=__T("Side: L");
                 ChannelPositions2=__T("0/1/0");
                 ChannelLayout=__T("Ls");
             }
-            if (List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("rs"))
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("rs"))
             {
                 ChannelPositions=__T("Side: R");
                 ChannelPositions2=__T("0/1/0");
                 ChannelLayout=__T("Rs");
             }
-            if (List[Pos][List[Pos].size()-1-ChannelLayout_Pos]==__T("b"))
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("lsr"))
+            {
+                ChannelPositions=__T("Back: L");
+                ChannelPositions2=__T("0/0/1");
+                ChannelLayout=__T("Lsr");
+            }
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("rsr"))
+            {
+                ChannelPositions=__T("Back: R");
+                ChannelPositions2=__T("0/0/1");
+                ChannelLayout=__T("Rsr");
+            }
+            else if (List[Pos2][List[Pos2].size()-1-ChannelLayout_Pos]==__T("b"))
             {
                 ChannelPositions=__T("Back: C");
                 ChannelPositions2=__T("0/0/1");
                 ChannelLayout=__T("Cs");
             }
 
-            Sequences[Iterators[Pos]]->Infos["ChannelPositions"]=ChannelPositions;
-            Sequences[Iterators[Pos]]->Infos["ChannelPositions/String2"]=ChannelPositions2;
-            Sequences[Iterators[Pos]]->Infos["ChannelLayout"]=ChannelLayout;
+            Sequences[Pos2]->Infos["ChannelPositions"]=ChannelPositions;
+            Sequences[Pos2]->Infos["ChannelPositions/String2"]=ChannelPositions2;
+            Sequences[Pos2]->Infos["ChannelLayout"]=ChannelLayout;
         }
-
-    //Language
-    if (Language_Pos!=(size_t)-1)
-        for (size_t Pos=0; Pos<List.size(); Pos++)
-            if (1+Language_Pos<List[Pos].size())
+        
+        //Language
+        if (Language_Pos!=(size_t)-1)
+            if (1+Language_Pos<List[Pos2].size())
             {
                 Ztring Language;
-                if (List[Pos][List[Pos].size()-1-Language_Pos]==__T("ara"))
+                if (List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("ara"))
                     Language=__T("ar");
-                if (List[Pos][List[Pos].size()-1-Language_Pos]==__T("deu"))
+                else if (List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("deu") || List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("ger"))
                     Language=__T("de");
-                if (List[Pos][List[Pos].size()-1-Language_Pos]==__T("eng"))
+                else if (List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("eng"))
                     Language=__T("en");
-                if (List[Pos][List[Pos].size()-1-Language_Pos]==__T("fra") || List[Pos][List[Pos].size()-1-Language_Pos]==__T("fre"))
+                else if (List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("fra") || List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("fre"))
                     Language=__T("fr");
-                if (List[Pos][List[Pos].size()-1-Language_Pos]==__T("ita"))
+                else if (List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("ita"))
                     Language=__T("it");
-                if (List[Pos][List[Pos].size()-1-Language_Pos]==__T("jpn"))
+                else if (List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("jpn"))
                     Language=__T("ja");
-                if (List[Pos][List[Pos].size()-1-Language_Pos]==__T("rus"))
+                else if (List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("las")) //Latin America Spanish
+                    Language=__T("es-419");
+                else if (List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("rus"))
                     Language=__T("ru");
-                if (List[Pos][List[Pos].size()-1-Language_Pos]==__T("spa"))
+                else if (List[Pos2][List[Pos2].size()-1-Language_Pos]==__T("spa"))
                     Language=__T("es");
 
-                if (!Language.empty())
-                    Sequences[Iterators[Pos]]->Infos["Language"]=Language;
+                Sequences[Pos2]->Infos["Language"]=Language.empty()?List[Pos2][List[Pos2].size()-1-Language_Pos]:Language;
             }
+    }
 }
 
 //***************************************************************************
diff --git a/Source/MediaInfo/Reader/Reader_libcurl.cpp b/Source/MediaInfo/Reader/Reader_libcurl.cpp
index d2f2b92..9e737db 100644
--- a/Source/MediaInfo/Reader/Reader_libcurl.cpp
+++ b/Source/MediaInfo/Reader/Reader_libcurl.cpp
@@ -64,7 +64,7 @@ namespace MediaInfoLib
 namespace Http
 {
     //Helpers
-    void CutHead(std::string &Input, std::string &Output, std::string Delimiter)
+   static  void CutHead(std::string &Input, std::string &Output, const std::string& Delimiter)
     {
         // Remove the delimiter and everything that precedes
         size_t Delimiter_Pos = Input.find(Delimiter);
@@ -75,7 +75,7 @@ namespace Http
             Input           = Input.substr(Begin, Input.size() - Begin);
         }
     }
-    void CutTail(std::string &Input, std::string &Output, const std::string &Delimiter, bool KeepDelimiter=false)
+    static void CutTail(std::string &Input, std::string &Output, const std::string &Delimiter, bool KeepDelimiter=false)
     {
         // Remove the delimiter and everything that follows
         size_t Delimiter_Pos = Input.find(Delimiter);
@@ -518,7 +518,7 @@ Ztring Reader_libcurl_ExpandFileName(const Ztring &FileName)
         if (env)
             FileName_Modified.FindAndReplace(__T("$HOME"), Ztring().From_Local(env));
     }
-    if (FileName_Modified.find(__T("~"))==0)
+    if (FileName_Modified.find(__T('~'))==0)
     {
         char* env=getenv("HOME");
         if (env)
@@ -1114,7 +1114,7 @@ size_t Reader_libcurl::Format_Test_PerParser_Continue (MediaInfo_Internal* MI)
                         MessageString.From_Local(curl_easy_strerror(Result));
                     if (Result==CURLE_PEER_FAILED_VERIFICATION)
                     {
-                        size_t Protocol_Limit=Curl_Data->File_Name.find(__T(":"));
+                        size_t Protocol_Limit=Curl_Data->File_Name.find(__T(':'));
                         if (Protocol_Limit!=string::npos)
                         {
                             Ztring Protocol=Curl_Data->File_Name;
diff --git a/Source/MediaInfo/Tag/File_ApeTag.cpp b/Source/MediaInfo/Tag/File_ApeTag.cpp
index 97b49e9..ab96fb7 100644
--- a/Source/MediaInfo/Tag/File_ApeTag.cpp
+++ b/Source/MediaInfo/Tag/File_ApeTag.cpp
@@ -156,7 +156,7 @@ void File_ApeTag::Data_Parse()
     else if (Key=="COPYRIGHT")      Fill(Stream_General, 0, General_Copyright, Value);
     else if (Key=="DISK")
     {
-                                    if (Value.find(__T("/"))!=Error)
+                                    if (Value.find(__T('/'))!=Error)
                                     {
                                         Fill(Stream_General, 0, General_Part_Position_Total, Value.SubString(__T("/"), __T("")));
                                         Fill(Stream_General, 0, General_Part_Position, Value.SubString(__T(""), __T("/")));
@@ -170,7 +170,7 @@ void File_ApeTag::Data_Parse()
     else if (Key=="TITLE")          Fill(Stream_General, 0, General_Title, Value);
     else if (Key=="TRACK")
     {
-                                    if (Value.find(__T("/"))!=Error)
+                                    if (Value.find(__T('/'))!=Error)
                                     {
                                         Fill(Stream_General, 0, General_Track_Position_Total, Value.SubString(__T("/"), __T("")));
                                         Fill(Stream_General, 0, General_Track_Position, Value.SubString(__T(""), __T("/")));
diff --git a/Source/MediaInfo/Tag/File_Id3v2.cpp b/Source/MediaInfo/Tag/File_Id3v2.cpp
index 02c63e4..f334e63 100644
--- a/Source/MediaInfo/Tag/File_Id3v2.cpp
+++ b/Source/MediaInfo/Tag/File_Id3v2.cpp
@@ -1188,7 +1188,7 @@ void File_Id3v2::Fill_Name()
         case Elements::TCOM : Fill(Stream_General, 0, General_Composer, Element_Value); break;
         case Elements::TCON :
                               {
-                                if (Element_Value.find(__T("("))==0)
+                                if (Element_Value.find(__T('('))==0)
                                     Element_Value=Element_Value.SubString(__T("("), __T(")")); //Replace (nn) by nn
                                 if (Element_Value==__T("0") || Element_Value==__T("255"))
                                     Element_Value.clear();
@@ -1330,7 +1330,7 @@ void File_Id3v2::Fill_Name()
         case Elements::TCM  : Fill(Stream_General, 0, "Composer", Element_Value); break;
         case Elements::TCO  :
                               {
-                                if (Element_Value.find(__T("("))==0)
+                                if (Element_Value.find(__T('('))==0)
                                     Element_Value=Element_Value.SubString(__T("("), __T(")")); //Replace (nn) by nn
                                 if (Element_Value==__T("0") || Element_Value==__T("255"))
                                     Element_Value.clear();
diff --git a/Source/MediaInfo/Tag/File_VorbisCom.cpp b/Source/MediaInfo/Tag/File_VorbisCom.cpp
index 8673b8a..9ed9dd6 100644
--- a/Source/MediaInfo/Tag/File_VorbisCom.cpp
+++ b/Source/MediaInfo/Tag/File_VorbisCom.cpp
@@ -122,7 +122,7 @@ void File_VorbisCom::FileHeader_Parse()
                 if (Library_Date.size()>9)
                 {
                     Library_Version=Library_Date.substr(9, std::string::npos);
-                    if (Library_Version.find(__T("("))==std::string::npos)
+                    if (Library_Version.find(__T('('))==std::string::npos)
                     {
                         Library_Version.FindAndReplace(__T(" "), __T("."), 0, Ztring_Recursive);
                         Library_Date.resize(8);
diff --git a/Source/MediaInfo/Tag/File_Xmp.cpp b/Source/MediaInfo/Tag/File_Xmp.cpp
index 38a0484..5262ae1 100644
--- a/Source/MediaInfo/Tag/File_Xmp.cpp
+++ b/Source/MediaInfo/Tag/File_Xmp.cpp
@@ -74,9 +74,7 @@ bool File_Xmp::FileHeader_Begin()
         //RDF item
         if (!strcmp(Rdf_Item->Value(), (NameSpace+"Description").c_str()))
         {
-            const char* Attribute;
-
-            Attribute=Rdf_Item->Attribute("xmlns:pdfaid");
+            const char* Attribute=Rdf_Item->Attribute("xmlns:pdfaid");
             if (Attribute)
             {
                 string Profile;
diff --git a/Source/MediaInfo/Tag/File__Tags.h b/Source/MediaInfo/Tag/File__Tags.h
index 7347ec8..3276299 100644
--- a/Source/MediaInfo/Tag/File__Tags.h
+++ b/Source/MediaInfo/Tag/File__Tags.h
@@ -23,6 +23,30 @@ namespace MediaInfoLib
 {
 
 //***************************************************************************
+// Class File__UnCompressedSize_Helper
+//***************************************************************************
+class File__UnCompressedSize_Helper
+{
+    protected:
+        int64u Duration;
+        int64u UncompressedSize;
+    public:
+        File__UnCompressedSize_Helper() :Duration(0), UncompressedSize(0) {}
+        bool CalcDurationUncompressedSize(int64u Samples, int32u SampleRate, int8u BitsPerSample, int8u Channels)
+        {
+            if (SampleRate == 0)
+                return false;
+            Duration = Samples * 1000 / SampleRate;
+            if (Duration == 0)
+                return false;
+            UncompressedSize = Samples * Channels * BitsPerSample  / 8;
+            if (UncompressedSize == 0)
+                return false;
+            return true;
+        }
+};
+
+//***************************************************************************
 // Class File__Tags_Helper
 //***************************************************************************
 
diff --git a/Source/MediaInfo/Text/File_AribStdB24B37.cpp b/Source/MediaInfo/Text/File_AribStdB24B37.cpp
index 38cd78f..5242b9b 100644
--- a/Source/MediaInfo/Text/File_AribStdB24B37.cpp
+++ b/Source/MediaInfo/Text/File_AribStdB24B37.cpp
@@ -832,7 +832,7 @@ void File_AribStdB24B37::Add (Char Character)
 }
 
 //---------------------------------------------------------------------------
-void File_AribStdB24B37::Add (Ztring Character)
+void File_AribStdB24B37::Add (const Ztring& Character)
 {
     Streams[(size_t)(Element_Code-1)].Line+=Character;
 }
diff --git a/Source/MediaInfo/Text/File_AribStdB24B37.h b/Source/MediaInfo/Text/File_AribStdB24B37.h
index 4834681..ad70e72 100644
--- a/Source/MediaInfo/Text/File_AribStdB24B37.h
+++ b/Source/MediaInfo/Text/File_AribStdB24B37.h
@@ -85,7 +85,7 @@ private :
     void data_unit_data(int64u End);
     void Character(int16u CharacterSet, int8u G_Value, int8u FirstByte, int8u SecondByte);
     void Add(Char Character);
-    void Add(Ztring Character);
+    void Add(const Ztring& Character);
     void DefaultMacro();
     void control_code();
     void NUL();
diff --git a/Source/MediaInfo/Text/File_DvbSubtitle.cpp b/Source/MediaInfo/Text/File_DvbSubtitle.cpp
index 0dccd30..7d1d709 100644
--- a/Source/MediaInfo/Text/File_DvbSubtitle.cpp
+++ b/Source/MediaInfo/Text/File_DvbSubtitle.cpp
@@ -392,10 +392,11 @@ void File_DvbSubtitle::region_composition_segment()
     }
 
     FILLING_BEGIN();
-        subtitle_streams[subtitle_stream_id].pages[page_id].regions[region_id].region_composition_segment=true;
-        subtitle_streams[subtitle_stream_id].pages[page_id].regions[region_id].region_width=region_width;
-        subtitle_streams[subtitle_stream_id].pages[page_id].regions[region_id].region_height=region_height;
-        subtitle_streams[subtitle_stream_id].pages[page_id].regions[region_id].region_depth=region_depth;
+        region_data& region = subtitle_streams[subtitle_stream_id].pages[page_id].regions[region_id];
+        region.region_composition_segment=true;
+        region.region_width=region_width;
+        region.region_height=region_height;
+        region.region_depth=region_depth;
     FILLING_END();
 }
 
diff --git a/Source/MediaInfo/Text/File_Ttml.cpp b/Source/MediaInfo/Text/File_Ttml.cpp
index 65b8c8f..4337c53 100644
--- a/Source/MediaInfo/Text/File_Ttml.cpp
+++ b/Source/MediaInfo/Text/File_Ttml.cpp
@@ -226,10 +226,8 @@ void File_Ttml::Read_Buffer_Continue()
             //p
             if (!strcmp(p->Value(), "p"))
             {
-                const char* Attribute;
-
                 int64u DTS_Begin=(int64u)-1;
-                Attribute=p->Attribute("begin");
+                const char* Attribute=p->Attribute("begin");
                 if (Attribute)
                     DTS_Begin=Ttml_str2timecode(Attribute);
                 int64u DTS_End=(int64u)-1;
@@ -255,7 +253,7 @@ void File_Ttml::Read_Buffer_Continue()
                         if (Span_Begin==string::npos)
                             break;
                         
-                        size_t Span_End=Content.find(__T(">"), Span_Begin+5);
+                        size_t Span_End=Content.find(__T('>'), Span_Begin+5);
                         if (Span_End==string::npos)
                             break;
 
@@ -272,7 +270,7 @@ void File_Ttml::Read_Buffer_Continue()
                         if (Span_Begin==string::npos)
                             break;
                         
-                        size_t Span_End=Content.find(__T(">"), Span_Begin+5);
+                        size_t Span_End=Content.find(__T('>'), Span_Begin+5);
                         if (Span_End==string::npos)
                             break;
 
diff --git a/Source/MediaInfo/TimeCode.h b/Source/MediaInfo/TimeCode.h
index 7dccfd2..3215505 100644
--- a/Source/MediaInfo/TimeCode.h
+++ b/Source/MediaInfo/TimeCode.h
@@ -62,14 +62,7 @@ public:
     }
     bool operator!= (const TimeCode &tc) const
     {
-        return Hours                !=tc.Hours
-            || Minutes              !=tc.Minutes
-            || Seconds              !=tc.Seconds
-            || Frames               !=tc.Frames
-            || FramesPerSecond      !=tc.FramesPerSecond
-            || DropFrame            !=tc.DropFrame
-            || MustUseSecondField   !=tc.MustUseSecondField
-            || IsSecondField        !=tc.IsSecondField;
+        return !(*this == tc);
     }
 
     //Helpers
diff --git a/Source/MediaInfo/Video/File_Avc.cpp b/Source/MediaInfo/Video/File_Avc.cpp
index 4c4fd7b..5931be0 100644
--- a/Source/MediaInfo/Video/File_Avc.cpp
+++ b/Source/MediaInfo/Video/File_Avc.cpp
@@ -3084,7 +3084,7 @@ void File_Avc::sei_message_user_data_unregistered_x264(int32u payloadSize)
             Encoded_Library_Settings.clear();
             do
             {
-                size_t Options_Pos=Data.find(__T(" "), Options_Pos_Before);
+                size_t Options_Pos=Data.find(__T(' '), Options_Pos_Before);
                 if (Options_Pos==std::string::npos)
                     Options_Pos=Data.size();
                 Ztring option;
diff --git a/Source/MediaInfo/Video/File_Avc.h b/Source/MediaInfo/Video/File_Avc.h
index 9cc34e5..df0422a 100644
--- a/Source/MediaInfo/Video/File_Avc.h
+++ b/Source/MediaInfo/Video/File_Avc.h
@@ -56,6 +56,7 @@ public :
 
 private :
     File_Avc(const File_Avc &File_Avc); //No copy
+    File_Avc &operator =(const File_Avc &);
 
     //Structures - seq_parameter_set
     struct seq_parameter_set_struct
@@ -84,17 +85,6 @@ private :
                         //initial_cpb_removal_delay_offset(initial_cpb_removal_delay_offset_)
                     {
                     }
-
-                    xxl_data &operator=(const xxl_data &x)
-                    {
-                        bit_rate_value=x.bit_rate_value;
-                        cpb_size_value=x.cpb_size_value;
-                        cbr_flag=x.cbr_flag;
-                        //initial_cpb_removal_delay=x.initial_cpb_removal_delay;
-                        //initial_cpb_removal_delay_offset=x.initial_cpb_removal_delay_offset;
-                        return *this;
-                    }
-
                 private:
                     xxl_data();
                 };
@@ -113,20 +103,10 @@ private :
                     time_offset_length(time_offset_length_)
                 {
                 }
-
-                xxl &operator=(const xxl &x)
-                {
-                    SchedSel=x.SchedSel;
-                    initial_cpb_removal_delay_length_minus1=x.initial_cpb_removal_delay_length_minus1;
-                    cpb_removal_delay_length_minus1=x.cpb_removal_delay_length_minus1;
-                    dpb_output_delay_length_minus1=x.dpb_output_delay_length_minus1;
-                    time_offset_length=x.time_offset_length;
-
-                    return *this;
-                }
-
             private:
                 xxl();
+                xxl &operator =(const xxl &);
+                xxl(const xxl &);
             };
             struct bitstream_restriction_struct
             {
@@ -137,14 +117,6 @@ private :
                     max_num_reorder_frames(max_num_reorder_frames_)
                 {
                 }
-
-                bitstream_restriction_struct &operator=(const bitstream_restriction_struct &b)
-                {
-                    max_num_reorder_frames=b.max_num_reorder_frames;
-
-                    return *this;
-                }
-
             private:
                 bitstream_restriction_struct();
             };
@@ -201,6 +173,7 @@ private :
 
         private:
             vui_parameters_struct &operator=(const vui_parameters_struct &v);
+            vui_parameters_struct(const vui_parameters_struct &);
             vui_parameters_struct();
         };
         vui_parameters_struct* vui_parameters;
@@ -297,6 +270,7 @@ private :
 
     private:
         seq_parameter_set_struct &operator=(const seq_parameter_set_struct &v);
+        seq_parameter_set_struct(const seq_parameter_set_struct &);
         seq_parameter_set_struct();
     };
     typedef vector<seq_parameter_set_struct*> seq_parameter_set_structs;
@@ -350,6 +324,7 @@ private :
 
     private:
         pic_parameter_set_struct &operator=(const pic_parameter_set_struct &v);
+        pic_parameter_set_struct(const pic_parameter_set_struct &);
         pic_parameter_set_struct();
     };
     typedef vector<pic_parameter_set_struct*> pic_parameter_set_structs;
diff --git a/Source/MediaInfo/Video/File_Avc_Duplicate.cpp b/Source/MediaInfo/Video/File_Avc_Duplicate.cpp
index da39b51..4cc9e20 100644
--- a/Source/MediaInfo/Video/File_Avc_Duplicate.cpp
+++ b/Source/MediaInfo/Video/File_Avc_Duplicate.cpp
@@ -204,7 +204,7 @@ void File_Avc::File__Duplicate_Write (int64u Element_Code, int32u frame_num)
     }
     else if (frame_num!=(int32u)-1)
     {
-        if (frame_num!=frame_num_Old && frame_num_Old!=(int32u)-1 && frame_num!=(int32u)-1)
+        if (frame_num!=frame_num_Old && frame_num_Old!=(int32u)-1)
         {
             // Form:
             //  8 bytes : PTS
diff --git a/Source/MediaInfo/Video/File_Ffv1.cpp b/Source/MediaInfo/Video/File_Ffv1.cpp
index 8e27164..cce7eb5 100644
--- a/Source/MediaInfo/Video/File_Ffv1.cpp
+++ b/Source/MediaInfo/Video/File_Ffv1.cpp
@@ -1117,10 +1117,13 @@ int File_Ffv1::slice(states &States)
     if (!coder_type && ((version == 3 && micro_version > 1) || version > 3))
         BS_End();
 
-    if (coder_type && version > 2)
+    if (coder_type)
     {
-        int8u s = 129;
-        RC->get_rac(&s);
+        if (version > 2)
+        {
+            int8u s = 129;
+            RC->get_rac(&s);
+        }
         Element_Offset+=RC->BytesUsed();
     }
 
@@ -1597,7 +1600,7 @@ void File_Ffv1::read_quant_table(int i, int j, size_t scale)
             return;
         }
 
-        for (size_t a=0; a<=len_minus1; a++)
+        for (int32u a=0; a<=len_minus1; a++)
         {
             quant_tables[i][j][k] = scale * v;
             k++;
diff --git a/Source/MediaInfo/Video/File_Hevc.cpp b/Source/MediaInfo/Video/File_Hevc.cpp
index ef56525..d162eb0 100644
--- a/Source/MediaInfo/Video/File_Hevc.cpp
+++ b/Source/MediaInfo/Video/File_Hevc.cpp
@@ -1993,7 +1993,7 @@ void File_Hevc::sei_message_user_data_unregistered_x265(int32u payloadSize)
             Encoded_Library_Settings.clear();
             while (Options_Pos_Before!=Data.size())
             {
-                size_t Options_Pos=Data.find(__T(" "), Options_Pos_Before);
+                size_t Options_Pos=Data.find(__T(' '), Options_Pos_Before);
                 if (Options_Pos==std::string::npos)
                     Options_Pos=Data.size();
                 Ztring option;
@@ -2035,7 +2035,7 @@ void File_Hevc::sei_message_user_data_unregistered_x265(int32u payloadSize)
                     Value.erase(Value.begin());
                 while (!Value.empty() && Value[Value.size()-1]<0x30)
                     Value.erase(Value.end()-1);
-                size_t Value_Pos=Value.find(__T(" "));
+                size_t Value_Pos=Value.find(__T(' '));
                 if (Value_Pos!=string::npos)
                     Value.resize(Value_Pos);
                 Encoded_Library=Value;
diff --git a/Source/MediaInfo/Video/File_Hevc.h b/Source/MediaInfo/Video/File_Hevc.h
index d7e6157..1343716 100644
--- a/Source/MediaInfo/Video/File_Hevc.h
+++ b/Source/MediaInfo/Video/File_Hevc.h
@@ -37,6 +37,8 @@ public :
 
 private :
     File_Hevc(const File_Hevc &File_Hevc); //No copy
+    File_Hevc &operator =(const File_Hevc &); //No copy
+
 
     //Structures - video_parameter_set
     struct video_parameter_set_struct
@@ -67,6 +69,7 @@ private :
 
     private:
         video_parameter_set_struct &operator=(const video_parameter_set_struct &v);
+        video_parameter_set_struct(const video_parameter_set_struct &a);
         video_parameter_set_struct();
     };
     typedef vector<video_parameter_set_struct*> video_parameter_set_structs;
@@ -99,16 +102,6 @@ private :
                     {
                     }
 
-                    xxl_data &operator=(const xxl_data &x)
-                    {
-                        bit_rate_value = x.bit_rate_value;
-                        cpb_size_value = x.cpb_size_value;
-                        cbr_flag = x.cbr_flag;
-                        //initial_cpb_removal_delay=x.initial_cpb_removal_delay;
-                        //initial_cpb_removal_delay_offset=x.initial_cpb_removal_delay_offset;
-                        return *this;
-                    }
-
                 private:
                     xxl_data();
                 };
@@ -119,15 +112,9 @@ private :
                     SchedSel(SchedSel_)
                 {
                 }
-
-                xxl &operator=(const xxl &x)
-                {
-                    SchedSel = x.SchedSel;
-
-                    return *this;
-                }
-
             private:
+                xxl &operator=(const xxl &x);
+                xxl(const xxl &);
                 xxl();
             };
             struct xxl_common
@@ -151,18 +138,6 @@ private :
                 {
                 }
 
-                xxl_common &operator=(const xxl_common &x)
-                {
-                    sub_pic_hrd_params_present_flag = x.sub_pic_hrd_params_present_flag;
-                    du_cpb_removal_delay_increment_length_minus1 = x.du_cpb_removal_delay_increment_length_minus1;
-                    dpb_output_delay_du_length_minus1 = x.dpb_output_delay_du_length_minus1;
-                    initial_cpb_removal_delay_length_minus1 = x.initial_cpb_removal_delay_length_minus1;
-                    au_cpb_removal_delay_length_minus1 = x.au_cpb_removal_delay_length_minus1;
-                    dpb_output_delay_length_minus1 = x.dpb_output_delay_length_minus1;
-
-                    return *this;
-                }
-
             private:
                 xxl_common();
             };
@@ -217,6 +192,7 @@ private :
 
         private:
             vui_parameters_struct &operator=(const vui_parameters_struct &v);
+            vui_parameters_struct(const vui_parameters_struct &);
             vui_parameters_struct();
         };
         vui_parameters_struct* vui_parameters;
@@ -290,6 +266,7 @@ private :
 
     private:
         seq_parameter_set_struct &operator=(const seq_parameter_set_struct &v);
+        seq_parameter_set_struct(const seq_parameter_set_struct &);
         seq_parameter_set_struct();
     };
     typedef vector<seq_parameter_set_struct*> seq_parameter_set_structs;
@@ -331,6 +308,7 @@ private :
 
     private:
         pic_parameter_set_struct &operator=(const pic_parameter_set_struct &v);
+        pic_parameter_set_struct(const pic_parameter_set_struct &a);
         pic_parameter_set_struct();
     };
     typedef vector<pic_parameter_set_struct*> pic_parameter_set_structs;
diff --git a/Source/MediaInfo/Video/File_Mpeg4v.cpp b/Source/MediaInfo/Video/File_Mpeg4v.cpp
index 7153531..0300887 100644
--- a/Source/MediaInfo/Video/File_Mpeg4v.cpp
+++ b/Source/MediaInfo/Video/File_Mpeg4v.cpp
@@ -1215,7 +1215,7 @@ void File_Mpeg4v::video_object_layer_start()
     }
 
     //Coherancy
-    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))
+    if (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();
diff --git a/Source/MediaInfoDLL/MediaInfoDLL.py b/Source/MediaInfoDLL/MediaInfoDLL.py
index b09ae93..9b4a8e3 100644
--- a/Source/MediaInfoDLL/MediaInfoDLL.py
+++ b/Source/MediaInfoDLL/MediaInfoDLL.py
@@ -101,6 +101,30 @@ class MediaInfo:
     MediaInfo_Open_Buffer.argtypes = [c_void_p, c_void_p, c_size_t, c_void_p, c_size_t]
     MediaInfo_Open_Buffer.restype = c_size_t
 
+    #/** @brief Wrapper for MediaInfoLib::MediaInfo::Open (with a buffer, Init) */
+    #MEDIAINFO_EXP size_t            __stdcall MediaInfo_Open_Buffer_Init (void* Handle, MediaInfo_int64u File_Size, MediaInfo_int64u File_Offset);
+    MediaInfo_Open_Buffer_Init = MediaInfoDLL_Handler.MediaInfo_Open_Buffer_Init
+    MediaInfo_Open_Buffer_Init.argtypes = [c_void_p, c_uint64, c_uint64]
+    MediaInfo_Open_Buffer_Init.restype = c_size_t
+
+    #/** @brief Wrapper for MediaInfoLib::MediaInfo::Open (with a buffer, Continue) */
+    #MEDIAINFO_EXP size_t            __stdcall MediaInfo_Open_Buffer_Continue (void* Handle, MediaInfo_int8u* Buffer, size_t Buffer_Size);
+    MediaInfo_Open_Buffer_Continue = MediaInfoDLL_Handler.MediaInfo_Open_Buffer_Continue
+    MediaInfo_Open_Buffer_Continue.argtypes = [c_void_p, c_char_p, c_size_t]
+    MediaInfo_Open_Buffer_Continue.restype = c_size_t
+
+    #/** @brief Wrapper for MediaInfoLib::MediaInfo::Open (with a buffer, Continue_GoTo_Get) */
+    #MEDIAINFO_EXP MediaInfo_int64u  __stdcall MediaInfo_Open_Buffer_Continue_GoTo_Get (void* Handle);
+    MediaInfo_Open_Buffer_Continue_GoTo_Get = MediaInfoDLL_Handler.MediaInfo_Open_Buffer_Continue_GoTo_Get
+    MediaInfo_Open_Buffer_Continue_GoTo_Get.argtypes = [c_void_p]
+    MediaInfo_Open_Buffer_Continue_GoTo_Get.restype = c_uint64
+
+    #/** @brief Wrapper for MediaInfoLib::MediaInfo::Open (with a buffer, Finalize) */
+    #MEDIAINFO_EXP size_t            __stdcall MediaInfo_Open_Buffer_Finalize (void* Handle);
+    MediaInfo_Open_Buffer_Finalize = MediaInfoDLL_Handler.MediaInfo_Open_Buffer_Finalize
+    MediaInfo_Open_Buffer_Finalize.argtypes = [c_void_p]
+    MediaInfo_Open_Buffer_Finalize.restype = c_size_t
+
     #/** @brief Wrapper for MediaInfoLib::MediaInfo::Save */
     #MEDIAINFO_EXP size_t       __stdcall MediaInfo_Save (void* Handle);
     MediaInfo_Save = MediaInfoDLL_Handler.MediaInfo_Save
@@ -196,6 +220,14 @@ class MediaInfo:
             return self.MediaInfo_Open (self.Handle, File);
     def Open_Buffer(self, Begin, Begin_Size, End=None, End_Size=0):
         return self.MediaInfo_Open_Buffer(self.Handle, Begin, Begin_Size, End, End_Size)
+    def Open_Buffer_Init(self, File_Size, File_Offset=0):
+        return self.MediaInfo_Open_Buffer_Init(self.Handle, File_Size, File_Offset)
+    def Open_Buffer_Continue(self, Buffer, Buffer_Size):
+        return self.MediaInfo_Open_Buffer_Continue(self.Handle, Buffer, Buffer_Size)
+    def Open_Buffer_Continue_GoTo_Get(self):
+        return self.MediaInfo_Open_Buffer_Continue_GoTo_Get(self.Handle)
+    def Open_Buffer_Finalize(self):
+        return self.MediaInfo_Open_Buffer_Finalize(self.Handle)
     def Save(self):
         return self.MediaInfo_Save(self.Handle)
     def Close(self):
diff --git a/Source/MediaInfoDLL/MediaInfoDLL3.py b/Source/MediaInfoDLL/MediaInfoDLL3.py
index 0bb88b8..5caaf2e 100644
--- a/Source/MediaInfoDLL/MediaInfoDLL3.py
+++ b/Source/MediaInfoDLL/MediaInfoDLL3.py
@@ -100,6 +100,30 @@ class MediaInfo:
     MediaInfo_Open_Buffer.argtypes = [c_void_p, c_void_p, c_size_t, c_void_p, c_size_t]
     MediaInfo_Open_Buffer.restype = c_size_t
 
+    #/** @brief Wrapper for MediaInfoLib::MediaInfo::Open (with a buffer, Init) */
+    #MEDIAINFO_EXP size_t            __stdcall MediaInfo_Open_Buffer_Init (void* Handle, MediaInfo_int64u File_Size, MediaInfo_int64u File_Offset);
+    MediaInfo_Open_Buffer_Init = MediaInfoDLL_Handler.MediaInfo_Open_Buffer_Init
+    MediaInfo_Open_Buffer_Init.argtypes = [c_void_p, c_uint64, c_uint64]
+    MediaInfo_Open_Buffer_Init.restype = c_size_t
+
+    #/** @brief Wrapper for MediaInfoLib::MediaInfo::Open (with a buffer, Continue) */
+    #MEDIAINFO_EXP size_t            __stdcall MediaInfo_Open_Buffer_Continue (void* Handle, MediaInfo_int8u* Buffer, size_t Buffer_Size);
+    MediaInfo_Open_Buffer_Continue = MediaInfoDLL_Handler.MediaInfo_Open_Buffer_Continue
+    MediaInfo_Open_Buffer_Continue.argtypes = [c_void_p, c_char_p, c_size_t]
+    MediaInfo_Open_Buffer_Continue.restype = c_size_t
+
+    #/** @brief Wrapper for MediaInfoLib::MediaInfo::Open (with a buffer, Continue_GoTo_Get) */
+    #MEDIAINFO_EXP MediaInfo_int64u  __stdcall MediaInfo_Open_Buffer_Continue_GoTo_Get (void* Handle);
+    MediaInfo_Open_Buffer_Continue_GoTo_Get = MediaInfoDLL_Handler.MediaInfo_Open_Buffer_Continue_GoTo_Get
+    MediaInfo_Open_Buffer_Continue_GoTo_Get.argtypes = [c_void_p]
+    MediaInfo_Open_Buffer_Continue_GoTo_Get.restype = c_uint64
+
+    #/** @brief Wrapper for MediaInfoLib::MediaInfo::Open (with a buffer, Finalize) */
+    #MEDIAINFO_EXP size_t            __stdcall MediaInfo_Open_Buffer_Finalize (void* Handle);
+    MediaInfo_Open_Buffer_Finalize = MediaInfoDLL_Handler.MediaInfo_Open_Buffer_Finalize
+    MediaInfo_Open_Buffer_Finalize.argtypes = [c_void_p]
+    MediaInfo_Open_Buffer_Finalize.restype = c_size_t
+
     #/** @brief Wrapper for MediaInfoLib::MediaInfo::Save */
     #MEDIAINFO_EXP size_t       __stdcall MediaInfo_Save (void* Handle);
     MediaInfo_Save = MediaInfoDLL_Handler.MediaInfo_Save
@@ -194,6 +218,14 @@ class MediaInfo:
             return self.MediaInfo_Open (self.Handle, File);
     def Open_Buffer(self, Begin, Begin_Size, End=None, End_Size=0):
         return self.MediaInfo_Open_Buffer(self.Handle, Begin, Begin_Size, End, End_Size)
+    def Open_Buffer_Init(self, File_Size, File_Offset=0):
+        return self.MediaInfo_Open_Buffer_Init(self.Handle, File_Size, File_Offset)
+    def Open_Buffer_Continue(self, Buffer, Buffer_Size):
+        return self.MediaInfo_Open_Buffer_Continue(self.Handle, Buffer, Buffer_Size)
+    def Open_Buffer_Continue_GoTo_Get(self):
+        return self.MediaInfo_Open_Buffer_Continue_GoTo_Get(self.Handle)
+    def Open_Buffer_Finalize(self):
+        return self.MediaInfo_Open_Buffer_Finalize(self.Handle)
     def Save(self):
         return self.MediaInfo_Save(self.Handle)
     def Close(self):
diff --git a/Source/Resource/Text/Language/DefaultLanguage.csv b/Source/Resource/Text/Language/DefaultLanguage.csv
index 09b9e51..8cb39a5 100644
--- a/Source/Resource/Text/Language/DefaultLanguage.csv
+++ b/Source/Resource/Text/Language/DefaultLanguage.csv
@@ -672,6 +672,7 @@ Language_en-gb;English (Great Britain)
 Language_en-us;English (United States)
 Language_eo;Esperanto
 Language_es;Spanish
+Language_es-419;Spanish (Latin America)
 Language_et;Estonian
 Language_eu;Basque
 Language_fa;Persian
diff --git a/Source/ThirdParty/base64/base64.h b/Source/ThirdParty/base64/base64.h
index 40a340c..0bed6cf 100644
--- a/Source/ThirdParty/base64/base64.h
+++ b/Source/ThirdParty/base64/base64.h
@@ -29,13 +29,17 @@ namespace Base64 {
     @return Base64 encoded string
 */
 inline std::string Base64::encode(const std::string &sString) {
-  static const std::string sBase64Table(
-  // 0000000000111111111122222222223333333333444444444455555555556666
-  // 0123456789012345678901234567890123456789012345678901234567890123
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
-  );
-  static const char cFillChar = '=';
-  std::string::size_type   nLength = sString.length();
+   static const char sBase64Table[64] =
+    { 'A','B','C','D','E','F','G','H',
+        'I','J','K','L','M','N','O','P',
+        'Q','R','S','T','U','V','W','X',
+        'Y','Z','a','b','c','d','e','f',
+        'g','h','i','j','k','l','m','n',
+        'o','p','q','r','s','t','u','v',
+        'w','x','y','z','0','1','2','3',
+        '4','5','6','7','8','9','+','/' };
+  const char cFillChar = '=';
+  const std::string::size_type   nLength = sString.length();
   std::string              sResult;
 
   // Allocate memory for the converted string

-- 
libmediainfo packaging



More information about the pkg-multimedia-commits mailing list