diff --git a/codeblocks/dvda-author.w10.cbp b/codeblocks/dvda-author.w10.cbp
index 7cfe414aa..5e779fc7b 100755
--- a/codeblocks/dvda-author.w10.cbp
+++ b/codeblocks/dvda-author.w10.cbp
@@ -11,7 +11,7 @@
-
+
@@ -22,7 +22,7 @@
-
+
@@ -217,6 +217,7 @@
+
@@ -237,6 +238,9 @@
+
+
+
diff --git a/codeblocks/dvda-author.w10.depend b/codeblocks/dvda-author.w10.depend
index 2665ded2b..f2e6b2639 100755
--- a/codeblocks/dvda-author.w10.depend
+++ b/codeblocks/dvda-author.w10.depend
@@ -1,5 +1,5 @@
# depslib dependency file v1.0
-1598401089 source:c:\users\public\dev\dvda-author\libfixwav\src\checkdata.c
+1598560434 source:c:\users\public\dev\dvda-author\libfixwav\src\checkdata.c
@@ -20,7 +20,7 @@
"winport.h"
"structures.h"
-1598084683 c:\users\public\dev\dvda-author\libutils\src\include\libiberty.h
+1598560439 c:\users\public\dev\dvda-author\libutils\src\include\libiberty.h
"strdup.h"
"getopt.h"
"getopt_int.h"
@@ -30,38 +30,38 @@
"strnlen.h"
"getsubopt.h"
-1598084683 c:\users\public\dev\dvda-author\libiberty\src\include\strdup.h
+1598560435 c:\users\public\dev\dvda-author\libiberty\src\include\strdup.h
-1598084683 c:\users\public\dev\dvda-author\libiberty\src\include\getopt.h
+1598560435 c:\users\public\dev\dvda-author\libiberty\src\include\getopt.h
-1598084683 c:\users\public\dev\dvda-author\libiberty\src\include\getopt_int.h
+1598560435 c:\users\public\dev\dvda-author\libiberty\src\include\getopt_int.h
-1598084683 c:\users\public\dev\dvda-author\libiberty\src\include\strchrnul.h
+1598560435 c:\users\public\dev\dvda-author\libiberty\src\include\strchrnul.h
-1598084683 c:\users\public\dev\dvda-author\libiberty\src\include\strndup.h
+1598560435 c:\users\public\dev\dvda-author\libiberty\src\include\strndup.h
-1598084683 c:\users\public\dev\dvda-author\libiberty\src\include\strnlen.h
+1598560435 c:\users\public\dev\dvda-author\libiberty\src\include\strnlen.h
-1598084683 c:\users\public\dev\dvda-author\libiberty\src\include\getsubopt.h
+1598560435 c:\users\public\dev\dvda-author\libiberty\src\include\getsubopt.h
-1598084683 c:\users\public\dev\dvda-author\libfixwav\src\include\fixwav.h
+1598560434 c:\users\public\dev\dvda-author\libfixwav\src\include\fixwav.h
-1598204541 c:\users\public\dev\dvda-author\libfixwav\src\include\fixwav_auxiliary.h
+1598560434 c:\users\public\dev\dvda-author\libfixwav\src\include\fixwav_auxiliary.h
"fixwav_manager.h"
-1598206028 c:\users\public\dev\dvda-author\libfixwav\src\include\fixwav_manager.h
+1598560435 c:\users\public\dev\dvda-author\libfixwav\src\include\fixwav_manager.h
"c_utils.h"
-1598307742 c:\users\public\dev\dvda-author\libutils\src\include\c_utils.h
+1598628278 c:\users\public\dev\dvda-author\libutils\src\include\c_utils.h
"config.h"
@@ -74,19 +74,19 @@
-1598084700 c:\users\public\dev\dvda-author\src\include\version.h
+1598560485 c:\users\public\dev\dvda-author\src\include\version.h
"config.h"
-1598307276 c:\users\public\dev\dvda-author\src\include\commonvars.h
+1598560484 c:\users\public\dev\dvda-author\src\include\commonvars.h
"config.h"
"libiberty.h"
-1598222720 c:\users\public\dev\dvda-author\libfixwav\src\include\checkdata.h
+1598560434 c:\users\public\dev\dvda-author\libfixwav\src\include\checkdata.h
-1598230924 c:\users\public\dev\dvda-author\libfixwav\src\include\repair.h
+1598560435 c:\users\public\dev\dvda-author\libfixwav\src\include\repair.h
"fixwav_manager.h"
-1598206154 c:\users\public\dev\dvda-author\libutils\src\include\winport.h
+1598560439 c:\users\public\dev\dvda-author\libutils\src\include\winport.h
"config.h"
@@ -102,27 +102,27 @@
"c_utils.h"
-1598451137 c:\users\public\dev\dvda-author\src\include\structures.h
+1598627192 c:\users\public\dev\dvda-author\src\include\structures.h
"stream_decoder.h"
"inttypes.h"
"commonvars.h"
"mlplayout.h"
-1598084683 c:\users\public\dev\dvda-author\libutils\src\include\stream_decoder.h
+1598560439 c:\users\public\dev\dvda-author\libutils\src\include\stream_decoder.h
"export.h"
"format.h"
-1598084683 c:\users\public\dev\dvda-author\libutils\src\include\export.h
+1598560439 c:\users\public\dev\dvda-author\libutils\src\include\export.h
-1598084683 c:\users\public\dev\dvda-author\libutils\src\include\format.h
+1598560439 c:\users\public\dev\dvda-author\libutils\src\include\format.h
"export.h"
"ordinals.h"
-1598084683 c:\users\public\dev\dvda-author\libutils\src\include\ordinals.h
+1598560439 c:\users\public\dev\dvda-author\libutils\src\include\ordinals.h
-1598205811 source:c:\users\public\dev\dvda-author\libfixwav\src\checkparameters.c
+1598560434 source:c:\users\public\dev\dvda-author\libfixwav\src\checkparameters.c
@@ -138,10 +138,10 @@
"structures.h"
"libiberty.h"
-1598204564 c:\users\public\dev\dvda-author\libfixwav\src\include\checkparameters.h
+1598560434 c:\users\public\dev\dvda-author\libfixwav\src\include\checkparameters.h
"fixwav_manager.h"
-1598204989 source:c:\users\public\dev\dvda-author\libfixwav\src\fixwav_auxiliary.c
+1598560434 source:c:\users\public\dev\dvda-author\libfixwav\src\fixwav_auxiliary.c
@@ -154,7 +154,7 @@
"c_utils.h"
"structures.h"
-1598230915 source:c:\users\public\dev\dvda-author\libfixwav\src\manager.c
+1598560435 source:c:\users\public\dev\dvda-author\libfixwav\src\manager.c
@@ -179,10 +179,10 @@
"commonvars.h"
"libiberty.h"
-1598204500 c:\users\public\dev\dvda-author\libfixwav\src\include\readheader.h
+1598560435 c:\users\public\dev\dvda-author\libfixwav\src\include\readheader.h
"fixwav_manager.h"
-1598204375 source:c:\users\public\dev\dvda-author\libfixwav\src\readheader.c
+1598560435 source:c:\users\public\dev\dvda-author\libfixwav\src\readheader.c
@@ -196,7 +196,7 @@
"structures.h"
"libiberty.h"
-1598230915 source:c:\users\public\dev\dvda-author\libfixwav\src\repair.c
+1598560435 source:c:\users\public\dev\dvda-author\libfixwav\src\repair.c
@@ -217,7 +217,7 @@
"structures.h"
"libiberty.h"
-1598084683 source:c:\users\public\dev\dvda-author\libiberty\src\getopt.c
+1598560435 source:c:\users\public\dev\dvda-author\libiberty\src\getopt.c
@@ -228,29 +228,29 @@
"getopt.h"
"getopt_int.h"
-1598084683 source:c:\users\public\dev\dvda-author\libiberty\src\getopt1.c
+1598560435 source:c:\users\public\dev\dvda-author\libiberty\src\getopt1.c
"getopt.h"
"getopt_int.h"
-1598084683 source:c:\users\public\dev\dvda-author\libiberty\src\getsubopt.c
+1598560435 source:c:\users\public\dev\dvda-author\libiberty\src\getsubopt.c
"strchrnul.h"
"getsubopt.h"
-1598084683 source:c:\users\public\dev\dvda-author\libiberty\src\strchrnul.c
+1598560435 source:c:\users\public\dev\dvda-author\libiberty\src\strchrnul.c
"strchrnul.h"
-1598084683 source:c:\users\public\dev\dvda-author\libiberty\src\strnlen.c
+1598560435 source:c:\users\public\dev\dvda-author\libiberty\src\strnlen.c
"strnlen.h"
-1598401089 source:c:\users\public\dev\dvda-author\libutils\src\libc_utils.c
+1598581813 source:c:\users\public\dev\dvda-author\libutils\src\libc_utils.c
"config.h"
@@ -275,9 +275,9 @@
"libiberty.h"
"winport.h"
-1598084683 c:\users\public\dev\dvda-author\libutils\src\private\private_c_utils.h
+1598560439 c:\users\public\dev\dvda-author\libutils\src\private\private_c_utils.h
-1598401089 source:c:\users\public\dev\dvda-author\libutils\src\winport.c
+1598560439 source:c:\users\public\dev\dvda-author\libutils\src\winport.c
"config.h"
"winport.h"
"private_c_utils.h"
@@ -285,7 +285,7 @@
"structures.h"
-1598277387 source:c:\users\public\dev\dvda-author\src\amg2.c
+1598627192 source:c:\users\public\dev\dvda-author\src\amg2.c
"config.h"
"commonvars.h"
@@ -308,7 +308,7 @@
"launch_manager.h"
"asvs.h"
-1598281203 c:\users\public\dev\dvda-author\src\include\auxiliary.h
+1598578588 c:\users\public\dev\dvda-author\src\include\auxiliary.h
"config.h"
@@ -320,7 +320,7 @@
"commonvars.h"
"structures.h"
-1598233435 c:\users\public\dev\dvda-author\src\include\audio2.h
+1598577990 c:\users\public\dev\dvda-author\src\include\audio2.h
@@ -341,16 +341,11 @@
"libsoxconvert.h"
"multichannel.h"
"file_input_parsing.h"
- "mlplayout.h"
- "libavutil/opt.h"
- "libavcodec/avcodec.h"
- "libavformat/avformat.h"
- "libswresample/swresample.h"
"c_utils.h"
"ats.h"
"structures.h"
-1598206294 c:\users\public\dev\dvda-author\src\include\amg.h
+1598560484 c:\users\public\dev\dvda-author\src\include\amg.h
@@ -358,23 +353,23 @@
"structures.h"
"decode.h"
-1598212816 c:\users\public\dev\dvda-author\libutils\src\include\decode.h
+1598560439 c:\users\public\dev\dvda-author\libutils\src\include\decode.h
"c_utils.h"
-1598277292 c:\users\public\dev\dvda-author\src\include\xml.h
+1598560485 c:\users\public\dev\dvda-author\src\include\xml.h
"c_utils.h"
-1598277387 c:\users\public\dev\dvda-author\src\include\menu.h
+1598560484 c:\users\public\dev\dvda-author\src\include\menu.h
"config.h"
"structures.h"
-1598203560 c:\users\public\dev\dvda-author\src\include\launch_manager.h
+1598560484 c:\users\public\dev\dvda-author\src\include\launch_manager.h
"structures.h"
"commonvars.h"
-1598212745 c:\users\public\dev\dvda-author\src\include\asvs.h
+1598560484 c:\users\public\dev\dvda-author\src\include\asvs.h
-1598230790 source:c:\users\public\dev\dvda-author\src\asvs.c
+1598560484 source:c:\users\public\dev\dvda-author\src\asvs.c
"commonvars.h"
@@ -389,7 +384,7 @@
"auxiliary.h"
"asvs.h"
-1598281613 source:c:\users\public\dev\dvda-author\src\ats.c
+1598627192 source:c:\users\public\dev\dvda-author\src\ats.c
"config.h"
@@ -407,13 +402,13 @@
"c_utils.h"
"structures.h"
-1598226982 c:\users\public\dev\dvda-author\src\include\ats.h
+1598560484 c:\users\public\dev\dvda-author\src\include\ats.h
"audio2.h"
"decode.h"
-1598452075 source:c:\users\public\dev\dvda-author\src\ats2wav.c
+1598627192 source:c:\users\public\dev\dvda-author\src\ats2wav.c
"ats2wav.h"
"ats.h"
"c_utils.h"
@@ -421,7 +416,7 @@
"multichannel.h"
"auxiliary.h"
-1598226358 c:\users\public\dev\dvda-author\src\include\ats2wav.h
+1598560484 c:\users\public\dev\dvda-author\src\include\ats2wav.h
@@ -438,11 +433,11 @@
"libiberty.h"
"fixwav_manager.h"
-1598084700 c:\users\public\dev\dvda-author\src\include\multichannel.h
+1598560484 c:\users\public\dev\dvda-author\src\include\multichannel.h
-1598230790 source:c:\users\public\dev\dvda-author\src\atsi2.c
+1598560484 source:c:\users\public\dev\dvda-author\src\atsi2.c
@@ -456,21 +451,22 @@
"auxiliary.h"
"atsi.h"
-1598224463 c:\users\public\dev\dvda-author\src\include\atsi.h
+1598560484 c:\users\public\dev\dvda-author\src\include\atsi.h
"audio2.h"
"structures.h"
-1598452075 source:c:\users\public\dev\dvda-author\src\audio.c
+1598627192 source:c:\users\public\dev\dvda-author\src\audio.c
"config.h"
"audio2.h"
+ "mlp.h"
-1598228798 c:\users\public\dev\dvda-author\libfixwav\src\include\audio.h
+1598560434 c:\users\public\dev\dvda-author\libfixwav\src\include\audio.h
"c_utils.h"
"structures.h"
-1598233769 c:\users\public\dev\dvda-author\src\include\command_line_parsing.h
+1598560484 c:\users\public\dev\dvda-author\src\include\command_line_parsing.h
"structures.h"
"commonvars.h"
"fixwav_manager.h"
@@ -480,11 +476,11 @@
-1598224231 c:\users\public\dev\dvda-author\src\include\libsoxconvert.h
+1598560484 c:\users\public\dev\dvda-author\src\include\libsoxconvert.h
"sox.h"
-1598324122 source:c:\users\public\dev\dvda-author\src\auxiliary.c
+1598625302 source:c:\users\public\dev\dvda-author\src\auxiliary.c
@@ -505,7 +501,7 @@
"commonvars.h"
"menu.h"
-1598401090 c:\users\public\dev\dvda-author\src\include\ports.h
+1598560484 c:\users\public\dev\dvda-author\src\include\ports.h
"commonvars.h"
@@ -521,11 +517,11 @@
1561592353 c:\users\public\dev\dvda-author\\libiberty\src\include\strdup.h
-1598220520 c:\users\public\dev\dvda-author\src\include\file_input_parsing.h
+1598560484 c:\users\public\dev\dvda-author\src\include\file_input_parsing.h
"auxiliary.h"
-1598451418 source:c:\users\public\dev\dvda-author\src\command_line_parsing.c
+1598629427 source:c:\users\public\dev\dvda-author\src\command_line_parsing.c
"config.h"
@@ -556,12 +552,12 @@
"videoimport.h"
"ats.h"
-1598226575 c:\users\public\dev\dvda-author\src\include\dvda-author.h
+1598560484 c:\users\public\dev\dvda-author\src\include\dvda-author.h
"commonvars.h"
"structures.h"
"c_utils.h"
-1598229846 c:\users\public\dev\dvda-author\src\include\sound.h
+1598560485 c:\users\public\dev\dvda-author\src\include\sound.h
@@ -573,11 +569,11 @@
"auxiliary.h"
"launch_manager.h"
-1598232694 c:\users\public\dev\dvda-author\src\include\videoimport.h
+1598560485 c:\users\public\dev\dvda-author\src\include\videoimport.h
"c_utils.h"
-1598451613 source:c:\users\public\dev\dvda-author\src\dvda-author.c
+1598627192 source:c:\users\public\dev\dvda-author\src\dvda-author.c
"config.h"
@@ -604,11 +600,11 @@
"commonvars.h"
"dvda-author.h"
-1598226103 c:\users\public\dev\dvda-author\src\include\lexer.h
+1598560484 c:\users\public\dev\dvda-author\src\include\lexer.h
"structures.h"
"c_utils.h"
-1598212816 source:c:\users\public\dev\dvda-author\src\file_input_parsing.c
+1598627192 source:c:\users\public\dev\dvda-author\src\file_input_parsing.c
"config.h"
@@ -620,7 +616,7 @@
"ports.h"
"commonvars.h"
-1598451833 source:c:\users\public\dev\dvda-author\src\launch_manager.c
+1598631868 source:c:\users\public\dev\dvda-author\src\launch_manager.c
"config.h"
@@ -645,13 +641,14 @@
"file_input_parsing.h"
"launch_manager.h"
"videoimport.h"
+ "mlp.h"
-1598226249 c:\users\public\dev\dvda-author\src\include\samg.h
+1598560484 c:\users\public\dev\dvda-author\src\include\samg.h
"audio2.h"
-1598225442 source:c:\users\public\dev\dvda-author\src\lexer.c
+1598560485 source:c:\users\public\dev\dvda-author\src\lexer.c
"config.h"
@@ -663,7 +660,7 @@
"auxiliary.h"
"c_utils.h"
-1598224212 source:c:\users\public\dev\dvda-author\src\libsoxconvert.c
+1598560485 source:c:\users\public\dev\dvda-author\src\libsoxconvert.c
@@ -671,7 +668,7 @@
"structures.h"
"libsoxconvert.h"
-1598281527 source:c:\users\public\dev\dvda-author\src\samg2.c
+1598627192 source:c:\users\public\dev\dvda-author\src\samg2.c
@@ -684,11 +681,11 @@
"c_utils.h"
"auxiliary.h"
-1598230117 source:c:\users\public\dev\dvda-author\src\sound.c
+1598627192 source:c:\users\public\dev\dvda-author\src\sound.c
"config.h"
"sound.h"
-1598232837 source:c:\users\public\dev\dvda-author\src\videoimport.c
+1598627192 source:c:\users\public\dev\dvda-author\src\videoimport.c
"config.h"
@@ -708,7 +705,7 @@
"menu.h"
"sound.h"
-1598451613 source:c:\users\public\dev\dvda-author\src\xml.c
+1598560485 source:c:\users\public\dev\dvda-author\src\xml.c
"config.h"
@@ -1724,7 +1721,7 @@
-1598410143 c:\users\public\dev\dvda-author\ffmpeg\config.h
+1598560378 c:\users\public\dev\dvda-author\ffmpeg\config.h
1565915527 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\mlplayout.h
@@ -1734,7 +1731,7 @@
-1598086945 c:\users\public\dev\dvda-author\ffmpeg\libavutil\opt.h
+1598560415 c:\users\public\dev\dvda-author\ffmpeg\libavutil\opt.h
"rational.h"
"avutil.h"
"dict.h"
@@ -1743,14 +1740,14 @@
"samplefmt.h"
"version.h"
-1598086947 c:\users\public\dev\dvda-author\ffmpeg\libavutil\rational.h
+1598560415 c:\users\public\dev\dvda-author\ffmpeg\libavutil\rational.h
"attributes.h"
-1598086934 c:\users\public\dev\dvda-author\ffmpeg\libavutil\attributes.h
+1598560412 c:\users\public\dev\dvda-author\ffmpeg\libavutil\attributes.h
-1598086935 c:\users\public\dev\dvda-author\ffmpeg\libavutil\avutil.h
+1598560412 c:\users\public\dev\dvda-author\ffmpeg\libavutil\avutil.h
"common.h"
"error.h"
"rational.h"
@@ -1760,7 +1757,7 @@
"log.h"
"pixfmt.h"
-1598086937 c:\users\public\dev\dvda-author\ffmpeg\libavutil\common.h
+1598560413 c:\users\public\dev\dvda-author\ffmpeg\libavutil\common.h
@@ -1779,44 +1776,44 @@
"mem.h"
"internal.h"
-1598086943 c:\users\public\dev\dvda-author\ffmpeg\libavutil\macros.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\macros.h
-1598086955 c:\users\public\dev\dvda-author\ffmpeg\libavutil\version.h
+1598560417 c:\users\public\dev\dvda-author\ffmpeg\libavutil\version.h
"macros.h"
-1598408923 c:\users\public\dev\dvda-author\ffmpeg\libavutil\avconfig.h
+1598560412 c:\users\public\dev\dvda-author\ffmpeg\libavutil\avconfig.h
-1598086942 c:\users\public\dev\dvda-author\ffmpeg\libavutil\intmath.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\intmath.h
"config.h"
"attributes.h"
"arm/intmath.h"
"x86/intmath.h"
-1598086933 c:\users\public\dev\dvda-author\ffmpeg\libavutil\arm\intmath.h
+1598560412 c:\users\public\dev\dvda-author\ffmpeg\libavutil\arm\intmath.h
"config.h"
"libavutil/attributes.h"
-1598086957 c:\users\public\dev\dvda-author\ffmpeg\libavutil\x86\intmath.h
+1598560417 c:\users\public\dev\dvda-author\ffmpeg\libavutil\x86\intmath.h
"config.h"
-1598086944 c:\users\public\dev\dvda-author\ffmpeg\libavutil\mem.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\mem.h
"attributes.h"
"error.h"
"avutil.h"
-1598086939 c:\users\public\dev\dvda-author\ffmpeg\libavutil\error.h
+1598560413 c:\users\public\dev\dvda-author\ffmpeg\libavutil\error.h
-1598086941 c:\users\public\dev\dvda-author\ffmpeg\libavutil\internal.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\internal.h
@@ -1834,7 +1831,7 @@
"libm.h"
-1598086954 c:\users\public\dev\dvda-author\ffmpeg\libavutil\timer.h
+1598560416 c:\users\public\dev\dvda-author\ffmpeg\libavutil\timer.h
"config.h"
@@ -1850,47 +1847,47 @@
"ppc/timer.h"
"x86/timer.h"
-1598086943 c:\users\public\dev\dvda-author\ffmpeg\libavutil\log.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\log.h
"avutil.h"
"attributes.h"
"version.h"
-1598086931 c:\users\public\dev\dvda-author\ffmpeg\libavutil\aarch64\timer.h
+1598560412 c:\users\public\dev\dvda-author\ffmpeg\libavutil\aarch64\timer.h
"config.h"
-1598086934 c:\users\public\dev\dvda-author\ffmpeg\libavutil\arm\timer.h
+1598560412 c:\users\public\dev\dvda-author\ffmpeg\libavutil\arm\timer.h
"config.h"
-1598086947 c:\users\public\dev\dvda-author\ffmpeg\libavutil\ppc\timer.h
+1598560415 c:\users\public\dev\dvda-author\ffmpeg\libavutil\ppc\timer.h
"config.h"
-1598086957 c:\users\public\dev\dvda-author\ffmpeg\libavutil\x86\timer.h
+1598560417 c:\users\public\dev\dvda-author\ffmpeg\libavutil\x86\timer.h
-1598086937 c:\users\public\dev\dvda-author\ffmpeg\libavutil\cpu.h
+1598560413 c:\users\public\dev\dvda-author\ffmpeg\libavutil\cpu.h
"attributes.h"
-1598086938 c:\users\public\dev\dvda-author\ffmpeg\libavutil\dict.h
+1598560413 c:\users\public\dev\dvda-author\ffmpeg\libavutil\dict.h
"version.h"
-1598086946 c:\users\public\dev\dvda-author\ffmpeg\libavutil\pixfmt.h
+1598560415 c:\users\public\dev\dvda-author\ffmpeg\libavutil\pixfmt.h
"libavutil/avconfig.h"
"version.h"
-1598086956 c:\users\public\dev\dvda-author\ffmpeg\libavutil\x86\emms.h
+1598560417 c:\users\public\dev\dvda-author\ffmpeg\libavutil\x86\emms.h
"config.h"
"libavutil/attributes.h"
"libavutil/cpu.h"
-1598086942 c:\users\public\dev\dvda-author\ffmpeg\libavutil\libm.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\libm.h
"config.h"
"attributes.h"
@@ -1898,25 +1895,25 @@
"mathematics.h"
"libavutil/mips/libm_mips.h"
-1598086942 c:\users\public\dev\dvda-author\ffmpeg\libavutil\intfloat.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\intfloat.h
"attributes.h"
-1598086943 c:\users\public\dev\dvda-author\ffmpeg\libavutil\mathematics.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\mathematics.h
"attributes.h"
"rational.h"
"intfloat.h"
-1598086944 c:\users\public\dev\dvda-author\ffmpeg\libavutil\mips\libm_mips.h
+1598560415 c:\users\public\dev\dvda-author\ffmpeg\libavutil\mips\libm_mips.h
-1598086948 c:\users\public\dev\dvda-author\ffmpeg\libavutil\samplefmt.h
+1598560415 c:\users\public\dev\dvda-author\ffmpeg\libavutil\samplefmt.h
"avutil.h"
"attributes.h"
-1598086817 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\avcodec.h
+1598560383 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\avcodec.h
"libavutil/samplefmt.h"
"libavutil/attributes.h"
@@ -1938,13 +1935,13 @@
"packet.h"
"version.h"
-1598086936 c:\users\public\dev\dvda-author\ffmpeg\libavutil\buffer.h
+1598560413 c:\users\public\dev\dvda-author\ffmpeg\libavutil\buffer.h
-1598086936 c:\users\public\dev\dvda-author\ffmpeg\libavutil\channel_layout.h
+1598560413 c:\users\public\dev\dvda-author\ffmpeg\libavutil\channel_layout.h
-1598086940 c:\users\public\dev\dvda-author\ffmpeg\libavutil\frame.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\frame.h
"avutil.h"
@@ -1955,16 +1952,16 @@
"pixfmt.h"
"version.h"
-1598086941 c:\users\public\dev\dvda-author\ffmpeg\libavutil\hwcontext.h
+1598560414 c:\users\public\dev\dvda-author\ffmpeg\libavutil\hwcontext.h
"buffer.h"
"frame.h"
"log.h"
"pixfmt.h"
-1598086847 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\version.h
+1598560390 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\version.h
"libavutil/version.h"
-1598086882 c:\users\public\dev\dvda-author\ffmpeg\libavformat\avformat.h
+1598560397 c:\users\public\dev\dvda-author\ffmpeg\libavformat\avformat.h
"libavcodec/avcodec.h"
@@ -1973,24 +1970,24 @@
"avio.h"
"libavformat/version.h"
-1598086883 c:\users\public\dev\dvda-author\ffmpeg\libavformat\avio.h
+1598560397 c:\users\public\dev\dvda-author\ffmpeg\libavformat\avio.h
"libavutil/common.h"
"libavutil/dict.h"
"libavutil/log.h"
"libavformat/version.h"
-1598086927 c:\users\public\dev\dvda-author\ffmpeg\libavformat\version.h
+1598560411 c:\users\public\dev\dvda-author\ffmpeg\libavformat\version.h
"libavutil/version.h"
-1598086961 c:\users\public\dev\dvda-author\ffmpeg\libswresample\swresample.h
+1598560418 c:\users\public\dev\dvda-author\ffmpeg\libswresample\swresample.h
"libavutil/channel_layout.h"
"libavutil/frame.h"
"libavutil/samplefmt.h"
"libswresample/version.h"
-1598086961 c:\users\public\dev\dvda-author\ffmpeg\libswresample\version.h
+1598560418 c:\users\public\dev\dvda-author\ffmpeg\libswresample\version.h
"libavutil/avutil.h"
1561592353 c:\users\public\dev\dvda-author\dvda-author\\libiberty\src\include\strndup.h
@@ -2001,7 +1998,7 @@
1561592353 c:\users\public\dev\dvda-author\dvda-author\\libiberty\src\include\strdup.h
-1598451484 source:c:\users\public\dev\dvda-author\src\menu.c
+1598627192 source:c:\users\public\dev\dvda-author\src\menu.c
@@ -2022,12 +2019,12 @@
"menu.h"
"commonvars.h"
-1598084700 c:\users\public\dev\dvda-author\src\include\mlplayout.h
+1598560484 c:\users\public\dev\dvda-author\src\include\mlplayout.h
1598276487 c:\users\public\dev\dvda-author\config.h
-1598086818 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\bsf.h
+1598560384 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\bsf.h
"libavutil/dict.h"
"libavutil/log.h"
"libavutil/rational.h"
@@ -2035,17 +2032,17 @@
"codec_par.h"
"packet.h"
-1598088291 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\codec_id.h
+1598560384 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\codec_id.h
"libavutil/avutil.h"
-1598088322 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\codec_par.h
+1598560384 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\codec_par.h
"libavutil/avutil.h"
"libavutil/rational.h"
"libavutil/pixfmt.h"
"codec_id.h"
-1598088342 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\packet.h
+1598560389 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\packet.h
"libavutil/attributes.h"
@@ -2054,7 +2051,7 @@
"libavutil/rational.h"
"libavcodec/version.h"
-1598088358 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\codec.h
+1598560384 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\codec.h
"libavutil/avutil.h"
"libavutil/hwcontext.h"
@@ -2065,7 +2062,24 @@
"libavcodec/codec_id.h"
"libavcodec/version.h"
-1598088371 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\codec_desc.h
+1598560384 c:\users\public\dev\dvda-author\ffmpeg\libavcodec\codec_desc.h
"libavutil/avutil.h"
"codec_id.h"
+1598627294 c:\users\public\dev\dvda-author\src\include\mlp.h
+ "libavcodec/avcodec.h"
+ "libavutil/channel_layout.h"
+ "libavutil/common.h"
+ "libavutil/frame.h"
+ "libavutil/samplefmt.h"
+ "libavutil/opt.h"
+ "libavformat/avformat.h"
+ "libswresample/swresample.h"
+ "mlplayout.h"
+ "structures.h"
+ "c_utils.h"
+ "auxiliary.h"
+
+1598630661 source:c:\users\public\dev\dvda-author\src\mlp.c
+ "mlp.h"
+
diff --git a/dvda-author.1 b/dvda-author.1
deleted file mode 100755
index b9b1f307e..000000000
--- a/dvda-author.1
+++ /dev/null
@@ -1,843 +0,0 @@
-.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.43.3.
-.TH DVDA-AUTHOR "1" "August 2019" "dvda-author version dev-9999" "User Commands"
-.SH NAME
-dvda-author \- manual page for dvda-author version dev-9999
-.SH SYNOPSIS
-.B dvda-author
-[\fIOPTION\fR]...
-.SH DESCRIPTION
-dvda\-author dev\-9999 creates high\-resolution DVD\-Audio discs
-.PP
-from .wav, .flac and other audio files.
-.SH OPTIONS
-
-Output options
-.PP
-\fB\-h\fR, \fB\-\-help\fR Display this help.
-.PP
-\fB\-v\fR, \fB\-\-version\fR Display version.
-.PP
-\fB\-q\fR, \fB\-\-quiet\fR Quiet mode.
-.PP
-\fB\-d\fR, \fB\-\-debug\fR Increased verbosity (debugging level)
-.PP
-\fB\-t\fR, \fB\-\-veryverbose\fR Like \fB\-d\fR with enhanced verbosity for sample counts.
-.TP
-, \fB\-\-maxverbose\fR
-Like \fB\-t\fR with maximum verbosity on audio buffers (devel info).
-.TP
-\fB\-\-no\-output\fR
-Does not produce any file structure except for \fB\-\-fixwav\fR.
-.IP
-Computations will be performed.
-.PP
-\fB\-P\fR, \fB\-\-pause\fR Insert a final pause before exiting.
-.PP
-\fB\-P0\fR, \fB\-\-pause\fR=\fI0\fR Suppress a final pause before exiting
-.IP
-if specified in configuration file.
-.PP
-\fB\-l\fR, \fB\-\-log\fR path Ouput a log to filepath.
-.IP
-Argument must be supplied.
-.PP
-\fB\-L\fR, \fB\-\-logrefresh\fR path Same as \fB\-l\fR but prior log will be erased on launching again.
-.TP
-\fB\-\-loghtml\fR
-Transform the log into HTML format, with colorized messages, adjacent to log with extension .html added.
-.PP
-\fB\-k\fR, \fB\-\-text\fR Generates text table in IFO files
-.IP
-Under development, implemented for 1\-group discs.
-.IP
-Use file information as arguments separated by commas.
-.PP
-\fB\-W\fR, \fB\-\-disable\-lexer\fR Deactivates configuration file parsing.
-.PP
-Playback options
-.PP
-\fB\-a\fR, \fB\-\-autoplay\fR Launches playback on loading disc.
-.PP
-Authoring options
-.IP
-Soundfile authoring
-.PP
-Supported audio types: .wav
-.IP
-\&.flac and .oga (Ogg FLAC, see below)
-.IP
-SoX\-supported formats with \fB\-S\fR enabled
-.IP
-except for lossy formats.
-.TP
-\fB\-\-project\fR [file]
-Launches a dvda\-author project.
-.IP
-The project file should have the same syntax as dvda\-author.conf [see file HOW_TO.conf]
-.IP
-By default, launches dvda\-author.dap in the current directory.
-.PP
-\fB\-i\fR, \fB\-\-input\fR directory Input directory with audio files.
-.IP
-Each subdirectory is a group.
-.PP
-\fB\-o\fR, \fB\-\-output\fR directory Output directory.
-.PP
-\fB\-x\fR, \fB\-\-extract\fR {disc or directory} Extract DVD\-Audio to directory \fB\-o\fR.
-.IP
-Groups are labelled g1, g2 in output directory.
-.TP
-\fB\-\-xlist\fR 1:1,...,t1n\-2:1,...,t2n\-...\-N:1,...,tNn
-Optional hyphen\-separated list of groups to be extracted
-.IP
-may be added with \fB\-x\fR.
-.IP
-Tracks to be extracted in a given group are indicated after a colon.
-.IP
-Tracks to be extracted may be listed separated by commas after colon.
-.IP
-If not specified, all the group will be extracted.
-.IP
-Contiguous tracks may be represented by `...` between commas
-.IP
-e.g. 2\-3\-4:1,2,...,7,9 means: extract groups 2 and 3 entirely and tracks 2 to 7 and 9 for in group 4.
-.TP
-\fB\-\-aob\-extract\fR {directory or AOB[,AOB...]}
-Direct AOB file audio content extraction.
-.IP
-Unlike \fB\-x\fR, this option does not use .IFO files. Use this option in combination with \fB\-o\fR. No wav header is generated.
-.IP
-Several AOB files may be listed, separated by commas.
-.TP
-\fB\-\-aob2wav\fR {directory or AOB[,AOB...]}
-Like \fB\-\-aob\-extract\fR but a wav header is prepended to audio content.
-.TP
-\fB\-\-forensic\fR
-Use this mode with \fB\-\-aob\-extract\fR, \fB\-\-aob2wav\fR or \fB\-x\fR if IFO files are missing or mangled, or AOB files
-.IP
-have been partially restored using recovery tools.
-.TP
-\fB\-\-strict\fR
-Use this option with \fB\-\-aob\-extract\fR, \fB\-\-aob2wav\fR or \fB\-x\fR to stop extraction in case of severe header issues. May be useful in combination with \fB\-\-forensic\fR to manually repair header issues.
-.TP
-\fB\-\-log\-decode\fR [AOB]
-Decode AOB file and log MPEG specifics. Should be used only in conjunction with \fB\-\-outfile\fR
-.TP
-\fB\-\-outfile\fR [file]
-Path to the log generated by \fB\-\-log\-decode\fR. Caution : should be alone in its own directory.
-.PP
-\fB\-p\fR, \fB\-\-startsector\fR NNN Specify the number of the first sector
-.IP
-of the AUDIO_PP.IFO file in the output of mkisofs.
-.IP
-If NNN=0, falling back on 281 (default).
-.IP
-Without \fB\-p\fR start sector will be computed automatically.
-.PP
-\fB\-g\fR You may specify up to 9 groups of tracks.
-.IP
-Minimum: one group.
-Enter full path to files if input directory is not set
-.IP
-by [\-i].
-.PP
-\fB\-z\fR, BROKEN. Separate two consecutive titles when files have same audio
-.IP
-characteritics within a group.(
-.PP
-\fB\-Z\fR, \fB\-\-playlist\fR You may specify up to 9 group copies.
-.IP
-Total number of groups and copy groups should not exceed 9.
-.PP
-\fB\-n\fR, \fB\-\-no\-videozone\fR Do not generate an empty VIDEO_TS directory.
-.PP
-\fB\-w\fR, \fB\-\-rights\fR Access rights to directories created (octal values)
-.PP
-\fB\-c\fR, \fB\-\-cga\fR Enter channel group assignment right after group, e.g: \fB\-g\fR file1...fileN \fB\-c\fR cga1...cgaN
-.IP
-Channel assignment should match number of channels of each file
-.IP
-Combine channels using either decimal indexes in following table or hyphenated channel assignement labels
-.IP
-e.g. \fB\-g\fR a.wav \fB\-g\fR b.wav \fB\-c\fR Lf\-Rf\-C2\-Lfe2\-S2 \fB\-\-cga\fR 17
-.IP
-Channel group assignment (CGA)
-.TP
-Index
-1 2 3 4 5 6
-.TP
-0
-M
-.TP
-1
-L R
-.TP
-2
-Lf Rf S2
-.TP
-3
-Lf Rf Ls2 Rs2
-.TP
-4
-Lf Rf Lfe2
-.TP
-5
-Lf Rf Lfe2 S2
-.TP
-6
-Lf Rf Lfe2 Ls2 Rs2
-.TP
-7
-Lf Rf C2
-.TP
-8
-Lf Rf C2 S2
-.TP
-9
-Lf Rf C2 Ls2 Rs2
-.TP
-0xA\-10
-Lf Rf C2 Lfe2
-.TP
-0xB\-11
-Lf Rf C2 Lfe2 S2
-.TP
-0xC\-12
-Lf Rf C2 Lfe2 Ls2 Rs2
-.TP
-0xD\-13
-Lf Rf C S2
-.TP
-0xE\-14
-Lf Rf C Ls2 Rs2
-.TP
-0xF\-15
-Lf Rf C Lfe2
-.TP
-0x10\-16 Lf
-Rf C Lfe2 S2
-.TP
-0x11\-17 Lf
-Rf C Lfe2 Ls2 Rs2
-.TP
-0x12\-18 Lf
-Rf Ls Rs Lfe2
-.TP
-0x13\-19 Lf
-Rf Ls Rs C2
-.TP
-0x14\-20 Lf
-Rf Ls Rs C2 Lfe2
-.IP
-Keys:
-.IP
-Index 2 means channel belongs to Group2
-.IP
-M: Mono
-.IP
-Lf: Left front
-.IP
-Rf: Right front
-.IP
-Ls: Left surround (behind)
-.IP
-Rs: Right front
-.TP
-C:
-Center
-.IP
-Lfe: Low Frequency Effect (Subwoofer)
-.IP
-S: Surround (just one behind)
-.TP
-Ls: Left
-surround
-.IP
-Rs: Right surround
-.IP
-Each group must have either same sample rate or be even multiples (e.g. 96kHz/48 kHz or 88.2 kHz/44.1 kHz)
-.IP
-Within groups, bitrate may differ but sample rate cannot.
-.TP
-\fB\-\-downmix\fR
-Enter downmix coefficients in dB. If track has more than 2 channels, each channel (Lf, Rf, C, Ls or S, Rs, LFE)
-.IP
-will be mapped to left (l) and/or right (r) stereo channel
-.IP
-with volume reduced by x dB, x the channel downmix coefficient.
-.IP
-Enter positive dB values corresponding to each channel volume reduction, mapped to left or right stereo, separated by commas.
-.IP
-Schema is \fB\-\-downmix\fR Lf.l,Lf.r,Rf.l,Rf.r,C.l,C.r,S.l,S.r,Rs.l,Rs.r,LFE.l,LFE.r
-.IP
-Use 100 for 'off' value and 0 for no volume reduction.
-.IP
-This option can be repeated up to 16 times. It is cyclically recycled to 16 times to provide as many downmix tables.
-.IP
-Each track can be indexed using \fB\-\-dtable\fR to be downmixed with the corresponding table.
-.IP
-Example : \fB\-\-downmix\fR 6.2,100,100,7.2,0,0,13,13,16,16,0,0 \fB\-\-downmix\fR 5.2,100,100,8.2,0,0,10,10,12,12,0,0 \fB\-\-dtable\fR 2 \fB\-\-dtable\fR 1
-.IP
-means that track 1 will be downmixed using the second table and track 2 the first one.
-.TP
-\fB\-\-dtable\fR
-Enter downmix table rank (1\-based) as indicated above.
-.TP
-\fB\-\-provider\fR
-Enter provider name.
-.PP
-\fB\-F\fR, \fB\-\-fixwav\fR(options) Bad wav headers will be fixed by fixwav.
-.IP
-Can be run alone without DVD\-AUDIO output by adding \fB\-\-nooutput\fR.
-.PP
-\fB\-f\fR, \fB\-\-fixwav\-virtual\fR(options) Use .wav header repair utility
-.IP
-without any write operation.
-.PP
-\fB\-S\fR, \fB\-\-sox\fR Use SoX to convert file format to .wav.
-.IP
-Without \fB\-S\fR or \fB\-\-resample\fR (see below), only flac, Ogg FLAC
-.IP
-and .wav files are accepted.
-.TP
-\fB\-\-resample\fR c b s
-Use SoX to convert file format to .wav, and/or change channel to c, bitrate to b, samplerate to s.
-.IP
-You do not need to use \fB\-S\fR with \fB\-\-resample\fR.
-.IP
-Always provide the three values c b and s separated by white space in the same order as in the previous \fB\-g\fR files.
-.TP
-\fB\-\-padding\fR
-Reverse default behaviour for transition between audio tracks with identical
-.IP
-characteristics (number of channels, bit depth and sample rate).
-.IP
-If necessary, audio will be padded with 0s instead of being joined (default).
-.IP
-Use \fB\-\-pad\-cont\fR for padding with last\-known byte.
-.PP
-\fB\-C\fR, \fB\-\-pad\-cont\fR When padding, pad with last known byte, not 0. See \fB\-\-padding\fR above.
-.IP
-Deactivates \fB\-\-lossy\-rounding\fR
-.PP
-\fB\-L\fR, \fB\-\-lossy\-rounding\fR Sample count rounding will be performed by cutting audio files
-.IP
-instead of padding (see \fB\-\-padding\fR and \fB\-\-pad\-cont\fR).
-.IP
-Deactivates \fB\-\-pad\-cont\fR and \fB\-\-padding\fR.
-.PP
-Menu authoring
-.PP
-\fB\-m\fR, \fB\-\-topmenu\fR(=mpgfiles) Generates top menu from comma\-separated list of mpgfiles.
-.IP
-Without argument, automatic menu generation is launched.
-.PP
-\fB\-u\fR, \fB\-\-duration\fR hh:mm:ss Duration of top menu file, if provided.
-.IP
-It is mandatory when \fB\-\-topmenu\fR has an argument file.
-.PP
-\fB\-M\fR, \fB\-\-xml\fR filepath Generates dvdauthor xml project
-.IP
-to filepath.
-.PP
-\fB\-H\fR, \fB\-\-spuxml\fR filepath Generates spumux xml project
-.IP
-to filepath.
-.PP
-\fB\-G\fR, \fB\-\-image\fR file Menu Background image for customized menu authoring.
-.PP
-\fB\-E\fR, \fB\-\-highlight\fR file Menu Highlight image for customized menu authoring.
-.PP
-\fB\-e\fR, \fB\-\-select\fR file Menu Select image
-.IP
-image that appears on pressing Enter with remote control
-usually Background with a change in text color.
-.PP
-\fB\-N\fR, \fB\-\-blankscreen\fR file For automatic menu authoring, you can replace black video background with this image.
-.PP
-\fB\-O\fR, \fB\-\-screentext\fR string Text for top menu. Format is
-.IP
-"album_text=group1_text=text(track11),text(track21),...,text(trackn1):group2_text=text(track12),text(track22)...,text(trackn2):..."
-.IP
-with text(tracknk) the text for track n of group k and
-.IP
-groupk_text the text for group k.
-.PP
-\fB\-U\fR, \fB\-\-loop\fR loop background video.
-.PP
-\fB\-K\fR, \fB\-\-highlightformat\fR \fB\-1\fR for automatic menu authoring
-.IP
-with little square before titles, 0 for underlining, 1 for button highlight.
-.PP
-\fB\-J\fR, \fB\-\-font\fR a,b,c Font name,font size,font width
-.IP
-(number of pixels for width of font size 10).
-.IP
-Font name should be compatible with Image magick specifications (mogrify \fB\-list\fR font).
-.TP
-\fB\-\-fontname\fR a
-Font name.
-.TP
-\fB\-\-fontsize\fR b
-Font size.
-.TP
-\fB\-\-fontwidth\fR b
-Font width.
-.PP
-\fB\-Y\fR, \fB\-\-topmenu\-palette\fR string Text for system palette. Format is
-.IP
-either "norefresh", to block the refreshing of menu images, or:
-.IP
-textcolor:highlight_color:select_action color
-.IP
-in alpha\-YCrCb 32\-bit hexa coding. Here textcolor is the non\-highlighted text for tracks,
-.IP
-,highlight_color is the underline or mobile motif color,
-.IP
-and select_action_color is album and group labels
-.IP
-as well as color of tracks on pressing the highlighted track.
-.PP
-\fB\-8\fR, \fB\-\-activemenu\-palette\fR string Text for menu colors. Format is:
-.IP
-textcolor:highlight_text_color:highlight_color:select_action color
-.IP
-in alpha\-YCrCb 32\-bit hexa coding. Here textcolor is the text for tracks,
-.IP
-highlight_text_color is the color of album and group labels and highlighted text (broken feature)
-.IP
-highlight_color is the underline or mobile motif color,
-.IP
-and select_action_color is on pressing the highlighted track.
-.PP
-\fB\-y\fR, \fB\-\-topmenu\-colors\fR string Text for menu colors. This is a developer's switch.
-.IP
-Use the \fB\-palette\fR switches for modifying display colors.
-.IP
-This switch determines the colors of pictures generated in the temporary directory before creating the mpg background files.
-.IP
-Format is either "norefresh", to block the refreshing of menu images, or
-.IP
-textcolor:backgroundcolor:highlightcolor:select action color in rgb values a,b,c between 0 and 255.
-.PP
-\fB\-b\fR, \fB\-\-background\fR Background jpg files (comma\-separated) to create a background mpg file
-.IP
-into which titles are multiplexed.
-.IP
-Specify as many files as there are menus, or the last file will be duplicated for missing menu files.
-.TP
-\fB\-\-background\-colors\fR
-Background RGB colors to colorize background mpg files
-.IP
-into which titles are multiplexed.
-.IP
-Specify as many colors as there are menus, or the last color will be duplicated for missing menu colors.
-.IP
-Syntax is r,g,b:r2,g2,b2:...:rk,gkbk for \fB\-\-nmenus\fR=\fIk\fR.
-.PP
-\fB\-B\fR, \fB\-\-background\-mpg\fR list Background mpg file(s) in a comma\-separated list
-.IP
-into which titles are multiplexed.
-.HP
-\fB\-\-topmenu\-slides\fR file(s) .jpg image files to be multiplexed with sound tracks (see option below) into a slideshow.
-.IP
-By default a black screen will be used.
-.IP
-Each menu screen should have at least one associated .jpg slide. List of slides is comma\-separated for each menu.
-.IP
-Menu lists are colon\-separated: menu1_pic1,menu1_pic2:menu2_pic1,menu2_pic2, etc.
-.PP
-\fB\-Q\fR, \fB\-\-soundtracks\fR file(s) Background wav file(s)
-.IP
-to be multiplexed into a slideshow, with option \fB\-\-topmenu\-slides\fR.
-.IP
-By default a silent track will be multiplexed.
-.IP
-Each menu screen should have its own sound track. List of tracks follows same usage as for \fB\-\-topmenu\-slides\fR.
-.IP
-Note that currently with several menus there can be only one track/slide per menu.
-.PP
-\fB\-A\fR, \fB\-\-topvob\fR f Import already authored top vob menu f.
-.TP
-\fB\-\-import\-topmenu\fR f
-Import VIDEO_TS stream (VOB format) into AUDIO_TS top menu (AUDIO_TS.VOB).
-.PP
-\fB\-0\fR, \fB\-\-menustyle\fR desc Specifies top menu style
-.IP
-By default, tracks are listed under group headers.
-.IP
-If desc='hierarchical', the first menu screen lists groups.
-.IP
-If desc='active', all tracks will have an associated still picture with menu links that remain active while listening to the track.
-.PP
-\fB\-1\fR, \fB\-\-stillvob\fR f Import already authored still pictures vob.
-.PP
-\fB\-2\fR, \fB\-\-stilloptions\fR ... Still picture options (add after \fB\-\-stillpics\fR). Each option applies to ranked pic, e.g.
-.IP
-rank=0,manual,starteffect=fade,rank=1,starteffect=dissolve.
-.IP
-Suboptions are:
-.IP
-rank=[number], starteffect=[effect], endeffect=[effect]
-.IP
-manual, lag=[number], start=[number], active
-.IP
-See details below.
-.TP
-\fB\-\-stillpics\fR
-Background jpg files to create one or more still pictures
-.IP
-for each track.See usage below.
-.IP
-If a track has no still picture, use two colons in a row.
-.IP
-You may otherwise indicate a directory containing pictures
-.IP
-named pic_abc.jpg, with a,b,c between 0 and 9.
-.TP
-\fB\-\-stillpics\fR dir/
-Directory for background jpg files to create one still picture for each track.
-.IP
-Pics should be named pic_000.jpg, ..., up to pic_999.jpg (maximum).
-.PP
-\fB\-4\fR, \fB\-\-norm\fR Argument is 'ntsc', 'pal' or 'secam', depending on TV standard.
-.PP
-\fB\-5\fR, \fB\-\-aspect\fR Set the playback aspect ratio code of the encoded video. By default, this value is inferred from the input header.
-.TP
-1
-\- 1:1 display
-.TP
-2
-\- 4:3 display
-.TP
-3
-\- 16:9 display
-.TP
-4
-\- 2.21:1 display
-.PP
-\fB\-6\fR, \fB\-\-nmenus\fR int Generates int top menus (default 1).
-.PP
-\fB\-7\fR, \fB\-\-ncolumns\fR int Top menus will have at most int columns (default 3).
-.PP
-Disc authoring
-.PP
-\fB\-I\fR, \fB\-\-mkisofs\fR(=file) Run mkisofs to author disc image using file
-.IP
-as an ISO image. If file is empty, use tempdir/dvd.iso.
-.PP
-\fB\-r\fR, \fB\-\-cdrecord\fR(=a,b,c) Run cdrecord to burn disc image.
-.IP
-Unless specified, \fB\-\-mkisofs\fR will be automatically triggered with default tempdir/dvd.iso value.
-.IP
-Device is of the form a,b,c, see cdrecord \fB\-scanbus\fR. It can be omitted
-.IP
-if there is just one writer.
-.PP
-\fB\-R\fR, \fB\-\-growisofs\fR \fI/dev/dvd\fP Run growisofs to burn disc image.
-.IP
-Device is of the form \fI/dev/scd0\fP under many GNU/Linux distributions.
-.IP
-It cannot be omitted.
-.PP
-DVD\-VIDEO zone authoring
-.TP
-\fB\-\-lplex\-output\fR dir
-Output directory for lplex
-.IP
-Default is same as specified \fB\-o\fR value
-.IP
-or default output directory.
-.TP
-\fB\-\-dvdv\-tracks\fR ...
-Add tracks to be added to DVD\-VIDEO zone using lplex:
-.IP
-track11,...,trackn1:track12,...,trackn2:...
-.IP
-for trackij the ith track of video titleset j.
-.TP
-\fB\-\-dvdv\-slides\fR ...
-Add slides to be added to DVD\-VIDEO zone using lplex:
-.IP
-slide11,...,sliden1:slide12,...,slide2:...
-.IP
-for slideij the ith slide of video titleset j.
-.IP
-Each track should have a corresponding slide.
-.IP
-Add two commas in a row for repeating previous slide.
-.IP
-There can be a maximum of 1 slide per track.
-.PP
-\fB\-V\fR, \fB\-\-videodir\fR directory Path to VIDEO_TS input directory
-.PP
-\fB\-T\fR, \fB\-\-videolink\fR rank Rank of video titleset linked to in video zone
-.IP
-(XX in VTS_XX_0.IFO).
-.IP
-In this case the path to the VIDEO_TS linked to
-.IP
-must be indicated.
-.TP
-\fB\-\-dvdv\-import\fR
-Create DVD\-VIDEO zone from DVD\-AUDIO zone.
-.IP
-Import DVD\-Video standard compliant files (16\-24 bit/48\-96 kHz
-.IP
-from DVD\-AUDIO to DVD\-VIDEO.
-.TP
-\fB\-\-mirror\fR
-Like \fB\-\-dvdv\-import\fR but resample audio tracks
-.IP
-if they are not DVD\-Video compliant (.wav files only)
-.HP
-\fB\-\-mirror\-strategy\fR st Values for st are: 'high'' or 'low'.
-.IP
-If necessary, \fB\-\-mirror\fR will resample audio tracks
-.IP
-by upsampling (high) or downsampling (low)
-.TP
-\fB\-\-hybridate\fR
-Alias for \fB\-\-dvdv\-import\fR
-.IP
-\fB\-\-dvdv\-slides=\fR... with each slide the first slide of \fB\-\-stillpics=\fR... for each audio track.
-.TP
-\fB\-\-full\-hybridate\fR
-Alias for \fB\-\-mirror\fR \fB\-\-miror\-strategy\fR high
-.IP
-\fB\-\-dvdv\-slides=\fR... with each slide the first slide of \fB\-\-stillpics=\fR... for each audio track.
-.PP
-Software configuration
-.PP
-\fB\-D\fR, \fB\-\-tempdir\fR directory Temporary directory for DVD\-Audio files (dvda\-author).
-.IP
-Optional. CAUTION: tempdir will be erased unless \fB\-\-no\-refresh\-tempdir\fR is used.
-.PP
-\fB\-9\fR, \fB\-\-datadir\fR directory Data directory with subdirectory `menu' containing at least default backgrounds for menus. Optional, only to be used when menus are created.
-.TP
-, \fB\-\-lplex\-tempdir\fR directory
-Temporary directory for DVD\-Video files (lplex)
-.IP
-Optional.
-.PP
-\fB\-X\fR, \fB\-\-workdir\fR directory Working directory: current directory in command line relative paths.
-.IP
-By default, the current directory.
-.IP
-With Code::Blocks and similar IDE, you may have to specify your root package directory as argument to \fB\-\-workdir\fR.
-.HP
-\fB\-\-no\-refresh\-tempdir\fR Do not erase and recreate the DVD\-Audio temporary directory on launch.
-.TP
-\fB\-\-no\-refresh\-outdir\fR
-Do not erase and recreate the output directory on launch.
-.TP
-\fB\-\-bindir\fR path
-Path to auxiliary binaries.
-.PP
-Sub\-options
-.IP
-fixwav sub\-options:
-.PP
-simple\-mode
-.IP
-Deactivate default automatic mode and advanced options.
-.IP
-User will be asked for more information.
-.PP
-prepend
-.IP
-Prepend header to raw file, maybe virtually
-.PP
-in\-place
-.IP
-Correct header in the original file (not advised) unless real is set later
-.PP
-cautious
-.IP
-Be cautious when overwriting files in\-place
-.PP
-interactive
-.IP
-Request information from user.
-.PP
-padding
-.IP
-Pad files according to WAV standard
-.PP
-prune
-.IP
-Cuts off silence at end of files
-.PP
-force
-.IP
-Launches fixwav before SoX for mangled headers
-.PP
-output=sf
-.IP
-Copy corrected file to new filepath with string suffix sf
-.PP
-infodir=db
-.IP
-Copy info chunks from wav headers to file db/database
-.PP
-virtual
-.IP
-Forces virtual behavior over previous settings (files will be unmodified)
-.PP
-real
-.IP
-Forces real behavior over previous settings (files will be modified)
-.IP
-Sub\-options should be separated by commas and appended
-.IP
-after short option or after = sign if long option is used:
-.HP
-\fB\-f\fR/\-Fsuboption or \fB\-\-fixwav\fR(\fB\-virtual\fR)=suboption
-.IP
-without any whitespace in between them.
-.IP
-Example: \fB\-\-fixwav\fR=\fIsimple\-mode\fR,prepend,interactive,output=new
-.IP
-Still pictures:
-.IP
-p11,p21,...,pn1\-p22,p22,...,pn2\-...
-.IP
-with tracks separated by hyphens and pictures by colons.
-.IP
-Examples: \fB\-g\fR \fI~/a.wav\fP \fB\-\-stillpics\fR image1.jpg,image2.jpg,image3.jpg:image4.jpg,image5.jpg,image6.jpg
-.IP
-If there are no pics for a track use :: as below (no pics for second track):
-.IP
-\fB\-g\fR \fI~/a.wav\fP ~/b.wav \fI~/c.wav\fP \fB\-\-stillpics\fR image1.jpg,image2.jpg,image3.jpg::image4.jpg,image5.jpg,image6.jpg
-.IP
-Still picture transition effects:
-.PP
-rank=k
-.IP
-k is the absolute rank of stillpic (0\-based) to which the following options apply (order\-dependent).
-.PP
-start=k
-.IP
-picture starts at k sec from start of track.
-.PP
-manual
-.IP
-Enable browsable (manual advance) pictures (experimental).
-.PP
-starteffect=effect
-.IP
-transition effect at start of pic: cut (default), fade, dissolve, top\-wipe, bottom\-wipe, left\-wipe, right\-wipe.
-.PP
-endeffect=effect
-.IP
-like starteffect at end of pic show (under development)
-.PP
-lag=k
-.IP
-k is the duration of transition effect in multiples of 0.32 second (k < 16).
-.PP
-active
-.IP
-menu links will be displayed on still picture and remain active while listening.
-.IP
-Example: \fB\-\-stilloptions\fR rank=0,start=03,starteffect=fade,lag=12,rank=1,start=20,starteffect=dissolve,lag=15
-.IP
-Transition effects like fade or dissolve may vary depending on hardware.
-.IP
-End effects may be visible only when several pictures are used for a track slide.
-.IP
-If a track has just one still pic, only start effects may be visible.
-.PP
-Note: for optional arguments noted (=...) above, usage is either
-.IP
-\fB\-xY\fR, with x the option flag and Y the argument, or
-.IP
-\fB\-\-option\fR=\fIargument\fR.
-.PP
-There must be a maximum of 9 audio groups.
-.PP
-Each subdirectory of an audio input directory will contain titles
-.PP
-for a separate audio group.
-.PP
-A number between 1 and 9 must be included as the second character of the
-.PP
-subdirectory relative name.
-.PP
-Full Input/Output paths must be specified unless default settings are set.
-.PP
-By default, defaults are set in \fI/full\fP path to dvda\-author folder/defaults
-.SH EXAMPLES
-
-\-create a 3\-group DVD\-Audio disc (legacy syntax):
-.IP
-dvda\-author \-g file1.wav file2.flac \-g file3.flac \-g file4.wav
-.PP
-\-create a hybrid DVD disc with both AUDIO_TS mirroring audio_input_directory
-.IP
-and VIDEO_TS imported from directory VID, outputs disc structure to directory
-.IP
-DVD_HYBRID and links video titleset #2 of VIDEO_TS to AUDIO_TS:
-.IP
-dvda\-author \-i ~/audio/audio_input_directory
-.IP
-\-o DVD_HYBRID \-V Video/VID \-T 2
-.PP
-\-create an audio folder from an existing DVD\-Audio disc:
-.IP
-dvda\-author \-\-extract /media/cdrom \-xlist 1\-3:2\-5:3,...,7,9\-6\-7 \-o dir
-.PP
-will extract audio groups 1, 3 (track 2), 5 (tracks 3 to 7 and 9), 6 and 7 of the disc to
-.PP
-dir/g1, dir/g3, dir/g5, dir/g6, and dir/g7 respectively.
-.PP
-Required compile\-time constants:
-.PP
-_GNU_SOURCE, __CB__ if compiling with Code::Blocks or similar IDE.
-.PP
-Optional compile\-time constants:
-.PP
-LONG_OPTIONS for the above long options (starting with \-\-)
-.PP
-SHORT_OPTIONS_ONLY to block all long options.
-.PP
-LOCALE to recompile for another locale than the default "C".
-.PP
-SETTINGSFILE to specify default filepath of the configuration file.
-.PP
-FLAC__HAS_OGG to enable Ogg FLAC support.
-.PP
-_LARGEFILE_SOURCE,_LARGE_FILES,_FILE_OFFSET_BITS=64
-.PP
-to enable large file support.
-.PP
-ALWAYS_INLINE forces code inlining.
-.PP
-WITHOUT_sox to compile without SoX code
-.PP
-WITHOUT_FLAC to compile without FLAC/OggFLAC code
-.SH AUTHOR
-Written by Dave Chapman, Fabrice Nicol, Lee and Tim Feldkamp.
-.SH "REPORTING BUGS"
-Report bugs to fabnicol@users.sourceforge.net
-.SH COPYRIGHT
-Copyright 2005 Dave Chapman; 2008\-2009 Lee and Tim Feldkamp; 2007\-2016 Fabrice Nicol.
-.PP
-See file AUTHORS for other contributors.
-.PP
-Latest version available from http://dvd\-audio.sourceforge.net/
-.PP
-.br
-This is free software; see the source for copying conditions.
-.SH "SEE ALSO"
-The full documentation for
-.B dvda-author
-is maintained as a Texinfo manual. If the
-.B info
-and
-.B dvda-author
-programs are properly installed at your site, the command
-.IP
-.B info dvda-author
-.PP
-should give you access to the complete manual.
diff --git a/libutils/src/include/c_utils.h b/libutils/src/include/c_utils.h
index 5e95acb21..ffeb5c128 100755
--- a/libutils/src/include/c_utils.h
+++ b/libutils/src/include/c_utils.h
@@ -307,6 +307,8 @@ typedef struct
bool videozone;
bool videolinking;
bool decode;
+ bool encode_to_mlp_dvd;
+ bool to_mlp;
bool pipe;
bool play;
bool playlist;
@@ -403,6 +405,7 @@ char* get_fullpath_command_line(char* local_variable, const char* symbolic_const
char* copy_file2dir(const char *existing_file, const char *new_dir, globalData*);
void copy_file2dir_rename(const char *existing_file, const char *new_dir, char* newfilename, globalData*);
path_t *parse_filepath(const char* filepath, globalData*);
+void free_filepath(path_t* p);
void clean_path(path_t** );
char* make_absolute(char* filepath);
char *fn_get_current_dir_name (void);
diff --git a/libutils/src/libc_utils.c b/libutils/src/libc_utils.c
index 552fda706..37ab38780 100755
--- a/libutils/src/libc_utils.c
+++ b/libutils/src/libc_utils.c
@@ -430,6 +430,21 @@ char* end_sep(const char *path, globalData* globals)
* Returns structure path_t
* ------- */
+void free_filepath(path_t* p)
+{
+ free(p->directory);
+ p->directory = NULL;
+ free(p->extension);
+ p->extension = NULL;
+ free(p->rawfilename);
+ p->rawfilename = NULL;
+ free(p->filename);
+ p->filename = NULL;
+ free(p->path);
+ p->path = NULL;
+ free(p);
+}
+
path_t *parse_filepath(const char* filepath, globalData* globals)
{
path_t *chain = calloc(1, sizeof(path_t));
@@ -543,18 +558,7 @@ path_t *parse_filepath(const char* filepath, globalData* globals)
void clean_path(path_t** p)
{
- free((*p)->directory);
- (*p)->directory = NULL;
- free((*p)->extension);
- (*p)->extension = NULL;
- free((*p)->rawfilename);
- (*p)->rawfilename = NULL;
- free((*p)->filename);
- (*p)->filename = NULL;
- free((*p)->path);
- (*p)->path = NULL;
- free(*p);
-
+ free_filepath(*p);
}
/* -------
diff --git a/local.w10/dvda-author.exe b/local.w10/dvda-author.exe
index 9e82007a1..132aec6f4 100755
Binary files a/local.w10/dvda-author.exe and b/local.w10/dvda-author.exe differ
diff --git a/src/amg2.c b/src/amg2.c
index 49007efef..f1c307a5c 100755
--- a/src/amg2.c
+++ b/src/amg2.c
@@ -142,7 +142,7 @@ uint16_t create_tracktables(command_t* command, uint8_t naudio_groups, uint8_t n
titlelength[group] = calloc(ntitles[group], sizeof(uint64_t));
if (titlelength[group] == NULL || ntitlepics[group] == NULL || ntitletracks[group] == NULL)
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Memory allocation, title track count in AMG")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Memory allocation, title track count in AMG")
track=0;
@@ -170,7 +170,7 @@ uint16_t create_tracktables(command_t* command, uint8_t naudio_groups, uint8_t n
if (track != ntracks[group])
{
fprintf(stderr, "\nCounted %d tracks instead of %d for group %d\n", track, ntracks[group], group);
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Incoherent title count")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Incoherent title count")
}
}
diff --git a/src/ats.c b/src/ats.c
index 5e88b3c20..f07410ee6 100755
--- a/src/ats.c
+++ b/src/ats.c
@@ -835,7 +835,7 @@ inline static void calc_PTS_DTS_MLP(fileinfo_t* info, globalData* globals)
{
if (info->type != AFMT_MLP)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "MLP requested")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "MLP requested")
}
// now m[i].pkt_pos indicates offset of MLP packet in mlp file that is just after sector m[i].rank in "mlp-type" AOB
@@ -903,7 +903,7 @@ inline static void calc_PTS_DTS_MLP(fileinfo_t* info, globalData* globals)
// {
// if (info->type != AFMT_MLP)
// {
-// EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "MLP requested")
+// EXIT_ON_RUNTIME_ERROR_VERBOSE( "MLP requested")
// }
//
// for (int i = 1; i < MAX_AOB_SECTORS && m[i].pkt_pos != 0; ++i)
@@ -930,7 +930,7 @@ inline static void calc_SCR_MLP(fileinfo_t* info, globalData* globals)
{
if (info->type != AFMT_MLP)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "MLP requested")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "MLP requested")
}
// struct MLP_LAYOUT already retrieved
@@ -1377,7 +1377,7 @@ int read_pes_packet(FILE* fp, fileinfo_t* info, uint8_t* audio_buf, globalData*
{
if (header_length > 2040)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not compute reasonable header length (< 2040)")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not compute reasonable header length (< 2040)")
}
audio_bytes = 2048 - (uint32_t) header_length; // sureley false for last pack but well
@@ -1580,7 +1580,7 @@ static inline void allocate_mlp_tracktable(fileinfo_t* info, globalData* globals
if (info->pts == NULL || info->dts == NULL || info->scr == NULL)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not allocate memory for PTS / DTS / SCR computation .")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not allocate memory for PTS / DTS / SCR computation .")
}
calc_PTS_DTS_MLP(info, globals);
diff --git a/src/ats2wav.c b/src/ats2wav.c
index f55f7b7e4..ce93d7d80 100755
--- a/src/ats2wav.c
+++ b/src/ats2wav.c
@@ -185,7 +185,7 @@ inline static void output_path_create(const char* dirpath, WaveData *info, int t
int L = strlen(extension); // includes the dot
if (L > 4)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Only .wav and .mlp extensions are supported") // a bit paranoid here....
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Only .wav and .mlp extensions are supported") // a bit paranoid here....
}
char Title[19 + L];
memset(Title, 0, 19 + L);
@@ -236,7 +236,7 @@ inline static void get_audio_format(WaveData *info, bool new_title, bool* status
int res = fread(buff, 1, 0x3D, info->infile.fp);
if (res != 0x3D)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "File is to short to compute audio format")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "File is to short to compute audio format")
}
if (buff[0] == 0 && buff[1] == 0 && buff[2] == 1 && buff[3] == 0xBA && buff[4] == 0x44)
@@ -300,7 +300,7 @@ inline static int calc_position(WaveData* info, const uint32_t offset0, globalDa
if (result != 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR " Error detecting packet position.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( " Error detecting packet position.")
}
@@ -432,7 +432,7 @@ inline static int peek_pes_packet_audio(WaveData *info, WaveHeader* header,
if (result != 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR " Error detecting continuity counter.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( " Error detecting continuity counter.")
}
*continuity = continuity_counter[0];
@@ -443,14 +443,14 @@ inline static int peek_pes_packet_audio(WaveData *info, WaveHeader* header,
if (result != 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR " Error detecting sample size.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( " Error detecting sample size.")
}
result = fread(sample_rate, 1, 1, info->infile.fp);
if (result != 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR " Error detecting sample rate.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( " Error detecting sample rate.")
}
uint8_t high_nibble = (sample_rate[0] & 0xf0) >> 4;
@@ -512,7 +512,7 @@ inline static int peek_pes_packet_audio(WaveData *info, WaveHeader* header,
if (result != 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR " Error detecting channel.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( " Error detecting channel.")
}
if (channel_assignment[0] > 20) *status = INVALID;
@@ -705,7 +705,7 @@ inline static uint64_t get_pes_packet_audio(WaveData *info,
result = fread(PES_packet_len_bytes, 1, 2, info->infile.fp);
if (result != 2)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR " Error detecting last pack.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( " Error detecting last pack.")
}
audio_bytes = (PES_packet_len_bytes[0] << 8 | PES_packet_len_bytes[1]) - lastpack_audiopesheaderquantity;
/* skipping rest of audio_pes_header, i.e 8 bytes + lpcm_header */
diff --git a/src/audio.c b/src/audio.c
index 601a3f8ad..59e99f969 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -32,7 +32,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#endif
#include "audio2.h"
-
+#include "mlp.h"
static const uint8_t default_cga[6] = {0, 1, 7, 3, 9, 12}; //default channel assignment
static uint32_t cga2wav_channels[21] = {0x4, 0x3, 0x103, 0x33, 0xB, 0x10B, 0x3B, 0x7, 0x107, 0x37, 0xF, 0x10F, 0x3F, 0x107, 0x37, 0xF, 0x10F, 0x3F, 0x3B, 0x37, 0x3B };
@@ -125,7 +125,7 @@ inline uint8_t wav2cga_channels(fileinfo_t *info, globalData* globals)
{
if (info == NULL || info->channels > 6 || info->channels < 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Channels are not correctly encoded")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Channels are not correctly encoded")
}
uint32_t dw_channel_mask = info->dw_channel_mask;
@@ -455,350 +455,6 @@ void flac_error_callback(const FLAC__StreamDecoder GCC_UNUSED *dec,
#endif
-int decode_mlp_file(fileinfo_t* info, globalData* globals)
-{
- // initialize all muxers, demuxers and protocols for libavformat
- // (does nothing if called twice during the course of one program execution)
-
- av_register_all();
-
- const char* path = info->filename;
-
- // get format from audio file
- AVFormatContext* format = avformat_alloc_context();
-
- if (avformat_open_input(&format, path, NULL, NULL) != 0)
- {
- fprintf(stderr, ERR "Could not open file '%s'\n", path);
- EXIT_ON_RUNTIME_ERROR
- }
-
- if (avformat_find_stream_info(format, NULL) < 0)
- {
- fprintf(stderr, ERR "Could not retrieve stream info from file '%s'\n", path);
- EXIT_ON_RUNTIME_ERROR
- }
- errno = 0; // hushes up an ioctl report
- // Find the index of the first audio stream
-
- int stream_index = -1;
- for (int i = 0; i < format->nb_streams; ++i)
- {
- if (format->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
- {
- stream_index = i;
- break;
- }
- }
-
- if (stream_index == -1)
- {
- fprintf(stderr, ERR "Could not retrieve audio stream from file '%s'\n", path);
- EXIT_ON_RUNTIME_ERROR
- }
-
- AVStream* stream = format->streams[stream_index];
-
- // find & open codec
-
- AVCodecContext* codec = stream->codec;
-
- codec->request_sample_fmt = av_get_alt_sample_fmt(codec->sample_fmt, 0);
-
- if (avcodec_open2(codec, avcodec_find_decoder(codec->codec_id), NULL) < 0)
- {
- fprintf(stderr, ERR "Failed to open decoder for stream #%u in file '%s'\n", stream_index, path);
- EXIT_ON_RUNTIME_ERROR
- }
-
- // prepare to read data
- AVPacket packet;
-
- av_init_packet(&packet);
-
- AVFrame* frame = av_frame_alloc();
-
- if (!frame)
- {
- fprintf(stderr, ERR "Error allocating the frame\n");
- EXIT_ON_RUNTIME_ERROR
- }
-
- FILE* fp = NULL;
- WaveData info2;
- WaveHeader header;
-
- int32_t cumbytes_written = 0;
-
- if (globals->decode)
- {
- int32_t bytes_written = 0;
- errno = 0;
- while (av_read_frame(format, &packet) >= 0)
- {
- // decode one frame
- int gotFrame;
- int ret;
- if ((ret = avcodec_decode_audio4(codec, frame, &gotFrame, &packet)) < 0)
- {
- fprintf(stderr, ERR "Error decoding audio frame (%s)\n", av_err2str(ret));
- errno = 0;
- if (fp) fclose(fp);
- if (errno)
- fprintf(stderr, ERR "Could not close file %s\n", info->out_filename);
- else
- fprintf(stderr, MSG_TAG "Extracted %ld bytes from file %s to file %s\n", cumbytes_written, path, info->out_filename);
- break;
- }
-
- if (gotFrame)
- {
-
- if (globals->decode && bytes_written == 0)
- {
- if (info->out_filename && globals->fixwav_prepend)
- {
- fprintf(stderr, INF "Decoding file %s to raw data in path: %s\n", info->filename, info->out_filename);
- int debug = globals->debugging;
-
- // Hush it up as there will be spurious error mmsg
-
- globals->debugging = false;
-
- // initializ
-
- memset(&info2, 0, sizeof (WaveData));
- memset(&header, 0, sizeof (WaveHeader));
-
- // WaveData info: file and header prepending characteristics
-
- info2.prepend = true;
- info2.in_place = true;
- info2.cautious = false;
- info2.automatic = true;
- info2.interactive = false;
- info2.prunedbytes = 0;
- info2.padbytes = 0;
- info2.virtual = false;
- info2.outfile.filename = info->out_filename;
- info2.outfile.fp = fp;
- info2.infile = info2.outfile;
- info2.infile.isopen = false;
-
- // WaveHeader info : audio and header characteristics
-
-
- header.header_size_out = 80;
- header.channels = frame->channels;
- header.is_extensible = header.channels > 2;
- header.nBlockAlign = frame->channels * codec->bits_per_raw_sample / 8 ;
- header.wBitsPerSample = codec->bits_per_raw_sample;
- header.dwChannelMask = (frame->channel_layout < 21 && frame->channel_layout > 0) ? cga2wav_channels[frame->channel_layout] : 0;
- header.dwSamplesPerSec = frame->sample_rate;
-
- // Prepend header to empty file. Will close files.
-
- fixwav(&info2, &header, globals);
-
- // Restore verbosity levels
-
- globals->debugging = debug;
-
-
- }
-
- fp = fopen(info->out_filename, "ab+");
- if (fp == NULL)
- {
- fprintf(stderr, ERR "Could not open destination file %s\n", info->out_filename);
- info->out_filename = NULL;
- globals->decode = false;
- }
-
- }
-
- if (globals->decode && fp)
- {
- size_t unpadded_linesize = 0;
-
- int sampleSize = av_get_bytes_per_sample(codec->sample_fmt);
-
- if (sampleSize == 2)
- {
- unpadded_linesize = frame->channels * sampleSize * frame->nb_samples;
- bytes_written = fwrite(frame->extended_data[0], 1, unpadded_linesize, fp);
- }
- else
- if (sampleSize == 4) // 32 bits -> 24 bits (codec->bits_per_raw_sample)
- {
-
- uint32_t bytes_written_sample = 0;
- for(int s = 0; s < frame->nb_samples; ++s)
- {
- for(int c = 0; c < codec->channels; ++c)
- {
- uint32_t val = ((int32_t*) frame->extended_data[0])[s * codec->channels + c];
- val >>= 8; // sampleSize * 8 - codec->bits_per_raw_sample
-
- bytes_written_sample += fwrite(&val, 1, 3, fp);
- }
- }
-
- bytes_written = bytes_written_sample;
- }
- else
- {
- fprintf(stderr, "Invalid sample size %d.\n", sampleSize);
- fclose(fp);
- break;
- }
-
- }
-
- cumbytes_written += bytes_written;
-
- if (globals->maxverbose)
- {
- fprintf(stderr, "Bytes_written: %d Nb samples: %d FR_PTS: %ld PKT_POS: %ld PKT_DURATION: %ld FR_PKT_SIZE; %ld\n",
- cumbytes_written,
- frame->nb_samples,
- frame->pts,
- frame->pkt_pos,
- frame->pkt_duration,
- frame->pkt_size);
- }
-
- }
- else
- {
- continue;
- }
- }
-
- if (globals->decode && info->out_filename && globals->fixwav_prepend)
- {
-// WAV output is now OK except for the wav file size-based header data.
-// ckSize, data_ckSize and nBlockAlign must be readjusted by computing
-// the exact audio content bytesize. Also we no longer prepend the header
-// but overwrite the existing one
-
- fp = fopen(info->out_filename, "rb+");
- if (fp == NULL)
- {
- fprintf(stderr, ERR "Could not open destination file %s\n", info->out_filename);
- info->out_filename = NULL;
- globals->decode = false;
- }
- else
- {
- info2.infile.fp = fp;
- info2.infile.isopen = true;
-
- // No longer prepend to empty file but overwrite in place
-
- info2.prepend = false;
- info2.in_place = true;
-
- errno = 0;
-
- fixwav(&info2, &header, globals);
-
- if (errno)
- fprintf(stderr, ERR "Error detected in header correction for %s\n", info->out_filename);
- else
- fprintf(stderr, MSG_TAG "Extracted %ld bytes to file %s\n", cumbytes_written, info->out_filename);
- }
- }
- }
- else
- {
- uint32_t rank = 0;
- uint32_t totnbsamples = 0;
- unsigned long PKT_POS_SECT = 0;
- unsigned long HEADER_OFFSET = 0;
- unsigned long SECT_RANK = 0;
- unsigned long SECT_RANK_OLD = 0;
-
- if (info->file_size && info->lpcm_payload)
- {
- uint32_t size = info->file_size / info->lpcm_payload + 4;
- info->mlp_layout = (struct MLP_LAYOUT *) calloc(size, sizeof (struct MLP_LAYOUT));
- }
- else
- {
- goto clean_up; // do sth more verbose
- }
-
- while (av_read_frame(format, &packet) >= 0)
- {
- // decode one frame
- int gotFrame;
- if (avcodec_decode_audio4(codec, frame, &gotFrame, &packet) < 0)
- {
- break;
- }
-
- if (gotFrame)
- {
- if (HEADER_OFFSET == 0) HEADER_OFFSET = 64;
-
- PKT_POS_SECT = frame->pkt_pos + HEADER_OFFSET;
-
- SECT_RANK_OLD = SECT_RANK;
- SECT_RANK = (PKT_POS_SECT - 1)/ 2048;
-
- bool new_sector = (SECT_RANK != SECT_RANK_OLD);
-
- if (new_sector || rank == 0)
- {
- if (new_sector) HEADER_OFFSET += 43;
- info->mlp_layout[rank].pkt_pos = frame->pkt_pos;
- info->mlp_layout[rank].nb_samples = totnbsamples;
- info->mlp_layout[rank].rank = SECT_RANK;
-
- ++rank;
- }
-
- totnbsamples += frame->nb_samples;
-
- if (globals->maxverbose)
- {
- fprintf(stderr, "Sect: %lu samples_written: %d Nb samples: %d FR_PTS: %ld PKT_POS: %ld PKT_DURATION: %ld FR_PKT_SIZE; %ld\n",
- SECT_RANK,
- totnbsamples,
- frame->nb_samples,
- frame->pts,
- frame->pkt_pos,
- frame->pkt_duration,
- frame->pkt_size);
- }
- }
- else
- {
- continue;
- }
-
- }
-
- info->mlp_layout[rank].pkt_pos = frame->pkt_pos;
- info->mlp_layout[rank].nb_samples = totnbsamples;
- info->mlp_layout[rank].rank = SECT_RANK;
- info->mlp_layout_size = rank + 1;
-
- if (globals->maxverbose)
- {
- fprintf(stderr, "** \n Layout size: %d **\n", info->mlp_layout_size);
- }
- }
-
-clean_up:
-
- av_frame_free(&frame);
- avcodec_close(codec);
- avformat_free_context(format);
-
- return errno;
-}
int calc_info(fileinfo_t* info, globalData* globals)
{
@@ -1019,7 +675,7 @@ command_t *scan_audiofile_characteristics(command_t *command, globalData* global
command->ntracks[i]--;
else
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "No valid audio format in group")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "No valid audio format in group")
}
// group demotion: if there is no track left in groups, taking off one group
@@ -1176,7 +832,7 @@ inline bool audit_mlp_header(uint8_t* header, fileinfo_t* info, bool calc, globa
{
if (globals->veryverbose)
{
- foutput("%s %s %s\n", WAR "Audio file", info->filename, "has MLP major sync header yet no file extenion .mlp. Proceeding as if MLP...");
+ foutput("%s %s %s\n", WAR "Audio file", info->filename, "has MLP major sync header yet no file extension .mlp. Proceeding as if MLP...");
}
}
@@ -1185,7 +841,7 @@ inline bool audit_mlp_header(uint8_t* header, fileinfo_t* info, bool calc, globa
{
if (globals->veryverbose)
{
- foutput("%s %s %s\n", WAR "Audio file", info->filename, "has MLP major sync header yet no file extenion .mlp. Proceeding as if MLP...");
+ foutput("%s %s %s\n", WAR "Audio file", info->filename, "has MLP major sync header yet no file extension .mlp. Proceeding as if MLP...");
}
}
@@ -1560,7 +1216,7 @@ int flac_getinfo(fileinfo_t* info, globalData* globals)
}
else
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Fatal error - could not create FLAC OR OGG FLAC decoder\n")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Fatal error - could not create FLAC OR OGG FLAC decoder\n")
}
@@ -1568,14 +1224,14 @@ int flac_getinfo(fileinfo_t* info, globalData* globals)
{
FLAC__stream_decoder_delete(flac);
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Failed to initialise FLAC decoder\n");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Failed to initialise FLAC decoder\n");
}
if (!FLAC__stream_decoder_process_until_end_of_metadata(flac))
{
FLAC__stream_decoder_delete(flac);
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Failed to read metadata from FLAC file\n");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Failed to read metadata from FLAC file\n");
}
FLAC__stream_decoder_finish(flac);
@@ -1919,7 +1575,7 @@ int audio_open(fileinfo_t* info, globalData* globals)
}
else
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Type of file unknown")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Type of file unknown")
}
if (result!=FLAC__STREAM_DECODER_INIT_STATUS_OK)
@@ -1951,17 +1607,17 @@ int audio_open(fileinfo_t* info, globalData* globals)
foutput("%s\n", ERR "Error unknown by FLAC API.");
}
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Failed to initialise FLAC decoder\n");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Failed to initialise FLAC decoder\n");
}
if (!FLAC__stream_decoder_process_until_end_of_metadata(info->flac))
{
FLAC__stream_decoder_delete(info->flac);
- EXIT_ON_RUNTIME_ERROR_VERBOSE( ERR "Failed to read metadata from FLAC file\n")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE("Failed to read metadata from FLAC file\n")
}
}
- else EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not initialise FLAC decoder")
+ else EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not initialise FLAC decoder")
}
#endif
@@ -2269,7 +1925,7 @@ uint32_t audio_read(fileinfo_t* info, uint8_t* _buf, uint32_t *bytesinbuffer, gl
//PATCH: provided for null audio characteristics, to ensure non-zero divider
if (info->sampleunitsize == 0)
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Sample unit size is null");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Sample unit size is null");
if ((info->channels > 6) || (info->channels < 1))
{
@@ -2336,7 +1992,7 @@ uint32_t audio_read(fileinfo_t* info, uint8_t* _buf, uint32_t *bytesinbuffer, gl
result = FLAC__stream_decoder_process_single(info->flac);
if (result==0)
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Fatal error decoding FLAC file\n")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Fatal error decoding FLAC file\n")
if (FLAC__stream_decoder_get_state(info->flac) == FLAC__STREAM_DECODER_END_OF_STREAM)
{
@@ -2531,7 +2187,7 @@ uint32_t audio_read_merged(fileinfo_t* info, uint8_t* _buf, uint32_t *bytesinbuf
if (info->sampleunitsize == 0)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Sample unit size is null");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Sample unit size is null");
}
if (info->channels > 6 || info->channels < 1)
diff --git a/src/auxiliary.c b/src/auxiliary.c
index f2f790dd7..8f123c39f 100755
--- a/src/auxiliary.c
+++ b/src/auxiliary.c
@@ -119,7 +119,9 @@ printf("%s"," --player-path [path] Absolute or relative path with filename a
printf("%s"," --aob2wav {directory or AOB[,AOB...]} Like --aob-extract but a wav header is prepended to audio content.\n\n");
printf("%s"," --forensic Use this mode with --aob-extract, --aob2wav or -x if IFO files are missing or mangled, or AOB files" J "have been partially restored using recovery tools.\n\n");
printf("%s"," --strict Use this option with --aob-extract, --aob2wav or -x to stop extraction in case of severe header issues. May be useful in combination with --forensic to manually repair header issues.\n\n");
-printf("%s"," --decode Use this option with --extract or --aob2wav to decode MLP audio to the WAV format." J "This option is based onthe ffmpeg decoder and is subject to the same legal restrictions as those applying to the MLP ffmpeg decoder.\n\n");
+printf("%s"," --decode Use this option with --extract or --aob2wav to decode MLP audio to the WAV format." J "This option is based on the ffmpeg decoder and is subject to the same legal restrictions as those applying to the MLP ffmpeg decoder.\n\n");
+printf("%s"," --encode Use this option to encode to MLP audio." J "This option is based on the ffmpeg encoder and is subject to the same legal restrictions as those applying to the MLP ffmpeg encoder.\n\n");
+printf("%s"," --mlp-files Like --encode but just creates the corresponding MLP files" J "In the subdirectory MLP of the temporary directory (see --tempdir)." J "Disc remains PCM. This option is based on the ffmpeg encoder and is subject to the same legal restrictions as those applying to the MLP ffmpeg encoder.\n\n");
printf("%s"," --log-decode [AOB] Decode AOB file and log MPEG specifics. Should be used only in conjunction with --outfile\n\n");
printf("%s"," --outfile [file] Absolute or relative path to the log generated by --log-decode. Caution : should be alone in its own directory.\n\n");
printf("%s","-p, --startsector NNN Specify the number of the first sector" J "of the AUDIO_PP.IFO file in the output of mkisofs.\n\n");
@@ -561,7 +563,7 @@ void free_memory(command_t *command, globalData* globals)
if (globals->debugging)
foutput(INF "Freeing i=%d j=%d\n",i, j );
FREE(command->files[i][j].filename)
- //FREE(command->files[i][j].filetitle)
+ FREE(command->files[i][j].mlp_filename)
}
}
diff --git a/src/command_line_parsing.c b/src/command_line_parsing.c
index 6b84c45a2..4d814abb1 100755
--- a/src/command_line_parsing.c
+++ b/src/command_line_parsing.c
@@ -299,6 +299,8 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
{"play", required_argument, NULL, 38},
{"player", required_argument, NULL, 39},
{"player-path", required_argument, NULL, 40},
+ {"mlp-files", no_argument, NULL, 41},
+ {"encode", no_argument, NULL, 42},
#endif
{NULL, 0, NULL, 0}
};
@@ -617,7 +619,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
foutput("%s%s\n", PAR "Input directory is: ", globals->settings.indir);
if ((dir=opendir(optarg)) == NULL)
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Input directory could not be opened")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Input directory could not be opened")
change_directory(globals->settings.indir, globals);
audiodir=parse_directory(dir, ntracks, n_g_groups, 0, files_dummy, globals);
@@ -976,7 +978,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
case 'i' :
if ((dir=opendir(optarg)) == NULL)
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Input directory could not be opened")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Input directory could not be opened")
change_directory(globals->settings.indir, globals);
@@ -1003,7 +1005,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
clean_exit(EXIT_SUCCESS, globals);
break;
case ERANGE :
- EXIT_ON_RUNTIME_ERROR_VERBOSE( ERR "Offset range--overflowing LONG INT.");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE("Offset range--overflowing LONG INT.");
break;
}
errno=0;
@@ -1275,6 +1277,20 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
globals->fixwav_prepend = true;
break;
+ case 41: //--mlp-files
+
+ foutput("%s%s\n", PAR "Audio will be encoded to MLP and corresponding files will be placed in ", globals->settings.tempdir);
+ globals->to_mlp = true;
+
+ break;
+
+ case 42: //--encode
+
+ foutput("%s\n", PAR "Audio will be encoded to MLP");
+ globals->to_mlp = true;
+ globals->encode_to_mlp_dvd = true;
+ break;
+
case 38: // --play, like --sync but with piping to ffplay
foutput("%s%s\n", PAR "Will play back ", optarg);
globals->play = true;
@@ -1437,7 +1453,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
img->highlightcolor_palette=strdup(strtok(NULL, ":"));
img->selectfgcolor_palette=strdup(strtok(NULL, ":"));
if ((img->selectfgcolor_palette == NULL)|| (img->highlightcolor_palette ==NULL) || (img->textcolor_palette ==NULL))
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Color chain is illegal: enter text:highlight:select color separated by a colon");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Color chain is illegal: enter text:highlight:select color separated by a colon");
errno=0;
if (img->textcolor_palette) foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Top menu palette text color: %s %lx\n", img->textcolor_palette, strtoul(img->textcolor_palette,NULL,16));
//if (img->textcolor_palette) foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Top menu palette background color: %s %lx\n", img->bgcolor_palette, strtoul(img->bgcolor_palette,NULL,16));
@@ -1446,16 +1462,16 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
if (errno == ERANGE)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "At least one YCrCb coding overflows: check switch --palette")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "At least one YCrCb coding overflows: check switch --palette")
}
else
{
if (errno)
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Check switch --palette")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Check switch --palette")
}
}
else
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Color chain could not be allocated");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Color chain could not be allocated");
break;
@@ -1478,7 +1494,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
img->highlightcolor_pic=strdup(strtok(NULL, ":"));
img->selectfgcolor_pic=strdup(strtok(NULL, ":"));
if ((img->selectfgcolor_pic == NULL)|| (img->highlightcolor_pic ==NULL) || (img->bgcolor_pic == NULL) || (img->textcolor_pic ==NULL))
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Picture color chain is illegal: enter text,background,highlight,select color\n separated by a colon, with rgb components by commas");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Picture color chain is illegal: enter text,background,highlight,select color\n separated by a colon, with rgb components by commas");
if (img->textcolor_pic) foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Top menu text color: rgb(%s)\n", img->textcolor_pic);
if (img->bgcolor_pic) foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Top menu background color: rgb(%s)\n", img->bgcolor_pic);
if (img->highlightcolor_pic) foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Top menu highlight color: rgb(%s)\n", img->highlightcolor_pic);
@@ -1486,7 +1502,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
}
else
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Picture color chain could not be allocated");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Picture color chain could not be allocated");
if ((strcmp(img->selectfgcolor_pic, img->highlightcolor_pic) == 0) || (strcmp(img->textcolor_pic, img->highlightcolor_pic) == 0) || (strcmp(img->textcolor_pic, img->selectfgcolor_pic) == 0))
{
@@ -1524,7 +1540,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
img->activehighlightcolor_palette=strdup(strtok(NULL, ":"));
img->activeselectfgcolor_palette=strdup(strtok(NULL, ":"));
if ((img->activeselectfgcolor_palette == NULL)|| (img->activehighlightcolor_palette ==NULL) || (img->activebgcolor_palette == NULL) || (img->activetextcolor_palette ==NULL))
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Active picture color chain is illegal: enter text,background,highlight,select color\n separated by a colon, with rgb components by commas");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Active picture color chain is illegal: enter text,background,highlight,select color\n separated by a colon, with rgb components by commas");
if (img->activetextcolor_palette) foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Active menu text color: rgb(%s)\n", img->activetextcolor_palette);
if (img->activebgcolor_palette) foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Active menu background color: rgb(%s)\n", img->activebgcolor_palette);
if (img->activehighlightcolor_palette) foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Active menu highlight color: rgb(%s)\n", img->activehighlightcolor_palette);
@@ -1532,7 +1548,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
}
else
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Active picture color chain could not be allocated");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Active picture color chain could not be allocated");
if ((strcmp(img->activeselectfgcolor_palette, img->activehighlightcolor_palette) == 0) || (strcmp(img->activetextcolor_palette, img->activehighlightcolor_palette) == 0) || (strcmp(img->activetextcolor_palette, img->activeselectfgcolor_palette) == 0))
{
@@ -1578,7 +1594,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
img->pointsize=(int8_t) atoi(strtok(NULL, ","));
img->fontwidth=(int8_t) atoi(strtok(NULL, ","));
if ((img->textfont == NULL)|| (img->pointsize <1) || (img->fontwidth < 1) )
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Font chain is illegal: enter font,font size,font width (width in pixels for size=10)");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Font chain is illegal: enter font,font size,font width (width in pixels for size=10)");
if (img->textfont) foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Font: %s\n", img->textfont);
foutput(ANSI_COLOR_MAGENTA"[PAR]"ANSI_COLOR_RESET" Point size: %d\n", img->pointsize);
@@ -1698,7 +1714,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
if (globals->videolinking == 1 && (globals->videozone == 0 || globals->settings.linkdir == NULL))
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "You should provide --videodir when using -T (video-linking)")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "You should provide --videodir when using -T (video-linking)")
}
change_directory(globals->settings.workdir, globals);
@@ -1766,7 +1782,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
if (extract == NULL)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not allocate table for extracted files")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not allocate table for extracted files")
}
extract_list_parsing(extract_args, extract, globals); // first recovering the list of groups and tracks to be extracted
@@ -1779,7 +1795,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
{
if (extract_args != NULL) // sanity test : indir must be known
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "You should use -x (disc or directory) along wth --xlist")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "You should use -x (disc or directory) along wth --xlist")
}
}
@@ -2210,7 +2226,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
change_directory(globals->settings.datadir, globals);
snprintf(cl, 500, "%s %s %s", convert, img->blankscreen , img->backgroundpic[0]);
if (globals->veryverbose) foutput(INF "Launching convert with command line %s\n", cl);
- if (system(win32quote(cl)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "System command failed")
+ if (system(win32quote(cl)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE( "System command failed")
fflush(NULL);
FREE(convert);
}
@@ -2300,7 +2316,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
|| ( !dvdv_tracks_given && !mirror_flag ))))
{
fprintf(stderr, "ndvdvslides[0]=%d\n", ndvdvslides[0]);
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Incoherent command line: slides requested for Lplex"J"...yet no audio tracks or slides given.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Incoherent command line: slides requested for Lplex"J"...yet no audio tracks or slides given.")
}
if (dvdv_tracks_given)
@@ -2314,7 +2330,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
}
if ( dvdv_import_flag && mirror_flag )
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "You should not use --mirror along with --import-dvdv: do you really want to resample?\n Exiting...\n");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "You should not use --mirror along with --import-dvdv: do you really want to resample?\n Exiting...\n");
switch (globals->topmenu)
{
@@ -2342,7 +2358,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
dest=copy_file2dir(img->blankscreen, globals->settings.tempdir, globals);
- if (dest == NULL) EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Failed to copy background .png blankscreen to temporary directory.")
+ if (dest == NULL) EXIT_ON_RUNTIME_ERROR_VERBOSE( "Failed to copy background .png blankscreen to temporary directory.")
if (!menupic_input_coherence_test)
{
@@ -2350,7 +2366,7 @@ command_t *command_line_parsing(int argc, char* const argv[], command_t *command
}
else
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Trop d'incohérences dans l'allocation des éléments du menu.\n")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Trop d'incohérences dans l'allocation des éléments du menu.\n")
}
change_directory(globals->settings.workdir, globals);
@@ -2809,7 +2825,7 @@ void process_dvd_video_zone(command_t* command, globalData* globals)
globals->videozone=true;
if (ndvdvtitleset1 == 0)
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "You requested hybridation yet no DVD-Video standard-compliant\n audio file was found on input.\n")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "You requested hybridation yet no DVD-Video standard-compliant\n audio file was found on input.\n")
if (delta_titlesets)
@@ -2825,7 +2841,7 @@ void process_dvd_video_zone(command_t* command, globalData* globals)
foutput(WAR "%d titlesets will have to be added.\n", delta_titlesets);
if (ndvdvtitleset1+delta_titlesets > 99)
- EXIT_ON_RUNTIME_ERROR_VERBOSE("[ERR] Exceeded 99 titleset limit.\n Redesign your audio input so that you do not have more than 99 different audio formats in a row.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE("Exceeded 99 titleset limit.\n Redesign your audio input so that you do not have more than 99 different audio formats in a row.")
new_dvdv_track_array=(char***) calloc(ndvdvtitleset1 + delta_titlesets,sizeof(dvdv_track_array));
new_dvdv_slide_array=(char***) calloc(ndvdvtitleset1 + delta_titlesets, sizeof(dvdv_slide_array));
@@ -2987,7 +3003,7 @@ void process_dvd_video_zone(command_t* command, globalData* globals)
int size=strlen(files[group][track].filename);
if (strcmp(files[group][track].filename + size-4, ".wav") !=0)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Automatic mirroring is only supported for wav files.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Automatic mirroring is only supported for wav files.")
}
char newpath[size+4];
@@ -3038,7 +3054,7 @@ void process_dvd_video_zone(command_t* command, globalData* globals)
foutput(WAR "%d titlesets will have to be added.\n", delta_titlesets);
if (command->ngroups+delta_titlesets > 99)
- EXIT_ON_RUNTIME_ERROR_VERBOSE("[ERR] Exceeded 99 titleset limit.\n Redesign your audio input so that you do not have more than 99 different audio formats in a row.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE("Exceeded 99 titleset limit.\n Redesign your audio input so that you do not have more than 99 different audio formats in a row.")
new_dvdv_track_array=(char***) calloc(command->ngroups + delta_titlesets,sizeof(char**));
new_dvdv_slide_array=(char***) calloc(command->ngroups + delta_titlesets, sizeof(char**));
@@ -3151,7 +3167,7 @@ void aob2wav_parsing(const char *ssopt, const extractlist* extract, globalData*
}
else
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Extraction processor has not valid AOB path input.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Extraction processor has not valid AOB path input.")
}
int i = 0;
@@ -3162,12 +3178,12 @@ void aob2wav_parsing(const char *ssopt, const extractlist* extract, globalData*
if (globals->aobpath == NULL)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Extraction processor failed at input stage.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Extraction processor failed at input stage.")
}
}
else
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Extraction processor has not valid AOB path input or memory allocation failed.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Extraction processor has not valid AOB path input or memory allocation failed.")
}
if (extract == NULL)
@@ -3355,7 +3371,7 @@ void extract_list_parsing(const char *arg, extractlist* extract, globalData* glo
if (groupindex_ == EINVAL || groupindex_ == ERANGE || groupindex_ > 9 || groupindex_ < 1)
{
fprintf(stderr, ERR "Group index %lu\n", groupindex);
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Incorrect group : rank should be included between 1 and 9.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Incorrect group : rank should be included between 1 and 9.")
break;
}
@@ -3418,13 +3434,13 @@ void extract_list_parsing(const char *arg, extractlist* extract, globalData* glo
trackindex2 = strtol(trackchunk2, NULL, 10);
if (trackindex2 == EINVAL || trackindex2 == ERANGE || trackindex2 > 99 || trackindex2 < 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Incorrect track number: rank should be included between 1 and 99.");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Incorrect track number: rank should be included between 1 and 99.");
}
}
if (trackindex >= trackindex2 )
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Incorrect track numbers : ... should be between a and b, a < b");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Incorrect track numbers : ... should be between a and b, a < b");
}
for (int t = trackindex + 1; t <= trackindex2; ++t)
@@ -3445,7 +3461,7 @@ void extract_list_parsing(const char *arg, extractlist* extract, globalData* glo
trackindex = strtol(trackchunk, NULL, 10);
if (trackindex == EINVAL || trackindex == ERANGE || trackindex > 99 || trackindex < 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Incorrect track number: rank should be included between 1 and 99.");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Incorrect track number: rank should be included between 1 and 99.");
}
extract->extracttrackintitleset[groupindex - 1][trackindex - 1] = 1;
@@ -3457,7 +3473,7 @@ void extract_list_parsing(const char *arg, extractlist* extract, globalData* glo
if (trackindex == EINVAL || trackindex == ERANGE || trackindex < 1 || trackindex > 99)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Incorrect track number : rank should be included between 1 and 99.");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Incorrect track number : rank should be included between 1 and 99.");
}
extract->extracttitleset[groupindex - 1] = 1;
@@ -3514,7 +3530,7 @@ void ats2wav_parsing(const char *arg, const extractlist* extract, globalData* gl
if (audiots_chain == NULL)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not allocate global settings")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not allocate global settings")
}
sprintf(audiots_chain, "%s" SEPARATOR "AUDIO_TS", chain);
@@ -3522,7 +3538,7 @@ void ats2wav_parsing(const char *arg, const extractlist* extract, globalData* gl
if ((dir = opendir(audiots_chain)) == NULL)
{
foutput("%s\n", audiots_chain);
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not open input directory")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not open input directory")
}
change_directory(audiots_chain);
diff --git a/src/dvda-author.c b/src/dvda-author.c
index 601d9cfae..92cd0cdea 100755
--- a/src/dvda-author.c
+++ b/src/dvda-author.c
@@ -79,7 +79,7 @@ char* TEMPDIR;
if (command == NULL)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not allocate command-line structure")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not allocate command-line structure")
}
command=command_line_parsing(lexer->nlines, lexer->commandline, command, globals);
@@ -131,7 +131,7 @@ int main(int argc, char* const argv[])
if (currentdir == NULL)
{
- fprintf(stderr, "%s\n", ERR "Répertoire courant non alloué");
+ fprintf(stderr, "%s\n", ERR "Répertoire courant non alloué");
exit(-1);
}
@@ -206,7 +206,9 @@ int main(int argc, char* const argv[])
/*videozone*/ true, // generates video zone
/*videolinking*/ false, // no video link
/*decode */ false, // decode MLP to WAV
- /*pipe*/ false, // slow down extraction for buffering tp extrernal tools
+ /*encode */ false, // encode to MLP
+ /*to_mlp*/ false, // create MLP files while encoding to MLP
+ /*pipe*/ false, // slow down extraction for buffering tp extrernal tools
/*play*/ false, // pipe to ffplay or other player
/*playlist*/ false, // no playlist
/*cga*/ false, // no explicit channel group assignement
diff --git a/src/file_input_parsing.c b/src/file_input_parsing.c
index b8cd5016d..6b41da1a0 100755
--- a/src/file_input_parsing.c
+++ b/src/file_input_parsing.c
@@ -115,7 +115,7 @@ parse_directory(DIR* dir, uint8_t* ntracks, uint8_t n_g_groups, int action, fil
if ((ngroups_scan > MAX_GROUPS) || (ngroups_scan < 1))
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Subdirectories must be labelled ljm, with l, m any letters and j a number of 1 - 9")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Subdirectories must be labelled ljm, with l, m any letters and j a number of 1 - 9")
}
change_directory(gnames[ng], globals);
@@ -124,7 +124,7 @@ parse_directory(DIR* dir, uint8_t* ntracks, uint8_t n_g_groups, int action, fil
if ((subdir = opendir(".")) == NULL)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Input directory could not be opened")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Input directory could not be opened")
}
struct dirent * subdirent;
@@ -310,7 +310,7 @@ int parse_disk(const DIR* dir, mode_t mode, extractlist *extract)
if (d_name_duplicate == NULL)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "strdup error while parsing disk")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "strdup error while parsing disk")
}
// filenames must end in "_0.IFO" and begin in "ATS_"
diff --git a/src/include/audio2.h b/src/include/audio2.h
index 304688ce4..601750bf0 100755
--- a/src/include/audio2.h
+++ b/src/include/audio2.h
@@ -52,17 +52,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#endif
#include "multichannel.h"
#include "file_input_parsing.h"
-#include "mlplayout.h"
-#include "libavutil/opt.h"
-#include "libavcodec/avcodec.h"
-#include "libavformat/avformat.h"
-#include "libswresample/swresample.h"
#include "c_utils.h"
#include "ats.h"
#include "structures.h"
-
#define AFMT_WAVE 1
#define AFMT_FLAC 2
#define AFMT_MLP 5
diff --git a/src/include/auxiliary.h b/src/include/auxiliary.h
index 2884466ec..f443c69f8 100755
--- a/src/include/auxiliary.h
+++ b/src/include/auxiliary.h
@@ -57,7 +57,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#define BCD(X) ((X)/16*10 + (X)%16)
#define BCD_REVERSE(X) ((X)/10*16 + (X)%10)
-#define EXIT_ON_RUNTIME_ERROR_VERBOSE(X) do { fprintf(stderr, ERR "%s\n Exiting...\n", X) ; fflush(NULL); clean_exit(EXIT_FAILURE, globals); } while(0);
+#define EXIT_ON_RUNTIME_ERROR_VERBOSE(X) do { foutput(ERR "%s\n Exiting...\n", X) ; fflush(NULL); clean_exit(EXIT_FAILURE, globals); } while(0);
#define EXIT_ON_RUNTIME_ERROR EXIT_ON_RUNTIME_ERROR_VERBOSE("")
#define EXITING EXIT_ON_RUNTIME_ERROR
diff --git a/src/include/mlp.h b/src/include/mlp.h
new file mode 100644
index 000000000..4163d0926
--- /dev/null
+++ b/src/include/mlp.h
@@ -0,0 +1,23 @@
+#ifndef MLP_H_INCLUDED
+#define MLP_H_INCLUDED
+
+#include "libavcodec/avcodec.h"
+#include "libavutil/channel_layout.h"
+#include "libavutil/common.h"
+#include "libavutil/frame.h"
+#include "libavutil/samplefmt.h"
+#include "libavutil/opt.h"
+#include "libavformat/avformat.h"
+#include "libswresample/swresample.h"
+#include "mlplayout.h"
+
+#include "structures.h"
+#include "c_utils.h"
+#include "auxiliary.h"
+
+
+int decode_mlp_file(fileinfo_t* info, globalData* globals);
+int encode_mlp_file(fileinfo_t* info, globalData* globals);
+
+void transport_to_mlp(fileinfo_t* info, globalData* globals);
+#endif // MLP_H_INCLUDED
diff --git a/src/include/structures.h b/src/include/structures.h
index 502a86ae8..3ca9470c6 100755
--- a/src/include/structures.h
+++ b/src/include/structures.h
@@ -78,6 +78,7 @@ typedef struct
FLAC__StreamDecoder* flac;
char *filename;
char *out_filename;
+ char *mlp_filename;
char **given_channel;
struct MLP_LAYOUT *mlp_layout;
} fileinfo_t;
diff --git a/src/launch_manager.c b/src/launch_manager.c
index 27ef24381..7bfa3dc08 100755
--- a/src/launch_manager.c
+++ b/src/launch_manager.c
@@ -26,6 +26,7 @@
#include "file_input_parsing.h"
#include "launch_manager.h"
#include "videoimport.h"
+#include "mlp.h"
/* Remark on data structures:
* - command-line data belong to 'command' structures
@@ -70,8 +71,6 @@ static const char* cga_define[21] = {"Mono",
#define VTSI_rank command->VTSI_rank
#define maximum_VTSI_rank command->maximum_VTSI_rank
-
-
int launch_manager(command_t *command, globalData *globals)
{
@@ -153,7 +152,7 @@ int launch_manager(command_t *command, globalData *globals)
if (files[i][j].type != AFMT_MLP)
{
if
- ((files[i][j].samplerate > 48000 && files[i][j].bitspersample == 24
+ (((files[i][j].samplerate > 48000 && files[i][j].bitspersample == 24)
|| files[i][j].samplerate > 96000)
&& (files[i][j].channels == 5 || files[i][j].channels == 6)
)
@@ -189,8 +188,26 @@ int launch_manager(command_t *command, globalData *globals)
}
}
+ totalsize += files[i][j].numbytes;
+ }
+ }
+
+ for (int i = 0; i < naudio_groups ; ++i)
+ for (int j = 0; j < nfiles[i]; ++j)
+ {
+ if (globals->to_mlp) encode_mlp_file(&files[i][j], globals);
+ if (globals->encode_to_mlp_dvd) transport_to_mlp(&files[i][j], globals);
+ }
+
+ foutput("\n%s", "DVD MLP Layout\n");
+ foutput("%s\n",ANSI_COLOR_BLUE"Group"ANSI_COLOR_GREEN" Track "ANSI_COLOR_YELLOW"Rate"ANSI_COLOR_RED" Bits"ANSI_COLOR_RESET" Ch CGA N_Samples Status Filename\n");
- foutput("%c%c " ANSI_COLOR_BLUE "%d " ANSI_COLOR_GREEN "%02d" ANSI_COLOR_YELLOW " %6" PRIu32 " " ANSI_COLOR_RED "%02d" ANSI_COLOR_RESET " %d %s %10" PRIu64 " ",
+ for (int i = 0; i < naudio_groups ; ++i)
+ for (int j = 0; j < nfiles[i]; ++j)
+ {
+ if (globals->to_mlp)
+ {
+ foutput("%c%c " ANSI_COLOR_BLUE "%d " ANSI_COLOR_GREEN "%02d" ANSI_COLOR_YELLOW " %6" PRIu32 " " ANSI_COLOR_RED "%02d" ANSI_COLOR_RESET " %d %s %s",
joinmark[i][j],
singlestar[i],
i + 1,
@@ -199,13 +216,28 @@ int launch_manager(command_t *command, globalData *globals)
files[i][j].bitspersample,
files[i][j].channels,
files[i][j].cga < 21 ? cga_define[files[i][j].cga] : "Unknown",
- files[i][j].numsamples);
+ " converted");
- foutput("%s\n", files[i][j].filename);
+ foutput(" To file %s\n", files[i][j].mlp_filename);
+ }
- totalsize += files[i][j].numbytes;
+ char* MLP_ENCODED = globals->encode_to_mlp_dvd ? " MLPDVD" : " ";
+
+ foutput("%c%c " ANSI_COLOR_BLUE "%d " ANSI_COLOR_GREEN "%02d" ANSI_COLOR_YELLOW " %6" PRIu32 " " ANSI_COLOR_RED "%02d" ANSI_COLOR_RESET " %d %s %10" PRIu64 " %s ",
+ joinmark[i][j],
+ singlestar[i],
+ i + 1,
+ j + 1,
+ files[i][j].samplerate,
+ files[i][j].bitspersample,
+ files[i][j].channels,
+ files[i][j].cga < 21 ? cga_define[files[i][j].cga] : "Unknown",
+ files[i][j].numsamples,
+ MLP_ENCODED);
+
+ foutput("%s\n", files[i][j].filename);
}
- }
+
for (i = 0; i < nplaygroups; ++i)
{
@@ -444,7 +476,7 @@ int launch_manager(command_t *command, globalData *globals)
{
perror(ERR "title[k]");
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Impossible to create title arrays")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Impossible to create title arrays")
}
else
{
@@ -501,7 +533,7 @@ int launch_manager(command_t *command, globalData *globals)
files[i][j].last_sector,
files[i][j].first_PTS);
- foutput("%10"PRIu64" %2d\n",
+ foutput("%10"PRIu32" %2d\n",
files[i][j].PTS_length,
files[i][j].cga);
}
diff --git a/src/menu.c b/src/menu.c
index 87e6080ef..28ec7a846 100755
--- a/src/menu.c
+++ b/src/menu.c
@@ -98,7 +98,7 @@ void menu_characteristics_coherence_test(pic* img, uint8_t ngroups, globalData*
void create_activemenu(pic* img, globalData* globals)
{
- if (img->tsvob == NULL) EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "No matrix AUDIO_TS.VOB available for generating active menus.")
+ if (img->tsvob == NULL) EXIT_ON_RUNTIME_ERROR_VERBOSE( "No matrix AUDIO_TS.VOB available for generating active menus.")
uint8_t j;
uint64_t i;
@@ -176,7 +176,7 @@ void create_activemenu(pic* img, globalData* globals)
{
svvobfile=fopen(img->stillvob, "wb");
if (svvobfile == NULL)
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Cannot open AUDIO_SV.VOB for generating active menus.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Cannot open AUDIO_SV.VOB for generating active menus.")
foutput("\n"DBG "Creating active menu: will patch AUDIO_TS.VOB into AUDIO_SV.VOB=%s\n\n",img->stillvob);
@@ -361,7 +361,7 @@ int create_mpg(pic* img, uint16_t rank, char* mp2track, char* tempfile, globalDa
snprintf(command, 500, "%s -fill \"rgb(%s)\" -colorize 66%% %s", mogrify, img->backgroundcolors[rank], img->backgroundpic[rank]);
if (globals->debugging) foutput(INF "Launching mogrify to colorize menu: %d with command line %s\n", rank, command);
- if (system(win32quote(command)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "System command failed")
+ if (system(win32quote(command)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE( "System command failed")
fflush(NULL);
}
}
@@ -820,13 +820,13 @@ int prepare_overlay_img(char* text, int8_t group, pic *img, char* command, char*
"-draw", " \"text ", x0, ',' , ALBUM_TEXT_Y0, '\'', text, "\'\"", q);
free(q);
if (globals->debugging) foutput("%s%s\n", INF "Launching mogrify (title) with command line: ", command);
- if (system(win32quote(command)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "System command failed")
+ if (system(win32quote(command)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE( "System command failed")
fflush(NULL);
}
if ((img->imagepic[menu]==NULL) || (img->highlightpic[menu]==NULL) || (img->imagepic[menu]==NULL))
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "pic pathnames");
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "pic pathnames");
return -1;
}
@@ -1170,7 +1170,7 @@ int generate_menu_pics(command_t* command, pic* img, uint8_t ngroups, uint8_t *n
strcat(command2, q);
free(q);
if (globals->veryverbose) foutput(INF "Menu: %d/%d, groupcount: %d/%d.\n Launching mogrify (image) with command line: %s\n", menu, img->nmenus, groupcount, ngroups, command2);
- if (system(win32quote(command2)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "System command failed");
+ if (system(win32quote(command2)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE( "System command failed");
free(command2);
command2 = NULL;
copy_file(img->imagepic[menu], img->highlightpic[menu], globals);
@@ -1178,7 +1178,7 @@ int generate_menu_pics(command_t* command, pic* img, uint8_t ngroups, uint8_t *n
strcat(command1, q);
free(q);
if (globals->veryverbose) foutput(INF "Menu: %d/%d, groupcount: %d/%d.\n Launching mogrify (highlight) with command line: %s\n", menu, img->nmenus, groupcount, ngroups,command1);
- if (system(win32quote(command1)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "System command failed");
+ if (system(win32quote(command1)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE( "System command failed");
free(command1);
command1 = NULL;
char command3[500];
@@ -1192,7 +1192,7 @@ int generate_menu_pics(command_t* command, pic* img, uint8_t ngroups, uint8_t *n
free(q3);
free(q4);
if (globals->veryverbose) foutput(INF "Menu: %d/%d, groupcount: %d/%d.\n Launching convert (select) with command line: %s\n",menu, img->nmenus, groupcount, ngroups,command3);
- if (system(win32quote(command3)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "System command failed");
+ if (system(win32quote(command3)) == -1) EXIT_ON_RUNTIME_ERROR_VERBOSE( "System command failed");
menu++;
group=0;
diff --git a/src/mlp.c b/src/mlp.c
new file mode 100644
index 000000000..390aeb557
--- /dev/null
+++ b/src/mlp.c
@@ -0,0 +1,664 @@
+#include "mlp.h"
+
+static const uint8_t default_cga[6] = {0, 1, 7, 3, 9, 12}; //default channel assignment
+static uint32_t cga2wav_channels[21] = {0x4, 0x3, 0x103, 0x33, 0xB, 0x10B, 0x3B, 0x7, 0x107, 0x37, 0xF, 0x10F, 0x3F, 0x107, 0x37, 0xF, 0x10F, 0x3F, 0x3B, 0x37, 0x3B };
+
+int decode_mlp_file(fileinfo_t* info, globalData* globals)
+{
+ // initialize all muxers, demuxers and protocols for libavformat
+ // (does nothing if called twice during the course of one program execution)
+
+ av_register_all();
+
+ const char* path = info->filename;
+
+ // get format from audio file
+ AVFormatContext* format = avformat_alloc_context();
+
+ if (avformat_open_input(&format, path, NULL, NULL) != 0)
+ {
+ fprintf(stderr, ERR "Could not open file '%s'\n", path);
+ EXIT_ON_RUNTIME_ERROR
+ }
+
+ if (avformat_find_stream_info(format, NULL) < 0)
+ {
+ fprintf(stderr, ERR "Could not retrieve stream info from file '%s'\n", path);
+ EXIT_ON_RUNTIME_ERROR
+ }
+ errno = 0; // hushes up an ioctl report
+ // Find the index of the first audio stream
+
+ int stream_index = -1;
+ for (int i = 0; i < format->nb_streams; ++i)
+ {
+ if (format->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
+ {
+ stream_index = i;
+ break;
+ }
+ }
+
+ if (stream_index == -1)
+ {
+ fprintf(stderr, ERR "Could not retrieve audio stream from file '%s'\n", path);
+ EXIT_ON_RUNTIME_ERROR
+ }
+
+ AVStream* stream = format->streams[stream_index];
+
+ // find & open codec
+
+ AVCodecContext* codec = stream->codec;
+
+ codec->request_sample_fmt = av_get_alt_sample_fmt(codec->sample_fmt, 0);
+
+ if (avcodec_open2(codec, avcodec_find_decoder(codec->codec_id), NULL) < 0)
+ {
+ fprintf(stderr, ERR "Failed to open decoder for stream #%u in file '%s'\n", stream_index, path);
+ EXIT_ON_RUNTIME_ERROR
+ }
+
+ // prepare to read data
+ AVPacket packet;
+
+ av_init_packet(&packet);
+
+ AVFrame* frame = av_frame_alloc();
+
+ if (!frame)
+ {
+ fprintf(stderr, ERR "Error allocating the frame\n");
+ EXIT_ON_RUNTIME_ERROR
+ }
+
+ FILE* fp = NULL;
+ WaveData info2;
+ WaveHeader header;
+
+ int32_t cumbytes_written = 0;
+
+ if (globals->decode)
+ {
+ int32_t bytes_written = 0;
+ errno = 0;
+ while (av_read_frame(format, &packet) >= 0)
+ {
+ // decode one frame
+ int gotFrame;
+ int ret;
+ if ((ret = avcodec_decode_audio4(codec, frame, &gotFrame, &packet)) < 0)
+ {
+ fprintf(stderr, ERR "Error decoding audio frame (%s)\n", av_err2str(ret));
+ errno = 0;
+ if (fp) fclose(fp);
+ if (errno)
+ fprintf(stderr, ERR "Could not close file %s\n", info->out_filename);
+ else
+ fprintf(stderr, MSG_TAG "Extracted %ld bytes from file %s to file %s\n", cumbytes_written, path, info->out_filename);
+ break;
+ }
+
+ if (gotFrame)
+ {
+
+ if (globals->decode && bytes_written == 0)
+ {
+ if (info->out_filename && globals->fixwav_prepend)
+ {
+ fprintf(stderr, INF "Decoding file %s to raw data in path: %s\n", info->filename, info->out_filename);
+ int debug = globals->debugging;
+
+ // Hush it up as there will be spurious error mmsg
+
+ globals->debugging = false;
+
+ // initializ
+
+ memset(&info2, 0, sizeof (WaveData));
+ memset(&header, 0, sizeof (WaveHeader));
+
+ // WaveData info: file and header prepending characteristics
+
+ info2.prepend = true;
+ info2.in_place = true;
+ info2.cautious = false;
+ info2.automatic = true;
+ info2.interactive = false;
+ info2.prunedbytes = 0;
+ info2.padbytes = 0;
+ info2.virtual = false;
+ info2.outfile.filename = info->out_filename;
+ info2.outfile.fp = fp;
+ info2.infile = info2.outfile;
+ info2.infile.isopen = false;
+
+ // WaveHeader info : audio and header characteristics
+
+
+ header.header_size_out = 80;
+ header.channels = frame->channels;
+ header.is_extensible = header.channels > 2;
+ header.nBlockAlign = frame->channels * codec->bits_per_raw_sample / 8 ;
+ header.wBitsPerSample = codec->bits_per_raw_sample;
+ header.dwChannelMask = (frame->channel_layout < 21 && frame->channel_layout > 0) ? cga2wav_channels[frame->channel_layout] : 0;
+ header.dwSamplesPerSec = frame->sample_rate;
+
+ // Prepend header to empty file. Will close files.
+
+ fixwav(&info2, &header, globals);
+
+ // Restore verbosity levels
+
+ globals->debugging = debug;
+
+
+ }
+
+ fp = fopen(info->out_filename, "ab+");
+ if (fp == NULL)
+ {
+ fprintf(stderr, ERR "Could not open destination file %s\n", info->out_filename);
+ info->out_filename = NULL;
+ globals->decode = false;
+ }
+
+ }
+
+ if (globals->decode && fp)
+ {
+ size_t unpadded_linesize = 0;
+
+ int sampleSize = av_get_bytes_per_sample(codec->sample_fmt);
+
+ if (sampleSize == 2)
+ {
+ unpadded_linesize = frame->channels * sampleSize * frame->nb_samples;
+ bytes_written = fwrite(frame->extended_data[0], 1, unpadded_linesize, fp);
+ }
+ else
+ if (sampleSize == 4) // 32 bits -> 24 bits (codec->bits_per_raw_sample)
+ {
+
+ uint32_t bytes_written_sample = 0;
+ for(int s = 0; s < frame->nb_samples; ++s)
+ {
+ for(int c = 0; c < codec->channels; ++c)
+ {
+ uint32_t val = ((int32_t*) frame->extended_data[0])[s * codec->channels + c];
+ val >>= 8; // sampleSize * 8 - codec->bits_per_raw_sample
+
+ bytes_written_sample += fwrite(&val, 1, 3, fp);
+ }
+ }
+
+ bytes_written = bytes_written_sample;
+ }
+ else
+ {
+ fprintf(stderr, "Invalid sample size %d.\n", sampleSize);
+ fclose(fp);
+ break;
+ }
+
+ }
+
+ cumbytes_written += bytes_written;
+
+ if (globals->maxverbose)
+ {
+ fprintf(stderr, "Bytes_written: %d Nb samples: %d FR_PTS: %ld PKT_POS: %ld PKT_DURATION: %ld FR_PKT_SIZE; %ld\n",
+ cumbytes_written,
+ frame->nb_samples,
+ frame->pts,
+ frame->pkt_pos,
+ frame->pkt_duration,
+ frame->pkt_size);
+ }
+
+ }
+ else
+ {
+ continue;
+ }
+ }
+
+ if (globals->decode && info->out_filename && globals->fixwav_prepend)
+ {
+// WAV output is now OK except for the wav file size-based header data.
+// ckSize, data_ckSize and nBlockAlign must be readjusted by computing
+// the exact audio content bytesize. Also we no longer prepend the header
+// but overwrite the existing one
+
+ fp = fopen(info->out_filename, "rb+");
+ if (fp == NULL)
+ {
+ fprintf(stderr, ERR "Could not open destination file %s\n", info->out_filename);
+ info->out_filename = NULL;
+ globals->decode = false;
+ }
+ else
+ {
+ info2.infile.fp = fp;
+ info2.infile.isopen = true;
+
+ // No longer prepend to empty file but overwrite in place
+
+ info2.prepend = false;
+ info2.in_place = true;
+
+ errno = 0;
+
+ fixwav(&info2, &header, globals);
+
+ if (errno)
+ fprintf(stderr, ERR "Error detected in header correction for %s\n", info->out_filename);
+ else
+ fprintf(stderr, MSG_TAG "Extracted %ld bytes to file %s\n", cumbytes_written, info->out_filename);
+ }
+ }
+ }
+ else
+ {
+ uint32_t rank = 0;
+ uint32_t totnbsamples = 0;
+ unsigned long PKT_POS_SECT = 0;
+ unsigned long HEADER_OFFSET = 0;
+ unsigned long SECT_RANK = 0;
+ unsigned long SECT_RANK_OLD = 0;
+
+ if (info->file_size && info->lpcm_payload)
+ {
+ uint32_t size = info->file_size / info->lpcm_payload + 4;
+ info->mlp_layout = (struct MLP_LAYOUT *) calloc(size, sizeof (struct MLP_LAYOUT));
+ }
+ else
+ {
+ goto clean_up; // do sth more verbose
+ }
+
+ while (av_read_frame(format, &packet) >= 0)
+ {
+ // decode one frame
+ int gotFrame;
+ if (avcodec_decode_audio4(codec, frame, &gotFrame, &packet) < 0)
+ {
+ break;
+ }
+
+ if (gotFrame)
+ {
+ if (HEADER_OFFSET == 0) HEADER_OFFSET = 64;
+
+ PKT_POS_SECT = frame->pkt_pos + HEADER_OFFSET;
+
+ SECT_RANK_OLD = SECT_RANK;
+ SECT_RANK = (PKT_POS_SECT - 1)/ 2048;
+
+ bool new_sector = (SECT_RANK != SECT_RANK_OLD);
+
+ if (new_sector || rank == 0)
+ {
+ if (new_sector) HEADER_OFFSET += 43;
+ info->mlp_layout[rank].pkt_pos = frame->pkt_pos;
+ info->mlp_layout[rank].nb_samples = totnbsamples;
+ info->mlp_layout[rank].rank = SECT_RANK;
+
+ ++rank;
+ }
+
+ totnbsamples += frame->nb_samples;
+
+ if (globals->maxverbose)
+ {
+ fprintf(stderr, "Sect: %lu samples_written: %d Nb samples: %d FR_PTS: %ld PKT_POS: %ld PKT_DURATION: %ld FR_PKT_SIZE; %ld\n",
+ SECT_RANK,
+ totnbsamples,
+ frame->nb_samples,
+ frame->pts,
+ frame->pkt_pos,
+ frame->pkt_duration,
+ frame->pkt_size);
+ }
+ }
+ else
+ {
+ continue;
+ }
+
+ }
+
+ info->mlp_layout[rank].pkt_pos = frame->pkt_pos;
+ info->mlp_layout[rank].nb_samples = totnbsamples;
+ info->mlp_layout[rank].rank = SECT_RANK;
+ info->mlp_layout_size = rank + 1;
+
+ if (globals->maxverbose)
+ {
+ fprintf(stderr, "** \n Layout size: %d **\n", info->mlp_layout_size);
+ }
+ }
+
+clean_up:
+
+ av_frame_free(&frame);
+ avcodec_close(codec);
+ avformat_free_context(format);
+
+ return errno;
+}
+
+
+
+/* check that a given sample format is supported by the encoder */
+
+static int check_sample_fmt(const AVCodec *codec, enum AVSampleFormat sample_fmt)
+{
+ const enum AVSampleFormat *p = codec->sample_fmts;
+
+ while (*p != AV_SAMPLE_FMT_NONE) {
+ if (*p == sample_fmt)
+ return 1;
+ p++;
+ }
+ return 0;
+}
+
+/* just pick the highest supported samplerate */
+static int select_sample_rate(const AVCodec *codec)
+{
+ const int *p;
+ int best_samplerate = 0;
+
+ if (!codec->supported_samplerates)
+ return 44100;
+
+ p = codec->supported_samplerates;
+ while (*p) {
+ if (!best_samplerate || abs(44100 - *p) < abs(44100 - best_samplerate))
+ best_samplerate = *p;
+ p++;
+ }
+ return best_samplerate;
+}
+
+/* select layout with the highest channel count */
+static int select_channel_layout(const AVCodec *codec)
+{
+ const uint64_t *p;
+ uint64_t best_ch_layout = 0;
+ int best_nb_channels = 0;
+
+ if (!codec->channel_layouts)
+ return AV_CH_LAYOUT_STEREO;
+
+ p = codec->channel_layouts;
+ while (*p) {
+ int nb_channels = av_get_channel_layout_nb_channels(*p);
+
+ if (nb_channels > best_nb_channels) {
+ best_ch_layout = *p;
+ best_nb_channels = nb_channels;
+ }
+ p++;
+ }
+ return best_ch_layout;
+}
+
+
+static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *output, globalData* globals)
+{
+ int ret;
+
+ /* send the frame for encoding */
+ ret = avcodec_send_frame(ctx, frame);
+ if (ret < 0)
+ {
+ clean_exit(ERR "Error sending the frame to the encoder\n", globals);
+ }
+
+ /* read all the available output packets (in general there may be any
+ * number of them */
+
+ while (ret >= 0)
+ {
+ ret = avcodec_receive_packet(ctx, pkt);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ return;
+ else if (ret < 0)
+ {
+ clean_exit(ERR "Error encoding audio frame\n", globals);
+ }
+
+ fwrite(pkt->data, 1, pkt->size, output);
+ av_packet_unref(pkt);
+ }
+}
+
+int encode_mlp_file(fileinfo_t* info, globalData* globals)
+{
+ // initialize all muxers, demuxers and protocols for libavformat
+ // (does nothing if called twice during the course of one program execution)
+
+ if (globals->debugging)
+ foutput(INF "Encoding %s to MLP\n", info->filename);
+
+ av_register_all();
+
+ const AVCodec *codec;
+ AVCodecContext *c= NULL;
+ AVFrame *frame;
+ AVPacket *pkt;
+ int ret;
+ uint16_t *samples;
+ int32_t bytes_written = 0;
+
+ errno = 0;
+
+ codec = avcodec_find_encoder(AV_CODEC_ID_MLP);
+ if (! codec)
+ {
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "MLP codec not found\n");
+ }
+
+ c = avcodec_alloc_context3(codec);
+ if (!c)
+ {
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not allocate audio codec context\n");
+ }
+
+ /* put sample parameters */
+
+ c->sample_fmt = info->bitspersample == 16 ? AV_SAMPLE_FMT_S16 : AV_SAMPLE_FMT_S32;
+
+ if (!check_sample_fmt(codec, c->sample_fmt))
+ {
+ foutput(ERR "Encoder does not support sample format %s",
+ av_get_sample_fmt_name(c->sample_fmt));
+ EXITING
+ }
+
+ #if 0
+voir ces constantes de libavutil/channel_layout.h et déduire le channel layout c->channel_layout MLP du CGA WAV.
+Ce sont les mêmes que els définitions wav Microsoft...
+
+#define AV_CH_FRONT_LEFT 0x00000001
+#define AV_CH_FRONT_RIGHT 0x00000002
+#define AV_CH_FRONT_CENTER 0x00000004
+#define AV_CH_LOW_FREQUENCY 0x00000008
+#define AV_CH_BACK_LEFT 0x00000010
+#define AV_CH_BACK_RIGHT 0x00000020
+#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040
+#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080
+#define AV_CH_BACK_CENTER 0x00000100
+#define AV_CH_SIDE_LEFT 0x00000200
+#define AV_CH_SIDE_RIGHT 0x00000400
+#define AV_CH_TOP_CENTER 0x00000800
+#define AV_CH_TOP_FRONT_LEFT 0x00001000
+#define AV_CH_TOP_FRONT_CENTER 0x00002000
+#define AV_CH_TOP_FRONT_RIGHT 0x00004000
+#define AV_CH_TOP_BACK_LEFT 0x00008000
+#define AV_CH_TOP_BACK_CENTER 0x00010000
+#define AV_CH_TOP_BACK_RIGHT 0x00020000
+#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix.
+#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT.
+#define AV_CH_WIDE_LEFT 0x0000000080000000ULL
+#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL
+#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL
+#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL
+#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL
+#define AV_CH_TOP_SIDE_LEFT 0x0000001000000000ULL
+#define AV_CH_TOP_SIDE_RIGHT 0x0000002000000000ULL
+#define AV_CH_BOTTOM_FRONT_CENTER 0x0000004000000000ULL
+#define AV_CH_BOTTOM_FRONT_LEFT 0x0000008000000000ULL
+#define AV_CH_BOTTOM_FRONT_RIGHT 0x0000010000000000ULL
+
+ #endif // 0
+
+
+ c->sample_rate = info->samplerate;
+
+ if (info->dw_channel_mask)
+ c->channel_layout = info->dw_channel_mask;
+ else
+ {
+ if (info->channels == 1)
+ c->channel_layout = AV_CH_LAYOUT_MONO;
+ else
+ if (info->channels == 2)
+ c->channel_layout = AV_CH_LAYOUT_STEREO;
+ else
+ c->channel_layout = cga2wav_channels[default_cga[info->channels - 1]];
+ }
+
+ c->channels = info->channels;
+
+ /* open it */
+
+ c->strict_std_compliance = -2; // allow experimental codecs
+
+ if (avcodec_open2(c, codec, NULL) < 0)
+ {
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not open codec\n")
+ }
+
+ FILE* in_fp = fopen(strdup(info->filename), "rb");
+
+ path_t* fn = parse_filepath(info->filename, globals);
+
+ char* out_filename = (char*) calloc(strlen(globals->settings.tempdir) + 1 + strlen(fn->rawfilename) + 12+ 1, sizeof(char));
+
+ sprintf(out_filename, "%s%s%s%s", globals->settings.tempdir, SEPARATOR, fn->rawfilename, "_enc_wav.mlp");
+
+ free_filepath(fn);
+
+ FILE* out_fp = fopen(strdup(out_filename), "wb");
+
+ if (! in_fp)
+ {
+ foutput("Could not read %s\n", info->filename);
+ EXITING
+ }
+
+ if (! out_fp)
+ {
+ foutput("Could not write to %s\n", out_filename);
+ EXITING
+ }
+
+ /* packet for holding encoded output */
+ pkt = av_packet_alloc();
+ if (!pkt) {
+ fprintf(stderr, "could not allocate the packet\n");
+ exit(1);
+ }
+
+ /* frame containing input raw audio */
+ frame = av_frame_alloc();
+ if (!frame) {
+ fprintf(stderr, "Could not allocate audio frame\n");
+ exit(1);
+ }
+
+ frame->nb_samples = c->frame_size;
+ frame->format = c->sample_fmt;
+ frame->channel_layout = c->channel_layout;
+
+ /* allocate the data buffers */
+
+ //// CURRENTLY VANILLA FFMPEG ENCODER NOT AVAILABLE FOR 24-BIT AUDIO ///
+
+ int res = av_frame_get_buffer(frame, 0);
+ if (res < 0) {
+ fprintf(stderr, "Could not allocate audio data buffers\n");
+ exit(2);
+ }
+
+ while(true)
+ {
+ uint16_t *samples;
+ res = av_frame_make_writable(frame);
+ if (res < 0)
+ exit(1);
+ samples = (uint16_t*) frame->data[0];
+ int load = info->channels * 2 * c->frame_size;
+
+ res = fread(samples, load, 1, in_fp);
+ if (res)
+ {
+ encode(c, frame, pkt, out_fp, globals);
+ bytes_written += load;
+ }
+
+ if (res == 0)
+ {
+ res = fread(frame->data[0], 1, load, in_fp);
+ encode(c, frame, pkt, out_fp, globals);
+ bytes_written += res;
+ break;
+ }
+ }
+
+ /* flush the encoder */
+ encode(c, NULL, pkt, out_fp, globals);
+
+ fclose(out_fp);
+ fclose(in_fp);
+
+ av_frame_free(&frame);
+ av_packet_free(&pkt);
+ avcodec_free_context(&c);
+
+ info->mlp_filename = out_filename;
+
+ if (errno == 0 && globals->debugging)
+ {
+ foutput(MSG_TAG "MLP encoding performed:\n %s --> %s\n", info->filename, out_filename);
+ }
+
+ return errno;
+}
+
+
+void transport_to_mlp(fileinfo_t* info, globalData* globals)
+{
+ free(info->filename);
+ info->filename = strdup(info->mlp_filename);
+ if (info->filename == NULL) EXIT_ON_RUNTIME_ERROR_VERBOSE("Could not copy MLP filename.")
+
+ int res = audiofile_getinfo(info, globals);
+
+ if (res == AFMT_MLP)
+ {
+ if (globals->debugging)
+ foutput(MSG_TAG "Found MLP format for %s\n", info->filename);
+
+ info->type = AFMT_MLP;
+ }
+ else
+ {
+ foutput(MSG_TAG "Unfortunately did not find MLP format for file %s\n", info->filename);
+ EXITING
+ }
+}
+
diff --git a/src/samg2.c b/src/samg2.c
index d0002aec0..aebc3d8e6 100755
--- a/src/samg2.c
+++ b/src/samg2.c
@@ -152,7 +152,7 @@ uint32_t create_samg(char* audiotsdir, command_t *command, sect* sectors, global
samg[i] = 0x22;
break;
default:
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Unsupported bit rate (channels > 2)")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Unsupported bit rate (channels > 2)")
}
}
else
@@ -169,7 +169,7 @@ uint32_t create_samg(char* audiotsdir, command_t *command, sect* sectors, global
samg[i] = 0x2f;
break;
default:
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Unsupported bit rate (channels <= 2)")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Unsupported bit rate (channels <= 2)")
}
}
@@ -198,7 +198,7 @@ uint32_t create_samg(char* audiotsdir, command_t *command, sect* sectors, global
samg[i] = 0xaa;
break;
default:
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Unsupported sample rate (channels > 2)")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Unsupported sample rate (channels > 2)")
}
}
else
@@ -226,7 +226,7 @@ uint32_t create_samg(char* audiotsdir, command_t *command, sect* sectors, global
break;
default:
fprintf(stderr, ERR "Sample rate : %d - Group %d - Track %d\n", files[g][j].samplerate, g, j);
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Unsupported sample rate (channels <= 2)")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Unsupported sample rate (channels <= 2)")
}
}
diff --git a/src/sound.c b/src/sound.c
index c1c62963e..1a71504af 100755
--- a/src/sound.c
+++ b/src/sound.c
@@ -277,7 +277,7 @@ int launch_lplex_hybridate(const pic* img,
if (ntracks == NULL || nslides == NULL || slidepath == NULL || trackpath == NULL)
{
fprintf(stderr, ERR "Error code: %d\n", (ntracks == NULL )*1+(nslides == NULL)*10+(slidepath == NULL)*100+(trackpath == NULL)*1000);
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Allocation of DVD-VIDEO tracks/slides")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Allocation of DVD-VIDEO tracks/slides")
}
#endif
const char *args0[DIM_LPLEX_CLI]= {LPLEX_BASENAME,
@@ -384,7 +384,7 @@ int launch_lplex_hybridate(const pic* img,
// if (tot == argssize+DIM_LPLEX_CLI)
- // EXIT_ON_RUNTIME_ERROR_VERBOSE("[ERR] Two many tracks/slides")
+ // EXIT_ON_RUNTIME_ERROR_VERBOSE("Two many tracks/slides")
}
}
diff --git a/src/videoimport.c b/src/videoimport.c
index 1d0c661a2..8240f9a27 100755
--- a/src/videoimport.c
+++ b/src/videoimport.c
@@ -75,7 +75,7 @@ void get_video_system_file_size(char * path_to_VIDEO_TS, int maximum_VTSI_rank,
if ((temp_file=fopen(temp, "rb")) == NULL)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not open VIDEO_TS.IFO. There must be a valid DVD-VIDEO file structure under VIDEO_TS.")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not open VIDEO_TS.IFO. There must be a valid DVD-VIDEO file structure under VIDEO_TS.")
}
// Retrieving size of VIDEO_TS.IFO
@@ -84,7 +84,7 @@ void get_video_system_file_size(char * path_to_VIDEO_TS, int maximum_VTSI_rank,
if (fseek(temp_file, 0xC, SEEK_SET) != 0)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not seek offset 0x0C of VIDEO_TS.IFO")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not seek offset 0x0C of VIDEO_TS.IFO")
}
fread_endian(relative_sector_pointer_VTSI, 0, temp_file);
@@ -108,7 +108,7 @@ void get_video_system_file_size(char * path_to_VIDEO_TS, int maximum_VTSI_rank,
if (fseek(temp_file, 0xC, SEEK_SET) !=0)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not seek offset 0xC of VTS....IFO")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not seek offset 0xC of VTS....IFO")
}
fread_endian(relative_sector_pointer_VTSI, k, temp_file);
@@ -157,17 +157,17 @@ void get_video_PTS_ticks(char* path_to_VIDEO_TS, uint32_t *videotitlelength, uin
if (fread(&hours, 1, 1, temp_file) != 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not read 1 byte at offset 4 of PGC")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not read 1 byte at offset 4 of PGC")
}
if (fread(&minutes, 1, 1, temp_file) != 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not read 1 byte at offset 5 of PGC")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not read 1 byte at offset 5 of PGC")
}
if (fread(&seconds, 1, 1, temp_file) != 1)
{
- EXIT_ON_RUNTIME_ERROR_VERBOSE(ERR "Could not read 1 byte at offset 6 of PGC")
+ EXIT_ON_RUNTIME_ERROR_VERBOSE( "Could not read 1 byte at offset 6 of PGC")
}
// frames will not be considered