diff -Nru project-x-0.90.4dfsg/build.bat project-x-0.91.0/build.bat --- project-x-0.90.4dfsg/build.bat 2005-12-31 17:28:46.000000000 +0000 +++ project-x-0.91.0/build.bat 2011-03-27 13:08:40.000000000 +0000 @@ -1,13 +1,13 @@ @echo off rem test if JAVA_HOME is already set in the system environment -if exist "%JAVA_HOME%\bin\javac.exe" goto JAVA_HOME_SET +if exist "%JAVA_HOME%\bin\java.exe" goto JAVA_HOME_SET rem IMPORTANT! Edit the next line and set JAVA_HOME according to your environment. -set JAVA_HOME=C:\programme\jdk150 +set JAVA_HOME=C:\programme\jdk122 rem test if JAVA_HOME is set correctly now -if exist "%JAVA_HOME%\bin\javac.exe" goto JAVA_HOME_SET +if exist "%JAVA_HOME%\bin\java.exe" goto JAVA_HOME_SET echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! echo ! Error: JAVA_HOME not found ! diff -Nru project-x-0.90.4dfsg/build_nogui.bat project-x-0.91.0/build_nogui.bat --- project-x-0.90.4dfsg/build_nogui.bat 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/build_nogui.bat 2011-03-27 13:48:02.000000000 +0000 @@ -0,0 +1,48 @@ +@echo off + +rem test if JAVA_HOME is already set in the system environment +if exist "%JAVA_HOME%\bin\java.exe" goto JAVA_HOME_SET + +rem IMPORTANT! Edit the next line and set JAVA_HOME according to your environment. +set JAVA_HOME=C:\programme\jdk122 + +rem test if JAVA_HOME is set correctly now +if exist "%JAVA_HOME%\bin\java.exe" goto JAVA_HOME_SET + +echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +echo ! Error: JAVA_HOME not found ! +echo ! Please correct the build.bat file and set the JAVA_HOME path variable. ! +echo ! If not installed a Java SDK can be downloaded from http://java.sun.com ! +echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +pause +goto END + + +:JAVA_HOME_SET + +echo deleting old ProjectX.jar file +del noguiProjectX.jar + +echo creating build subdirectory +mkdir build + +echo compiling ProjectX with JAVA_HOME=%JAVA_HOME% +"%JAVA_HOME%\bin\javac.exe" -O -classpath lib\commons-net-1.3.0.jar -d build @noguisources.lst +if errorlevel 1 goto ERROR + +echo copying resources +copy resources\*.* build +if errorlevel 1 goto ERROR + +echo building ProjectX.jar file +"%JAVA_HOME%\bin\jar.exe" cfvm noguiProjectX.jar MANIFEST.MF -C build . +if errorlevel 1 goto ERROR +goto END + +:ERROR +echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +echo ! Some Errors occured, stopping build ! +echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +pause + +:END diff -Nru project-x-0.90.4dfsg/build.sh project-x-0.91.0/build.sh --- project-x-0.90.4dfsg/build.sh 2005-09-10 22:59:42.000000000 +0000 +++ project-x-0.91.0/build.sh 2011-03-27 18:59:17.000000000 +0000 @@ -1,5 +1,14 @@ #! /bin/bash -# Build script for ProjectX under Linux +# Build script for ProjectX under Linux + +# check prerequisites +type javac >/dev/null 2>&1 +if [ $? -ne 0 ] ; then + echo "javac not found in \$PATH" >&2 + echo "Please install the JAVA compiler before calling this +script!" >&2 + exit 1 +fi if [ -e ./ProjectX.jar ] ; then rm -f ./ProjectX.jar @@ -10,7 +19,7 @@ fi mkdir -p build -javac -encoding "ISO-8859-1" -deprecation -O -g:none -classpath lib/commons-net-1.3.0.jar:lib/jakarta-oro-2.0.8.jar -d build @sources.lst +javac -encoding "ISO-8859-1" -deprecation -O -g:none -classpath lib/commons-net-1.3.0.jar:libjakarta-oro-2.0.8.jar -d build @sources.lst cp ./resources/* ./build jar cfvm ProjectX.jar MANIFEST.MF -C build . diff -Nru project-x-0.90.4dfsg/c_src/idct_ref/build.bat project-x-0.91.0/c_src/idct_ref/build.bat --- project-x-0.90.4dfsg/c_src/idct_ref/build.bat 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/c_src/idct_ref/build.bat 2004-12-01 01:26:24.000000000 +0000 @@ -0,0 +1,12 @@ +rem c-compiler env variables must be set too +set JAVA_HOME=C:\j2sdk1.4.2 +set PATH=%JAVA_HOME%\bin;%PATH% + +javah -classpath ..\..\ProjectX.jar net.sourceforge.dvb.projectx.video.IDCTRefNative + + +cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD net_sourceforge_dvb_projectx_video_IDCTRefNative.c idctref.c -Feidctref.dll + +copy idctref.dll ..\..\lib + +pause \ No newline at end of file diff -Nru project-x-0.90.4dfsg/c_src/idct_ref/idctref.c project-x-0.91.0/c_src/idct_ref/idctref.c --- project-x-0.90.4dfsg/c_src/idct_ref/idctref.c 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/c_src/idct_ref/idctref.c 2004-12-01 01:26:24.000000000 +0000 @@ -0,0 +1,350 @@ +/* idctref_miha.c, Inverse Discrete Fourier Transform, double precision */ + +/*************************************************************/ +/* */ +/* x87 hand-optimized assembly by Miha Peternel */ +/* 27.11. - 20.1.2001 */ +/* */ +/* You are free to use this code in your project if: */ +/* - no changes are made to this message */ +/* - any changes to this code are publicly available */ +/* - your project documentation contains the following text: */ +/* "This software contains fast high-quality IDCT decoder */ +/* by Miha Peternel." */ +/* */ +/*************************************************************/ + +/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1 + * direct matrix multiply) Inverse Discrete Cosine Transform +*/ + +/* Here we use math.h to generate constants. Compiler results may vary a little */ + +#include + +#define M_PI 3.1415926535897932384626433832795 +const static double HALF = 0.5; + +/* cosine transform matrix for 8x1 IDCT */ +static double c[8][8]; + +/* initialize DCT coefficient matrix */ +void Initialize_REF_IDCT() +{ + int freq, time; + double scale; + + for (freq=0; freq < 8; freq++) + { + scale = (freq==0) ? sqrt(0.125) : 0.5; + for (time=0; time<8; time++) + c[freq][time] = scale*cos((M_PI/8.0)*freq*(time + 0.5)); + } +} + +void REF_IDCT(short *block) +{ + double tmp[64]; + double rnd[64]; + int int0, int1, int2, int3, int4, int5, int6, int7; + unsigned short fpold; + unsigned short fpnew; + + int *b = (int *) block; + + + if( !(b[0]|(b[31]&~0x10000)) ) + { + if( b[ 1]|b[ 2]|b[ 3]|b[ 4]|b[ 5]|b[ 6] ) + goto normal; + if( b[ 7]|b[ 8]|b[ 9]|b[10]|b[11]|b[12] ) + goto normal; + if( b[13]|b[14]|b[15]|b[16]|b[17]|b[18] ) + goto normal; + if( b[19]|b[20]|b[21]|b[22]|b[23]|b[24] ) + goto normal; + if( b[25]|b[26]|b[27]|b[28]|b[29]|b[30] ) + goto normal; + b[31]=0; + return; + } +normal: + + __asm + { + // do the IDCT + mov esi,[block] + lea eax,[c] + lea edi,[tmp] + //mov ebx,8 + mov ebx,8 // 0x77000000 // 8 + align 16 + __col1: + movzx edx,[esi+1*2] + mov ecx,[esi+2*2] + or edx,[esi+4*2] + or ecx,[esi+6*2] + or edx,ecx + //mov ecx,8 + mov ecx,8/2 // 0x77000000 // 8 + + jnz __row1 + fild word ptr [esi+0*2] + fmul qword ptr [eax+0*8*8] + fst qword ptr [edi+0*8] + fst qword ptr [edi+1*8] + fst qword ptr [edi+2*8] + fst qword ptr [edi+3*8] + fst qword ptr [edi+4*8] + fst qword ptr [edi+5*8] + fst qword ptr [edi+6*8] + fstp qword ptr [edi+7*8] + add edi,8*8 + jmp __next1 + align 16 + __row1: + fild word ptr [esi+0*2] + fmul qword ptr [eax+0*8*8] + fild word ptr [esi+1*2] + fmul qword ptr [eax+1*8*8] + fadd + fild word ptr [esi+2*2] + fmul qword ptr [eax+2*8*8] + fadd + fild word ptr [esi+3*2] + fmul qword ptr [eax+3*8*8] + fadd + fild word ptr [esi+4*2] + fmul qword ptr [eax+4*8*8] + fadd + fild word ptr [esi+5*2] + fmul qword ptr [eax+5*8*8] + fadd + fild word ptr [esi+6*2] + fmul qword ptr [eax+6*8*8] + fadd + fild word ptr [esi+7*2] + fmul qword ptr [eax+7*8*8] + fadd + + fild word ptr [esi+0*2] + fmul qword ptr [eax+0*8*8+8] + fild word ptr [esi+1*2] + fmul qword ptr [eax+1*8*8+8] + fadd + fild word ptr [esi+2*2] + fmul qword ptr [eax+2*8*8+8] + fadd + fild word ptr [esi+3*2] + fmul qword ptr [eax+3*8*8+8] + fadd + fild word ptr [esi+4*2] + fmul qword ptr [eax+4*8*8+8] + fadd + fild word ptr [esi+5*2] + fmul qword ptr [eax+5*8*8+8] + fadd + fild word ptr [esi+6*2] + fmul qword ptr [eax+6*8*8+8] + fadd + fild word ptr [esi+7*2] + fmul qword ptr [eax+7*8*8+8] + fadd + add eax,8*2 + fxch st(1) + fstp qword ptr [edi]// + fstp qword ptr [edi+8] + add edi,8*2 + + dec ecx + + jnz __row1 + add eax,-8*8 + //align 16 + __next1: + add esi,+8*2 + + sub ebx,0x80000001 // add ebx,ebx + js __col1 + //align 16 + test ebx,ebx // align jump &| redo flags + jnz __col1 + + lea esi,[tmp] + lea eax,[c] + lea edi,[rnd] + //mov edi,[block] + fld qword ptr [HALF] + mov ebx,8 + __row2: + mov ecx,8/2 + align 16 + __col2: + fld qword ptr [esi+0*8*8] + fmul qword ptr [eax+0*8*8] + fld qword ptr [esi+1*8*8] + fmul qword ptr [eax+1*8*8] + fadd + fld qword ptr [esi+2*8*8] + fmul qword ptr [eax+2*8*8] + fadd + fld qword ptr [esi+3*8*8] + fmul qword ptr [eax+3*8*8] + fadd + fld qword ptr [esi+4*8*8] + fmul qword ptr [eax+4*8*8] + fadd + fld qword ptr [esi+5*8*8] + fmul qword ptr [eax+5*8*8] + fadd + fld qword ptr [esi+6*8*8] + fmul qword ptr [eax+6*8*8] + fadd + fld qword ptr [esi+7*8*8] + fmul qword ptr [eax+7*8*8] + fadd + fadd st(0),st(1) + + fxch st(1) + + fld qword ptr [esi+0*8*8] + fmul qword ptr [eax+0*8*8+8] + fld qword ptr [esi+1*8*8] + fmul qword ptr [eax+1*8*8+8] + fadd + fld qword ptr [esi+2*8*8] + fmul qword ptr [eax+2*8*8+8] + fadd + fld qword ptr [esi+3*8*8] + fmul qword ptr [eax+3*8*8+8] + fadd + fld qword ptr [esi+4*8*8] + fmul qword ptr [eax+4*8*8+8] + fadd + fld qword ptr [esi+5*8*8] + fmul qword ptr [eax+5*8*8+8] + fadd + fld qword ptr [esi+6*8*8] + fmul qword ptr [eax+6*8*8+8] + fadd + fld qword ptr [esi+7*8*8] + fmul qword ptr [eax+7*8*8+8] + fadd + fadd st(0),st(1) + add eax,8*2 + + fxch st(2) + fstp qword ptr [edi] + fxch st(1) + fstp qword ptr [edi+8*8] + add edi,8*8*2 + + dec ecx + + jnz __col2 + add eax,-8*8 + add esi,+8 + add edi,8-8*8*8 + + sub ebx,0x80000001 + js __row2 + //align 16 + test ebx,ebx // align jump &| redo flags + jnz __row2 + ffree st(0) // bye bye 0.5 + + // set x87 to floor mode + fstcw [fpold] + movzx eax, [fpold] + + or eax, 0x0400 // round down - floor + mov [fpnew], ax + fldcw [fpnew] + + // now floor the damn array + lea esi, [rnd] + mov edi, [block] + mov ebx, -256 // clip min + mov edx, +255 // clip max + mov ecx, 8 + align 16 + __floor: + fld qword ptr [esi+0*8] + fistp dword ptr [int0] + mov eax,[int0] + cmp eax,ebx + cmovl eax,ebx + cmp eax,edx + cmovg eax,edx + fld qword ptr [esi+1*8] + fistp dword ptr [int1] + mov word ptr [edi+0*2],ax + mov eax,[int1] + cmp eax,ebx + cmovl eax,ebx + cmp eax,edx + cmovg eax,edx + fld qword ptr [esi+2*8] + fistp dword ptr [int2] + mov word ptr [edi+1*2],ax + mov eax,[int2] + cmp eax,ebx + cmovl eax,ebx + cmp eax,edx + cmovg eax,edx + fld qword ptr [esi+3*8] + fistp dword ptr [int3] + mov word ptr [edi+2*2],ax + mov eax,[int3] + cmp eax,ebx + cmovl eax,ebx + cmp eax,edx + cmovg eax,edx + fld qword ptr [esi+4*8] + fistp dword ptr [int4] + mov word ptr [edi+3*2],ax + mov eax,[int4] + cmp eax,ebx + cmovl eax,ebx + cmp eax,edx + cmovg eax,edx + fld qword ptr [esi+5*8] + fistp dword ptr [int5] + mov word ptr [edi+4*2],ax + mov eax,[int5] + cmp eax,ebx + cmovl eax,ebx + cmp eax,edx + cmovg eax,edx + fld qword ptr [esi+6*8] + fistp dword ptr [int6] + mov word ptr [edi+5*2],ax + mov eax,[int6] + cmp eax,ebx + cmovl eax,ebx + cmp eax,edx + cmovg eax,edx + fld qword ptr [esi+7*8] + fistp dword ptr [int7] + mov word ptr [edi+6*2],ax + mov eax,[int7] + cmp eax,ebx + cmovl eax,ebx + cmp eax,edx + cmovg eax,edx + mov word ptr [edi+7*2],ax + + add esi, 8*8 + add edi, 8*2 + + sub ecx,0x80000001 + js __floor + //align 16 + test ecx,ecx // align jump &| redo flags + jnz __floor + + // set x87 to default mode + fldcw [fpold] + }; + +} diff -Nru project-x-0.90.4dfsg/c_src/idct_ref/net_sourceforge_dvb_projectx_video_IDCTRefNative.c project-x-0.91.0/c_src/idct_ref/net_sourceforge_dvb_projectx_video_IDCTRefNative.c --- project-x-0.90.4dfsg/c_src/idct_ref/net_sourceforge_dvb_projectx_video_IDCTRefNative.c 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/c_src/idct_ref/net_sourceforge_dvb_projectx_video_IDCTRefNative.c 2004-12-01 01:26:24.000000000 +0000 @@ -0,0 +1,75 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +#include "net_sourceforge_dvb_projectx_video_IDCTRefNative.h" +#include +/* Header for class net_sourceforge_dvb_projectx_video_IDCTRefNative */ + +/* + * Class: net_sourceforge_dvb_projectx_video_IDCTRefNative + * Method: init + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_net_sourceforge_dvb_projectx_video_IDCTRefNative_init + (JNIEnv *env, jobject obj) + { + Initialize_REF_IDCT(); + } + + +/* + * Class: net_sourceforge_dvb_projectx_video_IDCTRefNative + * Method: referenceIDCT + * Signature: ([S)[S + */ +JNIEXPORT jobjectArray JNICALL Java_net_sourceforge_dvb_projectx_video_IDCTRefNative_referenceIDCT___3_3S + (JNIEnv *env, jobject obj, jobjectArray arr) + { + jobjectArray ret; + jshortArray row; + int i,j; + short localArrayCopy[8][8]; + + for(i=0; i<8; i++) + { + jshortArray oneDim= + (jshortArray)(*env)->GetObjectArrayElement(env, arr, i); + jshort *element=(*env)->GetShortArrayElements(env, oneDim, 0); + for(j=0; j<8; j++) + { + localArrayCopy[i][j]= element[j]; + } + } + + REF_IDCT(localArrayCopy); + + // Create array to send back + row = (jshortArray)(*env)->NewShortArray(env, 8); + ret=(jobjectArray)(*env)->NewObjectArray(env, 8, (*env)->GetObjectClass(env, row), 0); + + for(i=0;i<8;i++) + { + row= (jshortArray)(*env)->NewShortArray(env, 8); + (*env)->SetShortArrayRegion(env, (jshortArray)row,(jsize)0,8,(jshort *)localArrayCopy[i]); + (*env)->SetObjectArrayElement(env, ret,i,row); + } + + return ret; + } + +/* + * Class: net_sourceforge_dvb_projectx_video_IDCTRefNative + * Method: referenceIDCT + * Signature: ([S)[[S + */ +JNIEXPORT void JNICALL Java_net_sourceforge_dvb_projectx_video_IDCTRefNative_referenceIDCT___3S + (JNIEnv *env, jobject obj, jshortArray arr) +{ + jshortArray ret; + short *localArrayCopy; + + localArrayCopy =(short *)(*env)->GetShortArrayElements(env, arr, JNI_FALSE); + + REF_IDCT(localArrayCopy); + + (*env)->ReleaseShortArrayElements(env, arr, localArrayCopy, 0); +} diff -Nru project-x-0.90.4dfsg/c_src/idct_sse/build.bat project-x-0.91.0/c_src/idct_sse/build.bat --- project-x-0.90.4dfsg/c_src/idct_sse/build.bat 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/c_src/idct_sse/build.bat 2004-12-01 01:26:24.000000000 +0000 @@ -0,0 +1,11 @@ +rem c-compiler env variables must be set too +set JAVA_HOME=C:\j2sdk1.4.2 +set PATH=%JAVA_HOME%\bin;%PATH% + +javah -classpath ..\..\ProjectX.jar net.sourceforge.dvb.projectx.video.IDCTSseNative + +cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD net_sourceforge_dvb_projectx_video_IDCTSseNative.c idct_ref.c idct_cli.c -Feidctsse.dll + +copy idctsse.dll ..\..\lib + +pause \ No newline at end of file diff -Nru project-x-0.90.4dfsg/c_src/idct_sse/IDCT_CLI.C project-x-0.91.0/c_src/idct_sse/IDCT_CLI.C --- project-x-0.90.4dfsg/c_src/idct_sse/IDCT_CLI.C 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/c_src/idct_sse/IDCT_CLI.C 2004-12-01 01:26:24.000000000 +0000 @@ -0,0 +1,137 @@ +/******************************************************************* + + *******************************************************************/ + +#define IDCT_CLIP_TABLE_C +#include "idct_cli.h" + +const short idct_clip_table[1024] = { + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-256,-256,-256,-256,-256,-256,-256, + -256,-255,-254,-253,-252,-251,-250,-249, + -248,-247,-246,-245,-244,-243,-242,-241, + -240,-239,-238,-237,-236,-235,-234,-233, + -232,-231,-230,-229,-228,-227,-226,-225, + -224,-223,-222,-221,-220,-219,-218,-217, + -216,-215,-214,-213,-212,-211,-210,-209, + -208,-207,-206,-205,-204,-203,-202,-201, + -200,-199,-198,-197,-196,-195,-194,-193, + -192,-191,-190,-189,-188,-187,-186,-185, + -184,-183,-182,-181,-180,-179,-178,-177, + -176,-175,-174,-173,-172,-171,-170,-169, + -168,-167,-166,-165,-164,-163,-162,-161, + -160,-159,-158,-157,-156,-155,-154,-153, + -152,-151,-150,-149,-148,-147,-146,-145, + -144,-143,-142,-141,-140,-139,-138,-137, + -136,-135,-134,-133,-132,-131,-130,-129, + -128,-127,-126,-125,-124,-123,-122,-121, + -120,-119,-118,-117,-116,-115,-114,-113, + -112,-111,-110,-109,-108,-107,-106,-105, + -104,-103,-102,-101,-100, -99, -98, -97, + -96, -95, -94, -93, -92, -91, -90, -89, + -88, -87, -86, -85, -84, -83, -82, -81, + -80, -79, -78, -77, -76, -75, -74, -73, + -72, -71, -70, -69, -68, -67, -66, -65, + -64, -63, -62, -61, -60, -59, -58, -57, + -56, -55, -54, -53, -52, -51, -50, -49, + -48, -47, -46, -45, -44, -43, -42, -41, + -40, -39, -38, -37, -36, -35, -34, -33, + -32, -31, -30, -29, -28, -27, -26, -25, + -24, -23, -22, -21, -20, -19, -18, -17, + -16, -15, -14, -13, -12, -11, -10, -9, + -8, -7, -6, -5, -4, -3, -2, -1, + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, +}; diff -Nru project-x-0.90.4dfsg/c_src/idct_sse/IDCT_CLI.H project-x-0.91.0/c_src/idct_sse/IDCT_CLI.H --- project-x-0.90.4dfsg/c_src/idct_sse/IDCT_CLI.H 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/c_src/idct_sse/IDCT_CLI.H 2008-02-05 20:00:08.000000000 +0000 @@ -0,0 +1,22 @@ +/******************************************************************* + + *******************************************************************/ + +#ifndef IDCT_CLIP_TABLE_H +#define IDCT_CLIP_TABLE_H + +#define IDCT_CLIP_TABLE_OFFSET 512 + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef IDCT_CLIP_TABLE_C +extern const short idct_clip_table[1024]; +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru project-x-0.90.4dfsg/c_src/idct_sse/IDCT_REF.C project-x-0.91.0/c_src/idct_sse/IDCT_REF.C --- project-x-0.90.4dfsg/c_src/idct_sse/IDCT_REF.C 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/c_src/idct_sse/IDCT_REF.C 2004-12-01 01:26:24.000000000 +0000 @@ -0,0 +1,387 @@ +#include +#include "idct_cli.h" +#define IDCT_REFERENCE_SSE_C +#include "idct_ref.h" +#include "mmintrin.h" + +/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1 + * direct matrix multiply) Inverse Discrete Cosine Transform +*/ + +void __stdcall idct_reference_sse(short *block); + +static const float ref_dct_matrix_t[8][8] = +{ + {/* [0][0-7] */ 0.353553, 0.490393, 0.461940, 0.415735, 0.353553, 0.277785, 0.191342, 0.097545}, + {/* [1][0-7] */ 0.353553, 0.415735, 0.191342, -0.097545, -0.353553, -0.490393, -0.461940, -0.277785}, + {/* [2][0-7] */ 0.353553, 0.277785, -0.191342, -0.490393, -0.353553, 0.097545, 0.461940, 0.415735}, + {/* [3][0-7] */ 0.353553, 0.097545, -0.461940, -0.277785, 0.353553, 0.415735, -0.191342, -0.490393}, + {/* [4][0-7] */ 0.353553, -0.097545, -0.461940, 0.277785, 0.353553, -0.415735, -0.191342, 0.490393}, + {/* [5][0-7] */ 0.353553, -0.277785, -0.191342, 0.490393, -0.353553, -0.097545, 0.461940, -0.415735}, + {/* [6][0-7] */ 0.353553, -0.415735, 0.191342, 0.097545, -0.353553, 0.490393, -0.461940, 0.277785}, + {/* [7][0-7] */ 0.353553, -0.490393, 0.461940, -0.415735, 0.353553, -0.277785, 0.191342, -0.097545} +}; + +void __stdcall idct_reference_sse(short *block) +{ + int i, j; + short tmp_block[64]; + float tmp[64]; + float fblock[64]; + + memcpy(tmp_block,block,sizeof(short)*64); + + __asm{ + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block]; + lea edi, [fblock]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +8]; + lea edi, [fblock +16]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +16]; + lea edi, [fblock +32]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +24]; + lea edi, [fblock +48]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +32]; + lea edi, [fblock +64]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +40]; + lea edi, [fblock +80]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +48]; + lea edi, [fblock +96]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +56]; + lea edi, [fblock +112]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +64]; + lea edi, [fblock +128]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +72]; + lea edi, [fblock +144]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +80]; + lea edi, [fblock +160]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +88]; + lea edi, [fblock +176]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +96]; + lea edi, [fblock +192]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +104]; + lea edi, [fblock +208]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +112]; + lea edi, [fblock +224]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + + pxor mm1,mm1; + pxor mm3, mm3; + lea edx, [tmp_block +120]; + lea edi, [fblock +240]; + movd mm0, dword ptr [edx]; + movd mm2, dword ptr [edx+4]; + pcmpgtw mm1, mm0; + pcmpgtw mm3, mm2; + punpcklwd mm0, mm1; + punpcklwd mm2, mm3; + cvtpi2ps xmm1, mm0; + cvtpi2ps xmm2, mm2; + movlps [edi], xmm1; + movlps [edi+8], xmm2; + } + + for (i=0; i<8; i++) + { + for (j=0; j<8; j++) + { + __asm{ + //オフセットの計算と初期化。 + mov eax, dword ptr [i]; + xorps xmm7, xmm7; + + mov ebx, dword ptr [j]; + shl eax, 5; + + shl ebx, 5; + lea edx, [fblock +eax]; + + lea edi, [ref_dct_matrix_t +ebx]; + movups xmm1, [edx] ; + + movups xmm2, [edi] ; + movups xmm3, [edx +16] ; + + mulps xmm1, xmm2 ; + movups xmm4, [edi +16] ; + ; + mulps xmm3, xmm4 ; + ; + ; + addps xmm7, xmm1 ; + ; + addps xmm7, xmm3 ; + + movaps xmm1, xmm7 ; + mov eax, dword ptr [i]; + + shufps xmm7, xmm1, 0x39 ; + shl eax, 2; + + addps xmm7, xmm1 ; + add eax, ebx; + + movaps xmm1, xmm7 ; + lea edi, [tmp +eax]; + + shufps xmm7, xmm1,0x2 ; + + addss xmm7, xmm1 ; + + movss [edi], xmm7 + } + } + } + + for (j=0; j<8; j++) + { + for (i=0; i<8; i++) + { + __asm{ + mov eax, dword ptr [i]; + xorps xmm7, xmm7; + + shl eax, 5 ; + mov ebx, dword ptr [j]; + + lea edx, [tmp +eax] ; + shl ebx, 5 ; + + movups xmm1, [edx] ; + lea edi, [ref_dct_matrix_t +ebx] ; + + movups xmm3, [edx +16] ; + movups xmm2, [edi] ; + + mulps xmm1, xmm2 ; + movups xmm4, [edi +16] ; + + mulps xmm3, xmm4 ; + addps xmm7, xmm1 ; + + ; + addps xmm7, xmm3 ; + + movaps xmm1, xmm7 ; + + shufps xmm7, xmm1, 0x39 ; + + addps xmm7, xmm1 ; + + movaps xmm1, xmm7 ; + + shufps xmm7, xmm1,0x2 ; + + addss xmm7, xmm1 ; + + cvtss2si eax, xmm7 ; + + lea ecx, [eax +IDCT_CLIP_TABLE_OFFSET]; + mov eax, dword ptr [j]; + + lea ebx, [idct_clip_table +ecx*2]; + mov ecx, dword ptr [i]; + + lea edx, [ecx+eax*8]; + + mov eax, dword ptr [block]; + mov cx, word ptr [ebx]; + + mov word ptr [eax+edx*2],cx; + } + } + } + _mm_empty(); +} diff -Nru project-x-0.90.4dfsg/c_src/idct_sse/IDCT_REF.H project-x-0.91.0/c_src/idct_sse/IDCT_REF.H --- project-x-0.90.4dfsg/c_src/idct_sse/IDCT_REF.H 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/c_src/idct_sse/IDCT_REF.H 2008-02-05 20:00:22.000000000 +0000 @@ -0,0 +1,16 @@ +#ifndef IDCT_REFERENCE_SSE_H +#define IDCT_REFERENCE_SSE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef IDCT_REFERENCE_SSE_C +extern void __stdcall idct_reference_sse(short *block); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru project-x-0.90.4dfsg/c_src/idct_sse/net_sourceforge_dvb_projectx_video_IDCTSseNative.c project-x-0.91.0/c_src/idct_sse/net_sourceforge_dvb_projectx_video_IDCTSseNative.c --- project-x-0.90.4dfsg/c_src/idct_sse/net_sourceforge_dvb_projectx_video_IDCTSseNative.c 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/c_src/idct_sse/net_sourceforge_dvb_projectx_video_IDCTSseNative.c 2004-12-01 01:26:24.000000000 +0000 @@ -0,0 +1,24 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +#include "net_sourceforge_dvb_projectx_video_IDCTSseNative.h" +#include "idct_ref.h" +#include +/* Header for class net_sourceforge_dvb_projectx_video_IDCTSseNative */ + +/* + * Class: net_sourceforge_dvb_projectx_video_IDCTSseNative + * Method: referenceIDCT + * Signature: ([S)[[S + */ +JNIEXPORT void JNICALL Java_net_sourceforge_dvb_projectx_video_IDCTSseNative_referenceIDCT + (JNIEnv *env, jobject obj, jshortArray arr) +{ + jshortArray ret; + short *localArrayCopy; + + localArrayCopy =(short *)(*env)->GetShortArrayElements(env, arr, JNI_FALSE); + + idct_reference_sse(localArrayCopy); + + (*env)->ReleaseShortArrayElements(env, arr, localArrayCopy, 0); +} diff -Nru project-x-0.90.4dfsg/debian/changelog project-x-0.91.0/debian/changelog --- project-x-0.90.4dfsg/debian/changelog 2011-03-27 19:12:42.000000000 +0000 +++ project-x-0.91.0/debian/changelog 2011-03-27 18:54:21.000000000 +0000 @@ -1,3 +1,9 @@ +project-x (0.91.0-0yavdr0~lucid) lucid; urgency=low + + * New Upstream Release + + -- Holger Schvestka Sun, 27 Mar 2011 20:22:46 +0200 + project-x (0.90.4dfsg-0ubuntu5) intrepid; urgency=low * remove java specific dependencies and icedtea-java7-jre NBS (LP: #203636) diff -Nru project-x-0.90.4dfsg/debian/docs project-x-0.91.0/debian/docs --- project-x-0.90.4dfsg/debian/docs 2011-03-27 19:12:42.000000000 +0000 +++ project-x-0.91.0/debian/docs 2009-10-09 21:26:17.000000000 +0000 @@ -1,4 +1,2 @@ ReadMe.txt -ReleaseNotes_0.90.4.00.txt -ReleaseNotes_0.90.4.txt htmls diff -Nru project-x-0.90.4dfsg/htmls/cli.html project-x-0.91.0/htmls/cli.html --- project-x-0.90.4dfsg/htmls/cli.html 2005-09-30 20:42:14.000000000 +0000 +++ project-x-0.91.0/htmls/cli.html 2004-10-29 23:31:10.000000000 +0000 @@ -13,25 +13,69 @@ href="faq.html"> CL-Interface:
-Note: CL doesn't load the GUI components, except with switch [-gui]
- ...starts the GUI
-switches and inputfiles can be in any order
-
-options:
-[-ini ] ..use that specified iniFile instead of the standard
-[-dvx1] ..create a .d2v ProjectFile on demux
-[-dvx2] ..create a .d2v ProjectFile + .ac3.wav (RIFF WAVE Header)
-[-dvx3] ..create a .d2v ProjectFile + .mpa.wav (RIFF WAVE Header)
-[-dvx4] ..create a .d2v ProjectFile + .ac3.wav + mpa.wav (RIFF WAVE Header)
-[-out ] ..use that specified directory for output
-[-name ] ..use that specified filename for output
-[-cut ] ..use that text based file as cutpoint list
-[-id ] ..use only these (P)IDs, separated by comma \",\"
-[-gui] ..display the GUI using all given CLI options
-[-log] ..write the normal logfile
-[-saveini] ..save changes made bei CLI in active .ini -[-split ] ..split output at xxx MB
-[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..action types
+ [Options] <Sourcefile 1>...[<Sourcefile +x>] +

comment:
+CL loads all GUI components without showing them (except [-g]).
+Input via CL-I is used as 1 job.

+

no options
+starts the GUI
+an existing ini-file in the current working directory is read and +overwritten on close.

+

options:
+ -c <ini_file>
+if a different ini-file is given it must be provided with the full path +to load correctly. this option overwrites all standard settings.
+not all settings must be given, missing settings are set to the +standard.
+all options for the GUI including the post-commands are directly +controllable via the ini-file, except the user variables like +[-n,p,i]/Sourcefile.

+

-dvx1
+sets the 1st option for createing a .d2v projectfile

+

-dvx2
+sets the 2nd option for createing a .d2v projectfile
+sets the options for appending a RIFF Wave Header for AC3 files

+

-dvx3
+sets the 3rd option for createing a .d2v projectfile
+sets the options for appending a RIFF Wave Header for MPEG audio files

+

-dvx4
+sets the 4th option for createing a .d2v projectfile
+sets the options for appending a RIFF Wave Header for AC3 files
+sets the options for appending a RIFF Wave Header for MPEG audio files
+

+

these options can't be used together!
+the next options are independant but must be given after the first +options (if used) or directly after the programname.

+

-o <outputpath>
+overwrites the current settings for the <outputpath>, this must +be a full path.

+

-n <filename>
+forces this <filename> as a basename for all output files +(without path).
+(option not available for the GUI)

+

-p <cut-file>
+the given <cut-file> has to be provided with the full path and. +it contains the cut-points (text, lineoriented).
+parsing is done based on the current cut-mode -> +ini-file, +std = bytepos. cut

+

-i <token1,token2,..>
+provides (P)IDs for selected editing, +several separated by comma. These are then used exclusively.

+

-l
+creates a standard logfile

+

-g
+starts the GUI with all given parameters instead of starting the job at +the command line.
+changes in the GUI settings and are not written to the ini-file.

+

<sourcefile 1..x>
+the sourcefiles inlcuding the full path for this job must be provided +at the end of the command line in the correct order.

+

To create a special ini-file, run the GUI, set all options +accordingly, exit the GUI and save the ini-file under a different name. +

  
CL-Interface:
-Hinweis: CL laedt kein GUI (Swing), ausser bei Option [-gui]
- ...startet die graphische Oberflaeche
-Reihenfolge der Kommandostrings ist beliebig, nicht erkannte Optionen gelten als Eingabedatei
-
-Optionen:
-[-ini ] ..verwendet eine andere Konfigurationsdatei als die Standard X.ini
-[-dvx1] ..erstelle eine .d2v Projektdatei beim demuxen
-[-dvx2] ..erstelle eine .d2v Projektdatei + .ac3.wav (RIFF WAVE Header)
-[-dvx3] ..erstelle eine .d2v Projektdatei + .mpa.wav (RIFF WAVE Header)
-[-dvx4] ..erstelle eine .d2v Projektdatei + .ac3.wav + mpa.wav (RIFF WAVE Header)
-[-out ] ..benutze diesen Pfad als Ausgabepfad
-[-name ] ..benutze diesen Dateinamen fuer Ausgabedatei
-[-cut ] ..nutze diese Datei als Schnittliste
-[-id ] ..benutze nur diese (P)IDs, getrennt durch Komma \",\"
-[-gui] ..oeffne GUI mit den angegebenen CLI Optionen
-[-log] ..schreibe eine normale Logdatei
-[-saveini] ..bei CLI Aufruf geaenderte Einstellungen speichern
-[-split ] ..Ausgabe teilen bei xxx MB
-[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..Aktionstypen
- + [Optionen] <Quelldatei 1>...[<Quelldatei x>] +

Anm:
+CL lädt alle GUI Komponenten, ohne diese jedoch anzuzeigen +(Ausnahme +[-g]).
+Eingaben über das CL-I gelten als 1 Job.

+

keine Optionen
+startet das GUI
+es wird die Standard-ini-Datei im aktuellen Pfad gelesen (falls +vorhanden) +und beim Beenden überschrieben.

+

Optionen:
+ -c <ini_file>
+die zum Laden mit vollständigem Pfad anzugebene <ini-Datei> +überschreibt alle Standardeinstellungen mit den darin enthaltenen. +
+es müssen nicht alle Settings enthalten sein, bei fehlenden wird +der Standard gesetzt.
+alle Optionen des GUI einschließlich post-commands sind direkt +über die ini-Datei steuerbar, ausgenommen Benutzervariablen wie +[-n,p,i]/Quelldatei..

+

-dvx1
+setzt die 2.Option zur Erzeugung einer .d2v Projektdatei

+

-dvx2
+setzt die 2.Option zur Erzeugung einer .d2v Projektdatei
+setzt die Option zum Anfügen eines RIFF Wave Headers bei AC3 +Dateien

+

-dvx3
+setzt die 2.Option zur Erzeugung einer .d2v Projektdatei
+setzt die Option zum Anfügen eines RIFF Wave Headers bei MPEG +Audio Dateien

+

-dvx4
+setzt die 2.Option zur Erzeugung einer .d2v Projektdatei
+setzt die Option zum Anfügen eines RIFF Wave Headers bei AC3 +Dateien
+setzt die Option zum Anfügen eines RIFF Wave Headers bei MPEG +Audio Dateien

+

die o.g. Optionen können nicht gemeinsam verwendet werden!
+die u.g. sind wahlfrei, müssen aber den o.g. (falls diese optional +verwendet werden) oder direkt dem Programmnamen folgen.

+

-o <path>
+überschreibt die aktuellen Einstellungen zum <Ausgabepfad>, +der vollständig angegeben werden muss.

+

-n <filename>
+erzwingt für alle erstellten Dateien diesen <Basisnamen> +(ohne +Pfad).
+(Option ist im GUI nicht verfügbar)

+

-p <file>
+die zum Laden mit vollständigem Pfad anzugebene <cut-Datei> +(text, zeilenorientiert) übergibt die vorher festgelegten +Schnittpunkte.
+Auswertung erfolgt entsprechend dem aktuellen Schnitt-Modus -> +ini-Datei, +std = bytepos. cut

+

-i <token1,token2,..>
+übergibt vorausgewählte (P)IDs zur gefilterten Bearbeitung, +mehrere getrennt mit Komma, die dann exklusiv verwendet werden.

+

-l
+erstellt die Standard Logdatei

+

-g
+startet das GUI mit allen übergebenen Parametern anstatt den Job +auf der Kommandozeile zu starten.
+beim Beenden werden Änderungen im GUI, wie auch über das +CLI, nicht in der ini-Datei gespeichert.

+

<Quelldatei 1..x>
+die Quelldateien einschließlich Pfad dieses einen Jobs +müssen +am Ende in der vorgesehen Bearbeitungsreihenfolge stehen.

+

Zum Erzeugen einer bestimmten ini-Datei alle Grundeinstellungen im +GUI +vornehmen und nach Programmende unter einem anderen (beliebigen) Namen +speichern.

  Inhalt: diff -Nru project-x-0.90.4dfsg/htmls/index.html project-x-0.91.0/htmls/index.html --- project-x-0.90.4dfsg/htmls/index.html 2005-09-30 20:36:54.000000000 +0000 +++ project-x-0.91.0/htmls/index.html 2005-09-10 15:51:52.000000000 +0000 @@ -15,7 +15,7 @@

Table of Contents:

Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/htmls/projectx_desc_de_pdf.zip and /tmp/9lC2Ez7oEt/project-x-0.91.0/htmls/projectx_desc_de_pdf.zip differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/blank_skin_v2_1.zip and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/blank_skin_v2_1.zip differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/commons-net-1.3.0.jar and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/commons-net-1.3.0.jar differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/idctref.dll and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/idctref.dll differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/idctsse.dll and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/idctsse.dll differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/jakarta-oro-2.0.8.jar and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/jakarta-oro-2.0.8.jar differ diff -Nru project-x-0.90.4dfsg/lib/jakarta.txt project-x-0.91.0/lib/jakarta.txt --- project-x-0.90.4dfsg/lib/jakarta.txt 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/lib/jakarta.txt 2005-01-08 13:27:30.000000000 +0000 @@ -0,0 +1,9 @@ +http://jakarta.apache.org/site/binindex.cgi + +Commons Net +ORO + +http://archive.apache.org/dist/jakarta/commons/net/binaries/ +http://archive.apache.org/dist/jakarta/oro/binaries/ + +info in commons.net \ No newline at end of file diff -Nru project-x-0.90.4dfsg/lib/Linux/idct_linux-portable.txt project-x-0.91.0/lib/Linux/idct_linux-portable.txt --- project-x-0.90.4dfsg/lib/Linux/idct_linux-portable.txt 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/lib/Linux/idct_linux-portable.txt 2006-10-21 07:53:26.000000000 +0000 @@ -0,0 +1 @@ +http://sourceforge.net/tracker/index.php?func=detail&aid=1562695&group_id=115063&atid=670053 \ No newline at end of file Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/Linux/ProjectX_Source_0.90.4-linux.zip and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/Linux/ProjectX_Source_0.90.4-linux.zip differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/Linux/ProjectX_Source_0.90.4-portable.zip and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/Linux/ProjectX_Source_0.90.4-portable.zip differ diff -Nru project-x-0.90.4dfsg/lib/OS2/build_os2.cmd project-x-0.91.0/lib/OS2/build_os2.cmd --- project-x-0.90.4dfsg/lib/OS2/build_os2.cmd 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/lib/OS2/build_os2.cmd 2008-02-05 19:58:06.000000000 +0000 @@ -0,0 +1,47 @@ +REM ******************************************* +REM Build idctssl.dll with OpenWatcom for OS/2 +REM +REM Version 1.1 +REM RBRi 2006, 2008 +REM +REM HowTo: +REM +REM (1) Adjust the paths to your JDK 1.3.1 +REM and watcom 1.7 compiler +REM (2) Build the class files. +REM (3) Edit file idct_ref.c +REM at the end of the file there is a line +REM _mm_empty(); +REM change this to _m_empty(); +REM (4) run this script the new dll is in this +REM directory +REM ******************************************* +@echo off +setlocal + +REM !!!! Change this.... + +SET JAVA_HOME=C:\java131 +SET WATCOM=D:\progs\watcom_17 + +REM !!!!!!!!!!!!!!!!!!!!!!! + +rem setup the environment +SET PATH=%WATCOM%\BINP;%WATCOM%\BINW;%PATH% +SET INCLUDE=%WATCOM%\H;%WATCOM%\H\OS2 +SET BEGINLIBPATH=%WATCOM%\BINP\DLL + +rem create header +%JAVA_HOME%\bin\javah -classpath ..\..\build net.sourceforge.dvb.projectx.video.IDCTSseNative + +rem compile +wcc386 -bd -6s -oh -i%JAVA_HOME%\include;%JAVA_HOME%\include\os2 net_sourceforge_dvb_projectx_video_IDCTSseNative.c +wcc386 -bd -6s -oh -i%JAVA_HOME%\include;%JAVA_HOME%\include\os2 idct_ref.c +wcc386 -bd -6s -oh -i%JAVA_HOME%\include;%JAVA_HOME%\include\os2 idct_cli.c + +rem link +set files=net_sourceforge_dvb_projectx_video_IDCTSseNative,idct_ref,idct_cli +wlink system os2v2 dll initinstance file %files% name idctsse + +endlocal + Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/OS2/idctsse.dll and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/OS2/idctsse.dll differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/RAWIO16.DLL and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/RAWIO16.DLL differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/RAWIO32.dll and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/RAWIO32.dll differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/lib/rawread.dll and /tmp/9lC2Ez7oEt/project-x-0.91.0/lib/rawread.dll differ diff -Nru project-x-0.90.4dfsg/MANIFEST.MF project-x-0.91.0/MANIFEST.MF --- project-x-0.90.4dfsg/MANIFEST.MF 2005-09-10 22:31:26.000000000 +0000 +++ project-x-0.91.0/MANIFEST.MF 2011-03-27 18:59:17.000000000 +0000 @@ -1,4 +1,4 @@ Manifest-Version: 1.0 Main-Class: net.sourceforge.dvb.projectx.common.Start Created-By: 1.2.2 (Sun Microsystems Inc.) -Class-Path: lib/commons-net-1.3.0.jar lib/jakarta-oro-2.0.8.jar +Class-Path: lib/commons-net-1.3.0.jar libjakarta-oro-2.0.8.jar diff -Nru project-x-0.90.4dfsg/noguisources.lst project-x-0.91.0/noguisources.lst --- project-x-0.90.4dfsg/noguisources.lst 2006-03-25 01:00:02.000000000 +0000 +++ project-x-0.91.0/noguisources.lst 2011-03-27 13:48:48.000000000 +0000 @@ -4,9 +4,9 @@ src/net/sourceforge/dvb/projectx/audio/AudioFormatLPCM.java src/net/sourceforge/dvb/projectx/audio/AudioFormatWAV.java src/net/sourceforge/dvb/projectx/audio/AudioFormatMPA.java +src/net/sourceforge/dvb/projectx/audio/AudioFormatAAC.java src/net/sourceforge/dvb/projectx/audio/MpaConverter.java src/net/sourceforge/dvb/projectx/audio/MpaDecoder.java -src/net/sourceforge/dvb/projectx/audio/RIFFHeader.java src/net/sourceforge/dvb/projectx/common/Common.java src/net/sourceforge/dvb/projectx/common/GuiInterface.java src/net/sourceforge/dvb/projectx/common/GuiInterfaceIF.java @@ -21,6 +21,7 @@ src/net/sourceforge/dvb/projectx/io/RawFile.java src/net/sourceforge/dvb/projectx/io/StandardBuffer.java src/net/sourceforge/dvb/projectx/net/WebInterface.java +src/net/sourceforge/dvb/projectx/net/X_URLDecoder.java src/net/sourceforge/dvb/projectx/parser/CommonParsing.java src/net/sourceforge/dvb/projectx/parser/Gop.java src/net/sourceforge/dvb/projectx/parser/GopArray.java @@ -47,6 +48,8 @@ src/net/sourceforge/dvb/projectx/parser/StreamProcessLPCMAudio.java src/net/sourceforge/dvb/projectx/parser/StripAudio.java src/net/sourceforge/dvb/projectx/parser/StripRelook.java +src/net/sourceforge/dvb/projectx/parser/StripMedion.java +src/net/sourceforge/dvb/projectx/parser/TS_PMTParser.java src/net/sourceforge/dvb/projectx/parser/VBI.java src/net/sourceforge/dvb/projectx/subtitle/Bitmap.java src/net/sourceforge/dvb/projectx/subtitle/BMP.java @@ -55,6 +58,8 @@ src/net/sourceforge/dvb/projectx/subtitle/Subpicture.java src/net/sourceforge/dvb/projectx/subtitle/Teletext.java src/net/sourceforge/dvb/projectx/subtitle/UnicodeWriter.java +src/net/sourceforge/dvb/projectx/subtitle/Sup2VobSub.java +src/net/sourceforge/dvb/projectx/subtitle/ColorAreas.java src/net/sourceforge/dvb/projectx/thirdparty/Chapters.java src/net/sourceforge/dvb/projectx/thirdparty/D2V.java src/net/sourceforge/dvb/projectx/thirdparty/Ifo.java diff -Nru project-x-0.90.4dfsg/ReadMe.txt project-x-0.91.0/ReadMe.txt --- project-x-0.90.4dfsg/ReadMe.txt 2006-02-01 04:00:54.000000000 +0000 +++ project-x-0.91.0/ReadMe.txt 2011-03-27 14:47:02.000000000 +0000 @@ -1,7 +1,7 @@ /==============================================================================/ ProjectX - a free Java based demux utility - Copyright (C) 2001-2006 dvb.matt, All Rights Reserved + Copyright (C) 2001-2011 dvb.matt, All Rights Reserved By the authors, ProjectX is intended for educational purposes only, as a non-commercial test project. @@ -57,7 +57,7 @@ For a compilation, you need a Java SDK, which is available for various platforms. - All classes should work at least with Sun's JDK/J2RE 1.2.2 and higher. + All classes should work at least with Sun's JDK/J2RE 1.2.2 (from year 2000) and higher. Note: under special circumstances, some graphic drivers/locales cause big troubles with some versions of JRE's on different OS's. @@ -72,26 +72,23 @@ (A) open "build.bat" with an editor and check/correct the entry/path of JAVA_HOME of your installed JDK - (B) execute the "build.bat" on its place. that will - - compile all sources, - - build the .jar file and - - copies the resource files from the resource folder into the new .jar, + (B) execute the "build.bat" on its place. + that will compile all sources, + build the .jar file and + copies the resource files from the resource folder into the new .jar, Notes: [i] now, we made a package for the sources, the file sources.lst points to every required sourcefile and its location - [ii] the following libraries are required on this place from the V 0.82.0, related to the executed .jar: - lib/commons-net-1.3.0.jar (compiled with JDK 1.2.2) *) - lib/jakarta-oro-2.0.8.jar (compiled with JDK 1.2.2) *) - [iii] the following libraries are optional from the V 0.82.0 : - - lib/idct***.dll (win32 optimized lib's for a faster preview) + - lib/idct*.dll (win32 / os/2 optimized lib's for a faster preview) copy one of them to the systems folder or where the compiled .jar is located - [iv] dependent on the used JDK, you'll encounter some 'warnings' about 'using a deprecated API' - that's not critical, as long as an actual JDK still supports these methods + that's not critical, as long as an actual JDK still supports these older methods *) further informations and newer versions (mostly compiled with JDK 1.4.2) you'll find at: @@ -100,20 +97,28 @@ (C) additional received resource files (e.g. other language files) can be added - to the .jar file, later, + to the root directory inside the .jar file, later, or you put them into the same folder where the compiled .jar is executed. (D) new with version 0.90 and later: it is possible to compile and run this program without the gui (means all source files in /gui/..). - so no javax.swing component will be used, calling it from the commandline. + so there is no requirement of running a X server or similars anymore, calling it from the commandline. if you can't start the non-gui version without a X server, try to call pjx with the 'headless' option java -Djava.awt.headless=true -jar ProjectX.jar [options] + (E) if you encounter frequently "OutOfMemory" Errors, define more RAM for the Java instance: + java -Xms128m -Xmx128m -jar ProjectX.jar [options] + that reserves 128MB, instead of 64MB as default value. the compiling process doesn't take more than about 30 seconds. +/==============================================================================/ + + For lazy beginners, a pre-compiled version (ProjectX.jar) suitable to JRE 1.2.2 + and higher is included. + Possibly, this won't give the best performance with all OS. /==============================================================================/ @@ -121,7 +126,7 @@ Project + D/L, only @ sourceforge.net/projects/project-x/ - voluntary Support for the official (non-modified) version, only @ forum.dvbtechnics.info + Support for the official version, only @ forum.dvbtechnics.info /==============================================================================/ diff -Nru project-x-0.90.4dfsg/ReleaseNotes_0.90.4.00.txt project-x-0.91.0/ReleaseNotes_0.90.4.00.txt --- project-x-0.90.4dfsg/ReleaseNotes_0.90.4.00.txt 2006-03-31 00:06:16.000000000 +0000 +++ project-x-0.91.0/ReleaseNotes_0.90.4.00.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - Note: - - the archive contains all necessary files - - - Project X 0.90.4.00 - 30.03.2006 - - basic release: Project X 0.90.4 - - see ReleaseNotes_0.90.4.txt diff -Nru project-x-0.90.4dfsg/ReleaseNotes_0.90.4.txt project-x-0.91.0/ReleaseNotes_0.90.4.txt --- project-x-0.90.4dfsg/ReleaseNotes_0.90.4.txt 2006-03-31 00:06:34.000000000 +0000 +++ project-x-0.91.0/ReleaseNotes_0.90.4.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ - Note: - - the archive contains all necessary files - - - Project X 0.90.4.00 - 30.03.2006 - - collects all patches from 0.90.3 series - - - fixes: - - better preview of bad I-Frames, and some rare resolutions - - exception at older JRE when saving preview frame with DAR option - - wrong assoziation at ac3 header look-up - - exceptions when decoding RDS-data from mpeg frames - - ttx-pagematrix info erased at process completion - - dvb subicture, page id 0 wasn't accepted - - ... - - - changes: - - omits padding packets in TS private streams - - mpv ES demux, omits data from seq.end to seq.start - - more error and processing logs - - re-scan when changing stream type assignment - - ac3.bin incl. 192kbs 2/0 frame - - ... - - - new: - - subpicture, 2nd export format accessible - - dvb subpicture, new entry for mtv adria - - export RDS-data stream 0xDA (e.g. video EPG) - - optional pre-read buffer (1MB, for special access acceleration), thx to Artemis1121 - - optional creation of cuttermaran project file (info-xml >=1.61), thx to Arnaud - - italian language file, thx to mfsav - - modif. idct sources for OS2, thx to Ronald - - pes demux, check for errors in pes_extension (probs with some vdr-plugins) - - ttx, enhanced parity check (drop lines with more than x parity errors); iniKey only, std: SubtitlePanel.maxParityErrors=2 (0..40) - - mpa decoding, wav/aif export with optional fade-in/out; iniKey only, std: AudioPanel.fadeInOutMillis=2000 (1..5000) - - ... - - - diff -Nru project-x-0.90.4dfsg/ReleaseNotes_0.91.0.txt project-x-0.91.0/ReleaseNotes_0.91.0.txt --- project-x-0.90.4dfsg/ReleaseNotes_0.91.0.txt 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/ReleaseNotes_0.91.0.txt 2011-03-27 14:59:10.000000000 +0000 @@ -0,0 +1,220 @@ + Note: + - the archive contains all necessary files + + + Project X 0.91.0 + 2011/03/31 + + basic release: Project X 0.91.0 + + collects all patches from 0.90.4 series + b01 ... b32 since 2006/03/30 (5 years) + + + hint: + H.264 (in SD & HD) processing is still missing + + + + + + + + +the changes in brief: + +0.90.4.00b01..b06: +--key 舅dern loslessmpaconversion -> losslessmpaconversion +--danish translation update jazzydane +--wait for return bei extern prozess.. +--invalid startcode packet# (pos?) melden +--os-2 start-exception in cl umleiten +--B-c(losed) nur vorw舐tsreferenzierte B-Frames ? behandeln +--b-frames drop? +--vorschaupuffer entspr. bitrate autom. w臧len +--pes0 - pesheader genauer berspringen + preview angepasst +--rds decode abbruch bei falschem index +--prozessfenster coll#/von zahl +--umleitung cli ( > datei ) geht nicht +--checkwriteaccess fehler bei addon? +--fehlermeldung + rcksetzung, wenn unterverzeichnis nicht erstellt werden kann +--coll properties gui +--0x3c data stream ignoriern (TS) +--rds decode defekt +--ftp unterordner optional listen +--dvbsubs except - pagecomposition +--vdr verzeichniserstellung extra +--reserved outputfile (in = out) auch in ini gespeichert +--coll properties gui, +--fix dvb subpicture - falsche farben bei verschiedenen farbtabellen pro region +--vobsub + idx erzeugen aus teletext + sup input + +0.90.4.00b07: +--vid von jepssen(koscom) anpassung +--fix mpg2 layer3 demux error +--fehlertext, wenn html - url fehlt +--ausgabezeit bei RDS RT etc +--vorschau optionen hinter bild verstecken (wie memorymoni) +--build.sh erweitert - zuspiel +--build.xml ant - zuspiel +--blank buttons - zuspiel +--zusatzknopf create koll + add all marked files +--fix: slider overflow, preview +--Frametyp舅derung fixieren - split MPA Prob +--split mpa, 5.option zu doppel-mono +--vorschaubild helligkeit anpassen +--bitrate graph leicht ge舅dert +--cutpanel/slider ver舅dert +--patchpanel mit DAR - fix update +--preview zoom modes +--schnittpunkte verschiebbar +--ts-scan erhht + +0.90.4.00b08: +--fix split mpa, 6.option split dual/copy mono zu doppel-mono/jst, stereo bleibt +--process-actions jetzt checkboxen + +0.90.4.00b09: +--fix ac3 parse size index +--zoom area ge舅dert +--mpg2 lay2 audio fix, erkennung +--mpa crc test beschleunigt +--pic area background, cut view index klickbar +--DnD laden von FTP Links/Datei mglich +--option spez.2: ohne/mit overhead lesen (vormals immer aktiv) + +0.90.4.00b10..b11: +--mpa demux ca. halbe zeit +--sonderzeichen umtausch zB. direktzugriff + +0.90.4.00b12: +--idct tempor舐 abschaltbar, falls crashanf舁lig +--mpa crc berechnung optimierg +--only boxed subtitle export option, fehlerminimierung bei problematischen teletexten +--teletext-class nicht mehr static + +0.90.4.00b13: +--ttx 2 sup , text horiz. zentrieren +--pre-scan anzeige von lpcm +--pre-scan ts miserkennung +--(neue) koscom lese option + +0.90.4.00b14: +----(neue) koscom lese option, restanpassung? +--focus nach prozessstart von starttaste weg +--zoombereich mit shift + mouse verschiebbar +--cutimage mix mode zum schnittpunktabgleich +--fix: abbruch bei bestimmten fehlerhaften Gops +--speichersparen beim pts lesen + +0.90.4.00b15: +--medion prepare option +--ge舅d. koscom lese option +--filtersteuerungspanel teil1 + +0.90.4.00b16: +--filtersteuerungspanel teil2 +--file properties gui, einstellungen je file +--dynam. Rescan mit vorschau in dateieigenschaften +--fix mpeg1 out of memory - u.a. + +0.90.4.00b17: +--matrix scan, vorschau erweitert (li. ann臧ern, re. bernehmen) +--remux wird bei sekund. Dateien abgelehnt, info sekund. Datei in tabelle bei # "-" + +0.90.4.00b18: +--filter info +--matrix changed to 4x4 + +0.90.4.00b19: +--fix dvb-sub crash +--opt. ac3 bitraten angleichung + +0.90.4.00b20: +--post process call changed + fixed (toTS didn't work); temp file access +--sync interruption issue, more tests needed + +0.90.4.00b21: +--letzter dvb-subtitle fehlte u.U. + +0.90.4.00b22: +--test-!!mac os url problem umlaute,leerzeichen, sonderzeichen utf 8 encoding +--urldecoder aus 1.4.2 in 1.2.2 integrieren (decoder.getfile(), "UTF-8") wg os x tiger - mail +--falls prozess nicht stoppbar -> hard break funktion im men +--"end-beep" fehler stoppt prozess nicht mehr +--anpassung vdr 1.5.10ff, dvb-subs spezieller container (hierbei zzt nur 1x sub in vdr) + +0.90.4.00b23: +--anpassung vdr 1.5.10ff, multiple dvb-subs spezieller container +--crash (unbedeutend) in mini-schnittbild-abgleichfenster ohne collection +--fix: endless loop bei unbekanntem subpicture kommando + +0.90.4.00b24: +--videoptsfile zur nachnutzung als prim舐er bezug +--preview v. gops ohne gopheader (nur sequ header) +--192byte ts packet verarbeitung +--mpa umbenennung korrigiert +--m2s projectfile umbenennung korrigiert + +0.90.4.00b25: +--fix: ac3 384 wird nicht als Stille genommen +--integer idct (by dukios), auch ohne dll etwas schneller +--gui -infofelder umgesetzt, hauptfenster verkleinert +--ac3 a/v sync problem + +0.90.4.00b26: +--1:1 direct cut aufgeteilt, 'echte' kopie von dateisegmenten, zzt nur 1 datei +--ts payload erkennung erweitert + +0.90.4.00b27: +--arion avr export +--handled exception HD dvb subtitle (?) +--thumbnails +--fix: recognition of multi area dvd subpics +--preview resizable +!-ac3 a/v abbruch problem noch offen + +0.90.4.00b28: +--enhanced Sup-Viewer +--new CLI parameter: [-set ] +--to TS: duplicates event info from source (TF5x00) to sink (TF5x00) +--optional: preview slider aligned to preview +--some fixes in teletext decoding +--save confirmation -save cuts/save chapters +--ttx - sub insertion - vers. 0.1 +--sup multicolor of dvb-subtitles + +0.90.4.00b29: +--ttx - sub insertion - vers. 0.2 +--MPAD berarbeiten, decode: arrays.fill statt new init ca. 20% schneller +--dragndrop - eyetv update1+2, thx2cookie +--sprachkennung aus PMT an dateinamen anh舅gen (-settings-extern) +--preview -outofmemory anzeige + +0.90.4.00b30: +--ac3 bsid patch +--dvb st pts switch separated +--special panel: optional reduced A/V sync check + +0.90.4.00b31: +--ac3,mpa a/v abbruch problem, patch by HHM +--teletext zeichensteuerung, patch by HHM +--fix, mehrere -set keys von cli lesen +--fix, falsches pts file bei video-es +--pulldown patch by vq (separate field encoding not yet supported) +--fix: div. scanerkennung +--fix: preview problems +--patch: comag file segments read +--ttx: multiple pages per field +--fix audio sync rechenfehler dateipos. + +0.90.4.00b32: +--pulldown patch #2 by vq (separate field encoding not yet supported) +--1st try HD sub decoding/conversion +--fix: dvb sub to sup , missing pixel +--fix: supviewer +--fix: lang.name appending +--fix: teletext identifier (freesat) +--fix: dvb-sub decoding, RTL decoding table +--fix: TS192 file segment combine +... Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/addchap.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/addchap.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/addcollfile.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/addcollfile.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/addcollfiles.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/addcollfiles.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/addcoll.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/addcoll.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/addcut.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/addcut.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/addfile.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/addfile.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/add.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/add.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/addleft.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/addleft.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/bwd_100.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/bwd_100.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/bwd_10.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/bwd_10.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/bwd_gop.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/bwd_gop.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/bwd_ncp.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/bwd_ncp.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/close.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/close.gif differ diff -Nru project-x-0.90.4dfsg/resources/colours.tbl project-x-0.91.0/resources/colours.tbl --- project-x-0.90.4dfsg/resources/colours.tbl 2006-03-12 16:17:18.000000000 +0000 +++ project-x-0.91.0/resources/colours.tbl 2011-03-27 12:53:02.000000000 +0000 @@ -1,13 +1,74 @@ -//project X optional file +//project X optional file, read-only //user colour table definition for DVB subpictures, creating a .sup file, as a replacement of the internal remapping //required entries of a table: //table=list name //model=final colour link depth of this table in bits (2, 4, 8) (means max. 4, 16, 256 paletized colours, best value depends on broadcasters std. table) +//model + 1 activates multicolor sup mode, such sup files may not be compatible to some old DVD players or software //0..x=ARGB (alpha,red,green,blue as 32bit uimsbf, 8bit each) (undefined colour links are fully transparent) //you can add as many tables you wish +table=RTLdeu +model=4 +0=0 +1=FFEBCE11 +2=FF786C18 +3=FF786C18 +4=FF786C18 +5=FF786C18 +6=FF786C18 +7=FFEBCE11 +8=FF111111 +9=FF111111 +10=FF111111 +11=FF111111 +12=FF111111 +13=FF111111 +14=FF111111 +15=FF111111 + +table=UkFreeview(mc) +model=5 +0=000E0EFD +1=00111111 +2=008E8E0F +3=00CCCC0E +4=00FDFD0E +5=000F8E0F +6=000ECC0E +7=000EFD0E +8=000F8E8E +9=000ECCCC +10=000EFDFD +11=008E8E8E +12=00CCCCCC +13=00FFFFFF +14=00FF8C8C +15=00FF1010 + +table=ZDFvision(mc) +model=5 +0=00000081 // blue with hue=A0 and lum=40 +1=00000000 // dark with hue=A0 and lum=00 +2=00DC0000 // red with hue=00 and lum=6E +3=0093E682 // green* with hue=50 and lum=B4 +4=00EBEB7B // yellow* with hue=28 and lum=B3 +5=008C8CEB // blue* with hue=A0 and lum=BB +6=00EB8FEB // magenta* with hue=C7 and lum=BD +7=0063EBEB // cyan* with hue=78 and lum=A7 +8=00EBEBEB // white* with hue=A0 and lum=EB +9=007F0000 // red with hue=00 and lum=3F +10=00007F00 // green with hue=50 and lum=3F +11=007F7F00 // yellow with hue=28 and lum=3F +12=0000007F // blue with hue=A0 and lum=3F +13=00CFCFCF // white +14=00007F7F // cyan with hue=78 and lum=3F +15=007F3F7F // magenta with hue=C8 and lum=5F +//13=007F3F7F // magenta with hue=C8 and lum=5F +//14=00007F7F // cyan with hue=78 and lum=3F +//15=007F7F7F // white with hue=A0 and lum=7F + table=SVT model=4 0=0 @@ -90,3 +151,60 @@ 13=FFC9C9C9 14=FFC9C9C9 15=0 + +table=UkFreeview +model=4 +0=0 +1=FF101010 +2=FFDADADA +3=FF8C8C8C +4=FF8C8C8C +5=FFDADADA +6=FFDADADA +7=FFDADADA +8=FFDADADA +9=FFDADADA +10=FFDADADA +11=FFDADADA +12=FFDADADA +13=FFDADADA +14=FFDADADA +15=FFDADADA + +table=SVT DKTV2-Hvid/omrids +model=4 +0=0 +1=FF101000 +2=0 +3=FF101010 +4=FF101010 +5=FF101010 +6=FF101010 +7=FF101010 +8=FF101010 +9=FF101010 +10=FF101010 +11=FF989898 +12=FF989898 +13=FF989898 +14=FFDCDCDC +15=FFDCDCDC + +table=TV2-DLP-3 +model=4 +0=0 +1=FFFFFFFF +2=0 +3=FF0000FF +4=FF0000FF +5=FF0000FF +6=FF0000FF +7=FF0000FF +8=FF0000FF +9=FF0000FF +10=FFFFFFFF +11=FFFFFFFF +12=FFFFFFFF +13=FFFFFFFF +14=FFFFFFFF +15=FFFFFFFF Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/dn.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/dn.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/down.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/down.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/ftp.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/ftp.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/fwd_100.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/fwd_100.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/fwd_10.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/fwd_10.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/fwd_gop.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/fwd_gop.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/fwd_ncp.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/fwd_ncp.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/ibg.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/ibg.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/left2.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/left2.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/leftarrow2x.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/leftarrow2x.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/leftarrow3x.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/leftarrow3x.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/leftarrowstep1x.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/leftarrowstep1x.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/leftchap.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/leftchap.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/leftcut.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/leftcut.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/left.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/left.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/leftsteparrow1x.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/leftsteparrow1x.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/matrix.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/matrix.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/new.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/new.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/openftp.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/openftp.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/open.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/open.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/openmulti.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/openmulti.gif differ diff -Nru project-x-0.90.4dfsg/resources/pjxresources_cz.properties project-x-0.91.0/resources/pjxresources_cz.properties --- project-x-0.90.4dfsg/resources/pjxresources_cz.properties 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/resources/pjxresources_cz.properties 2005-09-29 19:17:20.000000000 +0000 @@ -0,0 +1,1237 @@ +# Project-X Resource File +# ?esky, exTNT, V 1.1 +# by pstorch, dvb.matt + +# Credits +credits=\u0064\u0076\u0062\u002E\u006D\u0061\u0074\u0074\u0020\u002D\u0020\u0066\u0061\u0074\u0068\u0065\u0072\u0020\u006F\u0066\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u002D\u0058\n\ +\u004C\u0075\u0063\u0069\u006B\u0065\u0020\u002D\u0020\u0066\u006F\u0072\u0075\u006D\u0020\u0068\u006F\u0073\u0074\u0065\u0072\u002C\u0020\u0064\u006F\u0063\u0075\u006D\u0065\u006E\u0074\u0061\u0074\u0069\u006F\u006E\n\ +\u0054\u0068\u0065\u0048\u006F\u0072\u0073\u0065\u0020\u002D\u0020\u006B\u0065\u0079\u0062\u006F\u0061\u0072\u0064\u0063\u006F\u006E\u0074\u0072\u006F\u006C\u0020\u006F\u0066\u0020\u0070\u0072\u0065\u0076\u0069\u0065\u0077\n\ +\u006A\u0061\u0076\u0061\u002E\u006C\u0061\u006E\u0067\u0020\u002D\u0020\u0063\u006F\u006E\u0064\u0069\u0074\u0069\u006F\u006E\u0061\u006C\u0020\u0070\u0061\u0074\u0063\u0068\u0020\u006F\u0066\u0020\u0048\u002D\u0072\u0065\u0073\u006F\u006C\u0075\u0074\u0069\u006F\u006E\n\ +\u0052\u002D\u004F\u006E\u0065\u0020\u002D\u0020\u0044\u0054\u0053\u0020\u0073\u0075\u0070\u0070\u006F\u0072\u0074\n\ +\u0067\u0068\u006F\u0073\u0074\u0020\u002D\u0020\u0064\u0072\u0065\u0061\u006D\u0062\u006F\u0078\u0020\u0066\u0069\u006C\u0065\u0020\u0073\u0065\u0067\u006D\u0065\u006E\u0074\u0020\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0069\u006F\u006E\n\ +\u0072\u006F\u0065\u0068\u0072\u0069\u0073\u0074\u0020\u002D\u0020\u0043\u0056\u0053\u002C\u0020\u0058\u002D\u0069\u006E\u0070\u0075\u0074\u002C\u0020\u0066\u0074\u0070\n\ +\u0070\u0073\u0074\u006F\u0072\u0063\u0068\u0020\u002D\u0020\u0069\u0031\u0038\u006E\u0020\u0073\u0075\u0070\u0070\u006F\u0072\u0074\u002C\u0020\u0073\u0065\u0074\u0074\u0069\u006E\u0067\u0073\n\ +\u0063\u0068\u0072\u0069\u0073\u0067\u0020\u002D\u0020\u0054\u006F\u0070\u0066\u0069\u0065\u006C\u0064\u0020\u0064\u0069\u0073\u006B\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u0020\u0028\u0041\u0064\u0064\u004F\u006E\u0029\n\ +\u006A\u0061\u007A\u007A\u0079\u0064\u0061\u006E\u0065\u0020\u002D\u0020\u0064\u0061\u006E\u0069\u0073\u0068\u0020\u0074\u0072\u0061\u006E\u0073\u006C\u0061\u0074\u0069\u006F\u006E\n\ +\u004B\u0061\u006E\u006F\u0020\u002F\u0020\u0052\u006F\u0045\u006E\u0020\u002D\u0020\u0055\u006E\u0069\u0078\u0020\u0062\u0075\u0069\u006C\u0064\u0073\u0020\u0073\u0063\u0072\u0069\u0070\u0074\n\ +\u0045\u0072\u0069\u0063\u0020\u0041\u006C\u0062\u0065\u0072\u0074\u0020\u002D\u0020\u0042\u0072\u006F\u0077\u0073\u0065\u0072\u004C\u0061\u0075\u006E\u0063\u0068\u0065\u0072\n\ +\u0063\u0061\u0074\u0061\u0070\u0075\u006C\u0074\u002C\u0042\u006F\u006E\u006E\u0069\u0020\u002D\u0020\u0054\u006F\u0070\u0066\u0069\u0065\u006C\u0064\u0020\u0035\u0078\u0030\u0030\u0020\u0065\u0078\u0070\u006F\u0072\u0074\n\ +\u002E\u002E\u002E\u0061\u006E\u0064\u0020\u0061\u006C\u006C\u0020\u006F\u0074\u0068\u0065\u0072\u0020\u0073\u0075\u0070\u0070\u006F\u0072\u0074\u0065\u0072\u0073\u002E\u002E\u002E + +# +Common.File=\u0026\u0053\u006F\u0075\u0062\u006F\u0072 +Common.Save=\u0026\u0055\u006C\u006F\u017E\u0069\u0074 +Common.SaveAs=\u0055\u006C\u006F\u017E\u0069\u0074\u0020\u0026\u006A\u0061\u006B\u006F\u002E\u002E +Common.Open=\u0026\u004F\u0074\u0065\u0076\u0159\u00ED\u0074\u002E\u002E +Common.Load=\u0026\u004E\u0061\u010D\u00ED\u0073\u0074\u002E\u002E +Common.Edit=\u0026\u0055\u0070\u0072\u0061\u0076\u0069\u0074 +Common.Messages=\u005A\u0070\u0072\u00E1\u0026\u0076\u0079 +Common.Options=\u0026\u004D\u006F\u017E\u006E\u006F\u0073\u0074\u0069 +Common.Close=\u0026\u005A\u0061\u0076\u0159\u00ED\u0074 +Common.Cancel=\u005A\u0026\u0072\u0075\u0161\u0069\u0074 +Common.Exit=\u0045\u0026\u0078\u0069\u0074 +Common.LogFile=\u0026\u004C\u006F\u0067\u0020\u0073\u006F\u0075\u0062\u006F\u0072 +Common.Preferences=\u0026\u0050\u0159\u0065\u0064\u006E\u0061\u0073\u0074\u0061\u0076\u0065\u006E\u00ED +Common.Addons=\u0026\u0044\u006F\u0070\u006C\u0148\u006B\u0079 + +General.Yes=\u0041\u006E\u006F +General.No=\u004E\u0065 + +StartUp.Title=\u0058\u0020\u0053\u0070\u006F\u0075\u0161\u0074\u011B\u006E\u00ED\u0020\u0070\u0072\u006F\u0067\u0072\u0061\u006D\u0075\u002C\u0020\u0020\u006E\u0061\u010D\u00ED\u0074\u00E1\u006E\u00ED\u0020\u006B\u006F\u006D\u0070\u006F\u006E\u0065\u006E\u0074\u002E\u002E\u002E +StartUp.Error=\u0043\u0068\u0079\u0062\u0061\u0020\u0070\u0159\u0069\u0020\u0073\u0070\u006F\u0075\u0161\u0074\u011B\u006E\u00ED\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u002D\u0058\u003A +StartUp.Error.Title=\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u002D\u0058\u0020\u0063\u0068\u0079\u0062\u0061\u0020\u0073\u0070\u0075\u0161\u0074\u011B\u006E\u00ED +StartUp.Init=\u0049\u006E\u0069\u0063\u0069\u0061\u006C\u0069\u007A\u0061\u0063\u0065\u002E +StartUp.Wait=\u0050\u0072\u006F\u0073\u00ED\u006D\u0020\u010D\u0065\u006B\u0065\u006A\u0074\u0065\u002E\u002E\u002E +StartUp.Choose=\u005A\u0076\u006F\u006C\u0074\u0065\u0020\u006D\u006F\u006E\u017E\u006F\u0073\u0074\u002E\u002E\u002E + +# +PreferencesPanel.Title=\u0050\u0159\u0065\u0064\u006E\u0061\u0073\u0074\u0061\u0076\u0065\u006E\u00ED +PreferencesPanel.Button=\u0050\u0159\u0065\u0064\u006E\u0061\u0073\u0074\u0061\u0076\u0065\u006E\u00ED + +Application.SaveSettingsOnExit=\u0055\u006C\u006F\u017E\u0069\u0074\u0020\u006E\u0061\u0073\u0074\u0061\u0076\u0065\u006E\u00ED\u0020\u0070\u0159\u0069\u0020\u006F\u0064\u0063\u0068\u006F\u0064\u0075 + +# Popupmenu +popup.what=\u0063\u006F +popup.cutspecials=\u006F\u0074\u0065\u0076\u0159\u00ED\u0074\u0020\u0053\u0074\u0159\u0069\u0068\u002F\u004F\u0073\u0074\u0061\u0074\u006E\u00ED\u002E\u002E +popup.url=\u0070\u0159\u0069\u0064\u0061\u0074\u0020\u0055\u0052\u004C\u002E\u002E +popup.add=\u0070\u0159\u0069\u0064\u0061\u0074\u002E\u002E +popup.remove=\u006F\u0064\u0065\u0062\u0072\u0061\u0074 +popup.rename=\u0070\u0159\u0065\u006A\u006D\u0065\u006E\u006F\u0076\u0061\u0074\u002E\u002E +popup.openhex=\u006F\u0074\u0065\u0076\u0159\u00ED\u0074\u0020\u0076\u0020\u0048\u0065\u0078\u0076\u0069\u0065\u0077\u0065\u0072\u0075\u002E\u002E +popup.patchbasics=\u006F\u0070\u0072\u0061\u0076\u0069\u0074\u0020\u0056\u0069\u0064\u0065\u006F\u0020\u0042\u0061\u0073\u0069\u0063\u0073\u002E\u002E +popup.sendtocl3=\u006F\u0064\u0065\u0073\u006C\u0061\u0074\u0020\u0064\u006F\u0020\u0043\u004C\u0023\u0033\u002E\u002E +popup.newOutName=\u006E\u006F\u0076\u00FD\u0020\u0076\u00FD\u0073\u0074\u0075\u0070\u0020\u006A\u0061\u006B\u006F\u002E\u002E +popup.changeTimestamp=\u0061\u006B\u0074\u0075\u0061\u006C\u0069\u007A\u006F\u0076\u0061\u0074\u0020\u010D\u0061\u0073\u006F\u0076\u00FD\u0020\u00FA\u0064\u0061\u006A\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u0075\u002E\u002E +popup.copyInfoToClipboard=\u007A\u006B\u006F\u0070\u00ED\u0072\u006F\u0076\u0061\u0074\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u0020\u0064\u006F\u0020\u0073\u0063\u0068\u0072\u00E1\u006E\u006B\u0079 +popup.assignStreamType=\u0070\u0159\u0069\u0159\u0061\u0064\u0069\u0074\u0020\u0074\u0079\u0070\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0075\u0020\u0070\u0159\u00ED\u006D\u006F\u002E\u002E +popup.automatic=\u0061\u0075\u0074\u006F\u006D\u0061\u0074\u0069\u0063\u006B\u0079 +popup.assignActionType=\u0070\u0159\u0069\u0159\u0061\u0064\u0069\u0074\u0020\u0074\u0079\u0070\u0020\u0061\u006B\u0063\u0065\u0020\u0070\u0159\u00ED\u006D\u006F\u002E\u002E +popup.unspecified=\u006E\u0065\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u006B\u006F\u0076\u00E1\u006E\u006F +popup.fixHpAc3=\u0076\u0079\u0074\u0076\u006F\u0159\u0069\u0074\u0020\u006F\u0070\u0072\u0061\u0076\u0065\u006E\u00FD\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u0020\u0048\u0070\u0020\u0061\u0063\u0033\u002E\u002E + +#Filechooser +FileChooser.Select=\u0056\u0079\u0062\u0072\u0061\u0074 +FileChooser.Title=\u0056\u00FD\u0062\u011B\u0072 + +#File Menu +file.menu=\u0026\u0053\u006F\u0075\u0062\u006F\u0072 +file.url=\u0041\u0064\u0064\u0020\u0026\u0055\u0052\u004C\u002E\u002E +file.add=\u0026\u0050\u0159\u0069\u0064\u0061\u0074\u002E\u002E +file.remove=\u0026\u004F\u0064\u0065\u0062\u0072\u0061\u0074 +file.rename=\u0050\u0159\u0065\u0026\u006A\u006D\u0065\u006E\u006F\u0076\u0061\u0074\u002E\u002E +file.exit=\u0045\u0026\u0078\u0069\u0074 + +#dialog +dialog.input.url=\u0076\u006C\u006F\u017E\u0020\u0055\u0052\u004C\u002E\u002E + +#Settings Menu +settings.menu=\u0026\u004E\u0061\u0073\u0074\u0061\u0076\u0065\u006E\u00ED +settings.settings=\u0026\u004E\u0061\u0073\u0074\u0061\u0076\u0065\u006E\u00ED\u002E\u002E + +#Language Menu +language.menu=\u0026\u004A\u0061\u007A\u0079\u006B +language.system=\u0026\u0056\u00FD\u0063\u0068\u006F\u007A\u00ED\u0020\u006A\u0061\u007A\u0079\u006B +language.check=\u004F\u0076\u011B\u0159\u0069\u0074\u0020\u0026\u006F\u006E\u006C\u0069\u006E\u0065 + +#General Menu +general.menu=\u0026\u005A\u006F\u0062\u0072\u0061\u007A\u0069\u0074 + +#Options Menu +options.menu=\u0026\u0055\u0070\u0072\u0061\u0076\u0069\u0074 + +options.opencutspecials=\u004F\u0074\u0065\u0076\u0159\u00ED\u0074\u0020\u0026\u0056\u0069\u0064\u0065\u006F\u0053\u0074\u0159\u0069\u0068\u002F\u004F\u0073\u0074\u0061\u0074\u006E\u00ED\u002E\u002E +options.openhexview=\u004F\u0074\u0065\u0076\u0159\u00ED\u0074\u0020\u0076\u0020\u0026\u0048\u0065\u0078\u0056\u0069\u0065\u0077\u0065\u0072\u0075\u002E\u002E +options.pachtbasics=\u0026\u004F\u0070\u0072\u0061\u0076\u0069\u0074\u0020\u0056\u0069\u0064\u0065\u006F\u0020\u0042\u0061\u0073\u0069\u0063\u0073\u002E\u002E +options.subtitlepreview=\u005A\u006F\u0062\u0072\u0061\u007A\u0069\u0074\u0020\u0026\u006E\u00E1\u0068\u006C\u0065\u0064\u0020\u0074\u0069\u0074\u0075\u006C\u006B\u016F\u002E\u002E +options.teletext=\u005A\u006F\u0062\u0072\u0061\u007A\u0069\u0074\u0020\u0026\u006D\u0061\u0074\u0069\u0063\u0069\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u006F\u0076\u00E9\u0020\u0073\u0074\u0072\u0061\u006E\u0079\u002E\u002E + +#Help Menu +help.menu=\u0026\u0050\u006F\u006D\u006F\u0063 +help.about=\u0026\u004F\u0020\u0061\u0070\u006C\u0069\u006B\u0061\u0063\u0069\u002E\u002E +help.help=\u0026\u0050\u006F\u006D\u006F\u0063\u002E\u002E +help.lucike.info=\u0068\u0074\u0074\u0070\u003A\u002F\u002F\u0077\u0077\u0077\u002E\u006C\u0075\u0063\u0069\u006B\u0065\u002E\u0069\u006E\u0066\u006F +help.lucike.forum=\u0068\u0074\u0074\u0070\u003A\u002F\u002F\u0066\u006F\u0072\u0075\u006D\u002E\u006C\u0075\u0063\u0069\u006B\u0065\u002E\u0069\u006E\u0066\u006F +help.sourceforge.net=\u0068\u0074\u0074\u0070\u003A\u002F\u002F\u0073\u006F\u0075\u0072\u0063\u0065\u0066\u006F\u0072\u0067\u0065\u002E\u006E\u0065\u0074\u002F\u0070\u0072\u006F\u006A\u0065\u0063\u0074\u0073\u002F\u0070\u0072\u006F\u006A\u0065\u0063\u0074\u002D\u0078 +help.version=\u0026\u0041\u006B\u0074\u0075\u00E1\u006C\u006E\u00ED\u0020\u0076\u0065\u0072\u007A\u0065\u003F +help.version.info=\u0041\u006B\u0074\u0075\u00E1\u006C\u006E\u00ED\u0020\u0076\u0065\u0072\u007A\u0065\u003A +help.version.info.title=\u0041\u006B\u0074\u0075\u00E1\u006C\u006E\u00ED\u0020\u0076\u0065\u0072\u007A\u0065\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u002D\u0058 +help.version.error=\u0043\u0068\u0079\u0062\u0061\u0020\u0070\u0159\u00ED\u0020\u007A\u00ED\u0073\u006B\u00E1\u0076\u00E1\u006E\u00ED\u0020\u0061\u006B\u0074\u0075\u00E1\u006C\u006E\u00ED\u0020\u0076\u0065\u0072\u007A\u0065\u003A + +progress.title=\u0050\u0072\u016F\u0062\u011B\u0068 + +#Html Frame +html.title=\u0050\u006F\u006D\u006F\u0063 + +#Buttons +button.go=\u0026\u0053\u0074\u0061\u0072\u0074\u0021 +button.go.Tip=\u0053\u0070\u006F\u0075\u0161\u0074\u00ED\u002C\u0020\u0070\u006F\u007A\u0061\u0073\u0074\u0061\u0076\u0075\u006A\u0065\u0020\u0061\u0020\u007A\u006E\u006F\u0076\u0075\u0073\u0070\u006F\u0075\u0161\u0074\u00ED\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED +button.i=\u0026\u0049 +button.i.Tip=\u006B\u0072\u00E1\u0074\u006B\u00E9\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0020\u0076\u007A\u006F\u0072\u006B\u0075\u0020\u0070\u0072\u006F\u0020\u007A\u00ED\u0073\u006B\u00E1\u006E\u00ED\u0020\u0069\u006E\u0066\u006F\u0072\u006D\u0061\u0063\u0065\u0020\u006F\u0020\u0049\u0044\u0020\u006E\u0061\u006C\u0065\u007A\u0065\u006E\u00FD\u0063\u0068\u0020\u0076\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0075\u0020\u0028\u0076\u0065\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u006B\u006F\u0076\u0061\u006E\u00E9\u0020\u0076\u0065\u006C\u0069\u006B\u006F\u0073\u0074\u0069\u002C\u0020\u0076\u0069\u007A\u0020\u006F\u0075\u0074\u0029 +button.c=\u0026\u0043 +button.c.Tip=\u007A\u0072\u0075\u0161\u0069\u0074\u0020\u0070\u0072\u006F\u0062\u00ED\u0068\u0061\u006A\u00ED\u0063\u00ED\u0020\u0070\u0072\u006F\u0063\u0065\u0073 +button.p=\u0026\u0050 +button.p.Tip=\u007A\u0061\u0073\u0074\u0061\u0076\u0065\u006E\u00ED\u0020\u0028\u0070\u0061\u0075\u007A\u0061\u0029\u0020\u006E\u0065\u0062\u006F\u0020\u0070\u006F\u006B\u0072\u0061\u010D\u006F\u0076\u00E1\u006E\u00ED\u0020\u0070\u0072\u006F\u0062\u00ED\u0068\u0061\u006A\u00ED\u0063\u00ED\u0068\u006F\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0075 +button.e=\u0026\u0045 +button.e.Tip=\u0065\u0078\u0074\u0072\u0061\u006B\u0063\u0065\u0020\u0068\u0072\u0075\u0062\u00E9\u0068\u006F\u0020\u0050\u0056\u0041\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u0075\u0020\u007A\u0061\u0020\u0070\u006F\u0075\u017E\u0069\u0074\u00ED\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u006B\u006F\u0076\u0061\u006E\u00FD\u0063\u0068\u0020\u0049\u0044\u003A\u0020\u0028\u006B\u006C\u0069\u006B\u006E\u0069\u0020\u006E\u0061\u0020\u0027\u0069\u0027\u0020\u0070\u0072\u006F\u0020\u0070\u0159\u0065\u0068\u006C\u0065\u0064\u0020\u006E\u0061\u006C\u0065\u007A\u0065\u006E\u00FD\u0063\u0068\u0020\u0049\u0044\u0029 + +#Mainpanel +MainPanel.Collection=\u004B\u006F\u006C\u0065\u006B\u0063\u0065 +MainPanel.Process=\u005A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED +MainPanel.Process.Tip=\u0070\u006F\u006B\u0075\u0064\u0020\u006E\u0065\u0044\u0045\u004D\u0055\u0058\u0055\u004A\u0045\u0054\u0045\u002C\u0020\u0070\u0159\u0065\u0076\u0065\u0064\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0066\u006F\u0072\u006D\u00E1\u0074\u0020\u006E\u0061\u0020\u0076\u0079\u0062\u0072\u0061\u006E\u00FD\u0020\u0028\u006B\u006F\u0070\u0069\u0065\u0020\u006F\u0062\u0073\u0061\u0068\u0075\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0075\u002C\u0020\u0062\u0065\u007A\u0020\u006F\u0070\u0072\u0061\u0076\u0079\u0020\u0063\u0068\u0079\u0062\u0021\u0021\u0021\u0029 +MainPanel.BitrateMonitor.Tip=\u0073\u006B\u0075\u0074\u0065\u010D\u006E\u00FD\u0020\u0064\u0061\u0074\u006F\u0076\u00FD\u0020\u0074\u006F\u006B\u0020\u0047\u004F\u0050\u0075\u0020\u0076\u0020\u0072\u006F\u007A\u006D\u0065\u007A\u00ED\u0020\u0030\u002E\u002E\u002E\u0031\u0030\u004D\u0062\u0070\u0073\u0020\u0028\u007A\u00E1\u006C\u0065\u017E\u00ED\u0020\u006E\u0061\u0020\u0074\u0079\u0070\u0075\u0020\u0070\u006F\u010D\u00ED\u0074\u00E1\u006E\u00ED\u0029\u0020\u002F\u0020\u0073\u0074\u0072\u0075\u006B\u0074\u0075\u0072\u0061\u0020\u0047\u004F\u0050\u0075\u0020\u002F\u0020\u0064\u00E9\u006C\u006B\u0061\u0020\u0076\u0069\u0064\u0065\u0061 +MainPanel.writtenMB=\u0076\u00FD\u0073\u0074\u0075\u0070\u0020\u0076\u0020\u004D\u0042 +MainPanel.writtenMB.Tip=\u007A\u0061\u0070\u0073\u0061\u006E\u00E9\u0020\u004D\u0042\u0020\u006E\u006F\u0076\u011B\u0020\u0076\u0079\u0074\u0076\u006F\u0159\u0065\u006E\u00FD\u0063\u0068\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u016F\u0020\u007A\u0020\u006B\u006F\u006C\u0065\u006B\u0063\u0065\u0020\u0028\u0062\u0065\u007A\u0020\u0064\u006F\u010D\u0061\u0073\u006E\u00FD\u0063\u0068\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u016F\u0029 +MainPanel.useAllCollections=\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u0061\u0074\u0020\u0076\u0161\u0065\u0063\u0068\u006E\u0079\u0020\u006B\u006F\u006C\u0065\u006B\u0063\u0065 +MainPanel.useAllCollections.Tip=\u0075\u006D\u006F\u017E\u0148\u0075\u006A\u0065\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0020\u0076\u0161\u0065\u0063\u0068\u0020\u006B\u006F\u006C\u0065\u006B\u0063\u00ED\u0020\u0076\u0020\u006A\u0065\u0064\u006E\u006F\u006D\u0020\u006B\u0072\u006F\u006B\u0075 +MainPanel.enablePostProcessing=\u0075\u006D\u006F\u017E\u006E\u0069\u0074\u0020\u0070\u006F\u0073\u0074\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0069\u006E\u0067 +MainPanel.enablePostProcessing.Tip=\u0075\u006D\u006F\u017E\u0148\u0075\u006A\u0065\u0020\u0070\u006F\u0073\u0074\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0069\u006E\u0067\u0020\u0028\u002D\u003E\u0076\u0069\u007A\u0020\u007A\u00E1\u006C\u006F\u017E\u006B\u0061\u0020\u0022\u0065\u0078\u0074\u0065\u0072\u006E\u0061\u006C\u0022\u002C\u0020\u0070\u006F\u006B\u0075\u0064\u0020\u0070\u006F\u006C\u0065\u0020\u006E\u0065\u006E\u00ED\u0020\u0070\u0072\u00E1\u007A\u0064\u006E\u00E9\u0020\u0029 +MainPanel.simpleMPG=\u004D\u0050\u0047\u003D\u003E\u0073\u0050\u0045\u0053 +MainPanel.simpleMPG.Tip=\u006A\u0065\u0064\u006E\u006F\u0064\u0075\u0063\u0068\u00E9\u0020\u006F\u0064\u0064\u011B\u006C\u0065\u006E\u00ED\u0020\u0050\u0045\u0053\u002C\u0020\u007A\u0061\u0161\u006B\u0072\u0074\u006E\u011B\u0074\u0065\u0020\u0070\u0072\u006F\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0020\u004D\u0050\u0045\u0047\u002D\u0050\u0053\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u016F\u0020\u0062\u0065\u007A\u0020\u0159\u00E1\u0064\u006E\u00E9\u0068\u006F\u0020\u0073\u0075\u0062\u0020\u0049\u0044\u0020\u0070\u0072\u006F\u0020\u0070\u0072\u0069\u0076\u0061\u0074\u0065\u005F\u0073\u0074\u0072\u0065\u0061\u006D\u005F\u0031 +MainPanel.enhancedPES=\u0073\u0050\u0045\u0053\u003D\u003E\u004D\u0050\u0047 +MainPanel.enhancedPES.Tip=\u0072\u006F\u007A\u0161\u00ED\u0159\u0065\u006E\u00E9\u0020\u006F\u0064\u0064\u011B\u006C\u0065\u006E\u00ED\u0020\u0050\u0045\u0053\u002C\u0020\u007A\u0061\u0161\u006B\u0072\u0074\u006E\u011B\u0074\u0065\u0020\u0070\u0072\u006F\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0020\u0050\u0045\u0053\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u016F\u0020\u006F\u0062\u0073\u0061\u0068\u0075\u006A\u00ED\u0063\u00ED\u0063\u0068\u0020\u0159\u00E1\u0064\u006E\u00E9\u0020\u0073\u0075\u0062\u0020\u0049\u0044\u0020\u0070\u0072\u006F\u0020\u0070\u0072\u0069\u0076\u0061\u0074\u0065\u005F\u0073\u0074\u0072\u0065\u0061\u006D\u005F\u0031 +MainPanel.nonVideoExportStatus=\u006E\u0065\u0073\u0070\u0075\u0161\u0074\u011B\u006E\u006F +MainPanel.nonVideoExportStatus.Tip=\u0073\u0074\u0061\u0076\u0020\u0061\u0075\u0064\u0069\u006F\u0065\u0078\u0070\u006F\u0072\u0074\u0075\u0020\u006E\u0065\u0062\u006F\u0020\u007A\u0061\u0070\u0073\u0061\u006E\u00FD\u0063\u0068\u0020\u0073\u0075\u0062\u006F\u0062\u0072\u00E1\u007A\u006B\u016F\u002F\u0073\u0074\u0072\u0061\u006E\u0020 +MainPanel.AudioVideoOffset=\u0041\u002F\u0056\u0020\u006F\u0066\u0066\u0073\u0065\u0074 +MainPanel.AudioVideoOffset.Tip=\u003C\u0068\u0074\u006D\u006C\u003E\u007A\u006F\u0062\u0072\u0061\u007A\u0075\u006A\u0065\u0020\u010D\u0061\u0073\u006F\u0076\u00FD\u0020\u0070\u006F\u0073\u0075\u0076\u0020\u0041\u002F\u0056\u0020\u006E\u0061\u0020\u0070\u006F\u010D\u00E1\u0074\u006B\u0075\u0020\u006B\u0061\u017E\u0064\u00E9\u0068\u006F\u0020\u0047\u004F\u0050\u0075\u0020\u0076\u00A0\u006D\u0073\u003A\u0020\u0020\u0061\u002F\u0062\u002F\u0063\u0020\u003C\u0070\u003E\u0028\u0073\u0074\u0159\u0069\u0068\u0079\u0020\u007A\u0070\u016F\u0073\u006F\u0062\u0075\u006A\u00ED\u0020\u0072\u006F\u007A\u0064\u00ED\u006C\u006E\u00FD\u0020\u0070\u006F\u0073\u0075\u0076\u0029\u003C\u0070\u003E\u0061\u0029\u0020\u0041\u002F\u0056\u0020\u0050\u0054\u0053\u0020\u0070\u006F\u0073\u0075\u006E\u0020\u0076\u0065\u0020\u007A\u0064\u0072\u006F\u006A\u0069\u0020\u003C\u0070\u003E\u0062\u0029\u0020\u0041\u002F\u0056\u0020\u0073\u006E\u00ED\u006D\u0065\u006B\u0020\u0070\u006F\u010D\u00E1\u0074\u006B\u0075\u0020\u0070\u006F\u0073\u0075\u006E\u0075\u0020\u0076\u00A0\u0061\u006B\u0074\u0075\u00E1\u006C\u006E\u00ED\u006D\u0020\u0047\u004F\u0050\u0075\u0020\u0076\u00A0\u0064\u0065\u006D\u0075\u0078\u006F\u0076\u0061\u006E\u00E9\u006D\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u0075\u0020\u003C\u0070\u003E\u0063\u0029\u0020\u006E\u006F\u0076\u00FD\u0020\u0073\u006B\u0075\u0074\u0065\u010D\u006E\u00FD\u0020\u0070\u006F\u0073\u0075\u006E\u0020\u0041\u002F\u0056\u0020\u0070\u0072\u006F\u0020\u0061\u006B\u0074\u0075\u00E1\u006C\u006E\u00ED\u0020\u0047\u004F\u0050\u0020\u0076\u00A0\u0064\u0065\u006D\u0075\u0078\u006F\u0076\u0061\u006E\u00E9\u006D\u0020\u0073\u006F\u0075\u0062\u006F\u0072\u0075\u0020\u003C\u002F\u0068\u0074\u006D\u006C\u003E +MainPanel.ConversionMode.demux=\u0064\u0065\u006D\u0075\u0078 +MainPanel.ConversionMode.toVDR=\u0064\u006F\u0020\u0056\u0044\u0052 +MainPanel.ConversionMode.toM2P=\u0064\u006F\u0020\u004D\u0032\u0050 +MainPanel.ConversionMode.toPVA=\u0064\u006F\u0020\u0050\u0056\u0041 +MainPanel.ConversionMode.toTS=\u0064\u006F\u0020\u0054\u0053 +MainPanel.ConversionMode.PidFilter=\u0050\u0049\u0044\u0066\u0069\u006C\u0074\u0072 +MainPanel.ConversionModePriority=\u004B\u006F\u006C\u0065\u006B\u0063\u0065\u0020\u006D\u00E1\u0020\u0070\u0072\u0069\u006F\u0072\u0069\u0074\u0075 +MainPanel.ConversionModePriority.Tip=\u0070\u006F\u0075\u017E\u00ED\u0074\u0020\u007A\u0070\u016F\u0073\u006F\u0062\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0020\u0064\u006C\u0065\u0020\u006E\u0061\u0073\u0074\u0061\u0076\u0065\u006E\u00ED\u0020\u006B\u006F\u006C\u0065\u006B\u0063\u0065 +MainPanel.useAutoPidFilter=\u0070\u006F\u0075\u017E\u00ED\u0074\u0020\u0050\u004D\u0054\u002D\u0050\u0049\u0044\u0020\u0066\u0069\u006C\u0074\u0072 +MainPanel.useAutoPidFilter.Tip= +MainPanel.QuickStart=\u0053\u0070\u0075\u0073\u0074\u0069\u0074 +MainPanel.QuickStart.Tip=\u0073\u0070\u0075\u0073\u0074\u00ED\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0020\u006F\u006B\u0061\u006D\u017E\u0069\u0074\u011B\u0020\u0061\u0020\u0070\u006F\u0075\u017E\u0069\u006A\u0065\u0020\u0070\u006F\u0073\u006C\u0065\u0064\u006E\u00ED\u0020\u0061\u006B\u0074\u0069\u0076\u006E\u00ED\u0020\u006E\u0061\u0073\u0074\u0061\u0076\u0065\u006E\u00ED\u0020 + + +ProcessWindow.Title=\u004F\u006B\u006E\u006F\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED +ProcessWindowPanel.Button=\u006F\u0074\u0065\u0076\u0159\u00ED\u0074\u0020\u003E\u003E\u003E +ProcessWindowPanel.Title=\u005A\u00E1\u007A\u006E\u0061\u006D\u0079 +ProcessWindowPanel.Action=\u0041\u006B\u0063\u0065\u003A + +#Tab.msg +MessagePanel.Title=\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0020\u007A\u0070\u0072\u00E1\u0076 +MessagePanel.logSequenceError=\u007A\u0061\u0070\u0069\u0073\u0075\u006A\u0020\u0027\u0070\u0061\u006B\u0065\u0074\u0079\u0020\u006D\u0069\u006D\u006F\u0020\u0070\u006F\u0159\u0061\u0064\u00ED\u0027\u0020\u002F\u0020\u0062\u0069\u0074\u0020\u0065\u0072\u0072\u006F\u0072\u0073 +MessagePanel.logSequenceError.Tip=\u0076\u0079\u0070\u006E\u011B\u0074\u0065\u002C\u0020\u0070\u006F\u006B\u0075\u0064\u0020\u0074\u0065\u006E\u0074\u006F\u0020\u0074\u0079\u0070\u0020\u007A\u0070\u0072\u00E1\u0076\u0020\u0062\u006F\u006D\u0062\u0061\u0072\u0064\u0075\u006A\u0065\u0020\u006F\u006B\u006E\u006F\u0020\u007A\u0070\u0072\u00E1\u0076\u0020\u0028\u0061\u0020\u007A\u0070\u006F\u006D\u0061\u006C\u0075\u006A\u0065\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0029\u0020 +MessagePanel.logMissingStartcode=\u007A\u0061\u0070\u0069\u0073\u0075\u006A\u0020\u0027\u0063\u0068\u0079\u0062\u011B\u006A\u00ED\u0063\u00ED\u0020\u0073\u0074\u0061\u0072\u0074\u006B\u00F3\u0064\u0079\u0027 +MessagePanel.logMissingStartcode.Tip=\u0076\u0079\u0070\u006E\u011B\u0074\u0065\u002C\u0020\u0070\u006F\u006B\u0075\u0064\u0020\u0074\u0065\u006E\u0074\u006F\u0020\u0074\u0079\u0070\u0020\u007A\u0070\u0072\u00E1\u0076\u0020\u0062\u006F\u006D\u0062\u0061\u0072\u0064\u0075\u006A\u0065\u0020\u006F\u006B\u006E\u006F\u0020\u007A\u0070\u0072\u00E1\u0076\u0020\u0028\u0061\u0020\u007A\u0070\u006F\u006D\u0061\u006C\u0075\u006A\u0065\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0029 +MessagePanel.logESError=\u007A\u0061\u0070\u0069\u0073\u0075\u006A\u0020\u0027\u0050\u0045\u0053\u0020\u0068\u006C\u0061\u0076\u0069\u010D\u006B\u0061\u0020\u006E\u0061\u006C\u0065\u007A\u0065\u006E\u0061\u0020\u0076\u0020\u0045\u0053\u0027 +MessagePanel.logESError.Tip=\u0076\u0079\u0070\u006E\u011B\u0074\u0065\u002C\u0020\u0070\u006F\u006B\u0075\u0064\u0020\u0074\u0065\u006E\u0074\u006F\u0020\u0074\u0079\u0070\u0020\u007A\u0070\u0072\u00E1\u0076\u0020\u0062\u006F\u006D\u0062\u0061\u0072\u0064\u0075\u006A\u0065\u0020\u006F\u006B\u006E\u006F\u0020\u007A\u0070\u0072\u00E1\u0076\u0020\u0028\u0061\u0020\u007A\u0070\u006F\u006D\u0061\u006C\u0075\u006A\u0065\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0029 +MessagePanel.leadingTimeIndex=\u0070\u0159\u0069\u0064\u0065\u006A\u0020\u010D\u0061\u0073\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0020\u0075\u0020\u0076\u0161\u0065\u0063\u0068\u0020\u0074\u0079\u0070\u016F\u0020\u007A\u0070\u0072\u00E1\u0076 +MessagePanel.leadingTimeIndex.Tip=\u007A\u0061\u0070\u00ED\u0161\u0065\u0020\u0061\u006B\u0074\u0075\u00E1\u006C\u006E\u00ED\u0020\u010D\u0061\u0073\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED +MessagePanel.logWSS=\u007A\u0061\u0070\u0069\u0073\u0075\u006A\u0020\u0057\u0053\u0053 +MessagePanel.logWSS.Tip= +MessagePanel.logVPS=\u007A\u0061\u0070\u0069\u0073\u0075\u006A\u0020\u0056\u0050\u0053 +MessagePanel.logVPS.Tip= +MessagePanel.logRDS=\u007A\u0061\u0070\u0069\u0073\u0075\u006A\u0020\u0052\u0044\u0053 +MessagePanel.logRDS.Tip= +MessagePanel.hideProcessWindow=\u0073\u006B\u0072\u00FD\u0074\u0020\u004F\u006B\u006E\u006F\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED\u0020\u0062\u011B\u0068\u0065\u006D\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED +MessagePanel.hideProcessWindow.Tip= +MessagePanel.minimizeMainFrame=\u006D\u0069\u006E\u0069\u006D\u0061\u006C\u0069\u007A\u006F\u0076\u0061\u0074\u0020\u0068\u006C\u0061\u0076\u006E\u00ED\u0020\u006F\u006B\u006E\u006F\u0020\u0062\u011B\u0068\u0065\u006D\u0020\u007A\u0070\u0072\u0061\u0063\u006F\u0076\u00E1\u006E\u00ED +MessagePanel.minimizeMainFrame.Tip= +MessagePanel.showSubpictureWindow=\u007A\u006F\u0062\u0072\u0061\u007A\u0069\u0074\u0020\u006E\u00E1\u0068\u006C\u0065\u0064\u0020\u0070\u006F\u0064\u006F\u0062\u0072\u00E1\u007A\u006B\u016F\u0020\u0070\u0159\u0069\u0020\u006A\u0065\u006A\u0069\u0063\u0068\u0020\u0076\u0079\u0074\u0076\u00E1\u0159\u0065\u006E\u00ED\u0020 +MessagePanel.showSubpictureWindow.Tip= + + +#usage note +usage=\u0071\u0075\u0069\u0063\u006B\u0020\u0043\u004C\u0020\u0075\u0073\u0061\u0067\u0065\u003A\u0020\n\ +\u004E\u006F\u0074\u0065\u003A\u0020\u0043\u004C\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u006C\u006F\u0061\u0064\u0020\u0074\u0068\u0065\u0020\u0047\u0055\u0049\u0020\u0063\u006F\u006D\u0070\u006F\u006E\u0065\u006E\u0074\u0073\u002C\u0020\u0065\u0078\u0063\u0065\u0070\u0074\u0020\u0077\u0069\u0074\u0068\u0020\u0073\u0077\u0069\u0074\u0063\u0068\u0020\u005B\u002D\u0067\u0075\u0069\u005D\n\ +\u003C\u0077\u0069\u0074\u0068\u006F\u0075\u0074\u0020\u006F\u0070\u0074\u0069\u006F\u006E\u0073\u003E\u0020\u0020\u002E\u002E\u002E\u0073\u0074\u0061\u0072\u0074\u0073\u0020\u0074\u0068\u0065\u0020\u0047\u0055\u0049\n\ +\u0073\u0077\u0069\u0074\u0063\u0068\u0065\u0073\u0020\u0061\u006E\u0064\u0020\u0069\u006E\u0070\u0075\u0074\u0066\u0069\u006C\u0065\u0073\u0020\u0063\u0061\u006E\u0020\u0062\u0065\u0020\u0069\u006E\u0020\u0061\u006E\u0079\u0020\u006F\u0072\u0064\u0065\u0072\n\ +\n\ +\u006F\u0070\u0074\u0069\u006F\u006E\u0073\u003A\n\ +\u005B\u002D\u0069\u006E\u0069\u0020\u003C\u0070\u0061\u0074\u0068\u0020\u0020\u0069\u006E\u0069\u0066\u0069\u006C\u0065\u003E\u005D\u0020\u002E\u002E\u0075\u0073\u0065\u0020\u0074\u0068\u0061\u0074\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064\u0020\u0069\u006E\u0069\u0046\u0069\u006C\u0065\u0020\u0069\u006E\u0073\u0074\u0065\u0061\u0064\u0020\u006F\u0066\u0020\u0074\u0068\u0065\u0020\u0073\u0074\u0061\u006E\u0064\u0061\u0072\u0064\n\ +\u005B\u002D\u0064\u0076\u0078\u0031\u005D\u0020\u002E\u002E\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0061\u0020\u002E\u0064\u0032\u0076\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u0046\u0069\u006C\u0065\u0020\u006F\u006E\u0020\u0064\u0065\u006D\u0075\u0078\n\ +\u005B\u002D\u0064\u0076\u0078\u0032\u005D\u0020\u002E\u002E\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0061\u0020\u002E\u0064\u0032\u0076\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u0046\u0069\u006C\u0065\u0020\u0020\u002E\u0061\u0063\u0033\u002E\u0077\u0061\u0076\u0020\u0028\u0052\u0049\u0046\u0046\u0020\u0057\u0041\u0056\u0045\u0020\u0048\u0065\u0061\u0064\u0065\u0072\u0029\n\ +\u005B\u002D\u0064\u0076\u0078\u0033\u005D\u0020\u002E\u002E\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0061\u0020\u002E\u0064\u0032\u0076\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u0046\u0069\u006C\u0065\u0020\u0020\u002E\u006D\u0070\u0061\u002E\u0077\u0061\u0076\u0020\u0028\u0052\u0049\u0046\u0046\u0020\u0057\u0041\u0056\u0045\u0020\u0048\u0065\u0061\u0064\u0065\u0072\u0029\n\ +\u005B\u002D\u0064\u0076\u0078\u0034\u005D\u0020\u002E\u002E\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0061\u0020\u002E\u0064\u0032\u0076\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u0046\u0069\u006C\u0065\u0020\u0020\u002E\u0061\u0063\u0033\u002E\u0077\u0061\u0076\u0020\u0020\u006D\u0070\u0061\u002E\u0077\u0061\u0076\u0020\u0028\u0052\u0049\u0046\u0046\u0020\u0057\u0041\u0056\u0045\u0020\u0048\u0065\u0061\u0064\u0065\u0072\u0029\n\ +\u005B\u002D\u006F\u0075\u0074\u0020\u003C\u0070\u0061\u0074\u0068\u003E\u005D\u0020\u002E\u002E\u0075\u0073\u0065\u0020\u0074\u0068\u0061\u0074\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u0066\u006F\u0072\u0020\u006F\u0075\u0074\u0070\u0075\u0074\n\ +\u005B\u002D\u006E\u0061\u006D\u0065\u0020\u003C\u0066\u0069\u006C\u0065\u006E\u0061\u006D\u0065\u003E\u005D\u0020\u002E\u002E\u0075\u0073\u0065\u0020\u0074\u0068\u0061\u0074\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064\u0020\u0066\u0069\u006C\u0065\u006E\u0061\u006D\u0065\u0020\u0066\u006F\u0072\u0020\u006F\u0075\u0074\u0070\u0075\u0074\n\ +\u005B\u002D\u0063\u0075\u0074\u0020\u003C\u0066\u0069\u006C\u0065\u003E\u005D\u0020\u002E\u002E\u0075\u0073\u0065\u0020\u0074\u0068\u0061\u0074\u0020\u0074\u0065\u0078\u0074\u0020\u0062\u0061\u0073\u0065\u0064\u0020\u0066\u0069\u006C\u0065\u0020\u0061\u0073\u0020\u0063\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0020\u006C\u0069\u0073\u0074\n\ +\u005B\u002D\u0069\u0064\u0020\u003C\u0074\u006F\u006B\u0065\u006E\u0073\u003E\u005D\u0020\u002E\u002E\u0075\u0073\u0065\u0020\u006F\u006E\u006C\u0079\u0020\u0074\u0068\u0065\u0073\u0065\u0020\u0028\u0050\u0029\u0049\u0044\u0073\u002C\u0020\u0073\u0065\u0070\u0061\u0072\u0061\u0074\u0065\u0064\u0020\u0062\u0079\u0020\u0063\u006F\u006D\u006D\u0061\u0020\u005C\u0022\u002C\u005C\u0022\n\ +\u005B\u002D\u0067\u0075\u0069\u005D\u0020\u002E\u002E\u0064\u0069\u0073\u0070\u006C\u0061\u0079\u0020\u0074\u0068\u0065\u0020\u0047\u0055\u0049\u0020\u0075\u0073\u0069\u006E\u0067\u0020\u0061\u006C\u006C\u0020\u0067\u0069\u0076\u0065\u006E\u0020\u0043\u004C\u0049\u0020\u006F\u0070\u0074\u0069\u006F\u006E\u0073\n\ +\u005B\u002D\u006C\u006F\u0067\u005D\u0020\u002E\u002E\u0077\u0072\u0069\u0074\u0065\u0020\u0074\u0068\u0065\u0020\u006E\u006F\u0072\u006D\u0061\u006C\u0020\u006C\u006F\u0067\u0066\u0069\u006C\u0065\n\ +\u005B\u002D\u0073\u0061\u0076\u0065\u0069\u006E\u0069\u005D\u0020\u002E\u002E\u0073\u0061\u0076\u0065\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0073\u0020\u006D\u0061\u0064\u0065\u0020\u0062\u0065\u0069\u0020\u0043\u004C\u0049\u0020\u0069\u006E\u0020\u0061\u0063\u0074\u0069\u0076\u0065\u0020\u002E\u0069\u006E\u0069 +\u005B\u002D\u0064\u0065\u006D\u0075\u0078\u002C\u0020\u002D\u0074\u006F\u006D\u0032\u0070\u002C\u0020\u002D\u0074\u006F\u0070\u0076\u0061\u002C\u0020\u002D\u0074\u006F\u0076\u0064\u0072\u002C\u0020\u002D\u0074\u006F\u0074\u0073\u002C\u0020\u002D\u0066\u0069\u006C\u0074\u0065\u0072\u005D\u0020\u002E\u002E\u0061\u0063\u0074\u0069\u006F\u006E\u0020\u0074\u0079\u0070\u0065\u0073 + +#terms of conditions +terms=\n\ +\u0054\u0045\u0052\u004D\u0053\u0020\u0041\u004E\u0044\u0020\u0043\u004F\u004E\u0044\u0049\u0054\u0049\u004F\u004E\u0053\u003A\n\ +\u0028\u0031\u0029\u0020\u0074\u0068\u0069\u0073\u0020\u0069\u0073\u0020\u0061\u0020\u0066\u0072\u0065\u0065\u0020\u004A\u0061\u0076\u0061\u0020\u0062\u0061\u0073\u0065\u0064\u0020\u0064\u0065\u006D\u0075\u0078\u0020\u0075\u0074\u0069\u006C\u0069\u0074\u0079\u002E\n\ +\u0028\u0032\u0029\u0020\u0049\u0074\u0020\u0069\u0073\u0020\u0069\u006E\u0074\u0065\u006E\u0064\u0065\u0064\u0020\u0066\u006F\u0072\u0020\u0065\u0064\u0075\u0063\u0061\u0074\u0069\u006F\u006E\u0061\u006C\u0020\u0070\u0075\u0072\u0070\u006F\u0073\u0065\u0073\u0020\u006F\u006E\u006C\u0079\u002C\u0020\u0061\u0073\u0020\u0061\u0020\u006E\u006F\u006E\u002D\u0063\u006F\u006D\u006D\u0065\u0072\u0063\u0069\u0061\u006C\u0020\u0074\u0065\u0073\u0074\u0020\u0070\u0072\u006F\u006A\u0065\u0063\u0074\u002E\n\ +\u0028\u0033\u0029\u0020\u0049\u0074\u0020\u006D\u0061\u0079\u0020\u006E\u006F\u0074\u0020\u0062\u0065\u0020\u0075\u0073\u0065\u0064\u0020\u006F\u0074\u0068\u0065\u0072\u0077\u0069\u0073\u0065\u002E\u0020\u004D\u006F\u0073\u0074\u0020\u0070\u0061\u0072\u0074\u0073\u0020\u0061\u0072\u0065\u0020\u006F\u006E\u006C\u0079\u0020\u0065\u0078\u0070\u0065\u0072\u0069\u006D\u0065\u006E\u0074\u0061\u006C\u002E\n\ +\u0028\u0034\u0029\u0020\u0072\u0065\u006C\u0065\u0061\u0073\u0065\u0064\u0020\u0075\u006E\u0064\u0065\u0072\u0020\u0074\u0068\u0065\u0020\u0074\u0065\u0072\u006D\u0073\u0020\u006F\u0066\u0020\u0074\u0068\u0065\u0020\u0047\u004E\u0055\u0020\u0047\u0050\u004C\u002E\n\ +\u0028\u0035\u0029\u0020\u0074\u0068\u0065\u0072\u0065\u0020\u0069\u0073\u0020\u004E\u004F\u0020\u0057\u0041\u0052\u0052\u0041\u004E\u0054\u0059\u0020\u006F\u0066\u0020\u0061\u006E\u0079\u0020\u006B\u0069\u006E\u0064\u0020\u0061\u0074\u0074\u0061\u0063\u0068\u0065\u0064\u0020\u0074\u006F\u0020\u0074\u0068\u0069\u0073\u0020\u0073\u006F\u0066\u0074\u0077\u0061\u0072\u0065\u002E\n\ +\u0028\u0036\u0029\u0020\u0075\u0073\u0065\u0020\u0069\u0074\u0020\u0061\u0074\u0020\u0079\u006F\u0075\u0072\u0020\u006F\u0077\u006E\u0020\u0072\u0069\u0073\u006B\u0020\u0061\u006E\u0064\u0020\u0066\u006F\u0072\u0020\u0079\u006F\u0075\u0072\u0020\u006F\u0077\u006E\u0020\u0065\u0064\u0075\u0063\u0061\u0074\u0069\u006F\u006E\u0020\u0061\u0073\u0020\u0069\u0074\u0020\u0077\u0061\u0073\u0020\u006D\u0065\u0061\u006E\u0074\u002E\n\ + +terms.disagree=\u0049\u0020\u0064\u0069\u0073\u0061\u0067\u0072\u0065\u0065\u0020\u0028\u0063\u006C\u006F\u0073\u0069\u006E\u0067\u0029 +terms.agree=\u0049\u0020\u0061\u0067\u0072\u0065\u0065 + +startup.title=\u0058\u0020\u0053\u0074\u0061\u0072\u0074\u0075\u0070\u002C\u0020\u0020\u006C\u006F\u0061\u0064\u0069\u006E\u0067\u0020\u0063\u006F\u006D\u0070\u006F\u006E\u0065\u006E\u0074\u0073\u002E\u002E\u002E +startup.error=\u0045\u0072\u0072\u006F\u0072\u0020\u0064\u0075\u0072\u0069\u006E\u0067\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u002D\u0058\u0020\u0073\u0074\u0061\u0072\u0074\u0075\u0070\u003A +startup.error.title=\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u002D\u0058\u0020\u0073\u0074\u0061\u0072\u0074\u0075\u0070\u0020\u0065\u0072\u0072\u006F\u0072 + +about.title=\u0041\u0062\u006F\u0075\u0074\u002E\u002E +about.ok=\u004F\u006B +about.credits.label=\u0043\u0072\u0065\u0064\u0069\u0074\u0073\u003A + +#version info +version.info=\u0054\u0045\u0053\u0054\u0020\u0050\u0052\u004F\u004A\u0045\u0043\u0054\u0020\u004F\u004E\u004C\u0059 +version.user=\u002C\u0020\u0055\u0073\u0065\u0072\u003A\u0020 + +#JavaEV +javaev.java.version=\u006A\u0061\u0076\u0061\u002E\u0076\u0065\u0072\u0073\u0069\u006F\u006E +javaev.java.vendor=\u006A\u0061\u0076\u0061\u002E\u0076\u0065\u006E\u0064\u006F\u0072 +javaev.java.home=\u006A\u0061\u0076\u0061\u002E\u0068\u006F\u006D\u0065 +javaev.java.vm.version=\u006A\u0061\u0076\u0061\u002E\u0076\u006D\u002E\u0076\u0065\u0072\u0073\u0069\u006F\u006E +javaev.java.vm.vendor=\u006A\u0061\u0076\u0061\u002E\u0076\u006D\u002E\u0076\u0065\u006E\u0064\u006F\u0072 +javaev.java.vm.name=\u006A\u0061\u0076\u0061\u002E\u0076\u006D\u002E\u006E\u0061\u006D\u0065 +javaev.java.class.vers=\u006A\u0061\u0076\u0061\u002E\u0063\u006C\u0061\u0073\u0073\u002E\u0076\u0065\u0072\u0073 +javaev.java.class.path=\u006A\u0061\u0076\u0061\u002E\u0063\u006C\u0061\u0073\u0073\u002E\u0070\u0061\u0074\u0068 +javaev.java.os.name=\u006F\u0073\u002E\u006E\u0061\u006D\u0065 +javaev.java.os.arch=\u006F\u0073\u002E\u0061\u0072\u0063\u0068 +javaev.java.os.version=\u006F\u0073\u002E\u0076\u0065\u0072\u0073\u0069\u006F\u006E +javaev.java.user.name=\u0075\u0073\u0065\u0072\u002E\u006E\u0061\u006D\u0065 +javaev.java.user.home=\u0075\u0073\u0065\u0072\u002E\u0068\u006F\u006D\u0065 +javaev.java.user.lang=\u0075\u0073\u0065\u0072\u002E\u006C\u0061\u006E\u0067\u0075\u0061\u0067\u0065 +javaev.java.ini.file=\u0069\u006E\u0069\u002E\u0066\u0069\u006C\u0065 +javaev.java.disk.access=\u0065\u0078\u0074\u002E\u0064\u0069\u0073\u006B\u002E\u0061\u0063\u0063\u0065\u0073\u0073 + +#messages +msg.infomessage=\u0049\u006E\u0066\u006F\u0072\u006D\u0061\u0074\u0069\u006F\u006E +msg.new.language=\u0054\u0068\u0065\u0020\u004C\u0061\u006E\u0067\u0075\u0061\u0067\u0065\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0020\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0073\u0020\u0061\u0020\u0072\u0065\u0073\u0074\u0061\u0072\u0074\u0020\u006F\u0066\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u002D\u0058\u002E +msg.loadlang.error=\u006C\u006F\u0061\u0064\u0020\u006C\u0061\u006E\u0067\u0075\u0061\u0067\u0065\u0020\u0065\u0072\u0072\u006F\u0072\u003A +msg.init.error=\u0069\u006E\u0069\u0074\u0069\u0061\u006C\u0069\u007A\u0061\u0074\u0069\u006F\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u003A +msg.loadini.error=\u0069\u006E\u0069\u0020\u006C\u006F\u0061\u0064\u0020\u0065\u0072\u0072\u006F\u0072\u003A +msg.saveini.error=\u0069\u006E\u0069\u0020\u0073\u0061\u0076\u0065\u0020\u0065\u0072\u0072\u006F\u0072\u003A +msg.loading.cutpoints=\u002D\u003E\u0020\u006C\u006F\u0061\u0064\u0069\u006E\u0067\u0020\u007B\u0030\u007D\u0020\u0043\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0073\u002E\u002E\u002E +msg.loading.cutpoints.error=\u0065\u0072\u0072\u006F\u0072\u0020\u006C\u006F\u0061\u0064\u0069\u006E\u0067\u0020\u0063\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0073 +msg.loading.pids=\u002D\u003E\u0020\u006C\u006F\u0061\u0064\u0069\u006E\u0067\u0020\u007B\u0030\u007D\u0020\u0028\u0050\u0029\u0049\u0044\u0073\u002E\u002E\u002E +msg.ptsfile.error=\u002E\u002E\u0070\u0074\u0073\u0066\u0069\u006C\u0065\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u0020\u0065\u0072\u0072\u006F\u0072\u003A +msg.savecut=\u002D\u003E\u0020\u0073\u0061\u0076\u0069\u006E\u0067\u0020\u0063\u0075\u0074\u0020\u0050\u0054\u0053\u0020\u0076\u0061\u006C\u0075\u0065\u0020\u0028\u007B\u0030\u007D\u0029\u0020\u0074\u006F\u0020\u0066\u0069\u006C\u0065\u002E\u002E +msg.savecut.error=\u0063\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0020\u0073\u0061\u0076\u0065\u0020\u0065\u0072\u0072\u006F\u0072\u003A +msg.log.error=\u006C\u006F\u0067\u0020\u0065\u0072\u0072\u006F\u0072\u003A +msg.cuts.cutin=\u002D\u003E\u0020\u0063\u0075\u0074\u002D\u0069\u006E\u0020\u0040\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u002F\u0020\u006E\u0065\u0077\u0020\u0076\u0066\u0072\u0061\u006D\u0065\u0020\u007B\u0031\u007D\u0020\u002F\u0020\u006E\u0065\u0077\u0020\u0054\u0069\u006D\u0065\u0063\u006F\u0064\u0065\u0020\u007B\u0032\u007D +msg.cuts.cutout=\u002D\u003E\u0020\u0063\u0075\u0074\u002D\u006F\u0075\u0074\u0020\u0040\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D +msg.newfile=\u002D\u002D\u002D\u003E\u0020\u006E\u0065\u0077\u0020\u0046\u0069\u006C\u0065\u003A +msg.browser.launcher.error=\u0062\u0072\u006F\u0077\u0073\u0065\u0072\u0020\u006C\u0061\u0075\u006E\u0063\u0068\u0065\u0072\u0020\u0065\u0072\u0072\u006F\u0072\u003A + +#Hex Viewer +hexviewer.title=\u0048\u0065\u0078\u0020\u0056\u0069\u0065\u0077\u0065\u0072 +hexviewer.file=\u0048\u0065\u0078\u0020\u0056\u0069\u0065\u0077\u0065\u0072\u0020\u0066\u006F\u0072\u0020\u0066\u0069\u006C\u0065 +hexviewer.filesize=\u0020\u0053\u0069\u007A\u0065 +hexviewer.error=\u002E\u002E\u0063\u0061\u006E\u006E\u006F\u0074\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u0020\u0066\u0069\u006C\u0065 +hexviewer.save=\u0048\u0065\u0078\u0020\u0056\u0069\u0065\u0077\u0065\u0072\u002C\u0020\u0073\u0061\u0076\u0069\u006E\u0067 +hexviewer.close=\u0020\u0063\u006C\u006F\u0073\u0065\u0020 +hexviewer.to=\u0074\u006F +hexviewer.extractfrom=\u0065\u0078\u0074\u0072\u0061\u0063\u0074\u0020\u0066\u0072\u006F\u006D\u003A\u0020\u0028\u0068\u0065\u0078\u002E\u0029 +hexviewer.extractfrom_tip=\u0063\u006C\u0069\u0063\u006B\u0020\u0074\u006F\u0020\u0065\u0078\u0074\u0072\u0061\u0063\u0074\u0020\u0074\u006F\u0020\u0066\u0069\u006C\u0065 +hexviewer.extract_tip=\u0065\u0078\u0074\u0072\u0061\u0063\u0074\u0020\u0066\u0069\u006C\u0065\u0020\u0073\u0065\u0067\u006D\u0065\u006E\u0074\u0020\u0074\u006F\u0020\u006E\u0065\u0077\u0020\u0066\u0069\u006C\u0065 +hexviewer.jumptohex=\u004A\u0075\u006D\u0070\u0020\u0074\u006F\u0020\u0048\u0065\u0078\u002E\u003A +hexviewer.jumptodec=\u004A\u0075\u006D\u0070\u0020\u0074\u006F\u0020\u0044\u0065\u0063\u002E\u003A +hexviewer.jumpto_tip=\u0068\u0069\u0074\u0020\u0068\u0065\u006E\u0074\u0065\u0072\u0020\u0074\u006F\u0020\u006A\u0075\u006D\u0070\u0020\u0074\u006F\u0020\u0066\u0069\u006C\u0065\u0020\u0070\u006F\u0073\u0069\u0074\u0069\u006F\u006E +hexviewer.textmode=\u0074\u0065\u0078\u0074\u0020\u006D\u006F\u0064\u0065 + +#TeletextPageMatrix +ttpagematrix.title=\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0050\u0061\u0067\u0065\u004D\u0061\u0074\u0072\u0069\u0078 +ttpagematrix.tip=\u0064\u0065\u0063\u0072\u0065\u0061\u0073\u0065\u0073\u0020\u0064\u0065\u006D\u0075\u0078\u0020\u0073\u0070\u0065\u0065\u0064\u002C\u0020\u0069\u0066\u0020\u0076\u0069\u0073\u0069\u0062\u006C\u0065 +ttpagematrix.file=\u0066\u0069\u006C\u0065 +ttpagematrix.composition1=\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0070\u0061\u0067\u0065\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u0063\u006F\u006D\u0070\u006F\u0073\u0069\u0074\u0069\u006F\u006E +ttpagematrix.composition2=\u0027\u004D\u0058\u0059\u0027\u0020\u003A\u0020\u004D\u0020\u003D\u0020\u006D\u0061\u0067\u0061\u007A\u0069\u006E\u0065\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u002C\u0020\u0058\u0059\u0020\u003D\u0020\u0070\u0061\u0067\u0065\u0020\u006E\u0075\u006D\u0062\u0065\u0072 +ttpagematrix.composition3=\u006D\u0061\u0067\u0061\u007A\u0069\u006E\u0065\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u0063\u006F\u006C\u006F\u0075\u0072\u0073 + +#Scan +scan.unsupported=\u0075\u006E\u006B\u006E\u006F\u0077\u006E +scan.msg1=\u006E\u006F\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0061\u0074\u0020\u0061\u0020\u0073\u0068\u006F\u0072\u0074\u0020\u0073\u0063\u0061\u006E + +scan.msg2=\u006E\u006F\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0061\u0074\u0020\u0061\u0020\u0073\u0068\u006F\u0072\u0074\u0020\u0073\u0063\u0061\u006E +scan.msg3=\u006E\u006F\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0061\u0074\u0020\u0061\u0020\u0073\u0068\u006F\u0072\u0074\u0020\u0073\u0063\u0061\u006E +scan.msg4=\u006E\u006F\u0020\u0073\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0061\u0074\u0020\u0061\u0020\u0073\u0068\u006F\u0072\u0074\u0020\u0073\u0063\u0061\u006E +scan.msg5=\u006E\u006F\u0020\u0050\u004D\u0054\u0020\u0066\u006F\u0075\u006E\u0064 +scan.msg6=\u0050\u004D\u0054\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0065\u0072\u0072\u006F\u0072\u0020\u0028\u006C\u0061\u006E\u0067\u0075\u0061\u0067\u0065\u0029 +scan.msg7=\u0076\u0069\u0064\u0065\u006F\u0020\u0064\u0061\u0074\u0061\u002C\u0020\u0062\u0075\u0074\u0020\u006E\u006F\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0061\u0074\u0020\u0061\u0020\u0073\u0068\u006F\u0072\u0074\u0020\u0073\u0063\u0061\u006E +scan.msg8=\u0065\u0072\u0072\u006F\u0072\u0020\u0077\u0068\u0069\u006C\u0065\u0020\u0063\u0068\u0065\u0063\u006B\u0069\u006E\u0067 +scan.msg9=\u0066\u0069\u006C\u0065\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u0077\u0069\u0074\u0068\u0020\u0061\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0021 + +#TS +ts.msg1=\u0021\u003E\u0020\u006E\u006F\u0020\u0049\u0044\u0073\u0020\u0066\u006F\u0075\u006E\u0064\u0021\u0020\u002E\u002E\u0075\u0073\u0065\u0020\u0066\u0069\u0078\u0065\u0064\u0020\u0050\u004D\u0054 + +#WSS +wss.run_in=\u0052\u0075\u006E\u002D\u0049\u006E\u002D\u0043\u006F\u0064\u0065\u0020\u0066\u006F\u0075\u006E\u0064 +wss.no_run_in=\u006E\u006F\u0020\u0052\u0075\u006E\u002D\u0049\u006E\u002D\u0043\u006F\u0064\u0065\u0020\u0066\u006F\u0075\u006E\u0064 +wss.startcode=\u0053\u0074\u0061\u0072\u0074\u002D\u0043\u006F\u0064\u0065\u0020\u0066\u006F\u0075\u006E\u0064 +wss.no_startcode=\u006E\u006F\u0020\u0053\u0074\u0061\u0072\u0074\u002D\u0043\u006F\u0064\u0065\u0020\u0066\u006F\u0075\u006E\u0064 +wss.start=\u0073\u0074\u0061\u0072\u0074 +wss.group_1=\u0047\u0072\u006F\u0075\u0070\u0020\u0031\u0020\u0028\u0050\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0046\u006F\u0072\u006D\u0061\u0074\u0029 +wss.group_2=\u0047\u0072\u006F\u0075\u0070\u0020\u0032\u0020\u0028\u0050\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0045\u006E\u0068\u0061\u006E\u0063\u0065\u006D\u0065\u006E\u0074\u0073\u0029 +wss.group_3=\u0047\u0072\u006F\u0075\u0070\u0020\u0033\u0020\u0028\u0053\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0073\u0029 +wss.group_4=\u0047\u0072\u006F\u0075\u0070\u0020\u0034\u0020\u0028\u006F\u0074\u0068\u0065\u0072\u0073\u0029 +wss.group_1.0001=\u0034\u003A\u0033\u0020\u0066\u0075\u006C\u006C\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u002C\u0020\u0035\u0037\u0036\u0020\u006C\u0069\u006E\u0065\u0073\u002C\u0020\u0066\u0075\u006C\u006C\u0020\u0073\u0063\u0072\u0065\u0065\u006E +wss.group_1.1000=\u0031\u0034\u003A\u0039\u0020\u006C\u0065\u0074\u0074\u0065\u0072\u0062\u006F\u0078\u002C\u0020\u0035\u0030\u0034\u0020\u006C\u0069\u006E\u0065\u0073\u002C\u0020\u0063\u0065\u006E\u0074\u0065\u0072 +wss.group_1.0100=\u0031\u0034\u003A\u0039\u0020\u006C\u0065\u0074\u0074\u0065\u0072\u0062\u006F\u0078\u002C\u0020\u0035\u0030\u0034\u0020\u006C\u0069\u006E\u0065\u0073\u002C\u0020\u0074\u006F\u0070 +wss.group_1.1101=\u0031\u0036\u003A\u0039\u0020\u006C\u0065\u0074\u0074\u0065\u0072\u0062\u006F\u0078\u002C\u0020\u0034\u0033\u0032\u0020\u006C\u0069\u006E\u0065\u0073\u002C\u0020\u0063\u0065\u006E\u0074\u0065\u0072 +wss.group_1.0010=\u0031\u0036\u003A\u0039\u0020\u006C\u0065\u0074\u0074\u0065\u0072\u0062\u006F\u0078\u002C\u0020\u0034\u0033\u0032\u0020\u006C\u0069\u006E\u0065\u0073\u002C\u0020\u0074\u006F\u0070 +wss.group_1.0111=\u0031\u0034\u003A\u0039\u0020\u0066\u0075\u006C\u006C\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u002C\u0020\u0035\u0037\u0036\u0020\u006C\u0069\u006E\u0065\u0073\u002C\u0020\u0063\u0065\u006E\u0074\u0065\u0072\u002C\u0020\u0066\u0075\u006C\u006C\u0020\u0073\u0063\u0072\u0065\u0065\u006E +wss.group_1.1110=\u0031\u0036\u003A\u0039\u0020\u0066\u0075\u006C\u006C\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u002C\u0020\u0035\u0037\u0036\u0020\u006C\u0069\u006E\u0065\u0073\u002C\u0020\u0066\u0075\u006C\u006C\u0020\u0073\u0063\u0072\u0065\u0065\u006E +wss.group_1.error=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0067\u0072\u006F\u0075\u0070\u0020\u0031\u0020\u0028\u0062\u0069\u0074\u0073\u0030\u002E\u002E\u0033\u0029 +wss.group_2.0.01=\u0063\u0061\u006D\u0065\u0072\u0061\u0020\u006D\u006F\u0064\u0065 +wss.group_2.0.10=\u0066\u0069\u006C\u006D\u0020\u006D\u006F\u0064\u0065\u0020 +wss.group_2.0.00=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0034 +wss.group_2.1.01=\u0073\u0074\u0061\u006E\u0064\u0061\u0072\u0064\u0020\u0050\u0041\u004C +wss.group_2.1.10=\u004D\u0041\u0043\u0050\u0020\u0028\u006D\u006F\u0074\u0069\u006F\u006E\u0020\u0061\u0064\u0061\u0070\u0074\u0069\u0076\u0065\u0020\u0063\u006F\u006C\u006F\u0072\u0020\u0070\u006C\u0075\u0073\u0029 +wss.group_2.1.00=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0035 +wss.group_2.2.01=\u006E\u006F\u0020\u0068\u0065\u006C\u0070\u0065\u0072 +wss.group_2.2.10=\u0068\u0065\u006C\u0070\u0065\u0072\u0020\u006D\u006F\u0064\u0075\u006C\u0061\u0074\u0069\u006F\u006E\u0020\u0028\u0050\u0041\u004C\u0070\u006C\u0075\u0073\u0029 +wss.group_2.2.00=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0036 +wss.group_2.3.01=\u0072\u0065\u0073\u0065\u0072\u0076\u0065\u0064\u0020\u0028\u0030\u0029 +wss.group_2.3.10=\u0072\u0065\u0073\u0065\u0072\u0076\u0065\u0064\u0020\u0028\u0031\u0029 +wss.group_2.3.00=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0037 +wss.group_3.0.01=\u006E\u006F\u0020\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0073\u0020\u0069\u006E\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074 +wss.group_3.0.10=\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0073\u0020\u0069\u006E\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074 +wss.group_3.0.00=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0038 +wss.group_3.1.00=\u006E\u006F\u0020\u0027\u006F\u0070\u0065\u006E\u0020\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0073\u0027 +wss.group_3.1.01=\u0027\u006F\u0070\u0065\u006E\u0020\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0073\u0027\u0020\u0069\u006E\u0073\u0069\u0064\u0065\u0020\u0061\u0063\u0074\u0069\u0076\u0065\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065 +wss.group_3.1.10=\u0027\u006F\u0070\u0065\u006E\u0020\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0073\u0027\u0020\u006F\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0061\u0063\u0074\u0069\u0076\u0065\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065 +wss.group_3.1.11=\u0072\u0065\u0073\u0065\u0072\u0076\u0065\u0064\u0020\u0028\u0031\u0031\u0029 +wss.group_3.1.err=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0039\u002E\u002E\u0031\u0030 +wss.group_4.0.01=\u006E\u006F\u0020\u0073\u0075\u0072\u0072\u006F\u0075\u006E\u0064\u0020\u0073\u006F\u0075\u006E\u0064 +wss.group_4.0.10=\u0073\u0075\u0072\u0072\u006F\u0075\u006E\u0064\u0020\u0073\u006F\u0075\u006E\u0064 +wss.group_4.0.00=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0031\u0031 +wss.group_4.1.01=\u006E\u006F\u0020\u0063\u006F\u0070\u0079\u0072\u0069\u0067\u0068\u0074\u002F\u0075\u006E\u006B\u006E\u006F\u0077\u006E +wss.group_4.1.10=\u0063\u006F\u0070\u0079\u0072\u0069\u0067\u0068\u0074\u0020\u0061\u0073\u0073\u0065\u0072\u0074\u0065\u0064 +wss.group_4.1.00=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0031\u0032 +wss.group_4.2.01=\u0063\u006F\u0070\u0079\u0069\u006E\u0067\u0020\u006E\u006F\u0074\u0020\u0072\u0065\u0073\u0074\u0072\u0069\u0063\u0074\u0065\u0064 +wss.group_4.2.10=\u0063\u006F\u0070\u0079\u0069\u006E\u0067\u0020\u0072\u0065\u0073\u0074\u0072\u0069\u0063\u0074\u0065\u0064 +wss.group_4.2.00=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0031\u0033 +wss.group_4.1.err=\u0065\u0072\u0072\u006F\u0072\u0020\u0070\u0061\u0072\u0073\u0069\u006E\u0067\u0020\u0062\u0069\u0074\u0031\u0032\u002E\u002E\u0031\u0033 + +#Subpicture +subpicture.title=\u0053\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0020\u0050\u0072\u0065\u0056\u0069\u0065\u0077\u0065\u0072 +subpicture.in_time=\u0069\u006E +subpicture.duration=\u0064\u0075\u0072\u0061\u0074\u0069\u006F\u006E +subpicture.msg1=\u0021\u003E\u0020\u0073\u0075\u0062\u0070\u0069\u0063\u0020\u0077\u0072\u0069\u0074\u0065\u0020\u0065\u0072\u0072\u006F\u0072 +subpicture.msg2=\u0021\u003E\u0020\u0073\u0069\u006D\u0070\u006C\u0065\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0070\u0061\u0063\u006B\u0065\u0074 +subpicture.msg3=\u0021\u003E\u0020\u0073\u0075\u0070\u0070\u0069\u0063\u0020\u0075\u006E\u006B\u006E\u006F\u0077\u006E\u0020\u0063\u006D\u0064 + +#RawRead +rawread.msg1=\u0064\u0069\u0073\u0061\u0062\u006C\u0065\u0064\u0020\u006F\u0072\u0020\u006C\u0069\u0062\u0072\u0061\u0072\u0079\u0020\u006E\u006F\u0074\u0020\u0066\u006F\u0075\u006E\u0064 + +#Common +common.rename_error1=\u0021\u003E\u0020\u0063\u0061\u006E\u006E\u006F\u0074\u0020\u0072\u0065\u006E\u0061\u006D\u0065 +common.rename_error2=\u0074\u006F + +#TabPanel +TabPanel.LogwindowPanel=\u006C\u006F\u0067\u0077\u0069\u006E\u0064\u006F\u0077 +TabPanel.FileinfoPanel=\u0069\u006E\u0066\u006F +TabPanel.MessagePanel=\u006D\u0073\u0067 +TabPanel.ExportPanel=\u006F\u0075\u0074\u0070\u0075\u0074 +TabPanel.SpecialPanel=\u0073\u0070\u0065\u0063\u0069\u0061\u006C +TabPanel.VideoPanel=\u0076\u0069\u0064\u0065\u006F +TabPanel.AudioPanel=\u0061\u0075\u0064\u0069\u006F +TabPanel.SubtitlePanel=\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065 +TabPanel.ExternPanel=\u0065\u0078\u0074\u0065\u0072\u006E +TabPanel.OptionPanel=\u006F\u0070\u0074\u0069\u006F\u006E\u0073 +TabPanel.FtpPanel=\u0066\u0074\u0070 +TabPanel.PostCommandsPanel=\u0070\u006F\u0073\u0074\u0070\u0072\u006F\u0063\u0065\u0073\u0073 + +#Tab.logwindow +LogwindowPanel.showTtxHeader=\u0054\u0054\u0058 +LogwindowPanel.showTtxHeader.Tip=\u0073\u0068\u006F\u0077\u0073\u0020\u0074\u0074\u0078\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u006C\u0069\u006E\u0065\u0020\u0061\u006E\u0064\u0020\u0056\u0050\u0053\u0020\u0073\u0074\u0061\u0074\u0075\u0073\u0020\u0028\u0064\u0065\u0063\u0072\u0065\u0061\u0073\u0065\u0073\u0020\u0073\u0070\u0065\u0065\u0064\u002C\u0020\u0069\u0066\u0020\u0065\u006E\u0061\u0062\u006C\u0065\u0064\u0029 +LogwindowPanel.showTtxHeader.Tip1=\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u006C\u0069\u006E\u0065\u0020\u006F\u0066\u0020\u0061\u0063\u0074\u0075\u0061\u006C\u0020\u0074\u0072\u0061\u006E\u0073\u006D\u0069\u0074\u0074\u0065\u0064\u0020\u0070\u0061\u0067\u0065\u0020\u0028\u0072\u006F\u0077\u0020\u0030\u0029 +LogwindowPanel.showVpsLabel.Tip=\u0073\u0068\u006F\u0072\u0074\u0020\u0056\u0050\u0053\u0020\u0073\u0074\u0061\u0074\u0075\u0073\u0020\u0028\u0056\u0042\u0049\u002D\u006C\u0069\u006E\u0065\u0020\u0031\u0036\u0029\u002C\u0020\u0061\u0020\u0066\u0065\u0077\u0020\u0073\u0074\u0061\u0074\u0069\u006F\u006E\u0073\u0020\u0068\u0061\u0076\u0065\u0020\u006D\u0065\u0061\u006E\u0069\u006E\u0067\u0066\u0075\u006C\u0020\u0056\u0050\u0053\u0020\u0064\u0061\u0074\u0061\u0020\u0076\u0069\u0061\u0020\u0044\u0056\u0042\u002D\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074 + +#Tab.options +OptionPanel.Various.Title=\u0076\u0061\u0072\u0069\u006F\u0075\u0073 +OptionPanel.LookAndFeel=\u0069\u006E\u0073\u0074\u0061\u006C\u006C\u0065\u0064\u0020\u006C\u006F\u006F\u006B\u0020\u0026\u0020\u0066\u0065\u0065\u006C\u0073\u003A +OptionPanel.LookAndFeel.Info1=\u0063\u0068\u006F\u006F\u0073\u0065\u0020\u0079\u006F\u0075\u0072\u0020\u0070\u0072\u0065\u0066\u0065\u0072\u0072\u0065\u0064\u0020\u006C\u006F\u006F\u006B\u0020\u0026\u0020\u0066\u0065\u0065\u006C +OptionPanel.LookAndFeel.Info2=\u0073\u006F\u006D\u0065\u0074\u0069\u006D\u0065\u0073\u0020\u0061\u0020\u006C\u0026\u0066\u0020\u0063\u0072\u0061\u0073\u0068\u0065\u0073\u0020\u0069\u006E\u0074\u0065\u0072\u006E\u0061\u006C\u006C\u0079 +OptionPanel.DebugLog=\u0073\u0061\u0076\u0065\u0020\u0062\u0069\u0067\u0020\u006C\u006F\u0067\u0020\u0066\u0069\u006C\u0065 +OptionPanel.DebugLog.Tip=\u0072\u0065\u0064\u0075\u0063\u0065\u0073\u0020\u0073\u0070\u0065\u0065\u0064\u002C\u0020\u006F\u006E\u006C\u0079\u0020\u0066\u006F\u0072\u0020\u0074\u0065\u0073\u0074\u0020\u0070\u0075\u0072\u0070\u006F\u0073\u0065\u0073 +OptionPanel.NormalLog=\u0073\u0061\u0076\u0065\u0020\u006E\u006F\u0072\u006D\u0061\u006C\u0020\u006C\u006F\u0067\u0020\u0066\u0069\u006C\u0065 +OptionPanel.NormalLog.Tip=\u0077\u0072\u0069\u0074\u0065\u0073\u0020\u0074\u0068\u0065\u0020\u006C\u006F\u0067\u0077\u0069\u006E\u0064\u006F\u0077\u0020\u0063\u006F\u006E\u0074\u0065\u006E\u0074\u0020\u0074\u006F\u0020\u0066\u0069\u006C\u0065 +OptionPanel.dumpDroppedGop=\u0064\u0075\u006D\u0070\u0020\u0064\u0072\u006F\u0070\u0070\u0065\u0064\u0020\u0047\u004F\u0050\u0073\u0020\u0074\u006F\u0020\u0073\u0065\u0070\u0061\u0072\u0061\u0074\u0065\u0020\u0066\u0069\u006C\u0065\u0073 +OptionPanel.dumpDroppedGop.Tip=\u006F\u006E\u006C\u0079\u0020\u006D\u0065\u0061\u006E\u0074\u0020\u0066\u006F\u0072\u0020\u006C\u0061\u0074\u0065\u0072\u0020\u0065\u0072\u0072\u006F\u0072\u0020\u0061\u006E\u0061\u006C\u0079\u0073\u0069\u0073 +OptionPanel.StartPath=\u0073\u0074\u0061\u0072\u0074\u0069\u006E\u0067\u0020\u0070\u0061\u0074\u0068\u0020\u0066\u006F\u0072\u0020\u0066\u0069\u006C\u0065\u0020\u0073\u0065\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u003A +OptionPanel.StartPath.Value.Tip=\u006C\u0065\u0061\u0076\u0065\u0020\u0065\u006D\u0070\u0074\u0079\u002C\u0020\u006F\u0072\u0020\u0074\u0079\u0070\u0065\u0020\u0069\u006E\u0020\u0061\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u0070\u0061\u0074\u0068\u002C\u0020\u0061\u0020\u006C\u0065\u0061\u0064\u0069\u006E\u0067\u0020\u0027\u003F\u0027\u0020\u0065\u0076\u0065\u0072\u0020\u0072\u0065\u0073\u0065\u0074\u0073\u0020\u0074\u006F\u0020\u0074\u0068\u0069\u0073\u0020\u0070\u0061\u0074\u0068\u0020\u0062\u0065\u0066\u006F\u0072\u0065 +OptionPanel.Buffer.Title=\u0042\u0075\u0066\u0066\u0065\u0072 +OptionPanel.MainBuffer=\u006D\u0061\u0069\u006E\u0020\u0049\u002F\u004F\u002D\u0042\u0075\u0066\u0066\u0065\u0072\u0073\u0069\u007A\u0065\u0020\u0069\u006E\u0020\u0062\u0079\u0074\u0065\u0073 +OptionPanel.MainBuffer.Tip=\u006C\u006F\u0077\u0065\u0072\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u006D\u0061\u0079\u0020\u0070\u0072\u0065\u0076\u0065\u006E\u0074\u0020\u0069\u006E\u0074\u0065\u0072\u006E\u0061\u006C\u0020\u006D\u0065\u006D\u006F\u0072\u0079\u0020\u006F\u0076\u0065\u0072\u0066\u006C\u006F\u0077\u0073\u0020\u002D\u003E\u0020\u004F\u0075\u0074\u004F\u0066\u004D\u0065\u006D\u006F\u0072\u0079\u0020\u0065\u0072\u0072\u006F\u0072 +OptionPanel.PesPreBuffer=\u0049\u002D\u0042\u0075\u0066\u0066\u0065\u0072\u0073\u0069\u007A\u0065\u0020\u0069\u006E\u0020\u0062\u0079\u0074\u0065\u0073\u0020\u0028\u006F\u006E\u006C\u0079\u0020\u0050\u0045\u0053\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0073\u0069\u007A\u0065\u003D\u0030\u0020\u0021\u0029 +OptionPanel.PesPreBuffer.Tip=\u0074\u0072\u0079\u0020\u006C\u006F\u0077\u0065\u0072\u002F\u0068\u0069\u0067\u0068\u0065\u0072\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u0069\u0066\u0020\u0079\u006F\u0075\u0020\u0077\u006F\u0072\u006B\u0020\u0077\u0069\u0074\u0068\u0020\u0068\u0069\u0067\u0068\u0020\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0020\u0076\u0069\u0064\u0065\u006F\u0073\u0074\u0072\u0065\u0061\u006D\u0073 +OptionPanel.ScanBuffer=\u0070\u0072\u0065\u002D\u0053\u0063\u0061\u006E\u0020\u0042\u0075\u0066\u0066\u0065\u0072\u0073\u0069\u007A\u0065\u0020\u0069\u006E\u0020\u0062\u0079\u0074\u0065\u0073 +OptionPanel.ScanBuffer.Tip=\u0074\u0072\u0079\u0020\u006C\u006F\u0077\u0065\u0072\u002F\u0068\u0069\u0067\u0068\u0065\u0072\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u0069\u0066\u0020\u006B\u006E\u006F\u0077\u006E\u0020\u0066\u0069\u006C\u0065\u0074\u0079\u0070\u0065\u0073\u0020\u0061\u0072\u0065\u0020\u006E\u006F\u0074\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0065\u0064 +OptionPanel.PreviewBuffer=\u0050\u0072\u0065\u0076\u0069\u0065\u0077\u0020\u0042\u0075\u0066\u0066\u0065\u0072\u0073\u0069\u007A\u0065\u0020\u0069\u006E\u0020\u0062\u0079\u0074\u0065\u0073 +OptionPanel.PreviewBuffer.Tip=\u006C\u006F\u0077\u0065\u0072\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u0073\u0070\u0065\u0065\u0064\u0020\u0075\u0070\u0020\u0074\u0068\u0065\u0020\u0070\u0072\u0065\u0076\u0069\u0065\u0077\u002C\u0020\u0077\u0069\u0074\u0068\u0020\u0070\u006F\u0073\u0073\u0069\u0062\u006C\u0065\u0020\u006C\u006F\u0073\u0073\u0020\u006F\u0066\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0064\u0061\u0074\u0061 +OptionPanel.callGc=\u0067\u0061\u0072\u0062\u0061\u0067\u0065\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u006F\u0072 +OptionPanel.callGc.Tip=\u0063\u0061\u006C\u006C\u0073\u0020\u0074\u0068\u0065\u0020\u0067\u0061\u0072\u0062\u0061\u0067\u0065\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u006F\u0072 +OptionPanel.closeOnEnd=\u0063\u006C\u006F\u0073\u0065\u0020\u0070\u0072\u006F\u0067\u0072\u0061\u006D\u0020\u0077\u0068\u0065\u006E\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0020\u0069\u0073\u0020\u0066\u0069\u006E\u0069\u0073\u0068\u0065\u0064 +OptionPanel.closeOnEnd.Tip=\u0063\u006C\u006F\u0073\u0065\u0020\u0070\u0072\u006F\u0067\u0072\u0061\u006D\u0020\u0077\u0068\u0065\u006E\u0020\u0066\u0069\u006E\u0069\u0073\u0068\u0065\u0064 +OptionPanel.holdStreamInfoOnOSD=\u0068\u006F\u006C\u0064\u0020\u0053\u0074\u0072\u0065\u0061\u006D\u0049\u006E\u0066\u006F\u0020\u006F\u006E\u0020\u004F\u0053\u0044 +OptionPanel.holdStreamInfoOnOSD.Tip=\u0068\u006F\u006C\u0064\u0020\u0053\u0074\u0072\u0065\u0061\u006D\u0049\u006E\u0066\u006F\u0020\u006F\u006E\u0020\u004F\u0053\u0044 + +#ScanInfo +ScanInfo.Location=\u004C\u006F\u0063\u0061\u0074\u0069\u006F\u006E\u003A +ScanInfo.Name=\u004E\u0061\u006D\u0065\u003A +ScanInfo.Size=\u0053\u0069\u007A\u0065\u003A +ScanInfo.Bytes=\u0062\u0079\u0074\u0065\u0073 +ScanInfo.Type=\u0054\u0079\u0070\u0065\u003A +ScanInfo.Date=\u0044\u0061\u0074\u0065\u003A +ScanInfo.Video=\u0056\u0069\u0064\u0065\u006F\u003A +ScanInfo.Audio=\u0041\u0075\u0064\u0069\u006F\u003A +ScanInfo.Teletext=\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u003A +ScanInfo.Subpicture=\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u002E\u003A +ScanInfo.Playtime=\u0065\u0073\u0074\u002E\u0020\u0050\u006C\u0061\u0079\u0074\u0069\u006D\u0065\u003A +ScanInfo.NotFound=\u0046\u0069\u006C\u0065\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u0065\u0078\u0069\u0073\u0074\u0073\u0021 + +#Execute +PostCommands.Title=\u0065\u0078\u0074\u0065\u0072\u006E\u0061\u006C\u0020\u0070\u0072\u006F\u0067\u0072\u0061\u006D\u0073 +PostCommands.PostProcessing=\u0070\u006F\u0073\u0074\u0020\u0063\u006F\u006D\u006D\u0061\u006E\u0064\u0073\u003A\u0020 +PostCommands.PostProcessing.Tip=\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0020\u0074\u0068\u0069\u0073\u0020\u0063\u006F\u006D\u006D\u0061\u006E\u0064\u0020\u0061\u0066\u0074\u0065\u0072\u0020\u0061\u0020\u0063\u006F\u006C\u006C\u002E\u002F\u0073\u0070\u006C\u0069\u0074\u0020\u0070\u0061\u0072\u0074\u0020\u0068\u0061\u0073\u0020\u0062\u0065\u0065\u006E\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0065\u0064 +PostCommands.Execute=\u0065\u0078\u0065\u0063 +PostCommands.Close=\u0063\u006C\u006F\u0073\u0065 +PostCommands.Error=\u0021\u003E\u0020\u0065\u0078\u0065\u0063\u0075\u0074\u0069\u006F\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u003A + +#Collection +CollectionPanel.Title=\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0073 +CollectionPanel.Title2=\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0073\u0020\u0066\u006F\u0072\u0020\u0063\u006F\u006C\u006C\u002E\u0023 +collection.title.processing=\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0069\u006E\u0067\u0020\u0070\u0072\u0065\u0076\u0069\u0065\u0077\u002E\u002E\u002E +CollectionPanel.CutPanel=\u0050\u0072\u0065\u0076\u0069\u0065\u0077\u0020\u002F\u0020\u0056\u0069\u0064\u0065\u006F\u0066\u0069\u006C\u0065\u0020\u0063\u0075\u0074\u0073 +CollectionPanel.CutPanel.Tip1=\u0075\u0073\u0065\u0020\u0061\u006C\u0073\u006F\u0020\u0074\u0068\u0065\u0020\u006B\u0065\u0079\u0062\u006F\u0061\u0072\u0064\u0020\u006B\u0065\u0079\u0073\u0020\u0066\u006F\u0072\u0020\u006E\u0061\u0076\u0069\u0067\u0061\u0074\u0069\u006F\u006E\u002C\u0020\u0070\u0072\u0065\u0076\u0069\u0065\u0077\u0020\u006F\u006E\u006C\u0079\u0020\u0077\u006F\u0072\u006B\u0073\u0020\u0077\u0069\u0074\u0068\u0020\u0062\u0079\u0074\u0065\u0070\u006F\u0073\u002E\u0020\u0063\u0075\u0074 +CollectionPanel.CutPanel.Tip2=\u0061\u0063\u0074\u0069\u0076\u0065\u0020\u0073\u0065\u0067\u006D\u0065\u006E\u0074\u002F\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u006F\u0066\u0020\u0073\u0065\u0067\u006D\u0065\u006E\u0074\u0073\u0020\u0020\u0066\u0069\u006C\u0065\u006E\u0061\u006D\u0065\u0020\u006F\u0066\u0020\u0061\u0063\u0074\u0069\u0076\u0065\u0020\u0073\u0065\u0067\u006D\u0065\u006E\u0074 +CollectionPanel.CutPanel.Tip3=\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0065\u0064\u0020\u0028\u0050\u0029\u0049\u0044\u0020\u0074\u006F\u0020\u0067\u0065\u0074\u0020\u0074\u0068\u0065\u0020\u0063\u0075\u0072\u0072\u0065\u006E\u0074\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065 +CollectionPanel.CutPanel.Tip4=\u006B\u0065\u0079\u0020\u0069\u006E\u0020\u0061\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u002C\u0020\u006F\u0072\u0020\u0064\u0072\u0061\u0067\u0026\u0064\u0072\u006F\u0070\u0020\u0061\u0020\u0063\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0020\u0066\u0069\u006C\u0065\u0020\u006F\u0076\u0065\u0072\u0020\u0068\u0065\u0072\u0065 +CollectionPanel.addPoint=\u0061\u0064\u0064\u0020\u0070\u006F\u0069\u006E\u0074 +CollectionPanel.removePoint=\u0064\u0065\u006C\u0020\u0070\u006F\u0069\u006E\u0074 +CollectionPanel.NumberOfPoints=\u004E\u0075\u006D\u0062\u0065\u0072\u0020\u006F\u0066\u0020\u0050\u006F\u0069\u006E\u0074\u0073\u003A\u0020 +CollectionPanel.NumberOfPoints.Tip=\u0061\u006C\u006C\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u0073\u0020\u0061\u0072\u0065\u0020\u0061\u0075\u0074\u006F\u006D\u0061\u0074\u0069\u0063\u0061\u006C\u006C\u0079\u0020\u0073\u006F\u0072\u0074\u0065\u0064 +CollectionPanel.NumberOfChapters=\u0043\u0068\u0061\u0070\u0074\u0065\u0072\u0073\u003A\u0020 +CollectionPanel.NumberOfChapters.Tip=\u0061\u006C\u006C\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u0073\u0020\u0061\u0072\u0065\u0020\u0061\u0075\u0074\u006F\u006D\u0061\u0074\u0069\u0063\u0061\u006C\u006C\u0079\u0020\u0073\u006F\u0072\u0074\u0065\u0064 +CollectionPanel.expectedSize=\u0065\u0078\u0070\u002E\u0053\u0069\u007A\u0065\u0020\u003A\u0020 +CollectionPanel.Preview.offline=\u0070\u0072\u0065\u0076\u0069\u0065\u0077\u0020\u006E\u006F\u0074\u0020\u0061\u0076\u0061\u0069\u006C\u0061\u0062\u006C\u0065 +CollectionPanel.Preview.processedPid=\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0069\u006E\u0067\u0020\u0056\u0069\u0064\u0065\u006F\u0020\u0028\u0050\u0029\u0049\u0044\u0020\u0030\u0078 +CollectionPanel.Various=\u0056\u0061\u0072\u0069\u006F\u0075\u0073 +CollectionPanel.Preview.fastDecode=\u0066\u0061\u0073\u0074\u0065\u0072\u002F\u0077\u006F\u0072\u0073\u0065\u0020\u0064\u0065\u0063\u006F\u0064\u0069\u006E\u0067\u0020\u006F\u0066\u0020\u0070\u0072\u0065\u0076\u0069\u0065\u0077 +CollectionPanel.Preview.fastDecode.Tip=\u0072\u0065\u0063\u006F\u006E\u0073\u0074\u0072\u0075\u0063\u0074\u0020\u0061\u006E\u0064\u0020\u0069\u006E\u0074\u0065\u0072\u0070\u006F\u006C\u0061\u0074\u0065\u0020\u006F\u006E\u006C\u0079\u0020\u0074\u0068\u0065\u0020\u0075\u0070\u0070\u0065\u0072\u002F\u006C\u0065\u0066\u0074\u0020\u0070\u0069\u0078\u0065\u006C\u0020\u006F\u0066\u0020\u0065\u0061\u0063\u0068\u0020\u006D\u0061\u0063\u0072\u006F\u0062\u006C\u006F\u0063\u006B +CollectionPanel.Preview.LiveUpdate=\u006C\u0069\u0076\u0065\u0020\u0075\u0070\u0064\u0061\u0074\u0065\u0020\u0077\u0068\u0069\u006C\u0065\u0020\u0073\u0063\u0072\u006F\u006C\u006C\u0069\u006E\u0067 +CollectionPanel.Preview.LiveUpdate.Tip=\u006E\u006F\u0074\u0020\u0072\u0065\u0063\u006F\u006D\u006D\u0065\u006E\u0064\u0065\u0064\u0020\u006F\u006E\u0020\u0073\u006C\u006F\u0077\u0020\u0073\u0079\u0073\u0074\u0065\u006D\u0073\u0020\u006F\u0072\u0020\u0066\u0069\u006C\u0065\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u002C\u0020\u0072\u0065\u0066\u0065\u0072\u0073\u0020\u0074\u006F\u0020\u0070\u0072\u0065\u0076\u0069\u0065\u0077\u0020\u0062\u0075\u0066\u0066\u0065\u0072 +CollectionPanel.Preview.AllGops=\u0061\u006C\u0073\u006F\u0020\u0070\u0072\u0065\u0076\u0069\u0065\u0077\u0020\u0047\u004F\u0050\u0073\u0020\u0077\u002F\u006F\u0020\u0073\u0065\u0071\u0075\u002E\u0068\u0065\u0061\u0064\u0065\u0072 +CollectionPanel.Preview.AllGops.Tip=\u0066\u006F\u0072\u0020\u0044\u0056\u0042\u0020\u0064\u0061\u0074\u0061\u0020\u0069\u0074\u0027\u0073\u0020\u006E\u006F\u0074\u0020\u0072\u0065\u0063\u006F\u006D\u006D\u0065\u006E\u0064\u0065\u0064\u002C\u0020\u0065\u006E\u0061\u0062\u006C\u0065\u0020\u006F\u006E\u006C\u0079\u0020\u0066\u006F\u0072\u0020\u0073\u006F\u006D\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0073\u0020\u0077\u0069\u0074\u0068\u0020\u006F\u006E\u006C\u0079\u0020\u006F\u006E\u0065\u0020\u0073\u0065\u0071\u0075\u002E\u0068\u0065\u0061\u0064\u0065\u0072\u0021 +CollectionPanel.PidList=\u0050\u0045\u0053\u0028\u0026\u0053\u0075\u0062\u0029\u002D\u0049\u0044\u002F\u0050\u0049\u0044\u0020\u006C\u0069\u0073\u0074\u003A\u0020 +CollectionPanel.PidList.Tip1=\u0065\u006E\u0074\u0065\u0072\u0020\u0050\u0045\u0053\u002D\u0049\u0044\u0020\u006F\u0072\u0020\u0073\u0075\u0062\u002D\u0049\u0044\u0020\u0028\u004D\u0050\u0047\u0020\u0065\u0074\u0063\u0029\u0020\u006F\u0072\u0020\u0050\u0049\u0044\u0020\u0028\u0050\u0056\u0041\u002C\u0054\u0053\u0029\u003B\u0020\u0065\u006D\u0070\u0074\u0079\u0020\u006C\u0069\u0073\u0074\u0020\u003D\u003D\u0020\u0075\u0073\u0065\u0020\u0061\u006C\u006C\u0020\u0049\u0044\u0073 +CollectionPanel.PidList.Tip2=\u0064\u006F\u0075\u0062\u006C\u0065\u0063\u006C\u0069\u0063\u006B\u0020\u0074\u006F\u0020\u0072\u0065\u006D\u006F\u0076\u0065\u0020\u0061\u0020\u0073\u0065\u006C\u0065\u0063\u0074\u0065\u0064\u0020\u0065\u006E\u0074\u0072\u0079 +CollectionPanel.transferPids1=\u0074\u0072\u0061\u006E\u0073\u0066\u0065\u0072\u0020\u0073\u0065\u006C\u0065\u0063\u0074\u0065\u0064\u0020\u0028\u0050\u0029\u0049\u0044\u0073\u0020\u0074\u006F\u0020\u006E\u0065\u0077\u0020\u0063\u006F\u006C\u006C\u0023 +CollectionPanel.transferPids1.Tip=\u0063\u0068\u0061\u006E\u0067\u0065\u0073\u0020\u0069\u006E\u0020\u0074\u0068\u0065\u0020\u0061\u0063\u0074\u0069\u0076\u0065\u0020\u0063\u006F\u006C\u006C\u0023\u0020\u0079\u006F\u0075\u0020\u006D\u0075\u0073\u0074\u0020\u0061\u0070\u0070\u006C\u0079 +CollectionPanel.transferPids2=\u0074\u0072\u0061\u006E\u0073\u0066\u0065\u0072\u0020\u0063\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0020\u0070\u0061\u0069\u0072\u0073\u0020\u0074\u006F\u0020\u006E\u0065\u0077\u0020\u0063\u006F\u006C\u006C\u0023 +CollectionPanel.transferPids2.Tip=\u0063\u0068\u0061\u006E\u0067\u0065\u0073\u0020\u0069\u006E\u0020\u0074\u0068\u0065\u0020\u0061\u0063\u0074\u0069\u0076\u0065\u0020\u0063\u006F\u006C\u006C\u0023\u0020\u0079\u006F\u0075\u0020\u006D\u0075\u0073\u0074\u0020\u0061\u0070\u0070\u006C\u0079 +CollectionPanel.ExportLimits=\u0061\u0064\u0064\u0069\u0074\u0069\u006F\u006E\u0061\u006C\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0020\u006C\u0069\u006D\u0069\u0074\u0073\u003A +CollectionPanel.OptionHorizontalResolution=\u0048\u002D\u0052\u0065\u0073\u006F\u006C\u002E\u003A\u0020 +CollectionPanel.OptionHorizontalResolution.Tip=\u0067\u006C\u006F\u0062\u0061\u006C\u002C\u002E\u002E\u0074\u0068\u0061\u0074\u0020\u0077\u0069\u006C\u006C\u0020\u0061\u0075\u0074\u006F\u006D\u0061\u0074\u0069\u0063\u0061\u006C\u006C\u0079\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0020\u0061\u006E\u0079\u0020\u006F\u0074\u0068\u0065\u0072\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0073 +CollectionPanel.OptionDAR=\u0044\u0041\u0052\u003A\u0020 +CollectionPanel.OptionDAR.Tip=\u0067\u006C\u006F\u0062\u0061\u006C\u002C\u002E\u002E\u0074\u0068\u0061\u0074\u0020\u0077\u0069\u006C\u006C\u0020\u0061\u0075\u0074\u006F\u006D\u0061\u0074\u0069\u0063\u0061\u006C\u006C\u0079\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0020\u0061\u006E\u0079\u0020\u006F\u0074\u0068\u0065\u0072\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0073 +CollectionPanel.loadCutpointList=\u006C\u006F\u0061\u0064\u0020\u0043\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0073\u0020\u0066\u0072\u006F\u006D\u0020\u0066\u0069\u006C\u0065 +CollectionPanel.loadCutpointList.Tip=\u006F\u0070\u0065\u006E\u0020\u0061\u0020\u0063\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0020\u0066\u0069\u006C\u0065\u0020\u006F\u0072\u0020\u0064\u0072\u0061\u0067\u0020\u0026\u0020\u0064\u0072\u006F\u0070\u0020\u0069\u0074\u0020\u006F\u0076\u0065\u0072\u0020\u0068\u0065\u0072\u0065 +CollectionPanel.saveCutpointList=\u0073\u0061\u0076\u0065\u0020\u0043\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0073\u0020\u0074\u006F\u0020\u0066\u0069\u006C\u0065 + +CollectionPanel.ApplyAndClose=\u0061\u0070\u0070\u006C\u0079\u0020\u0026\u0020\u0063\u006C\u006F\u0073\u0065 +CollectionPanel.Apply=\u0061\u0070\u0070\u006C\u0079 +CollectionPanel.CutMode.Bytepos=\u0028\u0030\u0029\u0020\u0075\u0073\u0065\u0020\u0042\u0079\u0074\u0065\u0050\u006F\u0073\u002E\u0020\u0066\u006F\u0072\u0020\u0063\u0075\u0074\u0073 +CollectionPanel.CutMode.Gop=\u0028\u0031\u0029\u0020\u0075\u0073\u0065\u0020\u0047\u004F\u0050\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u0066\u006F\u0072\u0020\u0063\u0075\u0074\u0073 +CollectionPanel.CutMode.Frame=\u0028\u0032\u0029\u0020\u0075\u0073\u0065\u0020\u0046\u0072\u0061\u006D\u0065\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u0066\u006F\u0072\u0020\u0063\u0075\u0074\u0073 +CollectionPanel.CutMode.Pts=\u0028\u0033\u0029\u0020\u0075\u0073\u0065\u0020\u0050\u0054\u0053\u0020\u0066\u006F\u0072\u0020\u0063\u0075\u0074\u0073 +CollectionPanel.CutMode.Timecode=\u0028\u0034\u0029\u0020\u0075\u0073\u0065\u0020\u0054\u0069\u006D\u0065\u0063\u006F\u0064\u0065\u0020\u0066\u006F\u0072\u0020\u0063\u0075\u0074\u0073 +CollectionPanel.Preview.Error=\u0070\u0072\u0065\u0076\u0069\u0065\u0077\u0020\u0065\u0072\u0072\u006F\u0072\u003A +CollectionPanel.FileAccessError=\u002E\u002E\u0020\u0063\u0061\u006E\u006E\u006F\u0074\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u0020\u0066\u0069\u006C\u0065 +CollectionPanel.Title.Error=\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0073\u0020\u0066\u006F\u0072\u0020\u0063\u006F\u006C\u006C\u002E\u0023\u0020\u007B\u0030\u007D\u0020\u0020\u002D\u003E\u0020\u0045\u0052\u0052\u004F\u0052\u0021\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u0065\u0078\u0069\u0073\u0074\u0073 +CollectionPanel.loadCutpointList.Error=\u0065\u0072\u0072\u006F\u0072\u0020\u006C\u006F\u0061\u0064\u0069\u006E\u0067 + +#makeVDR +StreamConverter.IOError=\u0021\u003E\u0020\u006D\u0061\u006B\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0049\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u003A +StreamConverter.PayloadError=\u0021\u003E\u0020\u0069\u006E\u0063\u006F\u006D\u0069\u006E\u0067\u0020\u0050\u0045\u0053\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0077\u0069\u0074\u0068\u006F\u0075\u0074\u0020\u0070\u0061\u0079\u006C\u006F\u0061\u0064\u0020\u006F\u0072\u0020\u0077\u0072\u006F\u006E\u0067\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0064\u0061\u0074\u0061 +StreamConverter.Summary=\u0053\u0074\u0072\u0065\u0061\u006D\u003A + +#patch +PatchPanel.Title=\u0065\u0064\u0069\u0074\u0020\u0062\u0061\u0073\u0069\u0063\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0069\u006E\u0066\u006F\u0073\u0020\u0069\u006E\u0020\u0031\u0073\u0074\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0020\u0068\u0065\u0061\u0064\u0065\u0072 +PatchPanel.Error=\u0070\u0061\u0074\u0063\u0068\u0020\u0065\u0072\u0072\u006F\u0072 +PatchPanel.Error2=\u0070\u0061\u0074\u0063\u0068\u0020\u0065\u0072\u0072\u006F\u0072\u0020\u0032 +PatchPanel.Change=\u0063\u0068\u0061\u006E\u0067\u0065 +PatchPanel.Cancel=\u0063\u0061\u006E\u0063\u0065\u006C + +#CutListener +cutlistener.wrongnumber=\u002D\u003E\u0020\u0077\u0072\u006F\u006E\u0067\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u0061\u0073\u0020\u0049\u0044 + +#GoListener +golistener.msg.cancelled=\u002D\u002D\u002D\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0020\u0063\u0061\u006E\u0063\u0065\u006C\u006C\u0065\u0064\u0020\u002D\u002D\u002D\u002D +golistener.msg.paused=\u002D\u002D\u002D\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0020\u0070\u0061\u0075\u0073\u0065\u0064\u0020\u002D\u002D\u002D\u002D +golistener.msg.resumed=\u002D\u002D\u002D\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0020\u0072\u0065\u0073\u0075\u006D\u0065\u0064\u0020\u002D\u002D\u002D\u002D +golistener.msg.extracting=\u0065\u0078\u0074\u0072\u0061\u0063\u0074\u0069\u006E\u0067\u0020\u0072\u0061\u0077\u0028\u0050\u0045\u0053\u0029\u0020\u0064\u0061\u0074\u0061\u0020\u006F\u0066\u0020\u0049\u0044\u0020\u0030\u0078 + +#AC3 +ac3.msg.loading.start=\u006C\u006F\u0061\u0064\u0069\u006E\u0067\u0020\u0041\u0043\u0033\u0020\u0066\u0072\u0061\u006D\u0065\u0073\u003A +ac3.msg.loading.error=\u0065\u0072\u0072\u006F\u0072\u0020\u006C\u006F\u0061\u0064\u0069\u006E\u0067\u0020\u0061\u0063\u0033\u002E\u0062\u0069\u006E +ac3.msg.frames=\u0061\u0063\u0033\u002E\u0062\u0069\u006E\u0020\u0063\u006F\u006E\u0074\u0061\u0069\u006E\u0073\u0020\u007B\u0030\u007D\u0020\u0041\u0043\u0033\u0020\u0066\u0072\u0061\u006D\u0065\u0073 + +#Run +run.prepare.colls=\u0070\u0072\u0065\u0070\u0061\u0072\u0069\u006E\u0067\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0028\u0073\u0029\u002E\u002E\u002E +run.av.offset=\u0041\u002F\u0056\u0020\u006F\u0066\u0066\u0073\u0065\u0074 +run.session.infos=\u003C\u003C\u003C\u0020\u0073\u0065\u0073\u0073\u0069\u006F\u006E\u0020\u0069\u006E\u0066\u006F\u0073\u0020\u003E\u003E\u003E +run.working.coll=\u002D\u003E\u0020\u0077\u006F\u0072\u006B\u0069\u006E\u0067\u0020\u0077\u0069\u0074\u0068\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E +run.split.output=\u002D\u003E\u0020\u0073\u0070\u006C\u0069\u0074\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0040\u0020\u0061\u0070\u0070\u0072\u002E +run.add.time.offset=\u002D\u003E\u0020\u0061\u0064\u0064\u0020\u0074\u0069\u006D\u0065\u0020\u006F\u0066\u0066\u0073\u0065\u0074\u0020\u0074\u006F\u0020\u0061\u0075\u0064\u0069\u006F\u002F\u0074\u0074\u0078\u002F\u0070\u0069\u0063\u0073\u0020\u003A\u0020\u0020\u007B\u0030\u007D\u0020\u006D\u0073\u0020\u0028\u0069\u0066\u0020\u0069\u0074\u0020\u0066\u006F\u006C\u006C\u006F\u0077\u0073\u0020\u006F\u006E\u0020\u0061\u0020\u0076\u0069\u0064\u0065\u006F\u0029 +run.stream.type.disabled=\u002D\u003E\u0020\u0050\u0045\u0053\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0074\u0079\u0070\u0065\u0020\u0064\u0069\u0073\u0061\u0062\u006C\u0065\u0064\u003A +run.write.output.to=\u002D\u003E\u0020\u0077\u0072\u0069\u0074\u0065\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0066\u0069\u006C\u0065\u0073\u0020\u0074\u006F\u003A +run.write.output.notexists=\u0021\u003E\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u0069\u0073\u006E\u0027\u0074\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u0069\u0062\u006C\u0065 +run.write.output.nowriteaccess=\u0021\u003E\u0020\u006E\u006F\u0020\u0077\u0072\u0069\u0074\u0065\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u0020\u0069\u006E\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079 +run.cutpoints.defined=\u0063\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0028\u0073\u0029\u0020\u0064\u0065\u0066\u0069\u006E\u0065\u0064 +run.start.quick.info=\u003C\u003C\u003C\u0020\u0071\u0075\u0069\u0063\u006B\u0020\u0069\u006E\u0066\u006F\u0020\u003E\u003E\u003E +run.end.quick.info=\u003C\u003C\u003C\u0020\u0065\u006E\u0064\u0020\u006F\u0066\u0020\u0071\u0075\u0069\u0063\u006B\u0020\u0069\u006E\u0066\u006F\u0020\u003E\u003E\u003E +run.no.input=\u006E\u006F\u0020\u0069\u006E\u0070\u0075\u0074\u0020\u0066\u0069\u006C\u0065\u002E\u002E\u002E +run.write.raw=\u0077\u0072\u0069\u0074\u0065\u0020\u0073\u0065\u0070\u0061\u0072\u0061\u0074\u0065\u0064\u0020\u0072\u0061\u0077\u0020\u0066\u0069\u006C\u0065\u0020\u0074\u006F\u003A +run.coll.empty=\u0043\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u0069\u0073\u0020\u0065\u006D\u0070\u0074\u0079\u002E\u002E\u002E\u0020 +run.done=\u0064\u006F\u006E\u0065\u002E\u002E\u002E\u0020\u0020\u0020\u0020\u007B\u0030\u007D\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0028\u0073\u0029\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0065\u0064\u0020\u0020\u0040 +run.stopped=\u0073\u0074\u006F\u0070\u0070\u0065\u0064\u002E\u002E\u002E +run.status=\u0072\u0065\u0061\u0064\u0079\u002E\u002E\u002E +run.splitpart=\u0061\u0063\u0074\u0075\u0061\u006C\u0020\u0070\u0061\u0072\u0074\u0020\u006F\u0066\u0020\u0073\u0070\u006C\u0069\u0074\u0020\u006F\u0075\u0074\u0070\u0075\u0074 + +#Working +working.convertType.demux=\u002D\u003E\u0020\u0064\u0065\u006D\u0075\u0078 +working.convertType.makeVDR=\u002D\u003E\u0020\u006D\u0061\u006B\u0065\u0020\u0061\u0020\u0056\u0044\u0052\u0020\u0028\u0041\u002F\u0056\u0020\u0050\u0045\u0053\u0029 +working.convertType.makeMPG2=\u002D\u003E\u0020\u006D\u0061\u006B\u0065\u0020\u0061\u0020\u004D\u0050\u0047\u0032 +working.convertType.makePVA=\u002D\u003E\u0020\u006D\u0061\u006B\u0065\u0020\u0061\u0020\u0050\u0056\u0041 +working.convertType.makeTS=\u002D\u003E\u0020\u006D\u0061\u006B\u0065\u0020\u0061\u0020\u0054\u0053 +working.convertType.packetFilter=\u002D\u003E\u0020\u0073\u0069\u006D\u0070\u006C\u0065\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0066\u0069\u006C\u0074\u0065\u0072 +working.file=\u002D\u003E\u0020\u0049\u006E\u0070\u0075\u0074\u0020\u0046\u0069\u006C\u0065\u0020\u007B\u0030\u007D\u003A\u0020\u0020\u007B\u0031\u007D\u0020\u0028\u007B\u0032\u007D\u0020\u0062\u0079\u0074\u0065\u0073\u0029 +working.file.not.found=\u0020\u003F\u0020\u0046\u0069\u006C\u0065\u0020\u006E\u006F\u0074\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0021 +working.filetype=\u002D\u003E\u0020\u0046\u0069\u006C\u0065\u0074\u0079\u0070\u0065\u0020\u0069\u0073\u0020\u007B\u0030\u007D +working.file.notsupported=\u0020\u003F\u0020\u0046\u0069\u006C\u0065\u0074\u0079\u0070\u0065\u0020\u006E\u006F\u0074\u0020\u0073\u0075\u0070\u0070\u006F\u0072\u0074\u0065\u0064\u0020\u0021 +working.end.of.part=\u002D\u002D\u002D\u003E\u0020\u0045\u004E\u0044\u0020\u004F\u0046\u0020\u0050\u0041\u0052\u0054 +working.summary=\u0073\u0075\u006D\u006D\u0061\u0072\u0079\u0020\u006F\u0066\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0064\u0020\u006D\u0065\u0064\u0069\u0061\u0020\u0066\u0069\u006C\u0065\u0073\u003A +working.post.command=\u002D\u003E\u0020\u0070\u006F\u0073\u0074\u0020\u0063\u006F\u006D\u006D\u0061\u006E\u0064\u0020\u0070\u0065\u0072\u0066\u006F\u0072\u006D\u0065\u0064\u003A +working.bytes.written=\u0062\u0079\u0074\u0065\u0073\u0020\u0077\u0072\u0069\u0074\u0074\u0065\u006E\u002E\u002E\u002E +working.log.error2=\u006C\u006F\u0067\u0020\u0065\u0072\u0072\u006F\u0072\u0032\u003A +working.output.std=\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0074\u006F\u0020\u0073\u0061\u006D\u0065\u0020\u006C\u006F\u0063\u0061\u0074\u0069\u006F\u006E\u0020\u0061\u0073\u0020\u0031\u0073\u0074\u0020\u0066\u0069\u006C\u0065\u0020\u0069\u006E\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E + +#MPVD +mpvdecoder.tip1=\u0064\u006F\u0075\u0062\u006C\u0065\u0063\u006C\u0069\u0063\u006B\u0020\u0074\u006F\u0020\u0073\u0061\u0076\u0065\u0020\u0061\u0073\u0020\u0062\u006D\u0070 + +#FilePanel +FilePanel.DragDrop.Tip=\u0064\u0072\u0061\u0067\u0020\u0026\u0020\u0064\u0072\u006F\u0070\u0020\u0066\u0069\u006C\u0065\u0028\u0073\u0029\u0020\u0068\u0065\u0072\u0065\u002C\u0020\u006F\u0072\u0020\u0075\u0073\u0065\u0020\u0074\u0068\u0065\u0020\u0063\u006F\u006E\u0074\u0065\u0078\u0074\u0020\u006D\u0065\u006E\u0075 +FilePanel.FileUp.Tip=\u006D\u006F\u0076\u0065\u0020\u0066\u0069\u006C\u0065\u0028\u0073\u0029\u0020\u0075\u0070\u0020\u0069\u006E\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u006C\u0069\u0073\u0074 +FilePanel.FileDown.Tip=\u006D\u006F\u0076\u0065\u0020\u0066\u0069\u006C\u0065\u0028\u0073\u0029\u0020\u0064\u006F\u0077\u006E\u0020\u0069\u006E\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u006C\u0069\u0073\u0074 +FilePanel.FileRemove.Tip=\u0072\u0065\u006D\u006F\u0076\u0065\u0020\u0066\u0069\u006C\u0065\u0028\u0073\u0029\u0020\u0066\u0072\u006F\u006D\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u006C\u0069\u0073\u0074 +FilePanel.CollectionNumber=\u0063\u006F\u006C\u006C\u002E\u0023 +FilePanel.CollectionNumber.Tip=\u0063\u0068\u006F\u006F\u0073\u0065\u0020\u0061\u0063\u0074\u0069\u0076\u0065\u0020\u0066\u0069\u006C\u0065\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E +FilePanel.addCollection.Tip=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u006E\u0065\u0077\u0020\u0066\u0069\u006C\u0065\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E +FilePanel.removeCollection.Tip=\u0064\u0065\u006C\u0065\u0074\u0065\u0020\u0066\u0069\u006C\u0065\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E +FilePanel.openAutoloadPanel.Tip=\u006F\u0070\u0065\u006E\u0020\u0061\u0075\u0074\u006F\u006C\u006F\u0061\u0064\u0020\u0066\u0069\u006C\u0065\u0020\u0077\u0069\u006E\u0064\u006F\u0077 +FilePanel.OutputDirectory=\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u003A +FilePanel.OutputDirectory.Tip=\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u006F\u0066\u0020\u0073\u0065\u006C\u0065\u0063\u0074\u0065\u0064\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E +FilePanel.recentOutputDirectories=\u0072\u0065\u0063\u0065\u006E\u0074\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0069\u0065\u0073\u003A +FilePanel.addRecentOutputDirectory.Tip=\u0061\u0064\u0064\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u0074\u006F\u0020\u0072\u0065\u0063\u0065\u006E\u0074\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u006C\u0069\u0073\u0074 +FilePanel.removeRecentOutputDirectory.Tip=\u0072\u0065\u006D\u006F\u0076\u0065\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u0066\u0072\u006F\u006D\u0020\u0072\u0065\u0063\u0065\u006E\u0074\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u006C\u0069\u0073\u0074 +FilePanel.Textfield.Tip=\u0043\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u002D\u0049\u006E\u0066\u006F\u0073 +FilePanel.FileAdd.Tip=\u0061\u0064\u0064\u0020\u0066\u0069\u006C\u0065\u0028\u0073\u0029\u0020\u0074\u006F\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u006C\u0069\u0073\u0074 + +#ExternTab +ExternPanel.Title1=\u0065\u0078\u0074\u0065\u0072\u006E\u0061\u006C\u0073\u0020\u002F\u0020\u0070\u006F\u0073\u0074\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0069\u006E\u0067 +ExternPanel.Title1.Tip=\u0064\u0065\u0066\u0069\u006E\u0065\u0020\u0079\u006F\u0075\u0072\u0020\u0070\u0072\u0065\u0066\u0065\u0072\u0065\u0064\u0020\u0061\u0070\u0070\u006C\u0069\u0063\u0061\u0074\u0069\u006F\u006E\u0073 +ExternPanel.Applications=\u0065\u0078\u0074\u0065\u0072\u006E\u0061\u006C\u0020\u0061\u0070\u0070\u006C\u0069\u0063\u0061\u0074\u0069\u006F\u006E\u0073\u002E\u002E\u002E +ExternPanel.createVdrIndex=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0069\u006E\u0064\u0065\u0078\u002E\u0076\u0064\u0072\u0020\u006F\u006E\u003A\u0020 +ExternPanel.createVdrIndex.Tip=\u0063\u0072\u0065\u0061\u0074\u0065\u0064\u0020\u0076\u0064\u0072\u0020\u0066\u0069\u006C\u0065\u0020\u0073\u0065\u0067\u006D\u0065\u006E\u0074\u0073\u0020\u0077\u0069\u006C\u006C\u0020\u0074\u0068\u0065\u006E\u0020\u0062\u0065\u0020\u0072\u0065\u006E\u0061\u006D\u0065\u0064\u0020\u0074\u006F\u0020\u0030\u0078\u0078\u002E\u0076\u0064\u0072 +ExternPanel.createCellTimes=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0063\u0065\u006C\u006C\u0054\u0069\u006D\u0065\u0073\u002E\u0074\u0078\u0074\u0020\u0066\u006F\u0072\u0020\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0020\u0069\u006E\u0066\u0069\u006C\u0065\u0073\u002F\u0063\u0075\u0074\u0073 +ExternPanel.createCellTimes.Tip=\u0064\u0065\u006D\u0075\u0078\u0020\u006F\u006E\u006C\u0079\u002C\u0020\u0061\u0064\u0064\u0027\u0073\u0020\u0061\u006E\u0020\u0065\u006E\u0074\u0072\u0079\u0020\u0066\u006F\u0072\u0020\u0074\u0068\u0065\u0020\u0066\u0072\u0061\u006D\u0065\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u006F\u006E\u0020\u0066\u0069\u006C\u0065\u0020\u0073\u0077\u0069\u0074\u0063\u0068\u0069\u006E\u0027\u0020\u0061\u006E\u0064\u0020\u0063\u0075\u0074\u002D\u0069\u006E\u0027\u0073\u0020\u0028\u006E\u0065\u0077\u0020\u0063\u0068\u0061\u0070\u0074\u0065\u0072\u0029 +ExternPanel.exportPts=\u0061\u0075\u0074\u006F\u0073\u0061\u0076\u0065\u0020\u0050\u0054\u0053\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u006F\u0066\u0020\u0063\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0073 +ExternPanel.exportPts.Tip=\u0074\u006F\u0020\u0073\u0068\u0061\u0072\u0065\u0020\u0061\u006E\u0064\u0020\u0072\u0065\u006C\u006F\u0061\u0064\u0020\u0077\u0069\u0074\u0068\u0020\u007B\u0050\u0054\u0053\u0020\u0063\u0075\u0074\u007D\u0020\u0069\u006E\u0020\u0061\u006E\u006F\u0074\u0068\u0065\u0072\u0020\u0058\u0020\u0069\u006E\u0073\u0074\u0061\u006E\u0063\u0065 +ExternPanel.save1stFrameOfGop=\u0061\u0075\u0074\u006F\u0073\u0061\u0076\u0065\u0020\u0047\u004F\u0050\u0073\u0020\u0031\u0073\u0074\u0020\u0049\u002D\u0046\u0072\u0061\u006D\u0065\u0020\u0061\u0073\u0020\u002E\u0062\u006D\u0070 +ExternPanel.save1stFrameOfGop.Tip=\u0064\u0065\u006D\u0075\u0078\u0020\u006F\u006E\u006C\u0079\u002E\u002E\u002E +ExternPanel.createChapters=\u0061\u0075\u0074\u006F\u0073\u0061\u0076\u0065\u0020\u0074\u0069\u006D\u0065\u0063\u006F\u0064\u0065\u0020\u006F\u006E\u0020\u006D\u006F\u0064\u0065\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0073 +ExternPanel.createChapters.Tip=\u0065\u0078\u0070\u006F\u0072\u0074\u0073\u0020\u0061\u006E\u0020\u0061\u0064\u0064\u0069\u0074\u0069\u006F\u006E\u0061\u006C\u0020\u0074\u0069\u006D\u0065\u0063\u006F\u0064\u0065\u0020\u0065\u006E\u0074\u0072\u0079\u0020\u0074\u006F\u0020\u0061\u0020\u006C\u0069\u0073\u0074\u0020\u0069\u0066\u0020\u0061\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0020\u0069\u006E\u0020\u006D\u006F\u0064\u0065\u0020\u006F\u0063\u0063\u0075\u0072\u0073 +ExternPanel.renameAudio=\u0072\u0065\u006E\u0061\u006D\u0065\u0020\u0061\u006C\u006C\u0020\u004D\u0050\u0045\u0047\u002D\u0041\u0075\u0064\u0069\u006F\u0073\u0020\u0074\u006F\u0020\u002A\u002E\u006D\u0070\u0061 +ExternPanel.renameAudio.Tip=\u0069\u006E\u0073\u0074\u0065\u0061\u0064\u0020\u006F\u0066\u0020\u0075\u0073\u0069\u006E\u0067\u0020\u0074\u0068\u0065\u0020\u004C\u0061\u0079\u0065\u0072\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u002D\u003E\u0020\u002E\u006D\u0070\u0031\u002C\u0020\u002E\u006D\u0070\u0032\u002C\u0020\u002E\u006D\u0070\u0033 +ExternPanel.renameVideo=\u0072\u0065\u006E\u0061\u006D\u0065\u0020\u0061\u006C\u006C\u0020\u004D\u0050\u0045\u0047\u002D\u0056\u0069\u0064\u0065\u006F\u0073\u0020\u0074\u006F\u0020\u002A\u002E\u006D\u0070\u0076 +ExternPanel.renameVideo.Tip=\u0069\u006E\u0073\u0074\u0065\u0061\u0064\u0020\u006F\u0066\u0020\u0075\u0073\u0069\u006E\u0067\u0020\u0074\u0068\u0065\u0020\u004D\u0050\u0045\u0047\u0020\u0074\u0079\u0070\u0065\u0020\u002D\u003E\u0020\u002E\u006D\u0031\u0076\u002C\u0020\u002E\u006D\u0032\u0076 +ExternPanel.Title2=\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u0066\u0069\u006C\u0065\u0020\u0073\u0065\u0074\u0074\u0069\u006E\u0067\u0073 +ExternPanel.Title2.Tip=\u0063\u0068\u0061\u006E\u0067\u0065\u0020\u0074\u0068\u0065\u0020\u0065\u006E\u0074\u0072\u0069\u0065\u0073\u002C\u0020\u0069\u0066\u0020\u0079\u006F\u0075\u0020\u006B\u006E\u006F\u0077\u0020\u0077\u0068\u0061\u0074\u0020\u0079\u006F\u0075\u0020\u0064\u006F +ExternPanel.createM2sIndex=\u004D\u0070\u0065\u0067\u0032\u0053\u0063\u0068\u006E\u0069\u0074\u0074\u0020\u0069\u0064\u0064\u0020\u0076\u0065\u0072\u0073\u0069\u006F\u006E\u003A\u0020\u0056\u0032\u002F\u0041\u0033 +ExternPanel.createM2sIndex.Tip=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u002A\u002E\u0069\u0064\u0064\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u0066\u0069\u006C\u0065\u0020\u006F\u006E\u0020\u0064\u0065\u006D\u0075\u0078\u003A +ExternPanel.createD2vIndex=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u002A\u002E\u0064\u0032\u0076\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u0066\u0069\u006C\u0065\u0020\u006F\u006E\u0020\u0064\u0065\u006D\u0075\u0078\u003A +ExternPanel.createD2vIndex.Tip=\u0069\u0066\u0020\u0065\u0061\u0063\u0068\u0020\u0070\u0061\u0072\u0074\u0020\u0073\u0068\u006F\u0075\u006C\u0064\u0020\u0062\u0065\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u0065\u0064\u0020\u0073\u0065\u0070\u0061\u0072\u0061\u0074\u006C\u0079 +ExternPanel.createDgiIndex=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u002A\u002E\u0064\u0067\u0069\u002E\u0064\u0032\u0076\u0020\u0050\u0072\u006F\u006A\u0065\u0063\u0074\u0066\u0069\u006C\u0065\u0020\u006F\u006E\u0020\u0064\u0065\u006D\u0075\u0078\u003A +ExternPanel.createDgiIndex.Tip=\u0069\u0066\u0020\u0065\u0061\u0063\u0068\u0020\u0070\u0061\u0072\u0074\u0020\u0073\u0068\u006F\u0075\u006C\u0064\u0020\u0062\u0065\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u0065\u0064\u0020\u0073\u0065\u0070\u0061\u0072\u0061\u0074\u006C\u0079 +ExternPanel.splitProjectFile=\u0061\u0075\u0074\u006F\u0020\u0073\u0070\u006C\u0069\u0074\u0020\u0076\u0069\u0064\u0065\u006F\u002C\u0020\u0062\u0075\u0074\u0020\u006B\u0065\u0065\u0070\u0020\u0061\u0073\u0020\u006F\u006E\u0065\u0020\u0070\u0072\u006F\u006A\u0065\u0063\u0074 +ExternPanel.splitProjectFile.Tip=\u0061\u0075\u0074\u006F\u0020\u0073\u0070\u006C\u0069\u0074\u0020\u0064\u0065\u006D\u0075\u0078\u0065\u0064\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0069\u006E\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064\u0020\u0070\u0061\u0072\u0074\u0020\u0073\u0069\u007A\u0065\u002C\u0020\u006E\u006F\u0074\u0020\u0061\u0075\u0064\u0069\u006F\u003B\u0020\u0062\u0065\u0074\u0074\u0065\u0072\u0020\u0066\u006F\u0072\u0020\u0062\u0069\u0067\u0020\u0066\u0069\u006C\u0065\u0073\u0020\u006F\u006E\u0020\u003C\u003D\u0046\u0041\u0054\u0033\u0032\u0020\u0073\u0079\u0073\u0074\u0065\u006D\u0073 +ExternPanel.ProjectFileSplitSize=\u002D\u003E\u0020\u0073\u0070\u006C\u0069\u0074\u0020\u006F\u006E\u006C\u0079\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0061\u0074\u0020\u0078\u0078\u0078\u0020\u004D\u0042\u003A\u0020 +ExternPanel.ProjectFileSplitSize.Tip= +ExternPanel.appendExtension=\u0061\u0070\u0070\u0065\u006E\u0064\u0020\u006E\u0065\u0077\u0020\u0066\u0069\u006C\u0065\u0020\u0065\u0078\u0074\u0065\u006E\u0073\u0069\u006F\u006E\u0073\u0020\u0028\u0050\u0045\u0053\u0029 +ExternPanel.appendExtension.Tip=\u0077\u0069\u006C\u006C\u0020\u006B\u0065\u0065\u0070\u0020\u0074\u0068\u0065\u0020\u0073\u006F\u0075\u0072\u0063\u0065\u0020\u0066\u0069\u006C\u0065\u0020\u006E\u0061\u006D\u0065\u0020\u0028\u0069\u006E\u0063\u006C\u002E\u0020\u0065\u0078\u0074\u0065\u006E\u0073\u0069\u006F\u006E\u0029\u0020\u006F\u0066\u0020\u0061\u006C\u006C\u0020\u0073\u0065\u0063\u006F\u006E\u0064\u0061\u0072\u0079\u0020\u0050\u0045\u0053\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0073 + +FtpPanel.killFtpClient=\u0064\u0072\u006F\u0070\u0020\u0063\u006C\u0069\u0065\u006E\u0074\u0020\u0077\u002F\u006F\u0020\u006C\u006F\u0067\u006F\u0075\u0074 +FtpPanel.killFtpClient.Tip=\u0064\u006F\u006E\u0027\u0074\u0020\u0075\u0073\u0065\u002C\u0020\u0065\u0078\u0063\u0065\u0070\u0074\u0020\u0074\u0068\u0065\u0020\u0066\u0074\u0070\u0020\u0073\u0065\u0072\u0076\u0065\u0072\u0020\u0077\u006F\u006E\u0027\u0074\u0020\u0061\u0063\u0063\u0065\u0070\u0074\u0020\u0061\u0020\u006C\u006F\u0067\u006F\u0075\u0074\u0020\u0075\u006E\u0074\u0069\u006C\u0020\u0061\u0020\u0074\u0072\u0061\u006E\u0073\u0066\u0065\u0072\u0020\u0077\u0061\u0073\u0020\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0065\u0064\u0020\u0028\u006D\u0061\u0079\u0020\u006E\u006F\u0074\u0020\u0064\u0069\u0073\u0063\u006F\u006E\u006E\u0065\u0063\u0074\u0020\u0074\u0068\u0065\u0020\u0063\u006C\u0069\u0065\u006E\u0074\u0021\u0029 +FtpPanel.useFtpServerResume=\u0073\u0065\u0072\u0076\u0065\u0072\u0020\u0073\u0075\u0070\u0070\u006F\u0072\u0074\u0073\u0020\u0027\u0072\u0065\u0073\u0075\u006D\u0065\u0027 +FtpPanel.useFtpServerResume.Tip= + +#SpecialTab +SpecialPanel.Title1=\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0073\u0020\u0031 +SpecialPanel.PtsShift=\u0067\u006C\u006F\u0062\u0061\u006C\u0020\u0050\u0054\u0053\u0020\u0073\u0068\u0069\u0066\u0074\u0020\u0028\u0069\u006E\u0020\u0068\u006F\u0075\u0072\u0073\u0029\u003A +SpecialPanel.PtsShift.Tip=\u0074\u0072\u0079\u0020\u0027\u0061\u0075\u0074\u006F\u0020\u006F\u0072\u0020\u0031\u002E\u002E\u0031\u0033\u0027\u002C\u0020\u0069\u006E\u0020\u0063\u0061\u0073\u0065\u0020\u006F\u0066\u0020\u0073\u006F\u0075\u0072\u0063\u0065\u0020\u0041\u002F\u0056\u0020\u0050\u0054\u0053\u0020\u006D\u0069\u0073\u006D\u0061\u0074\u0063\u0068\u002C\u0020\u006F\u0072\u0020\u0069\u0066\u0020\u0069\u0074\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u0064\u0065\u006D\u0075\u0078\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0028\u0073\u0074\u0064\u003D\u0030\u0029 +SpecialPanel.PVA.FileOverlap=\u0050\u0056\u0041\u003A\u0020\u0063\u0068\u0065\u0063\u006B\u0020\u0066\u006F\u0072\u0020\u006F\u0076\u0065\u0072\u006C\u0061\u0070\u0070\u0069\u006E\u0067\u0020\u006F\u006E\u0020\u0072\u0065\u0061\u0064 +SpecialPanel.PVA.FileOverlap.Tip=\u0064\u0069\u0073\u0061\u0062\u006C\u0065\u002C\u0020\u0069\u0066\u0020\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0020\u0050\u0056\u0041\u0027\u0073\u0020\u006F\u0066\u0020\u006F\u006E\u0065\u0020\u0072\u0065\u0063\u006F\u0072\u0064\u0069\u006E\u0067\u0020\u0068\u0061\u0073\u0020\u0062\u0065\u0065\u006E\u0020\u0072\u0065\u0063\u006F\u0072\u0064\u0065\u0064\u0020\u0077\u0069\u0074\u0068\u006F\u0075\u0074\u0020\u006F\u0076\u0065\u0072\u006C\u0061\u0070 +SpecialPanel.PVA.Audio=\u0050\u0056\u0041\u003A\u0020\u0073\u0074\u0072\u0069\u0063\u0074\u006C\u0079\u0020\u0073\u0070\u0065\u0063\u0073\u002E\u0020\u0066\u006F\u0072\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0073 +SpecialPanel.PVA.Audio.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u0020\u0074\u006F\u0020\u0061\u0076\u006F\u0069\u0064\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u0073\u003B\u0020\u0062\u0075\u0074\u0020\u006F\u006E\u0020\u0073\u006F\u006D\u0065\u0020\u0072\u0065\u0063\u006F\u0072\u0064\u0069\u006E\u0067\u0073\u0020\u0074\u0068\u0065\u0072\u0065\u0020\u0061\u0072\u0065\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u0066\u006C\u0061\u0067\u0073\u0021\u0020\u0028\u004D\u0044\u0029 +SpecialPanel.VOB.resetPts=\u0056\u004F\u0042\u003A\u0020\u0064\u0065\u0074\u0065\u0072\u006D\u0069\u006E\u0065\u0020\u0064\u0069\u0066\u0066\u002E\u0020\u0043\u0065\u006C\u006C\u0020\u0074\u0069\u006D\u0065\u006C\u0069\u006E\u0065\u0073 +SpecialPanel.VOB.resetPts.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u002C\u0020\u0069\u0066\u0020\u0074\u0068\u0065\u0020\u0050\u0054\u0053\u0073\u0020\u006F\u0066\u0020\u0063\u006F\u006E\u0073\u0065\u0063\u0075\u0074\u0069\u0076\u0065\u0020\u0056\u006F\u0062\u0049\u0064\u0073\u002F\u0043\u0065\u006C\u006C\u0073\u0020\u0061\u0072\u0065\u0020\u006E\u006F\u0074\u0020\u0063\u006F\u006E\u0074\u0069\u006E\u0075\u006F\u0075\u0073 +SpecialPanel.TS=\u006F\u006E\u006C\u0079\u0020\u0054\u0053\u0020\u0072\u0065\u006C\u0061\u0074\u0065\u0064\u003A +SpecialPanel.TS.ignoreScrambled=\u0054\u0053\u003A\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0020\u0073\u0063\u0072\u0061\u006D\u0062\u006C\u0065\u0064\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0073 +SpecialPanel.TS.ignoreScrambled.Tip=\u0064\u0069\u0073\u0061\u0062\u006C\u0065\u002C\u0020\u0069\u0066\u0020\u0079\u006F\u0075\u0020\u0074\u0068\u0069\u006E\u006B\u0020\u0074\u0068\u0065\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0073\u0020\u0061\u0072\u0065\u0020\u006E\u006F\u0074\u002C\u0020\u0062\u0075\u0074\u0020\u006D\u0061\u0072\u006B\u0065\u0064\u0020\u0061\u0073\u0020\u0073\u0063\u0072\u0061\u006D\u0062\u006C\u0065\u0064 +SpecialPanel.TS.blindSearch=\u0054\u0053\u003A\u0020\u0065\u006E\u0068\u0061\u006E\u0063\u0065\u0064\u0020\u0073\u0065\u0061\u0072\u0063\u0068\u0020\u0066\u006F\u0072\u0020\u006F\u0070\u0065\u006E\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0073 +SpecialPanel.TS.blindSearch.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u002C\u0020\u0069\u0066\u0020\u0074\u0068\u0065\u0020\u0050\u0049\u0044\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u0073\u0074\u006F\u0070\u0073\u0020\u0074\u0068\u0065\u0020\u0073\u0065\u0061\u0072\u0063\u0068\u0020\u0061\u0074\u0020\u0075\u006E\u006B\u006E\u006F\u0077\u006E\u0020\u0070\u0061\u0079\u006C\u006F\u0061\u0064 +SpecialPanel.TS.joinPackets=\u0054\u0053\u003A\u0020\u006A\u006F\u0069\u006E\u0020\u0066\u0069\u006C\u0065\u0020\u0073\u0065\u0067\u006D\u0065\u006E\u0074\u0073\u0020\u0028\u006F\u0066\u0020\u0044\u0072\u0065\u0061\u006D\u0062\u006F\u0078\u0029 +SpecialPanel.TS.joinPackets.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u0020\u0074\u006F\u0020\u006A\u006F\u0069\u006E\u0020\u0069\u006E\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0065\u0020\u0054\u0053\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0073\u0020\u006F\u006E\u0020\u0062\u006F\u0075\u006E\u0064\u0061\u0072\u0069\u0065\u0073\u0020\u006F\u0066\u0020\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0020\u0066\u0069\u006C\u0065\u0020\u0073\u0065\u0067\u006D\u0065\u006E\u0074\u0073 +SpecialPanel.TS.HumaxAdaption=\u0054\u0053\u003A\u0020\u0048\u0075\u006D\u0061\u0078\u0020\u0066\u0069\u006C\u0065\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u0020\u0061\u0064\u0061\u0070\u0074\u0069\u006F\u006E +SpecialPanel.TS.HumaxAdaption.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u0020\u0066\u006F\u0072\u0020\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0020\u0048\u0075\u006D\u0061\u0078\u0020\u0048\u0044\u0020\u0066\u0069\u006C\u0065\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u0020\u006F\u0066\u0020\u0054\u0053 +SpecialPanel.TS.FinepassAdaption=\u0054\u0053\u003A\u0020\u0046\u0069\u006E\u0065\u0070\u0061\u0073\u0073\u0020\u0066\u0069\u006C\u0065\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u0020\u0061\u0064\u0061\u0070\u0074\u0069\u006F\u006E +SpecialPanel.TS.FinepassAdaption.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u0020\u0066\u006F\u0072\u0020\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0020\u0046\u0069\u006E\u0065\u0070\u0061\u0073\u0073\u0020\u0048\u0044\u0020\u0066\u0069\u006C\u0065\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u0020\u006F\u0066\u0020\u0054\u0053 +SpecialPanel.TS.generatePmt=\u0054\u0053\u003A\u0020\u0067\u0065\u006E\u0065\u0072\u0061\u0074\u0065\u0020\u0050\u004D\u0054\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0064\u0065\u0070\u0065\u006E\u0064\u0065\u006E\u0074 +SpecialPanel.TS.generatePmt.Tip=\u0064\u0069\u0073\u0061\u0062\u006C\u0065\u002C\u0020\u0074\u006F\u0020\u0067\u0065\u006E\u0065\u0072\u0061\u0074\u0065\u0020\u0061\u006E\u0020\u0069\u006E\u0064\u0065\u0070\u0065\u006E\u0064\u0065\u006E\u0074\u0020\u0070\u0072\u0065\u002D\u0064\u0065\u0066\u0069\u006E\u0065\u0064\u0020\u0050\u004D\u0054\u0020\u0074\u0068\u0061\u0074\u0020\u0061\u006C\u0073\u006F\u0020\u0066\u0069\u0074\u0020\u006D\u006F\u0073\u0074\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0073 +SpecialPanel.TS.generateTtx=\u0054\u0053\u003A\u0020\u0067\u0065\u006E\u0065\u0072\u0061\u0074\u0065\u0020\u0069\u006E\u0066\u006F\u0020\u0054\u0054\u0058\u0020\u0073\u0065\u0072\u0076\u0069\u0063\u0065\u0020\u0028\u0074\u0065\u0073\u0074\u0029 +SpecialPanel.TS.generateTtx.Tip=\u0061\u0064\u0064\u0020\u0061\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0073\u0065\u0072\u0076\u0069\u0063\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0028\u0050\u0069\u0064\u0020\u0030\u0078\u0039\u0046\u0029\u0020\u0066\u006F\u0072\u0020\u0073\u0074\u0061\u0074\u0075\u0073\u0020\u0069\u006E\u0066\u006F\u0072\u006D\u0061\u0074\u0069\u006F\u006E\u0073\u0020\u006F\u006E\u0020\u0070\u0061\u0067\u0065\u0020\u0031\u0035\u0030\u0020\u0028\u006F\u006E\u006C\u0079\u0020\u0040\u0020\u0061\u0075\u0074\u006F\u0050\u004D\u0054\u0029 +SpecialPanel.TS.HeaderMode0=\u0028\u0030\u0029\u0020\u006E\u006F\u0020\u0061\u0064\u0064\u0069\u0074\u0069\u006F\u006E\u0061\u006C\u0020\u0054\u0053\u0020\u0068\u0065\u0061\u0064\u0065\u0072 +SpecialPanel.TS.HeaderMode1=\u0028\u0031\u0029\u0020\u0061\u0064\u0064\u0020\u0054\u0046\u0034\u0030\u0030\u0030\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u0054\u0053 +SpecialPanel.TS.HeaderMode2=\u0028\u0032\u0029\u0020\u0061\u0064\u0064\u0020\u0054\u0046\u0035\u0030\u0030\u0030\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u0054\u0053 +SpecialPanel.TS.HeaderMode3=\u0028\u0033\u0029\u0020\u0061\u0064\u0064\u0020\u0054\u0046\u0035\u0078\u0030\u0030\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u0054\u0053\u0020\u0028\u006E\u0065\u0077\u0029 +SpecialPanel.TS.setMainAudioAc3=\u0054\u0046\u002D\u0068\u0065\u0061\u0064\u0065\u0072\u003A\u0020\u0073\u0065\u0074\u0020\u0041\u0043\u0033\u0020\u0061\u0073\u0020\u006D\u0061\u0069\u006E\u0020\u0041\u0075\u0064\u0069\u006F\u0054\u0072\u0061\u0063\u006B +SpecialPanel.TS.setMainAudioAc3.Tip=\u0054\u0046\u002D\u0048\u0065\u0061\u0064\u0065\u0072\u003A\u0020\u0073\u0065\u0074\u007A\u0065\u0020\u0041\u0043\u0033\u0020\u0061\u006C\u0073\u0020\u0061\u006B\u0074\u0069\u0076\u0065\u0020\u0054\u006F\u006E\u0073\u0070\u0075\u0072 +SpecialPanel.Title2=\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0073\u0020\u0032 +SpecialPanel.Input.getEnclosedPackets=\u0067\u0065\u0074\u0020\u006F\u006E\u006C\u0079\u0020\u0065\u006E\u0063\u006C\u006F\u0073\u0065\u0064\u0020\u0050\u0045\u0053\u002F\u0054\u0053\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0073 +SpecialPanel.Input.getEnclosedPackets.Tip=\u0064\u0069\u0073\u0061\u0062\u006C\u0065\u002C\u0020\u0069\u0066\u0020\u006E\u006F\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0073\u0020\u0077\u0065\u0072\u0065\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0028\u006F\u006E\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0065\u006E\u0064\u002C\u0020\u0074\u0068\u0065\u0020\u006E\u0065\u0078\u0074\u0020\u006D\u0070\u0065\u0067\u002D\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u0020\u0069\u0073\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u002C\u0020\u0065\u002E\u0067\u002E\u0020\u006F\u006E\u0020\u0049\u006D\u0061\u0067\u0065\u0073\u0029 +SpecialPanel.Input.concatenateForeignRecords=\u0063\u006F\u006E\u0063\u0061\u0074\u0065\u006E\u0061\u0074\u0065\u0020\u0064\u0069\u0066\u0066\u0065\u0072\u0065\u006E\u0074\u0020\u0072\u0065\u0063\u006F\u0072\u0064\u0069\u006E\u0067\u0073 +SpecialPanel.Input.concatenateForeignRecords.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u002C\u0020\u0069\u0066\u0020\u0079\u006F\u0075\u0020\u0077\u0061\u006E\u0074\u0020\u006D\u0065\u0072\u0067\u0065\u0020\u0065\u0071\u0075\u0061\u006C\u0020\u0074\u0079\u0070\u0065\u0073\u0020\u006F\u0066\u0020\u0050\u0056\u0041\u002C\u0020\u004D\u0050\u0045\u0047\u0020\u006F\u0072\u0020\u0056\u0044\u0052\u0020\u0066\u0069\u006C\u0065\u0073\u0020\u0066\u0072\u006F\u006D\u0020\u0064\u0069\u0066\u0066\u0065\u0072\u0065\u006E\u0074\u0020\u0072\u0065\u0063\u006F\u0072\u0064\u0069\u006E\u0067\u0020\u0074\u0069\u006D\u0065\u0073 +SpecialPanel.Audio.ignoreErrors=\u0041\u0075\u0064\u0069\u006F\u003A\u0020\u0075\u0073\u0065\u0020\u006F\u006E\u006C\u0079\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0050\u0054\u0053\u0020\u0066\u006F\u0072\u0020\u0073\u0079\u006E\u0063 +SpecialPanel.Audio.ignoreErrors.Tip=\u0063\u006F\u0075\u006E\u0074\u0073\u0020\u0074\u0068\u0065\u0020\u0061\u0075\u0064\u0069\u006F\u0074\u0069\u006D\u0065\u0020\u0066\u0072\u006F\u006D\u0020\u0069\u0074\u0073\u0020\u0066\u0072\u0061\u006D\u0065\u006C\u0065\u006E\u0067\u0074\u0068\u0073\u0020\u0061\u0066\u0074\u0065\u0072\u0020\u0073\u0079\u006E\u0063\u0069\u006E\u0067\u0020\u0074\u0068\u0065\u0020\u0041\u002F\u0056\u002D\u0073\u0074\u0061\u0072\u0074\u0070\u006F\u0069\u006E\u0074\u002C\u0020\u0073\u006B\u0069\u0070\u0020\u0065\u0072\u0072\u006F\u0072\u0073 +SpecialPanel.Audio.limitPts=\u0041\u0075\u0064\u0069\u006F\u003A\u0020\u006C\u0069\u006D\u0069\u0074\u0020\u0070\u006F\u0069\u006E\u0074\u0073\u0020\u006F\u0066\u0020\u0050\u0054\u0053\u0020\u0066\u006F\u0072\u0020\u0073\u0079\u006E\u0063 +SpecialPanel.Audio.limitPts.Tip=\u0062\u0065\u0074\u0074\u0065\u0072\u0020\u0074\u0068\u0061\u006E\u0020\u0031\u0073\u0074\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0050\u0054\u0053\u0020\u006F\u006E\u006C\u0079\u0020\u0028\u0061\u0073\u0020\u0061\u0062\u006F\u0076\u0065\u0029\u002C\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u006D\u0061\u0079\u0020\u006B\u0065\u0065\u0070\u0020\u0069\u006E\u0020\u0073\u0079\u006E\u0063 +SpecialPanel.Video.ignoreErrors=\u0056\u0069\u0064\u0065\u006F\u003A\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0020\u0065\u0072\u0072\u006F\u0072\u0073\u0020\u0061\u0066\u0074\u0065\u0072\u0020\u0031\u0073\u0074\u0020\u0050\u0054\u0053\u002F\u0047\u004F\u0050 +SpecialPanel.Video.ignoreErrors.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u002C\u0020\u0069\u0066\u0020\u0070\u0072\u006F\u0062\u0061\u0062\u006C\u0079\u0020\u006F\u006E\u006C\u0079\u0020\u0056\u0069\u0064\u0065\u006F\u0020\u0050\u0054\u0053\u0020\u0065\u0072\u0072\u006F\u0072\u0073\u0020\u006F\u0063\u0063\u0075\u0072\u0073\u0020\u0028\u0050\u0069\u0063\u0073\u0020\u0073\u0065\u0065\u006D\u0073\u0020\u006F\u006B\u0029 +SpecialPanel.Video.trimPts=\u0056\u0069\u0064\u0065\u006F\u003A\u0020\u0061\u0064\u0061\u0070\u0074\u0020\u0073\u006C\u0069\u0064\u0069\u006E\u0067\u0020\u0050\u0054\u0053\u0073 +SpecialPanel.Video.trimPts.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u002C\u0020\u0069\u0066\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0020\u0073\u0074\u006F\u0070\u0073\u0020\u0065\u0061\u0072\u006C\u0079\u002C\u0020\u0063\u0061\u0075\u0073\u0065\u0064\u0020\u0062\u0079\u0020\u0073\u006D\u006F\u006F\u0074\u0068\u006C\u0079\u0020\u0050\u0054\u0053\u0020\u0073\u006C\u0069\u0064\u0069\u006E\u0067\u0073 +SpecialPanel.Conversion=\u006F\u006E\u006C\u0079\u0020\u0074\u006F\u0027\u0058\u0059\u005A\u0027\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0073\u0069\u006F\u006E\u0073\u0020\u0072\u0065\u006C\u0061\u0074\u0065\u0064\u003A +SpecialPanel.Conversion.startWithVideo=\u0065\u006E\u0073\u0075\u0072\u0065\u0020\u0031\u0073\u0074\u0020\u0050\u0045\u0053\u002D\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u0077\u0069\u0074\u0068\u0020\u0076\u0069\u0064\u0065\u006F +SpecialPanel.Conversion.startWithVideo.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u002C\u0020\u0069\u0066\u0020\u0073\u006F\u006D\u0065\u0020\u0070\u006C\u0061\u0079\u0065\u0072\u0073\u0020\u0068\u0061\u0076\u0065\u0020\u0070\u0072\u006F\u0062\u006C\u0065\u006D\u0073\u0020\u0069\u0066\u0020\u0069\u0074\u0027\u0073\u0020\u006E\u006F\u0074\u003B\u0020\u0020\u0064\u0069\u0073\u0061\u0062\u006C\u0065\u0020\u0066\u006F\u0072\u0020\u0061\u0075\u0064\u0069\u006F\u002D\u006F\u006E\u006C\u0079\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0073\u0069\u006F\u006E\u0073 +SpecialPanel.Conversion.addPcrToStream=\u0067\u0065\u006E\u0065\u0072\u0061\u0074\u0065\u0020\u0050\u0043\u0052\u002F\u0053\u0043\u0052\u0020\u0066\u0072\u006F\u006D\u0020\u0050\u0054\u0053 +SpecialPanel.Conversion.addPcrToStream.Tip=\u0073\u0070\u0065\u0063\u0069\u0066\u0079\u0020\u0074\u0068\u0065\u0020\u0050\u0043\u0052\u002D\u004F\u0066\u0066\u0073\u0065\u0074\u002C\u0020\u0044\u0056\u0042\u0020\u006E\u0065\u0065\u0064\u0073\u0020\u006D\u006F\u0072\u0065\u0020\u0074\u0068\u0061\u006E\u0020\u0044\u0056\u0044\u002C\u0020\u0068\u0069\u0067\u0068\u0020\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0073\u0020\u006E\u0065\u0065\u0064\u0073\u0020\u006D\u006F\u0072\u0065\u0020\u0074\u0068\u0061\u006E\u0020\u006C\u006F\u0077 +SpecialPanel.Conversion.PcrCounter=\u0069\u006E\u0063\u0054\u0053\u0063\u006E\u0074 +SpecialPanel.Conversion.PcrCounter.Tip=\u0069\u006E\u0063\u0072\u0065\u006D\u0065\u006E\u0074\u0020\u0054\u0053\u002D\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0063\u006F\u0075\u006E\u0074\u0065\u0072\u0020\u0065\u0076\u0065\u006E\u0020\u0077\u0069\u0074\u0068\u006F\u0075\u0074\u0020\u0070\u0061\u0079\u006C\u006F\u0061\u0064\u0028\u0050\u0043\u0052\u002D\u006F\u006E\u006C\u0079\u0029\u003B\u0020\u006E\u006F\u006E\u002D\u0063\u006F\u006E\u0066\u006F\u0072\u006D\u002C\u0020\u0062\u0075\u0074\u0020\u0073\u006F\u006D\u0065\u0074\u0069\u006D\u0065\u0073\u0020\u006E\u0065\u0063\u0065\u0073\u0073\u0061\u0072\u0079\u0021 + +#OutTab +ExportPanel.SplitPanel=\u0073\u0070\u006C\u0069\u0074\u0020\u006F\u0075\u0074\u0070\u0075\u0074 +ExportPanel.SplitSize=\u0073\u0070\u006C\u0069\u0074\u0020\u0040\u0020\u0061\u0070\u0070\u0072\u002E\u0020\u0078\u0078\u0078\u0020\u004D\u0042 +ExportPanel.SplitSize.Tip=\u0065\u0064\u0069\u0074\u0020\u0066\u0069\u0065\u006C\u0064\u0020\u0066\u006F\u0072\u0020\u0061\u006E\u006F\u0074\u0068\u0065\u0072\u0020\u0073\u0069\u007A\u0065\u003B\u0020\u0063\u0075\u0072\u0072\u0065\u006E\u0074\u006C\u0079\u002C\u0020\u0073\u0070\u006C\u0069\u0074\u0020\u0073\u0069\u007A\u0065\u0020\u0069\u0073\u0020\u0072\u0065\u0066\u0065\u0072\u0072\u0065\u0064\u0020\u0074\u006F\u0020\u0077\u0072\u0069\u0074\u0074\u0065\u006E\u0020\u0076\u0069\u0064\u0065\u006F\u0066\u0069\u006C\u0065\u0073\u0069\u007A\u0065\u0021\u0020\u0028\u006D\u0070\u0076\u0029 +ExportPanel.Overlap=\u006E\u006F\u0020\u006F\u0076\u0065\u0072\u006C\u0061\u0070 +ExportPanel.Overlap.Tip= +ExportPanel.StreamtypePanel=\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0074\u0079\u0070\u0065\u0073\u0020\u0074\u006F\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073 +ExportPanel.StreamtypePanel.Tip=\u0064\u0065\u002D\u002F\u0073\u0065\u006C\u0065\u0063\u0074\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0074\u0079\u0070\u0065\u0073\u0020\u0079\u006F\u0075\u0020\u0077\u0061\u006E\u0074\u0020\u0074\u006F\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0020\u0028\u0064\u006F\u0065\u0073\u0020\u006E\u006F\u0074\u0020\u0061\u0070\u0070\u006C\u0069\u0065\u0073\u0020\u0074\u006F\u0020\u0045\u0053\u0020\u0061\u0073\u0020\u0069\u006E\u0070\u0075\u0074\u0029 +ExportPanel.Streamtype.MpgVideo=\u004D\u0070\u0067\u0020\u0056\u0069\u0064\u0065\u006F +ExportPanel.Streamtype.MpgAudio=\u004D\u0070\u0067\u0020\u0041\u0075\u0064\u0069\u006F +ExportPanel.Streamtype.Ac3Audio=\u0041\u0043\u0033\u002F\u0044\u0054\u0053\u0020\u0041\u0075\u0064\u0069\u006F +ExportPanel.Streamtype.PcmAudio=\u004C\u0050\u0043\u004D\u0020\u0041\u0075\u0064\u0069\u006F +ExportPanel.Streamtype.Teletext=\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074 +ExportPanel.Streamtype.Subpicture=\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065 +ExportPanel.Streamtype.Vbi=\u0047\u0065\u006E\u0065\u0072\u0069\u0063\u005F\u0056\u0042\u0049 +ExportPanel.Streamtype.MpgVideo.Tip=\u004D\u0070\u0067\u0020\u0056\u0069\u0064\u0065\u006F +ExportPanel.Streamtype.MpgAudio.Tip=\u004D\u0070\u0067\u0020\u0041\u0075\u0064\u0069\u006F +ExportPanel.Streamtype.Ac3Audio.Tip=\u0041\u0043\u0033\u002F\u0044\u0054\u0053\u0020\u0041\u0075\u0064\u0069\u006F +ExportPanel.Streamtype.PcmAudio.Tip=\u004C\u0050\u0043\u004D\u0020\u0041\u0075\u0064\u0069\u006F +ExportPanel.Streamtype.Teletext.Tip=\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074 +ExportPanel.Streamtype.Subpicture.Tip=\u0055\u006E\u0074\u0065\u0072\u0074\u0069\u0074\u0065\u006C +ExportPanel.Streamtype.Vbi.Tip=\u0047\u0065\u006E\u0065\u0072\u0069\u0063\u005F\u0056\u0042\u0049 +ExportPanel.WriteOptions=\u0077\u0072\u0069\u0074\u0065\u0020\u006F\u0070\u0074\u0069\u006F\u006E\u0073\u0020\u0066\u006F\u0072\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0073\u0069\u006F\u006E\u0020\u0026\u0020\u0064\u0065\u006D\u0075\u0078 +ExportPanel.WriteOptions.Tip=\u0074\u0068\u0061\u0074\u0020\u0061\u0066\u0066\u0065\u0063\u0074\u0073\u0020\u0061\u006C\u0073\u006F\u0020\u0074\u0068\u0065\u0020\u0027\u0074\u006F\u0020\u0056\u0044\u0052\u002F\u004D\u0050\u0047\u002F\u0050\u0056\u0041\u002F\u0054\u0053\u0027\u0020\u0066\u0075\u006E\u0063\u0074\u0069\u006F\u006E\u0020\u0074\u006F\u0020\u0069\u006E\u0063\u006C\u0075\u0064\u0065\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0061\u006E\u0064\u002F\u006F\u0072\u0020\u0056\u0069\u0064\u0065\u006F\u0020\u0045\u0053 +ExportPanel.WriteOptions.writeVideo=\u0077\u0072\u0069\u0074\u0065\u0020\u0061\u006C\u006C\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0064\u0061\u0074\u0061 +ExportPanel.WriteOptions.writeAudio=\u0077\u0072\u0069\u0074\u0065\u0020\u0061\u006C\u006C\u0020\u006F\u0074\u0068\u0065\u0072\u0020\u0064\u0061\u0074\u0061 +ExportPanel.WriteOptions.writeVideo.Tip=\u0077\u0072\u0069\u0074\u0065\u0020\u0061\u006C\u006C\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0064\u0061\u0074\u0061 +ExportPanel.WriteOptions.writeAudio.Tip=\u0077\u0072\u0069\u0074\u0065\u0020\u0061\u006C\u006C\u0020\u006F\u0074\u0068\u0065\u0072\u0020\u0064\u0061\u0074\u0061 + +ExportPanel.WriteOptions.InfoScan=\u0071\u0075\u0069\u0063\u006B\u0020\u0064\u0065\u006D\u0075\u0078\u002F\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u0020\u006F\u0066\u0020\u0031\u0073\u0074\u0020\u0078\u0078\u0020\u004D\u0042\u0020\u003A +ExportPanel.additionalOffset.Title=\u0061\u0064\u0064\u0069\u0074\u0069\u006F\u006E\u0061\u006C\u0020\u0074\u0069\u006D\u0065\u0020\u006F\u0066\u0066\u0073\u0065\u0074\u0020\u0028\u0064\u0065\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0078\u0029 +ExportPanel.additionalOffset=\u0065\u006E\u0061\u0062\u006C\u0065\u0020\u006F\u0066\u0066\u0073\u0065\u0074 +ExportPanel.additionalOffset.Tip=\u006F\u0072\u0069\u0067\u0069\u006E\u0061\u006C\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u006F\u0066\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0077\u0069\u006C\u006C\u0020\u0062\u0065\u0020\u006D\u006F\u0076\u0065\u0064\u0020\u0077\u0069\u0074\u0068\u0020\u0074\u0068\u0065\u0020\u0067\u0069\u0076\u0065\u006E\u0020\u006F\u0066\u0066\u0073\u0065\u0074 +ExportPanel.additionalOffset.Value.Tip=\u0065\u006E\u0074\u0065\u0072\u0020\u0074\u0069\u006D\u0065\u0020\u006F\u0066\u0066\u0073\u0065\u0074\u0020\u0069\u006E\u0020\u006D\u0069\u006C\u006C\u0069\u0073\u0065\u0063\u006F\u006E\u0064\u0073\u002C\u0020\u0068\u0069\u0074\u0020\u0065\u006E\u0074\u0065\u0072\u003B\u0020\u0061\u0066\u0066\u0065\u0063\u0074\u0073\u0020\u0061\u006C\u006C\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0073\u002C\u0020\u0077\u0068\u0069\u0063\u0068\u0020\u0066\u006F\u006C\u006C\u006F\u0077\u0073\u0020\u006F\u006E\u0020\u0061\u0020\u0076\u0069\u0064\u0065\u006F +ExportPanel.createSubDirNumber=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u0061\u0073\u0020\u0073\u0075\u0062\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079 +ExportPanel.createSubDirNumber.Tip=\u0067\u006C\u006F\u0062\u0061\u006C\u003A\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u006E\u0065\u0077\u0020\u0073\u0075\u0062\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u0066\u006F\u0072\u0020\u0065\u0061\u0063\u0068\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u006E\u0075\u006D\u0062\u0065\u0072\u0020\u0028\u0062\u0065\u0074\u0074\u0065\u0072\u0020\u0066\u006F\u0072\u0020\u0073\u0061\u006D\u0065\u0020\u0066\u0069\u006C\u0065\u0073\u0020\u0069\u006E\u0020\u0064\u0069\u0066\u0066\u002E\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0073\u0029 +ExportPanel.createSubDirName=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0027\u0073\u0020\u0062\u0061\u0073\u0065\u006E\u0061\u006D\u0065\u0020\u0061\u0073\u0020\u0073\u0075\u0062\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079 +ExportPanel.createSubDirName.Tip=\u0067\u006C\u006F\u0062\u0061\u006C\u003A\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u006E\u0065\u0077\u0020\u0073\u0075\u0062\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u0062\u0061\u0073\u0065\u0064\u0020\u006F\u006E\u0020\u0031\u0073\u0074\u0020\u0073\u006F\u0075\u0072\u0063\u0065\u0020\u0066\u0069\u006C\u0065\u006E\u0061\u006D\u0065\u0020\u0066\u006F\u0072\u0020\u0065\u0061\u0063\u0068\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E + + +#VideoTab +VideoPanel.Title1=\u0076\u0069\u0064\u0065\u006F\u0020\u0063\u006F\u0072\u0072\u0065\u0063\u0074\u0069\u006F\u006E\u0073\u0020\u0028\u0064\u0065\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0078\u0029 +VideoPanel.addEndcode=\u0061\u0064\u0064\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0020\u0065\u006E\u0064\u0020\u0063\u006F\u0064\u0065 +VideoPanel.addEndcode.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u0020\u0066\u006F\u0072\u0020\u0061\u0020\u0063\u006F\u006E\u0066\u006F\u0072\u006D\u0020\u004D\u0050\u0045\u0047\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0020\u0065\u006E\u0064 +VideoPanel.insertEndcode=\u0069\u006E\u0073\u0065\u0072\u0074\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u007A\u0065\u006E\u0064\u0063\u006F\u0064\u0065\u0020\u006F\u006E\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0073 +VideoPanel.insertEndcode.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u0020\u0066\u006F\u0072\u0020\u0061\u0020\u0063\u006F\u006E\u0066\u006F\u0072\u006D\u0020\u004D\u0050\u0045\u0047\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0020\u0065\u006E\u0064 +VideoPanel.addSequenceHeader=\u0065\u006E\u0073\u0075\u0072\u0065\u0020\u0065\u0061\u0063\u0068\u0020\u0047\u004F\u0050\u0020\u0068\u0061\u0073\u0020\u0061\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0068\u0065\u0061\u0064\u0065\u0072 +VideoPanel.addSequenceHeader.Tip=\u0072\u0065\u002D\u0069\u006E\u0069\u0074\u0020\u0028\u0072\u0065\u0073\u006F\u006C\u002E\u0020\u0026\u0020\u0071\u005F\u006D\u0061\u0074\u0072\u0069\u0078\u0029\u0020\u006F\u0066\u0020\u0050\u0069\u0063\u0074\u0075\u0072\u0065\u0064\u0065\u0063\u006F\u0064\u0069\u006E\u0067\u0020\u006F\u006E\u0020\u0065\u0061\u0063\u0068\u0020\u0047\u004F\u0050\u0020\u0062\u006F\u0075\u006E\u0064\u0061\u0072\u0079\u0020\u0028\u0061\u0075\u0074\u006F\u006D\u0061\u0074\u0069\u0063\u0061\u006C\u006C\u0079\u0020\u006F\u006E\u0020\u0073\u0070\u006C\u0069\u0074\u0029 +VideoPanel.patchToProgressive=\u0070\u0061\u0074\u0063\u0068\u0020\u0061\u006C\u006C\u0020\u0066\u0072\u0061\u006D\u0065\u0073\u0020\u0074\u006F\u0020\u0070\u0072\u006F\u0067\u0072\u0065\u0073\u0073\u0069\u0076\u0065 +VideoPanel.patchToProgressive.Tip=\u0073\u0065\u0074\u0020\u0074\u0068\u0065\u0020\u0070\u0072\u006F\u0067\u0072\u0065\u0073\u0073\u0069\u0076\u0065\u0020\u0062\u0069\u0074\u0073\u0020\u0074\u006F\u0020\u0072\u0065\u0064\u0075\u0063\u0065\u0020\u0074\u0068\u0065\u0020\u0066\u0069\u0065\u006C\u0064\u0020\u006E\u0075\u006D\u0062\u0065\u0072 +VideoPanel.patchToInterlaced=\u0070\u0061\u0074\u0063\u0068\u0020\u0061\u006C\u006C\u0020\u0066\u0072\u0061\u006D\u0065\u0073\u0020\u0074\u006F\u0020\u0069\u006E\u0074\u0065\u0072\u006C\u0061\u0063\u0065\u0064 +VideoPanel.patchToInterlaced.Tip=\u0064\u0065\u006C\u0065\u0074\u0065\u0020\u0074\u0068\u0065\u0020\u0070\u0072\u006F\u0067\u0072\u0065\u0073\u0073\u0069\u0076\u0065\u0020\u0062\u0069\u0074\u0073 +VideoPanel.toggleFieldorder=\u0063\u0068\u0061\u006E\u0067\u0065\u0020\u0066\u0069\u0065\u006C\u0064\u0020\u006F\u0072\u0064\u0065\u0072 +VideoPanel.toggleFieldorder.Tip=\u0074\u006F\u0067\u0067\u006C\u0065\u0020\u0074\u0068\u0065\u0020\u0054\u006F\u0070\u005F\u0066\u0069\u0065\u006C\u0064\u005F\u0066\u0069\u0072\u0073\u0074\u0020\u0062\u0069\u0074 +VideoPanel.addSde=\u0073\u0065\u0074\u0020\u0072\u0065\u0073\u006F\u006C\u0075\u0074\u0069\u006F\u006E\u0020\u0069\u006E\u0020\u0053\u0044\u0045 +VideoPanel.addSde.Tip=\u0063\u0068\u0061\u006E\u0067\u0065\u0020\u0065\u0078\u0069\u0073\u0074\u0069\u006E\u0067\u0020\u006F\u0064\u0065\u0072\u0020\u0069\u006E\u0073\u0065\u0072\u0074\u0020\u006E\u0065\u0077\u0020\u0065\u006E\u0074\u0072\u0069\u0065\u0073\u002C\u0020\u0065\u006D\u0070\u0074\u0079\u0020\u0066\u0069\u0065\u006C\u0064\u0020\u006D\u0065\u0061\u006E\u0073\u0020\u0073\u0061\u006D\u0065\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u0061\u0073\u0020\u0069\u006E\u0020\u0073\u0065\u0071\u0075\u002E\u0068\u0065\u0061\u0064\u0065\u0072\u003B\u0020\u0065\u002E\u0067\u002E\u0020\u0037\u0032\u0030\u002A\u0035\u0037\u0036 +VideoPanel.SdeValue.Tip=\u0063\u0068\u0061\u006E\u0067\u0065\u0020\u0065\u0078\u0069\u0073\u0074\u0069\u006E\u0067\u0020\u006F\u0064\u0065\u0072\u0020\u0069\u006E\u0073\u0065\u0072\u0074\u0020\u006E\u0065\u0077\u0020\u0065\u006E\u0074\u0072\u0069\u0065\u0073\u002C\u0020\u0065\u006D\u0070\u0074\u0079\u0020\u0066\u0069\u0065\u006C\u0064\u0020\u006D\u0065\u0061\u006E\u0073\u0020\u0073\u0061\u006D\u0065\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u0061\u0073\u0020\u0069\u006E\u0020\u0073\u0065\u0071\u0075\u002E\u0068\u0065\u0061\u0064\u0065\u0072\u003B\u0020\u0065\u002E\u0067\u002E\u0020\u0037\u0032\u0030\u002A\u0035\u0037\u0036 +VideoPanel.clearCdf=\u0070\u0061\u0074\u0063\u0068\u0020\u0063\u002E\u0064\u002E\u0066\u006C\u0061\u0067\u0067\u0065\u0064\u0020\u0069\u006E\u0066\u006F\u0073\u0020\u006F\u0066\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0073 +VideoPanel.clearCdf.Tip=\u006D\u0061\u0079\u0020\u0073\u006F\u006C\u0076\u0065\u0020\u0074\u0068\u0065\u0020\u0027\u0067\u0072\u0065\u0065\u006E\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0027\u0020\u0070\u0072\u006F\u0062\u002E\u0020\u006F\u0066\u0020\u0073\u006F\u006D\u0065\u0020\u006F\u006C\u0064\u0020\u0048\u0057\u0020\u0064\u0065\u0063\u006F\u0064\u0065\u0072\u0020\u0063\u0068\u0069\u0070\u0073\u0065\u0074\u0073 +VideoPanel.patchResolution.Tip=\u0063\u006F\u006E\u0064\u0069\u0074\u0069\u006F\u006E\u0061\u006C\u0020\u0070\u0061\u0074\u0063\u0068\u0020\u0031\u0073\u0074\u0020\u0068\u006F\u0072\u0069\u007A\u002E\u0020\u0072\u0065\u0073\u006F\u006C\u0075\u0074\u0069\u006F\u006E +VideoPanel.patchResolution=\u0070\u0061\u0074\u0063\u0068\u0020\u0031\u0073\u0074\u0020\u0068\u002D\u0072\u0065\u0073\u003A +VideoPanel.patchResolutionValue.0=\u0028\u0030\u0029\u0020\u006E\u0065\u0076\u0065\u0072 +VideoPanel.patchResolutionValue.1=\u0028\u0031\u0029\u0020\u0065\u0076\u0065\u0072 +VideoPanel.patchResolutionValue.2=\u0028\u0032\u0029\u0020\u0069\u0066\u0020\u003C\u003E\u0020\u0033\u0035\u0032\u007C\u0037\u0032\u0030 +VideoPanel.patchResolutionValue.3=\u0028\u0033\u0029\u0020\u0069\u0066\u0020\u003C\u003E\u0020\u0074\u006F\u0020\u0033\u0035\u0032\u007C\u0037\u0030\u0034\u007C\u0037\u0032\u0030 +VideoPanel.Title2=\u006E\u0065\u0077\u0020\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u0028\u0064\u0065\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0078\u0029 +VideoPanel.ChangeVbvBuffer.Tip=\u0073\u006F\u006D\u0065\u0074\u0069\u006D\u0065\u0073\u0020\u0069\u0074\u0027\u0073\u0020\u0062\u0065\u0074\u0074\u0065\u0072\u0020\u0074\u006F\u0020\u0064\u0065\u0066\u0069\u006E\u0065\u0020\u0074\u0068\u0065\u0020\u006D\u0061\u0078\u0069\u006D\u0075\u006D\u0020\u0073\u0069\u007A\u0065 +VideoPanel.Unchanged=\u0064\u006F\u006E\u0027\u0074\u0020\u0063\u0068\u0061\u006E\u0067\u0065 +VideoPanel.ChangeVbvBuffer.Mode1=\u0028\u0031\u0029\u0020\u006D\u0061\u0078\u0069\u006D\u0075\u006D\u0020\u0028\u0031\u0031\u0032\u002A\u0031\u0036\u0033\u0038\u0034\u0029 +VideoPanel.ChangeVbvBuffer=\u0076\u0062\u0076\u0020\u0062\u0075\u0066\u0066\u0065\u0072\u003A +VideoPanel.ChangeVbvDelay.Tip=\u006D\u0061\u0078\u002E\u0020\u0074\u0069\u006D\u0065\u0020\u0072\u0065\u0063\u006F\u006D\u006D\u0065\u006E\u0064\u0065\u0064 +VideoPanel.ChangeVbvDelay.Mode1=\u0028\u0031\u0029\u0020\u006D\u0061\u0078\u002E\u0020\u0074\u0069\u006D\u0065\u0020\u0028\u0030\u0078\u0046\u0046\u0046\u0046\u0029 +VideoPanel.ChangeVbvDelay=\u0076\u0062\u0076\u0020\u0064\u0065\u006C\u0061\u0079\u003A +VideoPanel.ChangeAspectRatio.Tip=\u0063\u0068\u0061\u006E\u0067\u0065\u0020\u0069\u0066\u0020\u0079\u006F\u0075\u0020\u006D\u0065\u0061\u006E\u0020\u0069\u0074\u0027\u0073\u0020\u006E\u0065\u0063\u0065\u0073\u0073\u0061\u0072\u0079 +VideoPanel.ChangeAspectRatio=\u0061\u0073\u0070\u0065\u0063\u0074\u0020\u0072\u0061\u0074\u0069\u006F\u003A +VideoPanel.patchBitrateValue.0=\u0028\u0030\u0029\u0020\u006B\u0065\u0065\u0070\u0020\u006F\u0072\u0069\u0067\u0069\u006E\u0061\u006C +VideoPanel.patchBitrateValue.1=\u0028\u0031\u0029\u0020\u0063\u006F\u006D\u0070\u0075\u0074\u0065\u0064\u0020\u0066\u0072\u006F\u006D\u0020\u0047\u004F\u0050\u0020\u0062\u0069\u0074\u006C\u0065\u006E\u0067\u0074\u0068 +VideoPanel.patchBitrateValue.2=\u0028\u0032\u0029\u0020\u0063\u006F\u006D\u0070\u0075\u0074\u0065\u0064\u0020\u0066\u0072\u006F\u006D\u0020\u0056\u0042\u0056 +VideoPanel.patchBitrateValue.3=\u0028\u0033\u0029\u0020\u006D\u0061\u0072\u006B\u0020\u0061\u0073\u0020\u0056\u0042\u0052\u0020\u0028\u004D\u0050\u0045\u0047\u002D\u0031\u0020\u0056\u0069\u0064\u0065\u006F\u0029 +VideoPanel.patchBitrateValue.4=\u0028\u0034\u0029\u0020\u0066\u0069\u0078\u0020\u0033\u0020\u004D\u0062\u0070\u0073 +VideoPanel.patchBitrateValue.5=\u0028\u0035\u0029\u0020\u0066\u0069\u0078\u0020\u0036\u0020\u004D\u0062\u0070\u0073 +VideoPanel.patchBitrateValue.6=\u0028\u0036\u0029\u0020\u0066\u0069\u0078\u0020\u0039\u0020\u004D\u0062\u0070\u0073 +VideoPanel.patchBitrateValue.7=\u0028\u0037\u0029\u0020\u0066\u0069\u0078\u0020\u0031\u0032\u0020\u004D\u0062\u0070\u0073 +VideoPanel.patchBitrateValue.8=\u0028\u0038\u0029\u0020\u0066\u0069\u0078\u0020\u0031\u0035\u0020\u004D\u0062\u0070\u0073 +VideoPanel.patchBitrateValue=\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u0070\u0065\u0072\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u003A +VideoPanel.patch1stBitrateValue.0=\u0028\u0030\u0029\u0020\u006B\u0065\u0065\u0070\u0020\u006F\u0072\u0069\u0067\u0069\u006E\u0061\u006C +VideoPanel.patch1stBitrateValue.1=\u0028\u0031\u0029\u0020\u0063\u006F\u006D\u0070\u0075\u0074\u0065\u0064\u0020\u0061\u0076\u0065\u0072\u0061\u0067\u0065\u0020\u0028\u006E\u006F\u006D\u0069\u006E\u0061\u006C\u0029 +VideoPanel.patch1stBitrateValue.2=\u0028\u0032\u0029\u0020\u0063\u006F\u006D\u0070\u0075\u0074\u0065\u0064\u0020\u006D\u0061\u0078\u0069\u006D\u0075\u006D\u0020\u003C\u003D\u0020\u0039\u002E\u0038\u0020\u004D\u0062\u0070\u0073\u0028\u0044\u0056\u0044\u0029 +VideoPanel.patch1stBitrateValue.3=\u0028\u0033\u0029\u0020\u0063\u006F\u006D\u0070\u0075\u0074\u0065\u0064\u0020\u006D\u0061\u0078\u0069\u006D\u0075\u006D\u0020\u0028\u0065\u002E\u0067\u002E\u0020\u0048\u0044\u0054\u0056\u0029 +VideoPanel.patch1stBitrateValue.4=\u0028\u0034\u0029\u0020\u006D\u0061\u0072\u006B\u0020\u0061\u0073\u0020\u0056\u0042\u0052\u0020\u0028\u004D\u0050\u0045\u0047\u002D\u0031\u0020\u0056\u0069\u0064\u0065\u006F\u0029 +VideoPanel.patch1stBitrateValue=\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0020\u0076\u0061\u006C\u0075\u0065\u0020\u0069\u006E\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u003A + +#AudioTab +AudioPanel.Title1=\u0061\u0075\u0064\u0069\u006F\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0073\u0069\u006F\u006E\u0073\u0020\u0028\u0064\u0065\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0078\u0029 +AudioPanel.loslessMpaConversion.Tip1=\u0064\u0069\u0072\u0065\u0063\u0074\u0020\u006C\u006F\u0073\u006C\u0065\u0073\u0073\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0073\u0069\u006F\u006E\u0020\u0028\u006C\u0069\u006D\u0069\u0074\u0065\u0064 +AudioPanel.loslessMpaConversion.Tip2=\u0074\u006F\u0020\u004D\u0050\u0045\u0047\u002D\u0031\u002C\u0020\u004C\u0061\u0079\u0065\u0072\u0032\u002C\u0020\u0034\u0038\u006B\u0048\u007A\u002C\u0020\u0035\u0036\u002E\u002E\u0033\u0038\u0034\u006B\u0062\u0070\u0073\u0029\u0020\u003A +AudioPanel.loslessMpaConversion.Tip=\u0069\u0066\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0073\u0069\u006F\u006E\u0020\u0069\u0073\u0020\u0063\u0068\u006F\u0073\u0065\u006E\u002C\u0020\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0020\u0026\u0020\u0063\u0068\u0061\u006E\u006E\u0065\u006C\u006D\u006F\u0064\u0065\u0020\u0077\u0069\u006C\u006C\u0020\u0062\u0065\u0020\u0063\u006F\u006E\u0073\u0074\u0061\u006E\u0074\u0020\u006F\u0076\u0065\u0072\u0020\u0074\u0068\u0065\u0020\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0065\u0020\u0066\u0069\u006C\u0065 +AudioPanel.loslessMpaConversionMode0=\u0028\u0030\u0029\u0020\u006E\u006F\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0073\u0069\u006F\u006E +AudioPanel.loslessMpaConversionMode1=\u0028\u0031\u0029\u0020\u0073\u0069\u006E\u0067\u006C\u0065\u0020\u0074\u006F\u0020\u0064\u0075\u0061\u006C\u0020\u0028\u0063\u0068\u002E\u0041\u003D\u006F\u0072\u0069\u0067\u0069\u006E\u0061\u006C\u002C\u0020\u0042\u003D\u0071\u0075\u0069\u0065\u0074\u0029 +AudioPanel.loslessMpaConversionMode2=\u0028\u0032\u0029\u0020\u0073\u0069\u006E\u0067\u006C\u0065\u0020\u0074\u006F\u0020\u0073\u0074\u0065\u0072\u0065\u006F\u0020\u0028\u004C\u0020\u003D\u0020\u006F\u0072\u0069\u0067\u0069\u006E\u0061\u006C\u0029 +AudioPanel.loslessMpaConversionMode3=\u0028\u0033\u0029\u0020\u0073\u0069\u006E\u0067\u006C\u0065\u0020\u0074\u006F\u0020\u006A\u006F\u0069\u006E\u0074\u0073\u0074\u0065\u0072\u0065\u006F\u0020\u0028\u004C\u0020\u003D\u0020\u006F\u0072\u0069\u0067\u0069\u006E\u0061\u006C\u0029 +AudioPanel.loslessMpaConversionMode4=\u0028\u0034\u0029\u0020\u0073\u0070\u006C\u0069\u0074\u0020\u0032\u0063\u0068\u0061\u006E\u006E\u0065\u006C\u0020\u0069\u006E\u0074\u006F\u0020\u0032\u0020\u0073\u0069\u006E\u0067\u006C\u0065\u0020\u0028\u0031\u003D\u004C\u002C\u0032\u003D\u0052\u0029 +AudioPanel.decodeMpgAudio=\u0064\u0065\u0063\u006F\u0064\u0065\u0020\u004D\u0050\u0045\u0047\u0020\u004C\u0061\u0079\u0065\u0072\u0031\u002C\u0032\u0020\u0074\u006F\u0020\u0050\u0043\u004D\u003A +AudioPanel.decodeMpgAudio.Tip=\u004D\u0050\u0045\u0047\u002D\u0041\u0075\u0064\u0069\u006F\u0020\u0044\u0065\u0063\u006F\u0064\u0065\u0072\u0020\u0028\u006E\u006F\u0074\u0020\u0066\u006F\u0072\u0020\u004C\u0061\u0079\u0065\u0072\u0033\u0029\u002C\u0020\u0073\u0074\u0064\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0069\u006E\u0074\u006F\u0020\u0073\u0074\u0065\u0072\u0065\u006F\u0020\u0070\u0063\u006D +AudioPanel.decodeMpgAudio.resampleAudioMode0=\u0028\u0030\u0029\u0020\u006E\u006F\u0020\u0072\u0065\u0073\u0061\u006D\u0070\u006C\u0069\u006E\u0067 +AudioPanel.decodeMpgAudio.resampleAudioMode1=\u0028\u0031\u0029\u0020\u006C\u0069\u006E\u0065\u0061\u0072\u0020\u0072\u0065\u0073\u0061\u006D\u0070\u006C\u0069\u006E\u0067\u0020\u0034\u0038\u006B\u0048\u007A\u0020\u0074\u006F\u0020\u0033\u0032\u006B\u0048\u007A +AudioPanel.decodeMpgAudio.resampleAudioMode2=\u0028\u0032\u0029\u0020\u006C\u0069\u006E\u0065\u0061\u0072\u0020\u0072\u0065\u0073\u0061\u006D\u0070\u006C\u0069\u006E\u0067\u0020\u0034\u0038\u006B\u0048\u007A\u0020\u0074\u006F\u0020\u0034\u0034\u002E\u0031\u006B\u0048\u007A +AudioPanel.decodeMpgAudio.Normalize=\u006E\u006F\u0072\u006D\u0061\u006C\u0069\u007A\u0065\u0020\u0074\u006F\u0020\u0025\u0020\u003A\u0020 +AudioPanel.decodeMpgAudio.Normalize.Tip=\u006E\u006F\u0072\u006D\u0061\u006C\u0069\u007A\u0065\u0020\u004C\u0020\u0065\u0071\u0075\u0061\u006C\u006C\u0079\u002C\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u0066\u0072\u006F\u006D\u0020\u0030\u002E\u002E\u002E\u0031\u0030\u0030\u0020\u0061\u0072\u0065\u0020\u0070\u006F\u0073\u0073\u0069\u0062\u006C\u0065\u002C\u0020\u0073\u0074\u0064\u0020\u0069\u0073\u0020\u0039\u0038\u0025\u003B\u0020\u0066\u006F\u0072\u0063\u0065\u0073\u0020\u0072\u0065\u0073\u0074\u0061\u0072\u0074\u0073\u0020\u0069\u0066\u0020\u006E\u0065\u0063\u0065\u0073\u0073\u0061\u0072\u0079 +AudioPanel.NormalizeValue.Tip=\u006E\u006F\u0072\u006D\u0061\u006C\u0069\u007A\u0065\u0020\u004C\u0020\u0065\u0071\u0075\u0061\u006C\u006C\u0079\u002C\u0020\u0076\u0061\u006C\u0075\u0065\u0073\u0020\u0066\u0072\u006F\u006D\u0020\u0030\u002E\u002E\u002E\u0031\u0030\u0030\u0020\u0061\u0072\u0065\u0020\u0070\u006F\u0073\u0073\u0069\u0062\u006C\u0065\u002C\u0020\u0073\u0074\u0064\u0020\u0069\u0073\u0020\u0039\u0038\u0025\u003B\u0020\u0066\u006F\u0072\u0063\u0065\u0073\u0020\u0072\u0065\u0073\u0074\u0061\u0072\u0074\u0073\u0020\u0069\u0066\u0020\u006E\u0065\u0063\u0065\u0073\u0073\u0061\u0072\u0079 +AudioPanel.decodeMpgAudio.Downmix=\u0064\u006F\u0077\u006E\u006D\u0069\u0078\u0020\u0061\u006E\u0064\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0061\u0073\u0020\u006F\u006E\u0065\u0020\u0063\u0068\u0061\u006E\u006E\u0065\u006C +AudioPanel.decodeMpgAudio.Downmix.Tip=\u0064\u006F\u0077\u006E\u006D\u0069\u0078\u0020\u0073\u0074\u0065\u0072\u0065\u006F\u002F\u0032\u0063\u0068\u0061\u006E\u006E\u0065\u006C\u0020\u0073\u006F\u0075\u0072\u0063\u0065\u0020\u0074\u006F\u0020\u006F\u006E\u0065\u0020\u0073\u0069\u006E\u0067\u006C\u0065\u0020\u0063\u0068\u0061\u006E\u006E\u0065\u006C +AudioPanel.decodeMpgAudio.changeByteorder=\u0073\u0061\u0076\u0065\u0020\u0069\u006E\u0020\u004D\u006F\u0074\u006F\u0072\u006F\u006C\u0061\u0020\u0062\u0079\u0074\u0065\u0020\u006F\u0072\u0064\u0065\u0072 +AudioPanel.decodeMpgAudio.changeByteorder.Tip=\u006D\u0065\u0061\u006E\u0073\u0020\u004D\u0053\u0042\u0020\u0066\u0069\u0072\u0073\u0074\u002C\u0020\u006E\u006F\u006E\u0049\u006E\u0074\u0065\u006C\u0020\u0074\u0079\u0070\u0065 +AudioPanel.decodeMpgAudio.addRiffHeader=\u0061\u0064\u0064\u0020\u0052\u0049\u0046\u0046\u0028\u0052\u0049\u0046\u0058\u0029\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u0050\u0043\u004D\u0020\u0028\u002E\u0077\u0061\u0076\u0029 +AudioPanel.decodeMpgAudio.addRiffHeader.Tip=\u0050\u0043\u0020\u0073\u0074\u0061\u006E\u0064\u0061\u0072\u0064 +AudioPanel.decodeMpgAudio.addAiffHeader=\u0061\u0064\u0064\u0020\u0041\u0049\u0046\u0046\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u0050\u0043\u004D\u0020\u0028\u002E\u0061\u0069\u0066\u0029 +AudioPanel.decodeMpgAudio.addAiffHeader.Tip=\u0041\u0070\u0070\u006C\u0065\u0020\u0073\u0074\u0061\u006E\u0064\u0061\u0072\u0064 +AudioPanel.Title2=\u0061\u0075\u0064\u0069\u006F\u0020\u006D\u0061\u006E\u0069\u0070\u0075\u006C\u0061\u0074\u0069\u006F\u006E\u0073\u0020\u0028\u0064\u0065\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0078\u0029 +AudioPanel.validateCRC=\u0063\u0068\u0065\u0063\u006B\u0020\u0043\u0052\u0043\u0020\u006F\u0066\u0020\u0041\u0043\u002D\u0033\u0020\u002F\u0020\u004D\u0050\u0045\u0047\u002D\u0041\u0075\u0064\u0069\u006F\u0020\u004C\u0031\u002C\u0032 +AudioPanel.validateCRC.Tip=\u0069\u0066\u0020\u0065\u006E\u0061\u0062\u006C\u0065\u0064\u002C\u0020\u0074\u0068\u0069\u0073\u0020\u0065\u006E\u0073\u0075\u0072\u0065\u0073\u0020\u006C\u006F\u0077\u0065\u0073\u0074\u0020\u0065\u0072\u0072\u006F\u006E\u0065\u006F\u0075\u0073\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u006F\u006E\u0020\u0063\u006F\u0073\u0074\u0073\u0020\u006F\u0066\u0020\u0070\u0065\u0072\u0066\u006F\u0072\u006D\u0061\u006E\u0063\u0065 +AudioPanel.clearCRC=\u0064\u0065\u006C\u0065\u0074\u0065\u0020\u0043\u0052\u0043\u0020\u0069\u006E\u0020\u004D\u0050\u0045\u0047\u002D\u0041\u0075\u0064\u0069\u006F\u0020\u004C\u0061\u0079\u0065\u0072\u0031\u002C\u0032 +AudioPanel.clearCRC.Tip=\u0069\u0066\u0020\u0065\u006E\u0061\u0062\u006C\u0065\u0064\u002C\u0020\u0074\u0068\u0069\u0073\u0020\u006D\u0061\u0079\u0020\u0070\u0072\u0065\u0076\u0065\u006E\u0074\u0020\u0073\u006F\u006D\u0065\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0065\u0072\u0072\u006F\u0072\u0020\u006D\u0065\u0073\u0073\u0061\u0067\u0065\u0073 +AudioPanel.fillGapsWithLastFrame=\u0066\u0069\u006C\u006C\u0020\u0067\u0061\u0070\u0073\u0020\u0077\u0069\u0074\u0068\u0020\u0070\u0072\u0065\u0076\u002E\u0020\u0066\u0072\u0061\u006D\u0065 +AudioPanel.fillGapsWithLastFrame.Tip=\u0069\u006E\u0073\u0074\u0065\u0061\u0064\u0020\u006F\u0066\u0020\u0069\u006E\u0073\u0065\u0072\u0074\u0069\u006E\u0067\u0020\u0073\u0069\u006C\u0065\u006E\u0074\u0020\u0066\u0072\u0061\u006D\u0065\u0073\u003B\u0020\u0069\u0073\u0020\u0073\u0074\u0064\u0020\u0066\u006F\u0072\u0020\u0041\u0043\u002D\u0033\u002C\u0020\u0077\u0068\u0065\u006E\u0020\u0061\u0063\u0033\u002E\u0062\u0069\u006E\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u0063\u006F\u006E\u0074\u0061\u0069\u006E\u0020\u0061\u0020\u0073\u0075\u0069\u0074\u0061\u0062\u006C\u0065\u0020\u0073\u0069\u006C\u0065\u006E\u0074\u0020\u0066\u0072\u0061\u006D\u0065\u0020\u0066\u006F\u0072\u0020\u0041\u0043\u002D\u0033 +AudioPanel.addFrames=\u0061\u0064\u0064\u0020\u0066\u0072\u0061\u006D\u0065\u0073 +AudioPanel.addFrames.Tip=\u0069\u0066\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0065\u006E\u0064\u0073\u0020\u0062\u0065\u0066\u006F\u0072\u0065\u0020\u0076\u0069\u0064\u0065\u006F\u002C\u0020\u0074\u006F\u0020\u0072\u0065\u0061\u0063\u0068\u0020\u0074\u0068\u0065\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0074\u0069\u006D\u0065\u0020\u006C\u0065\u006E\u0067\u0074\u0068 +AudioPanel.patch1stAc3Header=\u0070\u0061\u0074\u0063\u0068\u0020\u0031\u0073\u0074\u0020\u0041\u0043\u002D\u0033\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u0033\u002F\u0032\u0020\u0063\u0068\u002D\u006D\u006F\u0064\u0065 +AudioPanel.patch1stAc3Header.Tip=\u0073\u006F\u006D\u0065\u0020\u0041\u0043\u002D\u0033\u0020\u0064\u0065\u0063\u006F\u0064\u0069\u006E\u0067\u0020\u0073\u006F\u0066\u0074\u0077\u0061\u0072\u0065\u0020\u006E\u0065\u0065\u0064\u0073\u0020\u0069\u0074\u0020\u0074\u006F\u0020\u0064\u0065\u0063\u006F\u0064\u0065\u0020\u0061\u006C\u006C\u0020\u0063\u0068\u0061\u006E\u006E\u0065\u006C\u0073\u0020\u0065\u0076\u0065\u006E\u0020\u0069\u0066\u0020\u0074\u0068\u0065\u0072\u0065\u0020\u0061\u0072\u0065\u0020\u006C\u0065\u0073\u0073 +AudioPanel.replaceAc3withSilence=\u0072\u0065\u0070\u006C\u0061\u0063\u0065\u0020\u0061\u006C\u006C\u0020\u006E\u006F\u006E\u002D\u0033\u002F\u0032\u0020\u0041\u0043\u002D\u0033\u0020\u0062\u0079\u0020\u0033\u002F\u0032\u006C\u0066\u0065\u0020\u0073\u0069\u006C\u0065\u006E\u0063\u0065 +AudioPanel.replaceAc3withSilence.Tip=\u0065\u006E\u0061\u0062\u006C\u0065\u002C\u0020\u0074\u006F\u0020\u006D\u0061\u0073\u006B\u0020\u0075\u006E\u0077\u0061\u006E\u0074\u0065\u0064\u0020\u0032\u002F\u0030\u0020\u0066\u0072\u0061\u006D\u0065\u0073\u0020\u0062\u0079\u0020\u0033\u002F\u0032\u0020\u0073\u0069\u006C\u0065\u006E\u0063\u0065\u0020\u0028\u0034\u0038\u006B\u0068\u007A\u002C\u0034\u0034\u0038\u006B\u0062\u0070\u0073\u002C\u0020\u0061\u0063\u0033\u002E\u0062\u0069\u006E\u0020\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0064\u0029 +AudioPanel.addRiffToAc3=\u0061\u0064\u0064\u0020\u0052\u0049\u0046\u0046\u0020\u0057\u0041\u0056\u0045\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u0041\u0043\u002D\u0033\u0020\u0041\u0075\u0064\u0069\u006F +AudioPanel.addRiffToAc3.Tip=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0061\u0020\u002E\u0077\u0061\u0076\u0020\u0066\u0069\u006C\u0065\u002C\u0020\u0075\u0073\u0069\u006E\u0067\u0020\u0074\u0068\u0065\u0020\u0041\u0043\u002D\u0033\u0020\u0057\u0061\u0076\u0065\u0020\u0046\u006F\u0072\u006D\u0061\u0074\u0020\u0028\u0074\u0061\u0067\u0020\u0030\u0078\u0032\u0030\u0030\u0030\u0029\u0020\u0048\u0065\u0061\u0064\u0065\u0072 +AudioPanel.addRiffToMpgAudioL12=\u004D\u0050\u0041\u003A\u0020\u0061\u0064\u0064\u0020\u0052\u0049\u0046\u0046\u0020\u0057\u0041\u0056\u0045\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u004C\u0061\u0079\u0065\u0072\u0031\u002C\u0032 +AudioPanel.addRiffToMpgAudioL12.Tip=\u0042\u0072\u006F\u0061\u0064\u0063\u0061\u0073\u0074\u0020\u0057\u0061\u0076\u0065\u0020\u0046\u006F\u0072\u006D\u0061\u0074\u0020\u0028\u0074\u0061\u0067\u0020\u0030\u0078\u0030\u0030\u0035\u0030\u0029\u002C\u0020\u0062\u0065\u0074\u0074\u0065\u0072\u0020\u0066\u006F\u0072\u0020\u004D\u0050\u0045\u0047\u0020\u004C\u0061\u0079\u0065\u0072\u0020\u0031\u0020\u0026\u0020\u0032 +AudioPanel.addRiffToMpgAudioL3=\u004D\u0050\u0041\u003A\u0020\u0061\u0064\u0064\u0020\u0052\u0049\u0046\u0046\u0020\u0057\u0041\u0056\u0045\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u004C\u0061\u0079\u0065\u0072\u0033 +AudioPanel.addRiffToMpgAudioL3.Tip=\u006D\u006F\u0072\u0065\u0020\u0075\u0073\u0075\u0061\u006C\u0020\u0041\u0043\u004D\u0020\u0057\u0061\u0076\u0065\u0020\u0046\u006F\u0072\u006D\u0061\u0074\u0020\u0028\u0074\u0061\u0067\u0020\u0030\u0078\u0030\u0030\u0035\u0035\u0029\u002C\u0020\u0062\u0065\u0074\u0074\u0065\u0072\u0020\u0066\u006F\u0072\u0020\u004D\u0050\u0045\u0047\u0020\u004C\u0061\u0079\u0065\u0072\u0020\u0033 +AudioPanel.pitchAudio=\u0064\u0069\u0073\u0063\u0061\u0072\u0064\u0020\u0065\u0076\u0065\u0072\u0079\u0020\u0078\u0078\u0078\u0020\u0041\u0075\u0064\u0069\u006F\u0066\u0072\u0061\u006D\u0065\u0020\u003A +AudioPanel.pitchAudio.Tip=\u0063\u006F\u006D\u0070\u0072\u0065\u0073\u0073\u002F\u0070\u0069\u0074\u0063\u0068\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0028\u0065\u006C\u0065\u006D\u0065\u006E\u0074\u0061\u0072\u0079\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0073\u0020\u006F\u006E\u006C\u0079\u0029 +AudioPanel.allowSpaces=\u0061\u006C\u006C\u006F\u0077\u0020\u0073\u0070\u0061\u0063\u0065\u0073\u0020\u0062\u0065\u0074\u0077\u0065\u0065\u006E\u0020\u0066\u0072\u0061\u006D\u0065\u0073\u0020\u0028\u0068\u002E\u0077\u002E\u0063\u002E\u0021\u0029 +AudioPanel.allowSpaces.Tip=\u006F\u006E\u006C\u0079\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0020\u0076\u0061\u006C\u0069\u0064\u0020\u0066\u0072\u0061\u006D\u0065\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0073\u002C\u0020\u0062\u0075\u0074\u0020\u0077\u0069\u0074\u0068\u006F\u0075\u0074\u0020\u0076\u0065\u0072\u0069\u0066\u0079\u0069\u006E\u0067\u0020\u0066\u0072\u0061\u006D\u0065\u0020\u006C\u0065\u006E\u0067\u0074\u0068\u0021\u0020\u0028\u0072\u0065\u0073\u0075\u006C\u0074\u0069\u006E\u0067\u0020\u0069\u006E\u0020\u0070\u0073\u0062\u002E\u0020\u0069\u006E\u0063\u006F\u0072\u0072\u0065\u0063\u0074\u0020\u0073\u0069\u007A\u0065\u0073\u0029 + +#SubtitleTab +SubtitlePanel.Title=\u0044\u0056\u0042\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u002C\u0020\u0044\u0056\u0042\u0020\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0073\u0020\u0028\u0064\u0065\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0078\u0029 +SubtitlePanel.Title.Teletext=\u0044\u0056\u0042\u0020\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0028\u0064\u0065\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0078\u0029 +SubtitlePanel.decodeMegaradio=\u0074\u0065\u0073\u0074\u003A\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0020\u004D\u0065\u0067\u0061\u0052\u0061\u0064\u0069\u006F\u0020\u004D\u0050\u0033\u002D\u0073\u0074\u0072\u0065\u0061\u006D\u0020 +SubtitlePanel.decodeMegaradio.Tip=\u0066\u006F\u0072\u006D\u0065\u0072\u006C\u0079\u0020\u0074\u0072\u0061\u006E\u0073\u006D\u0069\u0074\u0074\u0065\u0064\u0020\u0076\u0069\u0061\u0020\u0048\u006F\u0074\u0062\u0069\u0072\u0064\u0020\u0031\u0033\u00B0\u0045\u002C\u0020\u0031\u0031\u002E\u0030\u0035\u0034\u0047\u0048\u007A\u0020\u0048\u006F\u0072\u002E\u002C\u0020\u0053\u0052\u0020\u0032\u0037\u0035\u0030\u0030\u002C\u0020\u0046\u0045\u0043\u0020\u0035\u002F\u0036\u002C\u0020\u0054\u0054\u0058\u002D\u0050\u0049\u0044\u0020\u0035\u0035\u0033 +SubtitlePanel.decodeHiddenRows=\u0064\u0065\u0063\u006F\u0064\u0065\u0020\u0068\u0069\u0064\u0064\u0065\u006E\u0020\u0072\u006F\u0077\u0073\u0020\u006F\u0066\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0028\u0069\u0064\u0020\u0030\u0078\u0046\u0046\u002C\u0020\u006D\u0065\u0061\u006E\u0073\u0020\u006F\u0066\u0066\u006C\u0069\u006E\u0065\u0020\u0070\u0061\u0067\u0065\u0073\u0029 +SubtitlePanel.decodeHiddenRows.Tip=\u0073\u006F\u006D\u0065\u0020\u0070\u0061\u0067\u0065\u0073\u0020\u006F\u0072\u0020\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0065\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0073\u002F\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0073\u0020\u0061\u0072\u0065\u0020\u0068\u0069\u0064\u0064\u0065\u006E\u002C\u0020\u0073\u006F\u0020\u0074\u0068\u0061\u0074\u0020\u006D\u0061\u0079\u0020\u0068\u0065\u006C\u0070 +SubtitlePanel.rebuildPTS=\u0072\u0065\u002D\u0062\u0075\u0069\u006C\u0064\u0020\u0054\u0054\u0058\u002D\u0050\u0054\u0053\u0020\u0066\u0072\u006F\u006D\u0020\u0031\u0073\u0074\u0020\u004D\u0070\u0067\u0041\u0075\u0064\u0069\u006F\u0020\u0073\u0074\u0072\u0065\u0061\u006D +SubtitlePanel.rebuildPTS.Tip=\u0075\u0073\u0065\u0020\u0069\u0074\u0020\u004F\u004E\u004C\u0059\u0020\u0066\u006F\u0072\u0020\u0054\u0054\u0058\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0073\u0020\u0069\u006E\u0063\u006C\u0075\u0064\u0065\u0064\u0020\u0069\u006E\u0020\u0061\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0066\u0069\u006C\u0065\u0020\u0028\u0054\u0053\u002C\u0050\u0045\u0053\u002E\u002E\u0029\u0020\u0062\u0075\u0074\u0020\u0077\u002F\u006F\u0020\u0070\u0072\u006F\u0070\u0065\u0072\u0020\u0074\u0069\u006D\u0065\u0020\u0062\u0061\u0073\u0065\u0020\u0074\u006F\u0020\u0076\u0069\u0064\u0065\u006F +SubtitlePanel.keepOriginalTimcode=\u006B\u0065\u0065\u0070\u0020\u006F\u0072\u0069\u0067\u0069\u006E\u0061\u006C\u0020\u0054\u0069\u006D\u0065\u0063\u006F\u0064\u0065\u0020\u0028\u0050\u0054\u0053\u0029\u0020\u006F\u006E\u0020\u0069\u006E\u0064\u0065\u0070\u0065\u006E\u0064\u0065\u006E\u0074\u0020\u0064\u0065\u0063\u006F\u0064\u0069\u006E\u0067 +SubtitlePanel.keepOriginalTimcode.Tip=\u0077\u0069\u0074\u0068\u006F\u0075\u0074\u0020\u0061\u0020\u006C\u0065\u0061\u0064\u0069\u006E\u0067\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0074\u006F\u0020\u0064\u0065\u006D\u0075\u0078\u002C\u0020\u006E\u0065\u0077\u0020\u0054\u0069\u006D\u0065\u0063\u006F\u0064\u0065\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u0061\u0074\u0020\u0030 +SubtitlePanel.exportTextAsUnicode=\u0065\u0078\u0070\u006F\u0072\u0074\u0020\u0074\u0065\u0078\u0074\u0020\u0069\u006E\u0020\u0055\u006E\u0069\u0063\u006F\u0064\u0065\u0020\u0028\u0042\u0045\u0029 +SubtitlePanel.exportTextAsUnicode.Tip=\u0055\u006E\u0069\u0063\u006F\u0064\u0065\u0020\u0028\u0042\u0045\u0029\u0020\u0062\u0065\u0069\u006D\u0020\u0054\u0065\u0078\u0074\u0065\u0078\u0070\u006F\u0072\u0074 +SubtitlePanel.TtxPages=\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0070\u0061\u0067\u0065\u0073\u0020\u0074\u006F\u0020\u0064\u0065\u0063\u006F\u0064\u0065\u003A +SubtitlePanel.TtxPages.Tip=\u0061\u0075\u0074\u006F\u0064\u0065\u0074\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u006F\u0066\u0020\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0020\u0063\u0068\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0062\u0061\u0073\u0065\u0064\u0020\u006F\u006E\u0020\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u004C\u0065\u0076\u0065\u006C\u0020\u0031\u002E\u0035\u0020\u0063\u006F\u0064\u0065\u0070\u0061\u0067\u0065\u0073\u0020\u0069\u006E\u0020\u0075\u006E\u0069\u0063\u006F\u0064\u0065 +SubtitlePanel.Language=\u0020\u0020\u006C\u0061\u006E\u0067\u0075\u0061\u0067\u0065\u003A\u0020 +SubtitlePanel.Language.Tip=\u0066\u0069\u0078\u0020\u0074\u006F\u0020\u0061\u0020\u006C\u0061\u006E\u0067\u0075\u0061\u0067\u0065\u0020\u0070\u0061\u0069\u0072\u002C\u0020\u0069\u0066\u0020\u0061\u006E\u0020\u0061\u0075\u0074\u006F\u006D\u0061\u0074\u0069\u0063\u0020\u0073\u0077\u0069\u0074\u0063\u0068\u0020\u0069\u0073\u0020\u006E\u006F\u0074\u0020\u0073\u0075\u0070\u0070\u006F\u0072\u0074\u0065\u0064\u0020\u0062\u0079\u0020\u0074\u0068\u0065\u0020\u0062\u0072\u006F\u0061\u0064\u0063\u0061\u0073\u0074\u0065\u0072 +SubtitlePanel.Format.Tip=\u0073\u0065\u006C\u0065\u0063\u0074\u0020\u0079\u006F\u0075\u0072\u0020\u0066\u0061\u0076\u006F\u0075\u0072\u0069\u0074\u0065\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0020\u0066\u006F\u0072\u006D\u0061\u0074 +SubtitlePanel.Format.Free=\u0074\u0065\u0078\u0074 +SubtitlePanel.Format=\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u0073\u003A\u0020 +SubtitlePanel.Colormodel.Mode0=\u0028\u0030\u0029\u0020\u0034\u0020\u0063\u006F\u006C\u006F\u0075\u0072\u0073\u0020 +SubtitlePanel.Colormodel.Mode1=\u0028\u0031\u0029\u0020\u0031\u0036\u0020\u0063\u006F\u006C\u006F\u0075\u0072\u0073 +SubtitlePanel.Colormodel.Mode2=\u0028\u0032\u0029\u0020\u0032\u0035\u0036\u0020\u0063\u006F\u006C\u006F\u0075\u0072\u0073 +SubtitlePanel.PageId.Value.Tip=\u0065\u006D\u0070\u0074\u0079\u0020\u0066\u0069\u0065\u006C\u0064\u0020\u003D\u0020\u0075\u0073\u0065\u0020\u0077\u0068\u0061\u0074\u0020\u0063\u006F\u006D\u0065\u0073\u002C\u0020\u0065\u006C\u0073\u0065\u003A\u0020\u006B\u0065\u0079\u0020\u0069\u006E\u0020\u0074\u0068\u0065\u0020\u0070\u0061\u0067\u0065\u0020\u0049\u0044\u0020\u006F\u0066\u0020\u0069\u006E\u0074\u0065\u0072\u0065\u0073\u0074\u0020\u0028\u0064\u0065\u0070\u0065\u006E\u0064\u0073\u0020\u006F\u006E\u0020\u0062\u0072\u006F\u0061\u0064\u0063\u0061\u0073\u0074\u0029 +SubtitlePanel.Colormodel=\u0073\u0069\u006D\u0075\u006C\u0061\u0074\u0065\u0020\u0044\u0056\u0042\u0020\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0073\u0020\u0049\u0052\u0044\u0020\u0063\u006F\u006C\u006F\u0072\u0020\u006D\u006F\u0064\u0065\u006C\u003A\u0020\u0020 +SubtitlePanel.Colormodel.Tip=\u0074\u0068\u0061\u0074\u0020\u0065\u0078\u0074\u0072\u0065\u006D\u0065\u006C\u0079\u0020\u0061\u0066\u0066\u0065\u0063\u0074\u0073\u0020\u0074\u0068\u0065\u0020\u006C\u006F\u006F\u006B\u0020\u006F\u0066\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0065\u0064\u0020\u0073\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0073\u002C\u0020\u0062\u0065\u0073\u0074\u0020\u0073\u0065\u0074\u0074\u0069\u006E\u0067\u0020\u0064\u0065\u0070\u0065\u006E\u0064\u0073\u0020\u006F\u006E\u0020\u0077\u0068\u0061\u0074\u0020\u0079\u006F\u0075\u0020\u0077\u0061\u006E\u0074 +SubtitlePanel.PageId=\u0020\u0020\u0066\u0069\u0078\u0020\u0074\u006F\u0020\u0070\u0061\u0067\u0065\u0049\u0044\u003A\u0020 +SubtitlePanel.showPreview=\u0073\u0068\u006F\u0077\u0020\u0053\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u0020\u0050\u0072\u0065\u0076\u0069\u0065\u0077 +SubtitlePanel.Format.SUP.Values.Tip=\u0028\u006F\u0066\u0066\u0073\u0065\u0074\u0073\u0020\u0066\u0072\u006F\u006D\u0020\u006C\u0065\u0066\u0074\u0020\u0062\u006F\u0074\u0074\u006F\u006D\u0029\u0020\u0046\u006F\u006E\u0074\u0020\u0070\u006F\u0069\u006E\u0074\u0073\u0069\u007A\u0065\u003B\u0020\u0042\u0063\u006B\u0047\u0072\u0064\u0020\u0041\u006C\u0070\u0068\u0061\u003B\u0020\u0059\u006F\u0066\u0066\u0073\u0065\u0074\u003B\u0020\u0058\u006F\u0066\u0066\u0073\u0065\u0074\u003B\u0020\u0058\u0077\u0069\u0064\u0074\u0068\u003B\u0020\u0048\u0028\u0075\u006E\u0075\u0073\u0065\u0064\u0029\u003B\u0020\u0056\u003B\u0020\u0059\u006F\u0066\u0066\u0073\u0065\u0074\u0032\u003B\u0020\u006D\u0061\u0078\u002E\u006C\u0069\u006E\u0065\u0073 +SubtitlePanel.SupValues=\u0020\u0056\u0061\u006C\u003A +SubtitlePanel.Font.LoadError=\u0045\u0072\u0072\u006F\u0072\u0020\u0077\u0068\u0069\u006C\u0065\u0020\u0067\u0065\u0074\u0074\u0069\u006E\u0067\u0020\u0073\u0079\u0073\u0074\u0065\u006D\u0020\u0066\u006F\u006E\u0074\u0073 +SubtitlePanel.useTextOutline=\u0064\u0072\u0061\u0077\u0020\u0074\u0065\u0078\u0074\u0020\u0077\u0069\u0074\u0068\u0020\u0062\u006C\u0061\u0063\u006B\u0020\u006F\u0075\u0074\u006C\u0069\u006E\u0065\u0020\u0028\u0053\u0055\u0050\u0020\u006F\u006E\u006C\u0079\u0029 +SubtitlePanel.useTextOutline.Tip=\u0064\u0072\u0061\u0077\u0073\u0020\u0061\u0020\u0033\u0020\u0070\u0069\u0078\u0020\u006F\u0075\u0074\u006C\u0069\u006E\u0065\u0020\u0061\u0072\u006F\u0075\u006E\u0064\u0020\u0065\u0061\u0063\u0068\u0020\u0063\u0068\u0061\u0072\u0020\u0061\u0074\u0020\u0061\u0020\u006D\u0061\u0078\u002E\u0020\u006F\u0066\u0020\u0032\u0020\u0027\u0073\u0070\u0065\u0061\u006B\u0065\u0072\u0020\u0063\u006F\u006C\u006F\u0072\u0073\u0027\u0020\u0070\u0065\u0072\u0020\u0066\u0072\u0061\u006D\u0065\u002C\u0020\u0065\u006C\u0073\u0065\u0020\u0061\u0020\u0062\u006C\u0061\u0063\u006B\u0020\u0062\u0067\u0020\u0069\u0073\u0020\u0075\u0073\u0065\u0064 +SubtitlePanel.Font=\u0053\u0063\u0068\u0072\u0069\u0066\u0074\u0061\u0072\u0074\u003A +SubtitlePanel.Font.Tip=\u0062\u0065\u0069\u0020\u0053\u0055\u0050\u002D\u0045\u0078\u0070\u006F\u0072\u0074 + +#Autoload +autoload.title=\u006C\u0069\u0073\u0074\u0020\u006F\u0066\u0020\u0070\u0072\u0065\u002D\u0064\u0065\u0066\u0069\u006E\u0065\u0064\u0020\u0069\u006E\u0070\u0075\u0074\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0069\u0065\u0073 +autoload.dir.remove.tip=\u0072\u0065\u006D\u006F\u0076\u0065\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u0066\u0072\u006F\u006D\u0020\u0061\u0075\u0074\u006F\u006C\u006F\u0061\u0064\u0020\u006C\u0069\u0073\u0074 +autoload.dir.add.tip=\u0061\u0064\u0064\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u0074\u006F\u0020\u0061\u0075\u0074\u006F\u006C\u006F\u0061\u0064\u0020\u006C\u0069\u0073\u0074 +autoload.dir.refresh.tip=\u0072\u0065\u0066\u0072\u0065\u0073\u0068\u0020\u0066\u0069\u006C\u0065\u0020\u006C\u0069\u0073\u0074 +autoload.ftp.add.tip=\u0061\u0064\u0064\u0020\u0066\u0074\u0070\u0020\u0073\u0065\u0072\u0076\u0065\u0072\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u0074\u006F\u0020\u0061\u0075\u0074\u006F\u006C\u006F\u0061\u0064\u0020\u006C\u0069\u0073\u0074 +autoload.add.coll.tip=\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u006E\u0065\u0077\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u0020\u0066\u006F\u0072\u0020\u0065\u0061\u0063\u0068\u0020\u0073\u0065\u006C\u0065\u0063\u0074\u0065\u0064\u0020\u0066\u0069\u006C\u0065\u0020\u0061\u006E\u0064\u0020\u0061\u0064\u0064\u0020\u0069\u0074 +autoload.add.file.tip=\u0061\u0064\u0064\u0020\u0066\u0069\u006C\u0065\u0028\u0073\u0029\u0020\u0074\u006F\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E +autoload.rename.tip=\u006C\u0065\u0066\u0074\u0020\u0064\u006F\u0075\u0062\u006C\u0065\u0063\u006C\u0069\u0063\u006B\u0020\u006F\u0072\u0020\u0065\u006E\u0074\u0065\u0072\u0020\u0074\u006F\u0020\u0061\u0064\u0064\u0020\u0066\u0069\u006C\u0065\u0028\u0073\u0029\u0020\u0074\u006F\u0020\u0061\u0020\u0063\u006F\u006C\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u002C\u0020\u0072\u0069\u0067\u0068\u0074\u0020\u0063\u006C\u0069\u0063\u006B\u0020\u0074\u006F\u0020\u0072\u0065\u006E\u0061\u006D\u0065 +autoload.dialog.rename=\u0072\u0065\u006E\u0061\u006D\u0065 +autoload.dialog.fileexists=\u0046\u0069\u006C\u0065\u0020\u0065\u0078\u0069\u0073\u0074\u0073\u0021\u0020\u004F\u0076\u0065\u0072\u0077\u0072\u0069\u0074\u0065\u003F +autoload.close=\u0063\u006C\u006F\u0073\u0069\u006E\u0067\u0020\u0077\u0069\u006E\u0064\u006F\u0077 + +#splitreset +splitreset.novideo=\u0021\u0020\u002D\u003E\u0020\u006E\u006F\u0020\u0076\u0069\u0064\u0065\u006F\u0066\u0069\u006C\u0065\u0020\u0050\u0054\u0053\u002C\u0020\u0073\u0070\u006C\u0069\u0074\u0020\u0064\u0069\u0073\u0061\u0062\u006C\u0065\u0064 + +#checkpts +checkpts.1st.latter=\u0021\u003E\u0020\u0031\u0073\u0074\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0050\u0054\u0053\u0020\u0073\u0074\u0061\u0072\u0074\u0073\u0020\u006C\u0061\u0074\u0065\u0072\u0020\u0074\u0068\u0061\u006E\u0020\u0074\u0068\u0065\u0020\u006C\u0061\u0073\u0074\u0020\u0050\u0054\u0053\u0020\u006F\u0066\u0020\u0074\u0068\u0069\u0073\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0021\u0020\u0063\u0072\u0069\u0074\u0069\u0063\u0061\u006C\u0020\u0066\u006F\u0072\u0020\u0053\u0079\u006E\u0063 +checkpts.last.ends=\u0021\u003E\u0020\u006C\u0061\u0073\u0074\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0050\u0054\u0053\u0020\u0065\u006E\u0064\u0073\u0020\u0062\u0065\u0066\u006F\u0072\u0065\u0020\u0074\u0068\u0065\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u0050\u0054\u0053\u0020\u006F\u0066\u0020\u0074\u0068\u0069\u0073\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0021\u0020\u0053\u0079\u006E\u0063\u0020\u0069\u006D\u0070\u006F\u0073\u0073\u0069\u0062\u006C\u0065 + +#parseSecondaryPES +parseSecondaryPES.continue=\u002D\u003E\u0020\u0063\u006F\u006E\u0074\u0069\u006E\u0075\u0065\u0020\u0077\u0068\u0069\u006C\u0065\u0020\u0075\u0073\u0069\u006E\u0067\u0020\u0065\u0078\u0074\u0072\u0061\u0063\u0074\u0065\u0064\u0020\u0072\u0061\u0077\u0020\u0064\u0061\u0074\u0061\u0020\u0066\u0072\u006F\u006D +parseSecondaryPES.demux.pes=\u0064\u0065\u006D\u0075\u0078\u0069\u006E\u0067\u0020\u0050\u0045\u0053\u0020\u0066\u0069\u006C\u0065 +parseSecondaryPES.missing.startcode=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u0020\u0040 +parseSecondaryPES.found.startcode=\u0021\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u0020\u0040 +parseSecondaryPES.packet.length=\u002D\u003E\u0020\u0021\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u006C\u0065\u006E\u0067\u0074\u0068\u0020\u0069\u0073\u0020\u0030\u0020\u0040 +parseSecondaryPES.miss.next.startcode=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u006E\u0065\u0078\u0074\u0020\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u0020\u0040\u0020\u007B\u0030\u007D\u0020\u0066\u0072\u006F\u006D\u0020\u007B\u0031\u007D\u0020\u0028\u0050\u0045\u0053\u002D\u0049\u0044\u0020\u0030\u0078\u007B\u0032\u007D\u0029\u002C\u0020\u0064\u0072\u006F\u0070\u0070\u0069\u006E\u0067\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u002E\u002E +parseSecondaryPES.packs=\u0070\u0061\u0063\u006B\u0073\u003A\u0020\u007B\u0030\u007D\u0020\u007B\u0031\u007D\u0025\u0020\u007B\u0032\u007D +parseSecondaryPES.found.pesid=\u002D\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0050\u0045\u0053\u002D\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u007B\u0031\u007D\u0020\u0040\u0020\u007B\u0032\u007D +parseSecondaryPES.ac3.audio=\u002D\u002D\u003E\u0020\u0041\u0043\u002D\u0033\u002F\u0044\u0054\u0053\u0020\u0041\u0075\u0064\u0069\u006F +parseSecondaryPES.teletext=\u002D\u002D\u003E\u0020\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074 +parseSecondaryPES.mpeg.audio=\u002D\u002D\u003E\u0020\u004D\u0050\u0045\u0047\u0020\u0041\u0075\u0064\u0069\u006F +parseSecondaryPES.lpcm.audio=\u002D\u002D\u003E\u0020\u004C\u0050\u0043\u004D\u0020\u0041\u0075\u0064\u0069\u006F +parseSecondaryPES.subpic=\u002D\u002D\u003E\u0020\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065 +parseSecondaryPES.eof.error=\u0070\u0061\u0072\u0073\u0065\u0053\u0065\u0063\u006F\u006E\u0064\u0061\u0072\u0079\u0050\u0045\u0053\u0020\u0045\u004F\u0046\u0020\u0072\u0065\u0061\u0063\u0068\u0065\u0064\u0020\u0069\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u003A +parseSecondaryPES.io.error=\u0070\u0061\u0072\u0073\u0065\u0053\u0065\u0063\u006F\u006E\u0064\u0061\u0072\u0079\u0050\u0045\u0053\u0020\u0046\u0069\u006C\u0065\u0020\u0049\u002F\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u003A\u0020 +parseSecondaryPES.msg.noexport=\u002D\u002D\u003E\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u006F\u006D\u0069\u0074\u0074\u0065\u0064 + +#ID type +idtype.mpeg.video.ignored=\u0028\u004D\u0050\u0045\u0047\u0020\u0056\u0069\u0064\u0065\u006F\u0029\u0020\u002D\u003E\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0064 +idtype.mpeg.audio=\u0028\u004D\u0050\u0045\u0047\u0020\u0041\u0075\u0064\u0069\u006F\u0029 +idtype.private.stream=\u0028\u0070\u0072\u0069\u0076\u0061\u0074\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0031\u0029 +idtype.mpeg.video=\u0028\u004D\u0050\u0045\u0047\u0020\u0056\u0069\u0064\u0065\u006F\u0029 +idtype.mapped.to=\u0020\u006D\u0061\u0070\u0070\u0065\u0064\u0020\u0074\u006F\u0020\u0030\u0078 +idtype.mapped.to.e0=\u0020\u006D\u0061\u0070\u0070\u0065\u0064\u0020\u0074\u006F\u0020\u0030\u0078\u0045\u0030 +idtype.ignored=\u0020\u002D\u003E\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0064 +idtype.video=\u0028\u0056\u0069\u0064\u0065\u006F\u0029 +idtype.main.audio=\u0028\u006D\u0061\u0069\u006E\u0041\u0075\u0064\u0069\u006F\u0029 +idtype.additional=\u0028\u0061\u0064\u0064\u0069\u0074\u0069\u006F\u006E\u0061\u006C\u0029 +idtype.has.pesid=\u0020\u0068\u0061\u0073\u0020\u0050\u0045\u0053\u002D\u0049\u0044\u0020\u0030\u0078 + +#parsePrimaryPES +parsePrimaryPES.special.pes=\u002D\u003E\u0020\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0020\u0050\u0045\u0053\u002D\u0049\u0044\u0073\u0020\u0066\u006F\u0072\u0020\u0073\u0065\u0061\u0072\u0063\u0068\u0069\u006E\u0067\u0020\u0064\u0065\u0066\u0069\u006E\u0065\u0064 +parsePrimaryPES.continue=\u0063\u006F\u006E\u0074\u0069\u006E\u0075\u0065\u0020\u0077\u0069\u0074\u0068\u0020\u0066\u0069\u006C\u0065 +parsePrimaryPES.demuxing=\u0064\u0065\u006D\u0075\u0078\u0069\u006E\u0067 +parsePrimaryPES.converting=\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u006E\u0067 +parsePrimaryPES.avpes.file=\u0041\u002F\u0056\u0020\u0050\u0045\u0053\u0020\u0066\u0069\u006C\u0065 +parsePrimaryPES.missing.startcode=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u0020\u0040 +parsePrimaryPES.found.startcode=\u0021\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u0020\u0040 +parsePrimaryPES.split.cellids=\u002D\u003E\u0020\u0056\u006F\u0062\u0049\u0044\u0020\u007B\u0030\u007D\u0020\u0043\u0065\u006C\u006C\u0049\u0044\u0020\u007B\u0031\u007D\u0020\u0040\u0020\u007B\u0032\u007D\u0020\u0028\u0047\u004F\u0050\u0023\u007B\u0033\u007D\u0020\u002F\u0020\u0046\u0072\u0061\u006D\u0065\u0023\u007B\u0034\u007D\u0029 +parsePrimaryPES.packet.length=\u002D\u003E\u0020\u0021\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u006C\u0065\u006E\u0067\u0074\u0068\u0020\u0069\u0073\u0020\u0030\u0020\u0040 +parsePrimaryPES.miss.startcode=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u006E\u0065\u0078\u0074\u0020\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u0020\u0028\u0070\u0061\u0063\u006B\u0065\u0074\u0073\u0069\u007A\u0065\u003D\u0030\u0029\u0020\u0040\u0020\u007B\u0030\u007D\u0020\u0066\u0072\u006F\u006D\u0020\u007B\u0031\u007D\u0020\u002F\u0049\u002D\u0042\u0075\u0066\u0066\u0065\u0072\u0020\u007B\u0032\u007D +parsePrimaryPES.miss.startcode2=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u006E\u0065\u0078\u0074\u0020\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u0020\u0040\u0020\u007B\u0030\u007D\u0020\u0066\u0072\u006F\u006D\u0020\u007B\u0031\u007D\u0020\u0028\u0050\u0045\u0053\u002D\u0049\u0044\u0020\u0030\u0078\u007B\u0032\u007D\u0029\u002C\u0020\u0064\u0072\u006F\u0070\u0070\u0069\u006E\u0067\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u002E\u002E +parsePrimaryPES.packs=\u0070\u0061\u0063\u006B\u0073 +parsePrimaryPES.dump.1st=\u002D\u003E\u0020\u0064\u0075\u006D\u0070\u0020\u0031\u0073\u0074\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0074\u006F\u0020\u0066\u0069\u006C\u0065 +parsePrimaryPES.found.pesid=\u002D\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0050\u0045\u0053\u002D\u0049\u0044\u0020\u0030\u0078 +parsePrimaryPES.pes.incoming=\u0021\u003E\u0020\u0050\u0045\u0053\u002D\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u002C\u0020\u0069\u006E\u0063\u006F\u006D\u0069\u006E\u0067\u0020\u0050\u0045\u0053\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0077\u0069\u0074\u0068\u006F\u0075\u0074\u0020\u0070\u0061\u0079\u006C\u006F\u0061\u0064\u0020\u006F\u0072\u0020\u0077\u0072\u006F\u006E\u0067\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0064\u0061\u0074\u0061\u0020\u0040\u0020\u007B\u0031\u007D +parsePrimaryPES.actual.written=\u002D\u003E\u0020\u0061\u0063\u0074\u0075\u0061\u006C\u0020\u0077\u0072\u0069\u0074\u0074\u0065\u006E\u0020\u0076\u0066\u0072\u0061\u006D\u0065\u0073\u003A +parsePrimaryPES.switch=\u0073\u0077\u0069\u0074\u0063\u0068\u0020\u0074\u006F\u0020\u0066\u0069\u006C\u0065\u003A +parsePrimaryPES.ac3=\u002D\u002D\u003E\u0020\u0041\u0043\u002D\u0033\u002F\u0044\u0054\u0053\u0020\u0041\u0075\u0064\u0069\u006F +parsePrimaryPES.teletext=\u002D\u002D\u003E\u0020\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0028\u0053\u0075\u0062\u0049\u0044\u0020\u0030\u0078 +parsePrimaryPES.mpeg.audio=\u002D\u002D\u003E\u0020\u004D\u0050\u0045\u0047\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0028\u0030\u0078 +parsePrimaryPES.lpcm.audio=\u002D\u002D\u003E\u0020\u004C\u0050\u0043\u004D\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0028\u0053\u0075\u0062\u0049\u0044\u0020\u0030\u0078 +parsePrimaryPES.subpic=\u002D\u002D\u003E\u0020\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0028\u0053\u0075\u0062\u0049\u0044\u0020\u0030\u0078 +parsePrimaryPES.eof.error=\u0070\u0061\u0072\u0073\u0065\u0050\u0072\u0069\u006D\u0061\u0072\u0079\u0050\u0045\u0053\u0020\u0045\u004F\u0046\u0020\u0072\u0065\u0061\u0063\u0068\u0065\u0064\u0020\u0069\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u003A +parsePrimaryPES.io.error=\u0070\u0061\u0072\u0073\u0065\u0050\u0072\u0069\u006D\u0061\u0072\u0079\u0050\u0045\u0053\u0020\u0046\u0069\u006C\u0065\u0020\u0049\u002F\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u003A +parsePrimaryPES.msg.noexport=\u002D\u002D\u003E\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u006F\u006D\u0069\u0074\u0074\u0065\u0064\u0020\u0028\u0030\u0078 + +#parseTS +parseTS.sid=\u002D\u003E\u0020\u0053\u0065\u0072\u0076\u0069\u0063\u0065\u0020\u0049\u0044\u0020\u0030\u0078 +parseTS.pmt.refers=\u002D\u003E\u0020\u0050\u004D\u0054\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u0072\u0065\u0066\u0065\u0072\u0073\u0020\u0074\u006F\u0020\u0074\u0068\u0065\u0073\u0065\u0020\u0075\u0073\u0061\u0062\u006C\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0073\u003A +parseTS.no.pmt=\u002D\u003E\u0020\u006E\u006F\u0020\u0050\u004D\u0054\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0028\u0061\u0074\u0020\u0061\u0020\u0073\u0068\u006F\u0072\u0074\u0020\u0073\u0063\u0061\u006E\u0029 +parseTS.special.pids=\u002D\u003E\u0020\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0020\u0050\u0049\u0044\u0073\u0020\u0066\u006F\u0072\u0020\u0073\u0065\u0061\u0072\u0063\u0068\u0069\u006E\u0067\u0020\u0064\u0065\u0066\u0069\u006E\u0065\u0064 +parseTS.continue=\u0063\u006F\u006E\u0074\u0069\u006E\u0075\u0065\u0020\u0077\u0069\u0074\u0068\u0020\u0066\u0069\u006C\u0065\u003A +parseTS.demuxing=\u0064\u0065\u006D\u0075\u0078\u0069\u006E\u0067 +parseTS.converting=\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u006E\u0067 +parseTS.dvb.mpeg=\u0020\u0044\u0056\u0042\u0020\u004D\u0050\u0045\u0047\u002D\u0054\u0053\u0020\u0066\u0069\u006C\u0065 +parseTS.incomplete=\u0021\u003E\u0020\u0069\u006E\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0065\u0020\u0074\u0073\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0061\u0074\u0020\u0045\u004F\u0046\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0065\u0064\u0020\u0040 +parseTS.comp.failed=\u0021\u003E\u0020\u0074\u0073\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0069\u006F\u006E\u0020\u0066\u0061\u0069\u006C\u0065\u0064\u0020\u003A\u002D\u0028 +parseTS.missing.sync=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u0073\u0079\u006E\u0063\u002E\u0020\u0062\u0079\u0074\u0065\u0020\u0040 +parseTS.comp.ok=\u0021\u003E\u0020\u0074\u0073\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0069\u006F\u006E\u0020\u006F\u006B\u0020\u003A\u002D\u0029 +parseTS.found.sync=\u0021\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0073\u0079\u006E\u0063\u002E\u0020\u0062\u0079\u0074\u0065\u0020\u0040 +parseTS.bit.error=\u0021\u003E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u002D\u003E\u0020\u0054\u0053\u0020\u0062\u0069\u0074\u0020\u0065\u0072\u0072\u006F\u0072\u0020\u0069\u006E\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u007B\u0031\u007D\u0020\u0040\u0020\u0070\u006F\u0073\u002E\u0020\u007B\u0032\u007D\u002C\u0020\u0064\u0072\u006F\u0070\u0070\u0069\u006E\u0067\u002E\u002E +parseTS.stuffing=\u002D\u002D\u003E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u0031\u0046\u0046\u0046\u0020\u003D\u003E\u0020\u0073\u0074\u0075\u0066\u0066\u0069\u006E\u0067\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u002D\u003E\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0064 +parseTS.scrambled=\u002D\u003E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u003D\u003E\u0020\u006D\u0061\u0072\u006B\u0065\u0064\u0020\u0061\u0073\u0020\u0073\u0063\u0072\u0061\u006D\u0062\u006C\u0065\u0064\u0020\u0064\u0061\u0074\u0061\u002C\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u007B\u0031\u007D\u0020\u0040\u0020\u007B\u0032\u007D\u0020\u002D\u003E\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0064 +parseTS.clear=\u002D\u003E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u003D\u003E\u0020\u0067\u0065\u0074\u0020\u0063\u006C\u0065\u0061\u0072\u0020\u0064\u0061\u0074\u0061\u002C\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u007B\u0031\u007D\u0020\u0040\u0020\u007B\u0032\u007D +parseTS.outof.sequence=\u0021\u003E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u002D\u003E\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u007B\u0031\u007D\u0020\u0040\u0020\u0070\u006F\u0073\u002E\u0020\u007B\u0032\u007D\u0020\u006F\u0075\u0074\u0020\u006F\u0066\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0020\u0028\u007B\u0033\u007D\u002F\u007B\u0034\u007D\u0029\u0020\u0028\u0073\u0068\u0069\u0066\u0074\u0069\u006E\u0067\u002E\u002E\u0029 +parseTS.priv.stream2.ignored=\u002D\u003E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0028\u0070\u0072\u0069\u0076\u0061\u0074\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0032\u0029\u0020\u002D\u003E\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0064 +parseTS.scrambled.notignored=\u002D\u003E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u003D\u003E\u0020\u006D\u0061\u0072\u006B\u0065\u0064\u0020\u0061\u0073\u0020\u0073\u0063\u0072\u0061\u006D\u0062\u006C\u0065\u0064\u0020\u0064\u0061\u0074\u0061\u0020\u0028\u006E\u006F\u0074\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0064\u0029\u007B\u0031\u007D +parseTS.ignored=\u0020\u002D\u003E\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0064 +parseTS.pid.has.pes=\u006F\u006B\u003E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u0068\u0061\u0073\u0020\u0050\u0045\u0053\u002D\u0049\u0044\u0020\u0030\u0078\u007B\u0031\u007D\u0020\u007B\u0032\u007D +parseTS.lackof.pes=\u0021\u003E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u006C\u0061\u0063\u006B\u0020\u006F\u0066\u0020\u0050\u0045\u0053\u0020\u0044\u0061\u0074\u0061\u0020\u002D\u003E\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0073\u006B\u0069\u0070\u0070\u0065\u0064 +parseTS.actual.vframes=\u002D\u003E\u0020\u0061\u0063\u0074\u0075\u0061\u006C\u0020\u0077\u0072\u0069\u0074\u0074\u0065\u006E\u0020\u0076\u0066\u0072\u0061\u006D\u0065\u0073\u003A +parseTS.tryto.complete=\u0021\u003E\u0020\u0074\u0072\u0079\u0020\u0074\u006F\u0020\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0065\u0020\u0069\u006E\u0063\u006F\u006D\u0070\u006C\u0065\u0074\u0065\u0020\u0074\u0073\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u002E\u002E\u002E +parseTS.packs=\u0070\u0061\u0063\u006B\u0073\u003A\u0020\u007B\u0030\u007D\u0020\u007B\u0031\u007D\u0025\u0020\u007B\u0032\u007D +parseTS.ac3.audio=\u002D\u002D\u003E\u0020\u0041\u0043\u002D\u0033\u002F\u0044\u0054\u0053\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u006F\u006E\u0020\u0050\u0049\u0044\u0020\u0030\u0078 +parseTS.teletext.onpid=\u002D\u002D\u003E\u0020\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u006F\u006E\u0020\u0050\u0049\u0044\u0020\u0030\u0078 +parseTS.mpeg.audio=\u002D\u002D\u003E\u0020\u004D\u0050\u0045\u0047\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0028\u0030\u0078\u007B\u0030\u007D\u0029\u0020\u006F\u006E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0031\u007D +parseTS.subpicture=\u002D\u002D\u003E\u0020\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0028\u0053\u0075\u0062\u0049\u0044\u0020\u0030\u0078 +parseTS.eof.error=\u0072\u0061\u0077\u0020\u0045\u004F\u0046\u0020\u0072\u0065\u0061\u0063\u0068\u0065\u0064\u0020\u0069\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u003A +parseTS.io.error=\u0072\u0061\u0077\u0020\u0046\u0069\u006C\u0065\u0020\u0049\u002F\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u003A +parseTS.switch.to=\u0073\u0077\u0069\u0074\u0063\u0068\u0020\u0074\u006F\u0020\u0066\u0069\u006C\u0065\u003A +parseTS.msg.noexport=\u002D\u002D\u003E\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0028\u0030\u0078\u007B\u0030\u007D\u0029\u0020\u006F\u006E\u0020\u0050\u0049\u0044\u0020\u0030\u0078\u007B\u0031\u007D\u0020\u006F\u006D\u0069\u0074\u0074\u0065\u0064 + +#nextfile +nextfile.io.error=\u006E\u0065\u0078\u0074\u0066\u0069\u006C\u0065\u0020\u0046\u0069\u006C\u0065\u0020\u0049\u002F\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u003A +nextfile.shift.auto=\u002D\u003E\u0020\u0073\u0068\u0069\u0066\u0074\u0020\u006F\u0072\u0069\u0067\u0069\u006E\u0061\u006C\u0020\u0050\u0054\u0053\u0020\u0061\u0075\u0074\u006F\u006D\u0061\u0074\u0069\u0063\u0020\u0062\u0061\u0063\u006B\u0077\u0061\u0072\u0064\u0020\u0062\u0079\u0020\u007B\u0030\u007D\u0020\u0068\u006F\u0075\u0072\u0028\u0073\u0029 +nextfile.shift.manual=\u002D\u003E\u0020\u0073\u0068\u0069\u0066\u0074\u0020\u006F\u0072\u0069\u0067\u0069\u006E\u0061\u006C\u0020\u0050\u0054\u0053\u0020\u006D\u0061\u006E\u0075\u0061\u006C\u0020\u0062\u0061\u0063\u006B\u0077\u0061\u0072\u0064\u0020\u0062\u0079\u0020\u007B\u0030\u007D\u0020\u0068\u006F\u0075\u0072\u0028\u0073\u0029 +nextfile.next.file.start=\u002D\u003E\u0020\u006E\u0065\u0078\u0074\u0020\u0064\u0061\u0074\u0061\u0073\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u0077\u0069\u0074\u0068\u0020\u0050\u0054\u0053\u003A\u0020\u007B\u0030\u007D\u0020\u002F\u0020\u006C\u0061\u0073\u0074\u0020\u0061\u0063\u0074\u0075\u0061\u006C\u0020\u0050\u0054\u0053\u0020\u0069\u0073\u0020\u007B\u0031\u007D +nextfile.next.file.start.adaption=\u002D\u003E\u0020\u0075\u0073\u0065\u0020\u006E\u0065\u0077\u0020\u0050\u0054\u0053\u002D\u004F\u0066\u0066\u0073\u0065\u0074\u003A\u0020\u007B\u0030\u007D\u0020\u0066\u006F\u0072\u0020\u0066\u006F\u006C\u006C\u006F\u0077\u0069\u006E\u0067\u0020\u0064\u0061\u0074\u0061 + +#overlapPVA +overlappva.io.error=\u006F\u0076\u0065\u0072\u006C\u0061\u0070\u0020\u0072\u0065\u0061\u0064\u0020\u0065\u0072\u0072\u006F\u0072\u003A + +#parsePVA +parsePVA.special.pids=\u002D\u003E\u0020\u0073\u0070\u0065\u0063\u0069\u0061\u006C\u0020\u0050\u0049\u0044\u0073\u0020\u0066\u006F\u0072\u0020\u0073\u0065\u0061\u0072\u0063\u0068\u0069\u006E\u0067\u0020\u0064\u0065\u0066\u0069\u006E\u0065\u0064 +parsePVA.streamtype.ac3=\u0020\u0028\u0041\u0043\u002D\u0033\u002F\u0044\u0054\u0053\u0029 +parsePVA.streamtype.ttx=\u0020\u0028\u0054\u0054\u0058\u0029 +parsePVA.streamtype.mpeg.audio=\u0020\u0028\u004D\u0050\u0045\u0047\u0020\u0041\u0075\u0064\u0069\u006F\u0029 +parsePVA.streamtype.mpeg.video=\u0020\u0028\u004D\u0050\u0045\u0047\u0020\u0056\u0069\u0064\u0065\u006F\u0029 +parsePVA.continue=\u0063\u006F\u006E\u0074\u0069\u006E\u0075\u0065\u0020\u0077\u0069\u0074\u0068\u0020\u0066\u0069\u006C\u0065\u003A +parsePVA.demuxing=\u0064\u0065\u006D\u0075\u0078\u0069\u006E\u0067 +parsePVA.converting=\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u006E\u0067 +parsePVA.pvafile=\u0020\u0050\u0056\u0041\u0020\u0066\u0069\u006C\u0065 +parsePVA.missing.sync=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040 +parsePVA.found.sync=\u0021\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040 +parsePVA.file.overlap=\u0046\u0069\u006C\u0065\u002D\u004F\u0076\u0065\u0072\u006C\u0061\u0070\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0065\u0064\u0020\u0040\u0020\u0066\u0069\u006C\u0065\u0070\u006F\u0073\u002E\u003A +parsePVA.packs=\u0070\u0061\u0063\u006B\u0073 +parsePVA.found.id=\u002D\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0049\u0044\u0020\u0030\u0078 +parsePVA.outof.sequence=\u0021\u003E\u0020\u0049\u0044\u0020\u0030\u0078\u007B\u0030\u007D\u0020\u002D\u003E\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u007B\u0031\u007D\u0020\u0040\u0020\u0070\u006F\u0073\u002E\u0020\u007B\u0032\u007D\u0020\u006F\u0075\u0074\u0020\u006F\u0066\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0020\u0028\u007B\u0033\u007D\u002F\u007B\u0034\u007D\u0029\u0020\u0028\u0073\u0068\u0069\u0066\u0074\u0069\u006E\u0067\u002E\u002E\u0029 +parsePVA.id.0x=\u002D\u003E\u0020\u0049\u0044\u0020\u0030\u0078 +parsePVA.actual.vframes=\u002D\u003E\u0020\u0061\u0063\u0074\u0075\u0061\u006C\u0020\u0077\u0072\u0069\u0074\u0074\u0065\u006E\u0020\u0076\u0066\u0072\u0061\u006D\u0065\u0073\u003A +parsePVA.ac3.onid=\u002D\u002D\u003E\u0020\u0041\u0043\u002D\u0033\u002F\u0044\u0054\u0053\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u006F\u006E\u0020\u0049\u0044\u0020\u0030\u0078 +parsePVA.teletext.onid=\u002D\u002D\u003E\u0020\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u006F\u006E\u0020\u0049\u0044\u0020\u0030\u0078 +parsePVA.mpeg.audio.onid=\u002D\u002D\u003E\u0020\u004D\u0050\u0045\u0047\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u006F\u006E\u0020\u0049\u0044\u0020\u0030\u0078 +parsePVA.eof.error=\u0070\u0076\u0061\u0020\u0045\u004F\u0046\u0020\u0072\u0065\u0061\u0063\u0068\u0065\u0064\u0020\u0069\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u003A +parsePVA.io.error=\u0070\u0076\u0061\u0020\u0046\u0069\u006C\u0065\u0020\u0049\u002F\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u003A +parsePVA.msg.noexport=\u002D\u002D\u003E\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u006F\u006D\u0069\u0074\u0074\u0065\u0064\u0020\u006F\u006E\u0020\u0049\u0044\u0020\u0028\u0030\u0078 + +#Audioprocess +audio.progress=\u0063\u0068\u0065\u0063\u006B\u0020\u0026\u0020\u0073\u0079\u006E\u0063\u0068\u0072\u006F\u006E\u0069\u007A\u0065\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0066\u0069\u006C\u0065 +audio.status.pre-insert=\u0070\u0072\u0065\u002D\u0069\u006E\u0073\u0065\u0072\u0074\u0069\u006E\u0067\u002E\u002E\u002E +audio.status.insert=\u0069\u006E\u0073\u0065\u0072\u0074\u0069\u006E\u0067\u002E\u002E\u002E +audio.status.write=\u0077\u0072\u0069\u0074\u0069\u006E\u0067\u002E\u002E\u002E +audio.status.pause=\u0070\u0061\u0075\u0073\u0065\u0064\u002E\u002E\u002E +audio.status.add=\u0061\u0064\u0064\u0069\u006E\u0067\u002E\u002E\u002E +audio.status.finish=\u0066\u0069\u006E\u0069\u0073\u0068\u0065\u0064\u002E\u002E\u002E +audio.convert=\u002D\u003E\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u0020\u004D\u0050\u0041\u0020\u003A +audio.decode=\u002D\u003E\u0020\u0064\u0065\u0063\u006F\u0064\u0065\u0020\u004D\u0050\u0041\u0020\u003A +audio.restart=\u0021\u003E\u0020\u0072\u0065\u0073\u0074\u0061\u0072\u0074\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0070\u0072\u006F\u0063\u0065\u0073\u0073\u0069\u006E\u0067\u002C\u0020\u0066\u006F\u0072\u0063\u0065\u0064\u0020\u0062\u0079\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0073\u0020\u0040\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0066\u0072\u0061\u006D\u0065\u0023 +audio.error.io=\u0066\u0069\u006C\u0065\u0020\u0049\u002F\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u003A +audio.msg.pts.discard=\u0021\u003E\u0020\u007B\u0030\u007D\u0020\u0050\u0054\u0053\u0027\u0073\u0020\u0064\u0069\u0073\u0063\u0061\u0072\u0064\u0065\u0064\u0020\u0069\u006E\u0020\u0073\u0074\u0072\u0065\u0061\u006D +audio.msg.pts.firstonly=\u002D\u003E\u0020\u0074\u0061\u006B\u0065\u0020\u006F\u006E\u006C\u0079\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0050\u0054\u0053\u0020\u0028\u0074\u006F\u0020\u0073\u0079\u006E\u0063\u0020\u0074\u0068\u0065\u0020\u0073\u0074\u0061\u0072\u0074\u0074\u0069\u006D\u0065\u0029 +audio.msg.pts.start_end=\u0041\u0075\u0064\u0069\u006F\u0020\u0050\u0054\u0053\u003A\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u007B\u0030\u007D\u002C\u0020\u006C\u0061\u0073\u0074\u0020\u0070\u0061\u0063\u006B\u0065\u0074 +audio.msg.pts.mismatch=\u002D\u003E\u0020\u0021\u0021\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0026\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0050\u0054\u0053\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u006D\u0061\u0074\u0063\u0068\u0020\u0061\u0074\u0020\u0061\u006E\u0079\u0020\u0074\u0069\u006D\u0065\u0021\u0020 +audio.msg.pts.wo_frame=\u0021\u003E\u0020\u0050\u0054\u0053\u0020\u0077\u0069\u0074\u0068\u006F\u0075\u0074\u0020\u0061\u0020\u0066\u0072\u0061\u006D\u0065 +audio.msg.adjust.at.videopts=\u002D\u003E\u0020\u0061\u0064\u006A\u0075\u0073\u0074\u0069\u006E\u0067\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0061\u0074\u0020\u0076\u0069\u0064\u0065\u006F\u002D\u0074\u0069\u006D\u0065\u006C\u0069\u006E\u0065 +audio.msg.adjust.at.ownpts=\u002D\u003E\u0020\u0061\u0064\u006A\u0075\u0073\u0074\u0069\u006E\u0067\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u0061\u0074\u0020\u0069\u0074\u0073\u0020\u006F\u0077\u006E\u0020\u0074\u0069\u006D\u0065\u006C\u0069\u006E\u0065 +audio.msg.addriff.acm=\u002D\u003E\u0020\u0061\u0064\u0064\u0020\u0052\u0049\u0046\u0046\u0020\u0057\u0041\u0056\u0045\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u004D\u0050\u0045\u0047\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0061\u0073\u0020\u0041\u0043\u004D\u0020\u0057\u0061\u0076\u0065\u0066\u006F\u0072\u006D\u0061\u0074 +audio.msg.addriff.bwf=\u002D\u003E\u0020\u0061\u0064\u0064\u0020\u0052\u0049\u0046\u0046\u0020\u0057\u0041\u0056\u0045\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u004D\u0050\u0045\u0047\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0061\u0073\u0020\u0042\u0057\u0046\u0020\u0057\u0061\u0076\u0065\u0066\u006F\u0072\u006D\u0061\u0074 +audio.msg.addriff.ac3=\u002D\u003E\u0020\u0061\u0064\u0064\u0020\u0052\u0049\u0046\u0046\u0020\u0057\u0041\u0056\u0045\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0074\u006F\u0020\u0041\u0043\u002D\u0033\u0020\u0041\u0075\u0064\u0069\u006F +audio.msg.syncword.lost=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040\u0020\u007B\u0030\u007D\u002C\u0020\u0040 +audio.msg.syncword.found=\u0021\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040 +audio.msg.frame.discard=\u0021\u003E\u0020\u0064\u0069\u0073\u0063\u0061\u0072\u0064\u0020\u0066\u0072\u0061\u006D\u0065\u0023 +audio.msg.crc.error=\u0021\u003E\u0020\u0043\u0052\u0043\u007B\u0030\u007D\u0020\u0063\u0068\u0065\u0063\u006B\u0020\u0066\u0061\u0069\u006C\u0065\u0064\u0020\u0040 +audio.msg.source=\u002D\u003E\u0020\u0073\u0072\u0063\u005F\u0061\u0075\u0064\u0069\u006F\u003A\u0020\u007B\u0030\u007D\u0020\u0040 +audio.msg.source.max=\u002D\u003E\u0020\u0073\u0072\u0063\u005F\u0061\u0075\u0064\u0069\u006F\u003A\u0020\u0073\u0074\u006F\u0070\u0020\u0064\u0069\u0073\u0070\u006C\u0061\u0079\u0069\u006E\u0067\u002C\u0020\u006D\u006F\u0072\u0065\u0020\u0074\u0068\u0061\u006E\u0020\u0031\u0030\u0030\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u006D\u006F\u0064\u0065\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0073\u0020\u0069\u006E\u0020\u006F\u006E\u0065\u0020\u0066\u0069\u006C\u0065\u0020\u0072\u0065\u0064\u0075\u0063\u0065\u0020\u0077\u006F\u0072\u006B\u0020\u0073\u0070\u0065\u0065\u0064 +audio.msg.summary.skip=\u0021\u003E\u0020\u0073\u006B\u0069\u0070\u0070\u0065\u0064\u0020\u0073\u006F\u0075\u0072\u0063\u0065\u0066\u0072\u0061\u006D\u0065\u0028\u0073\u0029\u0020\u0040 +audio.msg.summary.pre-insert=\u0021\u003E\u0020\u007B\u0030\u007D\u0020\u0066\u0072\u0061\u006D\u0065\u0028\u0073\u0029\u0020\u0028\u007B\u0031\u007D\u006D\u0073\u0029\u0020\u0070\u0072\u0065\u002D\u0069\u006E\u0073\u0065\u0072\u0074\u0065\u0064\u0020\u0040 +audio.msg.summary.insert=\u0021\u003E\u0020\u007B\u0030\u007D\u0020\u0066\u0072\u0061\u006D\u0065\u0028\u0073\u0029\u0020\u0028\u007B\u0031\u007D\u006D\u0073\u0029\u0020\u0069\u006E\u0073\u0065\u0072\u0074\u0065\u0064\u0020\u0040 +audio.msg.summary.add=\u0021\u003E\u0020\u007B\u0030\u007D\u0020\u0066\u0072\u0061\u006D\u0065\u0028\u0073\u0029\u0020\u0028\u007B\u0031\u007D\u006D\u0073\u0029\u0020\u0061\u0064\u0064\u0065\u0064\u0020\u0040 +audio.msg.summary.frames=\u0061\u0075\u0064\u0069\u006F\u0020\u0066\u0072\u0061\u006D\u0065\u0073\u003A\u0020\u0077\u0072\u0069\u002F\u0070\u0072\u0065\u002F\u0073\u006B\u0069\u0070\u002F\u0069\u006E\u0073\u002F\u0061\u0064\u0064\u0020\u007B\u0030\u007D\u0020\u0040\u0020\u007B\u0031\u007D\u0020\u0064\u006F\u006E\u0065\u002E\u002E\u002E +audio.msg.summary.jstereo=\u002D\u003E\u0020\u007B\u0030\u007D\u0020\u0073\u0074\u0065\u0072\u0065\u006F\u002F\u006A\u006F\u0069\u006E\u0074\u0073\u0074\u0065\u0072\u0065\u006F\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0028\u0073\u0029\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0065\u0064\u002E\u002E\u002E +audio.msg.audio=\u0041\u0075\u0064\u0069\u006F +audio.msg.newfile.left=\u0028\u006C\u0065\u0066\u0074\u0029\u003A +audio.msg.newfile.right=\u0028\u0072\u0069\u0067\u0068\u0074\u0029\u003A +audio.msg.noaudio=\u0021\u003E\u0020\u006E\u006F\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u006F\u006E\u0020\u0074\u0068\u0069\u0073\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0064\u0061\u0074\u0061\u002E\u002E\u002E +audio.msg.convert.disabled=\u0021\u003E\u0020\u0073\u006F\u0075\u0072\u0063\u0065\u0020\u0066\u0072\u0061\u006D\u0065\u0020\u0064\u006F\u0065\u0073\u0020\u006E\u006F\u0074\u0020\u0066\u0069\u0074\u0020\u0074\u0068\u0065\u0020\u0074\u0072\u0061\u006E\u0073\u0063\u006F\u0064\u0065\u0020\u0063\u0072\u0069\u0074\u0065\u0072\u0069\u0061\u002C\u0020\u0066\u0075\u006E\u0063\u0074\u0069\u006F\u006E\u0020\u0064\u0065\u0061\u0063\u0074\u0069\u0076\u0061\u0074\u0065\u0064\u002E\u002E\u0020\u0028\u0066\u0072\u0061\u006D\u0065\u0023\u0020\u007B\u0030\u007D\u0029 +audio.msg.convert.error=\u0021\u003E\u0020\u0073\u006F\u0075\u0072\u0063\u0065\u0020\u0066\u0072\u0061\u006D\u0065\u0020\u0067\u0065\u006E\u0065\u0072\u0061\u0074\u0065\u0073\u0020\u0061\u0020\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u006F\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u0020\u0028\u0065\u0072\u0072\u006F\u0072\u0020\u007B\u0030\u007D\u0029\u002C\u0020\u0028\u0066\u0072\u0061\u006D\u0065\u0023\u0020\u007B\u0031\u007D\u0029 + +#Videoprocess +video.msg.pts.start_end=\u0056\u0069\u0064\u0065\u006F\u0020\u0050\u0054\u0053\u003A\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u0031\u002E\u0047\u004F\u0050\u0020\u007B\u0030\u007D\u002C\u0020\u0065\u006E\u0064\u0020\u006C\u0061\u0073\u0074\u0020\u0047\u004F\u0050 +video.msg.summary=\u002D\u003E\u0020\u0056\u0069\u0064\u0065\u006F\u003A\u0020\u0066\u0072\u002F\u0020\u0063\u0074\u002F\u0020\u0031\u0070\u002F\u0020\u0063\u0067\u002F\u0020\u006F\u0067\u002F\u0020\u0064\u0067\u0020\u002D\u003E +video.progress=\u0061\u006E\u0061\u006C\u0079\u007A\u0065\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0066\u0069\u006C\u0065 +video.msg.skip.sec=\u002D\u003E\u0020\u0073\u006B\u0069\u0070\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u005F\u0065\u006E\u0064\u005F\u0063\u006F\u0064\u0065\u0020\u0066\u006F\u006C\u006C\u006F\u0077\u0069\u006E\u0067\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u0040 +video.error.io=\u0021\u003E\u0020\u0070\u0075\u0072\u0065\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u0020\u0065\u0072\u0072\u006F\u0072 +video.msg.error.lackofdata=\u0021\u003E\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u002D\u0020\u006C\u0061\u0063\u006B\u0020\u006F\u0066\u0020\u0064\u0061\u0074\u0061\u002C\u0020\u0069\u0067\u006E\u006F\u0072\u0065\u0064\u002E\u002E\u002E +video.msg.error.nopts.use_goptc=\u0021\u003E\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u0068\u0061\u0073\u0020\u006E\u006F\u0020\u0050\u0054\u0053\u002C\u0020\u0075\u0073\u0065\u0020\u0047\u004F\u0050\u0020\u0054\u0043\u0020\u0066\u006F\u0072\u0020\u0073\u0079\u006E\u0063 +video.msg.error.nopts.use_lastpts=\u0021\u003E\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u0068\u0061\u0073\u0020\u006E\u006F\u0020\u0050\u0054\u0053\u002C\u0020\u0075\u0073\u0065\u0020\u006C\u0061\u0073\u0074\u0020\u0050\u0054\u0053\u0020\u0066\u006F\u0072\u0020\u0073\u0079\u006E\u0063 +video.msg.basics=\u002D\u003E\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0062\u0061\u0073\u0069\u0063\u0073\u003A\u0020\u007B\u0030\u007D\u0062\u0070\u0073\u002C\u0020\u0076\u0062\u0076\u0042\u0075\u0066\u0066\u0065\u0072 +video.msg.newformat=\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u002C\u0020\u006E\u0065\u0077\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u0020\u0069\u006E\u0020\u006E\u0065\u0078\u0074\u0020\u006C\u0065\u0061\u0064\u0069\u006E\u0067\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0065\u0064\u003A + +video.msg.error.pesext_in_es=\u0021\u003E\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u002C\u0020\u0050\u0045\u0053\u005F\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0061\u006E\u0064\u0020\u0065\u0078\u0074\u0065\u006E\u0073\u0069\u006F\u006E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0069\u006E\u0020\u0045\u0053\u002C\u0020\u0066\u0069\u006C\u006C\u0065\u0064\u0020\u0077\u0069\u0074\u0068\u0020\u007A\u0065\u0072\u006F\u002E\u002E\u002E\u0020\u0028\u0047\u004F\u0050\u0020\u006F\u0066\u0066\u0073\u002E\u0020\u007B\u0031\u007D\u0029 +video.msg.error.pes_in_es=\u0021\u003E\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u002C\u0020\u0050\u0045\u0053\u005F\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0069\u006E\u0020\u0045\u0053\u002C\u0020\u0066\u0069\u006C\u006C\u0065\u0064\u0020\u0077\u0069\u0074\u0068\u0020\u007A\u0065\u0072\u006F\u002E\u002E\u002E\u0020\u0028\u0047\u004F\u0050\u0020\u006F\u0066\u0066\u0073\u002E\u0020\u007B\u0031\u007D\u0029 +video.msg.error.frame.wrong=\u0021\u003E\u0020\u0077\u0072\u006F\u006E\u0067\u0020\u0066\u0072\u0061\u006D\u0065\u0074\u0079\u0070\u0065\u0020\u007B\u0030\u007D\u002C\u0020\u0074\u0072\u0065\u0066 +video.msg.export.start=\u002D\u003E\u0020\u0073\u0074\u0061\u0072\u0074\u0069\u006E\u0067\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0020\u006F\u0066\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0064\u0061\u0074\u0061\u0020\u0040\u0020\u0047\u004F\u0050\u0023 +video.msg.pts.diff=\u0021\u003E\u0020\u0050\u0054\u0053\u0020\u0064\u0069\u0066\u0066\u0065\u0072\u0065\u006E\u0063\u0065\u0020\u006F\u0066\u0020\u007B\u0030\u007D\u0020\u0028\u007B\u0031\u007D\u0029\u0020\u0074\u006F\u0020\u006C\u0061\u0073\u0074\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0065\u0064\u0020\u0047\u004F\u0050\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0065\u0064 +video.msg.error.brokenlink=\u0028\u0062\u0072\u006F\u006B\u0065\u006E\u005F\u006C\u0069\u006E\u006B\u0020\u0063\u006F\u0072\u0072\u0065\u0063\u0074\u0065\u0064\u0029 +video.msg.frame.drop=\u0021\u003E\u0020\u0064\u0072\u006F\u0070\u0070\u0069\u006E\u0067\u0020\u0075\u0073\u0065\u006C\u0065\u0073\u0073\u0020\u0042\u002D\u0046\u0072\u0061\u006D\u0065\u0073\u0020\u0040\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u002F\u0020\u006E\u0065\u0077\u0020\u0054\u0069\u006D\u0065\u0063\u006F\u0064\u0065 +video.msg.error.frame.not=\u0021\u003E\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u0063\u006F\u006E\u0074\u0061\u0069\u006E\u0073\u0020\u006E\u006F\u0020\u0066\u0072\u0061\u006D\u0065\u0073 +video.msg.error.frame.not.i=\u0021\u003E\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u0073\u0074\u0061\u0072\u0074\u0020\u0077\u0069\u0074\u0068\u0020\u0061\u006E\u0020\u0049\u002D\u0046\u0072\u0061\u006D\u0065\u0020\u0061\u0074\u0020\u0074\u0072\u0065\u0066\u0020\u0027\u0030\u0027 +video.msg.error.pts.early=\u0021\u003E\u0020\u0073\u0074\u0061\u0072\u0074\u0050\u0054\u0053\u0020\u006F\u0066\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u0069\u0073\u0020\u0065\u0061\u0072\u006C\u0069\u0065\u0072\u0020\u0074\u0068\u0061\u006E\u0020\u0074\u0068\u0065\u0020\u0065\u006E\u0064\u0020\u006F\u0066\u0020\u006C\u0061\u0073\u0074\u0020\u0047\u004F\u0050\u002E\u002E\u0020\u0028\u0065\u0078\u0070\u002E\u0020\u007B\u0031\u007D\u0029 +video.msg.error.gop.drop=\u0021\u003E\u0020\u0064\u0072\u006F\u0070\u0070\u0069\u006E\u0067\u0020\u0047\u004F\u0050\u0023\u0020\u007B\u0030\u007D\u0020\u0040\u0020\u006F\u0072\u0069\u0067\u002E\u0050\u0054\u0053\u0020\u007B\u0031\u007D\u0020\u0028\u007B\u0032\u007D\u0029 +video.msg.error.gop.diff=\u002D\u003E\u0020\u0050\u0069\u0063\u0073\u0020\u0065\u0078\u0070\u002F\u0063\u006E\u0074\u0020\u007B\u0030\u007D\u002C\u0020\u0069\u006E\u0047\u004F\u0050\u0020\u0050\u0054\u0053\u0020\u0064\u0069\u0066\u0066\u002E\u0020\u007B\u0031\u007D\u006D\u0073\u002C\u0020\u006E\u0065\u0077\u0020\u0054\u0069\u006D\u0065\u0063\u006F\u0064\u0065 +video.msg.error.gop.dump=\u002D\u003E\u0020\u0064\u0075\u006D\u0070\u0020\u0047\u004F\u0050\u0020\u0074\u006F\u0020\u0066\u0069\u006C\u0065\u003A +video.msg.io.non=\u006E\u006F +video.msg.io.int=\u0069\u006E\u0074\u0065\u0072\u006C\u0061\u0063\u0065\u0064 +video.msg.io.pro=\u0070\u0072\u006F\u0067\u0072\u0065\u0073\u0073\u0069\u0076\u0065 +video.msg.io.int_pro=\u0069\u006E\u0074\u0065\u0072\u006C\u0061\u0063\u0065\u0064\u0020\u0026\u0020\u0070\u0072\u006F\u0067\u0072\u0065\u0073\u0073\u0069\u0076\u0065 +video.msg.length=\u002D\u003E\u0020\u0056\u0069\u0064\u0065\u006F\u0020\u006C\u0065\u006E\u0067\u0074\u0068\u003A\u0020\u007B\u0030\u007D\u0020\u0066\u0072\u0061\u006D\u0065\u0073\u0020\u0040 +video.msg.gop.summary=\u002D\u003E\u0020\u0047\u004F\u0050\u0020\u0073\u0075\u006D\u006D\u0061\u0072\u0079\u003A\u0020\u006D\u0069\u006E\u002E\u0020\u007B\u0030\u007D\u002C\u0020\u006D\u0061\u0078\u002E\u0020\u007B\u0031\u007D\u0020\u0066\u0069\u0065\u006C\u0064\u0073\u003B\u0020\u0063\u006F\u006E\u0074\u0061\u0069\u006E\u0073\u0020\u007B\u0032\u007D\u0020\u0066\u0072\u0061\u006D\u0065\u0073 +video.error.pts.same=\u002D\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u007B\u0030\u007D\u0020\u0047\u004F\u0050\u0073\u0020\u0077\u0069\u0074\u0068\u0020\u0074\u0068\u0065\u0020\u0073\u0061\u006D\u0065\u0020\u0050\u0054\u0053\u0020\u0076\u0061\u006C\u0075\u0065\u0020\u0066\u006F\u0072\u0020\u0064\u0069\u0066\u0066\u0065\u0072\u0065\u006E\u0074\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0073\u0021 +video.summary=\u002E\u0056\u0069\u0064\u0065\u006F\u0020\u007B\u0030\u007D\u003A\u005C\u0074\u007B\u0031\u007D\u0020\u0046\u0072\u0061\u006D\u0065\u0073\u005C\u0074\u007B\u0032\u007D\u005C\u0074\u005C\u0074 +video.msg.bitrate.avg=\u002D\u003E\u0020\u0061\u0076\u0067\u002E\u0020\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0020\u007B\u0030\u007D\u0062\u0070\u0073\u0020\u0028\u006D\u0069\u006E\u002F\u006D\u0061\u0078\u003A\u0020\u007B\u0031\u007D\u0029 +video.msg.bitrate.avgnom=\u002D\u003E\u0020\u0061\u0076\u0067\u002E\u0020\u006E\u006F\u006D\u002E\u0020\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0020\u007B\u0030\u007D\u0062\u0070\u0073\u0020\u0028\u006D\u0069\u006E\u002F\u006D\u0061\u0078\u003A\u0020\u007B\u0031\u007D\u0029 +video.msg.bitrate.vbr=\u002D\u003E\u0020\u0073\u0065\u0074\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0020\u0074\u006F\u0020\u0056\u0042\u0052 +video.msg.bitrate.val=\u002D\u003E\u0020\u0073\u0065\u0074\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0062\u0069\u0074\u0072\u0061\u0074\u0065\u0020\u0074\u006F\u0020\u007B\u0030\u007D\u0062\u0070\u0073 +video.msg.resolution=\u002D\u003E\u0020\u0073\u0065\u0074\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0072\u0065\u0073\u006F\u006C\u0075\u0074\u0069\u006F\u006E\u0020\u0066\u0072\u006F\u006D\u0020\u007B\u0030\u007D\u0020\u0074\u006F + +#Teletextprocess +teletext.msg.nooutput=\u0021\u003E\u0020\u006E\u006F\u0020\u006F\u0075\u0074\u0070\u0075\u0074\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u0020\u0066\u006F\u0072\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064\u002E\u002E\u002E +teletext.msg.output=\u002D\u003E\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u003A +teletext.msg.tmpfile=\u002D\u003E\u0020\u0074\u0065\u006D\u0070\u002E\u0020\u0066\u0069\u006C\u0065\u003A\u0020\u007B\u0030\u007D\u0020\u0028\u007B\u0031\u007D\u0020\u0062\u0079\u0074\u0065\u0073\u0029 +teletext.msg.page=\u0070\u0061\u0067\u0065\u0020\u006E\u0075\u006D\u0062\u0065\u0072 +teletext.msg.megaradio=\u004D\u0065\u0067\u0061\u0052\u0061\u0064\u0069\u006F\u0020\u006D\u0070\u0033\u0020\u0073\u0074\u0072\u0065\u0061\u006D +teletext.progress=\u0073\u0065\u0061\u0072\u0063\u0068\u0069\u006E\u0067\u0020\u0026\u0020\u0064\u0065\u0063\u006F\u0064\u0069\u006E\u0067 +teletext.msg.search=\u002D\u003E\u0020\u006C\u006F\u006F\u006B\u0069\u006E\u0067\u0020\u0066\u006F\u0072 +teletext.status=\u0070\u0061\u0067\u0065\u0073\u003A +teletext.msg.discard=\u0021\u003E\u0020\u007B\u0030\u007D\u0020\u0050\u0054\u0053\u0027\u0073\u0020\u0064\u0069\u0073\u0063\u0061\u0072\u0064\u0065\u0064\u0020\u0069\u006E\u0020\u0073\u0074\u0072\u0065\u0061\u006D +teletext.msg.pts.start_end=\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0050\u0054\u0053\u003A\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u007B\u0030\u007D\u002C\u0020\u006C\u0061\u0073\u0074\u0020\u0070\u0061\u0063\u006B\u0065\u0074 +teletext.msg.pts.missed=\u0021\u003E\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0073\u0074\u0072\u0065\u0061\u006D\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u0075\u0073\u0065\u0020\u0050\u0054\u0053\u0027\u0073\u002C\u0020\u0073\u0079\u006E\u0063\u0020\u0069\u006D\u0070\u006F\u0073\u0073\u0069\u0062\u006C\u0065 +teletext.msg.pts.mismatch=\u0021\u003E\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0026\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0050\u0054\u0053\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u006D\u0061\u0074\u0063\u0068\u0020\u0061\u0074\u0020\u0061\u006E\u0079\u0020\u0074\u0069\u006D\u0065\u0021 +teletext.msg.adjust.at.video=\u002D\u003E\u0061\u0064\u006A\u0075\u0073\u0074\u0069\u006E\u0067\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0061\u0074\u0020\u0076\u0069\u0064\u0065\u006F\u002D\u0074\u0069\u006D\u0065\u006C\u0069\u006E\u0065 +teletext.msg.adjust.at.own=\u002D\u003E\u0020\u0061\u0064\u006A\u0075\u0073\u0074\u0069\u006E\u0067\u0020\u0074\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0061\u0074\u0020\u0069\u0074\u0073\u0020\u006F\u0077\u006E\u0020\u0074\u0069\u006D\u0065\u006C\u0069\u006E\u0065 +teletext.msg.syncword.lost=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040 +teletext.msg.syncword.found=\u0021\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040 +teletext.msg.vps=\u002D\u003E\u0020\u0056\u0050\u0053\u0020\u0073\u0074\u0061\u0074\u0075\u0073\u003A\u0020\u007B\u0030\u007D\u0020\u0040\u0020\u0050\u0054\u0053 +teletext.msg.provider=\u002D\u003E\u0020\u0070\u0072\u006F\u0076\u0069\u0064\u0065\u0072\u003A +teletext.msg.program=\u002D\u003E\u0020\u0070\u0072\u006F\u0067\u0072\u0061\u006D\u003A +teletext.msg.summary=\u007B\u0030\u007D\u0020\u0070\u0061\u0067\u0065\u0073\u0020\u006F\u0066\u0020\u004E\u006F\u002E\u0020\u007B\u0031\u007D\u0020\u0077\u0072\u0069\u0074\u0074\u0065\u006E\u002E\u002E\u002E +teletext.summary=\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u007B\u0030\u007D\u003A\u005C\u0074\u007B\u0031\u007D\u0020\u0070\u0061\u0067\u0065\u0073\u0020\u006F\u0066\u0020\u004E\u006F\u002E\u0020\u007B\u0032\u007D\u005C\u0074\u007B\u0033\u007D\u005C\u0074 +teletext.error.eof=\u0021\u003E\u0020\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0045\u004F\u0046\u0020\u0072\u0065\u0061\u0063\u0068\u0065\u0064\u0020\u0069\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u003A +teletext.error.io=\u0021\u003E\u0020\u0054\u0065\u006C\u0065\u0074\u0065\u0078\u0074\u0020\u0049\u002F\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u003A\u0020\u007B\u0030\u007D\u0020\u002F +teletext.msg.newrun=\u002D\u003E\u0020\u0070\u0065\u0072\u0066\u006F\u0072\u006D\u0020\u0032\u006E\u0064\u0020\u0053\u0055\u0050\u0020\u0059\u006F\u0066\u0066\u0073\u0065\u0074 + +#Subpictureprocess +subpicture.msg.error3=\u0021\u003E\u0020\u0065\u0072\u0072\u006F\u0072\u0020\u0077\u0068\u0069\u006C\u0065\u0020\u0064\u0065\u0063\u006F\u0064\u0069\u006E\u0067\u0020\u0044\u0056\u0042\u0020\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065 +subpicture.msg.error4=\u0021\u003E\u0020\u006C\u0061\u0063\u006B\u0020\u006F\u0066\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0064\u0061\u0074\u0061 +subpicture.msg.error5=\u0021\u003E\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0073\u0069\u007A\u0065\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u006D\u0061\u0074\u0063\u0068\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0064\u0061\u0074\u0061 +subpicture.msg.error6=\u0021\u003E\u0020\u0077\u0072\u006F\u006E\u0067\u0020\u0063\u0068\u0075\u006E\u006B\u0020\u0070\u006F\u0073\u0069\u0074\u0069\u006F\u006E\u0020\u0069\u006E\u0064\u0065\u0078 +subpicture.msg.error7=\u0021\u003E\u0020\u0077\u0072\u006F\u006E\u0067\u0020\u0063\u0068\u0075\u006E\u006B\u0020\u0070\u006F\u0073\u0069\u0074\u0069\u006F\u006E +subpicture.msg.error8=\u0021\u003E\u0020\u0077\u0072\u006F\u006E\u0067\u0020\u0065\u006E\u0064\u0020\u006F\u0066\u0020\u0063\u0068\u0075\u006E\u006B\u0020\u0069\u006E\u0064\u0065\u0078 +subpicture.msg.error9=\u0021\u003E\u0020\u0077\u0072\u006F\u006E\u0067\u0020\u0065\u006E\u0064\u0020\u006F\u0066\u0020\u0063\u0068\u0075\u006E\u006B +subpicture.msg.model=\u002D\u003E\u0020\u0073\u0065\u006C\u0065\u0063\u0074\u0065\u0064\u0020\u0044\u0056\u0042\u0020\u0073\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0063\u006F\u006C\u006F\u0072\u0020\u006D\u006F\u0064\u0065\u006C\u003A\u0020\u007B\u0030\u007D\u0020\u003B\u0020\u0066\u0069\u0078\u0065\u0064\u0020\u0074\u006F\u0020\u0070\u0061\u0067\u0065\u0020\u0069\u0064\u003A +subpicture.msg.output=\u002D\u003E\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0020\u0066\u006F\u0072\u006D\u0061\u0074\u003A +subpicture.msg.tmpfile=\u002D\u003E\u0020\u0074\u0065\u006D\u0070\u002E\u0020\u0066\u0069\u006C\u0065\u003A\u0020\u007B\u0030\u007D\u0020\u0028\u007B\u0031\u007D\u0020\u0062\u0079\u0074\u0065\u0073\u0029 +subpicture.progress=\u0063\u0068\u0065\u0063\u006B\u0020\u0026\u0020\u0073\u0079\u006E\u0063\u0068\u0072\u006F\u006E\u0069\u007A\u0065 +subpicture.msg.discard=\u0021\u003E\u0020\u007B\u0030\u007D\u0020\u0050\u0054\u0053\u0027\u0073\u0020\u0064\u0069\u0073\u0063\u0061\u0072\u0064\u0065\u0064\u0020\u0069\u006E\u0020\u0073\u0074\u0072\u0065\u0061\u006D +subpicture.msg.pts.mismatch=\u0021\u003E\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0026\u0020\u0073\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0050\u0054\u0053\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u006D\u0061\u0074\u0063\u0068\u0020\u0061\u0074\u0020\u0061\u006E\u0079\u0020\u0074\u0069\u006D\u0065\u0021 +subpicture.msg.adjust.at.video=\u002D\u003E\u0020\u0061\u0064\u006A\u0075\u0073\u0074\u0069\u006E\u0067\u0020\u0073\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0061\u0074\u0020\u0076\u0069\u0064\u0065\u006F\u002D\u0074\u0069\u006D\u0065\u006C\u0069\u006E\u0065 +subpicture.msg.adjust.at.own=\u002D\u003E\u0020\u0061\u0064\u006A\u0075\u0073\u0074\u0069\u006E\u0067\u0020\u0073\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0061\u0074\u0020\u0069\u0074\u0073\u0020\u006F\u0077\u006E\u0020\u0074\u0069\u006D\u0065\u006C\u0069\u006E\u0065 +subpicture.msg.syncword.lost=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040 +subpicture.msg.syncword.found=\u0021\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040 +subpicture.msg.error=\u007B\u0030\u007D\u0020\u0040\u0020\u007B\u0031\u007D\u002C\u0020\u0064\u0072\u006F\u0070\u0070\u0069\u006E\u0067\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u002E\u002E\u002E +subpicture.msg.dvbsource=\u002D\u003E\u0020\u0073\u006F\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u0044\u0056\u0042\u0020\u0053\u0075\u0062\u0074\u0069\u0074\u006C\u0065\u002E\u002E\u002E +subpicture.status=\u0070\u0069\u0063\u0027\u0073\u003A +subpicture.preview.title.dvdexport=\u002F\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u007B\u0030\u007D\u0020\u002D\u003E\u0020\u0069\u006E\u003A\u0020\u007B\u0031\u007D\u0020\u0064\u0075\u0072\u0061\u0074\u0069\u006F\u006E\u003A +subpicture.preview.title.dvbexport=\u002F\u0020\u0070\u0061\u0067\u0065\u0020\u0069\u0064\u0020\u007B\u0030\u007D\u0020\u002F\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u007B\u0031\u007D\u0020\u002D\u003E\u0020\u0069\u006E\u003A\u0020\u007B\u0032\u007D\u0020\u0064\u0075\u0072\u0061\u0074\u0069\u006F\u006E\u003A +subpicture.msg.forced=\u0066\u0072\u006F\u006D\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065 +subpicture.msg.forced.no=\u002D\u003E\u0020\u0064\u0069\u0073\u0070\u006C\u0061\u0079\u0020\u0073\u0074\u0061\u0074\u0075\u0073\u003A\u0020\u006E\u006F\u0074\u0020\u0066\u006F\u0072\u0063\u0065\u0064\u002C +subpicture.msg.forced.yes=\u002D\u003E\u0020\u0064\u0069\u0073\u0070\u006C\u0061\u0079\u0020\u0073\u0074\u0061\u0074\u0075\u0073\u003A\u0020\u0066\u006F\u0072\u0063\u0065\u0064\u002C +subpicture.preview.title.noexport=\u002F\u0020\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u006E\u006F\u0074\u0020\u0065\u0078\u0070\u006F\u0072\u0074\u0065\u0064\u002E\u002E\u002E +subpicture.msg.pts.start_end=\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0050\u0054\u0053\u003A\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u007B\u0030\u007D\u002C\u0020\u006C\u0061\u0073\u0074\u0020\u0070\u0061\u0063\u006B\u0065\u0074 +subpicture.msg.summary=\u007B\u0030\u007D\u0020\u0073\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0073\u0020\u0077\u0072\u0069\u0074\u0074\u0065\u006E\u002E\u002E\u002E + +subpicture.summary=\u0053\u0075\u0062\u0050\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u007B\u0030\u007D\u003A\u005C\u0074\u007B\u0031\u007D\u0020\u0073\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0073\u005C\u0074\u007B\u0032\u007D\u005C\u0074 +subpicture.msg.error.eof=\u0021\u003E\u0020\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0045\u004F\u0046\u0020\u0072\u0065\u0061\u0063\u0068\u0065\u0064\u0020\u0069\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u003A +subpicture.msg.error.io=\u0021\u003E\u0020\u0053\u0075\u0062\u0070\u0069\u0063\u0074\u0075\u0072\u0065\u0020\u0049\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u0020\u007B\u0030\u007D\u0020\u002F +subpicture.msg.error.dvbdecoding=\u0021\u003E\u0020\u0064\u0065\u0063\u006F\u0064\u0069\u006E\u0067\u0020\u0065\u0072\u0072\u006F\u0072\u003A\u0020\u007B\u0030\u007D\u002C\u0020\u0052\u0065\u0067\u0069\u006F\u006E\u005F\u0049\u0064\u0020\u007B\u0031\u007D\u0020\u0028\u0070\u0074\u0073\u0020\u007B\u0032\u007D\u0029 + +#LPCMprocess +lpcm.msg.develop=\u002E\u002E\u002E\u0075\u006E\u0064\u0065\u0072\u0020\u0064\u0065\u0076\u0065\u006C\u006F\u0070\u006D\u0065\u006E\u0074\u002E\u002E\u002E +lpcm.msg.tmpfile=\u002D\u003E\u0020\u0074\u0065\u006D\u0070\u002E\u0020\u0066\u0069\u006C\u0065\u003A\u0020\u007B\u0030\u007D\u0020\u0028\u007B\u0031\u007D\u0020\u0062\u0079\u0074\u0065\u0073\u0029 +lpcm.progress=\u0063\u0068\u0065\u0063\u006B\u0020\u0026\u0020\u0073\u0079\u006E\u0063\u0068\u0072\u006F\u006E\u0069\u007A\u0065 +lpcm.msg.pts.mismatch=\u0021\u003E\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0026\u0020\u004C\u0050\u0043\u004D\u0020\u0050\u0054\u0053\u0020\u0064\u006F\u0065\u0073\u006E\u0027\u0074\u0020\u006D\u0061\u0074\u0063\u0068\u0020\u0061\u0074\u0020\u0061\u006E\u0079\u0020\u0074\u0069\u006D\u0065\u0021 +lpcm.msg.adjust.at.video=\u002D\u003E\u0020\u0061\u0064\u006A\u0075\u0073\u0074\u0069\u006E\u0067\u0020\u004C\u0050\u0043\u004D\u0020\u0061\u0074\u0020\u0076\u0069\u0064\u0065\u006F\u002D\u0074\u0069\u006D\u0065\u006C\u0069\u006E\u0065 +lpcm.msg.adjust.at.own=\u002D\u003E\u0020\u0061\u0064\u006A\u0075\u0073\u0074\u0069\u006E\u0067\u0020\u004C\u0050\u0043\u004D\u0020\u0061\u0074\u0020\u0069\u0074\u0073\u0020\u006F\u0077\u006E\u0020\u0074\u0069\u006D\u0065\u006C\u0069\u006E\u0065 +lpcm.msg.syncword.lost=\u0021\u003E\u0020\u006D\u0069\u0073\u0073\u0069\u006E\u0067\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040 +lpcm.msg.syncword.found=\u0021\u003E\u0020\u0066\u006F\u0075\u006E\u0064\u0020\u0073\u0079\u006E\u0063\u0077\u006F\u0072\u0064\u0020\u0040 +lpcm.msg.source=\u002D\u003E\u0020\u0073\u0072\u0063\u005F\u0061\u0075\u0064\u0069\u006F\u003A\u0020\u007B\u0030\u007D\u0020\u0040 +lpcm.msg.source.max=\u002D\u003E\u0020\u0073\u0072\u0063\u005F\u0061\u0075\u0064\u0069\u006F\u003A\u0020\u0073\u0074\u006F\u0070\u0020\u0064\u0069\u0073\u0070\u006C\u0061\u0079\u0069\u006E\u0067\u002C\u0020\u006D\u006F\u0072\u0065\u0020\u0074\u0068\u0061\u006E\u0020\u0031\u0030\u0030\u0020\u0061\u0075\u0064\u0069\u006F\u0020\u006D\u006F\u0064\u0065\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0073\u0020\u0069\u006E\u0020\u006F\u006E\u0065\u0020\u0066\u0069\u006C\u0065\u0020\u0072\u0065\u0064\u0075\u0063\u0065\u0020\u0077\u006F\u0072\u006B\u0020\u0073\u0070\u0065\u0065\u0064 +lpcm.msg.error.align=\u0021\u003E\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u006E\u006F\u0074\u0020\u0057\u004F\u0052\u0044\u0020\u0061\u006C\u0069\u0067\u006E\u0065\u0064 +lpcm.msg.pts.start_end=\u004C\u0050\u0043\u004D\u0020\u0050\u0054\u0053\u003A\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u007B\u0030\u007D\u002C\u0020\u006C\u0061\u0073\u0074\u0020\u0070\u0061\u0063\u006B\u0065\u0074 +lpcm.msg.summary=\u007B\u0030\u007D\u0020\u0070\u0061\u0063\u006B\u0073\u0020\u0077\u0072\u0069\u0074\u0074\u0065\u006E\u002E\u002E\u002E +lpcm.summary=\u004C\u0050\u0043\u004D\u0020\u007B\u0030\u007D\u003A\u005C\u0074\u007B\u0031\u007D\u0020\u0070\u0061\u0063\u006B\u0073\u005C\u0074\u007B\u0032\u007D\u005C\u0074 +lpcm.error.eof=\u0021\u003E\u0020\u004C\u0050\u0043\u004D\u0020\u0045\u004F\u0046\u0020\u0072\u0065\u0061\u0063\u0068\u0065\u0064\u0020\u0069\u006E\u0020\u0065\u0072\u0072\u006F\u0072\u003A +lpcm.error.io=\u0021\u003E\u0020\u004C\u0050\u0043\u004D\u0020\u0049\u004F\u0020\u0065\u0072\u0072\u006F\u0072\u003A\u0020\u007B\u0030\u007D\u0020\u002F + +#various +all.msg.pts.faked=\u002D\u002D\u003E\u0020\u0075\u0073\u0069\u006E\u0067\u0020\u0066\u0061\u006B\u0065\u0064\u0020\u0050\u0054\u0053\u0020\u0066\u006F\u0072\u0020\u0066\u006F\u006C\u006C\u006F\u0077\u0069\u006E\u0067\u0020\u0064\u0061\u0074\u0061\u003A +logalias.error.io=\u0021\u003E\u0020\u004C\u006F\u0067\u0061\u006C\u0069\u0061\u0073\u0020\u0049\u004F\u0020\u0045\u0072\u0072\u006F\u0072\u003A + +#demux +demux.error.audio.startcode=\u0021\u003E\u0020\u0069\u006E\u0076\u0061\u006C\u0069\u0064\u0020\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u002C\u0020\u0072\u0065\u0066\u0075\u0073\u0065\u0020\u0050\u0045\u0053\u0020\u0070\u0061\u0063\u006B\u0065\u0074 +demux.error.audio.io=\u0021\u003E\u0020\u0064\u0065\u006D\u0075\u0078\u0020\u0041\u0075\u0064\u0069\u006F\u0020\u0065\u0072\u0072\u006F\u0072\u003A +demux.error.video.io=\u0021\u003E\u0020\u0064\u0065\u006D\u0075\u0078\u0020\u0056\u0069\u0064\u0065\u006F\u0020\u0065\u0072\u0072\u006F\u0072\u003A +demux.msg.celltimes=\u002D\u002D\u003E\u0020\u0043\u0065\u006C\u006C\u0074\u0069\u006D\u0065\u0073\u0020\u0069\u006E\u003A\u0020\u007B\u0030\u007D\u0043\u0065\u006C\u006C\u0054\u0069\u006D\u0065\u0073\u002E\u0074\u0078\u0074 +demux.error.video.startcode=\u0021\u003E\u0020\u0069\u006E\u0076\u0061\u006C\u0069\u0064\u0020\u0073\u0074\u0061\u0072\u0074\u0063\u006F\u0064\u0065\u002C\u0020\u0072\u0065\u0066\u0075\u0073\u0065\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0050\u0045\u0053\u0020\u0070\u0061\u0063\u006B\u0065\u0074 +demux.error.video.payload=\u0021\u003E\u0020\u0069\u006E\u0063\u006F\u006D\u0069\u006E\u0067\u0020\u0050\u0045\u0053\u0020\u0070\u0061\u0063\u006B\u0065\u0074\u0020\u0077\u0069\u0074\u0068\u006F\u0075\u0074\u0020\u0070\u0061\u0079\u006C\u006F\u0061\u0064\u0020\u006F\u0072\u0020\u0077\u0072\u006F\u006E\u0067\u0020\u0068\u0065\u0061\u0064\u0065\u0072\u0020\u0064\u0061\u0074\u0061 +demux.msg.skip.sec=\u002D\u003E\u0020\u0073\u006B\u0069\u0070\u0020\u0073\u0065\u0071\u0075\u0065\u006E\u0063\u0065\u005F\u0065\u006E\u0064\u005F\u0063\u006F\u0064\u0065\u0020\u0066\u006F\u006C\u006C\u006F\u0077\u0069\u006E\u0067\u0020\u0047\u004F\u0050\u0023 +demux.error.gop.toobig=\u002D\u003E\u0020\u0064\u0072\u006F\u0070\u0070\u0069\u006E\u0067\u0020\u0076\u0069\u0064\u0065\u006F\u0020\u0064\u0061\u0074\u0061\u002C\u0020\u0047\u004F\u0050\u0020\u006C\u0061\u0072\u0067\u0065\u0072\u0020\u0074\u0068\u0061\u006E\u0020\u0036\u004D\u0042 + +#ftpchooser +ftpchooser.server.tip=\u004E\u0061\u006D\u0065\u0020\u006F\u0072\u0020\u0049\u0050\u0020\u0061\u0064\u0072\u0065\u0073\u0073\u0020\u006F\u0066\u0020\u0066\u0074\u0070\u0020\u0073\u0065\u0072\u0076\u0065\u0072 +ftpchooser.server=\u0053\u0065\u0072\u0076\u0065\u0072\u003A +ftpchooser.port.tip=\u0050\u006F\u0072\u0074\u0020\u006F\u0066\u0020\u0066\u0074\u0070\u0020\u0073\u0065\u0072\u0076\u0065\u0072 +ftpchooser.port=\u0050\u006F\u0072\u0074\u003A +ftpchooser.user.tip=\u0055\u0073\u0065\u0072\u0020\u0066\u006F\u0072\u0020\u0066\u0074\u0070\u0020\u0063\u006F\u006E\u006E\u0065\u0063\u0074\u0069\u006F\u006E +ftpchooser.user=\u0055\u0073\u0065\u0072\u003A +ftpchooser.password.tip=\u0050\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u0020\u0066\u006F\u0072\u0020\u0066\u0074\u0070\u0020\u0063\u006F\u006E\u006E\u0065\u0063\u0074\u0069\u006F\u006E +ftpchooser.password=\u0050\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u003A +ftpchooser.directory.tip=\u0044\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u0020\u006F\u006E\u0020\u0066\u0074\u0070\u0020\u0073\u0065\u0072\u0076\u0065\u0072 +ftpchooser.directory=\u0044\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u003A +ftpchooser.test=\u0054\u0065\u0073\u0074 +ftpchooser.state.tip=\u0053\u0074\u0061\u0074\u0065 +ftpchooser.state=\u0053\u0074\u0061\u0074\u0065\u003A +ftpchooser.untested=\u0075\u006E\u0074\u0065\u0073\u0074\u0065\u0064\u002C\u0020\u0074\u0072\u0079\u0020\u0074\u006F\u0020\u0063\u006F\u006E\u006E\u0065\u0063\u0074 +ftpchooser.ok=\u004F\u004B +ftpchooser.cancel=\u0043\u0061\u006E\u0063\u0065\u006C +ftpchooser.title=\u0063\u0068\u006F\u006F\u0073\u0065\u0020\u0066\u0074\u0070\u0020\u0073\u0065\u0072\u0076\u0065\u0072 +ftpchooser.msg.noconnect=\u0043\u0061\u006E\u0027\u0074\u0020\u0063\u006F\u006E\u006E\u0065\u0063\u0074\u002E +ftpchooser.msg.nologin=\u0043\u0061\u006E\u0027\u0074\u0020\u006C\u006F\u0067\u0069\u006E\u002E +ftpchooser.msg.nodirectory=\u0043\u0061\u006E\u0027\u0074\u0020\u0063\u0068\u0061\u006E\u0067\u0065\u0020\u0074\u006F\u0020\u0064\u0069\u0072\u0065\u0063\u0074\u006F\u0072\u0079\u002E +ftpchooser.msg.success=\u0045\u0076\u0065\u0072\u0079\u0074\u0068\u0069\u006E\u0067\u0020\u0069\u0073\u0020\u0066\u0069\u006E\u0065\u002E +ftp.command.label=\u0046\u0054\u0050\u0020\u0063\u006F\u006D\u006D\u0061\u006E\u0064\u003A +ftp.command.tip=\u0075\u0073\u0065\u0072\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0063\u0020\u0046\u0054\u0050\u0020\u0063\u006F\u006D\u006D\u0061\u006E\u0064\u0073\u0020\u0066\u006F\u0072\u0020\u0046\u0054\u0050\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u002C\u0020\u0066\u006F\u0072\u0020\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0020\u0063\u006F\u006D\u006D\u0061\u006E\u0064\u0073\u0020\u0075\u0073\u0065\u0020\u0064\u0065\u006C\u0069\u006D\u0069\u0074\u0065\u0072\u0020\u0027\u007C\u0027 +FtpServer.Commands=\u0046\u0054\u0050\u0020\u0063\u006F\u006D\u006D\u0061\u006E\u0064\u003A +FtpServer.Commands.Tip=\u0075\u0073\u0065\u0072\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0063\u0020\u0046\u0054\u0050\u0020\u0063\u006F\u006D\u006D\u0061\u006E\u0064\u0073\u0020\u0066\u006F\u0072\u0020\u0046\u0054\u0050\u0020\u0061\u0063\u0063\u0065\u0073\u0073\u002C\u0020\u0066\u006F\u0072\u0020\u006D\u0075\u006C\u0074\u0069\u0070\u006C\u0065\u0020\u0063\u006F\u006D\u006D\u0061\u006E\u0064\u0073\u0020\u0075\u0073\u0065\u0020\u0064\u0065\u006C\u0069\u006D\u0069\u0074\u0065\u0072\u0020\u0027\u007C\u0027 +FtpPanel.Title=\u0046\u0054\u0050\u0020\u0053\u0065\u0074\u0074\u0069\u006E\u0067\u0073 + + + +#JobCollection +JobCollection.NoInfo=\u006E\u006F\u0020\u0049\u006E\u0066\u006F +JobCollection.InProgress=\u0049\u006E\u0020\u0050\u0072\u006F\u0067\u0072\u0065\u0073\u0073\u0074\u0021 +JobCollection.Idle=\u0049\u0064\u006C\u0065\u002E +JobCollection.Action=\u0041\u0063\u0074\u0069\u006F\u006E\u003A +JobCollection.unspecified=\u006E\u006F\u0074\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u002E +JobCollection.PrimaryFileSegments=\u0046\u0069\u006C\u0065\u0053\u0065\u0067\u006D\u0065\u006E\u0074\u0073\u003A +JobCollection.SecondaryFiles=\u0073\u0065\u0063\u006F\u006E\u0064\u002E\u0020\u0046\u0069\u006C\u0065\u0073\u003A +JobCollection.Cutpoints=\u0043\u0075\u0074\u0070\u006F\u0069\u006E\u0074\u0073\u003A +JobCollection.Chapters=\u0043\u0068\u0061\u0070\u0074\u0065\u0072\u0073\u003A +JobCollection.PidSelection=\u0050\u0049\u0044\u002D\u0053\u0065\u006C\u0065\u0063\u0074\u0069\u006F\u006E\u003A +JobCollection.OwnSettings=\u0073\u0065\u0070\u002E\u0053\u0065\u0074\u0074\u0069\u006E\u0067\u0073\u003A +JobCollection.AllSize=\u0053\u0069\u007A\u0065\u0020\u005C\u0075\u0030\u0033\u0041\u0033\u003A + +#CollectionTable +CollectionTable.FileLocation=\u004C\u006F\u0063\u0061\u0074\u0069\u006F\u006E +CollectionTable.FileName=\u0046\u0069\u006C\u0065\u006E\u0061\u006D\u0065 +CollectionTable.Size=\u0053\u0069\u007A\u0065 +CollectionTable.lastModified=\u006C\u0061\u0073\u0074\u004D\u006F\u0064\u0069\u0066\u0069\u0065\u0064 +CollectionTable.Streamtype=\u0053\u0074\u0072\u0065\u0061\u006D\u0074\u0079\u0070\u0065 +CollectionTable.Source=\u0053\u0072\u0063 diff -Nru project-x-0.90.4dfsg/resources/pjxresources_de.properties project-x-0.91.0/resources/pjxresources_de.properties --- project-x-0.90.4dfsg/resources/pjxresources_de.properties 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/resources/pjxresources_de.properties 2009-10-03 09:22:38.000000000 +0000 @@ -0,0 +1,1288 @@ +# Project-X Resource File +# deutsch, V 1.2 +# by pstorch, dvb.matt + +# +Common.File=&Datei +Common.Save=&Speichern +Common.SaveAs=Speichern &unter.. +Common.Open=ヨ&ffnen.. +Common.Load=&Laden.. +Common.Edit=&Bearbeiten +Common.Messages=&Meldungen +Common.Options=&Optionen +Common.Close=&Schlie゚en +Common.Cancel=Abbre&chen +Common.Exit=B&eenden +Common.LogFile=&Logdatei +Common.Preferences=&Einstellungen +Common.Addons=Addo&ns +Common.CloseAndRevert=Zu&rcksetzen +Common.Preprocess=Datei&vorbearbeitung +Common.KillProcess=Prozessabbruch erzwingen + +General.Yes=Ja +General.No=Nein +General.FileProperties=Dateieigenschaften +General.CollectionProperties=Kollektionseigenschaften +General.CollectionProperties.Hint=Einstellungen gelten nur fr diese Kollektion +General.FileTable=Dateiliste +General.CutControl=Schnittsteuerung +General.FilterControl=Filtersteuerung + +StartUp.Title=X Startup, lade Komponenten... +StartUp.Error=Fehler beim starten von Project-X: +StartUp.Error.Title=Project-X Startup Fehler +StartUp.Init=Initialisierung. +StartUp.Wait=Bitte warten... +StartUp.Choose=Option w臧len... + +# +PreferencesPanel.Title=Voreinstellungen +PreferencesPanel.Button=Voreinstellungen + +# +FilterPanel.ResetAll=alles zurcksetzen +FilterPanel.MoreSettings=weitere Einstellungen.. + +Application.SaveSettingsOnExit=Einstellungen beim Beenden speichern +Application.InputDirectoriesDepth=erweitern auf Unterverzeichnisse (FILE + FTP) +Application.InputDirectoriesDepth.Tip=Liste erweitern auf alle Unterverzeichnisse (FILE + FTP) + +# Popupmenu +popup.what=was +popup.cutspecials=ffne Schnitt/Specials.. +popup.url=URL hinzufgen.. +popup.add=hinzufgen.. +popup.remove=entfernen +popup.newOutName=Ausgabe als.. +popup.rename=umbenennen.. +popup.openhex=ffnen in Hexviewer.. +popup.opensup=ffnen in Untertitelvorschau.. +popup.patchbasics=bearbeite Video Basics.. +popup.sendtocl3=senden an CL#3.. +popup.changeTimestamp=Datei-Zeitstempel aktualisieren.. +popup.copyInfoToClipboard=Datei-Info in Zwischenablage kopieren +popup.assignStreamType=Stromtyp direkt zuweisen.. +popup.assignActionType=Aktion direkt zuweisen.. +popup.unspecified=nicht spezifiziert +popup.automatic=automatisch +popup.fixHpAc3=korrigierte Hpョ ac3 Datei erstellen.. +popup.stripAudio=Tondaten aus DD/DTS-Wave filtern.. + +#Filechooser +FileChooser.Select=Ausw臧len +FileChooser.Title=Auswahl + +#dialog +dialog.input.url=URL eingeben.. + +#File Menu +file.menu=&Datei +file.url=UR&L hinzufgen.. +file.add=&Hinzufgen.. +file.remove=Entfe&rnen +file.rename=&Umbenennen.. +file.exit=&Schlie゚en + +#Settings Menu +settings.menu=&Einstellungen +settings.settings=&Einstellungen.. + +#Language Menu +language.menu=&Sprache +language.system=S&ystem Standard +language.check=check &online + +#General Menu +general.menu=&Ansicht + +#Options Menu +options.menu=&Bearbeiten +options.opencutspecials=ffne Videoschnitt/&Specials.. +options.openhexview=ffne in &HexViewer.. +options.pachtbasics=&patch Video Basics.. +options.subtitlepreview=zeige &Untertitel Vorschau.. +options.teletext=zeige &Teletext Seitenmatrix.. + +#Help Menu +help.menu=&Hilfe +help.about=&ワber ProjectX.. +help.help=&Hilfe.. +help.version=&Versions-Check online +help.version.info=Neueste Version: +help.version.info.title=Neueste Version von Project-X +help.version.error=Fehler beim Prfen auf die neueste Project-X Version: + +progress.title=Progress + +#Html Frame +html.title=Hilfe + +#Buttons +button.go=&Los! +button.go.Tip=startet, pausiert oder setzt den aktuellen Prozess fort +button.i=&I +button.i.Tip=kurze Bearbeitung/Scan der Eingabedaten (im spezifizierten Dateibereich, siehe Kartei ) +button.c=&C +button.c.Tip=beendet den aktuellen Prozess +button.p=&P +button.p.Tip=unterbricht den aktuellen Prozess oder setzt ihn fort +button.e=&E +button.e.Tip=PVA raw-Datei Extraktion, unter Angabe einer unten gelisteten ID: (drcke 'I' um enthaltene IDs zu finden) + +#Mainpanel +MainPanel.Process=Prozess +MainPanel.Process.Tip=anstatt demultiplex, wandeln von einem Streamformat in ein anderes (dann Inhaltskopie ohne Korrekturen) +MainPanel.BitrateMonitor.Tip=aktuelle Bitrate der GOP, von 0...10 Mbps (abh舅gig von der Berechnungsart) / GOP-Structur / Spielzeit +MainPanel.writtenMB=exp. MB +MainPanel.writtenMB.Tip=Summe der geschriebenen MB's aller neu erstellten Dateien der aktiven Kollektion (ohne temp. Dateien) +MainPanel.useAllCollections=alle Kollektionen nacheinander bearbeiten +MainPanel.useAllCollections.Tip=aktivieren, um alle Kollektionen in einem Durchgang abzuarbeiten +MainPanel.enablePostProcessing=Nachbearbeitung aktivieren +MainPanel.enablePostProcessing.Tip=aktiviere Nachbearbeitung (-> siehe Tool-Dialog bei Kartei 'Extern') +MainPanel.PostProcessCompletion=auf Beendigung des Subprozesses warten +MainPanel.PostProcessCompletion.Tip=auf Beendigung des Subprozesses warten +MainPanel.simpleMPG=MPG=>sPES +MainPanel.simpleMPG.Tip=vereinfachte PES-Zerlegung; aktivieren fr MPEG-PS Daten ohne regul舐e Unterteilung des private_stream_1 +MainPanel.enhancedPES=sPES=>MPG +MainPanel.enhancedPES.Tip=erweiterte PES-Zerlegung; aktivieren fr PES Daten mit Unterteilung des private_stream_1 +MainPanel.useAutoPidFilter=Filter auf PMT-PIDs anwenden +MainPanel.useAutoPidFilter.Tip=ignoriert nicht verlinkte PIDs in MP-TS Dateien +MainPanel.nonVideoExportStatus=nicht gestartet +MainPanel.nonVideoExportStatus.Tip=Status des Exports von Audiodaten oder Untertiteln +MainPanel.AudioVideoOffset=A/V Abstand +MainPanel.AudioVideoOffset.Tip=zeigt den A/V Zeitabstand zu Beginn jeder GOP in ms: a/b/c

(Schnitte,variable GOPs lassen den Abstand variieren)

a) A/V PTS Abstand in den Quelldaten

b) momentaner A/V Abstand in der aktuellen GOP in den demultiplexten Dateien

c) endgltiger A/V Abstand in der aktuellen GOP in den demultiplexten Dateien +MainPanel.ConversionMode.demux=demultiplex +MainPanel.ConversionMode.toVDR=zu VDR +MainPanel.ConversionMode.toM2P=zu M2P +MainPanel.ConversionMode.toPVA=zu PVA +MainPanel.ConversionMode.toTS=zu TS +MainPanel.ConversionMode.PidFilter=PIDFilter +MainPanel.ConversionMode.binaryCopy=1:1 Direktkopie +MainPanel.ConversionModePriority=Kollektionseinstellung hat Vorrang +MainPanel.ConversionModePriority.Tip=Vorrang hat Kollektionseinstellung +MainPanel.Collection=Kollektionen +MainPanel.QuickStart=QuickStart +MainPanel.QuickStart.Tip=startet den Prozess direkt mit den letzten aktiven Einstellungen + +#usage note +usage=kurze CL (Kommandozeilen) Hilfe: \n\ +Hinweis: CL laedt kein GUI (Swing), ausser bei Option [-gui]\n\ + ...startet die graphische Oberflaeche\n\ +Reihenfolge der Kommandostrings ist beliebig, nicht erkannte Optionen gelten als Eingabedatei\n\ +\n\ +Optionen: \n\ +[-ini ] ..verwendet eine andere Konfigurationsdatei als die Standard X.ini\n\ +[-dvx1] ..erstelle eine .d2v Projektdatei beim demuxen\n\ +[-dvx2] ..erstelle eine .d2v Projektdatei + .ac3.wav (RIFF WAVE Header)\n\ +[-dvx3] ..erstelle eine .d2v Projektdatei + .mpa.wav (RIFF WAVE Header)\n\ +[-dvx4] ..erstelle eine .d2v Projektdatei + .ac3.wav + mpa.wav (RIFF WAVE Header)\n\ +[-out ] ..benutze diesen Pfad als Ausgabepfad\n\ +[-name ] ..benutze diesen Dateinamen fuer Ausgabedatei\n\ +[-cut ] ..nutze diese Datei als Schnittliste\n\ +[-chp ] ..nutze diese Datei als Kapitelliste\n\ +[-id ] ..benutze nur diese (P)IDs, getrennt durch Komma \",\"\n\ +[-gui] ..oeffne GUI mit den angegebenen CLI Optionen\n\ +[-log] ..schreibe eine normale Logdatei\n\ +[-saveini] ..bei CLI Aufruf geaenderte Einstellungen speichern\n\ +[-split ] ..Ausgabe teilen bei xxx MB\n\ +[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..Aktionstypen + +#conditions +terms=\n\ +NUTZUNGSBEDINGUNGEN:\n\ +(1) Dies ist ein freies Java demux Werkzeug.\n\ +(2) Es ist fr Ausbildungszwecke, als Nicht-Kommerzielles Testprojekt gedacht.\n\ +(3) Verffentlicht unter der Lizenz der GNU GPL.\n\ +(4) Die Software beinhaltet KEINE GARANTIE jeglicher Art.\n\ +(5) Nutzung auf eigenes Risiko und fr das Selbststudium.\n\ + +terms.disagree=Ich nehme nicht an (schlie゚en) +terms.agree=Ich nehme an + + +about.title=ワber.. +about.ok=Ok + +#version info +version.info=REINES TESTPROJEKT +version.user=, Benutzer: + +#JavaEV +javaev.java.version=Java.Version +javaev.java.vendor=Java.Herst. +javaev.java.home=Java.Pfad +javaev.java.vm.version=Java.VM.Vers. +javaev.java.vm.vendor=Java.VM.Herst. +javaev.java.vm.name=Java.VM.Name +javaev.java.class.vers=Java.Kl.Vers +javaev.java.class.path=Java.Kl.Pfad +javaev.java.os.name=BS.Name +javaev.java.os.arch=BS.Archit. +javaev.java.os.version=BS.Version +javaev.java.user.name=Benutz.Name +javaev.java.user.home=Benutz.Pfad +javaev.java.user.lang=Benutz.Sprache +javaev.java.ini.file=ini.Datei +javaev.java.disk.access=ext.Disk.Zugriff + +#messages +msg.infomessage=Information +msg.new.language=Die Auswahl der Sprache erfordert einen Neustart von Project-X. +msg.loadlang.error=Fehler beim Laden der Spracheinstellung +msg.init.error=Initialisierungsfehler: +msg.loadini.error=Fehler beim Laden der ini Datei: +msg.saveini.error=Fehler beim Schreiben der ini Datei: +msg.loading.cutpoints=-> lade {0} Schnittpunkte... +msg.loading.cutpoints.error=Fehler beim Laden der Schnittpunkte +msg.loading.pids=-> lade {0} (P)IDs... +msg.ptsfile.error=..ptsdatei Zugriffsfehler: +msg.savecut=-> schreibe Schnitt PTS Wert ({0}) in Datei.. +msg.savecut.error=Fehler beim Speichern des Schnittpunkts: +msg.log.error=Fehler in Protokollierung: +msg.cuts.cutin=-> Export gestartet bei GOP# {0} / neue Bildnr. {1} / neuer Zeitindex {2} +msg.cuts.cutout=-> Export gestoppt bei GOP# {0} +msg.newfile=---> neue Datei: +msg.browser.launcher.error=Fehler beim Starten des Browsers: +msg.overwrite=Datei berschreiben: {0} ? + +#Hex Viewer +hexviewer.title=Hex Ansicht +hexviewer.file=Hex Ansicht fr Datei +hexviewer.filesize= Gr゚e +hexviewer.error=..Dateizugriff nicht mglich +hexviewer.save=Hex Ansicht, speichere +hexviewer.close=schlie゚en +hexviewer.to=bis +hexviewer.extractfrom=extrahiere von: (hex.) +hexviewer.extractfrom.Tip=drcken, um gew臧lten Bereich in eine neue Datei zu extrahieren +hexviewer.extract.Tip=extrahiere Dateiausschnitt in eine neue Datei +hexviewer.jumptohex=Springe zu Hex.: +hexviewer.jumptodec=Springe zu Dec.: +hexviewer.jumpto.Tip=Return-Taste drcken um zur Dateiposition zu springen +hexviewer.textmode=Textmodus + +#TeletextPageMatrix +ttpagematrix.title=Teletext Seitenmatrix +ttpagematrix.Tip=reduziert Arbeitsgeschwindigkeit, wenn sichtbar +ttpagematrix.file=Datei +ttpagematrix.composition1=Teletext Seitennummer Zusammenstellung +ttpagematrix.composition2='MXY' : M = Magazinnummer, XY = Seitennummer +ttpagematrix.composition3=Magazinnummer Farben + +#Scan +scan.unsupported=unbekannt +scan.msg1=kein Video gefunden beim kurzen Scan +scan.msg2=kein Audio gefunden beim kurzen Scan +scan.msg3=kein Teletext gefunden beim kurzen Scan +scan.msg4=keine Untertitel gefunden beim kurzen Scan +scan.msg5=keine PMT gefunden +scan.msg6=PMT Analysefehler (Sprachzuordnung) +scan.msg7=Videodaten ohne Sequenceheader gefunden beim kurzen Scan +scan.msg8=Analysefehler +scan.msg9=Datei startet nicht mit einem Sequenceheader! + +#TS +ts.msg1=!> keine Programm-IDs gefunden! ..benutze Standard-PMT + +#WSS +wss.run_in=Run-In-Code gefunden +wss.no_run_in=keinen Run-In-Code gefunden +wss.startcode=Start-Code gefunden +wss.no_startcode=keinen Start-Code gefunden +wss.start=startet +wss.group_1=Gruppe 1 (Bildformat) +wss.group_2=Gruppe 2 (Bildverbesserungen) +wss.group_3=Gruppe 3 (Untertitel) +wss.group_4=Gruppe 4 (andere) +wss.group_1.0001=4:3 full format, 576 lines, full screen +wss.group_1.1000=14:9 letterbox, 504 lines, center +wss.group_1.0100=14:9 letterbox, 504 lines, top +wss.group_1.1101=16:9 letterbox, 432 lines, center +wss.group_1.0010=16:9 letterbox, 432 lines, top +wss.group_1.0111=14:9 full format, 576 lines, center, full screen +wss.group_1.1110=16:9 full format, 576 lines, full screen +wss.group_1.error=error parsing group 1 (bits0..3) +wss.group_2.0.01=camera mode +wss.group_2.0.10=film mode +wss.group_2.0.00=error parsing bit4 +wss.group_2.1.01=standard PAL +wss.group_2.1.10=MACP (motion adaptive color plus) +wss.group_2.1.00=error parsing bit5 +wss.group_2.2.01=no helper +wss.group_2.2.10=helper modulation (PALplus) +wss.group_2.2.00=error parsing bit6 +wss.group_2.3.01=reserved (0) +wss.group_2.3.10=reserved (1) +wss.group_2.3.00=error parsing bit7 +wss.group_3.0.01=no subtitles in teletext +wss.group_3.0.10=subtitles in teletext +wss.group_3.0.00=error parsing bit8 +wss.group_3.1.00=no 'open subtitles' +wss.group_3.1.01='open subtitles' inside active picture +wss.group_3.1.10='open subtitles' outside active picture +wss.group_3.1.11=reserved (11) +wss.group_3.1.err=error parsing bit9..10 +wss.group_4.0.01=no surround sound +wss.group_4.0.10=surround sound +wss.group_4.0.00=error parsing bit11 +wss.group_4.1.01=no copyright/unknown +wss.group_4.1.10=copyright asserted +wss.group_4.1.00=error parsing bit12 +wss.group_4.2.01=copying not restricted +wss.group_4.2.10=copying restricted +wss.group_4.2.00=error parsing bit13 +wss.group_4.1.err=error parsing bit12..13 + +#Subpicture +subpicture.title=Untertitel Vorschau +subpicture.in_time=in +subpicture.duration=Dauer +subpicture.msg1=!> Untertitel, Exportfehler +subpicture.msg2=!> einfaches Paket (Daueranzeige) +subpicture.msg3=!> unbekanntes Kommando + +#RawRead +rawread.msg1=deaktiviert oder Programmbibliothek nicht gefunden + +#Common +common.rename_error1=!> Umbenennen fehlgeschlagen: +common.rename_error2=nach + +#TabPanel +TabPanel.LogwindowPanel=Log +TabPanel.FileinfoPanel=Info +TabPanel.ExportPanel=Ausgabe +TabPanel.SpecialPanel=Erweitert +TabPanel.VideoPanel=Video +TabPanel.AudioPanel=Audio +TabPanel.SubtitlePanel=Untertitel +TabPanel.ExternPanel=Extern +TabPanel.OptionPanel=Optionen +TabPanel.PostCommandsPanel=Nachbearbeitung +TabPanel.NetPanel=Net + +#Tab.Ftp +FtpPanel.Title=FTP Voreinstellungen + +#Tab.logwindow +ProcessWindow.Title=Prozessfenster +ProcessWindowPanel.Button=anpassen.. +ProcessWindowPanel.Title=Logmeldungen +ProcessWindowPanel.Action=Aktion: +LogwindowPanel.showTtxHeader=TTX +LogwindowPanel.showTtxHeader.Tip=zeigt die Teletext Kopfzeile und den VPS Status beim Dekodieren (verringert die Geschwindigkeit) +LogwindowPanel.showTtxHeader.Tip1=Teletext-Kopfzeile der aktuell dekodierten Tafel (Zeile 0) +LogwindowPanel.showVpsLabel.Tip=VPS Status (VBI-Zeile 16), ein paar Stationen strahlen 'sinnvolle' VPS Daten via DVB-Teletext aus + +#Tab.msg +MessagePanel.Title=Meldungen steuern +MessagePanel.logSequenceError=Sequenz-/Bitfehler melden +MessagePanel.logSequenceError.Tip=deaktivieren, wenn diese Meldungen sehr h舫fig kommen und die Geschwindigkeit stark reduzieren +MessagePanel.logMissingStartcode=fehlende Startcodes/Synchronisationswrter melden +MessagePanel.logMissingStartcode.Tip=deaktivieren, wenn diese Meldungen sehr h舫fig kommen und die Geschwindigkeit stark reduzieren +MessagePanel.logESError=Fehler in Elementarstream melden +MessagePanel.logESError.Tip=deaktivieren, wenn diese Meldungen sehr h舫fig kommen und die Geschwindigkeit stark reduzieren +MessagePanel.leadingTimeIndex=Zeitindex vom Prozess zu allen Log-Meldungen hinzufgen +MessagePanel.leadingTimeIndex.Tip= +MessagePanel.logWSS=WSS mitloggen +MessagePanel.logWSS.Tip= +MessagePanel.logVPS=VPS mitloggen +MessagePanel.logVPS.Tip= +MessagePanel.logRDS=RDS mitloggen +MessagePanel.logRDS.Tip= +MessagePanel.hideProcessWindow=Prozessfenster nach Start verstecken +MessagePanel.hideProcessWindow.Tip= +MessagePanel.minimizeMainFrame=Hauptfenster nach Start minimieren +MessagePanel.minimizeMainFrame.Tip= +MessagePanel.showSubpictureWindow=Untertitelvorschau bei UT-Bildexport zeigen +MessagePanel.showSubpictureWindow.Tip= +MessagePanel.logErrorMaximum=max. 500 Warnungen/Fehler ausgeben +MessagePanel.logErrorMaximum.Tip= + +#Tab.options +OptionPanel.Various.Title=Verschiedenes +OptionPanel.LookAndFeel=installierte 'look & feels': +OptionPanel.LookAndFeel.Info1=w臧le dein bevorzugtes 'look & feel' +OptionPanel.LookAndFeel.Info2=manche 'look & feel's sind nicht voll kompatibel +OptionPanel.DebugLog=gro゚e Logdatei automatisch speichern +OptionPanel.DebugLog.Tip=reduziert Geschwindigkeit, nur fr Testzwecke +OptionPanel.NormalLog=normale Logdatei automatisch speichern +OptionPanel.NormalLog.Tip=schreibt den Logfensterinhalt in eine Datei +OptionPanel.dumpDroppedGop=verworfene GOP's in Dateien speichern +OptionPanel.dumpDroppedGop.Tip=zur Verwendung bei sp舩erer Fehleranalyse +OptionPanel.StartPath=Startverzeichnis fr Dateiauswahlbox: +OptionPanel.StartPath.Value.Tip=leer lassen oder Startverzeichnis eingeben, ein '?' am Anfang setzt die Auswahlbox immer zu diesem Verzeichnis zurck +OptionPanel.Buffer.Title=Puffer +OptionPanel.MainBuffer=Hauptpuffergr゚e in Bytes fr Lesen/Schreiben +OptionPanel.MainBuffer.Tip=editierbar, geringere Werte verringern internen Speichermangel -> 'OutOfMemory' Fehler +OptionPanel.PesPreBuffer=I-Puffergr゚e in Bytes (bei PES Paketgr゚e=0 !) +OptionPanel.PesPreBuffer.Tip=editierbar, vgl. Logdatei, Strme mit hherer Videobitrate erfordern hhere Werte +OptionPanel.ScanBuffer=Puffergr゚e in Bytes fr schnellen Dateiscan +OptionPanel.ScanBuffer.Tip=editierbar, versuche andere Werte, wenn bekannte Daten nicht oder falsch erkannt werden +OptionPanel.PreviewBuffer=Vorschau Puffergr゚e in Bytes +OptionPanel.PreviewBuffer.Tip=kleinere Werte beschleunigen die Vorschau, aber mglicherweise fehlen dann Bilddaten +OptionPanel.callGc=Speicherfreigabe +OptionPanel.callGc.Tip=ruft den 'Mllsammler' auf +OptionPanel.closeOnEnd=Programm nach Ausfhrung beenden +OptionPanel.closeOnEnd.Tip=Programm nach Ausfhrung schlie゚en +OptionPanel.holdStreamInfoOnOSD=Dateiinfo im OSD nicht ausblenden +OptionPanel.holdStreamInfoOnOSD.Tip=Dateiinfo im OSD nicht ausblenden + +#ScanInfo +ScanInfo.Location=Speicherort: +ScanInfo.Name=Name: +ScanInfo.Size=Gr゚e: +ScanInfo.Bytes=Bytes +ScanInfo.Type=Typ: +ScanInfo.Date=Datum: +ScanInfo.Video=Video: +ScanInfo.Audio=Audio: +ScanInfo.Teletext=Teletext: +ScanInfo.Subpicture=Untertitel: +ScanInfo.Playtime=gesch舩zte Spielzeit: +ScanInfo.NotFound=Datei existiert nicht! + +#Execute +PostCommands.Title=Externe Programme +PostCommands.PostProcessing=Nachbearbeitung: +PostCommands.PostProcessing.Tip=nach Beendigung eines Durchlaufs/Split-Teils dieses Kommando ausfhren +PostCommands.Execute=ausfhren +PostCommands.Close=schlie゚en +PostCommands.Error=!> Fehler bei Programmausfhrung: + +#CollectionPanel +CollectionPanel.Title=Kollektion Spezialeinstellungen +CollectionPanel.Title2=Kollektion # +CollectionPanel.Title.processingPreview=verarbeite Vorschau... +CollectionPanel.CutPanel=Videoschnitt / Vorschau / Vorschau-Optionen +CollectionPanel.CutPanel.Tip1=nutze auch die Tastaturkrzel fr die Navigation / Titel anklicken fr Vorschauoptionen +CollectionPanel.CutPanel.Tip2=aktive Datei/Anzahl von Dateien + aktueller Dateiname +CollectionPanel.CutPanel.Tip3=verarbeitete (P)ID um aktuelles Bild zu erhalten +CollectionPanel.CutPanel.Tip4=Zahl/Nummer hier eintragen, oder mittels Drag'n'Drop eine Schnittpunktdatei hierauf ziehen +CollectionPanel.addPoint=hinzufgen +CollectionPanel.removePoint=lschen +CollectionPanel.NumberOfPoints=Schnittpunkte +CollectionPanel.NumberOfPoints.Tip=alle Werte werden automatisch sortiert +CollectionPanel.NumberOfChapters=Kapitel +CollectionPanel.NumberOfChapters.Tip=alle Werte werden automatisch sortiert +CollectionPanel.expectedSize=Gr゚e: ~ +CollectionPanel.Preview.offline=Vorschau nicht verfgbar +CollectionPanel.Preview.processedPid=verarbeite Video (P)ID 0x +CollectionPanel.Various=Verschiedenes +CollectionPanel.Preview.fastDecode=Vorschaubeschleunigung +CollectionPanel.Preview.fastDecode.Tip=geringe Qualit舩, rekonstruiert und interpoliert nur 1 von 64 Pixeln +CollectionPanel.Preview.LiveUpdate=dynamisches Update beim Scrollen +CollectionPanel.Preview.LiveUpdate.Tip=nicht empfohlen bei langsamen Systemen oder Datenzugriffen, siehe auch Vorschau-Puffer +CollectionPanel.Preview.AllGops=GOPs ohne Sequ.Header zeigen +CollectionPanel.Preview.AllGops.Tip=fr DVB Daten meist unntig; nur aktivieren, falls manche Dateien kein Bild zeigen (beeinflu゚t Schnittpunkte!) +CollectionPanel.Preview.SliderWidth=nutze gesamte Fensterbreite fr Slider +CollectionPanel.Preview.SliderWidth.Tip=volle Breite oder passend zum Vorschaubild, fr トnderung Neustart erforderlich +CollectionPanel.Preview.YGain=Helligkeit Vorschaubild (-128..0..+128) +CollectionPanel.Preview.YGain.Tip=Helligkeit Vorschaubild (-128..0..+128) +CollectionPanel.PidList=PES(&Sub)-ID / PID Liste: +CollectionPanel.PidList.Tip1=Eingabe von PES-ID oder Sub-ID (MPG etc) oder PID (PVA,TS); leere Liste == nutze alle IDs +CollectionPanel.PidList.Tip2=doppelklicken um einen ausgew臧lten Eintrag zu entfernen +CollectionPanel.transferPids1=transferiere (P)IDs in neue Koll.# +CollectionPanel.transferPids1.Tip=alle ausgew臧lten (P)IDs der Liste werden in eine neue Kollektion bertragen +CollectionPanel.transferPids2=transferiere Pkt.paare in neue Koll.# +CollectionPanel.transferPids2.Tip=jedes Schnittpunktpaar wird in eine neue Kollektion bertragen +CollectionPanel.ExportLimits=weitere Export-Limitationen: +CollectionPanel.OptionHorizontalResolution=H-Auflsg.: +CollectionPanel.OptionHorizontalResolution.Tip=global,..ignoriert alle unzutreffenden Video Sequenzen +CollectionPanel.OptionDAR=DAR: +CollectionPanel.OptionDAR.Tip=global,..ignoriert alle unzutreffenden Video Sequenzen +CollectionPanel.loadCutpointList=Schnittpunkte aus Datei laden +CollectionPanel.loadCutpointList.Tip=Schnittpunktdatei ffnen oder mittels Drag'n'Drop hierauf ziehen +CollectionPanel.saveCutpointList=Schnittpunkte in Datei speichern +CollectionPanel.ApplyAndClose=bernehmen & schlie゚en +CollectionPanel.Apply=bernehmen +CollectionPanel.CutMode.Bytepos=(0) nutze BytePos. fr Schnitte +CollectionPanel.CutMode.Gop=(1) nutze GOP Nummer fr Schnitte +CollectionPanel.CutMode.Frame=(2) nutze Bildnummer fr Schnitte +CollectionPanel.CutMode.Pts=(3) nutze PTS fr Schnitte +CollectionPanel.CutMode.Timecode=(4) nutze Zeitindex fr Schnitte +CollectionPanel.Preview.Error=Vorschau Fehler: +CollectionPanel.FileAccessError=.. kann auf Datei nicht zugreifen +CollectionPanel.Title.Error=Kollektion Spezialeinstellungen fr Koll.# {0} -> Fehler! Kollektion existiert nicht +CollectionPanel.loadCutpointList.Error=Fehler beim Laden der Datei +CollectionPanel.Preview.disable=Vorschau deaktivieren +CollectionPanel.Preview.disable.Tip= + +#makeVDR +StreamConverter.IOError=!> Streamerzeugung IO Fehler: +StreamConverter.PayloadError=!> erhaltenes PES Paket ohne Daten oder mit falschen Kopfdaten +StreamConverter.Summary=Multiplex: + +#patch +PatchPanel.Title=Bearbeite Video Informationen im 1. Sequenzkopf +PatchPanel.Error=Patch Fehler +PatchPanel.Error2=Patch Fehler 2 +PatchPanel.Change=舅dern +PatchPanel.Cancel=abbrechen + +#CutListener +cutlistener.wrongnumber=-> Falsche Nummer als ID + +#GoListener +golistener.msg.cancelled=<<< Verarbeitung abgebrochen >>> +golistener.msg.paused=<<< Verarbeitung unterbrochen >>> +golistener.msg.resumed=<<< Verarbeitung wieder aufgenommen >>> +golistener.msg.extracting=extrahiere roh(PES) daten von ID 0x + +#AC3 +ac3.msg.loading.start=lade AC3 Frames: +ac3.msg.loading.error=Fehler beim Laden der Datei ac3.bin +ac3.msg.frames=ac3.bin enth舁t {0} AC3 Frames + +#Run +run.prepare.colls=bereite Kollektion(en) vor... +run.av.offset=A/V Zeitabstand +run.session.infos=<<< Session Informationen >>> +run.working.coll=-> arbeite an Zusammenstellung +run.split.output=-> teile Ausgabe bei ungef臧r +run.add.time.offset=-> fge {0} ms Zeitabstand zu audio/ttx/pics hinzu (wenn es einme Video folgt) +run.stream.type.disabled=-> PES Stromtyp unterdrckt: +run.write.output.to=-> schreibe Ausgabedateien nach: +run.write.output.notexists=!> spezifiziertes Ausgabeverzeichnis nicht verfgbar +run.write.output.nowriteaccess=!> kein Schreibzugriff im spezifizierten Ausgabeverzeichnis +run.cutpoints.defined=Schnittpunkt(e) gesetzt +run.start.quick.info=<<< Kurzinformationen >>> +run.end.quick.info=<<< Ende der Kurzinformationen >>> +run.no.input=keine Eingabedatei... +run.write.raw=schreibe separierte Rohdatei nach: +run.coll.empty=Zusammenstellung ist leer... +run.done=Fertig... {0} Zusammenstellung(en) verarbeitet in +run.stopped=>>> Prozess gestoppt... +run.status=Bereit... +run.splitpart=aktueller Teil bei geteilter Ausgabe + +#Working +working.convertType.demux=-> demultiplexe +working.convertType.makeVDR=-> erstelle VDR (A/V PES) +working.convertType.makeMPG2=-> erstelle MPG2 +working.convertType.makePVA=-> erstelle PVA +working.convertType.makeTS=-> erstelle TS +working.convertType.packetFilter=-> einfacher Paket Filter +working.file=+> Eingabedatei {0}: {1} ({2} Bytes) +working.file.not.found=!> Datei nicht gefunden ! +working.filetype=-> Dateityp ist {0} +working.file.notsupported=!> Dateityp wird nicht untersttzt ! +working.end.of.part=---> ENDE VON TEIL +working.summary=Zusammenfassung der erstellten Mediendateien: +working.post.command=-> Abschlussbefehl ausgefhrt: +working.bytes.written=Bytes geschrieben... +working.log.error2=Protokollierungsfehler 2: +working.output.std=[res] Speicherort der 1. Eingabedatei + +#MPVD +mpvdecoder.tip1=rechtsklick um dieses Bild als BMP zu speichern + +#FilePanel +FilePanel.DragDrop.Tip=Datei(en) mittels Drag & Drop hier einfgen oder das Kontextmen dazu verwenden +FilePanel.FileUp.Tip=bewege ausgew臧lte Datei(en) in der Liste aufw舐ts +FilePanel.FileDown.Tip=bewege ausgew臧lte Datei(en) in der Liste abw舐ts +FilePanel.FileRemove.Tip=entferne Datei(en) aus der Kollektion +FilePanel.FileAdd.Tip=Datei(en) der Kollektion hinzufgen +FilePanel.CollectionNumber=Koll.# +FilePanel.CollectionNumber.Tip=w臧le aktive Dateikollektion aus +FilePanel.addCollection.Tip=fge neue Dateikollektion hinzu +FilePanel.removeCollection.Tip=entferne Dateikollektion +FilePanel.openAutoloadPanel.Tip=ffne das Vorauswahl-Fenster fr Datei-Schnellwahl +FilePanel.OutputDirectory=Ausgabepfad: +FilePanel.OutputDirectory.Tip=spezifizierter Ausgabepfad der aktiven Kollektion, std ist Quelle = Ziel +FilePanel.recentOutputDirectories=Liste der Ausgabepfade: +FilePanel.addRecentOutputDirectory.Tip=fge neuen Pfad zur Liste hinzu +FilePanel.removeRecentOutputDirectory.Tip=entferne ausgew臧lten aktiven Pfad von der Liste +FilePanel.Textfield.Tip=Kollektion-Infos + +#ExternTab +ExternPanel.Title1=Externes / Nachbearbeitung +ExternPanel.Title1.Tip=definiere bevorzugte Applikationen +ExternPanel.Applications=Nachbearbeitung +ExternPanel.createVdrIndex=erstelle index.vdr bei "zu VDR" +ExternPanel.createVdrIndex.Tip=erstellte VDR Dateisegmente werden am Bearbeitungsende passend umbenannt +ExternPanel.createCellTimes=erstelle automatisch CellTimes.txt +ExternPanel.createCellTimes.Tip=..mit Eintr臠en beim Wechsel von mehrfachen Eingabedateien und bei Schnittpunkten, und nur bei demultiplex... +ExternPanel.exportPts=speichere Schnittpkt.-PTS Werte +ExternPanel.exportPts.Tip=mehr oder weniger eindeutiges Kriterium fr Schnittpunkttausch +ExternPanel.save1stFrameOfGop=speichere jeden 1. I-Frame autom. +ExternPanel.save1stFrameOfGop.Tip=..als BMP, und nur bei demultiplex... +ExternPanel.createChapters=speichere Zeitindex von Modiwechseln +ExternPanel.createChapters.Tip=exportiert den Zeitindex in eine zus舩zliche Liste wenn ein Wechsel im Ursprungsformat erkannt wird +ExternPanel.renameAudio=Std.erweiterung Mpg-Audio *.mpa +ExternPanel.renameAudio.Tip=andernfalls Layer-Nummer anwenden -> .mp1, .mp2, .mp3 +ExternPanel.renameVideo=Std.erweiterung Mpg-Video *.mpv +ExternPanel.renameVideo.Tip=andernfalls Kodiertyp anwenden -> .m1v, .m2v +ExternPanel.Title2=Projektdateien +ExternPanel.Title2.Tip= +ExternPanel.createM2sIndex=Mpeg2Schnitt idd Version: V2/A3 +ExternPanel.createM2sIndex.Tip=erstelle *.idd Projektdatei bei demux: +ExternPanel.createD2vIndex=erstelle *.d2v Projektdatei bei demux: +ExternPanel.createD2vIndex.Tip=falls jeder Teil separat nachbearbeitet werden soll +ExternPanel.createDgiIndex=erstelle *.dgi.d2v Projektdatei bei demux: +ExternPanel.createDgiIndex.Tip=falls jeder Teil separat nachbearbeitet werden soll +ExternPanel.splitProjectFile=ein Projekt mit geteilten Videodateien +ExternPanel.splitProjectFile.Tip=teilt nur Videodaten auf, aber nicht Audio; besser fr Verarbeitung gro゚er Dateien auf <= FAT32 Systemen +ExternPanel.ProjectFileSplitSize=-> teile nur Video bei xxx MB: +ExternPanel.ProjectFileSplitSize.Tip= +ExternPanel.appendExtension=Dateierweiterung nur anh舅gen (PES) +ExternPanel.appendExtension.Tip=beh舁t den kompletten Quelldateinamen mit Erweiterung bei (nur bei sekund舐en PES-Dateien) +ExternPanel.createInfoLabel=Cuttermaran Info bei demux: +ExternPanel.createInfoIndex=Cuttermaran info Version: 1.61ff +ExternPanel.createInfoIndex.Tip=erstelle *.info indexfile fr Cuttermaran bei demux: +ExternPanel.appendPidToFileName=Pid/Id an Dateinamen anh舅gen +ExternPanel.appendPidToFileName.Tip=Pid/Id an Dateinamen anh舅gen +ExternPanel.appendLangToFileName=Sprachangabe(TS) an Dateinamen anh舅gen +ExternPanel.appendLangToFileName.Tip=Sprachangabe(TS) an Dateinamen anh舅gen + +FtpPanel.killFtpClient=schlie゚e Client ohne Logout +FtpPanel.killFtpClient.Tip=nicht benutzen, ausser der FTP-Server akzeptiert keinen Logout ehe alle Daten bertragen wurden (Verbdg. bleibt mgw. erhalten!) +FtpPanel.useFtpServerResume=Server untersttzt 'Resume' +FtpPanel.useFtpServerResume.Tip= + +#SpecialTab +SpecialPanel.Title1=Spezielles 1 +SpecialPanel.PtsShift=globale PTS Verschiebung: +SpecialPanel.PtsShift.Tip=versuche 'auto', 1..13, oder Zwischenwerte, im Fall von gro゚en PTS Lcken in den Originaldaten (std=0) +SpecialPanel.PVA.FileOverlap=PVA: auf berlappende Dateien prfen +SpecialPanel.PVA.FileOverlap.Tip=deaktivieren, falls sich mehrfache PVA's einer Aufzeichnung nicht berlappen +SpecialPanel.PVA.Audio=PVA: Audio nur formatgerecht behandeln +SpecialPanel.PVA.Audio.Tip=aktivieren, um Fehldeutungen zu vermeiden; manche non-konforme PVA Formate erzwingen die Deaktivierung +SpecialPanel.VOB.resetPts=VOB: versch. Cell-Zeitlinen beachten +SpecialPanel.VOB.resetPts.Tip=aktivieren, falls die Zeitlinien von aufeinanderfolgenden VobIds/Cells nicht fortlaufend sind. +SpecialPanel.TS=TS-Format bezogen: +SpecialPanel.TS.ignoreScrambled=TS: ignoriere verschlsselte Pakete +SpecialPanel.TS.ignoreScrambled.Tip=deaktivieren, falls die Kennzeichnung nach Dekodierung nicht entfernt wurde +SpecialPanel.TS.blindSearch=TS: erweiterte Paketinhaltsuche +SpecialPanel.TS.blindSearch.Tip=aktivieren, falls die PID Prfung bei unbekanntem Inhalt die Suche abbricht +SpecialPanel.TS.joinPackets=TS: verbinde Dateisegmente (Dreamboxョ) +SpecialPanel.TS.joinPackets.Tip=aktivieren, um unvollst舅dige TS Pakete an Grenzen von mehrfachen Dateisegmenten zu verbinden +SpecialPanel.TS.HumaxAdaption=TS: Handanョ Anpassung f. Lesen +SpecialPanel.TS.HumaxAdaption.Tip=aktivieren zur Anpassung an das spezielle Handanョ TS-Datenformat beim Lesen +SpecialPanel.TS.FinepassAdaption=TS: Finepassョ Anpassung f. Lesen +SpecialPanel.TS.FinepassAdaption.Tip=aktivieren zur Anpassung an das spezielle Finepassョ TS-Datenformat beim Lesen +SpecialPanel.TS.JepssenAdaption=TS: Jepssenョ Anpassung f. Lesen +SpecialPanel.TS.JepssenAdaption.Tip=aktivieren zur Anpassung an das spezielle Jepssenョ TS-Datenformat beim Lesen +SpecialPanel.TS.KoscomAdaption=TS: Koscomョ Anpassung f. Lesen +SpecialPanel.TS.KoscomAdaption.Tip=aktivieren zur Anpassung an das spezielle Koscomョ TS-Datenformat beim Lesen +SpecialPanel.TS.ArionAdaption=TS: Arionョ Anpassung f. Lesen +SpecialPanel.TS.ArionAdaption.Tip=normalerweise nicht notwendig, evtl. nur bei fehlerhafter Erkennung +SpecialPanel.TS.generatePmt=TS: generiere PMT inhaltsbezogen +SpecialPanel.TS.generatePmt.Tip=deaktivieren, um unabh舅gige vordefinierte Standard PMT zu generieren +SpecialPanel.TS.generateTtx=TS: generiere Info TTX Service (test) +SpecialPanel.TS.generateTtx.Tip=hinzufgen eines Teletext Services (Pid 0x9F) fr Statusinformationen auf Tafel 150 (neu bei userPMT) +SpecialPanel.TS.HeaderMode0=kein zus舩zlicher TS Header +SpecialPanel.TS.HeaderMode1=generiere Topfieldョ 4000 Header +SpecialPanel.TS.HeaderMode2=generiere Topfieldョ 5000 Header +SpecialPanel.TS.HeaderMode3=generiere Topfieldョ 5x00 Header (neu) +SpecialPanel.TS.HeaderMode4=generiere Topfieldョ 5x00(C) Header (neu) +SpecialPanel.TS.HeaderMode5=generiere Arionョ Header +SpecialPanel.TS.setMainAudioAc3=TFョ-Header: setze AC3 als aktive Tonspur +SpecialPanel.TS.setMainAudioAc3.Tip=TFョ-Header: setze AC3 als aktive Tonspur +SpecialPanel.Title2=Spezielles 2 +SpecialPanel.Input.getEnclosedPackets=akzept. nur geschlossene PES/TS Pakete +SpecialPanel.Input.getEnclosedPackets.Tip=deaktivieren, falls keine Pakete oder viele Fehlstellen gefunden werden +SpecialPanel.Input.concatenateForeignRecords=verbinde verschiedene Aufnahmen +SpecialPanel.Input.concatenateForeignRecords.Tip=aktivieren zum verbesserten Zusammenfgen von Aufnahmen gleichen Typs (PVA,MPEG,VDR,PES) aber unterschiedl. Zeit +SpecialPanel.Input.useReadOverhead=Schnittstellen mit ワberhang lesen +SpecialPanel.Input.useReadOverhead.Tip=vor und nach Schnittpunkten werden zus舩zl. 2MB gelesen, um Tonspurlcken zu vermeiden +SpecialPanel.Audio.ignoreErrors=Audio: nur ersten Sync.pkt verwenden +SpecialPanel.Audio.ignoreErrors.Tip=synchronisiert nur den Startpunkt, folgende Synchronisationsfehler werden bergangen, Lcken nicht aufgefllt +SpecialPanel.Audio.limitPts=Audio: nur ausgew. Sync.pkt verwenden +SpecialPanel.Audio.limitPts.Tip=besser als die erste Option, Audio bleibt vermutl. synchron(er) +SpecialPanel.Audio.allowFormatChanges=Audio: Formatwechsel im Stream erlauben +SpecialPanel.Audio.allowFormatChanges.Tip=Wechsel von Layer, Samplefrequenz u.. in einem Strom werden zugelassen +SpecialPanel.Video.ignoreErrors=Video: Fehler nach 1.GOP ignorieren +SpecialPanel.Video.ignoreErrors.Tip=aktivieren, falls vermutlich nur Video PTS Fehler auftreten (die falsch behandelt werden) +SpecialPanel.Video.trimPts=Video: gleitende PTS ausgleichen +SpecialPanel.Video.trimPts.Tip=aktivieren, falls Audioexport frhzeitig stoppt, ausgelst durch schleichende PTS-Verschiebung +SpecialPanel.Video.cutPts=A/V: Sync-Abgleich nur an Schnittpunkten +SpecialPanel.Video.cutPts.Tip=aktivieren fr reduzierte Synchronisierungsprfung +SpecialPanel.Conversion=auf Konvertierungen bezogen: +SpecialPanel.Conversion.startWithVideo=1.PES-Paket mu゚ mit Video starten +SpecialPanel.Conversion.startWithVideo.Tip=aktivieren, falls manche Spieler Probleme haben; deaktivieren fr nur-Ton Konvertierungen +SpecialPanel.Conversion.addPcrToStream=generiere PCR/SCR aus PTS +SpecialPanel.Conversion.addPcrToStream.Tip=spezifiziere den PCR-Abstand, DVB erfordert meist hhere Werte als DVD, genauso wie hhere Bitraten +SpecialPanel.Conversion.PcrCounter=incTScnt +SpecialPanel.Conversion.PcrCounter.Tip=erhhe TS-Paketz臧ler auch ohne Payload(PCR-only); nonkonform, aber manchmal ntig + +#OutTab +ExportPanel.SplitPanel=Ausgabe teilen +ExportPanel.SplitSize=teile bei etwa xxx MB +ExportPanel.SplitSize.Tip=andere Werte mglich; die Teilungsgr゚e bezieht sich auf die geschriebenen Videodaten (mpv) +ExportPanel.Overlap=ワberlappung mit +ExportPanel.Overlap.Tip= +ExportPanel.StreamtypePanel=Verarbeitung von Elementarstrmen +ExportPanel.StreamtypePanel.Tip=Aus- bzw. Abwahl der bentigten Datentypen (keine Anwendung beim Quelldatentyp 'ES') +ExportPanel.Streamtype.MpgVideo=Mpeg Video +ExportPanel.Streamtype.MpgAudio=Mpeg Audio +ExportPanel.Streamtype.Ac3Audio=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio=LPCM Audio +ExportPanel.Streamtype.Teletext=Teletext +ExportPanel.Streamtype.Subpicture=Untertitel +ExportPanel.Streamtype.Vbi=Generic_VBI +ExportPanel.Streamtype.MpgVideo.Tip=Mpg Video +ExportPanel.Streamtype.MpgAudio.Tip=Mpg Audio +ExportPanel.Streamtype.Ac3Audio.Tip=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio.Tip=LPCM Audio +ExportPanel.Streamtype.Teletext.Tip=Teletext +ExportPanel.Streamtype.Subpicture.Tip=Untertitel +ExportPanel.Streamtype.Vbi.Tip=Generic_VBI +ExportPanel.WriteOptions=Schreiboptionen allgemein +ExportPanel.WriteOptions.Tip=wirkt auf demultiplex und alle Konvertierungen +ExportPanel.WriteOptions.writeVideo=schreibe Videodaten +ExportPanel.WriteOptions.writeVideo.Tip=schreibe Videodaten +ExportPanel.WriteOptions.writeAudio=schreibe alle anderen Daten +ExportPanel.WriteOptions.writeAudio.Tip=schreibe alle anderen Daten +ExportPanel.WriteOptions.InfoScan=Infoscan bearbeitet die ersten MB: +ExportPanel.additionalOffset.Title=zus舩zliche Zeitdifferenz (demultiplex) +ExportPanel.additionalOffset=aktiviere Offset +ExportPanel.additionalOffset.Tip=der originale Start der Daten wird entsprechend verschoben +ExportPanel.additionalOffset.Value.Tip=Werte in Millisek. eingeben und bernehmen; wirkt auf alle Daten, die einem Video folgen +ExportPanel.createSubDirNumber=erstelle neues Unterverzeichnis wie Kollektionsnummer +ExportPanel.createSubDirNumber.Tip=global: empfohlen, wenn dieselbe Eingabedatei gleichzeitig in verschiedenen Kollektionen verarbeitet wird +ExportPanel.createSubDirName=erstelle neues Unterverzeichnis wie 1. Quelldateiname +ExportPanel.createSubDirName.Tip=global: empfohlen, wenn dieselbe Eingabedatei gleichzeitig in verschiedenen Kollektionen verarbeitet wird +ExportPanel.createSubDirVdr=erstelle neues Unterverzeichnis Name+Datum (vdr) +ExportPanel.createSubDirVdr.Tip=global: empfohlen, wenn dieselbe Eingabedatei gleichzeitig in verschiedenen Kollektionen verarbeitet wird + +#VideoTab +VideoPanel.Title1=Videokorrekturen (demultiplex) +VideoPanel.addEndcode=Sequenzendcode am Ende anfgen +VideoPanel.addEndcode.Tip=aktivieren fr konformen Sequenzabschlu゚ +VideoPanel.insertEndcode=Sequenzendcode bei Wechseln einfgen +VideoPanel.insertEndcode.Tip=aktivieren fr konformen Sequenzabschlu゚ +VideoPanel.addSequenceHeader=erg舅ze fehlenden Sequenzkopf in GOPs +VideoPanel.addSequenceHeader.Tip=verbessert Spulfunktionen beim Abspielen +VideoPanel.patchToProgressive=setze alle Bilder auf 'Vollbild' +VideoPanel.patchToProgressive.Tip=setzt das progressiv Bit +VideoPanel.patchToInterlaced=setze alle Bilder auf 'Halbbild' +VideoPanel.patchToInterlaced.Tip=lscht das progressiv Bit +VideoPanel.toggleFieldorder=tausche Darstellungsreihenfolge +VideoPanel.toggleFieldorder.Tip=tauscht den vorhandenen Modus fr Feldanordnung +VideoPanel.clearCdf=composite.display.flag unwirksam machen +VideoPanel.clearCdf.Tip=soll das 'grne Kltzchen Problem' bestimmter alter HW Decoder Chips beheben +VideoPanel.patchResolution.Tip=bedingter Patch der 1. horiz. Auflsung +VideoPanel.patchResolution=1. H-Aufl.: +VideoPanel.patchResolutionValue.0=unver舅dert +VideoPanel.patchResolutionValue.1=immer 舅dern +VideoPanel.patchResolutionValue.2=wenn <> 352|720 +VideoPanel.patchResolutionValue.3=wenn <> to 352|704|720 +VideoPanel.addSde=Auflsung in SDE setzen +VideoPanel.addSde.Tip=舅dert existierende oder erg舅zt Eintr臠e, leeres Feld setzt die Daten lt. Sequenzkopf; Bsp: 720*576 +VideoPanel.SdeValue.Tip=舅dert existierende oder erg舅zt Eintr臠e, leeres Feld setzt die Daten lt. Sequenzkopf; Bsp: 720*576 +VideoPanel.Title2=neue Bitratenwerte (demultiplex) +VideoPanel.Unchanged=unver舅dert +VideoPanel.ChangeVbvBuffer=VBV Puffer: +VideoPanel.ChangeVbvBuffer.Tip=alternativ Wert +VideoPanel.ChangeVbvBuffer.Mode1=(1) SD max. (112*16384) +VideoPanel.ChangeVbvDelay=VBV Verzgerg.: +VideoPanel.ChangeVbvDelay.Tip=alternativ Wert +VideoPanel.ChangeVbvDelay.Mode1=(1) max. Zeit +VideoPanel.ChangeAspectRatio=Aspectratio: +VideoPanel.ChangeAspectRatio.Tip=alternativ Werte, falls トnderung ntig +VideoPanel.patchBitrateValue=Bitratenwerte je Sequenz: +VideoPanel.patchBitrateValue.0=(0) behalte Original +VideoPanel.patchBitrateValue.1=(1) berechnet aus GOP L舅ge +VideoPanel.patchBitrateValue.2=(2) berechnet aus VBV +VideoPanel.patchBitrateValue.3=(3) markiere als VBR (MPEG-1 Video) +VideoPanel.patchBitrateValue.4=(4) fix 3 Mbps +VideoPanel.patchBitrateValue.5=(5) fix 6 Mbps +VideoPanel.patchBitrateValue.6=(6) fix 9 Mbps +VideoPanel.patchBitrateValue.7=(7) fix 12 Mbps +VideoPanel.patchBitrateValue.8=(8) fix 15 Mbps +VideoPanel.patch1stBitrateValue=Bitratenwert in erster Sequenz: +VideoPanel.patch1stBitrateValue.0=(0) behalte Original +VideoPanel.patch1stBitrateValue.1=(1) Durchschnitt (nominal) +VideoPanel.patch1stBitrateValue.2=(2) berechnetes Max. <= 9.0 Mbps(DVD) +VideoPanel.patch1stBitrateValue.3=(3) berechnetes Max. (zB. HDTV) +VideoPanel.patch1stBitrateValue.4=(4) markiere als VBR (MPEG-1 Video) + +#AudioTab +AudioPanel.Title1=Audiokonvertierungen (demultiplex) +AudioPanel.losslessMpaConversion.Tip1=direkte verlustfreie Wandlung (begrenzt +AudioPanel.losslessMpaConversion.Tip2=auf MPEG-1, Layer2, 48kHz, 56..384kbps) : +AudioPanel.losslessMpaConversion.Tip=Bitrate & Kanalanzahl wird bei der Ausgabe konstant gehalten +AudioPanel.losslessMpaConversionMode0=(0) keine Konvertierung +AudioPanel.losslessMpaConversionMode1=(1) 1-Kanal zu 3D-Stereo (L = M, R = verzg. M) +AudioPanel.losslessMpaConversionMode2=(2) 1-Kanal zu Stereo (L+R = M) +AudioPanel.losslessMpaConversionMode3=(3) 1-Kanal zu J-Stereo (L+R = M) +AudioPanel.losslessMpaConversionMode4=(4) 2-Kanal/Stereo zu 2* 1-Kanal (1=L, 2=R) +AudioPanel.losslessMpaConversionMode5=(5) 1+2-Kanal/Stereo zu 2* J-Stereo (1=LL, 2=RR) +AudioPanel.losslessMpaConversionMode6=(6) 1+2-Kanal zu 2* J-Stereo (1=LR/LL, 2=LR/RR) +AudioPanel.decodeMpgAudio=dekodiere MPEG Layer1,2 zu PCM: +AudioPanel.decodeMpgAudio.Tip=MPEG-Audio Dekoder (nicht fr Layer3), Std-Ausgabe in Stereo PCM +AudioPanel.decodeMpgAudio.resampleAudioMode0=(0) kein Resampling +AudioPanel.decodeMpgAudio.resampleAudioMode1=(1) lineares Resampling 48kHz zu 32kHz +AudioPanel.decodeMpgAudio.resampleAudioMode2=(2) lineares Resampling 48kHz zu 44.1kHz +AudioPanel.decodeMpgAudio.Normalize=normalisiere zu % : +AudioPanel.decodeMpgAudio.Normalize.Tip=normalisiere L+R gleicherma゚en, Werte von 0...100 sind mglich, std ist 98%; erfordert Neustarts falls ntig +AudioPanel.NormalizeValue.Tip=normalisiere L+R gleicherma゚en, Werte von 0...100 sind mglich, std ist 98%; erfordert Neustarts falls ntig +AudioPanel.decodeMpgAudio.Downmix=downmix und als 1-Kanal ausgeben +AudioPanel.decodeMpgAudio.Downmix.Tip=downmix Stereo/2-Kanal Quelldaten in 1-Kanal +AudioPanel.decodeMpgAudio.changeByteorder=in Motorola Byteanordnung speichern +AudioPanel.decodeMpgAudio.changeByteorder.Tip=MSB zuerst, nonIntel Typ +AudioPanel.decodeMpgAudio.addRiffHeader=RIFF(RIFX)-Kopf hinzufgen (.wav) +AudioPanel.decodeMpgAudio.addRiffHeader.Tip=PC Standard +AudioPanel.decodeMpgAudio.addAiffHeader=AIFF-Kopf hinzufgen (.aif) +AudioPanel.decodeMpgAudio.addAiffHeader.Tip=Apple Standard +AudioPanel.Title2=Audioanpassungen (demultiplex) +AudioPanel.validateCRC=validiere CRC (AC-3 / Mpg-Audio L1,2) +AudioPanel.validateCRC.Tip=ermglicht Ausgabe mit geringster Fehlerwahrscheinlichkeit, wenn aktiviert; verringert Geschwindigkeit +AudioPanel.clearCRC=entferne CRC (Mpg-Audio Layer1,2) +AudioPanel.clearCRC.Tip=Endspeicherung auf Datentr臠er bentigt normalerweise keinen CRC +AudioPanel.fillGapsWithLastFrame=kleine Fehlstellen maskieren +AudioPanel.fillGapsWithLastFrame.Tip=anstatt Stille einzufgen, wird der letztgltige Frame wiederholt geschrieben +AudioPanel.addFrames=Frames am Ende anfgen +AudioPanel.addFrames.Tip=falls Audio vor Video endet, um (beinahe) gleiche Spielzeiten zu erreichen +AudioPanel.patch1stAc3Header=AC-3: patche 1.Kopf auf 3/2 Kanalmodus +AudioPanel.patch1stAc3Header.Tip=manche SW orientiert sich nur am 1.Kopf fr bestimmte Einstellungen +AudioPanel.replaceAc3withSilence=AC-3: ersetze alle non-3/2 mit Stille +AudioPanel.replaceAc3withSilence.Tip=aktivieren, um unerwnschte Stellen mit 3/2 Stille zu maskieren (48khz,448kbps, ac3.bin erforderlich) +AudioPanel.AC3BitrateAdaption=AC-3: Bitraten angleichen +AudioPanel.AC3BitrateAdaption.Tip=Bitraten angleichen +AudioPanel.addRiffToAc3=AC-3: RIFF WAVE Kopf anfgen +AudioPanel.addRiffToAc3.Tip=erstelle .wav Datei unter Benutzung des AC-3 Wave Format (tag 0x2000) Kopfes +AudioPanel.addRiffToMpgAudioL12=MPA: RIFF WAVE Kopf anfgen Layer1,2 +AudioPanel.addRiffToMpgAudioL12.Tip=erstelle .wav Datei unter Benutzung des Broadcast Wave Format (tag 0x0050) +AudioPanel.addRiffToMpgAudioL3=MPA: RIFF WAVE Kopf anfgen Layer3 +AudioPanel.addRiffToMpgAudioL3.Tip=erstelle .wav Datei unter Benutzung des blicheren ACM Wave Format (tag 0x0055) +AudioPanel.pitchAudio=verwerfe jeden xxx. Audioframe: +AudioPanel.pitchAudio.Tip=beschleunigt Audio (nur bei Elementarstrmen) +AudioPanel.allowSpaces=erlaube Leerraum zw. Frames (h.w.c.!) +AudioPanel.allowSpaces.Tip=Grobprfung auf gltige Rahmen, resultiert mglicherweise in defekt verbleibenden Rahmen (vgl. CRC) +AudioPanel.createDDWave=AC-3/DTS: Ausgabe als DD/DTS-Wave +AudioPanel.createDDWave.Tip=Ac3/DTS als DD/DTS-Wave ausgeben, fixierte Kopfdaten PCM 44.1kHz,16bit,2-ch +AudioPanel.fadeInOut=Ton ein-/ausblenden +AudioPanel.fadeInOut.Tip=Ton ein- /ausblenden, iniKey 'AudioPanel.fadeInOutMillis' ; std = 2000 ms, 1...5000 ms + +#SubtitleTab +SubtitlePanel.Title=DVB/DVD Untertitel-Export (demultiplex) +SubtitlePanel.Title.Teletext=DVB Teletext (demultiplex) +SubtitlePanel.decodeMegaradio=(Test) exportiere MegaRadioョ MP3-Strom +SubtitlePanel.decodeMegaradio.Tip=frher bertragen auf Hotbird 13ーE, 11.054GHz Hor., SR 27500, FEC 5/6, TTX-PID 553, aus NBC/Giga Teletext +SubtitlePanel.decodeHiddenRows=dekodiere inaktive Zeilen im Teletext +SubtitlePanel.decodeHiddenRows.Tip=manche Zeilen, Seiten, Dienste sind ztw. 'versteckt' +SubtitlePanel.rebuildPTS=regeneriere TTX PTS aus dem 1. MpgAudio +SubtitlePanel.rebuildPTS.Tip=nur anwenden bei TTX Daten (enthalten in Datein wie TS,Mpg,VDR..) ohne eigenen oder falschen Zeitindex zum Video +SubtitlePanel.rebuildPictPTS=regeneriere DVB-UT PTS aus dem 1. MpgAudio +SubtitlePanel.rebuildPictPTS.Tip=nur anwenden bei DVB-UT Daten (enthalten in Datein wie TS,Mpg,VDR..) ohne eigenen oder falschen Zeitindex zum Video +SubtitlePanel.keepOriginalTimecode=originalen Zeitindex(PTS) beibehalten +SubtitlePanel.keepOriginalTimecode.Tip=bei alleinigen demultiplex/dekodierung ohne Video bleibt die Originalzeit erhalten (fr evtl. sp舩ere Verwendg.) +SubtitlePanel.exportTextAsUnicode=Unicode (UTF-16 BE) beim Textexport +SubtitlePanel.exportTextAsUnicode.Tip=Unicode (UTF-16 Big-Endian) beim Textexport +SubtitlePanel.exportTextAsUTF8=Unicode (UTF-8) beim Textexport +SubtitlePanel.exportTextAsUTF8.Tip=Unicode (UTF-8) beim Textexport +SubtitlePanel.TtxPages=dekodiere Teletexttafeln: +SubtitlePanel.TtxPages.Tip=Felder editierbar, bei 'null' wird Feld ignoriert; nationale Characterauswahl basierend auf Teletext Level 1.5 in Unicode +SubtitlePanel.Language=Zeichensatz: +SubtitlePanel.Language.Tip=Sprachenvorauswahl, falls automatische Auswahl vom Anbieter nicht vollst舅dig untersttzt wird +SubtitlePanel.Format=Untertitel Exportformat : +SubtitlePanel.Format.Free=Text +SubtitlePanel.Format.Tip=bevorzugtes Exportformat ausw臧len +SubtitlePanel.Format.SUP.Values.Tip=Schriftg゚e(gerade!); BG-Transparenz; Y-Diff.; X-Diff.; X-Breite; Bildbreite; Bildhhe; Y2-Diff.; max. Zeilenzahl; Outline Px; fett +SubtitlePanel.Colormodel=simuliere DVB Untertitel IRD Farbmodell: +SubtitlePanel.Colormodel.Tip=wirkt sich unmittelbar auf die Qualit舩 der Dekodierung aus, beste Einstellungen h舅gen von weiterer Verwendung ab +SubtitlePanel.Colormodel.Mode0=(0) 4 Farben +SubtitlePanel.Colormodel.Mode1=(1) 16 Farben +SubtitlePanel.Colormodel.Mode2=(2) 256 Farben +SubtitlePanel.PageId=fixiere Seitennr.: +SubtitlePanel.PageId.Value.Tip=leer lassen fr autom. Erkennung, sonst: Eingabe der Seitennummer bei mehrfachen Seiten (abh舅gig von ワbertragung) +SubtitlePanel.showPreview=zeige Untertitelvorschau +SubtitlePanel.SupValues=Werte: +SubtitlePanel.Font=Schriftart: +SubtitlePanel.Font.Tip=bei SUP-Export +SubtitlePanel.Font.LoadError=Fehler beim Laden der Systemschriftarten +SubtitlePanel.useTextOutline=Textzeichen mit schwarzer Umrandung +SubtitlePanel.useTextOutline.Tip=SUP-Export: umgibt jedes Zeichen mit 3 Pixeln Rand bei max. 2 'Sprecherfarben' pro Bild, ansonsten gesamter Hg schwarz +SubtitlePanel.keepColourTable=Farbtabelle beibehalten/erweitern +SubtitlePanel.keepColourTable.Tip=erstellte Farbtabelle beibehalten/erweitern (ber mehrere Kollektionen) +SubtitlePanel.exportAsVobSub=zus舩zl. Export als VobSub (idx+sub) +SubtitlePanel.exportAsVobSub.Tip=zus舩zl. Export als VobSub (idx+sub), SUP Ausgabe muss aktiviert sein +SubtitlePanel.TtxExportBoxedOnly=nur Textbox-Inhalt exportieren +SubtitlePanel.TtxExportBoxedOnly.Tip=unsichtbarer Textteil ausserhalb UT-Box wird ignoriert, zB. bei fehlerhaften UT-Seiten +SubtitlePanel.useTextAlignment=Text horizontal zentrieren +SubtitlePanel.useTextAlignment.Tip=Text horizontal zentrieren, Effekt abh舅gig von Schriftart + +#Autoload +autoload.title=Liste der vordefinierten Quelldatenverzeichnisse +autoload.dir.remove.tip=entferne Verzeichnis von der Liste +autoload.dir.add.tip=fge Verzeichnis der Liste hinzu +autoload.dir.refresh.tip=Dateiliste neu laden +autoload.ftp.add.tip=fge FTP Server Verzeichnis der Liste hinzu +autoload.add.coll.tip=erstelle neue Kollektion fr jede selektierte Datei und fge sie hinzu +autoload.add.coll2.tip=erstelle neue Kollektion und fge all selektierten Dateien hinzu +autoload.add.file.tip=Datei(en) zur aktiven Kollektion hinzufgen +autoload.rename.tip=links doppelklick oder Eingabe um Datei(en) der akt. Kollektion hinzuzufgen, rechts doppelklick zum umbennen +autoload.dialog.rename=umbenennen +autoload.dialog.fileexists=Datei exisitiert! ワberschreiben? +autoload.close=Fenster schlie゚en + +#splitreset +splitreset.novideo=! -> keine Videodatei PTS, Aufteilung ausgeschaltet + +#checkpts +checkpts.1st.latter=!> erster Video PTS startet sp舩er als der letzte PTS aus diesem Strom! kritisch fr Synchronisierung +checkpts.last.ends=!> letzter Video PTS endet vor dem Start PTS aus diesem Strom! Synchronisierung unmglich + +#parseSecondaryPES +parseSecondaryPES.continue=-> Fortsetzung mit den extrahierten Rohdaten von +parseSecondaryPES.demux.pes=demultiplexe PES Datei +parseSecondaryPES.missing.startcode=!> Startcode fehlt bei Pos.: +parseSecondaryPES.found.startcode=!> Startcode gefunden bei Pos.: +parseSecondaryPES.packet.length=-> ! Paketl舅ge ist 0 bei +parseSecondaryPES.miss.next.startcode=!> n臘hster Startcode fehlt bei Pos.: {0} von {1} (PES-ID 0x{2}), verwerfe Paket.. +parseSecondaryPES.packs=packs: {0} {1}% {2} +parseSecondaryPES.found.pesid=-> gefunden: PES-ID 0x{0} {1} bei {2} +parseSecondaryPES.ac3.audio=--> AC-3/DTS Audio +parseSecondaryPES.teletext=--> Teletext +parseSecondaryPES.mpeg.audio=--> MPEG Audio +parseSecondaryPES.lpcm.audio=--> LPCM Audio +parseSecondaryPES.subpic=--> Untertitel +parseSecondaryPES.eof.error=parseSecondaryPES EOF erreicht mit Fehler: +parseSecondaryPES.io.error=parseSecondaryPES Datei E/A Fehler: +parseSecondaryPES.msg.noexport=--> Strom bergangen + +#ID type +idtype.mpeg.video.ignored=(MPEG Video) -> ignoriert +idtype.mpeg.audio=(MPEG Audio) +idtype.private.stream=(private_stream_1) +idtype.mpeg.video=(MPEG Video) +idtype.mapped.to=umgesetzt auf 0x +idtype.mapped.to.e0=umgesetzt auf 0xE0 +idtype.ignored= -> ignoriert +idtype.video=(Video) +idtype.main.audio=(Haupt-Audio) +idtype.additional=(non-Video) +idtype.has.pesid= hat PES-ID 0x + +#parsePrimaryPES +parsePrimaryPES.special.pes=-> spezielle PES-IDs fr die Suche definiert +parsePrimaryPES.continue=Fortsetzung mit Datei +parsePrimaryPES.demuxing=demultiplexe +parsePrimaryPES.converting=konvertiere +parsePrimaryPES.avpes.file=A/V PES Datei +parsePrimaryPES.missing.startcode=!> Startcode fehlt bei Pos.: +parsePrimaryPES.found.startcode=!> Startcode gefunden bei Pos.: +parsePrimaryPES.split.cellids=-> VobID {0} CellID {1} bei {2} (GOP#{3} / Bild#{4}) +parsePrimaryPES.packet.length=-> ! Paketl舅ge ist 0 bei +parsePrimaryPES.miss.startcode=!> n臘hster Startcode fehlt bei Pos.: {0} von {1} (Paketgr゚e=0) / I-Puffer {2} +parsePrimaryPES.miss.startcode2=!> n臘hster Startcode fehlt bei Pos.: {0} von {1} (PES-ID 0x{2}), verwerfe Paket.. +parsePrimaryPES.packs=Pakete +parsePrimaryPES.dump.1st=-> schreibe 1. Packet in Datei +parsePrimaryPES.found.pesid=-> gefunden: PES-ID 0x +parsePrimaryPES.pes.incoming=!> PES-ID 0x{0}, eingehendes PES Paket ohne Daten oder falschen Kopfdaten bei {1} +parsePrimaryPES.actual.written=-> bis jetzt geschriebene Bilder: +parsePrimaryPES.switch=wechsle zu Datei: +;parsePrimaryPES.ac3=--> AC-3/DTS Audio +;parsePrimaryPES.teletext=--> Teletext (SubID 0x +;parsePrimaryPES.mpeg.audio=--> MPEG Audio (0x +;parsePrimaryPES.lpcm.audio=--> LPCM Audio (SubID 0x +;parsePrimaryPES.subpic=--> Untertitel (SubID 0x +parsePrimaryPES.eof.error=parsePrimaryPES EOF erreicht mit Fehler: +parsePrimaryPES.io.error=parsePrimaryPES Datei E/A Fehler: +;parsePrimaryPES.msg.noexport=--> Strom bergangen (0x +StreamParser.NoExport=Strom bergangen + +#parseTS +parseTS.sid=-> Service ID 0x +parseTS.pmt.refers=-> PMT 0x{0} verweist auf diese Programminhalte: +parseTS.no.pmt=-> keine PMT gefunden (mit kurzem Scan) +parseTS.special.pids=-> spezielle PIDs fr die Suche definiert +parseTS.continue=Fortsetzung mit Datei: +parseTS.demuxing=demultiplexe +parseTS.converting=konvertiere +parseTS.dvb.mpeg= DVB MPEG-TS Datei +parseTS.incomplete=!> unvollst舅diges TS-Paket am Dateiende erkannt bei +parseTS.comp.failed=!> TS-Paket Vervollst舅digung fehlgeschlagen :-( +parseTS.missing.sync=!> Synchronisationswort fehlt bei Pos.: +parseTS.comp.ok=!> TS-Paket Vervollst舅digung ok :-) +parseTS.found.sync=!> Synchronisationswort gefunden bei Pos.: +parseTS.bit.error=!> PID 0x{0} -> TS Bitfehler in Paket {1} bei Pos. {2}, verwerfe.. +parseTS.stuffing=--> PID 0x1FFF >> Fll-Paket -> ignoriert +parseTS.scrambled=!> PID 0x{0} >> Daten als verschlsselt markiert, Paket {1} bei {2} -> ignoriert +parseTS.clear=-> PID 0x{0} >> unverschlsselte Daten gefunden, Paket {1} bei {2} +parseTS.outof.sequence=!> PID 0x{0} -> Paket {1} bei Pos.: {2} au゚erhalb der Sequenz ({3}/{4}) (Z臧lerkorrektur..) +parseTS.priv.stream2.ignored=-> PID 0x{0}(private_stream_2) -> ignoriert +parseTS.scrambled.notignored=-> PID 0x{0} >> Daten als verschlsselt markiert (nicht ignoriert){1} +parseTS.ignored= -> ignoriert +parseTS.pid.has.pes=ok> PID 0x{0} hat PES-ID 0x{1} {2} +parseTS.lackof.pes=!> PID 0x{0} hat keine PES Daten -> Paket bergangen +parseTS.actual.vframes=-> bis jetzt geschriebene Bilder: +parseTS.tryto.complete=!> versuche unvollst舅diges TS-Paket zu komplettieren... +parseTS.packs=packs: {0} {1}% {2} +parseTS.ac3.audio=--> AC-3/DTS Audio unter PID 0x +parseTS.teletext.onpid=--> Teletext unter PID 0x +parseTS.mpeg.audio=--> MPEG Audio (0x{0}) unter PID 0x{1} +parseTS.subpicture=--> Untertitel (SubID 0x +parseTS.eof.error=ts EOF erreicht mit Fehler: +parseTS.io.error=ts Datei I/O Fehler: +parseTS.switch.to=wechsle zu Datei: +parseTS.msg.noexport=--> StromID (0x{0}) unter PID 0x{1} bergangen + +#nextfile +nextfile.io.error=nextfile Datei E/A Fehler: +nextfile.shift.auto=-> verschiebe Original PTS automatisch zurck um {0} Stunde(n) +nextfile.shift.manual=-> verschiebe Original PTS manuell zurck um {0} Stunde(n) +nextfile.next.file.start=-> n臘hste Daten starten mit PTS: {0} / letzter aktueller PTS ist {1} +nextfile.next.file.start.adaption=-> verwende PTS-Offset: {0} ab hier + +#overlapPVA +overlappva.io.error=overlap Lesefehler: + +#parsePVA +parsePVA.special.pids=-> spezielle PIDs fr die Suche definiert +parsePVA.streamtype.ac3= (AC-3/DTS) +parsePVA.streamtype.ttx= (TTX) +parsePVA.streamtype.mpeg.audio= (MPEG Audio) +parsePVA.streamtype.mpeg.video= (MPEG Video) +parsePVA.continue=Fortsetzung mit Datei: +parsePVA.demuxing=demultiplexe +parsePVA.converting=konvertiere +parsePVA.pvafile= PVA Datei +parsePVA.missing.sync=!> Synchronisationswort fehlt bei Pos.: +parsePVA.found.sync=!> Synchronisationswort gefunden bei Pos.: +parsePVA.file.overlap=Datei-ワberschneidung entdeckt bei Pos.: +parsePVA.packs=Pakete +parsePVA.found.id=-> gefunden: ID 0x +parsePVA.outof.sequence=!> ID 0x{0} -> Paket {1} bei Pos.: {2} au゚erhalb der Sequenz ({3}/{4}) (Z臧lerkorrektur..) +parsePVA.id.0x=-> ID 0x +parsePVA.actual.vframes=-> bis jetzt geschriebene Bilder: +parsePVA.ac3.onid=--> AC-3/DTS Audio auf ID 0x +parsePVA.teletext.onid=--> Teletext auf ID 0x +parsePVA.mpeg.audio.onid=--> MPEG Audio auf ID 0x +parsePVA.eof.error=PVA EOF erreicht mit Fehler: +parsePVA.io.error=PVA I/O Fehler: +parsePVA.msg.noexport=--> Strom bergangen auf ID 0x + +#Audioprocess +audio.progress=prfe & synchronisiere Audiodatei +audio.status.pre-insert=fge vorn an... +audio.status.insert=fge ein... +audio.status.write=schreibe... +audio.status.pause=warte... +audio.status.add=fge hinzu... +audio.status.finish=beendet... +audio.convert=-> konvertiere MPA : +audio.decode=-> dekodiere MPA : +audio.restart=!> starte Audiobearbeitung neu, ausgelst durch トnderungen im Ausgabeframe# +audio.error.io=Audio I/O Fehler: +audio.msg.pts.discard=!> {0} PTS's ausgelassen im Strom +audio.msg.pts.firstonly=-> verwende nur erste Audio PTS (um Startpunkt zu synchronisieren) +audio.msg.pts.start_end=Audio PTS: erstes Paket {0}, letztes Paket +audio.msg.pts.mismatch=!> Video & Audio PTS stimmen zu keiner Zeit berein! +audio.msg.pts.wo_frame=!> PTS ohne ein Frame +audio.msg.adjust.at.videopts=-> passe Audio an Video-Zeitlinie an +audio.msg.adjust.at.ownpts=-> passe Audio an eigene Zeitlinie an +audio.msg.addriff.acm=-> erg舅ze RIFF WAVE header zum MPEG Audio im ACM Waveformat +audio.msg.addriff.bwf=-> erg舅ze RIFF WAVE header zum MPEG Audio im BWF Waveformat +audio.msg.addriff.ac3=-> erg舅ze RIFF WAVE Kopf zum AC-3 Audio +audio.msg.syncword.lost=!> Synchronisationswort fehlt bei Pos.:{0}, @ +audio.msg.syncword.found=!> Synchronisationswort gefunden bei Pos.: +audio.msg.frame.discard=!> verwerfe Frame# +audio.msg.crc.error=!> CRC{0} Prfung fehlgeschlagen bei Pos.: +audio.msg.source=-> Ursprungsformat: {0} @ +audio.msg.source.max=-> Ursprungsformat: stoppe Meldungen, mehr als 100 Modiwechsel in einer Datei reduzieren Geschwindigkeit +audio.msg.summary.skip=!> Frames in Quelle bersprungen @ +audio.msg.summary.pre-insert=!> {0} Frame(s) ({1}ms) vorn angefgt @ +audio.msg.summary.insert=!> {0} Frame(s) ({1}ms) eingefgt @ +audio.msg.summary.add=!> {0} Frame(s) ({1}ms) angefgt @ +audio.msg.summary.frames=Audio Frames: wri-pre-skip-ins-add {0} @ {1} abgeschlossen... +audio.msg.summary.jstereo=-> {0} stereo/jointstereo Wechsel gefunden... +audio.msg.audio=Audio +audio.msg.newfile.left=(links): +audio.msg.newfile.right=(rechts): +audio.msg.noaudio=!> keine Audiodaten in diesem Strom gefunden... +audio.msg.convert.disabled=!> Ursprungs-Frame erfllt nicht die Konvertierungskriterien, Funktion deaktiviert.. (Frame# {0}) +audio.msg.convert.error=!> Ursprungs-Frame verursachte einen Konvertierungsfehler (Fehler {0}), (Frame# {1}) + +#Videoprocess +video.msg.pts.start_end=Video PTS: Start 1.GOP {0}, Ende letzte GOP +video.msg.summary=-> Video: fr-ct-1p-cg-og-dg -> +video.progress=analysiere Videodatei +video.msg.skip.sec=-> berspringe Sequenzendcode folgend auf GOP# {0} bei +video.error.io=!> Datei I/O Fehler: +video.msg.error.lackofdata=!> GOP# {0} - zuwenig Daten, ignoriert... +video.msg.error.nopts.use_goptc=!> GOP# {0} hat keine PTS, nutze GOP Zeitindex fr Synchronisation +video.msg.error.nopts.use_lastpts=!> GOP# {0} hat keine PTS, nutze letzte PTS fr Synchronisation +video.msg.basics=-> Videoeigenschaften: +video.msg.newformat=GOP# {0}, neues Format im n臘hsten Sequenzkopf festgestellt: +video.msg.error.pesext_in_es=!> GOP# {0}, PES-Kopf und -erweiterung im ES gefunden, mit '0' aufgefllt... (GOP Byteabst. {1}) +video.msg.error.pes_in_es=!> GOP# {0}, PES-Kopf im ES gefunden, mit '0' aufgefllt... (GOP Byteabst. {1}) +video.msg.error.frame.wrong=!> ungltiger Bildtyp {0}, T-Ref +video.msg.export.start=-> starte Export von Videodaten bei GOP# +video.msg.pts.diff=!> PTS Differenz von {0} ({1}) zur letzten exportierten GOP festgestellt +video.msg.error.brokenlink=(broken_link Flag korrigiert) +video.msg.frame.drop=!> verwerfe berflssige B-Frames bei GOP# {0} / neuer Zeitindex +video.msg.error.frame.not=!> GOP# {0} enth舁t keine Bilder +video.msg.error.frame.not.i=!> GOP# {0} startet nicht mit einem I-Frame bei T-Ref '0' +video.msg.error.pts.early=!> Start-PTS von GOP# {0} ist kleiner als das Ende der letzten GOP.. (erw. {1}) +video.msg.error.gop.drop=!> verwerfe GOP# {0} bei orig. PTS {1} ({2}) +video.msg.error.gop.diff=!> Bilder erw./gez. {0}, inGOP PTS Diff. {1}ms, neuer Zeitindex +video.msg.error.gop.dump=-> speichere GOP in Datei: +video.msg.io.non=keine +video.msg.io.int=Halbbilder +video.msg.io.pro=Vollbilder +video.msg.io.int_pro=Halb- und Vollbilder +video.msg.length=-> Videol舅ge: {0} Bilder in +video.msg.gop.summary=-> GOP Zusammenfassung: min. {0}, max. {1} Felder; enth舁t {2} +video.error.pts.same=-> {0} GOPs mit gleichem PTS-Wert fr verschiedene Bilder gefunden! +video.summary=.Video {0}:\t{1} Bilder\t{2}\t\t +video.msg.bitrate.avg=-> durchschnittl. Bitrate {0}bps (min/max: {1}) +video.msg.bitrate.avgnom=-> durchschnittl. nom. Bitrate {0}bps (min/max: {1}) +video.msg.bitrate.vbr=-> setze Bitrate im ersten Sequenzkopf auf VBR +video.msg.bitrate.val=-> setze Bitrate im ersten Sequenzkopf auf {0}bps +video.msg.resolution=-> setze Auflsung ersten Sequenzkopf von {0} auf + +#Teletextprocess +teletext.msg.nooutput=!> kein Ausgabeformat fr Teletext spezifiziert... +teletext.msg.output=-> Exportformat: +teletext.msg.tmpfile=-> temp. Datei: {0} ({1} Bytes) +teletext.msg.page=Seite Nr. +teletext.msg.megaradio=MegaRadio mp3 Strom +teletext.progress=suche & dekodiere +teletext.msg.search=-> suche nach +teletext.status=Seiten: +teletext.msg.discard=!> {0} PTS's ausgelassen im Strom +teletext.msg.pts.start_end=Teletext PTS: erstes Paket {0}, letztes Paket +teletext.msg.pts.missed=!> Teletext Strom verwendet keine PTS, Synchronisation unmglich +teletext.msg.pts.mismatch=!> Video & Teletext PTS stimmen zu keiner Zeit berein! +teletext.msg.adjust.at.video=-> passe Teletext an Video-Zeitlinie an +teletext.msg.adjust.at.own=-> passe Teletext an eigene Zeitlinie an +teletext.msg.syncword.lost=!> Synchronisationswort fehlt bei Pos.: +teletext.msg.syncword.found=!> Synchronisationswort gefunden bei Pos.: +teletext.msg.vps=-> VPS Status: {0} @ PTS +teletext.msg.provider=-> Anbieter: +teletext.msg.program=-> Programm: +teletext.msg.summary={0} Seiten der Nr. {1} geschrieben... +teletext.summary=Teletext {0}:\t{1} Seiten der Nr. {2}\t{3}\t +teletext.error.eof=!> Teletext EOF erreicht mit Fehlern: +teletext.error.io=!> Teletext I/O Fehler: {0} / +teletext.msg.newrun=-> verarbeite 2. SUP Y-Abstand + +#Subpictureprocess +subpicture.msg.error3=!> Fehler beim Dekodieren von DVB Untertiteln +subpicture.msg.error4=!> zu wenig Daten im Paket +subpicture.msg.error5=!> Paketgr゚e passt nicht zu Paketdaten +subpicture.msg.error6=!> falscher Positionsindex fr Einheit +subpicture.msg.error7=!> falsche Position fr Einheit +subpicture.msg.error8=!> falsches Ende des Einheitsindex +subpicture.msg.error9=!> falsches Ende der Einheit +subpicture.msg.model=-> gew臧ltes DVB Untertitel Farbmodell: {0} ; fixiert auf Seitennr.: +subpicture.msg.output=-> Exportformat: +subpicture.msg.tmpfile=-> temp. Datei: {0} ({1} Bytes) +subpicture.progress=prfe & synchronisiere +subpicture.msg.discard=!> {0} PTS's ausgelassen im Strom +subpicture.msg.pts.mismatch=!> Video & Untertitel PTS stimmen zu keiner Zeit berein! +subpicture.msg.adjust.at.video=-> passe Untertitel an Video-Zeitlinie an +subpicture.msg.adjust.at.own=-> passe Untertitel an eigene Zeitlinie an +subpicture.msg.syncword.lost=!> Synchronisationswort fehlt bei Pos.: +subpicture.msg.syncword.found=!> Synchronisationswort gefunden bei Pos.: +subpicture.msg.error={0} bei Pos.: {1}, verwerfe Bild... +subpicture.msg.dvbsource=-> Quelle enth舁t DVB Untertitel... +subpicture.status=Bilder: +subpicture.preview.title.dvdexport=/ Bild {0} -> Anzeige: {1} Dauer: +subpicture.preview.title.dvbexport=/ Seitennr. {0} / Bild {1} -> Anzeige: {2} Dauer: +subpicture.msg.forced=ab Bild Nr. +subpicture.msg.forced.no=-> Anzeigestatus: nicht erzwungen, +subpicture.msg.forced.yes=-> Anzeigestatus: erzwungen, +subpicture.preview.title.noexport=/ Bild nicht exportiert... +subpicture.msg.pts.start_end=Untertitel PTS: erstes Paket {0}, letztes Paket +subpicture.msg.summary={0} Untertitel geschrieben... +subpicture.summary=Untertitel {0}:\t{1} Bilder\t{2}\t +subpicture.msg.error.eof=!> Untertitel EOF erreicht mit Fehlern: +subpicture.msg.error.io=!> Untertitel I/O Fehler: {0} / +subpicture.msg.error.dvbdecoding=!> Dekodierfehler: {0}, Bereichs_Id {1} (PTS {2}) + +#LPCMprocess +lpcm.msg.develop=...in Entwicklung... +lpcm.msg.tmpfile=-> temp. Datei: {0} ({1} Bytes) +lpcm.progress=prfe & synchronisiere +lpcm.msg.pts.mismatch=!> Video & Audio PTS stimmen zu keiner Zeit berein! +lpcm.msg.adjust.at.video=-> passe LPCM an Video-Zeitlinie an +lpcm.msg.adjust.at.own=-> passe LPCM an eigene Zeitlinie an +lpcm.msg.syncword.lost=!> Synchronisationswort fehlt bei Pos.: +lpcm.msg.syncword.found=!> Synchronisationswort gefunden bei Pos.: +lpcm.msg.source=-> Ursprungsformat: {0} @ +lpcm.msg.source.max=-> Ursprungsformat: stoppe Meldungen, mehr als 100 Modiwechsel in einer Datei reduzieren Geschwindigkeit +lpcm.msg.error.align=!> Paket nicht nach 'WORD' ausgerichtet +lpcm.msg.pts.start_end=LPCM PTS: erstes Paket {0}, letztes Paket +lpcm.msg.summary={0} Pakete geschrieben... +lpcm.summary=LPCM {0}:\t{1} Pakete\t{2}\t +lpcm.error.eof=!> LPCM EOF erreicht mit Fehlern: +lpcm.error.io=!> LPCM I/O Fehler: {0} / + +#various +logalias.error.io=!> Logalias IO Fehler: +all.msg.pts.faked=--> benutze imagin舐e PTS fr folgende Daten: +all.msg.error.max=-> mehr als 500 Warn-/Fehlermeldungen, weitere werden nicht mehr angezeigt.. +all.msg.error.summary=-> es wurden {0} Warn-/Fehlermeldungen ausgegeben. +all.msg.noprimaryfile=!> Dateityp wird nicht als Sekund舐datei untersttzt. Reihenfolge prfen. + +#demux +demux.error.audio.startcode=!> ungltiger Startcode, verwerfe PES Paket +demux.error.audio.io=!> demultiplex Audio Fehler: +demux.error.video.io=!> demultiplex Video Fehler: +demux.msg.celltimes=--> Celltimes in: {0}CellTimes.txt +demux.error.video.startcode=!> ungltiger Startcode, verwerfe Video PES Paket +demux.error.video.payload=!> erhaltenes PES Paket ohne Daten oder mit falschen Kopfdaten +demux.msg.skip.sec=-> berspringe Sequenzendcode folgend auf GOP# +demux.error.gop.toobig=!> verwerfe Videodaten, GOP gr゚er als 6MB + +#ftpchooser +ftpchooser.server.Tip=Name oder IP Adresse des FTP-Servers +ftpchooser.server=Server: +ftpchooser.port.Tip=Port des FTP Servers +ftpchooser.port=Port: +ftpchooser.user.Tip=Benutzer fr FTP-Verbindung +ftpchooser.user=Benutzer: +ftpchooser.password.Tip=Passwort fr FTP-Verbindung +ftpchooser.password=Passwort: +ftpchooser.directory.Tip=Verzeichnis auf dem FTP-Server +ftpchooser.directory=Verzeichnis: +ftpchooser.test=Test +ftpchooser.state.Tip=Zustand der Verbindung +ftpchooser.state=Zustand: +ftpchooser.untested=ungetestet, prfe Verbindung +ftpchooser.ok=OK +ftpchooser.cancel=Abbrechen +ftpchooser.title=FTP-Serverauswahl +ftpchooser.msg.noconnect=Verbindung nicht mglich. +ftpchooser.msg.nologin=Anmeldung fehlgeschlagen. +ftpchooser.msg.nodirectory=kann Verzeichnis nicht wechseln. +ftpchooser.msg.success=Verbindung erfolgreich. +FtpServer.Commands=FTP Kommando: +FtpServer.Commands.Tip=benutzerspezifische FTP Kommandos fr FTP-Zugriff, mehrere Kommandos trennen mit '|' + +#JobCollection +JobCollection.NoInfo=keine Angaben +JobCollection.InProgress=Bearbeitung l舫ft! +JobCollection.Idle=Ruhezustand. +JobCollection.Action=Aktion: +JobCollection.unspecified=nicht spezif. +JobCollection.PrimaryFileSegments=Datei-Segmente: +JobCollection.SecondaryFiles=sekund. Dateien: +JobCollection.Cutpoints=Schnittpunkte: +JobCollection.Chapters=Kapitel: +JobCollection.PidSelection=PID-Auswahl: +JobCollection.OwnSettings=sep.Einstell.: +JobCollection.AllSize=Gr゚e \u03A3: + +#CollectionTable +CollectionTable.FileLocation=Speicherort +CollectionTable.FileName=Dateiname +CollectionTable.Size=Gr゚e +CollectionTable.lastModified=Ge舅dert am +CollectionTable.Streamtype=Stromtyp +CollectionTable.Source=Src + +#PreviewPanel +PreviewPanel.saveCurrentPicture=aktuelles Bild speichern.. +PreviewPanel.saveCurrentPictureDAR=aktuelles Bild mit DAR speichern .. + +#NetPanel +NetPanel.WebServerPort=Port: +NetPanel.WebServerAccess=AccessString: +NetPanel.autostartWebServer=autostart WebIFServer \ No newline at end of file diff -Nru project-x-0.90.4dfsg/resources/pjxresources_dk.properties project-x-0.91.0/resources/pjxresources_dk.properties --- project-x-0.90.4dfsg/resources/pjxresources_dk.properties 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/resources/pjxresources_dk.properties 2009-10-03 09:22:58.000000000 +0000 @@ -0,0 +1,1277 @@ +# Project-X Resource File +# dansk, V 1.2 (19. september 2005)[for 0.90.4 30.03.2006] +# by jazzydane (Ingmar Jrgensen) + +# Credits +credits=dvb.matt - opfinderen af Project-X\n\ +Lucike - forum hoster, dokumentation\n\ +TheHorse - tastaturkontrol ved gennemsyn\n\ +java.lang - betinget tilpasning af H-oplsning\n\ +R-One - DTS understttelse\n\ +ghost - dreambox fil segment fuldfrelse\n\ +roehrist - CVS, X-input, ftp\n\ +pstorch - i18n understttelse, indstillinger\n\ +chrisg - Topfield disk adgang (Tilfjelse)\n\ +jazzydane - dansk overs誥telse\n\ +Kano / RoEn - Unix script opbygning\n\ +Eric Albert - browser opstart\n\ +catapult,Bonni - Topfield 5x00 eksport\n\ +...og alle andre supportere... + +# +Common.File=&Fil +Common.Save=&Gem +Common.SaveAs=Gem &som.. +Common.Open=&ナben.. +Common.Load=&Indl誑.. +Common.Edit=&Rediger +Common.Messages=&Beskeder +Common.Options=Indsti&llinger +Common.Close=&Luk +Common.Cancel=&Afbryd +Common.Exit=Afsl&ut +Common.LogFile=&Logfil +Common.Preferences=&Forudindstillinger +Common.Addons=&Tilfjelser + +General.Yes=Ja +General.No=Nej + +StartUp.Title=X Startup, indl誑er komponenter... +StartUp.Error=Fejl ved opstart af Project-X: +StartUp.Error.Title=Project-X Opstarts fejl +StartUp.Init=Initialiserer. +StartUp.Wait=Vent venligst... +StartUp.Choose=Foretag et valg... + +# +PreferencesPanel.Title=Forudindstillinger +PreferencesPanel.Button=Forudindstillinger + +Application.SaveSettingsOnExit=Gem indstillinger ved afslutning +Application.InputDirectoriesDepth=underkatalog udvidelse (FILER + FTP) + +# Popupmenu +popup.what=hvad +popup.cutspecials=蘆en Besk誡ing/Speciel.. +popup.url=URL tilfj.. +popup.add=tilfj +popup.remove=fjern +popup.rename=omdb +popup.openhex=蘆en i Hexviewer.. +popup.patchbasics=tilpas Video Basics.. +popup.sendtocl3=send til CL#3.. +popup.newOutName=Eksporter som.. +popup.changeTimestamp=opdater filens tidsmarkering.. +popup.copyInfoToClipboard=kopier filinformationer til copy file info to clipboard +popup.assignStreamType=tilknyt stream typen direkte.. +popup.automatic=automatisk +popup.assignActionType=tilknyt handlings typen direkte.. +popup.unspecified=uspecificeret +popup.fixHpAc3=opret korrigeret Hpョ ac3 fil.. +popup.stripAudio=strip raw audio data from DD/DTS-Wave.. + +#Filechooser +FileChooser.Select=Marker +FileChooser.Title=ナbn fil + +#File Menu +file.menu=&Filer +file.url=&URL tilfj.. +file.add=&Tilfj.. +file.remove=F&jern +file.rename=&Omdb.. +file.exit=&Afslut + +#dialog +dialog.input.url=indtast en URL.. + +#Settings Menu +settings.menu=&Indstillinger +settings.settings=&Indstillinger.. + +#Language Menu +language.menu=&Sprog +language.system=S&ystem standard +language.check=tjek &online + +#General Menu +general.menu=&Udseende + +#Options Menu +options.menu=&Rediger +options.opencutspecials=蘆en &Filmbesk誡ing/Speciel.. +options.openhexview=蘆en i &HexViewer.. +options.pachtbasics=tilpas &Video Basics.. +options.subtitlepreview=vis &Undertekst gennemsyn.. +options.teletext=vis &Teletekst sidematrix.. + +#Help Menu +help.menu=&Hj詬p +help.about=&Om.. +help.help=&Hj詬p.. +help.lucike.info=http://www.lucike.info +help.lucike.forum=http://forum.lucike.info +help.sourceforge.net=http://sourceforge.net/projects/project-x +help.version=&Seneste version? +help.version.info=Seneste version: +help.version.info.title=Seneste version af Project-X +help.version.error=Fejl ved modtagelse af seneste version: + +progress.title=Proces + +#Html Frame +html.title=Hj詬p + +#Buttons +button.go=&Kr! +button.go.Tip=starter, stopper eller genoptager bearbejdning +button.i=&I +button.i.Tip=lille bearbejdning/scanning for at samle information om ID'er i streamfilen (i den angivne filstrrelse, se fanebladet ) +button.c=&C +button.c.Tip=afbryd den igangv誡ende bearbejdning +button.p=&P +button.p.Tip=stop(pause) eller forts誥 igangv誡ende bearbejdning +button.e=&E +button.e.Tip=PVA raw fil ekstrahering, benytter det angivne ID: (tryk 'i' for at se de fundne ID's) + +#Mainpanel +MainPanel.Collection=Kollektion +MainPanel.Process=Proces +MainPanel.Process.Tip=hvis ej Demultiplex, konverteres et stream format til et andet (kopierer stream indhold, ingen fejl korrektion!!) +MainPanel.BitrateMonitor.Tip=faktiske bitrate af GOP fra 0...10Mbps (afh誅ger af beregningsmetode) / GOP struktur / afspilningstid +MainPanel.writtenMB=ud MB +MainPanel.writtenMB.Tip=genererede MB af den nyoprettede fil kollektion (uden midlertidige filer) +MainPanel.useAllCollections=alle koll.'er +MainPanel.useAllCollections.Tip=aktiver at bearbejde alle kollektioner i en arbejdsgang +MainPanel.enablePostProcessing=efter proces +MainPanel.enablePostProcessing.Tip=aktiver efterbearbejdnings proces (-> se fanebladet 'Ekstern'; panelet "Ekstern program dialog" ) +MainPanel.simpleMPG=MPG=>sPES +MainPanel.simpleMPG.Tip=simpel PES analysering, aktiver for MPEG-PS inklusive data uden en regul誡 sub ID af private_stream_1 +MainPanel.enhancedPES=sPES=>MPG +MainPanel.enhancedPES.Tip=udvidet PES analyse, brug n蚌 PES indeholder data med et under ID af private_stream_1 +MainPanel.nonVideoExportStatus=ej startet +MainPanel.nonVideoExportStatus.Tip=status for lydeksport eller undertekster +MainPanel.AudioVideoOffset=A/V afstand +MainPanel.AudioVideoOffset.Tip=vis den A/V tidsaftsand i begyndelsen af hver GOP i ms: a/b/c

(besk誡ing, variable GOPs for蚌sager forskellige tidsafstande)

a) A/V PTS afstand i kildedata

b) midlertidig A/V afstand for den aktuelle GOP i den demultiplexede fil

c) endelig A/V afstand for den aktuelle GOP i den demultiplexede fil +MainPanel.ConversionMode.demux=demultiplex +MainPanel.ConversionMode.toVDR=til VDR +MainPanel.ConversionMode.toM2P=til M2P +MainPanel.ConversionMode.toPVA=til PVA +MainPanel.ConversionMode.toTS=til TS +MainPanel.ConversionMode.PidFilter=PIDFilter (1:1 Copy) +MainPanel.ConversionModePriority=Kollektion har forrang +MainPanel.ConversionModePriority.Tip=brug kollektionens handlings type +MainPanel.useAutoPidFilter=apply PMT-PID filter +MainPanel.useAutoPidFilter.Tip= +MainPanel.QuickStart=Hurtig start +MainPanel.QuickStart.Tip=starter bearbejdning straks, benytter senest anvendte indstillinger + + +ProcessWindow.Title=Proces vindue +ProcessWindowPanel.Button=klargr >> +ProcessWindowPanel.Title=Log meddelelser +ProcessWindowPanel.Action=Handling: + +#Tab.msg +MessagePanel.Title=besked h蚣dtering +MessagePanel.logSequenceError=log 'pakker udenfor sekvens' / bit fejl +MessagePanel.logSequenceError.Tip=sl fra, hvis denne besked bombarderer logvinduet (og neds誥ter hastigheden) +MessagePanel.logMissingStartcode=log 'manglende startkoder' +MessagePanel.logMissingStartcode.Tip=sl fra, hvis denne besked bombarderer logvinduet (og neds誥ter hastigheden) +MessagePanel.logESError=log 'PES header fundet i ES' +MessagePanel.logESError.Tip=sl fra, hvis denne besked bombarderer logvinduet (og neds誥ter hastigheden) +MessagePanel.leadingTimeIndex=tilfj tidmarkering for bearbejdningen p alle log beskeder +MessagePanel.leadingTimeIndex.Tip= +MessagePanel.logWSS=log WSS +MessagePanel.logWSS.Tip= +MessagePanel.logVPS=log VPS +MessagePanel.logVPS.Tip= +MessagePanel.logRDS=log RDS +MessagePanel.logRDS.Tip= +MessagePanel.hideProcessWindow=gem proces vinduet under bearbejdningen +MessagePanel.hideProcessWindow.Tip= +MessagePanel.minimizeMainFrame=minimer hovedvinduet under bearbejdningen +MessagePanel.minimizeMainFrame.Tip= +MessagePanel.showSubpictureWindow=vis gennemsyn af underbillede mens underbillederne dannes +MessagePanel.showSubpictureWindow.Tip= +MessagePanel.logErrorMaximum=log maks. 500 advarsler/fejl +MessagePanel.logErrorMaximum.Tip= + +#usage note +usage=kvik CL (kommandolinie)\n\ +OBS: CL viser ikke grafiske komponenter, undtagen med kommandoen [-gui]\n\ + ...starter den grafiske brugergr誅seflade\n\ +kommandoer og input filer kan angives vilk蚌ligt\n\ +\n\ +valgmuligheder:\n\ +[-ini ] ..benyt en anden konfigurations fil end standard filen X.ini\n\ +[-dvx1] ..opret en .d2v projekt fil ved demux\n\ +[-dvx2] ..opret en .d2v projekt fil + .ac3.wav (RIFF WAVE Header)\n\ +[-dvx3] ..opret en .d2v projekt fil + .mpa.wav (RIFF WAVE Header)\n\ +[-dvx4] ..opret en .d2v projekt fil + .ac3.wav + mpa.wav (RIFF WAVE Header)\n\ +[-out ] ..benyt den angivne mappe til output\n\ +[-name ] ..benyt det angivne fil navn til output\n\ +[-cut ] ..benyt denne fil som besk誡ings liste\n\ +[-chp ] ..benyt denne fil som kapitel liste\n\ +[-id ] ..anvend kun disse (P)IDs, adskilt af komma \",\"\n\ +[-gui] ..vis den grafiske brugerflade med de angivne CLI valgmuligheder\n\ +[-log] ..skriv en normal log fil\n\ +[-saveini] ..gem 誅dringer ved CLI i den aktive .ini +[-split ] ..opdel output ved xxx MB\n\ +[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..action types + +#conditions +terms=\n\ +ANVENDELSESBETINGELSER:\n\ +(1) Dette er et gratis Java baseret demultiplex v誡ktj.\n\ +(2) Programmet er udelukkende lavet med henblik p uddannelsesbrug, som et ikke kommercielt test projekt.\n\ +(3) Programmet er offentliggjort under licens fra GNU GPL.\n\ +(4) Der er ikke knyttet GARANTI af nogen art til dette program.\n\ +(5) M anvendes p egen risiko og kun til uddannelsesform虱.\n\ + +terms.disagree=Jeg er uenig (lukker) +terms.agree=Jeg er enig + +startup.title=X opstart, indl誑er komponenter... +startup.error=Fejl ved opstart af Project-X: +startup.error.title=Project-X opstarts fejl + +about.title=Om.. +about.ok=OK +about.credits.label=Anerkendelser: + +#version info +version.info=UDELUKKENDE TEST PROJEKT +version.user=, Bruger: + +#JavaEV +javaev.java.version=java.version +javaev.java.vendor=java.s詬ger +javaev.java.home=java.hjem +javaev.java.vm.version=java.vm.version +javaev.java.vm.vendor=java.vm.s詬ger +javaev.java.vm.name=java.vm.name +javaev.java.class.vers=java.class.vers +javaev.java.class.path=java.class.sti +javaev.java.os.name=os.navn +javaev.java.os.arch=os.arch +javaev.java.os.version=os.version +javaev.java.user.name=bruger.navn +javaev.java.user.home=bruger.hjem +javaev.java.user.lang=bruger.sprog +javaev.java.ini.file=ini.fil +javaev.java.disk.access=ext.disk.adg. + +#messages +msg.infomessage=Information +msg.new.language=For at 誅dre sprog, skal Project-X genstartes. +msg.loadlang.error=Fejl ved indl誑ning af sprog: +msg.init.error=Initialisieringsfejl: +msg.loadini.error=Fejl ved indl誑ning af ini fil: +msg.saveini.error=Fejl ved gemning af ini fil: +msg.loading.cutpoints=-> indl誑er {0} besk誡ingspunkter... +msg.loading.cutpoints.error=Fejl ved indl誑ning af besk誡ingspunkter +msg.loading.pids=-> indl誑er {0} (P)IDs... +msg.ptsfile.error=..pts fil adgangs fejl: +msg.savecut=-> gemmer besk誡ings PTS v誡di ({0}) i fil.. +msg.savecut.error=Fejl ved gemning af besk誡ingspunkt: +msg.log.error=log fejl: +msg.cuts.cutin=-> Eksport startet ved @ GOP# {0} / nyt billednr. {1} / nyt tidsindeks {2} +msg.cuts.cutout=-> Eksport stoppet ved @ GOP# {0} +msg.newfile=---> ny fil: +msg.browser.launcher.error=browser opstarts fejl: + +#Hex Viewer +hexviewer.title=Hex Gennemsyn +hexviewer.file=Hex Gennemsyn af filen +hexviewer.filesize= Strrelse +hexviewer.error=..Kan ikke tilg filen +hexviewer.save=Hex Gennemsyn, gemmer +hexviewer.close= afslut +hexviewer.to=til +hexviewer.extractfrom=ekstraher fra: (hex.) +hexviewer.extractfrom_tip=tryk her, for at ekstrahere til en ny fil +hexviewer.extract_tip=ekstraher fil segment til en ny fil +hexviewer.jumptohex=Hop til Hex.: +hexviewer.jumptodec=Hop til Dec.: +hexviewer.jumpto_tip=tryk p Enter tasten for at hoppe til fil positionen +hexviewer.textmode=tekstmodus + +#TeletextPageMatrix +ttpagematrix.title=Teletekst sideMatrix +ttpagematrix.tip=formindsker arbejdshastigheden, hvis synlig +ttpagematrix.file=fil +ttpagematrix.composition1=teletekst sidenummer sammenstilling +ttpagematrix.composition2='MXY' : M = magasin nummer, XY = side nummer +ttpagematrix.composition3=magasin nummer farver + +#Scan +scan.unsupported=Filtypen er ikke understttet +scan.msg1=ingen film fundet ved kort scanning +scan.msg2=ingen lyd fundet ved kort scanning +scan.msg3=ingen teletekst fundet ved kort scanning +scan.msg4=ingen undertekst fundet ved kort scanning +scan.msg5=ingen PMT fundet +scan.msg6=PMT analyse fejl (sprog) +scan.msg7=film data, men uden sequence header fundet ved kort scanning +scan.msg8=analyseringsfejl +scan.msg9=filen begynder ikke med en sequence header! + +#TS +ts.msg1=!> ingen program ID's fundet! ..benytter standard PMT + +#WSS +wss.run_in=Run-In-Code fundet +wss.no_run_in=ingen Run-In-Code fundet +wss.startcode=Start-Code fundet +wss.no_startcode=ingen Start-Code fundet +wss.start=start +wss.group_1=Group 1 (Billed format) +wss.group_2=Group 2 (Billed forbedringer) +wss.group_3=Group 3 (Undertekster) +wss.group_4=Group 4 (andet) +wss.group_1.0001=4:3 fuld format, 576 linier, full screen +wss.group_1.1000=14:9 letterbox, 504 linier, midt +wss.group_1.0100=14:9 letterbox, 504 linier, top +wss.group_1.1101=16:9 letterbox, 432 linier, midt +wss.group_1.0010=16:9 letterbox, 432 linier, top +wss.group_1.0111=14:9 fuld format, 576 linier, midt, fuld sk誡m +wss.group_1.1110=16:9 fuld format, 576 linier, fuld sk誡m +wss.group_1.error=fejl ved analyse af group 1 (bits0..3) +wss.group_2.0.01=kamera modus +wss.group_2.0.10=film modus +wss.group_2.0.00=fejl ved analyse af bit4 +wss.group_2.1.01=standard PAL +wss.group_2.1.10=MACP (motion adaptive color plus) +wss.group_2.1.00=fejl ved analyse af bit5 +wss.group_2.2.01=ingen hj詬per +wss.group_2.2.10=hj詬per modulation (PALplus) +wss.group_2.2.00=fejl ved analyse af bit6 +wss.group_2.3.01=reserveret (0) +wss.group_2.3.10=reserveret (1) +wss.group_2.3.00=fejl ved analyse af bit7 +wss.group_3.0.01=ingen undertekster i teletekst +wss.group_3.0.10=undertekster i teletekst +wss.group_3.0.00=fejl ved analyse af bit8 +wss.group_3.1.00=ingen 'open subtitles' +wss.group_3.1.01='open subtitles' indenfor det aktive billede +wss.group_3.1.10='open subtitles' udenfor det aktive billede +wss.group_3.1.11=reserved (11) +wss.group_3.1.err=fejl ved analyse af bit9..10 +wss.group_4.0.01=ingen surround sound +wss.group_4.0.10=surround sound +wss.group_4.0.00=fejl ved analyse af bit11 +wss.group_4.1.01=ingen copyright/ukendt +wss.group_4.1.10=copyright h誚det +wss.group_4.1.00=fejl ved analyse af bit12 +wss.group_4.2.01=kopiering er ikke sp誡ret +wss.group_4.2.10=kopiering er sp誡ret +wss.group_4.2.00=fejl ved analyse af bit13 +wss.group_4.1.err=fejl ved analyse af bit12..13 + +#Subpicture +subpicture.title=Underetekst Gennemsyn +subpicture.in_time=i +subpicture.duration=varighed +subpicture.msg1=!> undertekst, skrive fejl +subpicture.msg2=!> enkelt pakke (tidsangivelse) +subpicture.msg3=!> undertekst, ukendt kommando + +#RawRead +rawread.msg1=deaktiveret eller mappe ikke fundet + +#Common +common.rename_error1=!> kan ikke omdbe: +common.rename_error2=til + +#TabPanel +TabPanel.LogwindowPanel=log +TabPanel.FileinfoPanel=info +TabPanel.MessagePanel=besked +TabPanel.ExportPanel=eksport +TabPanel.SpecialPanel=spec. +TabPanel.VideoPanel=film +TabPanel.AudioPanel=lyd +TabPanel.SubtitlePanel=undertekst +TabPanel.ExternPanel=ekstern +TabPanel.OptionPanel=tilpas +TabPanel.NetPanel=net +TabPanel.PostCommandsPanel=efterbearbejdning + +#Tab.logwindow +LogwindowPanel.showTtxHeader=TTX +LogwindowPanel.showTtxHeader.Tip=vis teletekst hoved linie og VPS status (formindsker hastighed, hvis aktiveret) +LogwindowPanel.showTtxHeader.Tip1=hoved linie p den aktult transmitterede side (r詭ke 0) +LogwindowPanel.showVpsLabel.Tip=kort VPS status (VBI-linie 16), et par stationer har meningsfulde VPS data via DVB-teletekst + +#Tab.options +OptionPanel.Various.Title=diverse +OptionPanel.LookAndFeel=installerede 'look & feels': +OptionPanel.LookAndFeel.Info1=v詬g din foretrukne 'look & feel' +OptionPanel.LookAndFeel.Info2=nogle gange er 'look & feel' ikke fuld kompatibel +OptionPanel.DebugLog=stor log fil +OptionPanel.DebugLog.Tip=neds誥ter hastigheden, kun til test form虱 +OptionPanel.NormalLog=normal log fil +OptionPanel.NormalLog.Tip=skriv indholdet i log vinduet til en fil +OptionPanel.dumpDroppedGop=send ubrugelige GOPs til separate filer +OptionPanel.dumpDroppedGop.Tip=kun tilt誅kt for senere fejl analyser +OptionPanel.StartPath=start mappe for valg af filer: +OptionPanel.StartPath.Value.Tip=lad forblive tom eller indtast en sti at starte i, et indledende '?' vil srge for at man vender tilbage til denne sti +OptionPanel.Buffer.Title=buffer +OptionPanel.MainBuffer=hoved Input/Output-buffer i bytes +OptionPanel.MainBuffer.Tip=lavere v誡dier kan forhindre hukommelsesfejl -> OutOfMemory fejl +OptionPanel.PesPreBuffer=I-buffer i bytes (kun PES pakkestrrelse=0 !) +OptionPanel.PesPreBuffer.Tip=prv lavere/hjere v誡dier, hvis du arbejder med film streams med hje high bitrater +OptionPanel.ScanBuffer=hurtig scan buffer i bytes +OptionPanel.ScanBuffer.Tip=prv lavere/hjere v誡dier, hvis kendte filtyper ikke opdages +OptionPanel.PreviewBuffer=Gennemsyns buffer i bytes +OptionPanel.PreviewBuffer.Tip=lavere v誡dier ger gennemsynshastigheden, med mulige tab af billed data +OptionPanel.callGc=skraldespand +OptionPanel.callGc.Tip=kalder skraldespanden +OptionPanel.closeOnEnd=luk program n蚌 processen er slut +OptionPanel.closeOnEnd.Tip=lukker programmet ved afslutning +OptionPanel.holdStreamInfoOnOSD=hold StreamInfo on OSD +OptionPanel.holdStreamInfoOnOSD.Tip=hold StreamInfo on OSD +OptionPanel.additionalInputBuffer=brug yderligere input buffer +OptionPanel.additionalInputBuffer.Tip=brug yderligere input buffer p 1MB, bedre ved sm data segmenter + +#ScanInfo +ScanInfo.Location=Placering: +ScanInfo.Name=Navn: +ScanInfo.Size=Strrelse: +ScanInfo.Bytes=bytes +ScanInfo.Type=Type: +ScanInfo.Date=Dato: +ScanInfo.Video=Film: +ScanInfo.Audio=Lyd: +ScanInfo.Teletext=Teletekst: +ScanInfo.Subpicture=Undertekst.: +ScanInfo.Playtime=forv. spilletid: +ScanInfo.NotFound=Filen eksisterer ikke! + +#Execute +PostCommands.Title=eksterne programmer +PostCommands.PostProcessing=efter bearbejdning: +PostCommands.PostProcessing.Tip=gennemfr denne kommando efter at en kollektion/opdeling er blevet bearbejdet +PostCommands.Execute=gennemfr +PostCommands.Close=afslut +PostCommands.Error=!> udfrelses fejl: + +#Collection +CollectionPanel.Title=kollektion specialindstillinger +CollectionPanel.Title2=kollektion specialindstillinger for koll.# +CollectionPanel.Title.processingPreview=bearbejder gennemsyn... +CollectionPanel.CutPanel=gennemsyn/filmbesk誡ing +CollectionPanel.CutPanel.Tip1=benyt ogs tastatur taster til navigering, gennemsyn kun bytepos. til besk誡inger +CollectionPanel.CutPanel.Tip2=aktive fil/antal filer + filnavn p aktive fil +CollectionPanel.CutPanel.Tip3=bearbejdet (P)ID for at f det nuv誡ende billede +CollectionPanel.CutPanel.Tip4=indtast tal/nummer, eller tr詭 en besk誡ingspunkts fil herover og slip den +CollectionPanel.addPoint=tilfj punkt +CollectionPanel.removePoint=fjern punkt +CollectionPanel.NumberOfPoints=Antal punkter +CollectionPanel.NumberOfPoints.Tip=alle v誡dier sorteres automatisk +CollectionPanel.NumberOfChapters=Kapitler +CollectionPanel.NumberOfChapters.Tip=alle numre sorteres automatisk +CollectionPanel.expectedSize=Strr.: ~ +CollectionPanel.Preview.offline=gennemsyn er ikke tilg誅gelig +CollectionPanel.Preview.processedPid=bearbejder Video (P)ID 0x +CollectionPanel.Various=diverse +CollectionPanel.Preview.fastDecode=hurtig afkodning af gennemsyn +CollectionPanel.Preview.fastDecode.Tip=rekonstruerer og interpolerer kun 1 ud af 64 pixels +CollectionPanel.Preview.LiveUpdate=live opdatering ved scrolling +CollectionPanel.Preview.LiveUpdate.Tip=anbefales ikke ved langsomme systemer eller fil adgang, refererer til gennemsyns bufferen +CollectionPanel.Preview.AllGops=vis GOP's uden sequence header +CollectionPanel.Preview.AllGops.Tip=anbefales ikke til DVB data, aktiver kun for nogle streams med kun en sequence header! +CollectionPanel.PidList=PES(&Sub)-ID/PID liste: +CollectionPanel.PidList.Tip1=indtast PES-ID eller sub-ID (MPG etc) eller PID (PVA,TS); tom liste == brug alle ID's +CollectionPanel.PidList.Tip2=dobbeltklik for at fjerne den valgte indtastning +CollectionPanel.transferPids1=overfr valgte (P)ID's til ny koll.# +CollectionPanel.transferPids1.Tip=alle valgte (P)ID's p listen overfres til en ny kollektion +CollectionPanel.transferPids2=overfr besk誡ings par til ny koll.# +CollectionPanel.transferPids2.Tip=ethvert bek誡ings par overfres til en ny kollektion +CollectionPanel.ExportLimits=yderligere eksport begr誅sninger: +CollectionPanel.OptionHorizontalResolution=H-Oplsng.: +CollectionPanel.OptionHorizontalResolution.Tip=global,..som automatisk vil ignorere andre film sekvenser +CollectionPanel.OptionDAR=DAR: +CollectionPanel.OptionDAR.Tip=global,..som automatisk vil ignorere andre film sekvenser +CollectionPanel.loadCutpointList=indl誑 besk誡ingspunkter fra fil +CollectionPanel.loadCutpointList.Tip=蘆en en besk誡ingspunkts fil eller tr詭 den herover og slip den +CollectionPanel.saveCutpointList=gem besk誡ingspunkter p fil +CollectionPanel.ApplyAndClose=godkend & luk +CollectionPanel.Apply=godkend +CollectionPanel.CutMode.Bytepos=(0) benyt bytepos. til besk誡inger +CollectionPanel.CutMode.Gop=(1) benyt GOP nummer til besk誡inger +CollectionPanel.CutMode.Frame=(2) benyt billed nummer til besk誡inger +CollectionPanel.CutMode.Pts=(3) benyt PTS til besk誡inger +CollectionPanel.CutMode.Timecode=(4) benyt Tidsindeks til besk誡inger +CollectionPanel.Preview.Error=gennemsyns fejl: +CollectionPanel.FileAccessError=.. kan ikke tilg fil +CollectionPanel.Title.Error=kollektion specialindstilling for koll.# {0} -> FEJL! kollektionen eksisterer ikke +CollectionPanel.loadCutpointList.Error=fejl ved indl誑ning +CollectionPanel.Preview.disable=deaktiver gennemsyn +CollectionPanel.Preview.disable.Tip= + +#makeVDR +StreamConverter.IOError=!> stream skabelse IO fejl: +StreamConverter.PayloadError=!> modtagne PES pakke uden data eller med forkerte header data +StreamConverter.Summary=Stream: + +#patch +PatchPanel.Title=rediger film informationer i 1. sekvens header +PatchPanel.Error=patch fejl +PatchPanel.Error2=patch fejl 2 +PatchPanel.Change=誅dre +PatchPanel.Cancel=afbryd + +#CutListener +cutlistener.wrongnumber=-> forkert nummer som ID + +#GoListener +golistener.msg.cancelled=--- bearbejdning afbrudt ---- +golistener.msg.paused=--- bearbejdning pauseret ---- +golistener.msg.resumed=--- bearbejdning genoptaget ---- +golistener.msg.extracting=ekstraherer raw(PES) data fra ID 0x + +#AC3 +ac3.msg.loading.start=indl誑er AC3 rammer: +ac3.msg.loading.error=fejl ved indl誑ning af ac3.bin +ac3.msg.frames=ac3.bin indeholder {0} AC3 rammer + +#Run +run.prepare.colls=forbereder kollektionen/kollektionerne... +run.av.offset=A/V tidsafstand +run.session.infos=<<< session information >>> +run.working.coll=-> arbejder med kollektion +run.split.output=-> adskille output ved omtrent +run.add.time.offset=-> tilfje tidsgab til audio/ttx/pics : {0} ms (hvis det flger en film) +run.stream.type.disabled=-> PES stream type afbrudt: +run.write.output.to=-> skriver output filer til: +run.write.output.notexists=!> angivne output mappe ikke tilg誅gelig +run.write.output.nowriteaccess=!> ingen skriveadgang i angivne output mappe +run.cutpoints.defined=besk誡ingspunkt(er) defineret +run.start.quick.info=<<< kvik info >>> +run.end.quick.info=<<< slut p kvik info >>> +run.no.input=ingen input fil... +run.write.raw=skriv separeret raw fil til: +run.coll.empty=Kollektionen er tom... +run.done=done... {0} kollektion(er) bearbejdede @ +run.stopped=stoppet... +run.status=parat... +run.splitpart=aktuelle del af opdelt output + +#Working +working.convertType.demux=-> demultiplexer +working.convertType.makeVDR=-> opret en VDR (A/V PES) +working.convertType.makeMPG2=-> opret en MPG2 +working.convertType.makePVA=-> opret en PVA +working.convertType.makeTS=-> opret en TS +working.convertType.packetFilter=-> simpel pakke filter +working.file=+> Input File {0}: {1} ({2} bytes) +working.file.not.found=!> Fil blev ikke fundet ! +working.filetype=-> Filen er {0} +working.file.notsupported=!> Filtype ikke understttet ! +working.end.of.part=---> SLUT Pナ DEL +working.summary=opsummering af oprettede medie filer: +working.post.command=-> efter kommando gennemfrt: +working.bytes.written=bytes skrevne... +working.log.error2=log fejl 2: +working.output.std=[res] samme mappe som 1. fil i koll. + +#MPVD +mpvdecoder.tip1=hjre klik for at gemme som bmp + +#FilePanel +FilePanel.DragDrop.Tip=tr詭 filer herover og slip, eller benyt alternativ menu +FilePanel.FileUp.Tip=flyt fil(er) op i kollektions listen +FilePanel.FileDown.Tip=flyt fil(er) ned i kollektions listen +FilePanel.FileRemove.Tip=fjern fil(er) i kollektions listen +FilePanel.CollectionNumber=> koll.# +FilePanel.CollectionNumber.Tip=v詬g den aktive fils kollektion +FilePanel.addCollection.Tip=opret en ny fil kollektion +FilePanel.removeCollection.Tip=fjern fil kollektion +FilePanel.openAutoloadPanel.Tip=蘆en autoindl誑nings fil vinduet +FilePanel.OutputDirectory=output mappe: +FilePanel.OutputDirectory.Tip=angivne output mappe for valgte kollektion +FilePanel.recentOutputDirectories=seneste output mapper: +FilePanel.addRecentOutputDirectory.Tip=tilfj mappen til listen over seneste output mapper +FilePanel.removeRecentOutputDirectory.Tip=fjern mappen til listen over seneste output mapper +FilePanel.Textfield.Tip=Kollektion Info +FilePanel.FileAdd.Tip=tilfj fil(er) til kollektionslisten + +#ExternTab +ExternPanel.Title1=ekstern / efter bearbejdning +ExternPanel.Title1.Tip=definer dine foretrukne programmer +ExternPanel.Applications=ekstern program dialog.. +ExternPanel.createVdrIndex=opret index.vdr i: +ExternPanel.createVdrIndex.Tip=oprettede vdr fil segmenter vil blive omdbt til 0xx.vdr +ExternPanel.createCellTimes=opret cellTimes.txt til flere inifiler/besk誡. +ExternPanel.createCellTimes.Tip=kun demultiplex, tilfj en indgang ved billednummeret for fil skifte og cut-in's (nyt kapitel) +ExternPanel.exportPts=autogem PTS v誡dier for besk誡ing +ExternPanel.exportPts.Tip=at dele og genindl誑e med {PTS cut} i en anden X afvikling +ExternPanel.save1stFrameOfGop=autogem GOP's 1. I-Frame som .bmp +ExternPanel.save1stFrameOfGop.Tip=kun demultiplex... +ExternPanel.createChapters=autogem tidsindeks ved modus 誅dringer +ExternPanel.createChapters.Tip=eksporterer et yderligere tidsindeks angivelser til en liste, hvis der opst蚌 en 誅dring i modus +ExternPanel.renameAudio=omdb alle MPEG-Audio til *.mpa +ExternPanel.renameAudio.Tip=i stedet for at benytte lag nummer -> .mp1, .mp2, .mp3 +ExternPanel.renameVideo=omdb alle MPEG-Video til *.mpv +ExternPanel.renameVideo.Tip=i stedet for at benytte MPEG type -> ..m1v, .m2v +ExternPanel.Title2=indtillinger for eksterne projektfiler +ExternPanel.Title2.Tip=skift indtastninger, hvis du ved hvad du skal gre +ExternPanel.createM2sIndex=Mpeg2Schnitt idd version: V2/A3 +ExternPanel.createM2sIndex.Tip=opret *.idd projektfil ved demux: +ExternPanel.createD2vIndex=opret *.d2v projektfil ved demux: +ExternPanel.createD2vIndex.Tip=hvis hver del skal konverteres separat +ExternPanel.createDgiIndex=opret *.dgi.d2v projektfil ved demux: +ExternPanel.createDgiIndex.Tip=hvis hver del skal konverteres separat +ExternPanel.splitProjectFile=auto opdel video, bevaret som projekt +ExternPanel.splitProjectFile.Tip=auto opdel demultiplexet video i angivne del strrelser, ikke lyd; bedst for store filer p <=FAT32 systemer +ExternPanel.ProjectFileSplitSize=-> opdel kun video p xxx MB: +ExternPanel.ProjectFileSplitSize.Tip= +ExternPanel.appendExtension=tilfj ny fil endelse (PES) +ExternPanel.appendExtension.Tip=vil bevare kildefilens navn (incl. endelse) p alle sekund誡e PES streams +ExternPanel.createInfoLabel=Cuttermaran info ved demux: +ExternPanel.createInfoIndex=Cuttermaran info version: 1.61ff +ExternPanel.createInfoIndex.Tip=opret *.info indeksfil til Cuttermaran ved demux: + +FtpPanel.killFtpClient=fjern klient uden log af +FtpPanel.killFtpClient.Tip=benyt ikke, medmindre ftp serveren ikke accepterer log af indtil en overfrsel er gennemfrt (m ikke afbryde klienten!) +FtpPanel.useFtpServerResume=Server understtter 'Resume' +FtpPanel.useFtpServerResume.Tip= + +#SpecialTab +SpecialPanel.Title1=special 1 +SpecialPanel.PtsShift=global PTS skift (i timer): +SpecialPanel.PtsShift.Tip=prv 'auto', 1..13 eller mellemv誡dier, hvis der er store PTS huller i originaldata (std=0) +SpecialPanel.PVA.FileOverlap=PVA: afprv for overlappende PVA'er +SpecialPanel.PVA.FileOverlap.Tip=deaktiver, hvis flere PVA'er i en optagelse er optaget uden overlap +SpecialPanel.PVA.Audio=PVA: audio behandles forskriftsm誑sigt +SpecialPanel.PVA.Audio.Tip=aktiver for at undg lyd genkendelses fejl; men p nogle optagelser mangler markering! (MD) +SpecialPanel.VOB.resetPts=VOB: find forskellige celle tidslinier +SpecialPanel.VOB.resetPts.Tip=aktiver, hvis PTS'er i r詭keflge VobIds/Cells ikke er fortlbne +SpecialPanel.TS=kun TS relateret: +SpecialPanel.TS.ignoreScrambled=TS: ignorer kodede pakker +SpecialPanel.TS.ignoreScrambled.Tip=deaktiver, hvis du mener pakkerne fejlagtigt er markerede som kodede +SpecialPanel.TS.blindSearch=TS: udvidet sgning for 蘆ne pakker +SpecialPanel.TS.blindSearch.Tip=aktiver, hvis PID efterprvningen afbrydes af ukendt indhold i sgningen +SpecialPanel.TS.joinPackets=TS: sammenfj fil dele (fra Dreamboxョ) +SpecialPanel.TS.joinPackets.Tip=aktiver at sammenfje ukomplette TS pakker ved agr誅sningen af flere fil segmenter +SpecialPanel.TS.HumaxAdaption=TS: Humaxョ tilpasning indl誑. +SpecialPanel.TS.HumaxAdaption.Tip=aktiver for at passe til det s誡lige Humaxョ HD fil format ved indl誑ning af TS +SpecialPanel.TS.FinepassAdaption=TS: Finepassョ tilpasning indl誑. +SpecialPanel.TS.FinepassAdaption.Tip=aktiver for at passe til det s誡lige Finepassョ HD fil format ved indl誑ning af TS +SpecialPanel.TS.JepssenAdaption=TS: Jepssenョ tilpasning indl誑. +SpecialPanel.TS.JepssenAdaption.Tip=aktiver for at passe til det s誡lige Jepssenョ HD fil format ved indl誑ning af TS +SpecialPanel.TS.KoscomAdaption=TS: Koscomョ tilpasning indl誑. +SpecialPanel.TS.KoscomAdaption.Tip=aktiver for at passe til det s誡lige Koscomョ HD fil format ved indl誑ning af TS +SpecialPanel.TS.ArionAdaption=TS: Arionョ tilpasning indl誑. +SpecialPanel.TS.ArionAdaption.Tip=aktiver for at passe til det s誡lige Arionョ HD fil format ved indl誑ning af TS +SpecialPanel.TS.generatePmt=TS: generer PMT stream afh誅gig +SpecialPanel.TS.generatePmt.Tip=deaktiver, for at generere en uafh誅gig forud defineret PMT, som ogs passer til de fleste streams +SpecialPanel.TS.generateTtx=TS: generer info TTX service (test) +SpecialPanel.TS.generateTtx.Tip=tilfj en teletekst service stream (Pid 0x9F) for status informationer p side 150 (kun ved autoPMT) +SpecialPanel.TS.HeaderMode0=(0) ej yderligere TS header +SpecialPanel.TS.HeaderMode1=(1) tilfj Topfieldョ 4000 header til TS +SpecialPanel.TS.HeaderMode2=(2) tilfj Topfieldョ 5000 header til TS +SpecialPanel.TS.HeaderMode3=(3) tilfj Topfieldョ 5x00 header til TS (ny) +SpecialPanel.TS.HeaderMode4=(4) tilfj Topfieldョ 5x00(C) header til TS (ny) +SpecialPanel.TS.HeaderMode5=(5) tilfj Arionョ header til TS +SpecialPanel.TS.setMainAudioAc3=TFョ-header: s誥 AC3 som hoved lydspor +SpecialPanel.TS.setMainAudioAc3.Tip=TFョ-Header: s誥 AC3 som aktive lydspor +SpecialPanel.Title2=special 2 +SpecialPanel.Input.getEnclosedPackets=tag kun lukkede PES/TS pakker +SpecialPanel.Input.getEnclosedPackets.Tip=deaktiver, hvis ingen pakker kunne findes (ved pakke slutning, den n誑te mpeg-stratkode mangler, fx ved faste billeder) +SpecialPanel.Input.concatenateForeignRecords=sammenfj forskellige optagelser +SpecialPanel.Input.concatenateForeignRecords.Tip=aktiver, hvis du vil sammensmelte ens typer af PVA, MPEG eller VDR filer fra forskellige optagelsestidspunkter +SpecialPanel.Audio.ignoreErrors=Audio: benyt kun frste PTS til sync +SpecialPanel.Audio.ignoreErrors.Tip=synkroniserer kun start punktet, efterflgende synkroniseringsfejl forbig蚶, huller bliver ikke udfyldt +SpecialPanel.Audio.limitPts=Audio: brug udvalgte synkroniseringspunkter +SpecialPanel.Audio.limitPts.Tip=bedre end frste Audio PTS (som ovenfor), lyden forbliver givetvis synkron +SpecialPanel.Video.ignoreErrors=Video: ignorer Video fejl efter 1. PTS/GOP +SpecialPanel.Video.ignoreErrors.Tip=aktiver, hvis der sandsynligvis kun er opst蘰t Video PTS fejl (billedet ser OK ud) +SpecialPanel.Video.trimPts=Video: tilpas glidene PTS'er +SpecialPanel.Video.trimPts.Tip=aktiver, hvis lyd eksport stopper tidligt, for蚌saget af glidende PTS forskydning +SpecialPanel.Conversion=kun 'XYZ' konverterings relateret: +SpecialPanel.Conversion.startWithVideo=1. PES pakke skal starte med video +SpecialPanel.Conversion.startWithVideo.Tip=aktiver, hvis nogle afspillere har problemer med at den ikke er der; deaktiver ved rene lyd konverteringer +SpecialPanel.Conversion.addPcrToStream=generer PCR/SCR fra PTS +SpecialPanel.Conversion.addPcrToStream.Tip=anfr PCR tidsgab,DVB behver mere end DVD, hje bitrater behver mere end lavere +SpecialPanel.Conversion.PcrCounter=incTScnt +SpecialPanel.Conversion.PcrCounter.Tip=ger TS-pakke antal selv uden payload(PCR-only); ikke-konform, men nogen gange ndvendigt! + +#OutTab +ExportPanel.SplitPanel=opdel output +ExportPanel.SplitSize=opdel ved ca. xxx MB +ExportPanel.SplitSize.Tip=rediger feltet for en anden strrelse; opdelings strrelsen refererer til den skrevne video filstrrelse! (mpv) +ExportPanel.Overlap=overlap by +ExportPanel.Overlap.Tip= +ExportPanel.StreamtypePanel=stream typer til bearbejdning +ExportPanel.StreamtypePanel.Tip=fra-/v詬g stream typer som du vil bearbejde (omfatter ikke ES som input) +ExportPanel.Streamtype.MpgVideo=Mpg Video +ExportPanel.Streamtype.MpgAudio=Mpg Audio +ExportPanel.Streamtype.Ac3Audio=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio=LPCM Audio +ExportPanel.Streamtype.Teletext=Teletekst +ExportPanel.Streamtype.Subpicture=Undertekst +ExportPanel.Streamtype.Vbi=Generic_VBI +ExportPanel.Streamtype.MpgVideo.Tip=Mpg Video +ExportPanel.Streamtype.MpgAudio.Tip=Mpg Audio +ExportPanel.Streamtype.Ac3Audio.Tip=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio.Tip=LPCM Audio +ExportPanel.Streamtype.Teletext.Tip=Teletext +ExportPanel.Streamtype.Subpicture.Tip=Untertitel +ExportPanel.Streamtype.Vbi.Tip=Generic_VBI +ExportPanel.WriteOptions=skrivemuligheder generelt +ExportPanel.WriteOptions.Tip=omfatter ogs funktionen 'to VDR/MPG/PVA/TS' til at inkludere Audio og/eller Video ES +ExportPanel.WriteOptions.writeVideo=skriv alle video data +ExportPanel.WriteOptions.writeVideo.Tip=skriv alle video data +ExportPanel.WriteOptions.writeAudio=skriv alle andre data +ExportPanel.WriteOptions.writeAudio.Tip=skriv alle andre data +ExportPanel.WriteOptions.InfoScan=infoscanning af de frste xx MB: +ExportPanel.additionalOffset.Title=yderligere tidsforskydning (demultiplex) +ExportPanel.additionalOffset=aktiver tidsforskydning +ExportPanel.additionalOffset.Tip=oprindelig start p stream vil blive rykket med den angivne tidsforskydning +ExportPanel.additionalOffset.Value.Tip=indtast tidsforskydning i ms. og tryk enter +ExportPanel.createSubDirNumber=opret kollektionen som en undermappe +ExportPanel.createSubDirNumber.Tip=global: opret en ny undermappe for hvert kollektions nummer (bedre hvis de samme filer indg蚌 i flere kollektioner) +ExportPanel.createSubDirName=opret kildenavn som undermappe +ExportPanel.createSubDirName.Tip=global: opret en ny undermappe betegnet efter den 1. kildes filnavn i hver kollektion + + +#VideoTab +VideoPanel.Title1=film korrektioner (demultiplex) +VideoPanel.addEndcode=tilfj sekvens slut kode +VideoPanel.addEndcode.Tip=aktiver for at opn konform MPEG sekvens slutning +VideoPanel.insertEndcode=insert sequenzendcode on format changes +VideoPanel.insertEndcode.Tip=enable for a conform MPEG sequence end +VideoPanel.addSequenceHeader=tjek at hver GOP har en sequenceheader +VideoPanel.addSequenceHeader.Tip=forbedrer spolefunktion under afspilning +VideoPanel.patchToProgressive=patch alle frames til progressiv +VideoPanel.patchToProgressive.Tip=s誥 de progressive bits for at mindske felt antal +VideoPanel.patchToInterlaced=patch alle frames til interlaced +VideoPanel.patchToInterlaced.Tip=fjern de progressive bits +VideoPanel.toggleFieldorder=omroker felt r詭keflge +VideoPanel.toggleFieldorder.Tip=ombytter Top_field_first bit +VideoPanel.addSde=s誥 oplsning i SDE +VideoPanel.addSde.Tip=誅drer eksisterende eller s誥ter nye v誡dier, tom felt betyder samme v誡di som sekvens hoved; fx 720*576 +VideoPanel.SdeValue.Tip=誅drer eksisterende eller s誥ter nye v誡dier, tom felt betyder samme v誡di som sekvens hoved; fx 720*576 +VideoPanel.clearCdf=patcher composite.display.flag +VideoPanel.clearCdf.Tip=kan evt. lse 'det grnne billed' problem p nogle gamle HW decoder chips +VideoPanel.patchResolution.Tip=betinget tilpasning af 1. horisontal oplsning +VideoPanel.patchResolution=tilpas frste h-res: +VideoPanel.patchResolutionValue.0=(0) aldrig +VideoPanel.patchResolutionValue.1=(1) altid +VideoPanel.patchResolutionValue.2=(2) hvis <> 352|720 +VideoPanel.patchResolutionValue.3=(3) hvis <> til 352|704|720 +VideoPanel.Title2=nye bitrate v誡dier (demultiplex) +VideoPanel.ChangeVbvBuffer.Tip=det er nogen gange bedre at definere maksimum strrelsen +VideoPanel.Unchanged=u誅dret +VideoPanel.ChangeVbvBuffer.Mode1=(1) maksimum (112*16384) +VideoPanel.ChangeVbvBuffer=vbv buffer: +VideoPanel.ChangeVbvDelay.Tip=maks. anbefalet tid +VideoPanel.ChangeVbvDelay.Mode1=(1) maks. tid (0xFFFF) +VideoPanel.ChangeVbvDelay=vbv forsinkelse: +VideoPanel.ChangeAspectRatio.Tip=誅dre, hvis det findes ndigt +VideoPanel.ChangeAspectRatio=billed strrelse: +VideoPanel.patchBitrateValue.0=(0) behold original +VideoPanel.patchBitrateValue.1=(1) beregnet fra GOP bitl誅gde +VideoPanel.patchBitrateValue.2=(2) beregnet fra VBV +VideoPanel.patchBitrateValue.3=(3) marker som VBR (MPEG-1 Video) +VideoPanel.patchBitrateValue.4=(4) fix 3 Mbps +VideoPanel.patchBitrateValue.5=(5) fix 6 Mbps +VideoPanel.patchBitrateValue.6=(6) fix 9 Mbps +VideoPanel.patchBitrateValue.7=(7) fix 12 Mbps +VideoPanel.patchBitrateValue.8=(8) fix 15 Mbps +VideoPanel.patchBitrateValue=bitrate v誡dier pr sekvens: +VideoPanel.patch1stBitrateValue.0=(0) behold original +VideoPanel.patch1stBitrateValue.1=(1) beregnet gennemsnit (nominel) +VideoPanel.patch1stBitrateValue.2=(2) beregnet maks. <= 9.0 Mbps(DVD) +VideoPanel.patch1stBitrateValue.3=(3) beregnet maksimum (e.g. HDTV) +VideoPanel.patch1stBitrateValue.4=(4) marker som VBR (MPEG-1 Video) +VideoPanel.patch1stBitrateValue=bitrate v誡dier i frste sekvens: + +#AudioTab +AudioPanel.Title1=lyd konverteringer (demultiplex) +AudioPanel.losslessMpaConversion.Tip1=direkte tabsfri konvertering (begr誅set +AudioPanel.losslessMpaConversion.Tip2=til MPEG-1, Layer2, 48kHz, 56..384kbps) : +AudioPanel.losslessMpaConversion.Tip=hvis konvertering er valgt, vil bitrate & kanalmodus blive konstant i hele filen +AudioPanel.losslessMpaConversionMode0=(0) ingen konvertering +AudioPanel.losslessMpaConversionMode1=(1) enkelt til 3D-stereo (V+H = original) +AudioPanel.losslessMpaConversionMode2=(2) enkelt til stereo (V+H = original) +AudioPanel.losslessMpaConversionMode3=(3) enkelt til jointstereo (V+H = original) +AudioPanel.losslessMpaConversionMode4=(4) opdel 2kanal i 2 enkelte (1=V,2=H) +AudioPanel.decodeMpgAudio=afkod MPEG Layer1,2 til PCM: +AudioPanel.decodeMpgAudio.Tip=MPEG-Audio afkoder (ikke til Layer3), standard output i stereo pcm +AudioPanel.decodeMpgAudio.resampleAudioMode0=(0) ingen resampling +AudioPanel.decodeMpgAudio.resampleAudioMode1=(1) line誡 resampling 48kHz til 32kHz +AudioPanel.decodeMpgAudio.resampleAudioMode2=(2) line誡 resampling 48kHz til 44.1kHz +AudioPanel.decodeMpgAudio.Normalize=normaliser til % : +AudioPanel.decodeMpgAudio.Normalize.Tip=normaliser V+H ens, v誡dier fra 0...100 er mulige, standard er 98%; gennemtvinger genstart om ndvendigt +AudioPanel.NormalizeValue.Tip=normaliser V+H ens, v誡dier fra 0...100 er mulige, standard er 98%; gennemtvinger genstart om ndvendigt +AudioPanel.decodeMpgAudio.Downmix=downmix og output som en kanal +AudioPanel.decodeMpgAudio.Downmix.Tip=downmixer stereo/2kanal kilde til en enkelt kanal +AudioPanel.decodeMpgAudio.changeByteorder=gem i Motorola byte orden +AudioPanel.decodeMpgAudio.changeByteorder.Tip=betyder MSB frst, ikke-Intel type +AudioPanel.decodeMpgAudio.addRiffHeader=tilfj RIFF(RIFX) header til PCM (.wav) +AudioPanel.decodeMpgAudio.addRiffHeader.Tip=PC standard +AudioPanel.decodeMpgAudio.addAiffHeader=tilfj AIFF header til PCM (.aif) +AudioPanel.decodeMpgAudio.addAiffHeader.Tip=Apple standard +AudioPanel.Title2=lyd manipulationer (demultiplex) +AudioPanel.validateCRC=tjek CRC i AC-3 / MPEG-Audio L1,2 +AudioPanel.validateCRC.Tip=hvis aktiveret sikrer dette f誡re fejl output p bekostning af ydelse +AudioPanel.clearCRC=fjern CRC i MPEG-Audio Layer1,2 +AudioPanel.clearCRC.Tip=hvis aktiveret kan detforhindre vis lyd fejlbeskeder +AudioPanel.fillGapsWithLastFrame=masker fejlsteder +AudioPanel.fillGapsWithLastFrame.Tip=i stedet for at inds誥te en tavs ramme, gentages den sidste gyldige ramme +AudioPanel.addFrames=tilfj rammer +AudioPanel.addFrames.Tip=hvis lyden slutter fr filmen, for at opn l誅gden p filmens tid +AudioPanel.patch1stAc3Header=patch 1. AC-3 header til 3/2 kanal modus +AudioPanel.patch1stAc3Header.Tip=nogle AC-3 afkodings software behver at afkode alle kanaler, selv om der er f誡re +AudioPanel.replaceAc3withSilence=erstat alle ikke-3/2 AC-3 med stilhed +AudioPanel.replaceAc3withSilence.Tip=aktiver for at d詭ke unskede 2/0 rammer med 3/2 stilhed (48khz,448kbps, ac3.bin ndvendig) +AudioPanel.addRiffToAc3=tilfj RIFF WAVE header til AC-3 Audio +AudioPanel.addRiffToAc3.Tip=opret en .wav fil med brug af AC-3 Wave Format (tag 0x2000) Header +AudioPanel.addRiffToMpgAudioL12=MPA: tilfj RIFF WAVE header Layer1,2 +AudioPanel.addRiffToMpgAudioL12.Tip=Broadcast Wave Format (tag 0x0050), bedre ved MPEG Layer 1 & 2 +AudioPanel.addRiffToMpgAudioL3=MPA: tilfj RIFF WAVE header Layer3 +AudioPanel.addRiffToMpgAudioL3.Tip=mere s訶vanlig ACM Wave Format (tag 0x0055), bedre ved MPEG Layer 3 +AudioPanel.pitchAudio=fjern hver xxx Audioframe : +AudioPanel.pitchAudio.Tip=fremskynd Audio (kun ES) +AudioPanel.allowSpaces=tillad mellemrum mellem rammer (h.w.c.!) +AudioPanel.allowSpaces.Tip=grovafprvning af valide rammer, kan muligvis resultere i forkert angivne strrelser. +AudioPanel.createDDWave=AC-3/DTS: output as DD/DTS-Wave +AudioPanel.createDDWave.Tip=output Ac3/DTS as DD/DTS-Wave, fixed header: PCM 44.1kHz,16bit,2-ch +AudioPanel.fadeInOut=udtone og udtone +AudioPanel.fadeInOut.Tip=ud- og optoner lyd med brug af iniKey 'AudioPanel.fadeInOutMillis' ; std = 2000 ms, 1...5000 ms + +#SubtitleTab +SubtitlePanel.Title=DVB teletekst, DVB undertekster (demultiplex) +SubtitlePanel.Title.Teletext=DVB Teletext (demultiplex) +SubtitlePanel.decodeMegaradio=test: eksporter MegaRadioョ MP3-stream +SubtitlePanel.decodeMegaradio.Tip=tidligere transmitteret fra Hotbird 13ーE, 11.054GHz Hor., SR 27500, FEC 5/6, TTX-PID 553 +SubtitlePanel.decodeHiddenRows=afkod gemte teletekst r詭ker (id 0xFF) +SubtitlePanel.decodeHiddenRows.Tip=nogle sider eller de komplette teletekster/undertekster kan v誡e skjulte +SubtitlePanel.rebuildPTS=gendan TTX-PTS fra frste MpgAudio stream +SubtitlePanel.rebuildPTS.Tip=benyttes KUN ved TTX streams der er inkluderet i en stream fil (TS,PES..), men uden passende tids basis til video +SubtitlePanel.keepOriginalTimcode=behold original tidsindeks (PTS) ved uafh誅gig afkodning +SubtitlePanel.keepOriginalTimcode.Tip=uden en ledende video at demultiplexe, nyt tidsindeks starter ikke ved 0 +SubtitlePanel.exportTextAsUnicode=Unicode (UTF-16 BE) beim Textexport +SubtitlePanel.exportTextAsUnicode.Tip=Unicode (UTF-16 Big-Endian) beim Textexport +SubtitlePanel.exportTextAsUTF8=Unicode (UTF-8) beim Textexport +SubtitlePanel.exportTextAsUTF8.Tip=Unicode (UTF-8) beim Textexport +SubtitlePanel.TtxPages=teletekst sider at afkode: +SubtitlePanel.TtxPages.Tip=autogenkendelse af nationale tegn baseret p Teletext Level 1.5 i unicode +SubtitlePanel.Language= sprog: +SubtitlePanel.Language.Tip=forh蚣dsinstillet sprog, hvis udbyderen ikke har understttet automatisk valg +SubtitlePanel.Format.Tip=v詬g dit foretrukne eksport format +SubtitlePanel.Format.Free=frit +SubtitlePanel.Format=undertekst eksport formater: +SubtitlePanel.Colormodel.Mode0=(0) 4 farver +SubtitlePanel.Colormodel.Mode1=(1) 16 farver +SubtitlePanel.Colormodel.Mode2=(2) 256 farver +SubtitlePanel.PageId.Value.Tip=tomt felt = brug hvad der kommer, ellers: indtast nsket page ID (afh誅ger af udsendelse) +SubtitlePanel.Colormodel=simuler DVB undertekst IRD farve model: +SubtitlePanel.Colormodel.Tip=med ekstrem effekt p udseendet af de eksporterede undertekster, bedste indstilling afh誅ger af hvad du nsker +SubtitlePanel.PageId= fix til sidenummer: +SubtitlePanel.showPreview=undertekst gennemsyn +SubtitlePanel.Format.SUP.Values.Tip=(afstand fra venstre bund) Font punktstrrelse; Baggrund transparens; Y afstand; X afstand; X bredde; H(ubrugt); V; Y afstand2; maks.linier +SubtitlePanel.SupValues= Val: +SubtitlePanel.Font.LoadError=Fejl ved hentning af ssystem skrifttype +SubtitlePanel.useTextOutline=tegn tekst med sort rand (kun SUP) +SubtitlePanel.useTextOutline.Tip=tegner en 3 pixel bred rand om hvert tegn ved et maks. p 2 'tale farver' pr frame, ellers anvendes sort baggrund +SubtitlePanel.Font=Skrifttype: +SubtitlePanel.Font.Tip=ved SUP-Eksport +SubtitlePanel.specialTermination=s誡lig teletekst side afslutning (test) +SubtitlePanel.specialTermination.Tip=gennemtving pause ved ikke-lukkede sider +SubtitlePanel.ChangeDisplay=skift visnings modus: +SubtitlePanel.ChangeDisplay.Tip=kun ved bearbejdning af en .sup fil som input format (fra DVD eller som en ES) +SubtitlePanel.MovePosition=flyt billede position: +SubtitlePanel.MovePosition.Tip=lad st tom, eller angiv yderligere afstand for X og Y som: -20,-40 (verst.venstre) + +#Autoload +autoload.title=liste over forud definerede input mapper +autoload.dir.remove.tip=fjern mappe fra auto indl誑nings listen +autoload.dir.add.tip=tilfj mappe til auto indl誑nings listen +autoload.dir.refresh.tip=genindl誑 fil listen +autoload.ftp.add.tip=add ftp server directory to autoload list +autoload.add.coll.tip=opret en ny kollektion for hver valgt fil og tilfj den +autoload.add.file.tip=tilfj fil(er) til kollektion +autoload.rename.tip=venstre dobbeltklik eller tryk p enter for at tilfje file(er) til en kollektion, hjre klik for at omdbe +autoload.dialog.rename=omdb +autoload.dialog.fileexists=Fil eksisterer! Overskriv? +autoload.close=luk vindue + +#splitreset +splitreset.novideo=! -> ingen videofil PTS, opsplitning deaktiveret + +#checkpts +checkpts.1st.latter=!> frste video PTS starter senere end den sidste PTS i denne stream! kritisk for synkronisering +checkpts.last.ends=!> sidste video PTS slutter fr start PTS i denne stream! Synkronisering umulig + +#parseSecondaryPES +parseSecondaryPES.continue=-> forts誥 med at benytte ekstraherede r蘚ata fra +parseSecondaryPES.demux.pes=demultiolexer PES fil +parseSecondaryPES.missing.startcode=!> startkode mangler ved pos.: +parseSecondaryPES.found.startcode=!> startkode fundet ved pos.: +parseSecondaryPES.packet.length=-> ! pakke l誅gde er 0 ved +parseSecondaryPES.miss.next.startcode=!> mangler n誑te startkode ved {0} fra {1} (PES-ID 0x{2}), kasserer pakke.. +parseSecondaryPES.packs=pakker: {0} {1}% {2} +parseSecondaryPES.found.pesid=-> fundet PES-ID 0x{0} {1} ved {2} +parseSecondaryPES.ac3.audio=--> AC-3/DTS Audio +parseSecondaryPES.teletext=--> Teletekst +parseSecondaryPES.mpeg.audio=--> MPEG Audio +parseSecondaryPES.lpcm.audio=--> LPCM Audio +parseSecondaryPES.subpic=--> Undertekst +parseSecondaryPES.eof.error=parseSecondaryPES EOF n蘰t med fejl: +parseSecondaryPES.io.error=parseSecondaryPES Fil I/O fejl: +parseSecondaryPES.msg.noexport=--> stream tilladt + +#ID type +idtype.mpeg.video.ignored=(MPEG Video) -> ignoreret +idtype.mpeg.audio=(MPEG Audio) +idtype.private.stream=(private stream 1) +idtype.mpeg.video=(MPEG Video) +idtype.mapped.to= omsat til 0x +idtype.mapped.to.e0= omsat til 0xE0 +idtype.ignored= -> ignoreret +idtype.video=(Video) +idtype.main.audio=(hoved Audio) +idtype.additional=(ikke Video) +idtype.has.pesid= har PES-ID 0x + +#parsePrimaryPES +parsePrimaryPES.special.pes=-> s誡lig PES-ID's defineret til sgning +parsePrimaryPES.continue=forts誥 med fil +parsePrimaryPES.demuxing=demultiplexer +parsePrimaryPES.converting=konverterer +parsePrimaryPES.avpes.file=A/V PES fil +parsePrimaryPES.missing.startcode=!> startkode mangler ved pos.: +parsePrimaryPES.found.startcode=!> startkode fundet ved pos.: +parsePrimaryPES.split.cellids=-> VobID {0} CellID {1} ved {2} (GOP#{3} / ramme#{4}) +parsePrimaryPES.packet.length=-> ! pakke l誅gde er 0 ved +parsePrimaryPES.miss.startcode=!> mangler n誑te startkode ved pos.: (pakkestrrelse=0) ved {0} fra {1} /I-Buffer {2} +parsePrimaryPES.miss.startcode2=!> mangler n誑te startkode ved pos.: {0} fra {1} (PES-ID 0x{2}), kasserer pakke.. +parsePrimaryPES.packs=pakker +parsePrimaryPES.dump.1st=-> skriv 1. pakke til fil +parsePrimaryPES.found.pesid=-> fundet PES-ID 0x +parsePrimaryPES.pes.incoming=!> PES-ID 0x{0}, modtaget PES pakke uden data eller forkert header data ved {1} +parsePrimaryPES.actual.written=-> indtil nu skrevne billeder: +parsePrimaryPES.switch=skift til fil: +parsePrimaryPES.ac3=--> AC-3/DTS Audio +parsePrimaryPES.teletext=--> Teletekst (SubID 0x +parsePrimaryPES.mpeg.audio=--> MPEG Audio (0x +parsePrimaryPES.lpcm.audio=--> LPCM Audio (SubID 0x +parsePrimaryPES.subpic=--> Undertekst (SubID 0x +parsePrimaryPES.eof.error=parsePrimaryPES EOF n蘰t med fejl: +parsePrimaryPES.io.error=parsePrimaryPES File I/O fejl: +parsePrimaryPES.msg.noexport=--> stream udeladt (0x + +#parseTS +parseTS.sid=-> Service ID 0x +parseTS.pmt.refers=-> PMT 0x{0} refererer til disse brugbare streams: +parseTS.no.pmt=-> ingen PMT fundet (ved en scanning) +parseTS.special.pids=-> s誡lige PID's defineret til sgning +parseTS.continue=forts誥 med fil: +parseTS.demuxing=demultiplexer +parseTS.converting=konverterer +parseTS.dvb.mpeg= DVB MPEG-TS fil +parseTS.incomplete=!> ukomplet ts pakke ved EOF opdaget ved +parseTS.comp.failed=!> ts pakke f誡diggrelse mislykkedes :-( +parseTS.missing.sync=!> manglende synkroniserings byte ved pos.: +parseTS.comp.ok=!> ts pakke f誡diggrelse OK :-) +parseTS.found.sync=!> fundet synkroniserings byte ved pos.: +parseTS.bit.error=!> PID 0x{0} -> TS bit fejl i pakke {1} ved pos. {2}, kasserer.. +parseTS.stuffing=-> PID 0x1FFF => opfyldnings pakke -> ignoreret +parseTS.scrambled=-> PID 0x{0} => markeret som kodede data, pakke {1} ved {2} -> ignoreret +parseTS.clear=-> PID 0x{0} => ukodede data fundet, pakke {1} ved {2} +parseTS.outof.sequence=!> PID 0x{0} -> pakke {1} ved pos. {2} udenfor sekvens ({3}/{4}) (skifter..) +parseTS.priv.stream2.ignored=-> PID 0x{0}(private stream 2) -> ignoreret +parseTS.scrambled.notignored=-> PID 0x{0} => markeret som kodede data (ikke ignoreret){1} +parseTS.ignored= -> ignoreret +parseTS.pid.has.pes=ok> PID 0x{0} har PES-ID 0x{1} {2} +parseTS.lackof.pes=!> PID 0x{0} mangler PES Data -> pakke kasseret +parseTS.actual.vframes=-> indtil nu skrevne billeder: +parseTS.tryto.complete=!> forsger at f誡diggre ukomplet ts pakke... +parseTS.packs=packs: {0} {1}% {2} +parseTS.ac3.audio=--> AC-3/DTS Audio p PID 0x +parseTS.teletext.onpid=--> Teletekst p PID 0x +parseTS.mpeg.audio=--> MPEG Audio (0x{0}) p PID 0x{1} +parseTS.subpicture=--> Undertekst (SubID 0x +parseTS.eof.error=raw EOF n蘰t med fejl: +parseTS.io.error=raw File I/O fejl: +parseTS.switch.to=skift til fil: +parseTS.msg.noexport=--> stream (0x{0}) p PID 0x{1} udeladt + +#nextfile +nextfile.io.error=nextfile data I/O fejl: +nextfile.shift.auto=-> forskyd original PTS automatisk bagl誅s med {0} time(r) +nextfile.shift.manual=-> forskyd original PTS manuelt bagl誅s med {0} time(r) +nextfile.next.file.start=-> n誑te fil starter med PTS: {0} / sidste aktuelle PTS er {1} +nextfile.next.file.start.adaption=-> brug ny PTS-forskydning: {0} for flgende data + +#overlapPVA +overlappva.io.error=overlap l誑nings fejl: + +#parsePVA +parsePVA.special.pids=-> s誡lige PID's defineret til sgning +parsePVA.streamtype.ac3= (AC-3/DTS) +parsePVA.streamtype.ttx= (TTX) +parsePVA.streamtype.mpeg.audio= (MPEG Audio) +parsePVA.streamtype.mpeg.video= (MPEG Video) +parsePVA.continue=forts誥 med fil: +parsePVA.demuxing=demultiplexer +parsePVA.converting=konverterer +parsePVA.pvafile= PVA fil +parsePVA.missing.sync=!> manglende synkroniserings byte ved pos.: +parsePVA.found.sync=!> fundet synkroniserings byte ved pos.: +parsePVA.file.overlap=Fil-overlap opdaget ved fil pos.: +parsePVA.packs=pakker +parsePVA.found.id=-> fundet ID 0x +parsePVA.outof.sequence=!> ID 0x{0} -> pakke {1} ved pos. {2} udenfor sekvens ({3}/{4}) (skifter..) +parsePVA.id.0x=-> ID 0x +parsePVA.actual.vframes=-> indtil nu skrevne billeder: +parsePVA.ac3.onid=--> AC-3/DTS Audio p ID 0x +parsePVA.teletext.onid=--> Teletekst p ID 0x +parsePVA.mpeg.audio.onid=--> MPEG Audio p ID 0x +parsePVA.eof.error=pva EOF n蘰t med fejl: +parsePVA.io.error=pva fil I/O fejl: +parsePVA.msg.noexport=--> stream udeladt ved ID (0x + +#Audioprocess +audio.progress=tjek & synkroniser audio fil +audio.status.pre-insert=inds誥 fr... +audio.status.insert=inds誥ter... +audio.status.write=skriver... +audio.status.pause=pauserer... +audio.status.add=tilfjer... +audio.status.finish=afsluttet... +audio.convert=-> konverter MPA : +audio.decode=-> afkod MPA : +audio.restart=!> genstart lyd bearbejdsing, for蚌saget af 誅dringer i output rammen# +audio.error.io=fil I/O fejl: +audio.msg.pts.discard=!> {0} PTS's kasseret i stream +audio.msg.pts.firstonly=-> tag kun frste Audio PTS (for at synkronisere start tidspunktet) +audio.msg.pts.start_end=Audio PTS: frste pakke {0}, sidste pakke +audio.msg.pts.mismatch=!> video & audio PTS passer ikke overens p noget tidspunkt! +audio.msg.pts.wo_frame=!> PTS uden en ramme +audio.msg.adjust.at.videopts=-> justerer audio til video tidslinie +audio.msg.adjust.at.ownpts=-> justerer audio til dens egen tidslinie +audio.msg.addriff.acm=-> tilfj RIFF WAVE header til MPEG Audio som ACM Wave format +audio.msg.addriff.bwf=-> tilfj RIFF WAVE header til MPEG Audio som BWF Wave format +audio.msg.addriff.ac3=-> tilfj RIFF WAVE header til AC-3 Audio +audio.msg.syncword.lost=!> manglende synkroniserings byte ved pos.: {0}, ved +audio.msg.syncword.found=!> fundet synkroniserings byte ved pos.: +audio.msg.frame.discard=!> kasser ramme# +audio.msg.crc.error=!> CRC{0} tjek fejlet ved +audio.msg.source=-> src_audio: {0} ved +audio.msg.source.max=-> src_audio: stop visning, mere end 100 lyd modus 誅dringer i en fil reducerer arbejdshastigheden +audio.msg.summary.skip=!> sprunget over kilde ramme(r) ved +audio.msg.summary.pre-insert=!> {0} ramme(r) ({1}ms) indsat fr ved +audio.msg.summary.insert=!> {0} ramme(r) ({1}ms) indsat ved +audio.msg.summary.add=!> {0} ramme(r) ({1}ms) tilfj ved +audio.msg.summary.frames=audio rammer: wri-pre-skip-ins-add {0} ved {1} gennemfrt... +audio.msg.summary.jstereo=-> {0} stereo/jointstereo 誅dring(er) opdaget... +audio.msg.audio=Audio +audio.msg.newfile.left=(venstre): +audio.msg.newfile.right=(hjre): +audio.msg.noaudio=!> ingen lyd fundet i denne stream data... +audio.msg.convert.disabled=!> kilde frame passer ikke til omkodnings kriterie, funktion sl蘰t fra.. (frame# {0}) +audio.msg.convert.error=!> kilde frame laver konverterings fejl (error {0}), (frame# {1}) + +#Videoprocess +video.msg.pts.start_end=Video PTS: start 1.GOP {0}, slut sidste GOP +video.msg.summary=-> Video: fr-ct-1p-cg-og-dg -> +video.progress=analyserer video stream fil +video.msg.skip.sec=-> spring over sekvens kode der flger GOP# {0} ved +video.error.io=!> ren video adgangs fejl +video.msg.error.lackofdata=!> GOP# {0} - mangel p data, ignoreret... +video.msg.error.nopts.use_goptc=!> GOP# {0} har ingen PTS, benyt GOP TC til synkronisering +video.msg.error.nopts.use_lastpts=!> GOP# {0} har ingen PTS, benyt sidste PTS til synkronisering +video.msg.basics=-> video egenskaber: +video.msg.newformat=GOP# {0}, nyt format opdaget i n誑te ledende sekvens header: +video.msg.error.pesext_in_es=!> GOP# {0}, PES_header og endelse fundet i ES, fyldt med nuller... (GOP offs. {1}) +video.msg.error.pes_in_es=!> GOP# {0}, PES_header fundet i ES, fyldt med nuller... (GOP byteafstand {1}) +video.msg.error.frame.wrong=!> forkert rammetype {0}, T-ref +video.msg.export.start=-> begynder eksport af video data ved GOP# +video.msg.pts.diff=!> PTS forskel fra {0} ({1}) til sidst eksporterede GOP opdaget +video.msg.error.brokenlink=(broken_link korrigeret) +video.msg.frame.drop=!> springer over ubrugelig B-Frame ved GOP# {0} / nyt tidsindeks +video.msg.error.frame.not=!> GOP# {0} indeholder ingen rammer +video.msg.error.frame.not.i=!> GOP# {0} starter ikke med en I-Frame ved T-ref '0' +video.msg.error.pts.early=!> startPTS p GOP# {0} er tidligere end slutningen p den sidste GOP.. (forv. {1}) +video.msg.error.gop.drop=!> kasserer GOP# {0} @ orig.PTS {1} ({2}) +video.msg.error.gop.diff=!> Billede exp/cnt {0}, inGOP PTS diff. {1}ms, nyt tidsindeks +video.msg.error.gop.dump=-> skriver GOP til fil: +video.msg.io.non=nej +video.msg.io.int=interlacet +video.msg.io.pro=progressive +video.msg.io.int_pro=interlacet & progressive +video.msg.length=-> Video l誅gde: {0} rammer ved +video.msg.gop.summary=-> GOP opsummering: min. {0}, maks. {1} felter; indeholder {2} rammer +video.error.pts.same=-> fundet {0} GOP's med samme PTS v誡di for forskellige billeder! +video.summary=.Video {0}:\t{1} Billeder\t{2}\t\t +video.msg.bitrate.avg=-> gennemsnitlig bitrate {0}bps (min/maks: {1}) +video.msg.bitrate.avgnom=-> avg. nom. bitrate {0}bps (min/maks: {1}) +video.msg.bitrate.vbr=-> s誥 bitrate i frste sekvens header til VBR +video.msg.bitrate.val=-> s誥 bitrate i frste sekvens header til {0}bps +video.msg.resolution=-> s誥 oplsning i frste sekvens header fra {0} til + +#Teletextprocess +teletext.msg.nooutput=!> ikke angivet format for teletekst output... +teletext.msg.output=-> eksport format: +teletext.msg.tmpfile=-> midlertidig fil: {0} ({1} bytes) +teletext.msg.page=side nummer +teletext.msg.megaradio=MegaRadio mp3 stream +teletext.progress=sger & afkoder +teletext.msg.search=-> ser efter +teletext.status=sider: +teletext.msg.discard=!> {0} PTS's kasseret i stream +teletext.msg.pts.start_end=teletekst PTS: frste pakke {0}, sidste pakke +teletext.msg.pts.missed=!> teletekst stream benytter ikke PTS's, synkronisering umulig +teletext.msg.pts.mismatch=!> video & teletekst PTS passer ikke overens p noget tidspunkt! +teletext.msg.adjust.at.video=->justerer teletekst til video tidslinie +teletext.msg.adjust.at.own=-> justerer teletekst til dets egen tidslinie +teletext.msg.syncword.lost=!> manglende synkroniserings byte ved pos.: +teletext.msg.syncword.found=!> fundet synkroniserings byte ved pos.: +teletext.msg.vps=-> VPS status: {0} ved PTS +teletext.msg.provider=-> distributr: +teletext.msg.program=-> program: +teletext.msg.summary={0} sider af nr. {1} skrevet... +teletext.summary=Teletekst {0}:\t{1} side af nr. {2}\t{3}\t +teletext.error.eof=!> Teletekst EOF n蘰t med fejl: +teletext.error.io=!> Teletekst I/O fejl: {0} / +teletext.msg.newrun=-> gennemfr 2. SUP Y-afstand + +#Subpictureprocess +subpicture.msg.error3=!> fejl ved afkodning af DVB undertekst +subpicture.msg.error4=!> mangel p pakke data +subpicture.msg.error5=!> pakke strrelse passer ikke til pakke data +subpicture.msg.error6=!> forkert positionsindeks for enhed +subpicture.msg.error7=!> forkert position for enhed +subpicture.msg.error8=!> forkert slutning p enhedsindeks +subpicture.msg.error9=!> forkert slutning p enhed +subpicture.msg.model=-> valgt DVB undertekst farve model: {0} ; fikseret til sede nr.: +subpicture.msg.output=-> eksport format: +subpicture.msg.tmpfile=-> midlertidig fil: {0} ({1} bytes) +subpicture.progress=tjek & synkroniser +subpicture.msg.discard=!> {0} PTS's kasseret i stream +subpicture.msg.pts.mismatch=!> video & undertekst PTS passer ikke overens p noget tidspunkt! +subpicture.msg.adjust.at.video=-> justerer undertekst til video tidslinie +subpicture.msg.adjust.at.own=-> justerer undertekst til dets egen tidslinie +subpicture.msg.syncword.lost=!> manglende synkroniserings byte ved pos.: +subpicture.msg.syncword.found=!> fundet synkroniserings byte ved pos.: +subpicture.msg.error={0} @ {1}, kasserer billede... +subpicture.msg.dvbsource=-> kilde er DVB undertekst... +subpicture.status=billeder: +subpicture.preview.title.dvdexport=/ billede {0} -> i: {1} varighed: +subpicture.preview.title.dvbexport=/ side nr. {0} / billede {1} -> i: {2} varighed: +subpicture.msg.forced=fra billede +subpicture.msg.forced.no=-> visning status: ej tvunget, +subpicture.msg.forced.yes=-> visning status: tvunget, +subpicture.preview.title.noexport=/ billede ikke eksporteret... +subpicture.msg.pts.start_end=undertekst PTS: frste pakke {0}, sidste pakke +subpicture.msg.summary={0} undertekster skrevne... +subpicture.summary=undertekst {0}:\t{1} undertekster\t{2}\t +subpicture.msg.error.eof=!> undertekst EOF n蘰t med fejl: +subpicture.msg.error.io=!> undertekst IO fejl {0} / +subpicture.msg.error.dvbdecoding=!> afkodnings fejl: {0}, Region_Id {1} (PTS {2}) + +#LPCMprocess +lpcm.msg.develop=...under udvikling... +lpcm.msg.tmpfile=-> midlt. fil: {0} ({1} bytes) +lpcm.progress=tjek & synkroniser +lpcm.msg.pts.mismatch=!> video & LPCM PTS passer ikke sammen p noget tidspunkt! +lpcm.msg.adjust.at.video=-> justerer LPCM p video-tidslinien +lpcm.msg.adjust.at.own=-> justerer LPCM p dets egen tidslinie +lpcm.msg.syncword.lost=!> manglende syncword ved pos.: +lpcm.msg.syncword.found=!> fundet syncword ved pos.: +lpcm.msg.source=-> src_audio: {0} @ +lpcm.msg.source.max=-> src_audio: stopper visning, mere end 100 lyd modus 誅dringer i en fil reducerer arbejdshastigheden +lpcm.msg.error.align=!> pakke ikke WORD justeret +lpcm.msg.pts.start_end=LPCM PTS: frste pakke {0}, sideste pakke +lpcm.msg.summary={0} pakker skrevne... +lpcm.summary=LPCM {0}:\t{1} pakker\t{2}\t +lpcm.error.eof=!> LPCM EOF n蘰t med fejl: +lpcm.error.io=!> LPCM IO fejl: {0} / + +#various +all.msg.pts.faked=--> benytter falske PTS for flgende data: +logalias.error.io=!> Log alias IO fejl: +all.msg.error.max=-> more than 500 warnings/errors, stop logging.. +all.msg.error.summary=-> we have {0} warnings/errors. +all.msg.noprimaryfile=!> filetype is not supported as a secondary file. check the file order/segmentation. + +#demux +demux.error.audio.startcode=!> ugyldig startkode, afviser PES pakke +demux.error.audio.io=!> demultiplex Audio fejl: +demux.error.video.io=!> demultiplex Video fejl: +demux.msg.celltimes=--> Celle tid i: {0}CellTimes.txt +demux.error.video.startcode=!> ugyldig startkode, afviser video PES pakke +demux.error.video.payload=!> modtagen PES pakke uden data eller med forkert header data +demux.msg.skip.sec=-> overspring sequence_end_code flgende efter GOP# +demux.error.gop.toobig=!> forkast video data, GOP strre end 6MB + +#ftpchooser +ftpchooser.server.tip=Navn eller IP adresse p ftp server +ftpchooser.server=Server: +ftpchooser.port.tip=Ftp server port +ftpchooser.port=Port: +ftpchooser.user.tip=Bruger til ftp opkobling +ftpchooser.user=Bruger: +ftpchooser.password.tip=Password til ftp opkobling +ftpchooser.password=Password: +ftpchooser.directory.tip=Mappe p ftp server +ftpchooser.directory=Mappe: +ftpchooser.test=Test +ftpchooser.state.tip=Status +ftpchooser.state=Status: +ftpchooser.untested=uafprvet +ftpchooser.ok=OK +ftpchooser.cancel=Afbryd +ftpchooser.title=v詬g ftp server +ftpchooser.msg.noconnect=Kan ikke forbinde. +ftpchooser.msg.nologin=Kan ikke logge p. +ftpchooser.msg.nodirectory=Kan ikke 誅dre mappe. +ftpchooser.msg.success=Forbindelse oprettet. +ftp.command.label=FTP kommando: +ftp.command.tip=bruger spcific FTP kommando for FTP adgang, brug dette tegn '|' som afgr誅ser ved flere kommandoer +FtpServer.Commands=FTP kommando: +FtpServer.Commands.Tip=bruger spcific FTP kommando for FTP adgang, brug dette tegn '|' som afgr誅ser ved flere kommandoer +FtpPanel.Title=FTP indstillinger + + +#JobCollection +JobCollection.NoInfo=ingen Info +JobCollection.InProgress=Under bearbejdning! +JobCollection.Idle=Ledig. +JobCollection.Action=Handling: +JobCollection.unspecified=ej angivet +JobCollection.PrimaryFileSegments=Fil Segmenter: +JobCollection.SecondaryFiles=sekund. Filer: +JobCollection.Cutpoints=Besk誡ingspunkter: +JobCollection.Chapters=Kapitler: +JobCollection.PidSelection=PID-Valg: +JobCollection.OwnSettings=sep.Indstillinger: +JobCollection.AllSize=Strrelse \u03A3: + +#CollectionTable +CollectionTable.FileLocation=Placering +CollectionTable.FileName=Filnavn +CollectionTable.Size=Strrelse +CollectionTable.lastModified=ニndret den +CollectionTable.Streamtype=Streamtype +CollectionTable.Source=Kilde + +#PreviewPanel +PreviewPanel.saveCurrentPicture=save current picture.. +PreviewPanel.saveCurrentPictureDAR=save current picture with DAR.. + +#NetPanel +NetPanel.WebServerPort=Port: +NetPanel.WebServerAccess=AccessString: +NetPanel.autostartWebServer=autostart WebIFServer +NetPanel.Title=Webinterface +NetPanel.autostartWebServer.Tip= +NetPanel.WebServerPort.Tip= +NetPanel.WebServerAccess.Tip= diff -Nru project-x-0.90.4dfsg/resources/pjxresources_en.properties project-x-0.91.0/resources/pjxresources_en.properties --- project-x-0.90.4dfsg/resources/pjxresources_en.properties 2006-03-29 00:52:12.000000000 +0000 +++ project-x-0.91.0/resources/pjxresources_en.properties 2009-10-31 17:45:40.000000000 +0000 @@ -33,9 +33,18 @@ Common.LogFile=&Logfile Common.Preferences=&PreSettings Common.Addons=Addo&ns +Common.CloseAndRevert=Close and &Revert +Common.Preprocess=&Preprocessing +Common.KillProcess=Stop Process immediately General.Yes=Yes General.No=No +General.FileProperties=File Properties +General.CollectionProperties=Collection Properties +General.CollectionProperties.Hint=Settings valid only for this Collection +General.FileTable=FileTable +General.CutControl=CutControl +General.FilterControl=FilterControl StartUp.Title=X Startup, load components... StartUp.Error=Error while starting Project-X: @@ -48,8 +57,13 @@ PreferencesPanel.Title=PreSettings PreferencesPanel.Button=PreSettings +# +FilterPanel.ResetAll=reset all settings +FilterPanel.MoreSettings=more settings.. + Application.SaveSettingsOnExit=Save Settings on Exit -Application.InputDirectoriesDepth=subdirectory expansion (FILE only) +Application.InputDirectoriesDepth=subdirectory expansion (FILE + FTP) +Application.InputDirectoriesDepth.Tip=full subdirectory expansion (FILE + FTP) # Popupmenu popup.what=what @@ -59,6 +73,7 @@ popup.remove=remove popup.rename=rename.. popup.openhex=open in Hexviewer.. +popup.opensup=open in Subpictureviewer.. popup.patchbasics=patch Video Basics.. popup.sendtocl3=sendTo CL#3.. popup.newOutName=new Output as.. @@ -146,6 +161,8 @@ MainPanel.useAllCollections.Tip=enable to work with all collections in one run MainPanel.enablePostProcessing=enable post processing MainPanel.enablePostProcessing.Tip=enable post processing (->see external panel, if field is not empty ) +MainPanel.PostProcessCompletion=wait for completion +MainPanel.PostProcessCompletion.Tip=wait for completion of postprocess MainPanel.simpleMPG=MPG=>sPES MainPanel.simpleMPG.Tip=simple PES parsing, enable for MPEG-PS including data w/o a regular sub ID of private_stream_1 MainPanel.enhancedPES=sPES=>MPG @@ -159,14 +176,16 @@ MainPanel.ConversionMode.toM2P=to M2P MainPanel.ConversionMode.toPVA=to PVA MainPanel.ConversionMode.toTS=to TS -MainPanel.ConversionMode.PidFilter=PIDFilter (1:1 Copy) +MainPanel.ConversionMode.PidFilter=PIDFilter +MainPanel.ConversionMode.binaryCopy=1:1 binary Copy MainPanel.ConversionModePriority=Collection has priority MainPanel.ConversionModePriority.Tip=use collections action type MainPanel.useAutoPidFilter=apply PMT-PID filter MainPanel.useAutoPidFilter.Tip= MainPanel.QuickStart=QuickStart MainPanel.QuickStart.Tip=starts the process immediately, using the last active settings - +MainPanel.useGOPEditor=open GOP editor on errors (work in progress) +MainPanel.useGOPEditor.Tip=opens GOP editor on errors ProcessWindow.Title=ProcessWindow ProcessWindowPanel.Button=prepare >> @@ -221,7 +240,7 @@ [-split ] ..split output at xxx MB\n\ [-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..action types -#terms of conditions +#conditions terms=\n\ TERMS AND CONDITIONS:\n\ (1) this is a free Java based demux utility.\n\ @@ -281,6 +300,7 @@ msg.cuts.cutout=-> cut-out @ GOP# {0} msg.newfile=---> new File: msg.browser.launcher.error=browser launcher error: +msg.overwrite=Overwrite existing file {0} ? #Hex Viewer hexviewer.title=Hex Viewer @@ -435,6 +455,8 @@ OptionPanel.holdStreamInfoOnOSD.Tip=hold StreamInfo on OSD OptionPanel.additionalInputBuffer=use additional input buffer OptionPanel.additionalInputBuffer.Tip=use additional input buffer of 1MB, better for small data segments +OptionPanel.enableHDDemux=enable H.264 demux +OptionPanel.enableHDDemux.Tip=enable H.264 demux #ScanInfo ScanInfo.Location=Location: @@ -448,7 +470,7 @@ ScanInfo.Teletext=Teletext: ScanInfo.Subpicture=Subpict.: ScanInfo.Playtime=est. Playtime: -ScanInfo.NotFound=File doesn't exists! +ScanInfo.NotFound=File doesn't exist! #Execute PostCommands.Title=external programs @@ -462,18 +484,18 @@ CollectionPanel.Title=collection specials CollectionPanel.Title2=collection specials for coll.# collection.title.processing=processing preview... -CollectionPanel.CutPanel=Preview / Videofile cuts -CollectionPanel.CutPanel.Tip1=use also the keyboard keys for navigation, preview only works with bytepos. cut +CollectionPanel.CutPanel=Videofile cuts / Preview / Preview Options +CollectionPanel.CutPanel.Tip1=use also the keyboard keys for navigation / click title for preview options CollectionPanel.CutPanel.Tip2=active segment/number of segments + filename of active segment CollectionPanel.CutPanel.Tip3=processed (P)ID to get the current picture CollectionPanel.CutPanel.Tip4=key in a number, or drag&drop a cutpoint file over here CollectionPanel.addPoint=add point CollectionPanel.removePoint=del point -CollectionPanel.NumberOfPoints=Number of Points: +CollectionPanel.NumberOfPoints=Cut Points CollectionPanel.NumberOfPoints.Tip=all numbers are automatically sorted -CollectionPanel.NumberOfChapters=Chapters: +CollectionPanel.NumberOfChapters=Chapters CollectionPanel.NumberOfChapters.Tip=all numbers are automatically sorted -CollectionPanel.expectedSize=exp.Size : +CollectionPanel.expectedSize=Size: ~ CollectionPanel.Preview.offline=preview not available CollectionPanel.Preview.processedPid=processing Video (P)ID 0x CollectionPanel.Various=Various @@ -481,8 +503,14 @@ CollectionPanel.Preview.fastDecode.Tip=reconstruct and interpolate only the upper/left pixel of each macroblock CollectionPanel.Preview.LiveUpdate=live update while scrolling CollectionPanel.Preview.LiveUpdate.Tip=not recommended on slow systems or file access, refers to preview buffer +CollectionPanel.Preview.fullScaled=direct scaled image +CollectionPanel.Preview.fullScaled.Tip=scales with possible interlace artefacts CollectionPanel.Preview.AllGops=also preview GOPs w/o sequ.header CollectionPanel.Preview.AllGops.Tip=for DVB data it's not recommended, enable only for some streams with only one sequ.header! +CollectionPanel.Preview.SliderWidth=use full sized Slider +CollectionPanel.Preview.SliderWidth.Tip=use full sized or Preview-aligned Slider, change requires restart +CollectionPanel.Preview.YGain=Preview Picture Luminance Gain (-128..0..+128) +CollectionPanel.Preview.YGain.Tip=Preview Picture Luminance Gain (-128..0..+128) CollectionPanel.PidList=PES(&Sub)-ID/PID list: CollectionPanel.PidList.Tip1=enter PES-ID or sub-ID (MPG etc) or PID (PVA,TS); empty list == use all IDs CollectionPanel.PidList.Tip2=doubleclick to remove a selected entry @@ -556,7 +584,7 @@ run.write.raw=write separated raw file to: run.coll.empty=Collection is empty... run.done=done... {0} collection(s) processed @ -run.stopped=stopped... +run.stopped=>>> process stopped... run.status=ready... run.splitpart=actual part of split output @@ -567,7 +595,8 @@ working.convertType.makePVA=-> make a PVA working.convertType.makeTS=-> make a TS working.convertType.packetFilter=-> simple packet filter -working.file=-> Input File {0}: {1} ({2} bytes) +working.convertType.copy=-> direct copy +working.file=+> Input File {0}: {1} ({2} bytes) working.file.not.found=!> File not found ! working.filetype=-> Filetype is {0} working.file.notsupported=!> Filetype not supported ! @@ -576,7 +605,7 @@ working.post.command=-> post command performed: working.bytes.written=bytes written... working.log.error2=log error2: -working.output.std=output to same location as 1st file in collection +working.output.std=[res] same location as 1st file in coll. #MPVD mpvdecoder.tip1=right click to save as bmp @@ -634,6 +663,10 @@ ExternPanel.createInfoLabel=Cuttermaran Info on demux: ExternPanel.createInfoIndex=Cuttermaran info Version: 1.61ff ExternPanel.createInfoIndex.Tip=create *.info indexfile for Cuttermaran on demux: +ExternPanel.appendPidToFileName=append Pid/Id to Filename +ExternPanel.appendPidToFileName.Tip=append Pid/Id to Filename +ExternPanel.appendLangToFileName=append language code to Filename +ExternPanel.appendLangToFileName.Tip=append language code to Filename FtpPanel.killFtpClient=drop client w/o logout FtpPanel.killFtpClient.Tip=don't use, except the ftp server won't accept a logout until a transfer was completed (may not disconnect the client!) @@ -657,10 +690,16 @@ SpecialPanel.TS.blindSearch.Tip=enable, if the PID detection stops the search at unknown payload SpecialPanel.TS.joinPackets=TS: join file segments (of Dreamboxョ) SpecialPanel.TS.joinPackets.Tip=enable to join incomplete TS packets on boundaries of multiple file segments -SpecialPanel.TS.HumaxAdaption=TS: Humaxョ file format adaption -SpecialPanel.TS.HumaxAdaption.Tip=enable for special Humaxョ HD file format of TS +SpecialPanel.TS.HumaxAdaption=TS: Handanョ file format adaption +SpecialPanel.TS.HumaxAdaption.Tip=enable for special Handanョ HD file format of TS SpecialPanel.TS.FinepassAdaption=TS: Finepassョ file format adaption SpecialPanel.TS.FinepassAdaption.Tip=enable for special Finepassョ HD file format of TS +SpecialPanel.TS.JepssenAdaption=TS: Jepssenョ file format adaption +SpecialPanel.TS.JepssenAdaption.Tip=enable for special Jepssenョ HD file format of TS +SpecialPanel.TS.KoscomAdaption=TS: Koscomョ file format adaption +SpecialPanel.TS.KoscomAdaption.Tip=enable for special Koscomョ HD file format of TS +SpecialPanel.TS.ArionAdaption=TS: Arionョ file format adaption +SpecialPanel.TS.ArionAdaption.Tip=enable to read special Arionョ .AVR TS file format (not essential, usually works without it) SpecialPanel.TS.generatePmt=TS: generate PMT stream dependent SpecialPanel.TS.generatePmt.Tip=disable, to generate an independent pre-defined PMT that also fit most streams SpecialPanel.TS.generateTtx=TS: generate info TTX service (test) @@ -669,6 +708,8 @@ SpecialPanel.TS.HeaderMode1=(1) add Topfieldョ 4000 header to TS SpecialPanel.TS.HeaderMode2=(2) add Topfieldョ 5000 header to TS SpecialPanel.TS.HeaderMode3=(3) add Topfieldョ 5x00 header to TS (new) +SpecialPanel.TS.HeaderMode4=(4) add Topfieldョ 5x00(C) header to TS (new) +SpecialPanel.TS.HeaderMode5=(5) add Arionョ header to TS SpecialPanel.TS.setMainAudioAc3=TFョ-header: set AC3 as main AudioTrack SpecialPanel.TS.setMainAudioAc3.Tip=TFョ-Header: setze AC3 als aktive Tonspur SpecialPanel.Title2=specials 2 @@ -676,14 +717,20 @@ SpecialPanel.Input.getEnclosedPackets.Tip=disable, if no packets were found (on packet end, the next mpeg-startcode is missing, e.g. on Images) SpecialPanel.Input.concatenateForeignRecords=concatenate different recordings SpecialPanel.Input.concatenateForeignRecords.Tip=enable, if you want merge equal types of PVA, MPEG or VDR files from different recording times +SpecialPanel.Input.useReadOverhead=pre/past loading at cut points +SpecialPanel.Input.useReadOverhead.Tip=pre/past loading at cut points, prevents audio gaps SpecialPanel.Audio.ignoreErrors=Audio: use only first PTS for sync SpecialPanel.Audio.ignoreErrors.Tip=counts the audiotime from its framelengths after syncing the A/V-startpoint, skip errors SpecialPanel.Audio.limitPts=Audio: limit points of PTS for sync SpecialPanel.Audio.limitPts.Tip=better than 1st Audio PTS only (as above), Audio may keep in sync +SpecialPanel.Audio.allowFormatChanges=Audio: allow format changes in a stream +SpecialPanel.Audio.allowFormatChanges.Tip=also allows changes of major attributes like: layer, sample frequency SpecialPanel.Video.ignoreErrors=Video: ignore errors after 1st PTS/GOP SpecialPanel.Video.ignoreErrors.Tip=enable, if probably only Video PTS errors occurs (Pics seems ok) SpecialPanel.Video.trimPts=Video: adapt sliding PTSs SpecialPanel.Video.trimPts.Tip=enable, if audio export stops early, caused by smoothly PTS slidings +SpecialPanel.Video.cutPts=A/V: sync check at cut points only +SpecialPanel.Video.cutPts.Tip=enable for reduced sync check SpecialPanel.Conversion=only to'XYZ' conversions related: SpecialPanel.Conversion.startWithVideo=ensure 1st PES-packet start with video SpecialPanel.Conversion.startWithVideo.Tip=enable, if some players have problems if it's not; disable for audio-only conversions @@ -729,14 +776,15 @@ ExportPanel.createSubDirNumber.Tip=global: create new subdirectory for each collection number (better for same files in diff. collections) ExportPanel.createSubDirName=create collection's basename as subdirectory ExportPanel.createSubDirName.Tip=global: create new subdirectory based on 1st source filename for each collection - +ExportPanel.createSubDirVdr=create collection's basename/date as subdirectory (vdr) +ExportPanel.createSubDirVdr.Tip=create collection's basename + date as subdirectory (vdr style) #VideoTab VideoPanel.Title1=video corrections (demultiplex) VideoPanel.addEndcode=add sequence end code -VideoPanel.addEndcode.Tip=enable for a conform MPEG sequence end -VideoPanel.insertEndcode=insert sequenzendcode on format changes -VideoPanel.insertEndcode.Tip=enable for a conform MPEG sequence end +VideoPanel.addEndcode.Tip=enable for a conforming MPEG sequence end +VideoPanel.insertEndcode=insert sequence endcode on format changes +VideoPanel.insertEndcode.Tip=enable for a conforming MPEG sequence end VideoPanel.addSequenceHeader=ensure each GOP has a sequenceheader VideoPanel.addSequenceHeader.Tip=re-init (resol. & q_matrix) of Picturedecoding on each GOP boundary (automatically on split) VideoPanel.patchToProgressive=patch all frames to progressive @@ -785,14 +833,16 @@ #AudioTab AudioPanel.Title1=audio conversions (demultiplex) -AudioPanel.loslessMpaConversion.Tip1=direct losless conversion (limited -AudioPanel.loslessMpaConversion.Tip2=to MPEG-1, Layer2, 48kHz, 56..384kbps) : -AudioPanel.loslessMpaConversion.Tip=if conversion is chosen, bitrate & channelmode will be constant over the complete file -AudioPanel.loslessMpaConversionMode0=(0) no conversion -AudioPanel.loslessMpaConversionMode1=(1) single to 3D-stereo (L+R = original) -AudioPanel.loslessMpaConversionMode2=(2) single to stereo (L+R = original) -AudioPanel.loslessMpaConversionMode3=(3) single to jointstereo (L+R = original) -AudioPanel.loslessMpaConversionMode4=(4) split 2channel into 2 single (1=L,2=R) +AudioPanel.losslessMpaConversion.Tip1=direct lossless conversion (limited +AudioPanel.losslessMpaConversion.Tip2=to MPEG-1, Layer2, 48kHz, 56..384kbps) : +AudioPanel.losslessMpaConversion.Tip=if conversion is chosen, bitrate & channelmode will be constant over the complete file +AudioPanel.losslessMpaConversionMode0=(0) no conversion +AudioPanel.losslessMpaConversionMode1=(1) double single to 3D-stereo (L = S, R = delayed S) +AudioPanel.losslessMpaConversionMode2=(2) double single to stereo (L & R = S) +AudioPanel.losslessMpaConversionMode3=(3) double single to jstereo (L & R = S) +AudioPanel.losslessMpaConversionMode4=(4) split 2ch into 2 single (1 = L, 2 = R) +AudioPanel.losslessMpaConversionMode5=(5) split 2ch into 2 doubled single (1 = LL, 2 = RR) +AudioPanel.losslessMpaConversionMode6=(6) split dual into 2 doubled single (1 = LR/LL, 2 = LR/RR) AudioPanel.decodeMpgAudio=decode MPEG Layer1,2 to PCM: AudioPanel.decodeMpgAudio.Tip=MPEG-Audio Decoder (not for Layer3), std output into stereo pcm AudioPanel.decodeMpgAudio.resampleAudioMode0=(0) no resampling @@ -812,7 +862,7 @@ AudioPanel.Title2=audio manipulations (demultiplex) AudioPanel.validateCRC=check CRC of AC-3 / MPEG-Audio L1,2 AudioPanel.validateCRC.Tip=if enabled, this ensures lowest erroneous output on costs of performance -AudioPanel.clearCRC=delete CRC in MPEG-Audio Layer1,2 +AudioPanel.clearCRC=remove CRC in MPEG-Audio L1,2 AudioPanel.clearCRC.Tip=if enabled, this may prevent some audio error messages AudioPanel.fillGapsWithLastFrame=fill gaps with prev. frame AudioPanel.fillGapsWithLastFrame.Tip=instead of inserting silent frames; is std for AC-3, when ac3.bin doesn't contain a suitable silent frame for AC-3 @@ -822,6 +872,8 @@ AudioPanel.patch1stAc3Header.Tip=some AC-3 decoding software needs it to decode all channels even if there are less AudioPanel.replaceAc3withSilence=replace all non-3/2 AC-3 by 3/2lfe silence AudioPanel.replaceAc3withSilence.Tip=enable, to mask unwanted 2/0 frames by 3/2 silence (48khz,448kbps, ac3.bin required) +AudioPanel.AC3BitrateAdaption=AC-3: adapt bitrates +AudioPanel.AC3BitrateAdaption.Tip=keeps bitrate constant AudioPanel.addRiffToAc3=add RIFF WAVE header to AC-3 Audio AudioPanel.addRiffToAc3.Tip=create a .wav file, using the AC-3 Wave Format (tag 0x2000) Header AudioPanel.addRiffToMpgAudioL12=MPA: add RIFF WAVE header Layer1,2 @@ -844,8 +896,10 @@ SubtitlePanel.decodeMegaradio.Tip=formerly transmitted via Hotbird 13ーE, 11.054GHz Hor., SR 27500, FEC 5/6, TTX-PID 553 SubtitlePanel.decodeHiddenRows=decode hidden rows of teletext (id 0xFF, means offline pages) SubtitlePanel.decodeHiddenRows.Tip=some pages or complete teletexts/subtitles are hidden, so that may help -SubtitlePanel.rebuildPTS=re-build TTX-PTS from 1st MpgAudio stream +SubtitlePanel.rebuildPTS=recreate TTX PTS from 1st MpgAudio stream SubtitlePanel.rebuildPTS.Tip=use it ONLY for TTX streams included in a stream file (TS,PES..) but w/o proper time base to video +SubtitlePanel.rebuildPictPTS=recreate DVB ST PTS from 1st MpgAudio stream +SubtitlePanel.rebuildPictPTS.Tip=use it ONLY for DVB ST streams included in a stream file (TS,PES..) but w/o proper time base to video SubtitlePanel.keepOriginalTimecode=keep original Timecode (PTS) on independent decoding SubtitlePanel.keepOriginalTimecode.Tip=without a leading video to demux, new Timecode doesn't start at 0 SubtitlePanel.exportTextAsUnicode=Unicode (UTF-16 BE) on text export @@ -864,7 +918,7 @@ SubtitlePanel.Colormodel.Mode2=(2) 256 colours SubtitlePanel.PageId.Value.Tip=empty field = use what comes, else: key in the page ID of interest (depends on broadcast) SubtitlePanel.Colormodel=simulate DVB Subpictures IRD color model: -SubtitlePanel.Colormodel.Tip=that extremely affects the look of exported subtitles, best setting depends on what you want +SubtitlePanel.Colormodel.Tip=that strongly affects the look of exported subtitles, best setting depends on what you want SubtitlePanel.PageId= fix to pageID: SubtitlePanel.showPreview=show Subtitle Preview SubtitlePanel.Format.SUP.Values.Tip=(offsets from left bottom) Font pointsize; BckGrd Alpha; Yoffset; Xoffset; Xwidth; H(unused); V; Yoffset2; max.lines @@ -872,14 +926,24 @@ SubtitlePanel.Font.LoadError=Error while getting system fonts SubtitlePanel.useTextOutline=draw text with black outline (SUP only) SubtitlePanel.useTextOutline.Tip=draws a 3 pix outline around each char at a max. of 2 'speaker colors' per frame, else a black bg is used -SubtitlePanel.Font=Schriftart: -SubtitlePanel.Font.Tip=bei SUP-Export +SubtitlePanel.Font=Font: +SubtitlePanel.Font.Tip=for SUP-Export SubtitlePanel.specialTermination=special ttx page termination (test) SubtitlePanel.specialTermination.Tip=forces time out of unclosed pages SubtitlePanel.ChangeDisplay=change display mode: SubtitlePanel.ChangeDisplay.Tip=only when processing a .sup file as input format (from DVD or as an ES) SubtitlePanel.MovePosition=move picture position: SubtitlePanel.MovePosition.Tip=leave it empty, or set additional offsets for X and Y like: -20,-40 (top.left) +SubtitlePanel.keepColourTable=keep colour table definition +SubtitlePanel.keepColourTable.Tip=keep/enhance colour table definition on a complete run (over multiple collections) +SubtitlePanel.exportAsVobSub=additional export as VobSub (idx+sub) +SubtitlePanel.exportAsVobSub.Tip=additional export as VobSub (idx+sub), SUP export must be choosen +SubtitlePanel.TtxExportBoxedOnly=export only boxed text/subtitle +SubtitlePanel.TtxExportBoxedOnly.Tip=invisible text outside the box will be ignored, e.g. at erroneous pages +SubtitlePanel.useTextAlignment=horizontal alignment of text +SubtitlePanel.useTextAlignment.Tip=horizontal alignment of text, depends on selected font (non- or proportional) +SubtitlePanel.enableHDSub=enable HD subtitle +SubtitlePanel.enableHDSub.Tip=enable HD subtitle #Autoload autoload.title=list of pre-defined input directories @@ -888,6 +952,7 @@ autoload.dir.refresh.tip=refresh file list autoload.ftp.add.tip=add ftp server directory to autoload list autoload.add.coll.tip=create new collection for each selected file and add it +autoload.add.coll2.tip=create new collection and add all selected files autoload.add.file.tip=add file(s) to collection autoload.rename.tip=left doubleclick or enter to add file(s) to a collection, right click to rename autoload.dialog.rename=rename @@ -958,6 +1023,7 @@ parsePrimaryPES.eof.error=parsePrimaryPES EOF reached in error: parsePrimaryPES.io.error=parsePrimaryPES File I/O error: parsePrimaryPES.msg.noexport=--> stream omitted (0x +StreamParser.NoExport=stream omitted #parseTS parseTS.sid=-> Service ID 0x @@ -977,7 +1043,7 @@ parseTS.stuffing=--> PID 0x1FFF => stuffing packet -> ignored parseTS.scrambled=-> PID 0x{0} => marked as scrambled data, packet {1} @ {2} -> ignored parseTS.clear=-> PID 0x{0} => get clear data, packet {1} @ {2} -parseTS.outof.sequence=!> PID 0x{0} -> packet {1} @ pos. {2} out of sequence ({3}/{4}) (shifting..) +parseTS.outof.sequence=!> PID 0x{0} -> packet {1} @ pos. {2} out of sequence ({3}/{4}) (shifting counter..) parseTS.priv.stream2.ignored=-> PID 0x{0}(private stream 2) -> ignored parseTS.scrambled.notignored=-> PID 0x{0} => marked as scrambled data (not ignored){1} parseTS.ignored= -> ignored @@ -1020,7 +1086,7 @@ parsePVA.file.overlap=File-Overlap detected @ filepos.: parsePVA.packs=packs parsePVA.found.id=-> found ID 0x -parsePVA.outof.sequence=!> ID 0x{0} -> packet {1} @ pos. {2} out of sequence ({3}/{4}) (shifting..) +parsePVA.outof.sequence=!> ID 0x{0} -> packet {1} @ pos. {2} out of sequence ({3}/{4}) (shifting counter..) parsePVA.id.0x=-> ID 0x parsePVA.actual.vframes=-> actual written vframes: parsePVA.ac3.onid=--> AC-3/DTS Audio on ID 0x @@ -1062,7 +1128,7 @@ audio.msg.summary.pre-insert=!> {0} frame(s) ({1}ms) pre-inserted @ audio.msg.summary.insert=!> {0} frame(s) ({1}ms) inserted @ audio.msg.summary.add=!> {0} frame(s) ({1}ms) added @ -audio.msg.summary.frames=audio frames: wri/pre/skip/ins/add {0} @ {1} done... +audio.msg.summary.frames=audio frames: wri-pre-skip-ins-add {0} @ {1} done... audio.msg.summary.jstereo=-> {0} stereo/jointstereo change(s) detected... audio.msg.audio=Audio audio.msg.newfile.left=(left): @@ -1073,14 +1139,14 @@ #Videoprocess video.msg.pts.start_end=Video PTS: start 1.GOP {0}, end last GOP -video.msg.summary=-> Video: fr/ ct/ 1p/ cg/ og/ dg -> +video.msg.summary=-> Video: fr-ct-1p-cg-og-dg -> video.progress=analyze video stream file video.msg.skip.sec=-> skip sequence_end_code following GOP# {0} @ video.error.io=!> pure video access error video.msg.error.lackofdata=!> GOP# {0} - lack of data, ignored... video.msg.error.nopts.use_goptc=!> GOP# {0} has no PTS, use GOP TC for sync video.msg.error.nopts.use_lastpts=!> GOP# {0} has no PTS, use last PTS for sync -video.msg.basics=-> video basics: {0}bps, vbvBuffer +video.msg.basics=-> video basics: video.msg.newformat=GOP# {0}, new format in next leading sequenceheader detected: video.msg.error.pesext_in_es=!> GOP# {0}, PES_header and extension found in ES, filled with zero... (GOP offs. {1}) video.msg.error.pes_in_es=!> GOP# {0}, PES_header found in ES, filled with zero... (GOP offs. {1}) @@ -1202,7 +1268,7 @@ demux.error.video.startcode=!> invalid startcode, refuse video PES packet demux.error.video.payload=!> incoming PES packet without payload or wrong header data demux.msg.skip.sec=-> skip sequence_end_code following GOP# -demux.error.gop.toobig=-> dropping video data, GOP larger than 6MB +demux.error.gop.toobig=!> dropping video data, GOP larger than 6MB #ftpchooser ftpchooser.server.tip=Name or IP adress of ftp server diff -Nru project-x-0.90.4dfsg/resources/pjxresources_fi.properties project-x-0.91.0/resources/pjxresources_fi.properties --- project-x-0.90.4dfsg/resources/pjxresources_fi.properties 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/resources/pjxresources_fi.properties 2009-10-03 09:23:18.000000000 +0000 @@ -0,0 +1,1324 @@ +# Project-X Resource File +# suomi, std, V 1.1 +# Ropsi Talvio + +# Credits +credits=dvb.matt - Project-X:n is臀n\ +Lucike - forumin is舅t, dokumentointi\n\ +TheHorse - esin艙tn n舊p臺mistvalvonta\n\ +java.lang - H-resoluution perinteinen polku\n\ +R-One - DTS -tuki\n\ +ghost - dreambox file segment completion\n\ +roehrist - CVS, X-input, ftp\n\ +pstorch - i18n tuki, asetukset\n\ +chrisg - Topfield levynvalvonta (AddOn)\n\ +jazzydane - tanskankielen k蒿nns\n\ +Kano / RoEn - Unix buils script\n\ +Eric Albert - Selaimen k艙nnistys\n\ +catapult,Bonni - Topfield 5x00 vienti\n\ +...ja kaikki muut tukijat... + +# +Common.File=&Tiedosto +Common.Save=&Tallenna +Common.SaveAs=Tallenna &nimell.. +Common.Open=&Avaa.. +Common.Load=&Lataa.. +Common.Edit=&Muokkaa +Common.Messages=&Viestit +Common.Options=&Lis臑setukset +Common.Close=&Sulje +Common.Cancel=&Keskeyt +Common.Exit=L&opeta +Common.LogFile=&Lokitiedosto +Common.Preferences=&Esiasetukset +Common.Addons=Lis臑setukset +Common.CloseAndRevert=Sulje ja K艙t +Common.Preprocess=&Esik舖ittely +Common.KillProcess=Lopeta k舖ittely v舁ittm舖ti + +General.Yes=Kyll +General.No=Ei +General.FileProperties=Tiedoston ominaisuudet +General.CollectionProperties=Kokoelman ominaisuudet +General.CollectionProperties.Hint=Asetukset koskevat vain t舩 kokoelmaa. +General.FileTable=Tiedostoluettelo +General.CutControl=Leikevalvonta +General.FilterControl=Suodinvalvonta + + +StartUp.Title=X Aloitus, ladataan osia... +StartUp.Error=Virhe k艙nnistett臚ss Project-X:蒿 +StartUp.Error.Title=Project-X:n aloitusvirhe +StartUp.Init=Initialisoin. +StartUp.Wait=Odota, ole hyv... +StartUp.Choose=Valitse teht舸... + +# +PreferencesPanel.Title=ESIASETUKSET +PreferencesPanel.Button=Esiasetukset + +# +FilterPanel.ResetAll=Nollaa asetukset +FilterPanel.MoreSettings=Lis臑setukset.. + +Application.SaveSettingsOnExit=Tallenna asetukset lopetettaessa +Application.InputDirectoriesDepth=alihakemiston syvyys (Vain tiedosto) + +# Popupmenu +popup.what=Mit +popup.cutspecials=Avaa leikkausm蒿ritykset... +popup.url=URL.. +popup.add=lis蒿... +popup.remove=poista +popup.newOutName=Uusi tiedostonimi.. +popup.rename=vaihda nimi.. +popup.openhex=avaa Hex-muodossa.. +popup.patchbasics=vaihda videon tunniste... +popup.sendtocl3=l臧et CL#3.. +popup.newOutName=Uusi tiedostonimi.. +popup.changeTimestamp=p臺vit tiedoston aikaleima.. +popup.copyInfoToClipboard=kopioi leikepyd舁le +popup.assignStreamType=kytke virtatyyppiin.. +popup.automatic=automaattinen +popup.assignActionType=k艙t teht舸舩yyppi.. +popup.unspecified=ei m蒿ritelty +popup.fixHpAc3=luo korjattu Hpョ ac3-tiedosto.. +popup.stripAudio=rippaa raw audiotiedosto DD/DTS-蒿nest.. + +#Filechooser +FileChooser.Select=Valitse +FileChooser.Title=Valinta + +# +FilterPanel.ResetAll=Nollaa kaikki asetukset +FilterPanel.MoreSettings=Lis蒿 asetuksia.. + +#File Menu +file.menu=&Tiedosto +file.url=tiedoston UR&L-osoite .. +file.add=&Lis蒿... +file.remove=Poista +file.rename=Nime uudelleen... +file.exit=&Lopeta + +#dialog +dialog.input.url=Syt URL-osoite.. + +#Settings Menu +settings.menu=&Asetusvalikko +settings.settings=&Asetukset... + +#Language Menu +language.menu=&Kieli +language.system=Oletus +language.check=Tarkista &lennossa + +#General Menu +general.menu=&Olemukset + +#Options Menu +options.menu=&Muokkaa +options.opencutspecials=Avaa &leikkausm蒿ritykset... +options.openhexview=Avaa &HexViewer'iss... +options.pachtbasics=&Vaihda videomuoto... +options.subtitlepreview= &DVB-tekstityksen n艙tt... +options.teletext=&TekstiTV:n sivu... + +#Help Menu +help.menu=&Apua +help.about=&Tietoja... +help.help=&Apua.. +help.sourceforge.net=http://sourceforge.net/projects/project-x +help.version=&Uusin versio? +help.version.info=Uusin versio: +help.version.info.title=Project-X:n uusin versio +help.version.error=Virhe Project-X version tarkastuksessa: + +progress.title=Edistyminen + +#Html Frame +html.title=Apua + +#Buttons +button.go=&Suorita! +button.go.Tip=Aloita, keskeyt tai jatka prosessia +button.i=&I +button.i.Tip=Etsit蒿n tietoa tiedostostosta, joka sis舁t蒿 monta tiedostovirtaa (katso vientimuodot: pikademux) +button.c=&K +button.c.Tip=Keskeyt ty +button.p=&T +button.p.Tip=pid TAUKO tyskentelyss tai jatka +button.e=&E +button.e.Tip=virtaID:n Saamiseksi ota PVA-tieto haluamastasi virrasta (paina 'i' n臧d臾sesi lytyneen ID:n) + +#Mainpanel +MainPanel.Collection=Kokoelma +MainPanel.Process=Edistyminen +MainPanel.Process.Tip=Jos ei DEMUXoida, muunnetaan virran muoto (virran sis舁t kopioidaan korjaamatta virheit) +MainPanel.BitrateMonitor.Tip=todellinen GOP:in virtanopeus 0 - 10 Mbps (riippuu teht舸舖t/GOP-rakenteesta/videoajasta) +MainPanel.writtenMB=tiedostokoko +MainPanel.writtenMB.Tip=leikekokoelman koko MB +MainPanel.useAllCollections=Valitse kaikki kokoelmat. +MainPanel.useAllCollections.Tip=K舖ittele kaikki kokoelmat yhten ajona +MainPanel.enablePostProcessing=j舁kik舖ittely. +MainPanel.enablePostProcessing.Tip=J舁kik舖ittely (katso ULKOISET, jos kentt蒿 ei ole j舩etty tyhj臾si) +MainPanel.simpleMPG=MPG=>sPES +MainPanel.simpleMPG.Tip=yksinkertainen PES-analyysi. K艙t MPEG-PS:蒿n, joka sis舁t蒿 dataa, jolla ei ole yksityisvirta 1:n subID:t +MainPanel.enhancedPES=sPES=>MPG +MainPanel.enhancedPES.Tip=laajennettu PES-korjaus, k艙t PES:iin, joka sis舁t蒿 dataa, jolla on yksityisvirta 1:n subID +MainPanel.nonVideoExportStatus=Vienti ei aloitettu +MainPanel.nonVideoExportStatus.Tip=audion purkamisen, kirjoitettujen DVB-tekstityksen tai TekstiTV-sivujen tila +MainPanel.AudioVideoOffset=AV-offset +MainPanel.AudioVideoOffset.Tip=n艙tt蒿 eron millisekunteina A- ja V-virroissa jokaisen GOP:in alussa,: a/b/c

(leikkaaminen aiheuttaa erilaiset kestot)

a avser AV-PTS-frskjutning i ursprungsfilen

b avser AV-rams inledande frskjutning fr faktisk GOP i 'demuxad' fil

c avser ny verklig AV-frskjutning fr faktisk GOP in 'demuxad' fil +MainPanel.ConversionMode.demux=demux (erotan) +MainPanel.ConversionMode.toVDR=muunto VDR:ksi +MainPanel.ConversionMode.toM2P=muunto M2P:ksi +MainPanel.ConversionMode.toPVA=muunto PVA:ksi +MainPanel.ConversionMode.toTS=muunto TS:ksi +MainPanel.ConversionMode.PidFilter=PID-suodatin +MainPanel.ConversionMode.binaryCopy=1:1 binaarikopiointi +MainPanel.ConversionModePriority=Ensisijainen kokoelma +MainPanel.ConversionModePriority.Tip=K艙t kokoelman teht舸舩yyppi +MainPanel.useAutoPidFilter=k艙t PMT-PID -suodatinta +MainPanel.useAutoPidFilter.Tip= +MainPanel.QuickStart=Pika-aloitus +MainPanel.QuickStart.Tip=k艙nnist蒿 prosessin v舁ittm舖ti k艙tt臚n edellisi asetuksia +MainPanel.useGOPEditor=avaa virhetilanteissa GOP-editorin (ty k艙nniss) +MainPanel.useGOPEditor.Tip=avaa virhetilanteissa GOP-editorin + + +ProcessWindow.Title=PROSESSINトYTTヨ +ProcessWindowPanel.Button=Valmistelu >> +ProcessWindowPanel.Title=Lokiviestit: +ProcessWindowPanel.Action=Toiminto: + +#Tab.msg +MessagePanel.Title=VIESTIEN KトSITTELY +MessagePanel.logSequenceError=loggaa 'packets out of sequence' / bittivirheet +MessagePanel.logSequenceError.Tip=舁 k艙t, jos t舂 viesti esiintyy loki-ikkunassa toistuvasti (ja pienenn nopeutta) +MessagePanel.logMissingStartcode=loggaa 'puuttuvat aloituskoodit' +MessagePanel.logMissingStartcode.Tip=舁 k艙t, jos t舂 viesti esiintyy loki-ikkunassa toistuvasti (ja pienenn nopeutta) +MessagePanel.logESError=loggaa 'PES-otsikko lydetty ES:ss' +MessagePanel.logESError.Tip=舁 k艙t, jos t舂 viesti esiintyy loki-ikkunassa toistuvasti (ja pienenn nopeutta) +MessagePanel.leadingTimeIndex=Lis蒿 aikaindeksi kaikkiin lokitiedostoihin +MessagePanel.leadingTimeIndex.Tip= +MessagePanel.logWSS=luo WSS-loki +MessagePanel.logWSS.Tip= +MessagePanel.logVPS=luo VPS-loki +MessagePanel.logVPS.Tip= +MessagePanel.logRDS=luo RDSloki +MessagePanel.logRDS.Tip= +MessagePanel.hideProcessWindow=Piilota prosessin艙tt k舖ittelyn ajaksi +MessagePanel.hideProcessWindow.Tip= +MessagePanel.minimizeMainFrame=Pienenn p蒿kehys k舖ittelyn ajaksi +MessagePanel.minimizeMainFrame.Tip= +MessagePanel.showSubpictureWindow=n艙t tekstitysikkuna tekstityst luotaessa +MessagePanel.showSubpictureWindow.Tip= +MessagePanel.logErrorMaximum=lokin maksimi 500 varoitusta ja virhett +MessagePanel.logErrorMaximum.Tip= + +#usage note +usage=yksinkertainen komentorivi: \n\ +Huomio: CL ei lataa k艙ttliittym舅 komponentteja, paitsi switchill [-gui]\n\ +ilman optioita ...k艙nnist蒿 k艙ttliittym舅\n\ +switsit ja L臧detiedostot voivat olla miss j舐jestyksess tahansa\n\ +\n\ +M蒿rityksi:\n\ +[-ini ] ..k艙t normaalin \n\ asemesta +[-dvx1] ..luo .d2v-projektitiedoston demuxatessa\n\ +[-dvx2] ..luo .d2v-projektitiedoston + .ac3.wav (RIFF-WAVE-otsikko)\n\ +[-dvx3] ..luo .d2v-projektitiedoston + .mpa.wav (RIFF-WAVE-otsikko)\n\ +[-dvx4] ..luo .d2v-projektitiedoston + .ac3.wav + mpa.wav (RIFF-WAVE-otsikko)\n\ +[-out ] ..tallennushakemisto\n\ +[-name ] ..tiedostonimi\n\ +[-cut ] ..k艙t t舩 tekstitiedostoa leikkauskohtien listana\n\ +[-chp ] ..k艙t t舩 tekstitiedostoa leikkauspisteiden listana\n\ +[-id ] ..K艙t vain n臺t (P)ID-tietoja, erota pilkulla (\",\")\n\ +[-gui] ..N艙t k艙ttliittym k艙tt臚n kaikkia CLI-vaihtoehtoja\n\ +[-log] ..kirjoita normaali lokitiedosto\n\ +[-saveini] ..Tallenna asetusten muutokset .ini-tiedostoon +[-split ] ..jaa tuloste xxx MB\n\ kokoisena +[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..teht舸舩yypit + +#conditions +terms=\n\ +KトYTTヨEHDOT:\n\ +- ProjectX on ilmainen Javaohjelma videotiedostojen demultiplexointiin.\n\ +- Se on tarkoitettu koulutusk艙ttn ei-kaupalliseksi testiohjelmaksi\n\ +- ja julkaistu GNU GPL:N s蒿ntjen mukaan.\n\ +- Ohjelmistoon EI sis舁ly mink蒿nlaista takuuta.\n\ +- K艙tet蒿n omalla riskill oman kehityksen edist舂iseksi.\n\ + +terms.disagree=En hyv臾sy(SULJEN) +terms.agree=Hyv臾syn! + +startup.title=X k艙nnistyy ja lataa komponentteja... +startup.error=Virhe Project-X:n k艙nnistyksess +startup.error.title=Project-X:n k艙nnistysvirhe + +about.title=Tietoja: +about.ok=OK +about.credits.label=Kiitokset: + +#version info +version.info=TEST PROJECT ONLY +version.user=, K艙tt臻: + +#JavaEV +javaev.java.version=java.versio +javaev.java.vendor=java.toimittaja +javaev.java.home=java.home +javaev.java.vm.version=java.vm.versio +javaev.java.vm.vendor=java.vm.toimittaja +javaev.java.vm.name=java.vm.nimi +javaev.java.class.vers=java.class.versio +javaev.java.class.path=java.class.polku +javaev.java.os.name=k艙ttj舐jestelm +javaev.java.os.arch=koontiversio +javaev.java.os.version=versio +javaev.java.user.name=K艙tt臻 +javaev.java.user.home=Kotihakemisto +javaev.java.user.lang=K艙tt臻舅 kieli +javaev.java.ini.file=ini-tiedosto +javaev.java.disk.access=levysaanto + +#messages +msg.infomessage=Tiedot +msg.new.language=Kielen vaihto vaatii uudelleenk艙nnistyksen +msg.loadlang.error=virhe kielen latauksessa: +msg.init.error=Initialisointivirhe: +msg.loadini.error=virhe ladattaessa ini-tiedostoa: +msg.saveini.error=virhe ini-tiedoston tallennuksessa: +msg.loading.cutpoints=-> ladataan {0} leikkauskohtia... +msg.loading.cutpoints.error=virhe ladattaessa leikkauskohtia +msg.loading.pids=-> ladataan {0} (P)ID... +msg.ptsfile.error=...virhe PTS-tiedoston avaamisessa: +msg.savecut=-> tallennnetaan leikkauskohdan PTS-arvoa ({0}) tiedostoon... +msg.savecut.error=virhe leikkausmerkkien tallennuksessa: +msg.log.error=lokivirhe: +msg.cuts.cutin=-> leikkauksen alku @ GOP# {0} / uusi v-kehys {1} / uusi aikakoodi{2} +msg.cuts.cutout=-> leikkauksen loppu @ GOP# {0} +msg.newfile=---> uusi tiedosto: +msg.browser.launcher.error=Virhe selaimen k艙nnistyksess: + +#Hex Viewer +hexviewer.title=HEX-n艙tt +hexviewer.file=Tiedoston Hex-n艙tt +hexviewer.filesize= Tiedoston koko +hexviewer.error=...Virhe +hexviewer.save=Tallenna Hex-n艙tt +hexviewer.close= Sulje +hexviewer.to=kohde +hexviewer.extractfrom=Pura paikasta: (hex) +hexviewer.extractfrom_tip=klikkaa tiedoston purkamiseksi +hexviewer.extract_tip=pura tiedostosegmentti uuteen tiedostoon +hexviewer.jumptohex=Siirry hex-muotoon.: +hexviewer.jumptodec=Siirry desimaalimuotoon.: +hexviewer.jumpto_tip=Paina hyp舩臾sesi tiedostosijaintiin +hexviewer.textmode=tekstimuoto + +#TeletextPageMatrix +ttpagematrix.title=TekstiTV-sivumatriisi +ttpagematrix.tip=matriisin n臾yviss olo hidastaa demux-nopeutta +ttpagematrix.file=tiedosto +ttpagematrix.composition1=TekstiTV:n sivujen yhdistelm +ttpagematrix.composition2='MXY' : M = matriisinumero, XY = sivunumero +ttpagematrix.composition3=numeroiden v舐i + +#Scan +scan.unsupported=Tuntematon tiedostotyyppi +scan.msg1=videota ei lytynyt pikahaussa +scan.msg2=audiota ei lytynyt pikahaussa +scan.msg3=kelvollisia teksti-TV:n sivuja ei lytynyt pikahaussa +scan.msg4=tekstityst ei lytynyt pikahaussa +scan.msg5=PMT:t ei lytynyt +scan.msg6=PMT-k蒿nnsongelma (kieli) +scan.msg7=videodata lytyi, mutta kohtausrajoja ei lydetty pikahaussa +scan.msg8=valvontaongelma +scan.msg9=Tiedosto ei ala kohtausotsikolla + +#TS +ts.msg1=!> ID:t ei lytynyt! ..K艙t kiinte蒿 PMT:t + +#WSS +wss.run_in=Run-In-Code lydetty +wss.no_run_in=Run-In-Code'a ei lydetty +wss.startcode=Alkukoodi lydetty +wss.no_startcode=Alkukoodia ei lydetty +wss.start=K艙nnist +wss.group_1=Ryhm 1 (Kuvamuoto) +wss.group_2=Ryhm 2 (Kuvan laajennukset) +wss.group_3=Ryhm 3 (Tekstitykset) +wss.group_4=Ryhm 4 (muut) +wss.group_1.0001=4:3 t艙si formaatti, 576 viivaa, koko n艙tt +wss.group_1.1000=14:9 kirjekuoriformaatti, 504 viivaa, keskitetty +wss.group_1.0100=14:9 kirjekuoriformaatti, 504 viivaa, ylh蒿ll +wss.group_1.1101=16:9 kirjekuoriformaatti, 432 viivaa, keskitetty +wss.group_1.0010=16:9 kirjekuoriformaatti, 432 viivaa, ylh蒿ll +wss.group_1.0111=14:9 suuri formaatti, 576 viivaa, keskitetty, koko n艙tt +wss.group_1.1110=16:9 suuri formaatti, 576 viivaa, koko n艙tt +wss.group_1.error=ongelma ryhm舅 1 tulkinnassa (bitit 0..3) +wss.group_2.0.01=kameramoodi +wss.group_2.0.10=filmimoodi +wss.group_2.0.00=ongelma bitin 4 tulkinnassa +wss.group_2.1.01=PAL-standardi +wss.group_2.1.10=MACP (motion adaptive color plus) +wss.group_2.1.00=ongelma bitin 5 tulkinnassa +wss.group_2.2.01=ei apua +wss.group_2.2.10=apumodulaatio (PALplus) +wss.group_2.2.00=ongelma bitin 6 tulkinnassa +wss.group_2.3.01=varattu (0) +wss.group_2.3.10=varattu (1) +wss.group_2.3.00=ongelma bitin 7 tulkinnassa +wss.group_3.0.01=ei tekstityst teksti-TV:ss +wss.group_3.0.10=tekstitys teksti-TV:ss +wss.group_3.0.00=ongelma bitin 8 tulkinnassa +wss.group_3.1.00=ei 'Avaa DVB-tekstitys' +wss.group_3.1.01='Avaa DVB-tekstitys' aktiivisen kuvan sis舁l +wss.group_3.1.10='Avaa DVB-tekstitys' aktiivisen kuvan ulkopuolella +wss.group_3.1.11=varattu (11) +wss.group_3.1.err=ongelma bittien 9-10 tulkinnassa +wss.group_4.0.01=ei surround-蒿nt +wss.group_4.0.10=surround-蒿ni +wss.group_4.0.00=ongelma bitin 11 tulkinnassa +wss.group_4.1.01=ei copyright'ia/tuntematon +wss.group_4.1.10=copyright asetettu +wss.group_4.1.00=virhe bitin 12 korjauksessa +wss.group_4.2.01=kopiointia ei rajoitettu +wss.group_4.2.10=kopiointi rajoitettu +wss.group_4.2.00=virhe bitin 13 korjauksessa +wss.group_4.1.err=ongelma bittien 12-13 tulkinnassa + +#Subpicture +subpicture.title=Tekstitysn艙tt +subpicture.in_time=Alku +subpicture.duration=kesto +subpicture.msg1=!> DVB-tekstityksen kirjoitusvirhe +subpicture.msg2=!> yksinkertainen kuvapaketti +subpicture.msg3=!> DVB-tekstityskomento ei kelpaa + +#RawRead +rawread.msg1=ei k艙tss tai kirjasto puuttuu + +#Common +common.rename_error1=!> ei voi nimet uudelleen +common.rename_error2=kohde + +#TabPanel +TabPanel.LogwindowPanel=Loki-ikkuna +TabPanel.FileinfoPanel=Tiedot +TabPanel.MessagePanel=Viesti +TabPanel.ExportPanel=Vienti +TabPanel.SpecialPanel=Erityist +TabPanel.VideoPanel=VIDEO +TabPanel.AudioPanel=AUDIO +TabPanel.SubtitlePanel=TEKSTITYS +TabPanel.ExternPanel=ULKOISET +TabPanel.OptionPanel=LISトASETUKSET +TabPanel.NetPanel=NET +TabPanel.PostCommandsPanel=JトLKIKトSITTELY + +#Tab.logwindow +LogwindowPanel.showTtxHeader=Teksti-TV +LogwindowPanel.showTtxHeader.Tip=n艙tt蒿 Teksti-TVn otsikkorivin ja VPS-tilan (k艙tett臚ss hidastaa nopeutta) +LogwindowPanel.showTtxHeader.Tip1=Sivun otsikkorivi (rivi 0) +LogwindowPanel.showVpsLabel.Tip=lyhyt VPS-tila (VBI-rivi 16), joillakin asemilla on tarpeellista VPS-dataa tekstiTV:n kautta + +#Tab.options +OptionPanel.Various.Title=Muuttujat +OptionPanel.LookAndFeel=Asennetut Katso&Tunne-ulkon蔕t +OptionPanel.LookAndFeel.Info1=valitse haluamasi ulkon臾. Voi olla,ett +OptionPanel.LookAndFeel.Info2=jotkut Katso&Tunne-asetukset kaatavat ohjelman +OptionPanel.DebugLog=Tallenna suuri lokitiedosto +OptionPanel.DebugLog.Tip=hidastaa nopeutta, vain testitarkoituksiin +OptionPanel.NormalLog=tallenna normaali lokitiedosto +OptionPanel.NormalLog.Tip=kirjoittaa loki-ikkunan sis舁ln tiedostoon +OptionPanel.dumpDroppedGop=Dumppaa pudotetut GOP:it erillisiin tiedostoihin +OptionPanel.dumpDroppedGop.Tip=Tarkoitettu ainoastaan myhemp蒿 virheanalyysi varten +OptionPanel.StartPath=Tiedostonvalinnan aloitusluettelo: +OptionPanel.StartPath.Value.Tip=J舩 tyhj臾si tai syt aloitusluettelo, merkki '?' nollaa edelliseen polkuun +OptionPanel.Buffer.Title=Puskuri +OptionPanel.MainBuffer=I/O-Puskurin koko tavuina +OptionPanel.MainBuffer.Tip=Alemmat arvot voivat aiheuttaa sis臺si tiedoston ylivuotovirheit -> Muisti ei riit-virhe +OptionPanel.PesPreBuffer=I-Puskurin koko tavuina (vain PES-paketin koon ollessa =0 !) +OptionPanel.PesPreBuffer.Tip=koita alempia/korkeampia arvoja, jos k艙t舩 korkean bittinopeusvirtoja +OptionPanel.ScanBuffer=Esiskannaa puskurikoko tavuina +OptionPanel.ScanBuffer.Tip=Koita alempia/korkeampia arvoja, jos tunnettuja tiedostotyyppej ei ole havaittu +OptionPanel.PreviewBuffer=Esin艙ttpuskurin koko tavuina +OptionPanel.PreviewBuffer.Tip=alemmat arvot nopeuttavat esin艙tt hukaten mahdollisesti kuvatietoa +OptionPanel.callGc=ROSKAKORI +OptionPanel.callGc.Tip=kutsuu roskakoria +OptionPanel.closeOnEnd=Sulje ohjelma lopetettaessa +OptionPanel.closeOnEnd.Tip=Sulje ohjelma lopetuksen j舁keen +OptionPanel.holdStreamInfoOnOSD=S臺lyt StreamInfo OSD:ss +OptionPanel.holdStreamInfoOnOSD.Tip=S臺lyt StreamInfo OSD:ss +OptionPanel.additionalInputBuffer=K艙t lis舖yttpuskuria +OptionPanel.additionalInputBuffer.Tip=K艙t 1MB lis舖yttpuskuria - parempi pieniin tiedostosegmentteihin + +#ScanInfo +ScanInfo.Location=Sijainti: +ScanInfo.Name=Nimi: +ScanInfo.Size=Koko: +ScanInfo.Bytes=tavua +ScanInfo.Type=Tyyppi: +ScanInfo.Date=P臺v艙s: +ScanInfo.Video=Video: +ScanInfo.Audio=Audio: +ScanInfo.Teletext=TekstiTV: +ScanInfo.Subpicture=DVB-tekstitys: +ScanInfo.Playtime=Kesto: +ScanInfo.NotFound=Tiedostoa ei ole! + +#Execute +PostCommands.Title=ulkoiset ohjelmat +PostCommands.PostProcessing=J舁kik舖ittelykomennot: +PostCommands.PostProcessing.Tip=Suorita komento, kun kokoelma/jakaminen on suoritettu +PostCommands.Execute=Suorita +PostCommands.Close=sulje +PostCommands.Error=!> Suoritusvirhe: + +#Collection +CollectionPanel.Title=Kokoelman erikoismuuttujat +CollectionPanel.Title2=kokoelman muuttujat.# +CollectionPanel.Title.processingPreview=K舖ittelyn n艙tt... +CollectionPanel.CutPanel=Videon tiedot +CollectionPanel.CutPanel.Tip1=Voit k艙tt蒿 mys n舊p臺mist, esin艙tt toimii vain asematavuleikkauksissa +CollectionPanel.CutPanel.Tip2=aktiivinen segmentti tai useampi segmentti + aktiivisen tiedoston nimi +CollectionPanel.CutPanel.Tip3=suoritettu (P)ID nykyisen kuvan saamiseksi +CollectionPanel.CutPanel.Tip4=syt numero tai ved&pudota leikkauspisteluettelo t臧舅 +CollectionPanel.addPoint=lis蒿 kohta +CollectionPanel.removePoint=poista kohta +CollectionPanel.NumberOfPoints=kohtien lukum蒿r: +CollectionPanel.NumberOfPoints.Tip=kaikki numerot lajitellaan automaattisesti +CollectionPanel.NumberOfChapters=Kappaleet: +CollectionPanel.NumberOfChapters.Tip=kaikki numerot lajitellaan automaattisesti +CollectionPanel.expectedSize=Oletettu tiedostokoko: +CollectionPanel.Preview.offline=esin艙tt ei k艙tss +CollectionPanel.Preview.processedPid=K舖itell蒿n videota(P)ID 0x +CollectionPanel.Various=Muuttujat +CollectionPanel.Preview.fastDecode=nopeampi/huonompi n艙tn koodaus +CollectionPanel.Preview.fastDecode.Tip=muunna ja interpoloi vain vasen ylkulma jokaisessa makroblokissa +CollectionPanel.Preview.LiveUpdate=N艙t LiveUpdate selatessa +CollectionPanel.Preview.LiveUpdate.Tip=Ei suositella hitaille koneille tai tiedostoj舐jestelmille, vaikuttaa esin艙ttpuskuriin +CollectionPanel.Preview.fullScaled=n艙tt suoraan t艙sikokoisena +CollectionPanel.Preview.fullScaled.Tip=skaalaa mahdollisten lomitusten artefact mukaisesti +CollectionPanel.Preview.AllGops=Esin艙t mys GOP:it, joissa ei ole kohtausotsikkoa +CollectionPanel.Preview.AllGops.Tip=ei suositella DVB-datalle, k艙t vain yksiotsikkoisille virroille +CollectionPanel.Preview.SliderWidth=K艙t t艙sikokoista liukua +CollectionPanel.Preview.SliderWidth.Tip=K艙t t艙sikokoista tai n艙tn mukaista liukua. Muutos vaatii k艙nnistyksen +CollectionPanel.Preview.YGain=Esin艙ttkuvan kirkkaus(-128..0..+128) +CollectionPanel.Preview.YGain.Tip=Esin艙ttkuvan kirkkaus (-128..0..+128) +CollectionPanel.PidList=PES(&sub)-ID/PID-lista: +CollectionPanel.PidList.Tip1=anna PES-ID tai sub-ID (MPG etc) tai PID (PVA,TS); tyhj lista k艙tt蒿 kaikkia ID:it +CollectionPanel.PidList.Tip2=poista valittu osa kaksoisklikkaamalla +CollectionPanel.transferPids1=Siirr valitut (P)ID:t uuteen kokoelmaan +CollectionPanel.transferPids1.Tip=Aktiivisen kokoelman muutokset t艙tyy aktivoida (apply) +CollectionPanel.transferPids2=Siirr leikkaustallenne uuteen kokoelmaan +CollectionPanel.transferPids2.Tip=Aktiivisen kokoelman muutokset t艙tyy aktivoida (apply) +CollectionPanel.ExportLimits=Muut l臧etysrajoitukset: +CollectionPanel.OptionHorizontalResolution=H-resoluutio. +CollectionPanel.OptionHorizontalResolution.Tip=yleinen,..j舩t蒿 automaattisesti huomioimatta kaikki muut videokohtaukset +CollectionPanel.OptionDAR=DAR: +CollectionPanel.OptionDAR.Tip=yleinen,..j舩t蒿 automaattisesti huomioimatta kaikki muut videokohtaukset +CollectionPanel.loadCutpointList=Lataa leikkauspisteet tiedostosta +CollectionPanel.loadCutpointList.Tip=Avaa leikkauspistetiedosto tai ved se t臧舅 +CollectionPanel.saveCutpointList=Tallenna leikkauspisteet tiedostoksi +CollectionPanel.ApplyAndClose=K艙t ja sulje +CollectionPanel.Apply=K艙t +CollectionPanel.CutMode.Bytepos=(0) K艙t asematavua leikkeeseen +CollectionPanel.CutMode.Gop=(1) K艙t GOP-numeroa leikkeeseen +CollectionPanel.CutMode.Frame=(2)K艙t kehysnumeroa leikkeeseen +CollectionPanel.CutMode.Pts=(3) K艙t PTS:蒿 leikkeeseen +CollectionPanel.CutMode.Timecode=(4)K艙t aikakoodia leikkauksiin +CollectionPanel.Preview.Error=Esin艙ttvirhe: +CollectionPanel.FileAccessError=.. En p蒿se tiedostoon +CollectionPanel.Title.Error=Kokoelmatiedot-> VIRHE! Kokoelma #{0} puuttuu +CollectionPanel.loadCutpointList.Error=leikkauslistan latausvirhe +CollectionPanel.Preview.disable=Ei esin艙tt +CollectionPanel.Preview.disable.Tip= + + +#makeVDR +StreamConverter.IOError=!> muodosta virta -IO-virhe: +StreamConverter.PayloadError=!> Tulevassa PES-paketissa ei ole sis舁t tai v蒿r otsikkodata +StreamConverter.Summary=Virta: + +#patch +PatchPanel.Title=Muokkaa 1. kohtausotsikon perusvideotietoja +PatchPanel.Error=patch-virhe +PatchPanel.Error2=patch-virhe 2 +PatchPanel.Change=muuta +PatchPanel.Cancel=keskeyt + +#CutListener +cutlistener.wrongnumber=-> v蒿r ID-numero + +#GoListener +golistener.msg.cancelled=--- k舖ittely lopetettu ---- +golistener.msg.paused=--- k舖ittely keskeytetty ---- +golistener.msg.resumed=--- k舖ittely aloitettu uudelleen ---- +golistener.msg.extracting=puretaan ID 0x:n raakadataa (PES) + +#AC3 +ac3.msg.loading.start=ladataan AC3-kehyksi: +ac3.msg.loading.error=ac3.bin:in latausvirhe +ac3.msg.frames=ac3.bin sis舁t蒿 {0} AC3-kehyst + +#Run +run.prepare.colls=valmistellaan kokoelmaa... +run.av.offset=A/V-offset +run.session.infos=<<< istunnon tiedot >>> +run.working.coll=-> tystet蒿n kokoelmaa +run.split.output=-> Lopputuotoksen jako noin @ kokoisena +run.add.time.offset=-> lis蒿 aikaoffset audioon/tekstiin/kuviin : {0} ms (jos seuraa videon j舁keen) +run.stream.type.disabled=-> PES-virtatyyppi estetty: +run.write.output.to=-> kirjoita tiedostot sijaintiin: +run.write.output.notexists=!> Tallennushakemistoa ei ole! +run.write.output.nowriteaccess=!> Tallennushakemistoon ei voi kirjoittaa! +run.cutpoints.defined=leikkauspistett asetettu +run.start.quick.info=<<< pikatiedot >>> +run.end.quick.info=<<< lopeta pikatiedot>>> +run.no.input=ei L臧detiedostoa... +run.write.raw=kirjoita erotetut raakatiedostot : +run.coll.empty=Kokoelma on tyhj... +run.done=Tehty... {0} kokoelma(a) k舖itelty @ +run.stopped=pys艙tetty... +run.status=valmis... +run.splitpart=jaetun tuotoksen todellinen osa + +#Working +working.convertType.demux=-> purku +working.convertType.makeVDR=-> tee VDR (A/V PES) +working.convertType.makeMPG2=-> tee MPG2 +working.convertType.makePVA=-> tee PVA +working.convertType.makeTS=-> tee TS +working.convertType.packetFilter=-> yksinkertainen pakettisuodin +working.convertType.copy=-> suora kopio +working.file=-> L臧detiedosto {0}: {1} ({2} tavua) +working.file.not.found=!> Tiedostoa ei lytynyt! +working.filetype=-> Tiedostotyyppi on {0} +working.file.notsupported=!> Tiedostotyyppi ei tueta! +working.end.of.part=---> OSAN LOPPU +working.summary=Luodut mediatiedostot: +working.post.command=-> j舁kik舖ittelykomento toteutettu: +working.bytes.written=kirjoitetut tavut... +working.log.error2=lokivirhe 2: +working.output.std=[varattu] samaan paikkaan kuin kokoelman 1. tiedosto + +#MPVD +mpvdecoder.tip1=klikkaa oikeata n舊pyl蒿 tallentaaksesi kuvan bmp-muodossa + +#FilePanel +FilePanel.DragDrop.Tip=Ved ja pudota tiedosto(t) t臧舅, tai k艙t valikkoa +FilePanel.FileUp.Tip=siirr ylemm臾si kokoelmaluettelossa +FilePanel.FileDown.Tip=siirr alemmaksi kokoelmaluettelossa +FilePanel.FileRemove.Tip=poista kokoelmaluettelosta +FilePanel.CollectionNumber=Kokoelma # +FilePanel.CollectionNumber.Tip=valitse tiedostokokoelma +FilePanel.addCollection.Tip=Lis蒿 uusi tiedostokokoelma +FilePanel.removeCollection.Tip=poista tiedostokokoelma +FilePanel.openAutoloadPanel.Tip=avaa automaattinen tiedostonvalintaikkuna +FilePanel.OutputDirectory=Tallennuskansio: +FilePanel.OutputDirectory.Tip=Kokoelman tallennuskansio +FilePanel.recentOutputDirectories=Edelliset tallennuskansiot +FilePanel.addRecentOutputDirectory.Tip=Lis蒿 kansio edellisiin tallennuslistoihin +FilePanel.removeRecentOutputDirectory.Tip=poista kansio edellisist tallennuslistoista +FilePanel.Textfield.Tip=Kokoelmatiedot +FilePanel.FileAdd.Tip=lis蒿 tiedosto(t) kokoelmaluetteloon + +#ExternTab +ExternPanel.Title1=ULKOISET OHJELMAT/JトLKIKトSITTELY +ExternPanel.Title1.Tip=Valitse ajettava ohjelma +ExternPanel.Applications=Ulkoinen ohjelma... +ExternPanel.createVdrIndex=luo index.vdr kohteeseen: +ExternPanel.createVdrIndex.Tip=luodun vdr-tiedostosegmentin nimi vaihdetaan 0xx.vdr:ksi +ExternPanel.createCellTimes=Luo cellTimes.txt -leikkauspistetiedosto +ExternPanel.createCellTimes.Tip=demuxaa, lis蒿 kehysnumerotiedon vaihdettaessa tiedostoa (uusi kappale) +ExternPanel.exportPts=tallenna automaattisesti leikkauspisteen PTS-arvo +ExternPanel.exportPts.Tip=vie ja k艙nnist {PTS-leike} toisessa ProjectX-tyss +ExternPanel.save1stFrameOfGop=tallenna automaattisesti GOP:in ensimm臺nen I-kehys .bmp-muodossa +ExternPanel.save1stFrameOfGop.Tip=vain demuxaus... +ExternPanel.createChapters=tallenna aikakoodi automaattisesti muunnoksissa +ExternPanel.createChapters.Tip=vie ylim蒿r臺sen aikakoodin videomuodon muuttuessa +ExternPanel.renameAudio=nime kaikki MPEG-audiot .mpa-muotoon +ExternPanel.renameAudio.Tip=MPEG-versionumeron k艙tn asemesta -> .mp1, .mp2, .mp3 +ExternPanel.renameVideo=nime kaikki MPEG-videot *.mpv +ExternPanel.renameVideo.Tip=MPEG-tyypin k艙tn asemesta -> .m1v, .m2v +ExternPanel.Title2=Projektitiedoston asetukset +ExternPanel.Title2.Tip=muunna vain jos tied舩, mit teet +ExternPanel.createM2sIndex=Mpeg2-leikkeen idd-versio: V2/A3 +ExternPanel.createM2sIndex.Tip=luo .idd-projektitiedosto demuxattaessa: +ExternPanel.createD2vIndex=luo .d2v-projektitiedosto demuxattaessa: +ExternPanel.createD2vIndex.Tip=jos kaikki osat muunnetaan erikseen +ExternPanel.createDgiIndex=luo .dgi.d2v-projektitiedosto demuxattaessa: +ExternPanel.createDgiIndex.Tip=jos kaikki osat muunnetaan erikseen +ExternPanel.splitProjectFile=jaa video automaattisesti, muttta pysy projektissa +ExternPanel.splitProjectFile.Tip=jaa koodattu video automaattisesti m蒿ritellyn kokoisena, ei audiota; parempi suurille tiedostoille FAT-tiedostoj舐jestelmiss +ExternPanel.ProjectFileSplitSize=jaa video vain MB: kokoisena +ExternPanel.ProjectFileSplitSize.Tip= +ExternPanel.appendExtension=vaihda tiedostomuotoon (PES) +ExternPanel.appendExtension.Tip=s臺lytt蒿 toissijaisten PES-virtojen tiedostonimet m蒿rite mukaanlukien +ExternPanel.createInfoLabel=luo Cuttermaran Info demuxatessa: +ExternPanel.createInfoIndex=luo Cuttermaran info Versio 1.61ff +ExternPanel.createInfoIndex.Tip=luo *.info Cuttermaran-indeksitiedosto demuxatessa: +ExternPanel.appendPidToFileName=Kytke Pid/Id tiedostonimeen +ExternPanel.appendPidToFileName.Tip=Kytke Pid/Id tiedostonimeen + + +FtpPanel.killFtpClient=Vaihda k艙tt臻 ilman uloskirjoittautumista +FtpPanel.killFtpClient.Tip=トl k艙t, ellei FTP-palvelin hyv臾sy uloskirjautumista, ennenkuin kaikki data on k舖itelty! +FtpPanel.useFtpServerResume=Palvelin hyv臾syy toiminnon 'yrit uudelleen' +FtpPanel.useFtpServerResume.Tip= + +#SpecialTab +SpecialPanel.Title1=Erikoispaneli 1 +SpecialPanel.PtsShift=PTS-aikasiirto (tuntia): +SpecialPanel.PtsShift.Tip=kokeile 'auto' tai 1..13', jos l臧detiedosto AV-PTS eiv舩 matsaa ja/tai audion demuxaus ei onnistu (std=0) +SpecialPanel.PVA.FileOverlap=PVA: tiedoston lukuylivuotovirhe +SpecialPanel.PVA.FileOverlap.Tip=舁 k艙t, jos useita PVA:ita on tallennettu ilman ylivuotovirhett +SpecialPanel.PVA.Audio=PVA: pysy audiovirta-asetuksissa +SpecialPanel.PVA.Audio.Tip=K艙t audiohavaintovirheiden v舁tt舂iseksi: er臺ss tallennuksissa on puuttuvia lippuja(MD) +SpecialPanel.VOB.resetPts=VOB: Huomioi erot solun aikajanassa +SpecialPanel.VOB.resetPts.Tip=K艙t, jos PTS:n VobId:t/solut eiv舩 ole jatkuvia . +SpecialPanel.TS=vain TS-riippuvainen: +SpecialPanel.TS.ignoreScrambled=TS: トl huomioi sekoitettuja paketteja +SpecialPanel.TS.ignoreScrambled.Tip=舁 k艙t, jos paketit eiv舩 mielest舖i ole sekoitettuja, vaikka ne onkin merkitty sellaisiksi +SpecialPanel.TS.blindSearch=TS: laajennettu haku paketin avauksen j舁keen +SpecialPanel.TS.blindSearch.Tip=salli, jos PID-etsint lopettaa haun tuntemattomassa tiedostossa +SpecialPanel.TS.joinPackets=TS: liit tiedoston segmentit (Dreamboxョ:ista) +SpecialPanel.TS.joinPackets.Tip=K艙t liitt蒿ksesi ep舩艙delliset TS-paketit useiden tiedostosegmenttien rajalla +SpecialPanel.TS.HumaxAdaption=TS: Handanョ tiedostomuodon muunnos +SpecialPanel.TS.HumaxAdaption.Tip=salli TS:蒿n Handanョ HD-tiedostomuoto +SpecialPanel.TS.FinepassAdaption=TS: Finepassョ tiedostomuodon sovitus +SpecialPanel.TS.FinepassAdaption.Tip=Salli TS:n Finepassョ HD-tiedostomuoto +SpecialPanel.TS.JepssenAdaption=TS: Jepssenョ tiedostomuodon sovitus +SpecialPanel.TS.JepssenAdaption.Tip=K艙t TS:n Jepssenョ HD-tiedostomuodon lukemiseksi +SpecialPanel.TS.KoscomAdaption=TS: Koscomョ tiedostomuodon sovitus +SpecialPanel.TS.KoscomAdaption.Tip=K艙t TS:n Koscomョ HD-tiedostomuodon lukemiseksi +SpecialPanel.TS.ArionAdaption=TS: Arionョ tiedostomuodon sovitus +SpecialPanel.TS.ArionAdaption.Tip=K艙t TS:n erikoisen Arionョ .AVR-tiedostomuodon lukemiseksi (ei v舁tt舂舩n. Yleens toimii ilmankin). +SpecialPanel.TS.generatePmt=TS: muodosta virtariippuvainen PMT +SpecialPanel.TS.generatePmt.Tip=舁 k艙t luodaksesi riippumattoman esim蒿ritellyn PMT:n, joka sopii useimpiin virtoihin +SpecialPanel.TS.generateTtx=TS: muodosta TekstiTV-info (testi) +SpecialPanel.TS.generateTtx.Tip=lis蒿 TekstiTV-virta (PID 0x9F) sivun 150 tietotilanteesta (vain auto @ PMT:ss) +SpecialPanel.TS.HeaderMode0=(0) ei TS:n lis與tsikkoa +SpecialPanel.TS.HeaderMode1=(1) aseta TS:蒿n Topfieldョ 4000-otsikko +SpecialPanel.TS.HeaderMode2=(2) aseta TS:蒿n Topfieldョ 5000-otsikko +SpecialPanel.TS.HeaderMode3=(3) aseta TS:蒿n Topfieldョ 5x00-otsikko (uusi) +SpecialPanel.TS.HeaderMode4=(4) aseta TS:蒿n Topfieldョ 5x00(C)-otsikko (uusi) +SpecialPanel.TS.HeaderMode5=(5) aseta TS:蒿n Ariondョ-otsikko +SpecialPanel.TS.setMainAudioAc3=TFョ-p蒿: aseta AC3 p蒿audiomuodoksi +SpecialPanel.TS.setMainAudioAc3.Tip=TFョ-Otsikko: aseta AC3 aktiiviseksi 蒿nil臧teeksi +SpecialPanel.Title2=Erikoispaneli 2 +SpecialPanel.Input.getEnclosedPackets=k艙t vain liitetyt PES/TS-paketit +SpecialPanel.Input.getEnclosedPackets.Tip=poista k艙tst, jos yht蒿n pakettia ei lytynyt (jos seuraava MPEG-alkukoodi puuttuu paketin lopusta, eli kuvista) +SpecialPanel.Input.concatenateForeignRecords=yhdist eri tallennukset +SpecialPanel.Input.concatenateForeignRecords.Tip=K艙t, jos haluat yhdist蒿 samaa tyyppi olevia PVA-, MPEG- tai VDR-tiedostoja eri tallennuksista +SpecialPanel.Input.useReadOverhead=leikkauspisteiden esi/j舁kilataus +SpecialPanel.Input.useReadOverhead.Tip=leikkauspisteiden esi/j舁kilataus, est蒿 audio gaps ? +SpecialPanel.Audio.ignoreErrors=K艙t vain ensimm臺st audio-PTS:蒿 synkronointiin +SpecialPanel.Audio.ignoreErrors.Tip=laskettu audioaika synkronoinnin j舁keen AV-alkukohdasta, ohittaa virheet +SpecialPanel.Audio.limitPts=rajoittaa audio-PTS:n synkronointikohtia +SpecialPanel.Audio.limitPts.Tip=parempi kuin vain audio-PTS (kuten ylh蒿ll), audio pidet蒿n synkassa +SpecialPanel.Audio.allowFormatChanges=Salli erilaiset audiovirtamuodot +SpecialPanel.Audio.allowFormatChanges.Tip=sallii mys p蒿m蒿ritteiden (kuten taso, n艙tteenottotaajuus) muutokset. +SpecialPanel.Video.ignoreErrors=ohita videovirheet ensimm臺sen PTS/GOP:n j舁keen +SpecialPanel.Video.ignoreErrors.Tip=k艙t, jos esiintyy oletettavasti vain video-PTS-virheit (kuvat n艙tt舸舩 hyvilt) +SpecialPanel.Video.trimPts=Video: muunna liukuvat PTS:t +SpecialPanel.Video.trimPts.Tip=salli, jos audiovienti pys臧tyy 臾ki PTS-liukumisen takia +SpecialPanel.Conversion=ainoastaan 'XYZ'-muunnosriippuvaiset: +SpecialPanel.Conversion.startWithVideo=varmista, ett 1. PES-alkaa videon alusta +SpecialPanel.Conversion.startWithVideo.Tip=K艙t, jos ei p蒿ll, er臺ll pelureilla on ongelmia; 舁 k艙t vain audio-muunnoksissa +SpecialPanel.Conversion.addPcrToStream=luo PTS:st PCR/SCR +SpecialPanel.Conversion.addPcrToStream.Tip=anna PCR-arvo, DVB tarvitsee enemm舅 kuin DVD, suuri bittinopeus tarvitsee enemm舅 kuin matala +SpecialPanel.Conversion.PcrCounter=suurenna TS-arvoa +SpecialPanel.Conversion.PcrCounter.Tip=suurenna TS-pakettilaskurin kokoa tyhj舁l (vain PCR); ei standardi, mutta joskus tarpeellinen + +#OutTab +ExportPanel.SplitPanel=JAKAMINEN +ExportPanel.SplitSize=JAKAMISKOKO @ noin xxx Mb +ExportPanel.SplitSize.Tip=anna kentt蒿n uusi koko; toistaiseksi koko riippuu ainoastaan videotiedoston koosta (mpv) +ExportPanel.Overlap=ylivuoto kohdassa +ExportPanel.Overlap.Tip= +ExportPanel.StreamtypePanel=KトSITELTトVトT VIRTAMUODOT +ExportPanel.StreamtypePanel.Tip=valitse virtatyypit, jotka k舖itell蒿n tai ei k舖itell, kun syttmuoto on ES) +ExportPanel.Streamtype.MpgVideo=Mpg-video +ExportPanel.Streamtype.MpgAudio=Mpg-audio +ExportPanel.Streamtype.Ac3Audio=AC3/DTS-audio +ExportPanel.Streamtype.PcmAudio=LPCM-audio +ExportPanel.Streamtype.Teletext=Teksti-TV +ExportPanel.Streamtype.Subpicture=DVB-tekstitys +ExportPanel.Streamtype.Vbi=Tavallinen VBI +ExportPanel.Streamtype.MpgVideo.Tip=Mpg Video +ExportPanel.Streamtype.MpgAudio.Tip=Mpg Audio +ExportPanel.Streamtype.Ac3Audio.Tip=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio.Tip=LPCM Audio +ExportPanel.Streamtype.Teletext.Tip=Teksti-TV +ExportPanel.Streamtype.Subpicture.Tip=tekstitysmuoto +ExportPanel.Streamtype.Vbi.Tip=Normaali VBI +ExportPanel.WriteOptions=MUUNNOKSEN JA PURUN KIRJOITUSVAIHTOEHDOT +ExportPanel.WriteOptions.Tip=vaikuttaa kaikkiin toimintoihin 'VDR/MPG/PVA/TS' audio- ja/tai video-ES:n liitt舂iseksi +ExportPanel.WriteOptions.writeVideo=KIRJOITA KAIKKI VIDEODATA +ExportPanel.WriteOptions.writeAudio=KIRJOITA KAIKKI AUDIODATA +ExportPanel.WriteOptions.writeVideo.Tip=kirjoita kaikki videodata +ExportPanel.WriteOptions.writeAudio.Tip=kirjoita kaikki audiodata +ExportPanel.WriteOptions.InfoScan=pikademuxaus/ ensimm臺sen Mb:n muunnos: +ExportPanel.additionalOffset.Title=lis臑ikaoffset +ExportPanel.additionalOffset=k艙t offsetia +ExportPanel.additionalOffset.Tip=virran alkuper臺nen alkukohta muuttuu t舁l offsetilla, vaikuttaa videovirran kaikkiin tietovirtoihin +ExportPanel.additionalOffset.Value.Tip=syt aikaoffset millisekunneissa ja paina +ExportPanel.createSubDirNumber=Tallenna kokoelma alihakemistoon +ExportPanel.createSubDirNumber.Tip=Yleinen: luo alihakemiston jokaiselle kokoelmalle (parempi tiedostolle, jossa on eri leikkauspistetiedostoja) +ExportPanel.createSubDirName=luo alihakemisto nimell: +ExportPanel.createSubDirName.Tip=global: Luo alihakemisto jokaisen kokoelman ensimm臺sen tiedoston nimen mukaan +ExportPanel.createSubDirVdr=luo kokoelman perusnimi/p臺v艙s alihakemistoksi (vdr) +ExportPanel.createSubDirVdr.Tip=luo kokoelman perusnimi/p臺v艙s alihakemistoksi (vdr-tyylinen) + + +#VideoTab +VideoPanel.Title1=videokorjaukset (demultiplex) +VideoPanel.addEndcode=lis蒿 kohtauksen loppukoodi +VideoPanel.addEndcode.Tip=k艙t MPEG-kohtauksen lopun vahvistukseen +VideoPanel.insertEndcode=vaihda loppukoodi muodon vaihtuessa +VideoPanel.insertEndcode.Tip=K艙t saadaksesi vahvistuksen +VideoPanel.addSequenceHeader=varmista, ett kaikissa GOP:eissa on kohtausotsikko +VideoPanel.addSequenceHeader.Tip=m蒿rittele uudelleen (resoluutio- & q-matriisi) kuvien uudelleenkoodaus GOP-rajalla (automaattisesti uudelleen jaettaessa) +VideoPanel.patchToProgressive=vaihda kaikki kehykset progressiivisiksi +VideoPanel.patchToProgressive.Tip=asettaa progressivibitit kentt舅umeroiden pienent舂iseksi +VideoPanel.patchToInterlaced=lomita kaikki kehykset +VideoPanel.patchToInterlaced.Tip=poista progressiivibitit +VideoPanel.toggleFieldorder=vaihda kentt臻舐jestys +VideoPanel.toggleFieldorder.Tip=Lis蒿/poista Topfield_first-bitti +VideoPanel.addSde=aseta SDE:n resoluutio +VideoPanel.addSde.Tip=muuta nykyinen tai anna uusi arvo, Tyhj kentt tarkoittaa samoja arvoja kuin kohtauksen otsikossa; Bsp: 720*576 +VideoPanel.SdeValue.Tip=muuta nykyinen tai anna uusi arvo, Tyhj kentt tarkoittaa samoja arvoja kuin kohtauksen otsikossa; Bsp: 720*576 +VideoPanel.clearCdf=muuta kuvien cd-lipputieto +VideoPanel.clearCdf.Tip=voi ratkaista 'vihre kuva'-ongelman er臺ss vanhoissa kovokoodereissa +VideoPanel.patchResolution.Tip=1. H-resoluution ehdollinen vaihto +VideoPanel.patchResolution=vaihda 1. H-resoluutio.: +VideoPanel.patchResolutionValue.0=(0) ei koskaan +VideoPanel.patchResolutionValue.1=(1) aina +VideoPanel.patchResolutionValue.2=(2) jos <> 352|720 +VideoPanel.patchResolutionValue.3=(3) jos <> arvoon 352|704|720 +VideoPanel.Title2=uusi bittinopeusarvo (demultiplex) +VideoPanel.ChangeVbvBuffer.Tip=joskus on parempi m蒿ritell maksimikoko +VideoPanel.Unchanged=舁 muuta +VideoPanel.ChangeVbvBuffer.Mode1=(1) maksimi (112*16384) +VideoPanel.ChangeVbvBuffer=vbv-puskuri: +VideoPanel.ChangeVbvDelay.Tip=suositeltu enimm臺saika +VideoPanel.ChangeVbvDelay.Mode1=(1) enimm臺saika (0xFFFF) +VideoPanel.ChangeVbvDelay=vbv-viive: +VideoPanel.ChangeAspectRatio.Tip=Vaihda, jos se on mielest舖i v舁tt舂舩nt. +VideoPanel.ChangeAspectRatio=Kuvasuhde: +VideoPanel.patchBitrateValue.0=(0) pysy alkuper臺sess +VideoPanel.patchBitrateValue.1=(1) laskettu GOP-bittim蒿r舖t +VideoPanel.patchBitrateValue.2=(2) laskettu VBV:st +VideoPanel.patchBitrateValue.3=(3) merkitse VBR:ksi (MPEG-1-video) +VideoPanel.patchBitrateValue.4=(4) kiinte 3 Mb/s +VideoPanel.patchBitrateValue.5=(5) kiinte 6 Mb/s +VideoPanel.patchBitrateValue.6=(6) kiinte 9 Mb/s +VideoPanel.patchBitrateValue.7=(7) kiinte 12 Mb/s +VideoPanel.patchBitrateValue.8=(8) kiinte 15 Mb/s +VideoPanel.patchBitrateValue=kohtausten bittinopeusarvot: +VideoPanel.patch1stBitrateValue.0=(0) pysy alkuper臺sess +VideoPanel.patch1stBitrateValue.1=(1) laskettu keskinopeus (nimellinen) +VideoPanel.patch1stBitrateValue.2=(2) laskettu maksiminopeus <= 9.0 Mb/s (DVD) +VideoPanel.patch1stBitrateValue.3=(3) laskettu maksiminopeus (esin . HDTV) +VideoPanel.patch1stBitrateValue.4=(4) merkitty VBR:ksi (MPEG-1-video) +VideoPanel.patch1stBitrateValue=ensimm臺sen kohtauksen bittinopeusarvo: + +#AudioTab +AudioPanel.Title1=AUDIOMUUNNOKSET (demultiplex) +AudioPanel.loslessMpaConversion.Tip1=suora h舸itn muunnos (rajoitettu muotoon +AudioPanel.loslessMpaConversion.Tip2=MPEG-1, taso 2, 48 kHz, 56..384 kb/s): +AudioPanel.loslessMpaConversion.Tip=jos muunnos on valittu, bittinopeus ja kanavamuoto koskee koko tiedostoa +AudioPanel.loslessMpaConversionMode0=(0) ei muunnosta +AudioPanel.loslessMpaConversionMode1=(1)kaksoismono 3D-stereoksi (V+H = alkuper臺nen) +AudioPanel.loslessMpaConversionMode2=(2) kaksoismono stereoksi (V+H = alkuper臺nen) +AudioPanel.loslessMpaConversionMode3=(3) kaksoismono kvasistereoksi (V+H = alkuper臺nen) +AudioPanel.loslessMpaConversionMode4=(4) jaa 2-kanavainen 2 monoon (1=V,2=H) +AudioPanel.losslessMpaConversionMode5=(5) jaa 2-kanavainen 2 kaksoismonoon (1 = LL, 2 = RR) +AudioPanel.losslessMpaConversionMode6=(6) jaa tupla 2 kaksoismonoiksi (1 = LR/LL, 2 = LR/RR) +AudioPanel.decodeMpgAudio=koodaa MPEG-tasot 1 ja 2 PCM:ksi +AudioPanel.decodeMpgAudio.Tip=MPEG-audiodekooderi (ei tasolle 3), vakiomuunnos PCM-stereoksi +AudioPanel.decodeMpgAudio.resampleAudioMode0=(0) ei uudelleensamplausta +AudioPanel.decodeMpgAudio.resampleAudioMode1=(1) lineaarinen uudelleensamplaus 48 kHz > 32 kHz +AudioPanel.decodeMpgAudio.resampleAudioMode2=(2) lineaarinen uudelleensamplaus 48 kHz > 44.1 kHz +AudioPanel.decodeMpgAudio.Normalize=normalisoi arvoon %: +AudioPanel.decodeMpgAudio.Normalize.Tip=normalisoi v+H samanlaisiksi, arvot v舁ill 0..100 ovat mahdollisia. Vakio on 98%; pit蒿 mahdollisesti k艙nnist蒿 uudelleen +AudioPanel.NormalizeValue.Tip=normalisoi v+H samanlaisiksi, arvot v舁ill 0..100 ovat mahdollisia. Vakio on 98%; pit蒿 mahdollisesti k艙nnist蒿 uudelleen +AudioPanel.decodeMpgAudio.Downmix=Sekoita yhteen kanavaan +AudioPanel.decodeMpgAudio.Downmix.Tip=Sekoita stereo/2-kanaval臧de yhteen kanavaan +AudioPanel.decodeMpgAudio.changeByteorder=tallenna Motorola-tavuj舐jestykseen (big-endian) +AudioPanel.decodeMpgAudio.changeByteorder.Tip=Tarkoittaa MSB ensiksi, ei Intel-tyyppi +AudioPanel.decodeMpgAudio.addRiffHeader=lis蒿 RIFF(RIFX)-otsikko muotoon PCM (.wav) +AudioPanel.decodeMpgAudio.addRiffHeader.Tip=PC-standardi +AudioPanel.decodeMpgAudio.addAiffHeader=lis蒿 AIFF-otsikko PCM:hin (.aif) +AudioPanel.decodeMpgAudio.addAiffHeader.Tip=Apple-standardi +AudioPanel.Title2=audiomuokkaukset (demultiplex) +AudioPanel.validateCRC=tarkista AC-3/MPEG-audiotasojen 1 ja 2 CRC +AudioPanel.validateCRC.Tip=jos asetettu, alin mahdollinen virhetaso taataan tehon kustannuksella +AudioPanel.clearCRC=poista CRC MPEG-audiotasoista 1 ja 2 +AudioPanel.clearCRC.Tip=jos asetettu, saattaa aiheuttaa er臺t audiovirhe-ilmoituksia +AudioPanel.fillGapsWithLastFrame=t艙tt蒿 gapit edellisill kehyksill +AudioPanel.fillGapsWithLastFrame.Tip=hiljaisten kehysten asettamisen asemesta; AC3 standardin mukaan jos ac3.bin ei sis舁l sopivaa kehyst AC3:lle +AudioPanel.addFrames=lis蒿 kehykset +AudioPanel.addFrames.Tip=jos audio loppuu ennen kuin video, tehd蒿n samanpituisiksi +AudioPanel.patch1stAc3Header=muuta 1. AC3-p蒿 3.2-kanavaiseksi +AudioPanel.patch1stAc3Header.Tip=er蒿t AC3-purkuohjelmat tarvitsevat kaikkien kanavien purkuun +AudioPanel.replaceAc3withSilence=korvaa ei-3.2-AC3 3.2-lfe-hiljaisuudella +AudioPanel.replaceAc3withSilence.Tip=K艙t korvataksesi ei-halutut 2.0-kehykset 3.2-hiljaisuudella (48 kHz, 448 kbps, ac3.bin tarvitaan) +AudioPanel.addRiffToAc3=lis蒿 RIFF WAVE-otsikko AC3-audioon +AudioPanel.addRiffToAc3.Tip=lis蒿 wav-tiedosto AC3-aaltomuotoon (tagi 0x2000) otsikossa +AudioPanel.addRiffToMpgAudioL12=MPA: lis蒿 RIFF WAVE-otsikko taso 1,2 +AudioPanel.addRiffToMpgAudioL12.Tip=L臧etys-aaltomuoto (tagi 0x0050), parempi MPEG-tasoille 1 & 2 +AudioPanel.addRiffToMpgAudioL3=MPA: lis蒿 RIFF WAVE-otsikko taso 3 +AudioPanel.addRiffToMpgAudioL3.Tip=tavallisempi ACM-muoto (tagi 0x0055), parempi MPEG tasolle 3 +AudioPanel.pitchAudio=ohita joka x:s audiokehys: +AudioPanel.pitchAudio.Tip=pakkaa/rajoita audio (vain ES) +AudioPanel.allowSpaces=salli v舁i kehysten v舁iin +AudioPanel.allowSpaces.Tip=tunnista merkitsev舩 audiokehykset todentamatta kehyspituutta (jotka mahdollisesti antavat v舐i kokoja) +AudioPanel.createDDWave=AC-3/DTS: tuloste DD/DTS-Wave-muodossa +AudioPanel.createDDWave.Tip=tuloste Ac3/DTS DD/DTS-Wave-muodossa, kiinte otsikko: PCM 44.1kHz,16bit,2-ch +AudioPanel.fadeInOut=h臺vytys sis蒿n ja ulos +AudioPanel.fadeInOut.Tip=h臺vytt蒿 蒿nen sis蒿n ja ulos k艙tt臚n avainta 'AudioPanel.fadeInOutMillis' ; vakio on 2000 ms, 1...5000 ms + +#SubtitleTab +SubtitlePanel.Title=DVB-tekstiTV, DVB-TEKSTITYS +SubtitlePanel.Title.Teletext=DVB tekstiTV (demultiplex) +SubtitlePanel.decodeMegaradio=TESTI: vie MegaRadioョ MP3-virta +SubtitlePanel.decodeMegaradio.Tip=Aiemmin l臧etetty sat. Hotbird 13ーE, 11.054 GHz Hor., SR 27500, FEC 5/6, TTX-PID 553 +SubtitlePanel.decodeHiddenRows=Pura TekstiTV:n k舩ketyt rivit(id 0xFF) +SubtitlePanel.decodeHiddenRows.Tip=er蒿t sivut tai tekstitykset on k舩ketty, joten se voi auttaa tekstityst +SubtitlePanel.rebuildPTS=TEE UUDELLEEN TekstiTV-PTS ensimm臺sest MPG-audiovirrasta +SubtitlePanel.rebuildPTS.Tip=k艙t VAIN tekstiTV-virroissa, jotka sis舁tyv舩 virtaan (TS,PES...) joilla ei ole soveltuvaa aikajanaa +SubtitlePanel.keepOriginalTimecode=S臺lyt alkuper臺nen aikakoodi (PTS) itsen臺sess purussa +SubtitlePanel.keepOriginalTimecode.Tip=ilman johtovideota demuxatessa aikakoodi ei ala kohdasta 0 +SubtitlePanel.exportTextAsUnicode=Vie teksti Unicode_muodossa (UTF-16 BE) +SubtitlePanel.exportTextAsUnicode.Tip=Vie teksti Unicode (UTF-16 Big-Endian)-muodossa +SubtitlePanel.exportTextAsUTF8=Vie teksti Unicode-muodossa(UTF-8) +SubtitlePanel.exportTextAsUTF8.Tip=Vie teksti Unicode (UTF-8) -muodossa +SubtitlePanel.TtxPages=TekstiTV:n koodattavat sivut: +SubtitlePanel.TtxPages.Tip=TekstiTV:n taso 1.5-Unicode-koodisivuihin perustuva erikoismerkkien automaattinen tunnistus +SubtitlePanel.Language= kieli: +SubtitlePanel.Language.Tip=kytke kielipariin, jos l臧ett臻 ei tue automaattista vaihtoa +SubtitlePanel.Format.Tip=valitse haluamasi vientimuoto +SubtitlePanel.Format.Free=teksti +SubtitlePanel.Format=Tekstityksen vientimuodot: +SubtitlePanel.Colormodel.Mode0=(0) 4 v舐i +SubtitlePanel.Colormodel.Mode1=(1) 16 v舐i +SubtitlePanel.Colormodel.Mode2=(2) 256 v舐i +SubtitlePanel.PageId.Value.Tip=tyhj kentt = k艙t tulevaa, muuten toivotun sivunumeron avainta (riippuu l臧etyksest) +SubtitlePanel.Colormodel=simuloi DVB-tekstityksen IRD-v舐imallia: +SubtitlePanel.Colormodel.Tip=vaikuttaa tekstityksen ulkon臾n. Parhaat m蒿ritykset riippuvat siit, mit tahdot +SubtitlePanel.PageId=Kytke sivuun: +SubtitlePanel.showPreview=N艙t ulkoinen tekstitysn艙tt +SubtitlePanel.Format.SUP.Values.Tip=(et臺syys vasemmasta alakulmasta) fonttikoko, tausta-alfa; Y-sijainti; X-sijainti; X-leveys; H(ei k艙tss); V; Y-sijainti-2; rivien enimmism蒿r +SubtitlePanel.SupValues=Arvot: +SubtitlePanel.Font.LoadError=Virhe ladattaessa fonttia +SubtitlePanel.useTextOutline=Piirr musta ulkoreuna (vain SUP) +SubtitlePanel.useTextOutline.Tip=Piirt蒿 tekstitykseen 3 pikselin kehyksen max. 2 'kaiutinv舐i' kehyksess, muuten k艙tet蒿n Hg mustaa +SubtitlePanel.Font=Fontti: +SubtitlePanel.Font.Tip=SUP-tekstityksen fontti +SubtitlePanel.specialTermination=Erityisen TekstiTV:n sivun esto (testi) +SubtitlePanel.specialTermination.Tip=pakottaa aikakatkon avoimille sivuille +SubtitlePanel.ChangeDisplay=Vaihda n艙ttmuoto: +SubtitlePanel.ChangeDisplay.Tip=vain tuotaessa .sup-tiedostoa (DVD:lt tai kuten ES:ss) +SubtitlePanel.MovePosition=Muuta kuvan sijainti: +SubtitlePanel.MovePosition.Tip=J舩 tyhj臾si tai m蒿rittele X ja Y (kuten: -20,-40 (vasen yl臾ulma)) +SubtitlePanel.keepColourTable=S臺lyt v舐itaulukon m蒿ritykset +SubtitlePanel.keepColourTable.Tip=s臺lyt/laajenna v舐itaulukon m蒿ritykset koko sessioon(kaikissa kokoelmissa) +SubtitlePanel.exportAsVobSub=Lis舸ienti VobSub-muodossa (idx+sub) +SubtitlePanel.exportAsVobSub.Tip=Vie mys VobSub-muodossa (idx+sub), SUP-viennin oltava valittuna +SubtitlePanel.TtxExportBoxedOnly=vain kehystetyn tekstin/tekstityksen vienti +SubtitlePanel.TtxExportBoxedOnly.Tip=Kehyksen ulkopuolista n臾ym舩nt teksti ei k舖itell. (esim. virheellisill sivuilla) +SubtitlePanel.useTextAlignment=Tekstin vaakasuuntainen kohdistus +SubtitlePanel.useTextAlignment.Tip=vaakasuuntainen tekstin kohdistus riippuu valitusta fontista (non- or proportional) + +#Autoload +autoload.title=M蒿riteltyjen l臧dehakemistojen lista +autoload.dir.remove.tip=poista hakemisto listalta +autoload.dir.add.tip=lis蒿 hakemisto listalle +autoload.dir.refresh.tip=p臺vit luettelo +autoload.ftp.add.tip=lis蒿 ftp-palvelinhakemisto listalle +autoload.add.coll.tip=luo uusi kokoelma jokaiselle tiedostolle ja lis蒿 se +autoload.add.file.tip=lis蒿 tiedosto(t) kokoelmaan +autoload.rename.tip=vasen tuplaklikkaus tai paina tiedosto(je)n lis蒿miseksi kokoelmaan, klikkaa oikealla uudelleennimemiseksi +autoload.dialog.rename=Nime uudelleen +autoload.dialog.fileexists=Tiedosto on jo olemassa. Korvataanko? +autoload.close=sulkee ikkunan + +#splitreset +splitreset.novideo=! -> ei videotiedosto-PTS:蒿, jakaminen ei onnistu + +#checkpts +checkpts.1st.latter=!> ensimm臺nen video-PTS alkaa myhemmin kuin virran viimeinen PTS -- synkronointiongelma +checkpts.last.ends=!> viimeinen video-PTS p蒿ttyy ennen virran alku-PTS:蒿 -- synkronointi ei onnistu + +#parseSecondaryPES +parseSecondaryPES.continue=-> jatka k艙tt臚n purettua raakatietoa +parseSecondaryPES.demux.pes=demuxaan PES-tiedostoa +parseSecondaryPES.missing.startcode=!> alkukoodi puuttuu kohdassa @ +parseSecondaryPES.found.startcode=!> alkukoodi lydettu kohdasta @ +parseSecondaryPES.packet.length=-> ! paketin pituus on 0 kohdassa @ +parseSecondaryPES.miss.next.startcode=!> seuraava alkukoodi puuttuu kohdassa @ {0} {1:sta) (PES-ID 0x{2}), l臧et舅 paketin... +parseSecondaryPES.packs=paketit: {0} {1}% {2} +parseSecondaryPES.found.pesid=-> lydetty PES-ID 0x{0} {1} @ {2} +parseSecondaryPES.ac3.audio=--> AC-3/DTS-audio +parseSecondaryPES.teletext=--> Teksti-TV +parseSecondaryPES.mpeg.audio=--> MPEG-audio +parseSecondaryPES.lpcm.audio=--> LPCM-audio +parseSecondaryPES.subpic=--> tekstitys +parseSecondaryPES.eof.error=PES-k蒿nns: Virhe tiedoston lopussa: +parseSecondaryPES.io.error=PES-k蒿nns: Tiedosto-I/O-virhe: +parseSecondaryPES.msg.noexport=--> Virtaa ei l臧etetty + +#ID type +idtype.mpeg.video.ignored=(MPEG-video) -> ei huomioitu +idtype.mpeg.audio=(MPEG-audio) +idtype.private.stream=(yksityisvirta 1) +idtype.mpeg.video=(MPEG-video) +idtype.mapped.to= kytketty 0x +idtype.mapped.to.e0= kytketty 0xE0 +idtype.ignored= -> ei huomioitu +idtype.video=(video) +idtype.main.audio=(p蒿audio) +idtype.additional=(lis舩yyppi) +idtype.has.pesid= tyypiss on PES-ID 0x + +#parsePrimaryPES +parsePrimaryPES.special.pes=-> etsinn舅 erikois-PES-ID m蒿ritelty +parsePrimaryPES.continue=jatketaan tiedostolla +parsePrimaryPES.demuxing=demuxataan +parsePrimaryPES.converting=muunnetaan pes.tiedosto AV-PES-tiedostoksi +parsePrimaryPES.missing.startcode=!> aloituskoodi puuttuu kohdassa @ +parsePrimaryPES.found.startcode=!> aloituskoodi lydetty kohdassa @ +parsePrimaryPES.split.cellids=-> VOB-ID {0} solu-ID {1} @ {2} (GOP-#{3}/kehys# {4}) +parsePrimaryPES.packet.length=-> ! Paketin pituus 0 kohdassa @ +parsePrimaryPES.miss.startcode=!> seuraava aloituskoodi puuttuu (paketin koko=0) kohdassa @ {0} kohdasta {1}/inbuffert {2} +parsePrimaryPES.miss.startcode2=!> seuraava aloituskoodi puuttuu {0} kohdasta @ {1} (PES-ID 0x{2}), l臧et舅 paketin... +parsePrimaryPES.packs=pakkaan +parsePrimaryPES.dump.1st=-> dumppaa ensimm臺nen paketti tiedostoon +parsePrimaryPES.found.pesid=-> PES-ID 0x lydetty +parsePrimaryPES.pes.incoming=!> PES-ID 0x{0}, tulevassa PES-paketissa ei ole sis舁t tai v蒿r otsikkotieto @ kohdassa {1} +parsePrimaryPES.actual.written=-> kirjoitetut todelliset videokehykset: +parsePrimaryPES.switch=vaihda tiedostoon: +parsePrimaryPES.ac3=--> AC3/DTS-audio +parsePrimaryPES.teletext=--> Teksti-TV (SubID 0x +parsePrimaryPES.mpeg.audio=--> MPEG-audio (0x +parsePrimaryPES.lpcm.audio=--> LPCM-audio (sub-ID 0x +parsePrimaryPES.subpic=--> DVB-tekstitys (sub-ID 0x +parsePrimaryPES.eof.error=VDR-k蒿nns: tiedoston loppuvirhe: +parsePrimaryPES.io.error=VDR-k蒿nns: tiedosto-I/O-virhe: +parsePrimaryPES.msg.noexport=--> Virta hyl舩ty (0x +StreamParser.NoExport=virta hyl舩ty + +#parseTS +parseTS.sid=-> Palvelutunnus 0x +parseTS.pmt.refers=-> PMT 0x{0}:ssa k艙tett舸iss ovat seuraavat virrat: +parseTS.no.pmt=-> PMT:t ei lydy (pikaetsint) +parseTS.special.pids=-> hakuun m蒿ritellyt erikois-PID:it +parseTS.continue=jatketaan tiedostolla +parseTS.demuxing=puretaan +parseTS.converting=muunnetaan +parseTS.dvb.mpeg= DVB-MPEG-TS-tiedosto +parseTS.incomplete=!> ep舩艙dellinen TS-paketti lydetty @ +parseTS.comp.failed=!> TS paketin k舖ittely ep與nnistui:-( +parseTS.missing.sync=!> synkronitavu puuttuu kohdassa @ +parseTS.comp.ok=!> TS-paketin k舖ittely OK :-) +parseTS.found.sync=!> synkronitavu lydetty kohdassa @ +parseTS.bit.error=!> PID 0x{0} -> TS-bittivirhe paketissa {1} asemassa. {2}, l臧et舅... +parseTS.stuffing=-> PID 0x1FFF => t艙dennyspaketti -> ohitetaan +parseTS.scrambled=-> PID 0x{0} => merkitty sekoitetuksi tiedoksi, paketti {1} kohdassa {2} -> ohitetaan +parseTS.clear=-> PID 0x{0} => haen dataa, paketti {1} @ {2} +parseTS.outof.sequence=!> PID 0x{0} -> paketti {1} kohdassa {2} kohtauksesta ({3}/{4}) (erotetaan...) +parseTS.priv.stream2.ignored=-> PID 0x{0}(yksityisvirta 2) -> ohitetaan +parseTS.scrambled.notignored=-> PID 0x{0} => merkitty sekoitetuksi tiedostoksi (ei ohiteta){1} +parseTS.ignored= -> ohitettu +parseTS.pid.has.pes=ok> PID 0x{0} PES-ID 0x{1} {2} +parseTS.lackof.pes=!> PID 0x{0} PES-data puuttuu -> paketti ohitettu +parseTS.actual.vframes=-> todelliset kirjoitetut videokehykset: +parseTS.tryto.complete=!> yritet蒿n t艙dent蒿 ep舩艙dellinen TS-paketti... +parseTS.packs=tiivistet蒿n: {0} {1}% {2} +parseTS.ac3.audio=--> AC3/DTS-audio PID 0x +parseTS.teletext.onpid=--> TekstiTV PID 0x +parseTS.mpeg.audio=--> MPEG-audio (0x{0}) PID 0x{1} +parseTS.subpicture=--> DVB-tekstitys (sub-ID 0x +parseTS.eof.error=raakatiedostomuoto: tiedoston loppuvirhe: +parseTS.io.error=raakatiedostomuoto: tiedosto-I/O-virhe: +parseTS.switch.to=vaihdetaan tiedostoon: +parseTS.msg.noexport=--> Virta (0x{0}) kohdassa PID 0x{1} hyl舩ty + +#nextfile +nextfile.io.error=seuraava tiedosto: tiedosto-I/O-virhe: +nextfile.shift.auto=-> siirr automaattisesti alkuper臺s-PTS takaisin {0} tuntia +nextfile.shift.manual=-> siirr manuaalisesti alkuper臺s-TS takaisin {0} tuntia +nextfile.next.file.start=-> seuraava tiedosto: aloita PTS:t n:o {0}/viimeinen todellinen PTS on {1} +nextfile.next.file.start.adaption=-> k艙t uutta PTS-Offsetia: {0} jatkossa + +#overlapPVA +overlappva.io.error=ylivuotolukuvirhe: + +#parsePVA +parsePVA.special.pids=-> m蒿ritelty etsinn舅 erikois-PIDit +parsePVA.streamtype.ac3= (AC3/DTS) +parsePVA.streamtype.ttx= (Teksti-TV) +parsePVA.streamtype.mpeg.audio= (MPEG-audio) +parsePVA.streamtype.mpeg.video= (MPEG-video) +parsePVA.continue=jatka tiedostolla: +parsePVA.demuxing=puretaan +parsePVA.converting=muunnetaan +parsePVA.pvafile= PVA-tiedosto +parsePVA.missing.sync=!> synkronisana puuttuu kohdassa @ +parsePVA.found.sync=!> synkronisana lydetty kohdasta @ +parsePVA.file.overlap=tiedoston ylivuoto kohdassa @: +parsePVA.packs=pakkaan +parsePVA.found.id=-> lydetty ID 0x +parsePVA.outof.sequence=!> ID 0x{0} -> paketti{1} kohdassa {2} ei kohtauksessa({3}/{4}) (erotan...) +parsePVA.id.0x=-> ID 0x +parsePVA.actual.vframes=-> todelliset videokehykset: +parsePVA.ac3.onid=--> AC3/DTS-audio ID 0x +parsePVA.teletext.onid=--> TekstiTV ID 0x +parsePVA.mpeg.audio.onid=--> MPEG-audio kohdassa ID 0x +parsePVA.eof.error=PVA: tiedoston loppuvirhe: +parsePVA.io.error=PVA: tiedosto-I/O-virhe: +parsePVA.msg.noexport=--> Virtaa ei l臧etetty kohdassa ID 0x + +#Audioprocess +audio.progress=Audiotiedoston tarkistus ja sunkronointi +audio.status.pre-insert=sis舁lytet蒿n ennen... +audio.status.insert=sis舁lytet蒿n... +audio.status.write=kirjoitetaan... +audio.status.pause=pys艙tetty... +audio.status.add=lis舩蒿n... +audio.status.finish=Tehty... +audio.convert=-> muunnetaan MPA: +audio.decode=-> dekoodataan MPA: +audio.restart=!> Aletaan uudelleen audion k舖ittely. Syttkehys muuttunut @ kehyksess N:o +audio.error.io=tiedosto-I/O-virhe: +audio.msg.pts.discard=!> {0} Virran ohitetut PTS:t +audio.msg.pts.firstonly=-> K艙t vain ensimm臺st audio-PTS:蒿 (alkuajan synkronointiin) +audio.msg.pts.start_end=Audio-PTS: ensimm臺nen paketti {0}, viimeinen paketti +audio.msg.pts.mismatch=-> !! video- & audio-PTS eiv舩 sovi yhteen +audio.msg.pts.wo_frame=!> PTS:ss ei kehyksi +audio.msg.adjust.at.videopts=-> sovitetaan audio videon aikajanaan +audio.msg.adjust.at.ownpts=-> sovitetaan audio omaan aikajanaansa +audio.msg.addriff.acm=-> lis蒿 RIFF WAVE-otsikko ACM-muotoiseen MPEG-audioon +audio.msg.addriff.bwf=-> lis蒿 RIFF WAVE-otsikko BWF-muotoiseen MPEG-audioon +audio.msg.addriff.ac3=-> lis蒿 RIFF WAVE-otsikko AC3-audioon +audio.msg.syncword.lost=!> synkronisana puuttuu kohdassa @ {0}, @ +audio.msg.syncword.found=!> synkronisana lytyi kohdassa @ +audio.msg.frame.discard=-> ohitetaan kehys N:o # +audio.msg.crc.error=!> CRC{0}-tarkastus ei onnistunut +audio.msg.source=-> CRC audio: {0} @ +audio.msg.source.max=-> crc audio: n艙tt lopetetaan, enemm舅 kuin 100 audio-muunnosta hidastaa liikaa +audio.msg.summary.skip=-> ohitettiin l臧dekehykset @ +audio.msg.summary.pre-insert=-> {0} kehyst ({1} ms) sis舁lytetty ennen @ +audio.msg.summary.insert=-> {0} kehyst ({1} ms) lis舩ty kohtaan @ +audio.msg.summary.add=-> {0} kehyst ({1}ms) lis舩ty kohtaan @ +audio.msg.summary.frames=audiokehykset: kirj/esias/ohitettu/sis舁lytetty/lis舩ty {0} @ k舖itelty... +audio.msg.summary.jstereo=-> {0} stereo/yhdistelm舖tereomuunnosta havaittu... +audio.msg.audio=Audio +audio.msg.newfile.left=(vasen): +audio.msg.newfile.right=(oikea): +audio.msg.noaudio=!> virrasta ei lydy audiota... +audio.msg.convert.disabled=!> Alkuper臺skehys ei t艙t muunnoskriteeri, teht舸 lopetettu.. (KahysN:o {0}) +audio.msg.convert.error=!> L臧dekehys aiheuttaa muunnosvirheen (Virhe {0}), (KehysN:o {1}) + +#Videoprocess +video.msg.pts.start_end=Video-PTS: alku GOP 1 {0}, loppu viimeinen GOP +video.msg.summary=-> Video: fr/ ct/ 1p/ cg/ og/ dg -> +video.progress=videovirtatiedoston analysointi +video.msg.skip.sec=-> ohitetaan GOP # {0} @ seuraavan kohtauksen loppukoodi +video.error.io=!> virhe puhtaassa videotulossa +video.msg.error.lackofdata=!> GOP# {0} ei dataa, ohitetaan... +video.msg.error.nopts.use_goptc=!> GOP:ssa n:o {0} ei ole PTS:aa , k艙tet蒿n GOP TC:蒿 synkronointiin +video.msg.error.nopts.use_lastpts=!> GOP:issa N:o {0} ei ole PTS:aa, k艙tet蒿n viimeist PTS synkronointiin +video.msg.basics=-> perusvideo: +video.msg.newformat=GOP# {0}, Lydetty uusi formaatti seuraavassa johtavassa kappaleotsikossa: +video.msg.error.pesext_in_es=!> GOP n:o {0}, PES-otsikko ja lis艙s lydetty ES:ss, korvattu nollilla... (GOP-offset {1}) +video.msg.error.pes_in_es=!> GOP N:o {0}, PES-otsikko lydetty ES:s, korvattu nollilla... (GOP-offset {1}) +video.msg.error.frame.wrong=!> v蒿r kehystyyppi{0} +video.msg.export.start=-> Aloitetaan videodatan l臧etys GOP:ista N:o @ +video.msg.pts.diff=!> havaittu PTS-ero {0} ({1}) viimeksi l臧etettyyn GOP:iin +video.msg.error.brokenlink=(katkennut linkki kirjattu) +video.msg.frame.drop=!> pudotetaan k艙tt舂舩tm舩 B-kehykset @ GOP:issa {0} / uusi aikakoodi +video.msg.error.frame.not=!> GOP:ssa {0} ei ole kehyksi +video.msg.error.frame.not.i=!> GOP n:o {0} ei ala I-kehyksell t-ref:ss '0' +video.msg.error.pts.early=!>GOP n:o {0}:n PTS alkaa ennen edellisen GOP:in loppua... (l臧et舅. {1}) +video.msg.error.gop.drop=!> Pudotan GOP:in n:o {0} originaalin PTS:n kohdassa @ {1} ({2}) +video.msg.error.gop.diff=!> Kuvat l臧etetty/laskettu {0}, GOP-PTS-ero {1} ms, uusi aikakoodi +video.msg.error.gop.dump=-> dumppaa GOP tiedostoon: +video.msg.io=ei +video.msg.io=lomitettu +video.msg.io=progressiivinen +video.msg.io=lomitettu & progressiivinen +video.msg.length=-> Videon pituus: {0} kehyst @ +video.msg.gop.summary=-> GOP-yhteenveto: min. {0}, max. {1} kentt蒿; sis舁t蒿 {2} kehyst +video.error.pts.same=-> lydetty {0} GOP:ia samalla PTS-arvolla eri kuville! +video.summary=.Video {0}:\t{1} kehykset\t{2}\t\t +video.msg.bitrate.avg=->keskim. nimellinen bittinopeus {0}bps (min/max: {1}) +video.msg.bitrate.avgnom=->keskim. nimellinen bittinopeus {0}bps (min/max: {1}) +video.msg.bitrate.vbr=-> Aseta ensimm臺sen kappaleotsikon bittinopeus VBR:蒿n +video.msg.bitrate.val=-> Aseta ensimm臺sen kappaleotsikon bittinopeus arvoon {0} bps +video.msg.resolution=-> Muuta ensimm臺sen kappaleotsikon resoluutio {0}sta arvoon + +#Teletextprocess +teletext.msg.nooutput=!> TekstiTV:n vientimuotoa ei m蒿ritelty... +teletext.msg.output=-> vientimuoto: +teletext.msg.tmpfile=-> temp-tiedosto: {0} ({1} tavua) +teletext.msg.page=sivunumero +teletext.msg.megaradio=MegaRadio MP3-virta +teletext.progress=etsit蒿n ja koodataan +teletext.msg.search=-> etsit蒿n +teletext.status=sivu: +teletext.msg.discard=!> {0} PTS:i l臧etetty virrasta +teletext.msg.pts.start_end=TekstiTV-PTS: ensimm臺nen paketti {0}, viimeinen paketti +teletext.msg.pts.missed=!> TekstiTV-virta ei k艙t PTS:, synkronointi ei onnistu +teletext.msg.pts.mismatch=!> video- & tekstiTV-PTS eiv舩 sovi yhteen +teletext.msg.adjust.at.video=-> sovitetaan TekstiTV:n teksti videon aikajanaan +teletext.msg.adjust.at.own=-> sovitetaan TekstiTV:n teksti sen omaan aikajanaan +teletext.msg.syncword.lost=!> synkroninsana puuttuu kohdassa @ +teletext.msg.syncword.found=!> synkronsana lydetty kohdassa @ +teletext.msg.vps=-> VPS:n tila: {0} @ PTS: +teletext.msg.provider=-> toimittaja: +teletext.msg.program=-> ohjelma: +teletext.msg.summary={0} sivusta {1} kirjoitettu... +teletext.summary=TekstiTV {0}:\t{1} sivut numerosta {2}\t{3}\t +teletext.error.eof=!>Virhe TekstiTV-tekstitiedoston lopussa: +teletext.error.io!>TekstiTV-I/O-virhe: {0} / +teletext.msg.newrun->tee toinen SUP Y-offset + +#Subpictureprocess +subpicture.msg.error3=!> virhe dekoodattaessaDVD-tekstityst +subpicture.msg.error4=!> pakettitieto puuttuu +subpicture.msg.error5=!> paketin koko ei vastaa pakettidataa +subpicture.msg.error6=!> v蒿r kappaleen asemaindeksi +subpicture.msg.error7=!> v蒿r kappaleen asema +subpicture.msg.error8=!> v蒿r loppu kappaleen indeksiss +subpicture.msg.error9=!> v蒿r loppu kappaleessa +subpicture.msg.model=-> valittu DVD-tekstitysv舐i: {0} ; kytketty sivuun: +subpicture.msg.output=-> vientimuoto: +subpicture.msg.tmpfile=-> temp.-tiedosto: {0} ({1} tavua) +subpicture.progress=todennetaan ja synkronoidaan +subpicture.msg.discard=!> {0} PTS:蒿 l臧etetty virrasta +subpicture.msg.pts.mismatch=!> video- & DVB-tekstitys-PTS eiv舩 sovi yhteen +subpicture.msg.adjust.at.video=-> sovitetaan DVB-tekstitys videon aikajanaan +subpicture.msg.adjust.at.own=-> sovitetaan DVB-tekstitys sen omaan aikajanaan +subpicture.msg.syncword.lost=!> synkronisana puuttuu @ +subpicture.msg.syncword.found=!> lydetty synkronisana @ +subpicture.msg.error={0} @ {1}, pudotetaan kuva... +subpicture.msg.dvbsource=-> l臧de on DVB-tekstitys... +subpicture.status=kuvat: +subpicture.preview.title.dvdexport=/ kuva {0} -> {1} kesto: +subpicture.preview.title.dvbexport=/ sivunumero {0} / kuva {1} -> {2} kesto: +subpicture.msg.forced=kuvasta +subpicture.msg.forced.no=-> n艙tttila: ei pakotettu +subpicture.msg.forced.yes=-> n艙tttila: pakotettu, +subpicture.preview.title.noexport=/ kuvaa ei l臧etetty... +subpicture.msg.pts.start_end=DVB-tekstitys-PTS: ensimm臺nen paketti {0}, viimeinen paketti +subpicture.msg.summary={0} DBV-tekstityst kirjoitettu... +subpicture.summary=DVB-tekstitys {0}:\t{1} tekstit\t{2}\t +subpicture.msg.error.eof=!> DBB-tekstitystiedoston loppuvirhe: +subpicture.msg.error.io=!> DBB-tekstityksen -I/O-virhe: {0} / +subpicture.msg.error.dvbdecoding=!> koodausvirhe: {0}, aluetunnus {1} (pts {2}) + +#LPCMprocess +lpcm.msg.develop=...kehitteill... +lpcm.msg.tmpfile=-> temp.-tiedosto {0} ({1} tavua) +lpcm.progress=todennetaan ja synkronoidaan +lpcm.msg.pts.mismatch=!> video- & LPCM-PTS eiv舩 sovi yhteen +lpcm.msg.adjust.at.video=-> sovitetaan LPCM videon aikajanaan +lpcm.msg.adjust.at.own=-> sovitetaan LPCM sen omaan aikajanaan +lpcm.msg.syncword.lost=!> synkronisana puuttuu kohdassa @ +lpcm.msg.syncword.found=!> synkronisana lytyi kohdassa @ +lpcm.msg.source=-> audiol臧de: {0} kohdassa @ +lpcm.msg.source.max=-> audiol臧de: lopeta n艙tt, enemm舅 kuin 100 audio-muunnosta yhdess tiedostossa h臺ritsee liikaa +lpcm.msg.error.align=!> paketti ei kytketty oikeaan WORD:iin +lpcm.msg.pts.start_end=LPCM-PTS: ensimm臺nen paketti {0}, viimeinen paketti +lpcm.msg.summary={0} pakkaan kirjoitetun... +lpcm.summary=LPCM {0}:\t{1} pakkaa \t{2}\t +lpcm.error.eof=!> LPCM-tiedoston loppu virheellinen: +lpcm.error.io=!> LPCM-I/O-virhe: {0} / + +#various +all.msg.pts.faked=--> K艙tt蒿 v蒿rennetty PTS-tietoa seuraavalle datalle: +logalias.error.io=!> Kirjautumisnimen I/O-virhe: +all.msg.error.max=-> Enemm舅 kuin 500 varoitusta/virhett, lopetetaan lokin pito.. +all.msg.error.summary=-> Havaittu {0} varoitusta/virhett. +all.msg.noprimaryfile=!> Tiedostotyyppi ei kelpaa toissijaiseksi tiedostoksi. Tarkista tiedoston j舐jestys ja eheys. + +#demux +demux.error.audio.startcode=!> V蒿r aloituskoodi, PES-pakettia ei huomioida +demux.error.audio.io=!> Audion purkuvirhe: +demux.error.video.io=!> Videon purkuvirhe: +demux.msg.celltimes=--> Leikkaustiedot kirjoitettu tiedostoon: {0}CellTimes.txt +demux.error.video.startcode=!> V蒿r aloituskoodi, PES-videopakettia ei huomioida +demux.error.video.payload=!> Tulevassa PES-paketissa ei ole sis舁t tai v蒿r p蒿tieto +demux.msg.skip.sec=-> Ohita kohtauksen loppukoodi, joka seuraa GOP n:oa +demux.error.gop.toobig=-> Videodatan koko liian suuri, GOP on > 6MB + +#ftpchooser +ftpchooser.server.tip=FTP-palvelimen nimi tai IP-osoite +ftpchooser.server=Palvelin: +ftpchooser.port.tip=FTP-palvelimen portti +ftpchooser.port=Portti: +ftpchooser.user.tip=FTP-yhteyden k艙tt臻 +ftpchooser.user=k艙tt臻: +ftpchooser.password.tip=FTP-yhteyden salasana +ftpchooser.password=Salasana: +ftpchooser.directory.tip=FTP-palvelinhakemisto +ftpchooser.directory=Hakemisto: +ftpchooser.test=Testi +ftpchooser.state.tip=yhteyden tila +ftpchooser.state=Tila: +ftpchooser.untested=ei testattu - yrit yhdist蒿 +ftpchooser.ok=OK +ftpchooser.cancel=Peruuta +ftpchooser.title=Valitse FTP-palvelin +ftpchooser.msg.noconnect=En voi yhdist蒿! +ftpchooser.msg.nologin=Sis蒿nkirjaus ep與nnistui! +ftpchooser.msg.nodirectory=En voi vaihtaa hakemistoon +ftpchooser.msg.success=Kaikki on kunnossa. +ftp.command.label=FTP-komento: +ftp.command.tip=K艙tt臻臾ohtaiset FTP-yhteyden FTP-komennot useiden komentojen rajoittamiseksi'|' +FtpServer.Commands=FTP-komento: +FtpServer.Commands.Tip=K艙tt臻臾ohtaiset FTP-yhteyden FTP-komennot, useiden komentojen rajoittamiseksi '|' +FtpPanel.Title=FTP-asetukset + +#JobCollection +JobCollection.NoInfo=Ei tietoja +JobCollection.InProgress=K艙nniss! +JobCollection.Idle=Ei k艙tss. +JobCollection.Action=Toiminta: +JobCollection.unspecified=ei m蒿ritelty. +JobCollection.PrimaryFileSegments=Tiedoston osat: +JobCollection.SecondaryFiles=Toissijaiset tiedostot: +JobCollection.Cutpoints=Leikkauspisteet: +JobCollection.Chapters=Kappaleet: +JobCollection.PidSelection=PID-valinta: +JobCollection.OwnSettings=Omat asetukset: +JobCollection.AllSize=Kokonaiskoko \u03A3: + +#CollectionTable +CollectionTable.FileLocation=Tiedoston sijainti +CollectionTable.FileName=Tiedostonimi +CollectionTable.Size=Koko +CollectionTable.lastModified=viimeksi muokattu +CollectionTable.Streamtype=Virtatyyppi +CollectionTable.Source=l臧de + +#PreviewPanel +PreviewPanel.saveCurrentPicture=Tallenna nykyinen kuva.. +PreviewPanel.saveCurrentPictureDAR=Tallenna nykyinen kuva ja DAR.. + +#NetPanel +NetPanel.WebServerPort=Portti: +NetPanel.WebServerAccess=P蒿sybittijono: +NetPanel.autostartWebServer=Aloita WebIF-palvelin automaattisesti +NetPanel.Title=Web-liittym +NetPanel.autostartWebServer.Tip= +NetPanel.WebServerPort.Tip= +NetPanel.WebServerAccess.Tip= + diff -Nru project-x-0.90.4dfsg/resources/pjxresources_fr.properties project-x-0.91.0/resources/pjxresources_fr.properties --- project-x-0.90.4dfsg/resources/pjxresources_fr.properties 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/resources/pjxresources_fr.properties 2009-10-03 09:23:34.000000000 +0000 @@ -0,0 +1,1241 @@ +# Project-X Resource File +# francais, std, V 1.1 +# by indiana, danield, t047554 + +# +Common.File=&Fichier +Common.Save=E&nregistrer +Common.SaveAs=Enre&gistrer sous.. +Common.Open=&Ouvrir.. +Common.Load=&Charger.. +Common.Edit=&Editer +Common.Messages=&Messages +Common.Options=Op&tions +Common.Close=Fe&rmer +Common.Cancel=&Annuler +Common.Exit=&Sortir +Common.LogFile=&Logfile +Common.Preferences=&Pr馭駻ences +Common.Addons=A&ddons + +General.Yes=Oui +General.No=Non + +StartUp.Title=X D駑arrage, chargement des composants... +StartUp.Error=Erreur au d駑arrage de Project-X: +StartUp.Error.Title=Erreur Project-X +StartUp.Init=Initialisation. +StartUp.Wait=Attendez, SVP... +StartUp.Choose=Choisissez une option... + +# +PreferencesPanel.Title=Pr馭駻ences +PreferencesPanel.Button=Pr馭駻ences + +Application.SaveSettingsOnExit=Sauvegarder pr馭駻ences en sortant + +# Popupmenu +popup.what=quoi +popup.cutspecials=ouvrir Coupures/Special.. +popup.url=ajouter URL.. +popup.add=ajouter.. +popup.remove=enlever +popup.rename=renommer.. +popup.openhex=ouvrir en Hexa.. +popup.patchbasics=patcher Infos Video.. +popup.sendtocl3=envoyerVers CL#3.. +popup.newOutName=nouvelle Sortie en tant que.. +popup.changeTimestamp=mettre jour datation du fichier.. +popup.copyInfoToClipboard=copier info fichier vers presse-papier +popup.assignStreamType=affecter type de flux directement.. +popup.automatic=automatique +popup.assignActionType=affecter type action directement.. +popup.unspecified=non sp馗ifi +popup.fixHpAc3=cr馥r fichier corrig Hpョ ac3.. +popup.stripAudio=enlever donn馥s audio brutes d'un DD/DTS.. + +#Filechooser +FileChooser.Select=S駘ectionner +FileChooser.Title=S駘ection + +#File Menu +file.menu=&Fichier +file.url=Ajouter &URL.. +file.add=&Ajouter.. +file.remove=&Enlever +file.rename=Re&nommer.. +file.exit=&Sortir + +#dialog +dialog.input.url=entrez une URL.. + +#Settings Menu +settings.menu=&Pr馭駻ences +settings.settings=&Pr馭駻ences.. + +#Language Menu +language.menu=&Langage +language.system=Langue s&yst鑪e +language.check=v駻ifier &en ligne + +#General Menu +general.menu=&Voir + +#Options Menu +options.menu=E&diter +options.opencutspecials=ouvrir &Coupures/Special.. +options.openhexview=ouvrir en &Hexa.. +options.pachtbasics=&patcher Infos Video.. +options.subtitlepreview=montrer Pr騅isualisation &Sous-titres.. +options.teletext=montrer &TeletextPageMatrix.. + +#Help Menu +help.menu=&Aide +help.about=&A propos.. +help.help=A&ide.. +help.lucike.info=http://www.lucike.info +help.lucike.forum=http://forum.lucike.info +help.sourceforge.net=http://sourceforge.net/projects/project-x +help.version=&Derni鑽e version ? +help.version.info=Derni鑽e version: +help.version.info.title=Derni鑽e version de Project-X +help.version.error=Erreur pour retrouver la derni鑽e version: + +progress.title=Avancement + +#Html Frame +html.title=Aide + +#Buttons +button.go=&Go! +button.go.Tip=d駑arre, pause ou reprend le traitement +button.i=&I +button.i.Tip=traitement rapide pour connatre les ID trouv駸 dans le fichier +button.c=&C +button.c.Tip=annule le traitement en cours +button.p=&P +button.p.Tip=stoppe (pause) ou continue le traitement en cours +button.e=&E +button.e.Tip=extraction de fichier PVA brut, avec l'ID sp馗ifi: (pressez 'i' pour avoir les ID trouv駸) + +#Mainpanel +MainPanel.Collection=Collection +MainPanel.Process=Traitement +MainPanel.Process.Tip=si pas DEMUX, conversion d'un format de flux un autre (copie du contenu du flux, pas de correction d'erreurs!!) +MainPanel.BitrateMonitor.Tip=Bitrate r馥l du GOP de 0...10Mbps (d駱end du type d'estimation) / structure GOP / videotime +MainPanel.writtenMB=sortie MB +MainPanel.writtenMB.Tip=nombre de MB 馗rits pour tous les nouveaux fichiers cr鳬s de la collection (sans les fichiers temporaires) +MainPanel.useAllCollections=lancer toutes les collections +MainPanel.useAllCollections.Tip=permet de travailler avec toutes les collections en une seule fois +MainPanel.enablePostProcessing=permettre le post processing +MainPanel.enablePostProcessing.Tip=permet le post processing (->voir paneau externe si le champ n'est pas vide ) +MainPanel.simpleMPG=MPG=>sPES +MainPanel.simpleMPG.Tip=simple parsing PES, autoriser pour MPEG-PS avec des donn馥s sans un sous ID standard de flux_priv饑1 +MainPanel.enhancedPES=sPES=>MPG +MainPanel.enhancedPES.Tip=parsing PES am駘ior, autoriser pour MPEG-PS avec des donn馥s avec un sous ID de flux_priv饑1 +MainPanel.nonVideoExportStatus=non d駑arr +MainPanel.nonVideoExportStatus.Tip=statut de l'export Audio ou des sous-images/pages 馗rites +MainPanel.AudioVideoOffset=d馗alage A/V +MainPanel.AudioVideoOffset.Tip=affiche le d馗alage temps A/V au d饕ut de chaque GOP en ms: a/b/c

(les coupures impliquent des d馗alages diff駻ents)

a) d馗alage PTS A/V dans source

b) d馗alage initial image A/V pour GOP r馥l dans le fichier d駑ultiplex

c) nouveau d馗alage r馥l A/V pour GOP r馥l dans le fichier d駑ultiplex +MainPanel.ConversionMode.demux=demux +MainPanel.ConversionMode.toVDR=vers VDR +MainPanel.ConversionMode.toM2P=vers M2P +MainPanel.ConversionMode.toPVA=vers PVA +MainPanel.ConversionMode.toTS=vers TS +MainPanel.ConversionMode.PidFilter=filtre PID (1:1 Copy) +MainPanel.ConversionModePriority=La collection est prioritaire +MainPanel.ConversionModePriority.Tip=use collections action type +MainPanel.useAutoPidFilter=appliquer le filtre PMT-PID +MainPanel.useAutoPidFilter.Tip= +MainPanel.QuickStart=Dem.rapide +MainPanel.QuickStart.Tip=Lance le traitement imm馘iatement, en utilisant les derniers r馮lages actifs + + +ProcessWindow.Title=Avancement +ProcessWindowPanel.Button=ouvrir >>> +ProcessWindowPanel.Title=Messages de log +ProcessWindowPanel.Action=Action: + +#Tab.msg +MessagePanel.Title=manipulation des messages +MessagePanel.logSequenceError=log 'packets out of sequence' / bit errors +MessagePanel.logSequenceError.Tip= ne pas utiliser si le message envahit la fen黎re de log (et r馘uit la vitesse) +MessagePanel.logMissingStartcode=log 'missing startcodes' +MessagePanel.logMissingStartcode.Tip= ne pas utiliser si le message envahit la fen黎re de log (et r馘uit la vitesse) +MessagePanel.logESError=log 'en-t黎e PES trouv dans l'ES' +MessagePanel.logESError.Tip= ne pas utiliser si le message envahit la fen黎re de log (et r馘uit la vitesse) +MessagePanel.leadingTimeIndex=ajouter un index de temps pour tous les messages de log +MessagePanel.leadingTimeIndex.Tip= +MessagePanel.logWSS=log WSS +MessagePanel.logWSS.Tip= +MessagePanel.logVPS=log VPS +MessagePanel.logVPS.Tip= +MessagePanel.logRDS=log RDS +MessagePanel.logRDS.Tip= +MessagePanel.hideProcessWindow=cacher la fen黎re d'avancement pendant le traitement +MessagePanel.hideProcessWindow.Tip= +MessagePanel.minimizeMainFrame=r馘uire l'application pendant le traitement +MessagePanel.minimizeMainFrame.Tip= +MessagePanel.showSubpictureWindow=montrer la pr騅isualisation sous-image pendant la cr饌tion des sous-images +MessagePanel.showSubpictureWindow.Tip= +MessagePanel.log100Errors=log max. 500 averti./erreurs +MessagePanel.log100Errors.Tip= + +#usage note +usage=usage courant en ligne de commande (LC): \n\ +Note: LC ne charge pas les 駘駑ents graphiques, except avec l'option [-gui]\n\ + ...d駑arre la GUI (interface graphique)\n\ +options et fichiers d'entr馥 peuvent 黎re dans n'importe quel ordre\n\ +\n\ +options:\n\ +[-ini ] ..utiliser ce fichier ini la place du standard\n\ +[-dvx1] ..cr馥r un .d2v ProjectFile on demux\n\ +[-dvx2] ..cr馥r un .d2v ProjectFile + .ac3.wav (RIFF WAVE Header)\n\ +[-dvx3] ..cr馥r un .d2v ProjectFile + .mpa.wav (RIFF WAVE Header)\n\ +[-dvx4] ..cr馥r un .d2v ProjectFile + .ac3.wav + mpa.wav (RIFF WAVE Header)\n\ +[-out ] ..utiliser ce r駱ertoire en sortie\n\ +[-name ] ..utiliser ce nom de fichier en sortie\n\ +[-cut ] ..utiliser ce fichier texte pour liste des points de coupure\n\ +[-chp ] ..utiliser ce fichier texte pour liste des chapitres\n\ +[-id ] ..utiliser seulement ces (P)IDs, s駱ar駸 par des virgules \",\"\n\ +[-gui] ..afficher la GUI en utilisant toutes les options donn馥s par l'ILC\n\ +[-log] ..馗rire le fichier log normal\n\ +[-saveini] ..sauver les changements faits par la ILC dans le fichier .ini actif\n\ +[-split ] ..segmenter sortie en xxx MB\n\ +[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..types d'action + +#conditions +terms=\n\ +TERMES ET CONDITIONS:\n\ +(1) ceci est un utilitaire de d駑ultipexage gratuit bas sur Java.\n\ +(2) il n'est pr騅u que dans un but 馘ucatif, en tant que projet test non commercial.\n\ +(3) le code source est publi sous les termes de la licence GNU GPL.\n\ +(4) il n'y a AUCUNE GARANTIE d'aucune sorte li馥 ce logiciel.\n\ +(5) utilisez le vos risques et p駻ils et pour votre propre formation.\n\ + +terms.disagree=Je ne suis pas d'accord (fermeture) +terms.agree=Je suis d'accord + +startup.title=X D駑arrage, chargement des composants... +startup.error=Erreur au d駑arrage de Project-X: +startup.error.title=Erreur Project-X + +about.title=A propos.. +about.ok=Ok +about.credits.label=Cr馘its: + +#version info +version.info=PROJET TEST SEULEMENT +version.user=, Utilisateur: + +#JavaEV +javaev.java.version=java.version +javaev.java.vendor=java.vendor +javaev.java.home=java.home +javaev.java.vm.version=java.vm.version +javaev.java.vm.vendor=java.vm.vendor +javaev.java.vm.name=java.vm.name +javaev.java.class.vers=java.class.vers +javaev.java.class.path=java.class.path +javaev.java.os.name=os.name +javaev.java.os.arch=os.arch +javaev.java.os.version=os.version +javaev.java.user.name=user.name +javaev.java.user.home=user.home +javaev.java.user.lang=user.language +javaev.java.ini.file=ini.file +javaev.java.disk.access=ext.disk.access + +#messages +msg.infomessage=Information +msg.new.language=Le changement de langage n馗essite un red駑arrage de Project-X. +msg.loadlang.error=erreur chargement langage: +msg.init.error=erreur d'initialisation: +msg.loadini.error=erreur chargement ini: +msg.saveini.error=erreur sauvegarde ini: +msg.loading.cutpoints=-> chargement {0} Points de coupure... +msg.loading.cutpoints.error=erreur au chargement des points de coupure +msg.loading.pids=-> chargement {0} (P)IDs... +msg.ptsfile.error=..ptsfile access error: +msg.savecut=-> saving cut PTS value ({0}) to file.. +msg.savecut.error=erreur sauvegarde du point de coupure: +msg.log.error=erreur de log: +msg.cuts.cutin=-> d饕ut coupure @ GOP# {0} / nouvelle vframe {1} / nouveau Timecode {2} +msg.cuts.cutout=-> fin coupure @ GOP# {0} +msg.newfile=---> nouveau Fichier: +msg.browser.launcher.error=erreur de lancement du browser: + +#Hex Viewer +hexviewer.title=Visionneuse Hexa +hexviewer.file=Visionneuse Hexa pour le fichier +hexviewer.filesize= Taille +hexviewer.error=..acc鑚 fichier impossible +hexviewer.save=Visionneuse Hexa, sauvegarde +hexviewer.close= fermer +hexviewer.to= +hexviewer.extractfrom=extraire de: (hex.) +hexviewer.extractfrom_tip=cliquer pour extraire vers le fichier +hexviewer.extract_tip=extraire une partie de fichier vers un nouveau fichier +hexviewer.jumptohex=Passage en Hex.: +hexviewer.jumptodec=Passage en Dec.: +hexviewer.jumpto_tip=taper Enter pour aller la position de fichier +hexviewer.textmode=mode texte + +#TeletextPageMatrix +ttpagematrix.title=TeletextPageMatrix +ttpagematrix.tip=ralentit la vitesse de d駑ultiplexage, si visible +ttpagematrix.file=fichier +ttpagematrix.composition1=teletext pagenumber composition +ttpagematrix.composition2='MXY' : M = num駻o de magazine(?), XY = num駻o de page +ttpagematrix.composition3=couleurs pour num駻os de magazine (?) + +#Scan +scan.unsupported=Type de fichier non support +scan.msg1=pas de vid駮 trouv馥 apr鑚 un scan rapide +scan.msg2=pas d'audio trouv馥 apr鑚 un scan rapide +scan.msg3=pas de t駘騁exte trouv apr鑚 un scan rapide +scan.msg4=pas de sous-image (?) trouv apr鑚 un scan rapide +scan.msg5=pas de PMT trouv +scan.msg6=erreur d'analyse PMT (langage) +scan.msg7=donn馥s vid駮, mais pas d'en-t黎e trouv apr鑚 un scan rapide +scan.msg8=erreur pendant la v駻ification +scan.msg9=le fichier ne commence pas avec un en-t黎e! + +#TS +ts.msg1=!> pas d'IDs trouv! ..utilisez le PMT corrig + +#WSS +wss.run_in=Run-In-Code found +wss.no_run_in=no Run-In-Code found +wss.startcode=Start-Code found +wss.no_startcode=no Start-Code found +wss.start=start +wss.group_1=Groupe 1 (Formatage de l'Image) +wss.group_2=Groupe 2 (Am駘iorations de l'Image) +wss.group_3=Groupe 3 (Sous-titres) +wss.group_4=Groupe 4 (Autres) +wss.group_1.0001=4:3 plein format, 576 lignes, plein 馗ran +wss.group_1.1000=14:9 letterbox, 504 lignes, centr +wss.group_1.0100=14:9 letterbox, 504 lignes, haut +wss.group_1.1101=16:9 letterbox, 432 lignes, centr +wss.group_1.0010=16:9 letterbox, 432 lignes, haut +wss.group_1.0111=14:9 plein format, 576 lignes, centr, plein 馗ran +wss.group_1.1110=16:9 plein format, 576 lignes, plein 馗ran +wss.group_1.error=erreur analyse groupe 1 (bits0..3) +wss.group_2.0.01=mode cam駻a +wss.group_2.0.10=mode film +wss.group_2.0.00=erreur analyse bit4 +wss.group_2.1.01=standard PAL +wss.group_2.1.10=MACP (motion adaptive color plus) +wss.group_2.1.00=erreur analyse bit5 +wss.group_2.2.01=no helper +wss.group_2.2.10=helper modulation (PALplus) +wss.group_2.2.00=erreur analyse bit6 +wss.group_2.3.01=r駸erv (0) +wss.group_2.3.10=r駸erv (1) +wss.group_2.3.00=erreur analyse bit7 +wss.group_3.0.01=pas de sous-titres dans le t駘騁exte +wss.group_3.0.10=sous-titres dans le t駘騁exte +wss.group_3.0.00=erreur analyse bit8 +wss.group_3.1.00=pas de 'ouvrir sous-titres' +wss.group_3.1.01='ouvrir sous-titres' dans l'image active +wss.group_3.1.10='ouvrir sous-titres' hors de l'image active +wss.group_3.1.11=r駸erv (11) +wss.group_3.1.err=erreur analyse bit9..10 +wss.group_4.0.01=pas de son surround +wss.group_4.0.10=son surround +wss.group_4.0.00=erreur analyse bit11 +wss.group_4.1.01=pas de copyright/inconnu +wss.group_4.1.10=copyright +wss.group_4.1.00=erreur analyse bit12 +wss.group_4.2.01=copie non restreinte +wss.group_4.2.10=copie restreinte +wss.group_4.2.00=erreur analyse bit13 +wss.group_4.1.err=erreur analyse bit12..13 + +#Subpicture +subpicture.title=Pr騅isualition Sous-titre +subpicture.in_time=dans +subpicture.duration=dur馥 +subpicture.msg1=!> erreur 馗r. ss-image +subpicture.msg2=!> paquet image simple +subpicture.msg3=!> cmd inconnue ss-image + +#RawRead +rawread.msg1=non autoris ou librairie non trouv馥 + +#Common +common.rename_error1=!> impossible de renommer +common.rename_error2=en + +#TabPanel +TabPanel.LogwindowPanel=log +TabPanel.FileinfoPanel=info +TabPanel.MessagePanel=msg +TabPanel.ExportPanel=sortie +TabPanel.SpecialPanel=special +TabPanel.VideoPanel=video +TabPanel.AudioPanel=audio +TabPanel.SubtitlePanel=sous-titre +TabPanel.ExternPanel=externe +TabPanel.OptionPanel=options +TabPanel.NetPanel=net +TabPanel.PostCommandsPanel=postprocess + +#Tab.logwindow +LogwindowPanel.showTtxHeader=TTX +LogwindowPanel.showTtxHeader.Tip=montre la ligne d'en-t黎e ttx et le statut VPS (ralentit, si autoris) +LogwindowPanel.showTtxHeader.Tip1=ligne d'en-t黎e de la page r馥lle transmise (ligne 0) +LogwindowPanel.showVpsLabel.Tip=statut VPS court (VBI-ligne 16), a few stations have meaningful VPS data via DVB-teletext + +#Tab.options +OptionPanel.Various.Title=divers +OptionPanel.LookAndFeel=th鑪es install駸: +OptionPanel.LookAndFeel.Info1=choisissez votre th鑪e pr馭駻 +OptionPanel.LookAndFeel.Info2=parfois, un th鑪e plante en interne +OptionPanel.DebugLog=sauvegarder gros fichier de log +OptionPanel.DebugLog.Tip=ralentit, seulement pour debug +OptionPanel.NormalLog=sauvegarder fichier de log normal +OptionPanel.NormalLog.Tip=馗rit le contenu de la fen黎re de log dans un fichier +OptionPanel.dumpDroppedGop=dump dropped GOPs to separate files +OptionPanel.dumpDroppedGop.Tip=seulement pour analyse ult駻ieure d'erreur +OptionPanel.StartPath=chemin pour la s駘ection de fichier: +OptionPanel.StartPath.Value.Tip=laissez vide, ou taper une chemin de d駱art, un '?' au d饕ut fait toujours d駑arrer par ce chemin +OptionPanel.Buffer.Title=Buffer +OptionPanel.MainBuffer=taille du Buffer-I/O principal en octets +OptionPanel.MainBuffer.Tip=des valeurs plus petites peuvent 騅iter des overflows en m駑oire interne -> OutOfMemory error +OptionPanel.PesPreBuffer=taille du Buffer-I en octets (only PES packetsize=0 !) +OptionPanel.PesPreBuffer.Tip=essayez des valeurs plus petites/grandes si vous travaillez avec des video haut bitrate +OptionPanel.ScanBuffer=Taille du buffer de pre-Scan en octets +OptionPanel.ScanBuffer.Tip=essayez des valeurs plus petites/grandes si aucun type de fichier connnu n'est d騁ect +OptionPanel.PreviewBuffer=Taille du buffer de Pr騅isualisation en octets +OptionPanel.PreviewBuffer.Tip=des valeurs plus petites acc駘鑽ent la pr騅isualisation, avec une perte possible des donn馥s de l'image +OptionPanel.callGc=garbage collector +OptionPanel.callGc.Tip=appelle le garbage collector +OptionPanel.closeOnEnd=fermer le programme quand le traitement est termin +OptionPanel.closeOnEnd.Tip=ferme le programme quand termin +OptionPanel.holdStreamInfoOnOSD=conserver les infos du flux sur l'OSD +OptionPanel.holdStreamInfoOnOSD.Tip=conserver les infos du flux sur l'OSD + +#ScanInfo +ScanInfo.Location=Chemin: +ScanInfo.Name=Nom: +ScanInfo.Size=Taille: +ScanInfo.Bytes=octest +ScanInfo.Type=Type: +ScanInfo.Date=Date: +ScanInfo.Video=Video: +ScanInfo.Audio=Audio: +ScanInfo.Teletext=T駘騁exte: +ScanInfo.Subpicture=Ss-image: +ScanInfo.Playtime=Dur馥 est.: +ScanInfo.NotFound=Fichier n'existe pas! + +#Execute +PostCommands.Title=programmes externes +PostCommands.PostProcessing=commandes post-traitement: +PostCommands.PostProcessing.Tip=ex馗ute cette commande apr鑚 le traitement d'une collection enti鑽e/morcel馥 +PostCommands.Execute=ex馗uter +PostCommands.Close=fermer +PostCommands.Error=!> erreur d'ex馗ution: + +#Collection +CollectionPanel.Title=points sp馗iaux des collection +CollectionPanel.Title2=points sp馗iaux pour la collection # +collection.title.processing=traitement pr騅isualisation... +CollectionPanel.CutPanel=Pr騅isualisation / Points de coupure du fichier video +CollectionPanel.CutPanel.Tip1=utilisez aussi le clavier pour la navigation, la pr騅isualisation ne fonctionne qu'en mode Pos. Octets pour coupures +CollectionPanel.CutPanel.Tip2=segment actif/nombre de segments + nom de fichier du segment actif +CollectionPanel.CutPanel.Tip3=(P)ID trait pour obtenir l'image courante +CollectionPanel.CutPanel.Tip4=tapez un nombre, ou glissez/d駱osez un fichier de points de coupure ici +CollectionPanel.addPoint=ajouter un point +CollectionPanel.removePoint=enlever un point +CollectionPanel.NumberOfPoints=Points de coupure +CollectionPanel.NumberOfPoints.Tip=tous les points sont automatiquement tri駸 +CollectionPanel.NumberOfChapters=Chapitres +CollectionPanel.NumberOfChapters.Tip=tous les chapitres sont automatiquement tri駸 +CollectionPanel.expectedSize=Taille: ~ +CollectionPanel.Preview.offline=pr騅isualisation non disponible +CollectionPanel.Preview.processedPid=traitement du (P)ID Video 0x +CollectionPanel.Various=Divers +CollectionPanel.Preview.fastDecode=+rapide/-bonne pr騅isualisation +CollectionPanel.Preview.fastDecode.Tip=reconstruction et interpolation simplement du pixel en haut gauche de chaque macrobloc +CollectionPanel.Preview.LiveUpdate=maj inst. pendant scrolling +CollectionPanel.Preview.LiveUpdate.Tip=non recommand sur les syst鑪es lents or file access, se r馭鑽e au buffer de pr騅isualisation +CollectionPanel.Preview.AllGops=pr騅isualise les GOP sans en-t黎e +CollectionPanel.Preview.AllGops.Tip=non recommand pour des donn馥s DVB, autorisez le seulement pour des flux avec seulement un en-t黎e! +CollectionPanel.PidList=liste PES(&Sous)-ID/PID: +CollectionPanel.PidList.Tip1=entrez le PES-ID ou le sous-ID (MPG etc) ou le PID (PVA,TS); liste vide == tous les ID +CollectionPanel.PidList.Tip2=doublecliquez pour enlever l'entr馥 s駘ectionn馥 +CollectionPanel.transferPids1=(P)ID => nlle coll# +CollectionPanel.transferPids1.Tip=fait les changements dans la coll# active. Vous devez les appliquer +CollectionPanel.transferPids2=Points Coupure => nlle coll# +CollectionPanel.transferPids2.Tip=fait les changements dans la coll# active. Vous devez les appliquer +CollectionPanel.ExportLimits=limites d'export suppl駑entaires: +CollectionPanel.OptionHorizontalResolution=Resol. H: +CollectionPanel.OptionHorizontalResolution.Tip=global,..cela ignorera toute autre s駲uence vid駮 +CollectionPanel.OptionDAR=Ratio: +CollectionPanel.OptionDAR.Tip=global,..cela ignorera toute autre s駲uence vid駮 +CollectionPanel.loadCutpointList=charger points coupure du fichier +CollectionPanel.loadCutpointList.Tip=ouvrez un fichier de points de coupure ou glissez/d駱osez le ici +CollectionPanel.saveCutpointList=sauver pts coupure dans fichier +CollectionPanel.ApplyAndClose=appliquez et fermez +CollectionPanel.Apply=appliquez +CollectionPanel.CutMode.Bytepos=(0) util. Pos. Octets pour coupures +CollectionPanel.CutMode.Gop=(1) util. num駻o GOP pour coupures +CollectionPanel.CutMode.Frame=(2) util. num. images pour coupure +CollectionPanel.CutMode.Pts=(3) util. PTS pour coupures +CollectionPanel.CutMode.Timecode=(4) util. index temps pour coupures +CollectionPanel.Preview.Error=erreur de pr騅isualisation: +CollectionPanel.FileAccessError=.. ne peut pas acc馘er au fichier +CollectionPanel.Title.Error=particularit駸 pour coll.# {0} -> ERREUR! la collection n'existe pas +CollectionPanel.loadCutpointList.Error=erreur de chargement + +#makeVDR +StreamConverter.IOError=!> erreur r饌l. flux E/S: +StreamConverter.PayloadError=!> paquet PES entrant sans chargem ou avec des donn馥s d'en-t黎es incorrectes +StreamConverter.Summary=Flux: + +#patch +PatchPanel.Title=editer les infos video de base du 1er en-t黎e de s駲uence +PatchPanel.Error=patch erreur +PatchPanel.Error2=patch erreur 2 +PatchPanel.Change=changer +PatchPanel.Cancel=annuler + +#CutListener +cutlistener.wrongnumber=-> mauvaise valeur d'ID + +#GoListener +golistener.msg.cancelled=--- traitement annul ---- +golistener.msg.paused=--- traitement en pause ---- +golistener.msg.resumed=--- reprise du traitement ---- +golistener.msg.extracting=extraction donn馥s brutes(PES) de l'ID 0x + +#AC3 +ac3.msg.loading.start=chargement frames AC3: +ac3.msg.loading.error=erreur chargement ac3.bin +ac3.msg.frames=ac3.bin contient {0} frames AC3 + +#Run +run.prepare.colls=preparation collection(s)... +run.av.offset=d馗alage A/V +run.session.infos=<<< infos de la session >>> +run.working.coll=-> traitement de la collection +run.split.output=-> segmentation sortie @ appr. +run.add.time.offset=-> ajouter un d馗alage de temps pour audio/ttx/pics : {0} ms (si cela suit sur une video) +run.stream.type.disabled=-> type de flux PES non permis: +run.write.output.to=-> 馗rire fichies de sortie dans: +run.write.output.notexists=!> le r駱ertoire de sortie sp馗ifi n'est pas accessible +run.write.output.nowriteaccess=!> pas d'馗riture possible dans le r駱ertoire de sortie sp馗ifi +run.cutpoints.defined=point(s) de coupure d馭ini(s) +run.start.quick.info=<<< info rapide >>> +run.end.quick.info=<<< fin de l'info rapide >>> +run.no.input=pas de fichier d'entr馥... +run.write.raw=馗rire le fichier brut s駱ar dans: +run.coll.empty=La collection est vide... +run.done=fini... {0} collection(s) trait馥(s) @ +run.stopped=arr黎... +run.status=pr黎... +run.splitpart=partie r馥lle de la segmentation de la sortie + +#Working +working.convertType.demux=-> d駑ultiplexer +working.convertType.makeVDR=-> faire un VDR (A/V PES) +working.convertType.makeMPG2=-> faire un MPG2 +working.convertType.makePVA=-> faire un PVA +working.convertType.makeTS=-> faire un TS +working.convertType.packetFilter=-> filtre paquet simple +working.file=+> Fichier entr馥 {0}: {1} ({2} bytes) +working.file.not.found= ? Fichier non trouv ! +working.filetype=-> Type fichier est {0} +working.file.notsupported= ? Type de fichier non support ! +working.end.of.part=---> FIN DE PARTIE +working.summary=r駸um des fichiers media cr鳬s: +working.post.command=-> commandes de post traitement ex馗ut馥s: +working.bytes.written=octects 馗rits... +working.log.error2=log error2: +working.output.std=[res] m麥e endroit 1er fichier de la coll. + +#MPVD +mpvdecoder.tip1=double-cliquez pour sauvegarder en bmp + +#FilePanel +FilePanel.DragDrop.Tip=tirez & posez fichier(s) ici, ou utilisez le menu contextuel +FilePanel.FileUp.Tip=d駱lace les fichier(s) plus haut dans la collection +FilePanel.FileDown.Tip=d駱lace les fichier(s) plus bas dans la collection +FilePanel.FileRemove.Tip=enl钁e les fichier(s) de la collection +FilePanel.CollectionNumber=coll.# +FilePanel.CollectionNumber.Tip=choisit la collection active +FilePanel.addCollection.Tip=cr馥 une nouvelle collection +FilePanel.removeCollection.Tip=supprime la collection +FilePanel.openAutoloadPanel.Tip=ouvre la fen黎re de chargement de fichier +FilePanel.OutputDirectory=r駱ertoire sortie: +FilePanel.OutputDirectory.Tip=r駱ertoire de sortie sp馗ifi pour la collection s駘ectionn馥 +FilePanel.recentOutputDirectories=r駱ertoires sortie r馗ents: +FilePanel.addRecentOutputDirectory.Tip=ajoute un r駱ertoire la liste des r駱ertoires de sortie r馗ents +FilePanel.removeRecentOutputDirectory.Tip=enl钁e un r駱ertoire de la liste des r駱ertoires de sortie r馗ents +FilePanel.Textfield.Tip=Infos-Collection +FilePanel.FileAdd.Tip=ajoute un(des) fichier(s) la collection + +#ExternTab +ExternPanel.Title1=externes / post traitement +ExternPanel.Title1.Tip=definit vos applications pr馭駻馥s +ExternPanel.Applications=applications externes... +ExternPanel.createVdrIndex=cr馥r index.vdr sur: +ExternPanel.createVdrIndex.Tip=les fichiers vdr cr鳬s seront renomm駸 en 0xx.vdr +ExternPanel.createCellTimes=cr馥r cellTimes.txt pour les coupures +ExternPanel.createCellTimes.Tip=d駑ultiplexage seulement, ajoute une entr馥 du num駻o d'image dans le fichier des points de coupure (nouveau chapitre) +ExternPanel.exportPts=sauver valeurs PTS des points de coupure +ExternPanel.exportPts.Tip=pour partager et recharger (points de coupure PTS) dans une autre instance X +ExternPanel.save1stFrameOfGop=sauver automatiquement la 1鑽e I-Frame des GOP en .bmp +ExternPanel.save1stFrameOfGop.Tip=d駑ultiplexage seulement... +ExternPanel.createChapters=sauver codetemps sur changement de mode +ExternPanel.createChapters.Tip=exporte dans la liste une nouvelle entr馥 de codetemps s'il y a un changement de mode +ExternPanel.renameAudio=renommer tous les MPEG-Audios en *.mpa +ExternPanel.renameAudio.Tip=au lieu d'utiliser le num駻o de layer -> .mp1, .mp2, .mp3 +ExternPanel.renameVideo=renommer tous les MPEG-Videos en *.mpv +ExternPanel.renameVideo.Tip=au lieu d'utiliser le type MPEG -> .m1v, .m2v +ExternPanel.Title2=Pr馭駻ences du fichier projet +ExternPanel.Title2.Tip=changez les entr馥s si vous savez ce que vous faites +ExternPanel.createM2sIndex=Version idd CoupureMpeg2: V2/A3 +ExternPanel.createM2sIndex.Tip=cr馥 le fichier de projet *.idd en d駑ultiplexage: +ExternPanel.createD2vIndex=cr馥r fichier de projet *.d2v en demux: +ExternPanel.createD2vIndex.Tip=si chaque partie doit 黎re convertie s駱ar駑ent +ExternPanel.createDgiIndex=cr馥r fichier de projet *.dgi.d2v en demux: +ExternPanel.createDgiIndex.Tip=si chaque partie doit 黎re convertie s駱ar駑ent +ExternPanel.splitProjectFile=segmenter fichiers video (un seul projet) +ExternPanel.splitProjectFile.Tip=馗rit automatiquement la video d駑ultiplex馥 dans des fichiers de la taille sp馗ifi馥, mais pas l'audio; meilleur pour des gros fichiers sur des syst鑪es <=FAT32 +ExternPanel.ProjectFileSplitSize==> faire segments video de xxx MB: +ExternPanel.ProjectFileSplitSize.Tip= +ExternPanel.appendExtension=ajouter de nouv. extensions de fichier(PES) +ExternPanel.appendExtension.Tip=va garder le nom du fichier source (incl. extension) de tous les flux secondaires PES + +FtpPanel.killFtpClient=supprimer client sans logout +FtpPanel.killFtpClient.Tip= ne pas utiliser, sauf si le serveur ftp n'accepte pas de logout moins qu'un transfert soit termin (risque de ne pas d馗onnecter le client!) +FtpPanel.useFtpServerResume=le serveur supporte les 'reprises' +FtpPanel.useFtpServerResume.Tip= + +#SpecialTab +SpecialPanel.Title1=special 1 +SpecialPanel.PtsShift=d馗alage PTS global (en heures): +SpecialPanel.PtsShift.Tip=essayez 'auto ou 1..13', en cas de pbs de souce A/V PTS , ou si l'audio n'est pas d駑ultiplex (std=0) +SpecialPanel.PVA.FileOverlap=PVA: v駻ifier chevauchement la lecture +SpecialPanel.PVA.FileOverlap.Tip= d馗ocher si plusieurs PVA d'un enregistrements ont 騁 enregistr駸 sans recouvrement +SpecialPanel.PVA.Audio=PVA: specs. strictes pour les flux audio +SpecialPanel.PVA.Audio.Tip=permet d'騅iter la d騁ection des erreurs audio; mais sur certains enregistrements, il manque des flags! (MD) +SpecialPanel.VOB.resetPts=VOB: d騁erm. lignes temps diff. cellules +SpecialPanel.VOB.resetPts.Tip= autoriser si les PTS de cellules/VobId cons馗utifs ne sont pas continus +SpecialPanel.TS=relatif aux TS: +SpecialPanel.TS.ignoreScrambled=TS: ignorer les paquets crypt駸 +SpecialPanel.TS.ignoreScrambled.Tip= d馗ocher si vous pensez que les paquets ne sont pas crypt駸, bien qu'ils soient marqu駸 comme tels +SpecialPanel.TS.blindSearch=TS: recherche avanc馥 paquets ouverts +SpecialPanel.TS.blindSearch.Tip= autoriser si la d騁ection du PID arr黎e la recherche une charge inconnue +SpecialPanel.TS.joinPackets=TS: joindre les segments (pour Dreamboxョ) +SpecialPanel.TS.joinPackets.Tip= autoriser pour joindre les paquets de TS incomplets aux limites des segments des fichiers multiples +SpecialPanel.TS.HumaxAdaption=TS: adapter au format de fichier Humaxョ +SpecialPanel.TS.HumaxAdaption.Tip= autoriser pour le format de fichier sp馗ifique Humaxョ des TS +SpecialPanel.TS.FinepassAdaption=TS: adapter au format de fichier Finepassョ +SpecialPanel.TS.FinepassAdaption.Tip= autoriser pour le format de fichier sp馗ifique Finepassョ HD des TS +SpecialPanel.TS.JepssenAdaption=TS: adapter au format de fichier Jepssenョ +SpecialPanel.TS.JepssenAdaption.Tip= autoriser pour le format de fichier sp馗ifique Jepssenョ des TS +SpecialPanel.TS.KoscomAdaption=TS: adapter au format de fichier Koscomョ +SpecialPanel.TS.KoscomAdaption.Tip= autoriser pour le format de fichier sp馗ifique Koscomョ des TS +SpecialPanel.TS.ArionAdaption=TS: adapter au format de fichier Arionョ +SpecialPanel.TS.ArionAdaption.Tip= autoriser pour le format de fichier sp馗ifique Arionョ des TS +SpecialPanel.TS.generatePmt=TS: g駭駻er un PMT d駱endant du flux +SpecialPanel.TS.generatePmt.Tip= d馗ocher pour g駭駻er un PMT ind駱endant et pr馘馭ini qui s'adapte presque tous les streams +SpecialPanel.TS.generateTtx=TS: g駭駻er un service TTX (test) +SpecialPanel.TS.generateTtx.Tip=rajoute un service de flux t駘騁exte (Pid 0x9F) pour le statut en page 150 (seulement @ autoPMT) +SpecialPanel.TS.HeaderMode0=(0) pas d'en-t黎e TS suppl駑entaire +SpecialPanel.TS.HeaderMode1=(1) ajouter en-t黎e Topfieldョ 4000 au TS +SpecialPanel.TS.HeaderMode2=(2) ajouter en-t黎e Topfieldョ 5000 au TS +SpecialPanel.TS.HeaderMode3=(3) ajouter en-t黎e Topfieldョ 5x00 au TS (nouveau) +SpecialPanel.TS.HeaderMode4=(4) ajouter en-t黎e Topfieldョ 5x00(C) au TS (nouveau) +SpecialPanel.TS.HeaderMode5=(5) ajouter en-t黎e Arionョ au TS +SpecialPanel.TS.setMainAudioAc3=en-t黎e-TFョ: AC3 = piste audio principale +SpecialPanel.TS.setMainAudioAc3.Tip=en-t黎e-TFョ: d馗lare AC3 comme piste audio principale +SpecialPanel.Title2=special 2 +SpecialPanel.Input.getEnclosedPackets=prendre seult les paquets PES/TS inclus +SpecialPanel.Input.getEnclosedPackets.Tip= d馗ocher si aucun paquet n'est trouv (en fin de paquet, le prochain code de d駱art Mpeg est absent, p.e. sur Images) +SpecialPanel.Input.concatenateForeignRecords=concat駭er diff駻ents enregistrements +SpecialPanel.Input.concatenateForeignRecords.Tip= cocher si vous voulez concat駭er plusieurs fichier PVA, MPEG ou VDR enregistr駸 a diff駻ents moments +SpecialPanel.Audio.ignoreErrors=Audio: utiliser seult 1er PTS pour la sync +SpecialPanel.Audio.ignoreErrors.Tip=calcule le temps pour la synchronisation audio partir du point de d駱art, saute les erreurs +SpecialPanel.Audio.limitPts=Audio: point limite de PTS pour la sync +SpecialPanel.Audio.limitPts.Tip=meilleur que le pr馗馘ent, l'audio restera synchro +SpecialPanel.Video.ignoreErrors=Vid駮: ignorer erreurs apr鑚 1er PTS/GOP +SpecialPanel.Video.ignoreErrors.Tip= cocher si vraisemblablement il n'y a que des erreurs Video PTS (Images semblent ok) +SpecialPanel.Video.trimPts=Vid駮: adapter PTS se chevauchant +SpecialPanel.Video.trimPts.Tip= cocher si l'export audio s'arr黎e pr駑atur駑ent, cause d'une l馮鑽e d駻ive du PTS +SpecialPanel.Conversion=uniquement pour les conversions 'XYZ': +SpecialPanel.Conversion.startWithVideo=v駻if. 1er paq.-PES commence av. la vid駮 +SpecialPanel.Conversion.startWithVideo.Tip= ne cocher que si certains lecteurs ont des probl鑪es, sinon, d馗ocher pour la conversion audio +SpecialPanel.Conversion.addPcrToStream=g駭駻er PCR/SCR depuis PTS +SpecialPanel.Conversion.addPcrToStream.Tip=sp馗ifie l'offset du PCR, le DVB n馗essite une valeur plus haute que le DVD, les hauts bitrates n馗essitent plus que les faibles +SpecialPanel.Conversion.PcrCounter=incTScnt +SpecialPanel.Conversion.PcrCounter.Tip=incr駑ente le compteur de paquets-TS m麥e sans charge (seulement PCR); non conforme, mais quelquefois n馗essaire! + +#OutTab +ExportPanel.SplitPanel=segmentation en sortie +ExportPanel.SplitSize=segmente @ env. xxx MB +ExportPanel.SplitSize.Tip=changez la valeur pour une autre taille; actuellement, la taille de segmentation se r馭鑽e la taille du fichier vid駮 馗rit! (mpv) +ExportPanel.Overlap=recouvrement de +ExportPanel.Overlap.Tip= +ExportPanel.StreamtypePanel=types de flux traiter +ExportPanel.StreamtypePanel.Tip=d-/s駘ectionnez les types de flux que vous voulez traiter (ne s'applique pas ES en entr馥) +ExportPanel.Streamtype.MpgVideo=Mpeg Vid駮 +ExportPanel.Streamtype.MpgAudio=Mpeg Audio +ExportPanel.Streamtype.Ac3Audio=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio=LPCM Audio +ExportPanel.Streamtype.Teletext=T駘騁exte +ExportPanel.Streamtype.Subpicture=Sous-titres +ExportPanel.Streamtype.Vbi=Generic_VBI +ExportPanel.Streamtype.MpgVideo.Tip=Mpeg Vid駮 +ExportPanel.Streamtype.MpgAudio.Tip=Mpeg Audio +ExportPanel.Streamtype.Ac3Audio.Tip=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio.Tip=LPCM Audio +ExportPanel.Streamtype.Teletext.Tip=T駘騁exte +ExportPanel.Streamtype.Subpicture.Tip=Sous-titres +ExportPanel.Streamtype.Vbi.Tip=Generic_VBI +ExportPanel.WriteOptions=options d'馗riture pour d駑ultiplexage/conversion +ExportPanel.WriteOptions.Tip=fonctionne pour le d駑ultiplexage et toutes les conversions +ExportPanel.WriteOptions.writeVideo=馗rit toutes les donn馥s vid駮 +ExportPanel.WriteOptions.writeAudio=馗rit toutes les autres donn馥s +ExportPanel.WriteOptions.writeVideo.Tip=馗rit toutes les donn馥s vid駮 +ExportPanel.WriteOptions.writeAudio.Tip=馗rit toutes les autres donn馥s +ExportPanel.WriteOptions.InfoScan=demux rapide/convers. des 1ers xx MB : +ExportPanel.additionalOffset.Title=temps additionel de d馗alage (d駑ultiplexage) +ExportPanel.additionalOffset=activer le d馗alage +ExportPanel.additionalOffset.Tip=le d饕ut du flux a 騁 d駱lac du temps donn +ExportPanel.additionalOffset.Value.Tip=entrez le d馗alage de temps en millisecondes, appuyez sur enter; agit sur tous les flux qui suivent dans la vid駮 +ExportPanel.createSubDirNumber=utiliser le num駻o de collection comme sous-r駱ertoire +ExportPanel.createSubDirNumber.Tip=global: cr馥 un sous-r駱ertoire pour chaque collection (meilleur pour fichiers identiques dans diff. collections) +ExportPanel.createSubDirName=utiliser le nom de base de la collection comme sous-r駱ertoire +ExportPanel.createSubDirName.Tip=global: cr馥 un sous-r駱ertoire bas sur le 1er fichier de chaque collection + + +#VideoTab +VideoPanel.Title1=corrections vid駮 (d駑ultiplexage) +VideoPanel.addEndcode=ajouter un code de fin de s駲uence +VideoPanel.addEndcode.Tip= cocher pour une fin de s駲uence MPEG conforme +VideoPanel.insertEndcode=ins駻er code fin s駲uence si chgt format +VideoPanel.insertEndcode.Tip= cocher pour une fin de s駲uence MPEG conforme +VideoPanel.addSequenceHeader=v駻if. chaque GOP a un en-t黎e s駲uence +VideoPanel.addSequenceHeader.Tip=re-init (resol. & q_matrix) du d馗odage d'image chaque limite de GOP (automatique en segmentation) +VideoPanel.patchToProgressive=patcher toutes les images en progressive +VideoPanel.patchToProgressive.Tip=Positionne les progressive bits pour r馘uire le nombre de champs +VideoPanel.patchToInterlaced=patcher toutes les images en entrelac +VideoPanel.patchToInterlaced.Tip=supprime les progressive bits +VideoPanel.toggleFieldorder=changer l'ordre des champs +VideoPanel.toggleFieldorder.Tip=inverse le bit qui d駸igne le premier champ haut +VideoPanel.addSde=forcer r駸olution en SDE +VideoPanel.addSde.Tip=transforme l'entr馥 actuelle ou ajoute de nouvelles, un champ vide signifie que la valeur sera identique celle de l'en-t黎e de s駲uence, par ex.720*576 +VideoPanel.SdeValue.Tip=transforme l'entr馥 actuelle ou ajoute de nouvelles, un champ vide signifie que la valeur sera identique celle de l'en-t黎e de s駲uence, par ex.720*576 +VideoPanel.clearCdf=駘iminer les "display flag" composite +VideoPanel.clearCdf.Tip=r駸oud les probl鑪es "d'image verte" caus駸 par certaines cartes "chipset" d'anciens d馗odeurs +VideoPanel.patchResolution=patcher 1鑽e res-h: +VideoPanel.patchResolution.Tip=peut patcher la 1鑽e r駸olution horizontale +VideoPanel.patchResolutionValue.0=(0) jamais +VideoPanel.patchResolutionValue.1=(1) toujours +VideoPanel.patchResolutionValue.2=(2) si <> 352|720 +VideoPanel.patchResolutionValue.3=(3) si <> to 352|704|720 +VideoPanel.Title2=nouvelle valeur bitrate (d駑ultiplexage) +VideoPanel.ChangeVbvBuffer.Tip=il est parfois pr馭駻able de d馭inir la taille max. +VideoPanel.Unchanged=ne rien changer +VideoPanel.ChangeVbvBuffer.Mode1=(1) max. (112*16384) +VideoPanel.ChangeVbvBuffer=tampon VBV: +VideoPanel.ChangeVbvDelay.Tip=temps max. recommand +VideoPanel.ChangeVbvDelay.Mode1=(1) temps max.(0xFFFF) +VideoPanel.ChangeVbvDelay=d駘ais VBV: +VideoPanel.ChangeAspectRatio.Tip= modifier si vous pensez que c'est utile +VideoPanel.ChangeAspectRatio=ratio image: +VideoPanel.patchBitrateValue.0=(0) garde l'originale +VideoPanel.patchBitrateValue.1=(1) calcul partir de la long. du GOP +VideoPanel.patchBitrateValue.2=(2) calcul partir du VBV +VideoPanel.patchBitrateValue.3=(3) marque en VBR (MPEG-1 Video) +VideoPanel.patchBitrateValue.4=(4) 3 Mbps fixe +VideoPanel.patchBitrateValue.5=(5) 6 Mbps fixe +VideoPanel.patchBitrateValue.6=(6) 9 Mbps fixe +VideoPanel.patchBitrateValue.7=(7) 12 Mbps fixe +VideoPanel.patchBitrateValue.8=(8) 15 Mbps fixe +VideoPanel.patchBitrateValue=valeur du bitrate par s駲uence: +VideoPanel.patch1stBitrateValue.0=(0) garde l'originale +VideoPanel.patch1stBitrateValue.1=(1) moyenne calcul馥 (nominal) +VideoPanel.patch1stBitrateValue.2=(2) maximum calcul <= 9.8 Mbps(DVD) +VideoPanel.patch1stBitrateValue.3=(3) maximum calcul (p.e. HDTV) +VideoPanel.patch1stBitrateValue.4=(4) marque en VBR (MPEG-1 Video) +VideoPanel.patch1stBitrateValue=bitrate de la 1鑽e s駲uence: + +#AudioTab +AudioPanel.Title1=conversions audio (d駑ultiplexage) +AudioPanel.losslessMpaConversion.Tip1=conversion directe sans d馮radation (seulement +AudioPanel.losslessMpaConversion.Tip2=pour MPEG-1, Layer2, 48kHz, 56..384kbps) : +AudioPanel.losslessMpaConversion.Tip=si une conversion est choisie, le bitrate & le mode du canal seront constants durant tout le fichier +AudioPanel.losslessMpaConversionMode0=(0) pas de conversion +AudioPanel.losslessMpaConversionMode1=(1) mono vers dual (A=original, B=silence) +AudioPanel.losslessMpaConversionMode2=(2) mono vers st駻駮 (L+R = original) +AudioPanel.losslessMpaConversionMode3=(3) mono vers jointst駻駮 (L+R = original) +AudioPanel.losslessMpaConversionMode4=(4) s駱ar. 2 canaux en 2 monos (1=L,2=R) +AudioPanel.decodeMpgAudio=d馗oder la couche MPEG 1,2 vers PCM +AudioPanel.decodeMpgAudio.Tip=MPEG-Audio D馗odeur (pas pour mp3), sortie std en pcm st駻駮 +AudioPanel.decodeMpgAudio.resampleAudioMode0=(0) pas de r鳬chantillonage +AudioPanel.decodeMpgAudio.resampleAudioMode1=(1) r鳬chantillonage lin. 48kHz en 32kHz +AudioPanel.decodeMpgAudio.resampleAudioMode2=(2) r鳬chantillonage lin. 48kHz en 44.1kHz +AudioPanel.decodeMpgAudio.Normalize=normaliser en % : +AudioPanel.decodeMpgAudio.Normalize.Tip=normalise L+R de fa輟n 馮ale, valeurs de 0 100 sont possibles, std 98%; force le red駑arrage si n馗essaire +AudioPanel.NormalizeValue.Tip=normalise L+R de fa輟n 馮ale, valeurs de 0 100 sont possibles, std 98%; force le red駑arrage si n馗essaire +AudioPanel.decodeMpgAudio.Downmix=mixer et sortir sur un canal +AudioPanel.decodeMpgAudio.Downmix.Tip=mixe une source st駻駮/2canaux pour r馗up駻er un seul canal +AudioPanel.decodeMpgAudio.changeByteorder=sauver au format Motorola (ordre octets) +AudioPanel.decodeMpgAudio.changeByteorder.Tip=signifie MSB (poids fort) en premier, contrairement au type Intel +AudioPanel.decodeMpgAudio.addRiffHeader=ajout d'un en-t黎e RIFF(RIFX) au PCM (.wav) +AudioPanel.decodeMpgAudio.addRiffHeader.Tip=PC standard +AudioPanel.decodeMpgAudio.addAiffHeader=ajout d'un en-t黎e AIFF au PCM (.aif) +AudioPanel.decodeMpgAudio.addAiffHeader.Tip=Apple standard +AudioPanel.Title2=audio manipulations (demultiplex) +AudioPanel.validateCRC=v駻ifier CRC de AC-3 / MPEG-1, MPEG-2 +AudioPanel.validateCRC.Tip=si activ, assure le plus bas niveau d'erreur au d騁riment des performances +AudioPanel.clearCRC=supprimer CRC de MPEG-1, MPEG-2 +AudioPanel.clearCRC.Tip=si activ, permet de supprimer certains messages d'erreur audio +AudioPanel.fillGapsWithLastFrame=remplit vides avec l'馗hantillon audio pr馗. +AudioPanel.fillGapsWithLastFrame.Tip=au lieu d'ins駻er un temps mort.; est std pour AC-3, quand ac3.bin ne contient pas d'馗hantillon silenc. pour AC-3 +AudioPanel.addFrames=ajout d'馗hantillons audio +AudioPanel.addFrames.Tip=si l'audio finit avant la vid駮, pour atteindre la fin de la vid駮 +AudioPanel.patch1stAc3Header=patcher 1er en-t黎e AC-3 en 3/2 ch-mode +AudioPanel.patch1stAc3Header.Tip=n馗essaire certains d馗odeurs AC-3 pour d馗oder tous les canaux +AudioPanel.replaceAc3withSilence=remplacer non-3/2 AC-3 => silences 3/2lfe +AudioPanel.replaceAc3withSilence.Tip=permet de masquer des 馗hantillons audio 2/0 non voulus par des silences 3/2(48khz,448kbps, besoin de ac3.bin) +AudioPanel.addRiffToAc3=ajout d'un en-t黎e RIFF WAVE l'audio AC-3 +AudioPanel.addRiffToAc3.Tip=cr饌tion d'un fichier .wav, en utilisant l'en-t黎e AC-3 Wave Format (tag 0x2000) +AudioPanel.addRiffToMpgAudioL12=MPA: ajouter en-t黎e RIFF WAVE MPEG-1/2 +AudioPanel.addRiffToMpgAudioL12.Tip=Format Wave de Diffusion (tag 0x0050), meilleur pour MPEG-1 et MPEG-2 +AudioPanel.addRiffToMpgAudioL3=MPA: ajouter en-t黎e RIFF WAVE mp3 +AudioPanel.addRiffToMpgAudioL3.Tip=Format Wave ACM plus classique (tag 0x0055), meilleur pour mp3 +AudioPanel.pitchAudio=supprimer tous les 馗hantillons Audio xxx : +AudioPanel.pitchAudio.Tip=compression/tonalit Audio (flux 駘駑entaires seulement) +AudioPanel.allowSpaces=accepter espaces entre 馗hant. audio +AudioPanel.allowSpaces.Tip=d騁ecte seulement les en-t黎es d'馗hantillons audio valides, sans v駻ification de la longueur! (risques de tailles incorrectes possibles) +AudioPanel.createDDWave=AC-3/DTS: sortir en DD/DTS-Wave +AudioPanel.createDDWave.Tip=sortie AC3/DTS en DD/DTS-Wave, en-t黎e fixe: PCM 44.1kHz,16bit,2-ch + +#SubtitleTab +SubtitlePanel.Title=T駘騁exte DVB, sous-titres DVB (d駑ultiplexage) +SubtitlePanel.Title.Teletext=T駘騁exte DVB (d駑ultiplexage) +SubtitlePanel.decodeMegaradio=test: exporter flux-MP3 MegaRadioョ +SubtitlePanel.decodeMegaradio.Tip=ancien. transmis via Hotbird 13ーE, 11.054GHz Hor., SR 27500, FEC 5/6, TTX-PID 553 +SubtitlePanel.decodeHiddenRows=d馗oder lignes cach馥s de t駘騁exte +SubtitlePanel.decodeHiddenRows.Tip=certaines pages de t駘騁exte ou certains sous-titres sont cach駸. Utile dans ce cas +SubtitlePanel.rebuildPTS=reconst. TTX-PTS<=1er flux MpgAudio +SubtitlePanel.rebuildPTS.Tip= utiliser SEULEMENT pour flux TTX inclus dans un fichier de flux (TS,PES..) mais sans base de temps vers vid駮 +SubtitlePanel.keepOriginalTimcode=garder le code temps original (PTS) +SubtitlePanel.keepOriginalTimcode.Tip=sans une vid駮 d駑ultiplexer, le nouveau Timecode ne commence pas 0 +SubtitlePanel.exportTextAsUnicode=exporter du texte en UTF-16 (BE) +SubtitlePanel.exportTextAsUnicode.Tip=exporte du texte en UTF16 (BE) +SubtitlePanel.exportTextAsUTF8=exporter du texte en UTF-8 +SubtitlePanel.exportTextAsUTF8.Tip=exporter du texte en UTF-8 +SubtitlePanel.TtxPages=pages t駘騁exte d馗oder: +SubtitlePanel.TtxPages.Tip=autod騁ection de caract鑽es sp馗iaux bas駸 sur codes de pages T駘騁exte Niveau 1.5 en unicode +SubtitlePanel.Language= langue: +SubtitlePanel.Language.Tip=d騁ermine une famille de langues, si le changement automatique n'est pas support par le diffuseur +SubtitlePanel.Format.Tip=s駘ection du formart d'exportation pr馭駻 +SubtitlePanel.Format.Free=texte +SubtitlePanel.Format=type de sous-titres export駸 : +SubtitlePanel.Colormodel.Mode0=(0) 4 couleurs +SubtitlePanel.Colormodel.Mode1=(1) 16 couleurs +SubtitlePanel.Colormodel.Mode2=(2) 256 couleurs +SubtitlePanel.PageId.Value.Tip=champ vide = utilise ce qui vient, sinon: cl de la page ID d駸ir馥 (d駱end de la diffusion) +SubtitlePanel.Colormodel=simuler le mod鑞e de couleur IRD des ss-imgs DVB: +SubtitlePanel.Colormodel.Tip=affecte beaucoup l'aspect des sous-titres export駸, le meilleur arrangement d駱end de ce que vous voulez +SubtitlePanel.PageId= fix l'ID de la page: +SubtitlePanel.showPreview=montrer Pr騅isualisation SousTitre +SubtitlePanel.Format.SUP.Values.Tip=( partir du bas - gauche) taille police; Fond Alpha; Offset Y; Offset X; Largeur X; H(inutilis); V; Offset2 Y; nb max.lignes +SubtitlePanel.SupValues= Val: +SubtitlePanel.Font.LoadError=Erreur en s駘ectionant la police par d馭aut +SubtitlePanel.useTextOutline=Ecrire texte avec contour noir (SUP slt) +SubtitlePanel.useTextOutline.Tip=dessine un contour de 3 pix autour de chaque caract. avec un max de 2 couleurs d'interlocateurs par image, sinon un fond noir est utilis +SubtitlePanel.Font=Police: +SubtitlePanel.Font.Tip=par un export SUP + +#Autoload +autoload.title=liste des r駱ertoires d'entr馥 pr馘馭inis +autoload.dir.remove.tip=enl钁e le r駱ertoire de la liste des chargements auto +autoload.dir.add.tip=ajoute le r駱ertoire la liste des chargements auto +autoload.dir.refresh.tip=rafrachit la liste des fichiers +autoload.ftp.add.tip=ajoute le r駱ertoire d'un serveur ftp la liste des chargements auto +autoload.add.coll.tip=cr馥 une nouvelle collection pour chaque fichier s駘ectionn, contenant ce fichier +autoload.add.file.tip=ajoute fichier(s) la collection +autoload.rename.tip=double clic gauche ou enter pour ajouter un fichier la collection, clic droit pour renommer +autoload.dialog.rename=renommer +autoload.dialog.fileexists=Fichier existant! Ecraser? +autoload.close=ferme la fen黎re + +#splitreset +splitreset.novideo=! -> pas de vid駮 PTS, segmentation d駸activ馥 + +#checkpts +checkpts.1st.latter=!> 1er PTS video commence apr鑚 le dernier PTS de ce flux! critique pour la Sync +checkpts.last.ends=!> dernier PTS video finit avant le d饕ut du PTS de ce flux! Sync impossible + +#parseSecondaryPES +parseSecondaryPES.continue=-> continuer en utilisant des donn馥s brutes extraites de +parseSecondaryPES.demux.pes=d駑ultiplexage fichier PES +parseSecondaryPES.missing.startcode=!> code d饕ut absent @ +parseSecondaryPES.found.startcode=!> code d饕ut trouv @ +parseSecondaryPES.packet.length=-> ! la longueur du paquet est 0 @ +parseSecondaryPES.miss.next.startcode=!> code d饕ut suivant absent @ {0} sur {1} (PES-ID 0x{2}), paquet rejet.. +parseSecondaryPES.packs=paquets: {0} {1}% {2} +parseSecondaryPES.found.pesid=-> trouv PES-ID 0x{0} {1} @ {2} +parseSecondaryPES.ac3.audio=--> AC-3/DTS Audio +parseSecondaryPES.teletext=--> T駘騁exte +parseSecondaryPES.mpeg.audio=--> MPEG Audio +parseSecondaryPES.lpcm.audio=--> LPCM Audio +parseSecondaryPES.subpic=--> Sous-titre +parseSecondaryPES.eof.error=EOF parseSecondaryPES atteint en erreur: +parseSecondaryPES.io.error=Erreur E/S fichier parseSecondaryPES: +parseSecondaryPES.msg.noexport=--> pas de flux + +#ID type +idtype.mpeg.video.ignored=(MPEG Vid駮) -> ignor +idtype.mpeg.audio=(MPEG Audio) +idtype.private.stream=(flux priv 1) +idtype.mpeg.video=(MPEG Vid駮) +idtype.mapped.to= mapp sur 0x +idtype.mapped.to.e0= mapp sur 0xE0 +idtype.ignored= -> ignor +idtype.video=(Vid駮) +idtype.main.audio=(audio principale) +idtype.additional=(additionelle) +idtype.has.pesid= a PES-ID 0x + +#parsePrimaryPES +parsePrimaryPES.special.pes=-> special PES-IDs pour recherche d馭ini +parsePrimaryPES.continue=continuer avec fichier +parsePrimaryPES.demuxing=d駑ultiplexage +parsePrimaryPES.converting=conversion +parsePrimaryPES.avpes.file=fichier PES A/V +parsePrimaryPES.missing.startcode=!> code d饕ut absent @ +parsePrimaryPES.found.startcode=!> code d饕ut trouv @ +parsePrimaryPES.split.cellids=-> VobID {0} CellID {1} @ {2} (GOP#{3} / Frame#{4}) +parsePrimaryPES.packet.length=-> ! la longueur du paquet est 0 @ +parsePrimaryPES.miss.startcode=!> code d饕ut suivant absent (taille paquet=0) @ {0} sur {1} /I-Buffer {2} +parsePrimaryPES.miss.startcode2=!> code d饕ut suivant absent @ {0} sur {1} (PES-ID 0x{2}), paquet rejet.. +parsePrimaryPES.packs=paquets +parsePrimaryPES.dump.1st=-> dump du 1er paquet dans le fichier +parsePrimaryPES.found.pesid=-> trouv PES-ID 0x +parsePrimaryPES.pes.incoming=!> PES-ID 0x{0}, paquet PES entrant sans charge ou donn馥s d'en-t黎e erron @ {1} +parsePrimaryPES.actual.written=-> vframes r馥llement 馗rites: +parsePrimaryPES.switch=basculement sur fichier: +parsePrimaryPES.ac3=--> AC-3/DTS Audio +parsePrimaryPES.teletext=--> T駘騁exte (SubID 0x +parsePrimaryPES.mpeg.audio=--> MPEG Audio (0x +parsePrimaryPES.lpcm.audio=--> LPCM Audio (SubID 0x +parsePrimaryPES.subpic=--> Sous-image (SubID 0x +parsePrimaryPES.eof.error=EOF parsePrimaryPES atteint en erreur: +parsePrimaryPES.io.error=Erreur E/S fichier parsePrimaryPES: +parsePrimaryPES.msg.noexport=--> pas de flux (0x + +#parseTS +parseTS.sid=-> ID Service 0x +parseTS.pmt.refers=-> PMT 0x{0} se rapporte ces flux utilisables: +parseTS.no.pmt=-> pas de PMT trouv (scan rapide) +parseTS.special.pids=-> PID special d馭ini pour recherche +parseTS.continue=continuer avec fichier: +parseTS.demuxing=d駑ultiplexage +parseTS.converting=conversion +parseTS.dvb.mpeg= fichier DVB MPEG-TS +parseTS.incomplete=!> paquet ts incomplet, EOF d騁ect @ +parseTS.comp.failed=!> le traitement du paquet ts a 馗hou :-( +parseTS.missing.sync=!> octet sync. absent @ +parseTS.comp.ok=!> le traitement du paquet ts est ok :-) +parseTS.found.sync=!> octet sync. trouv @ +parseTS.bit.error=!> PID 0x{0} -> erreur bit TS dans paquet {1} @ pos. {2}, rejet.. +parseTS.stuffing=-> PID 0x1FFF => bourrage du paquet -> ignor +parseTS.scrambled=-> PID 0x{0} => marqu en tant que donn馥s crypt馥s, paquet {1} @ {2} -> ignor +parseTS.clear=-> PID 0x{0} => obtention donn馥s claires, paquet {1} @ {2} +parseTS.outof.sequence=!> PID 0x{0} -> paquet {1} @ pos. {2} hors s駲uence ({3}/{4}) (d馗alage..) +parseTS.priv.stream2.ignored=-> PID 0x{0}(flux priv 2) -> ignor +parseTS.scrambled.notignored=-> PID 0x{0} => marqu en tant que donn馥s cod馥s (pas ignor){1} +parseTS.ignored= -> ignor +parseTS.pid.has.pes=ok> PID 0x{0} a PES-ID 0x{1} {2} +parseTS.lackof.pes=!> PID 0x{0} manque de donn馥s PES -> paquet ignor +parseTS.actual.vframes=-> vframes 馗rites: +parseTS.tryto.complete=!> essai de traiter les paquets ts incomplets... +parseTS.packs=packs: {0} {1}% {2} +parseTS.ac3.audio=--> AC-3/DTS Audio sur PID 0x +parseTS.teletext.onpid=--> T駘騁exte sur PID 0x +parseTS.mpeg.audio=--> MPEG Audio (0x{0}) sur PID 0x{1} +parseTS.subpicture=--> Sous-titre (SubID 0x +parseTS.eof.error=EOF raw atteint en erreur: +parseTS.io.error=Erreur E/S fichier raw: +parseTS.switch.to=basculement sur fichier: +parseTS.msg.noexport=--> pas de flux (0x{0}) sur PID 0x{1} + +#nextfile +nextfile.io.error=Erreur E/S fichier suivant: +nextfile.shift.auto=-> d馗alage automatique PTS initial, en arri鑽e de {0} heure(s) +nextfile.shift.manual=-> d馗alage manuel PTS initial, en arri鑽e de {0} heure(s) +nextfile.next.file.start=-> prochaines donn馥s commencent avec PTS: {0} / dernier PTS r馥l est {1} +nextfile.next.file.start.adaption=-> utilisez nouveau d馗alage PTS: {0} pour les donn馥s suivantes + +#overlapPVA +overlappva.io.error=erreur lecture recouvrement: + +#parsePVA +parsePVA.special.pids=-> special PIDs pour recherche d馭init +parsePVA.streamtype.ac3= (AC-3/DTS) +parsePVA.streamtype.ttx= (TTX) +parsePVA.streamtype.mpeg.audio= (MPEG Audio) +parsePVA.streamtype.mpeg.video= (MPEG Video) +parsePVA.continue=continue avec fichier: +parsePVA.demuxing=d駑ultiplexage +parsePVA.converting=conversion +parsePVA.pvafile= fichier PVA +parsePVA.missing.sync=!> mot sync. absent @ +parsePVA.found.sync=!> mot sync. trouv @ +parsePVA.file.overlap=Recouvrement-Fichier d騁ect @ : +parsePVA.packs=paquets +parsePVA.found.id=-> ID trouv 0x +parsePVA.outof.sequence=!> ID 0x{0} -> paquet {1} @ pos. {2} hors s駲uence ({3}/{4}) (d馗alage..) +parsePVA.id.0x=-> ID 0x +parsePVA.actual.vframes=-> vframes r馥llement 馗rites: +parsePVA.ac3.onid=--> Audio AC-3/DTS sur ID 0x +parsePVA.teletext.onid=--> T駘騁exte sur ID 0x +parsePVA.mpeg.audio.onid=--> Audio MPEG sur ID 0x +parsePVA.eof.error=EOF pva atteint en erreur: +parsePVA.io.error=Erreur E/S Fichier pva: +parsePVA.msg.noexport=--> flux manquant sur ID (0x + +#Audioprocess +audio.progress=contrle & synchronise le fichier audio +audio.status.pre-insert=pre-insertion... +audio.status.insert=insertion... +audio.status.write=馗riture... +audio.status.pause=pause... +audio.status.add=ajout... +audio.status.finish=fin... +audio.convert=-> convertit MPA : +audio.decode=-> decode MPA : +audio.restart=!> relance traitement audio, forc par des modifications @ 馗hantillon sortie # +audio.error.io=erreur fichier E/S: +audio.msg.pts.discard=!> {0} PTS rejet駸 dans flux +audio.msg.pts.firstonly=-> prend seulement le premier Audio PTS (pour sync. le point de d駱art) +audio.msg.pts.start_end=Audio PTS: premier paquet {0}, dernier paquet +audio.msg.pts.mismatch=-> !! video & audio PTS ne correpondent jamais! +audio.msg.pts.wo_frame=!> PTS sans frame +audio.msg.adjust.at.videopts=-> ajustement de l'audio avec le video-timeline +audio.msg.adjust.at.ownpts=-> ajustement de l'audio avec son propre timeline +audio.msg.addriff.acm=-> ajoute l'en-t黎e RIFF WAVE au fichier Audio MPEG en tant que format Wave ACM +audio.msg.addriff.bwf=-> ajoute l'en-t黎e RIFF WAVE au fichier Audio MPEG en tant que format Wave BWF +audio.msg.addriff.ac3=-> ajoute l'en-t黎e RIFF WAVE au fichier Audio AC -3 +audio.msg.syncword.lost=!> mot sync. manquant @ {0}, @ +audio.msg.syncword.found=!> mot sync. trouv @ +audio.msg.frame.discard=!> rejette l'image# +audio.msg.crc.error=!> d馭aut v駻if. CRC{0} @ +audio.msg.source=-> src_audio: {0} @ +audio.msg.source.max=-> src_audio: arr黎e l'affichage, plus de 100 changements de mode audio dans un fichier r馘uit la vitesse de traitement +audio.msg.summary.skip=!> sourceframe(s) saut駸 @ +audio.msg.summary.pre-insert=!> {0} frame(s) ({1}ms) pr-ins駻馥s @ +audio.msg.summary.insert=!> {0} frame(s) ({1}ms) ins駻馥s @ +audio.msg.summary.add=!> {0} frame(s) ({1}ms) ajout馥s @ +audio.msg.summary.frames=馗hantillons audio: 馗r-pr-saut-ins-ajou {0} @ {1} fait... +audio.msg.summary.jstereo=-> {0} changement(s) st駻駮/jointst駻駮 d騁ect駸... +audio.msg.audio=Audio +audio.msg.newfile.left=(gauche): +audio.msg.newfile.right=(droite): +audio.msg.noaudio=!> pas d'Audio trouv dans ce flux de donn馥s... +audio.msg.convert.disabled=!> l'image source ne correspond pas aux crit鑽es de transcode, fonction d駸activ馥.. (image# {0}) +audio.msg.convert.error=!> l'image source a g駭駻 une erreur de conversion (erreur {0}), (image# {1}) + +#Videoprocess +video.msg.pts.start_end=PTS Video: d饕ut 1.GOP {0}, fin dern. GOP +video.msg.summary=-> Vid駮: fr-ct-1p-cg-og-dg -> +video.progress=analyse le fichier du flux vid駮 +video.msg.skip.sec=-> sauter code_fin_sequence apr鑚 le GOP# {0} @ +video.error.io=!> erreur acc鑚 vid駮 pure +video.msg.error.lackofdata=!> GOP# {0} - manque de donn馥s, ignor... +video.msg.error.nopts.use_goptc=!> GOP# {0} pas de PTS, utilise GOP TC pour sync +video.msg.error.nopts.use_lastpts=!> GOP# {0} pas de PTS, utilise le dernier PTS pour sync +video.msg.basics=-> video basics: +video.msg.newformat=GOP# {0}, nouveau format d騁ect dans le prochain en-t黎e de s駲uence: +video.msg.error.pesext_in_es=!> GOP# {0}, en-t黎e PES et extension trouv駸 dans ES, remplis avec z駻o... (GOP offs. {1}) +video.msg.error.pes_in_es=!> GOP# {0}, en-t黎e PES trouv dans ES, rempli avec z駻o... (GOP offs. {1}) +video.msg.error.frame.wrong=!> type image faux {0}, temps +video.msg.export.start=-> d饕ut d'exportation des donn馥s vid駮 @ GOP# +video.msg.pts.diff=!> diff駻ence de PTS de {0} ({1}) sur le dernier GOP export d騁ect +video.msg.error.brokenlink=(lien_cass饑corrig) +video.msg.frame.drop=!> suppression images-B inutiles @ GOP# {0} / nouveau temps +video.msg.error.frame.not=!> GOP# {0} ne contient pas d'images +video.msg.error.frame.not.i=!> GOP# {0} ne commence pas avec une image-I au temps '0' +video.msg.error.pts.early=!> PTS de d饕ut du GOP# {0} est + tt que la fin du dernier GOP.. (exp. {1}) +video.msg.error.gop.drop=!> suppression GOP# {0} @ PTS orig. {1} ({2}) +video.msg.error.gop.diff=!> Pics exp/cnt {0}, inGOP PTS diff. {1}ms, new Timecode +video.msg.error.gop.dump=-> transf鑽e GOP vers le fichier: +video.msg.io.non=no +video.msg.io.int=entrelac馥s +video.msg.io.pro=progressives +video.msg.io.int_pro=entrelac馥s & progressives +video.msg.length=-> Taille vid駮: {0} frames @ +video.msg.gop.summary=-> r駸um GOP: champs min. {0}, max. {1}; contient images {2} +video.error.pts.same=-> {0} GOP trouv駸 avec le m麥e PTS, mais des images diff駻entes! +video.summary=.Vid駮 {0}:\t{1} Images\t{2}\t\t +video.msg.bitrate.avg=-> bitrate moyen {0}bps (min/max: {1}) +video.msg.bitrate.avgnom=-> bitrate nom. moyen {0}bps (min/max: {1}) +video.msg.bitrate.vbr=-> mettre bitrate du 1er en-t黎e de s駲uence en VBR +video.msg.bitrate.val=-> mettre bitrate du 1er en-t黎e de s駲uence {0}bps +video.msg.resolution=-> passer r駸olution du 1er en-t黎e de s駲uence de {0} + +#Teletextprocess +teletext.msg.nooutput=!> pas de format de sortie pour le t駘騁exte specifi... +teletext.msg.output=-> format d'export.: +teletext.msg.tmpfile=-> fichier temp.: {0} ({1} bytes) +teletext.msg.page=num駻o de page +teletext.msg.megaradio=flux mp3 MegaRadio +teletext.progress=recherche & d馗odage +teletext.msg.search=-> recherche +teletext.status=pages: +teletext.msg.discard=!> {0} PTS rejet駸 dans le flux +teletext.msg.pts.start_end=T駘騁exte PTS: 1er paquet {0}, dernier paquet +teletext.msg.pts.missed=!> le flux t駘騁exte n'utilise pas de PTS, sync impossible +teletext.msg.pts.mismatch=!> les PTS vid駮 & t駘騁exte ne correspondent jamais! +teletext.msg.adjust.at.video=->ajustement t駘騁exte au temps vid駮 +teletext.msg.adjust.at.own=-> ajustement t駘騁exte son propre temps +teletext.msg.syncword.lost=!> mot synchro absent @ +teletext.msg.syncword.found=!> mot synchro trouv @ +teletext.msg.vps=-> statut VPS : {0} @ PTS +teletext.msg.provider=-> fournisseur: +teletext.msg.program=-> programme: +teletext.msg.summary={0} pages sur {1} 馗rites... +teletext.summary=T駘騁exte {0}:\t{1} pages sur {2}\t{3}\t +teletext.error.eof=!> EOF T駘騁exte atteint en erreur: +teletext.error.io=!> Erreur {0} E/S t駘騁exte / +teletext.msg.newrun=-> ex馗ute le d馗alage Y sur le 2nd SUP + +#Subpictureprocess +subpicture.msg.error3=!> erreur en d馗odant Sous-titres DVB +subpicture.msg.error4=!> manque de donn馥s de paquet +subpicture.msg.error5=!> la taille des paquets diff. des paquets donn駸 +subpicture.msg.error6=!> index position erron +subpicture.msg.error7=!> position erron馥 +subpicture.msg.error8=!> fin d'index erron馥 +subpicture.msg.error9=!> fin erron馥 +subpicture.msg.model=-> mod鑞e de couleur s駘ectionn馥 de la sous-image DVB: {0} ; fix en id page: +subpicture.msg.output=-> format d'export.: +subpicture.msg.tmpfile=-> fichier temp.: {0} ({1} bytes) +subpicture.progress=v駻if. & sync. +subpicture.msg.discard=!> {0} PTS rejet駸 dans le flux +subpicture.msg.pts.mismatch=!> les PTS vid駮 & sous-titres ne correspondent jamais! +subpicture.msg.adjust.at.video=-> ajustement sous-titres au temps vid駮 +subpicture.msg.adjust.at.own=-> ajustement sous-titres son propre temps +subpicture.msg.syncword.lost=!> mot synchro absent @ +subpicture.msg.syncword.found=!> mot synchro trouv @ +subpicture.msg.error={0} @ {1}, rejet image... +subpicture.msg.dvbsource=-> le source est un sous-titre DVB... +subpicture.status=images: +subpicture.preview.title.dvdexport=/ image {0} -> en: {1} dur馥: +subpicture.preview.title.dvbexport=/ id page {0} / image {1} -> en: {2} dur馥: +subpicture.msg.forced=de l'image +subpicture.msg.forced.no=-> affichage statut: non forc, +subpicture.msg.forced.yes=-> affichage statut: forc, +subpicture.preview.title.noexport=/ image non export... +subpicture.msg.pts.start_end=PTS sous-titres: 1er paquet {0}, dernier paquet +subpicture.msg.summary={0} lignes de sous-titres 馗rites... +subpicture.summary=Sous-titres {0}:\t{1} sous-titres\t{2}\t +subpicture.msg.error.eof=!> EOF sous-titres atteint en erreur: +subpicture.msg.error.io=!> Erreur {0} E/S sous-titres / +subpicture.msg.error.dvbdecoding=!> erreur de d馗odage: {0}, Id Region {1} (pts {2}) + +#LPCMprocess +lpcm.msg.develop=...en d騅eloppement... +lpcm.msg.tmpfile=-> fichier temp.: {0} ({1} octets) +lpcm.progress=v駻if. & sync. +lpcm.msg.pts.mismatch=!> vid駮 & LPCM PTS ne correspondent jamais! +lpcm.msg.adjust.at.video=-> ajustement LPCM au temps de la vid駮 +lpcm.msg.adjust.at.own=-> ajustement LPCM son propre temps +lpcm.msg.syncword.lost=!> mot de synchro absent @ +lpcm.msg.syncword.found=!> mot de synchro trouv @ +lpcm.msg.source=-> src_audio: {0} @ +lpcm.msg.source.max=-> src_audio: stop displaying, more than 100 audio mode changes in one file reduce work speed +lpcm.msg.error.align=!> paquet non align (en WORD) +lpcm.msg.pts.start_end=LPCM PTS: 1er paquet {0}, dernier paquet +lpcm.msg.summary={0} paquets 馗rits... +lpcm.summary=LPCM {0}:\t{1} paquets\t{2}\t +lpcm.error.eof=!> EOF LPCM atteint en erreur: +lpcm.error.io=!> Erreur {0} E/S LPCM / + +#various +all.msg.pts.faked=--> utilisation faux PTS pour donn馥s suivantes: +logalias.error.io=!> Erreur E/S alias de Log: +all.msg.error.max=-> plus de 500 averti./erreurs, arr黎e le log.. +all.msg.error.summary=-> il y a {0} avertissements/erreurs. +all.msg.noprimaryfile=!> le type de fichier n'est pas support en fichier secondaire. V駻ifiez l'ordre/segmentation des fichiers. + +#demux +demux.error.audio.startcode=!> code d饕ut invalide, refus du paquet PES +demux.error.audio.io=!> erreur demux Audio: +demux.error.video.io=!> erreur demux Video: +demux.msg.celltimes=--> Celltimes in: {0}CellTimes.txt +demux.error.video.startcode=!> code d饕ut invalide, refus du paquet vid駮 PES +demux.error.video.payload=!> le paquet PES entrant n'a pas de contenu ou a des donn馥s d'en-t黎e erron馥s +demux.msg.skip.sec=-> saut du code_sequence_fin du GOP# +demux.error.gop.toobig=!> abandon de donn馥s vid駮, GOP sup駻ieur 6MB + +#ftpchooser +ftpchooser.server.tip=Nom ou adresse IP du serveur ftp +ftpchooser.server=Serveur: +ftpchooser.port.tip=Port du serveur ftp +ftpchooser.port=Port: +ftpchooser.user.tip=Utilisateur pour connexion ftp +ftpchooser.user=Utilisateur: +ftpchooser.password.tip=Mot de passe pour connexion ftp +ftpchooser.password=Mot de passe: +ftpchooser.directory.tip=R駱ertoire sur le serveur ftp +ftpchooser.directory=R駱ertoire: +ftpchooser.test=Test +ftpchooser.state.tip=Etat +ftpchooser.state=Etat: +ftpchooser.untested=non test, essayez de vous connecter +ftpchooser.ok=OK +ftpchooser.cancel=Annuler +ftpchooser.title=Choix du serveur ftp +ftpchooser.msg.noconnect=Ne peut pas se connecter. +ftpchooser.msg.nologin=Ne peut pas se logger. +ftpchooser.msg.nodirectory=Ne peut pas changer de r駱ertoire. +ftpchooser.msg.success=Tout est OK. +ftp.command.label=Commande FTP: +ftp.command.tip=commandes utilisateur FTP pour un acc鑚 FTP, pour plusieurs commandes, utilisez le s駱arateur '|' +FtpServer.Commands=Commande FTP: +FtpServer.Commands.Tip=commandes utilisateur FTP pour un acc鑚 FTP, pour plusieurs commandes, utilisez le s駱arateur '|' +FtpPanel.Title=Configuration FTP + + +#JobCollection +JobCollection.NoInfo=pas d'info +JobCollection.InProgress=En cours! +JobCollection.Idle=En attente. +JobCollection.Action=Action: +JobCollection.unspecified=pas de sp馗if. +JobCollection.PrimaryFileSegments=Segments fichiers: +JobCollection.SecondaryFiles=Fichiers second.: +JobCollection.Cutpoints=Points coupure: +JobCollection.Chapters=Chapitres: +JobCollection.PidSelection=S駘ection PID: +JobCollection.OwnSettings=sep.Config: +JobCollection.AllSize=Taille \u03A3: + +#CollectionTable +CollectionTable.FileLocation=Emplacement +CollectionTable.FileName=Nom fichier +CollectionTable.Size=Taille +CollectionTable.lastModified=Date modification +CollectionTable.Streamtype=Type flux +CollectionTable.Source=Src + +#PreviewPanel +PreviewPanel.saveCurrentPicture=sauvegarder image courante.. +PreviewPanel.saveCurrentPictureDAR=sauvegarder image courante avec DAR.. + +#NetPanel +NetPanel.WebServerPort=Port: +NetPanel.WebServerAccess=AccessString: +NetPanel.autostartWebServer=autostart WebIFServer diff -Nru project-x-0.90.4dfsg/resources/pjxresources_it.properties project-x-0.91.0/resources/pjxresources_it.properties --- project-x-0.90.4dfsg/resources/pjxresources_it.properties 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/resources/pjxresources_it.properties 2009-10-03 09:23:48.000000000 +0000 @@ -0,0 +1,1268 @@ +# Project-X Resource File +# italian, V1.0 +# by mfsav + +# Credits +credits=dvb.matt - creatore di Project-X\n\ +Lucike - responsabile del Forum, documentazione\n\ +TheHorse - gestione della preview con la tastiera\n\ +java.lang - patch della librearia H-resolution\n\ +R-One - supporto DTS\n\ +ghost - gestione dei file segmentati del dreambox\n\ +roehrist - CVS, X-input, ftp\n\ +pstorch - supporto i18n, configurazione\n\ +chrisg - Topfield disk access (AddOn)\n\ +jazzydane - traduttore Danese\n\ +Kano / RoEn - Unix buils script\n\ +Eric Albert - BrowserLauncher\n\ +catapult,Bonni - Topfield 5x00 export\n\ +...and chiunque altro abbia collaborato... + +# +Common.File=&File +Common.Save=&Salva +Common.SaveAs=Salva &come... +Common.Open=&Apri.. +Common.Load=Ca&rica.. +Common.Edit=Mod&ifica +Common.Messages=&Messaggi +Common.Options=&Opzioni +Common.Close=C&hiudi +Common.Cancel=Ca&ncella +Common.Exit=&Esci +Common.LogFile=&File di log +Common.Preferences=Confi&gurazione +Common.Addons=A$ddons + +General.Yes=Si +General.No=No + +StartUp.Title=X Startup, caricamento componenti... +StartUp.Error=Errore nell'avvio di Project-X: +StartUp.Error.Title=Project-X Errore di avvio +StartUp.Init=Inizializzazione. +StartUp.Wait=Per favore attendere... +StartUp.Choose=Scegliere un opzione... + +# +PreferencesPanel.Title=Configurazione +PreferencesPanel.Button=Configurazione + +Application.SaveSettingsOnExit=Salvare la configurazione in uscita +Application.InputDirectoriesDepth=Cartella di espansione (solo in modo FILE) + +# Popupmenu +popup.what=cosa +popup.cutspecials=apri Cut/Specials.. +popup.url=aggiungi URL.. +popup.add=aggiungi.. +popup.remove=rimuovi +popup.rename=rinomina.. +popup.openhex=aprin in Hexviewer.. +popup.patchbasics=modifica Video Basics.. +popup.sendtocl3=manda a CL#3.. +popup.newOutName=nuovo file destinazione come.. +popup.changeTimestamp=aggiorna timestamp del file.. +popup.copyInfoToClipboard=copia informazioni del file nella clipboard +popup.assignStreamType=assegna direttamente il tipo di stream.. +popup.automatic=automatico +popup.assignActionType=assegna direttamente il tipo di azione.... +popup.unspecified=non specificato +popup.fixHpAc3=crea un file ac3 con l'header corretto.. +popup.stripAudio=rimuovi raw audio data dalle traccie DD/DTS-Wave.. + +#Filechooser +FileChooser.Select=Scegli +FileChooser.Title=Selezione + +#File Menu +file.menu=&File +file.url=Aggiungi &URL.. +file.add=&Aggiungi.. +file.remove=&Rimuovi +file.rename=Ri&nomina.. +file.exit=&Uscita + +#dialog +dialog.input.url=inserisci una URL.. + +#Settings Menu +settings.menu=&Configurazione +settings.settings=&Configurazione.. + +#Language Menu +language.menu=&Lingua +language.system=Default di S&istema +language.check=aggiorna &online + +#General Menu +general.menu=&Visualizza + +#Options Menu +options.menu=M&odifica +options.opencutspecials=open &VideoCut/Specials.. +options.openhexview=apri in &HexViewer.. +options.pachtbasics=&modifica i Video Basics.. +options.subtitlepreview=mostra la preview dei &Sottotitoli.. +options.teletext=mostra la matrice &Teletext.. + +#Help Menu +help.menu=&Aiuto +help.about=A&bout.. +help.help=&Aiuto.. +help.lucike.info=http://www.lucike.info +help.lucike.forum=http://forum.lucike.info +help.sourceforge.net=http://sourceforge.net/projects/project-x +help.version=&Ultima Versione? +help.version.info=Ultima versione: +help.version.info.title=Ultima versione di Project-X +help.version.error=Errore le recuperare le informazione sull'ultima versione: + +progress.title=Progresso + +#Html Frame +html.title=Aiuto + +#Buttons +button.go=&Inizia! +button.go.Tip=inizia, pausa o ricomnicia l'elaborazione +button.i=&I +button.i.Tip= veloce elaborazione per estrarre gli ID trovati nello stream (in un primo pezzo, configurabile in Output) +button.c=&C +button.c.Tip=cancel l'elaborazione +button.p=&P +button.p.Tip=ferma(pausa) o continua l'elaborazione corrente +button.e=&E +button.e.Tip=Estrazione Raw dei file PVA, usando un ID spcifico (usare I per recuperare gli ID disponibili) + +#Mainpanel +MainPanel.Collection=Collezione +MainPanel.Process=Attivit +MainPanel.Process.Tip=se non Demux, converte un formato in un altro (copia gli stream senza fare correzione d'errore!!) +MainPanel.BitrateMonitor.Tip=bitrate del GOP da 0..10Mbps (dipende dal tipo di elaborazione / struttura del gop / istante nel video) +MainPanel.writtenMB=output MB +MainPanel.writtenMB.Tip=MB scritti nei file di destinazione della collezione (senza file temporanei) +MainPanel.useAllCollections=elabora tutte le Collezioni +MainPanel.useAllCollections.Tip=abilitato processa tutte le collezioni con una sola esecuzione +MainPanel.enablePostProcessing=abilita la post elaborazione +MainPanel.enablePostProcessing.Tip=abilita la post elaborazione (->configurato in comandi esterni -> se i campi non sono vuoti) +MainPanel.simpleMPG=MPG=>sPES +MainPanel.simpleMPG.Tip=semplice analisi dei PES, va abilitato per MPEG-PS con data senza un sub ID di tipo private_stream_1 +MainPanel.enhancedPES=sPES=>MPG +MainPanel.enhancedPES.Tip=analisi avanzata dei PES, va abilitato per MPEG-PS con data nel sub ID di tipo private_stream_1 +MainPanel.nonVideoExportStatus=non iniziato +MainPanel.nonVideoExportStatus.Tip=stato del dell'esportazione audio o numero di pagine/subpictures scritte +MainPanel.AudioVideoOffset=sfasamento A/V +MainPanel.AudioVideoOffset.Tip=mostra lo sfasamento A/V all'inizio di ogni GOP in ms: a/b/c

(i tagli causano differenti scostamenti)

a) Scostamento A/V nella PTS sorgente

b) Scostamento del frame A/V iniziale nel GOP attuale nel file demultiplexato

c) nuovo scostamento A/V effettivo nel GOP attuale nel file demultiplexato +MainPanel.ConversionMode.demux=demultiplexa +MainPanel.ConversionMode.toVDR=in VDR +MainPanel.ConversionMode.toM2P=in M2P +MainPanel.ConversionMode.toPVA=in PVA +MainPanel.ConversionMode.toTS=in TS +MainPanel.ConversionMode.PidFilter=Filtro PID (1:1 Copy) +MainPanel.ConversionModePriority=Collezione ha la priorit +MainPanel.ConversionModePriority.Tip=usa azioni di tipo Collezione +MainPanel.useAutoPidFilter=applica il filtro PMT-PID +MainPanel.useAutoPidFilter.Tip= +MainPanel.QuickStart=Avvio veloce +MainPanel.QuickStart.Tip=avvia subito l'elaborazione, usando l'ultima configurazione + +ProcessWindow.Title=Finetra di elaborazione +ProcessWindowPanel.Button=prepara >> +ProcessWindowPanel.Title=Messaggi di Notifica +ProcessWindowPanel.Action=Azione: + +#Tab.msg +MessagePanel.Title=gestione dei messaggi +MessagePanel.logSequenceError=notifica 'packets out of sequence' / 'bit errors' +MessagePanel.logSequenceError.Tip=disabilitare se la crea problemi nalla finesrta di notifica (e diminuisce la velocit di elaborazione) +MessagePanel.logMissingStartcode=notifica 'missing startcodes' +MessagePanel.logMissingStartcode.Tip=disabilitare se la crea problemi nalla finesrta di notifica (e diminuisce la velocit di elaborazione) +MessagePanel.logESError=notifica 'PES header found in ES' +MessagePanel.logESError.Tip=disabilitare se la crea problemi nalla finesrta di notifica (e diminuisce la velocit di elaborazione) +MessagePanel.leadingTimeIndex=aggiugni l'istante di elaborazione a tutti i messaggi di notifica +MessagePanel.leadingTimeIndex.Tip= +MessagePanel.logWSS=notifica WSS +MessagePanel.logWSS.Tip= +MessagePanel.logVPS=notifica VPS +MessagePanel.logVPS.Tip= +MessagePanel.logRDS=notifica RDS +MessagePanel.logRDS.Tip= +MessagePanel.hideProcessWindow=nascondi la finestra di elaborazione durante l'attivit +MessagePanel.hideProcessWindow.Tip= +MessagePanel.minimizeMainFrame=minimizza la finestra principale durante l'attivit +MessagePanel.minimizeMainFrame.Tip= +MessagePanel.showSubpictureWindow=mostra la preview delle subpicture preview duarante la loro creazione +MessagePanel.showSubpictureWindow.Tip= +MessagePanel.logErrorMaximum=notifica al massimo 500 warnings/errori +MessagePanel.logErrorMaximum.Tip= + +#usage note +usage=Utilizzo veloce da linea di comando (CL): \n\ +Nota: la CL non carica l'interfaccia grafica ne i componenti, a meno che non sia specificato le opzione [-gui]\n\ + ...avvia l'interfaccia grafica\n\ +le opzioni e i file di ingresso possono essere in qualunque ordine\n\ +\n\ +opzioni:\n\ +[-ini ] ..usa il file di configurazione (inifile) al posto di quello standard\n\ +[-dvx1] ..crea un .d2v ProjectFile durate l'elaborazione\n\ +[-dvx2] ..crea un .d2v ProjectFile + .ac3.wav (RIFF WAVE Header)\n\ +[-dvx3] ..crea un .d2v ProjectFile + .mpa.wav (RIFF WAVE Header)\n\ +[-dvx4] ..crea un .d2v ProjectFile + .ac3.wav + mpa.wav (RIFF WAVE Header)\n\ +[-out ] ..usa il percorso specificato come destinazione\n\ +[-name ] ..usa il nome file specificato come destinazione\n\ +[-cut ] ..usa il file di testo come riferimento per i tagli\n\ +[-chp ] ..usa il file di testo come riferimento per i capitoli\n\ +[-id ] ..use solo questi (P)IDs, separati da virgole\",\"\n\ +[-gui] ..avvia l'interfaccia grafica usando tutte le opzioni specificate\n\ +[-log] ..scrive il file delle notifiche\n\ +[-saveini] ..salva le modifiche fatte con le opzioni nel file di configurazione attivo\n\ +[-split ] ..divide il file di destinazione a xxx MB\n\ +[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..tipi di azioni + +#conditions +terms=\n\ +CONDIZIONI D'USO:\n\ +(1) questa una programma gratuito basato su Java per demultiplexare file A/V.\n\ +(2) E' solo per scopo educativo, come un progetto non commerciale.\n\ +(3) E' rilasciato sotto le condizioni del GNU GPL.\n\ +(4) Non esiste in alcun caso NESSUNA GARANZIA di nessuna natura collegata a questo software.\n\ +(5) Usatelo a vostro rischio e per imparare.\n\ + +terms.disagree=NON sono d'accordo (uscita) +terms.agree=Sono d'accordo + +startup.Title=X Startup, caricamento componenti... +startup.Error=Errore nell'avvio di Project-X: +startup.Error.Title=Project-X Errore di avvio + +about.title=Informazioni.. +about.ok=Ok +about.credits.label=Ringraziamenti: + +#version info +version.info=PROGETTO DI TEST +version.user=, Utente: + +#JavaEV +javaev.java.version=java.version +javaev.java.vendor=java.vendor +javaev.java.home=java.home +javaev.java.vm.version=java.vm.version +javaev.java.vm.vendor=java.vm.vendor +javaev.java.vm.name=java.vm.name +javaev.java.class.vers=java.class.vers +javaev.java.class.path=java.class.path +javaev.java.os.name=os.name +javaev.java.os.arch=os.arch +javaev.java.os.version=os.version +javaev.java.user.name=user.name +javaev.java.user.home=user.home +javaev.java.user.lang=user.language +javaev.java.ini.file=ini.file +javaev.java.disk.access=ext.disk.access + +#messages +msg.infomessage=Informazioni +msg.new.language=Il cambio di lingua richiede di riavviare Project-X. +msg.loadlang.error=errore caricando il linguaggio: +msg.init.error=errore di inizializzazione: +msg.loadini.error=errore nel caricamento ini: +msg.saveini.error=errore nel salvataggio ini: +msg.loading.cutpoints=-> caricando i tagli {0}... +msg.loading.cutpoints.error=errori nel caricamento dei tagli +msg.loading.pids=-> caricando i (P)IDs {0}... +msg.ptsfile.error=..errore nel caricamento del ptsfile : +msg.savecut=-> salvando i PTS di taglio ({0}) nel file.. +msg.savecut.error=errori nel salvataggio dei tagli: +msg.log.error=errore nelle notifiche: +msg.cuts.cutin=-> taglio di ingresso @ GOP# {0} / nuovo vframe {1} / nuovo Timecode {2} +msg.cuts.cutout=-> taglio di uscita @ GOP# {0} +msg.newfile=---> file di destinazione: +msg.browser.launcher.error=errore nell'avvio del browser: + +#Hex Viewer +hexviewer.title=Hex Viewer +hexviewer.file=Hex Viewer per il file +hexviewer.filesize= Dimensione +hexviewer.error=..impossibile accedere al file +hexviewer.save=Hex Viewer, salvando +hexviewer.close= chiudi +hexviewer.to=a +hexviewer.extractfrom=estrai da: (hex.) +hexviewer.extractfrom_tip=click per estrarre nel file +hexviewer.extract_tip=estrai un segmento del file in una nuova destinazione +hexviewer.jumptohex=Vai a Hex.: +hexviewer.jumptodec=Vai a Dec.: +hexviewer.jumpto_tip=invio per saltare alla posizione nel file +hexviewer.textmode=modo testo + +#TeletextPageMatrix +ttpagematrix.title=Pagina Teletext +ttpagematrix.tip=dimunuisce la velocita di demux, se visibile +ttpagematrix.file=file +ttpagematrix.composition1=teletext pagenumber composition +ttpagematrix.composition2='MXY' : M = magazine number, XY = page number +ttpagematrix.composition3=magazine number colours + +#Scan +scan.unsupported=sconosciuto +scan.msg1=nessun video trovato nel ricerca breve +scan.msg2=nessun audio trovato nel ricerca breve +scan.msg3=nessun teletext trovato nel ricerca breve +scan.msg4=nessun subpicture trovato nel ricerca breve +scan.msg5=nessun PMT trovato nel ricerca breve +scan.msg6=errore nella decodifica PMT (linguaggio) +scan.msg7=trovati dati video, ma nessun sequence header trovato nel ricerca breve +scan.msg8=errore nella verifica +scan.msg9=il file non inizia con un sequence header! + +#TS +ts.msg1=!> nessun IDs trovato ! ..utilizzo PMT fisso + +#WSS +wss.run_in=trovato Run-In-Code +wss.no_run_in=nessun Run-In-Code trovato +wss.startcode=trovato Start-Code +wss.no_startcode=nessun Start-Code trovato +wss.start=inizio +wss.group_1=Group 1 (Picture Format) +wss.group_2=Group 2 (Picture Enhancements) +wss.group_3=Group 3 (Subtitles) +wss.group_4=Group 4 (others) +wss.group_1.0001=4:3 full format, 576 linee, schermo intero +wss.group_1.1000=14:9 letterbox, 504 linee, centrato +wss.group_1.0100=14:9 letterbox, 504 linee, in alto +wss.group_1.1101=16:9 letterbox, 432 linee, centrato +wss.group_1.0010=16:9 letterbox, 432 linee, in alto +wss.group_1.0111=14:9 full format, 576 linee, centrato, schermo intero +wss.group_1.1110=16:9 full format, 576 linee, schermo intero +wss.group_1.error=errore nell'analisi del group 1 (bits0..3) +wss.group_2.0.01=modo camera +wss.group_2.0.10=modo film +wss.group_2.0.00=errore nell'analisi del bit4 +wss.group_2.1.01=standard PAL +wss.group_2.1.10=MACP (motion adaptive color plus) +wss.group_2.1.00=errore nell'analisi del bit5 +wss.group_2.2.01=nessun helper +wss.group_2.2.10=helper modulation (PALplus) +wss.group_2.2.00=errore nell'analisi del bit6 +wss.group_2.3.01=reservato (0) +wss.group_2.3.10=reservato (1) +wss.group_2.3.00=errore nell'analisi del bit7 +wss.group_3.0.01=nessun sottotitolo nel teletext +wss.group_3.0.10=sottotitoli nel teletext +wss.group_3.0.00=errore nell'analisi del bit8 +wss.group_3.1.00=nessun 'open subtitles' +wss.group_3.1.01='open subtitles' all'interno di immagini attive +wss.group_3.1.10='open subtitles' al di fuori di immagini attive +wss.group_3.1.11=reservato (11) +wss.group_3.1.err=errore nell'analisi dei bit9..10 +wss.group_4.0.01=nessun audio surround +wss.group_4.0.10=audio surround +wss.group_4.0.00=errore nell'analisi del bit11 +wss.group_4.1.01=nessun copyright/sconosciuto +wss.group_4.1.10=copyright definito +wss.group_4.1.00=errore nell'analisi del bit12 +wss.group_4.2.01=copying non ristretto +wss.group_4.2.10=copying ristretto +wss.group_4.2.00=errore nell'analisi del bit13 +wss.group_4.1.err=errore nell'analisi dei bit12..13 + +#Subpicture +subpicture.title=Subtitle PreViewer +subpicture.in_time=in +subpicture.duration=durata +subpicture.msg1=!> errore di scrittura della subpic +subpicture.msg2=!> simple picture packet +subpicture.msg3=!> suppic unknown cmd + +#RawRead +rawread.msg1=disabilitato o libreria non trovata + +#Common +common.rename_error1=!> impossibile rinominare +common.rename_error2=in + +#TabPanel +TabPanel.LogwindowPanel=finestra notifiche +TabPanel.FileinfoPanel=info +TabPanel.MessagePanel=msg +TabPanel.ExportPanel=output +TabPanel.SpecialPanel=special +TabPanel.VideoPanel=video +TabPanel.AudioPanel=audio +TabPanel.SubtitlePanel=subtitle +TabPanel.ExternPanel=extern +TabPanel.OptionPanel=options +TabPanel.NetPanel=net +TabPanel.PostCommandsPanel=postprocess + +#Tab.logwindow +LogwindowPanel.showTtxHeader=TTX +LogwindowPanel.showTtxHeader.Tip=mostra l'intestazione ttx e lo stato VPS (se abilitato diminuisce la velocit) +LogwindowPanel.showTtxHeader.Tip1=intestazione della pagina in trasmissione (row 0) +LogwindowPanel.showVpsLabel.Tip=stato VPS breve (VBI-line 16), pochi canali hanno dati significativi nel VPS sui canali DVB-teletext + +#Tab.options +OptionPanel.Various.Title=varie +OptionPanel.LookAndFeel=interfaccie installate: +OptionPanel.LookAndFeel.Info1=interfaccia preferita +OptionPanel.LookAndFeel.Info2=qualche volta una interfaccia pu andare in crashes internamente +OptionPanel.DebugLog=salva registro notifiche completo +OptionPanel.DebugLog.Tip=riduce la velocit, solo per test. +OptionPanel.NormalLog=salva registro notifiche normale +OptionPanel.NormalLog.Tip=salva il registro notifiche su disco +OptionPanel.dumpDroppedGop=salva i GOPs saltati in file separati +OptionPanel.dumpDroppedGop.Tip=significativo solo per analisi di dettaglio +OptionPanel.StartPath=percorso iniziale per la selezione: +OptionPanel.StartPath.Value.Tip=lasciare vuoto, oppure inserire un percorso, un '?' all'inizio riporta il percorso al valore precedente +OptionPanel.Buffer.Title=Buffer +OptionPanel.MainBuffer=I/O Principale - dimensione in Byte +OptionPanel.MainBuffer.Tip=valori bassi possono evitare errori di 'internal memory overflows' -> Errore di OutOfMemory +OptionPanel.PesPreBuffer=I-dimensione in Byte (solo PES packetsize=0 !) +OptionPanel.PesPreBuffer.Tip=provare valori bassi/alti se si lavora con flussi ad alto bitrate +OptionPanel.ScanBuffer=pre-Scan dimensione in Byte +OptionPanel.ScanBuffer.Tip=provare valori diversi se file corretti non sono riconosciuti +OptionPanel.PreviewBuffer=Preview dimensione in Byte +OptionPanel.PreviewBuffer.Tip=valori bassi velocizzano la visualizzazione anche se sono possibile perdite di elementi +OptionPanel.callGc=garbage collector +OptionPanel.callGc.Tip=chiama il 'garbage collector' +OptionPanel.closeOnEnd=chiudi il programma +OptionPanel.closeOnEnd.Tip=chiudi il programma quando le attivit sono terminate +OptionPanel.holdStreamInfoOnOSD=mantieni le StreamInfo sull'OSD +OptionPanel.holdStreamInfoOnOSD.Tip=mantieni le StreamInfo sull'OSD + +#ScanInfo +ScanInfo.Location=Location: +ScanInfo.Name=Name: +ScanInfo.Size=Size: +ScanInfo.Bytes=bytes +ScanInfo.Type=Type: +ScanInfo.Date=Date: +ScanInfo.Video=Video: +ScanInfo.Audio=Audio: +ScanInfo.Teletext=Teletext: +ScanInfo.Subpicture=Subpict.: +ScanInfo.Playtime=est. Playtime: +ScanInfo.NotFound=FIl file non esiste! + +#Execute +PostCommands.Title=programmi esterni +PostCommands.PostProcessing=comandi post: +PostCommands.PostProcessing.Tip=esegue questo comando dopo che la collezione/taglio sono stati elaborati +PostCommands.Execute=esegui +PostCommands.Close=chiudi +PostCommands.Error=!> errore di esecuzione: + +#Collection +CollectionPanel.Title=Dettagli collezione +CollectionPanel.Title2=Dettagli collezione per coll.# +collection.title.processing=elaborazion anteprima... +CollectionPanel.CutPanel=Anteprima / Tagli video +CollectionPanel.CutPanel.Tip1=usare anche la tastiera per la navigazione, l'anteprima fuzionasolo con i tagli bytepos +CollectionPanel.CutPanel.Tip2=segmento attivo/numero di segmenti + nome file del segmento attivo +CollectionPanel.CutPanel.Tip3=(P)ID elaborato per avere l'immagine corrente +CollectionPanel.CutPanel.Tip4= inserire un numero o drag&drop un file di taglio qui +CollectionPanel.addPoint=aggiungere un punto +CollectionPanel.removePoint=cancellare un punto +CollectionPanel.NumberOfPoints=Numero di punti +CollectionPanel.NumberOfPoints.Tip=tutti i numeri sono ordinati automaticamente +CollectionPanel.NumberOfChapters=Capitoli +CollectionPanel.NumberOfChapters.Tip=tutti i numeri sono ordinati automaticamente +CollectionPanel.expectedSize=Dim.: ~ +CollectionPanel.Preview.offline=anteprima non disponibile +CollectionPanel.Preview.processedPid=elaborazione Video (P)ID 0x +CollectionPanel.Various=Varie +CollectionPanel.Preview.fastDecode=veloce/grezza decodifica della preview +CollectionPanel.Preview.fastDecode.Tip=ricostruisce e interpola solo il pixel in alto/sinistra di ogni macroblocco +CollectionPanel.Preview.LiveUpdate=aggiorna in tempo rale mentre elabora +CollectionPanel.Preview.LiveUpdate.Tip=non raccomandato su sistemi lenti o accesso a file, riferirsi anche al buffer di preview +CollectionPanel.Preview.AllGops=mostra anche i GOPS senza sequence header +CollectionPanel.Preview.AllGops.Tip=per dati DVB non e' raccomandato, abilitare solo per stream con un solo sequence header! +CollectionPanel.PidList=lista PES(&Sub)-ID/PID: +CollectionPanel.PidList.Tip1=inserire PES-ID o sub-ID (MPG etc) o PID (PVA,TS); se vuoto == usare tutti IDs +CollectionPanel.PidList.Tip2=doppio click per rimuovere la riga selezionata +CollectionPanel.transferPids1=trasferisce il/i (P)ID selezionato alla nuova coll# +CollectionPanel.transferPids1.Tip=modifice alla coll# attiva ancora da applicare +CollectionPanel.transferPids2=trasferisci coppie di punti di tagli alla nuova coll# +CollectionPanel.transferPids2.Tip=modifice alla coll# attiva ancora da applicare +CollectionPanel.ExportLimits=limiti aggiuntivi di esportazione: +CollectionPanel.OptionHorizontalResolution=Ris. Oriz.: +CollectionPanel.OptionHorizontalResolution.Tip=globale, ..ignora automaitcamente ogni altra sequenza video +CollectionPanel.OptionDAR=DAR: +CollectionPanel.OptionDAR.Tip=globale, ..ignora automaitcamente ogni altra sequenza video +CollectionPanel.loadCutpointList=legge i punti di taglio da file +CollectionPanel.loadCutpointList.Tip=apre un file di taglio oppure drag & drop qui +CollectionPanel.saveCutpointList=salva i punti di taglio su file +CollectionPanel.ApplyAndClose=applica & chiude +CollectionPanel.Apply=appllica +CollectionPanel.CutMode.Bytepos=(0) usa BytePos. per i punti di taglio +CollectionPanel.CutMode.Gop=(1) usa il numero di GOP per i punti di taglio +CollectionPanel.CutMode.Frame=(2) usa il numero di Frame per i punti di taglio +CollectionPanel.CutMode.Pts=(3) usa il numero di PTS per i punti di taglio +CollectionPanel.CutMode.Timecode=(4) usa il Timecode per i punti di taglio +CollectionPanel.Preview.Error=errore di anteprima: +CollectionPanel.FileAccessError=.. impossibile accedere al file +CollectionPanel.Title.Error=dettagli di collezione per coll.# {0} -> ERRORE! la collezione non esiste +CollectionPanel.loadCutpointList.Error=errore di caricamento +CollectionPanel.Preview.disable=disabilitare l'anteprima +CollectionPanel.Preview.disable.Tip= + +#makeVDR +StreamConverter.IOError=!> Errore IO nella crezione dello stream: +StreamConverter.PayloadError=!> Il pacchetto PES in ingresso senza dati o con dati di intestazione errati +StreamConverter.Summary=Flusso: + +#patch +PatchPanel.Title=modifica le informazioni video di base nel primo sequence header +PatchPanel.Error=errore di modifica +PatchPanel.Error2=errore di modifica 2 +PatchPanel.Change=cambia +PatchPanel.Cancel=cancella + +#CutListener +cutlistener.wrongnumber=-> numero sbagliato come ID + +#GoListener +golistener.msg.cancelled=--- processo cancellato ---- +golistener.msg.paused=--- processo in pausa ---- +golistener.msg.resumed=--- processo ripreso ---- +golistener.msg.extracting=estraendo i dati grazzi (PES) dell'ID 0x + +#AC3 +ac3.msg.loading.start=caricando i frame AC3: +ac3.msg.loading.error=errore nel caricamento di ac3.bin +ac3.msg.frames=ac3.bin contiene {0} AC3 frame + +#Run +run.prepare.colls=preparando la/le collezione/i... +run.av.offset=scostamento A/V +run.session.infos=<<< informazioni di sessione >>> +run.working.coll=-> lavorando con la collezione n. +run.split.output=-> tagliano il file in uscita circa @ +run.add.time.offset=-> aggiungere uno scostamento a audio/ttx/pics : {0} ms (se segue il video) +run.stream.type.disabled=-> flusso di tipo PES disabilitato: +run.write.output.to=-> scrivere il file in uscita in: +run.write.output.notexists=!> la cartella di destinazione non e' accessibile +run.write.output.nowriteaccess=!> non e' possibile accedere in scrittura alla cartella di destinazione +run.cutpoints.defined=punto/i di taglio definito/i +run.start.quick.info=<<< informazioni veloci >>> +run.end.quick.info=<<< fine informazioni veloci >>> +run.no.input=nessun file in ingresso... +run.write.raw=scrive i file grezzi separati in: +run.coll.empty=la collezione e' vuota... +run.done=fatto... {0} collezione/i elaborate @ +run.stopped=fermato... +run.status=pronto... +run.splitpart=parte attuale della destinazione + +#Working +working.convertType.demux=-> demultiplex +working.convertType.makeVDR=-> crea un VDR (A/V PES) +working.convertType.makeMPG2=-> crea un MPG2 +working.convertType.makePVA=-> crea un PVA +working.convertType.makeTS=-> crea un TS +working.convertType.packetFilter=-> filto pacchetti semplice +working.file=+> File in ingresso {0}: {1} ({2} bytes) +working.file.not.found=!> File non trovato ! +working.filetype=-> Tipo del file e' {0} +working.file.notsupported=!> Tipo file non supportato! +working.end.of.part=---> FINE DELLA PARTE +working.summary=sintesi dei file multimediali creati: +working.post.command=-> comandi post elaborazione eseguiti: +working.bytes.written=bytes scritti... +working.log.error2=log error2: +working.output.std=[res] destinazione nella stessa cartella come il primo file della collezione + +#MPVD +mpvdecoder.tip1=click col destro e salva come immagine + +#FilePanel +FilePanel.DragDrop.Tip=drag & drop i file qui oppure usa il menu contestuale +FilePanel.FileUp.Tip=sposta il/i file in alto nella collezione +FilePanel.FileDown.Tip=sposta il/i file in basso nella collezione +FilePanel.FileRemove.Tip=rimuove il/i file dalla collezione +FilePanel.CollectionNumber=coll.# +FilePanel.CollectionNumber.Tip=individua la collezione del file attivo +FilePanel.addCollection.Tip=crea una nuova collezione +FilePanel.removeCollection.Tip=cancella una collezione +FilePanel.openAutoloadPanel.Tip=apre la finestra di auto caricamento +FilePanel.OutputDirectory=cartella di destinazione: +FilePanel.OutputDirectory.Tip=specifica la cartella di destinazione per la collezione selezionata +FilePanel.recentOutputDirectories=cartelle di destinazione recenti: +FilePanel.addRecentOutputDirectory.Tip=aggiunde la directory alla lista delle cartelle recenti +FilePanel.removeRecentOutputDirectory.Tip=rimuove la directory alla lista delle cartelle recenti +FilePanel.Textfield.Tip=Informazioni della collezione +FilePanel.FileAdd.Tip=aggiunge il/i file alla collezione + +#ExternTab +ExternPanel.Title1=comandi esterni / post elaborazione +ExternPanel.Title1.Tip=definire le proprie applicazioni preferite +ExternPanel.Applications=applicazioni esterne... +ExternPanel.createVdrIndex=crea index.vdr in: +ExternPanel.createVdrIndex.Tip=crea i segmenti vdr rinominandoli com e0xx.vdr +ExternPanel.createCellTimes=crea il file cellTimes.txt per file multipli/tagli multipli +ExternPanel.createCellTimes.Tip=demultiplexa solo, aggiunge un voce per il numero di fram al passaggio da un file all'altro o nei tagli (nuovo capitolo) +ExternPanel.exportPts=salva automaticamente i PST dei tagli +ExternPanel.exportPts.Tip=per condividere e caricare i tagli {PTS cut} in un'altra istanza di X +ExternPanel.save1stFrameOfGop=salva il primo I-frame del GOP come un .bmp +ExternPanel.save1stFrameOfGop.Tip=demultiplexa solo... +ExternPanel.createChapters=Salva automaticamente il timecode al cambio di mode +ExternPanel.createChapters.Tip=esporta un timecode aggiuntiva se c'e' una modifica di mode +ExternPanel.renameAudio=rinomina tutti i file MPEG Audio in *.mpa +ExternPanel.renameAudio.Tip=invece di usare il numero di layer -> .mp1, .mp2, .mp3 +ExternPanel.renameVideo=rinomina tutti i file MPEG Video in *.mpv +ExternPanel.renameVideo.Tip=invece di usare il tipo MPEG -> .m1v, .m2v +ExternPanel.Title2=Proprieta' del progetto +ExternPanel.Title2.Tip=cambiare questi valori se si sa cosa si sta' facendo +ExternPanel.createM2sIndex=Mpeg2Schnitt idd version: V2/A3 +ExternPanel.createM2sIndex.Tip=crea un file *.idd durante il demultiplexing: +ExternPanel.createD2vIndex=crea un file *.d2v durante il demultiplexing: +ExternPanel.createD2vIndex.Tip=ogni parte deve essere elaborata separatamente +ExternPanel.createDgiIndex=crea un file *.dgi.d2v durante il demultiplexing: +ExternPanel.createDgiIndex.Tip=ogni parte deve essere elaborata separatament +ExternPanel.splitProjectFile=separa automaticamente il video ma mantiene come un progetto +ExternPanel.splitProjectFile.Tip=seprara automaticamente il video nelle parti specificate, non l'audio. Meglio per file grandi <= FAT32 +ExternPanel.ProjectFileSplitSize=-> separa il file a xx MB: +ExternPanel.ProjectFileSplitSize.Tip= +ExternPanel.appendExtension=aggiunge l'estensione ai nuovi file (PES) +ExternPanel.appendExtension.Tip=tiene il nome del file originale (inclusa l'estensione) su tutti i flussi PES secondari + +FtpPanel.killFtpClient=inserire il client senza il logout +FtpPanel.killFtpClient.Tip=non usare, a meno che il server FTP non accetti il logout fino a quando il transfer non e' terminato +FtpPanel.useFtpServerResume=server supporta il 'resume' +FtpPanel.useFtpServerResume.Tip= + +#SpecialTab +SpecialPanel.Title1=speciali 1 +SpecialPanel.PtsShift=scostamento temporale globale dei PTS (in ore): +SpecialPanel.PtsShift.Tip=provare 'auto' o '1..13' in caso disallineamento dei PTS della sorgente o se l'audio non viene demultiplexato +SpecialPanel.PVA.FileOverlap=PVA: in lettura controlla per sovrapposizioni +SpecialPanel.PVA.FileOverlap.Tip=disabilitare, se piu' PVA di una registrazione e' stata registrata senza sovrapposizioni +SpecialPanel.PVA.Audio=PVA: specifiche strette, per i flussi audio +SpecialPanel.PVA.Audio.Tip=ablitare per evitare il controllo degli errori sui flussi audio; su alcuni flussi mancano dei flag (MD)! +SpecialPanel.VOB.resetPts=VOB: determina differenti Cell timelines +SpecialPanel.VOB.resetPts.Tip=abilitato, se i PTS di VobIds/Cells consecutive non sono continui +SpecialPanel.TS=relativo solo ai TS: +SpecialPanel.TS.ignoreScrambled=TS: ignorare i pacchetti codificati +SpecialPanel.TS.ignoreScrambled.Tip=disabilitare, se prensi che i tuoi non siano codificate anche se marcati come protetti +SpecialPanel.TS.blindSearch=TS: ricerca avanzata dei pacchetti aperti +SpecialPanel.TS.blindSearch.Tip=abilita, se la ricerca dei PID si interrompe alla ricerca di dati sconosciuti +SpecialPanel.TS.joinPackets=TS: unisce diversi segmenti (per il Dreamboxョ) +SpecialPanel.TS.joinPackets.Tip=abilitare per unire pacchetti TS non completi a cavallo dei diversi segmenti del file originale +SpecialPanel.TS.HumaxAdaption=TS: adattamento formato per file Humaxョ +SpecialPanel.TS.HumaxAdaption.Tip=abilita la gestione speciale per il formato HD Humaxョ dei TS +SpecialPanel.TS.FinepassAdaption=TS: adattamento formato per file Finepassョ +SpecialPanel.TS.FinepassAdaption.Tip=abilita la gestione speciale per il formato HD Finepassョ dei TS +SpecialPanel.TS.JepssenAdaption=TS: adattamento formato per file Jepssenョ +SpecialPanel.TS.JepssenAdaption.Tip=abilita la gestione speciale per il formato HD Jepssenョ dei TS +SpecialPanel.TS.KoscomAdaption=TS: adattamento formato per file Koscomョ +SpecialPanel.TS.KoscomAdaption.Tip=abilita la gestione speciale per il formato HD Koscomョ dei TS +SpecialPanel.TS.ArionAdaption=TS: adattamento formato per file Arionョ +SpecialPanel.TS.ArionAdaption.Tip=abilita la gestione speciale per il formato HD Arionョ dei TS +SpecialPanel.TS.generatePmt=TS: genera un flusso dipendente dai PMT +SpecialPanel.TS.generatePmt.Tip=disabilitato, per generare un flusso di PMT indipendenti e che puo' applicarsi a qusi tutti i flussi +SpecialPanel.TS.generateTtx=TS: genera le informazioni sul servizio TTX (test) +SpecialPanel.TS.generateTtx.Tip=aggiunge un flusso di tipo service (Pid 0x9F) con le informazioni di stato sulla pagina 150 (solo @ autoPMT) +SpecialPanel.TS.HeaderMode0=(0) nessun header TS aggiuntivo +SpecialPanel.TS.HeaderMode1=(1) aggiungere uno header Topfieldョ 4000 al TS +SpecialPanel.TS.HeaderMode2=(2) aggiungere uno header Topfieldョ 5000 al TS +SpecialPanel.TS.HeaderMode3=(3) aggiungere uno header Topfieldョ 5x00 al TS (nuovo) +SpecialPanel.TS.HeaderMode4=(4) aggiungere uno header Topfieldョ 5x00(C) al TS (nuovo) +SpecialPanel.TS.HeaderMode5=(5) aggiungere uno header Arionョ al TS +SpecialPanel.TS.setMainAudioAc3=TFョ-header: indicare la traccia AC3 come principale +SpecialPanel.TS.setMainAudioAc3.Tip= +SpecialPanel.Title2=speciali 2 +SpecialPanel.Input.getEnclosedPackets=usa solo pacchetti PES/TS chiusi +SpecialPanel.Input.getEnclosedPackets.Tip=disabilitare se nessun pacchetto viene trovato (alla fine del pacchetto, sul successivo pacchetto il mpeg-startcode manca, es. sulle Immagini) +SpecialPanel.Input.concatenateForeignRecords=concatena diverse registrazioni +SpecialPanel.Input.concatenateForeignRecords.Tip=abilita, se si vuole concatenare diversi file con lo stesso tipo di PVA, MPEG o VDR +SpecialPanel.Audio.ignoreErrors=Audio: usa solo il primo PTS per la sincronizzazione +SpecialPanel.Audio.ignoreErrors.Tip=calcola il tempo per l'audio a partire dalla lunghezza dei frame dopo aver sinconizzato il punto iniziare, salta gli errori. +SpecialPanel.Audio.limitPts=Audio: una un numero limitato di PTS per la sincronizzazione +SpecialPanel.Audio.limitPts.Tip=meglio del solo primo PTS +SpecialPanel.Video.ignoreErrors=Video: ignora gli errori dopo il primo PTS/GOP +SpecialPanel.Video.ignoreErrors.Tip=abilita, se accadono solo errori Video PTS (le immagini sembrano) +SpecialPanel.Video.trimPts=Video: adatta gli sliding PTS +SpecialPanel.Video.trimPts.Tip=abilita, se l'audio esportato finisce in anticipo, causato dallo scivolamento del PTS +SpecialPanel.Conversion=solo per conversioni relative a 'XYZ': +SpecialPanel.Conversion.startWithVideo=assicura il primo pacchetto del primo PES sia Video +SpecialPanel.Conversion.startWithVideo.Tip=abilita, alcuni riproduttori hanno problemi se non e' cosi'; disabilitare per flussi solo audio +SpecialPanel.Conversion.addPcrToStream=genera PCR/SCR dal PTS +SpecialPanel.Conversion.addPcrToStream.Tip=specifica lo scostamento dei PCR, DVB ne richiede piu' del DVD, flussi ad alta banda ne richiede piu' di flussi a bassa banda +SpecialPanel.Conversion.PcrCounter=incTScnt +SpecialPanel.Conversion.PcrCounter.Tip=incrementa il contatore dei pacchetti TS anche per quelli senza dati (solo PCR); non standard ma talvolta necessario + +#OutTab +ExportPanel.SplitPanel=divide la destinazione +ExportPanel.SplitSize=divide @ circa xxx MB +ExportPanel.SplitSize.Tip=modifica il campo per la destinazione; attualmente la dimensione si riferisce solo per la parte video (mpv) +ExportPanel.Overlap=sovrapponi di +ExportPanel.Overlap.Tip= +ExportPanel.StreamtypePanel=tipo di flussi da elaborare +ExportPanel.StreamtypePanel.Tip=de/seleziona il tipo di flussi che si vuole elaborare (non si applica se l'ingresso e'ES) +ExportPanel.Streamtype.MpgVideo=Mpg Video +ExportPanel.Streamtype.MpgAudio=Mpg Audio +ExportPanel.Streamtype.Ac3Audio=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio=LPCM Audio +ExportPanel.Streamtype.Teletext=Teletext +ExportPanel.Streamtype.Subpicture=Subpicture +ExportPanel.Streamtype.Vbi=Generic_VBI +ExportPanel.Streamtype.MpgVideo.Tip=Mpg Video +ExportPanel.Streamtype.MpgAudio.Tip=Mpg Audio +ExportPanel.Streamtype.Ac3Audio.Tip=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio.Tip=LPCM Audio +ExportPanel.Streamtype.Teletext.Tip=Teletext +ExportPanel.Streamtype.Subpicture.Tip=Sottotitolo +ExportPanel.Streamtype.Vbi.Tip=Generic_VBI +ExportPanel.WriteOptions=salva le opzioni per conversione e demultiplexing +ExportPanel.WriteOptions.Tip=che impattano anche 'VDR/MPG/PVA/TS', include anche Audio e/o Video ES +ExportPanel.WriteOptions.writeVideo=scrive tutti i dati video +ExportPanel.WriteOptions.writeAudio=scrive tutti gli altri dati +ExportPanel.WriteOptions.writeVideo.Tip= +ExportPanel.WriteOptions.writeAudio.Tip= +ExportPanel.WriteOptions.InfoScan=demultiplex/conversione veloce dei primi xx MB: +ExportPanel.additionalOffset.Title=scostamento temporale aggiuntivo (demultiplex) +ExportPanel.additionalOffset=abilita' lo scostamento temporale +ExportPanel.additionalOffset.Tip=l'inizio del flusso originale viene spostat dello scostamento indicato +ExportPanel.additionalOffset.Value.Tip=inserire il valore dello scostamento temporale in millisecondi, premere poi invio! Impatta tutti i flussi che seguono un video +ExportPanel.createSubDirNumber=Crea una sotto cartella col numero di collezione +ExportPanel.createSubDirNumber.Tip=globale: crea una sotto cartella con come nome il numero della collezione per ogni collezione (meglio se lo stesso file e' presente in piu' collezioni) +ExportPanel.createSubDirName=crea una sotto cartella col nome base della collezione +ExportPanel.createSubDirName.Tip=globale: crea una sotto cartella partendo dal nome del primo file sorgente della collezione + +#VideoTab +VideoPanel.Title1=correzioni video (demultiplex) +VideoPanel.addEndcode=aggiunge il codice di fine sequenza +VideoPanel.addEndcode.Tip=abilita per un codice di fine sequenza conforme MPEG +VideoPanel.insertEndcode=inserice un codice di sequenza ai cambiamenti di formato +VideoPanel.insertEndcode.Tip=abilita per un codice di fine sequenza conforme MPEG +VideoPanel.addSequenceHeader=assicura ogni GOP abbia un sequenceheader +VideoPanel.addSequenceHeader.Tip=ri inizializza (resol. & q_matrix) per la decodifica all'inizio di ogni GOP (automatico in caso di tagli) +VideoPanel.patchToProgressive=modifica tutti i frame come progressive +VideoPanel.patchToProgressive.Tip=abilita i progressive bits per ridurre il numero di field +VideoPanel.patchToInterlaced=modifica tutti i frame come interlaced +VideoPanel.patchToInterlaced.Tip=cancella i progressive bits +VideoPanel.toggleFieldorder=cambia l'ordine dei field +VideoPanel.toggleFieldorder.Tip=cambia il Top_field_first bit +VideoPanel.addSde=imposta la risoluzione nel SDE +VideoPanel.addSde.Tip=cambia il valore inserendo un nuovo valore, un campo vuoto indica di usare lo stesso valore come in sequ.header; es. 720*576 +VideoPanel.SdeValue.Tip=cambia il valore inserendo un nuovo valore, un campo vuoto indica di usare lo stesso valore come in sequ.header; es. 720*576 +VideoPanel.clearCdf=modifica le c.d.flagged infos delle immagini +VideoPanel.clearCdf.Tip=puo' risolvere il problema delle 'green picture' su alcuni vecchi apparati vecchi +VideoPanel.patchResolution.Tip=modifica la prima risoluzione orizontale +VideoPanel.patchResolution=modifica la prima h-res: +VideoPanel.patchResolutionValue.0=(0) mai +VideoPanel.patchResolutionValue.1=(1) sempre +VideoPanel.patchResolutionValue.2=(2) se <> 352|720 +VideoPanel.patchResolutionValue.3=(3) se <> to 352|704|720 +VideoPanel.Title2=nuovi bitrate (demultiplex) +VideoPanel.ChangeVbvBuffer.Tip=qualche volta e' meglio definire la dimensione finale +VideoPanel.Unchanged=non cambiare +VideoPanel.ChangeVbvBuffer.Mode1=(1) massima (112*16384) +VideoPanel.ChangeVbvBuffer=vbv buffer: +VideoPanel.ChangeVbvDelay.Tip=massimo ritardo (raccomandata) +VideoPanel.ChangeVbvDelay.Mode1=(1) massimo ritardo (0xFFFF) +VideoPanel.ChangeVbvDelay=vbv ritardo: +VideoPanel.ChangeAspectRatio.Tip=cambiare solo se si ritiene necessario +VideoPanel.ChangeAspectRatio=aspect ratio: +VideoPanel.patchBitrateValue.0=(0) mantiene l'originale +VideoPanel.patchBitrateValue.1=(1) calcolato dalla lunghezza del GOP +VideoPanel.patchBitrateValue.2=(2) calcolato dal VBV +VideoPanel.patchBitrateValue.3=(3) marca come VBR (MPEG-1 Video) +VideoPanel.patchBitrateValue.4=(4) fisso 3 Mbps +VideoPanel.patchBitrateValue.5=(5) fisso 6 Mbps +VideoPanel.patchBitrateValue.6=(6) fisso 9 Mbps +VideoPanel.patchBitrateValue.7=(7) fisso 12 Mbps +VideoPanel.patchBitrateValue.8=(8) fisso 15 Mbps +VideoPanel.patchBitrateValue=bitrate per la sequenza: +VideoPanel.patch1stBitrateValue.0=(0) mantiene l'originale +VideoPanel.patch1stBitrateValue.1=(1) media calcolata (nominale) +VideoPanel.patch1stBitrateValue.2=(2) massimo calcolato <= 9.0 Mbps(DVD) +VideoPanel.patch1stBitrateValue.3=(3) massimo calcolato (es. HDTV) +VideoPanel.patch1stBitrateValue.4=(4) marca come VBR (MPEG-1 Video) +VideoPanel.patch1stBitrateValue=bitrate nella prima sequenza: + +#AudioTab +AudioPanel.Title1=conversioni audio (demultiplex) +AudioPanel.losslessMpaConversion.Tip1=conversione diretta senza perdita(limitata a +AudioPanel.losslessMpaConversion.Tip2=MPEG-1, Layer2, 48kHz, 56..384kbps) : +AudioPanel.losslessMpaConversion.Tip=se la conversione e' scelta il bitrate e tipo di canale deve essere costante per l'intero file +AudioPanel.losslessMpaConversionMode0=(0) nessuna conversione +AudioPanel.losslessMpaConversionMode1=(1) singolo a stereo 3D (L+R = originale) +AudioPanel.losslessMpaConversionMode2=(2) singolo a stereo (L+R = originale) +AudioPanel.losslessMpaConversionMode3=(3) singolo a jointstereo (L+R = originale) +AudioPanel.losslessMpaConversionMode4=(4) separara 2 canali in due singoli (1=L,2=R) +AudioPanel.decodeMpgAudio=decodifica MPEG Layer1,2 in PCM: +AudioPanel.decodeMpgAudio.Tip=MPEG-Audio Decoder (non per Layer3), destinazione in PCM +AudioPanel.decodeMpgAudio.resampleAudioMode0=(0) senza ri-campionamento +AudioPanel.decodeMpgAudio.resampleAudioMode1=(1) ri-campionamento lineare 48kHz a 32kHz +AudioPanel.decodeMpgAudio.resampleAudioMode2=(2) ri-campionamento lineare 48kHz a 44.1kHz +AudioPanel.decodeMpgAudio.Normalize=normalizza a % : +AudioPanel.decodeMpgAudio.Normalize.Tip=normalizza L+R ugualmente, valori da 0...100 sono possibili, default e' 98%; puo' chiedere un riavvio del programma +AudioPanel.NormalizeValue.Tip= +AudioPanel.decodeMpgAudio.Downmix=downmix e salva come canale singolo +AudioPanel.decodeMpgAudio.Downmix.Tip=downmix sorgenti stereo/2channel in un singolo canale +AudioPanel.decodeMpgAudio.changeByteorder=salva nel formato Motorola +AudioPanel.decodeMpgAudio.changeByteorder.Tip=vuol dire MSB primo, per macchine non Intel +AudioPanel.decodeMpgAudio.addRiffHeader=aggiunge intestazione RIFF(RIFX) ai PCM (.wav) +AudioPanel.decodeMpgAudio.addRiffHeader.Tip=PC standard +AudioPanel.decodeMpgAudio.addAiffHeader=aggiunge intestazione AIFF ai PCM (.aif) +AudioPanel.decodeMpgAudio.addAiffHeader.Tip=Apple standard +AudioPanel.Title2=elaborazioni audio (demultiplex) +AudioPanel.validateCRC=verifica il CRC dei flussi AC-3 / MPEG-Audio L1,2 +AudioPanel.validateCRC.Tip=se abilitato assicura il numero minimo possibile di errori in scrittura a costo delle performance +AudioPanel.clearCRC=cancella i CRC in MPEG-Audio Layer1,2 +AudioPanel.clearCRC.Tip=se abilitato puo' eveitare alcuni messaggi di errore per l'audio +AudioPanel.fillGapsWithLastFrame=riempie i vuoti con il frame precedente +AudioPanel.fillGapsWithLastFrame.Tip=invece di inserire frame di silenzio; e' standard per l'AC-3 quando il file AC3.bin non contiene un frame silenzioso adeguato al flusso +AudioPanel.addFrames=aggiunge frames +AudioPanel.addFrames.Tip=se l'audio finisce prima del video per raggiungere la durata del video +AudioPanel.patch1stAc3Header=modifica il primo header AC-3 in modo 3/2 +AudioPanel.patch1stAc3Header.Tip=alcuni softer di decodifica AC-3 lo richiedono anche se i canali effettivi sono meno +AudioPanel.replaceAc3withSilence=sostituisce tutti i non-3/2 AC-3 con silenzio 3/2lfe +AudioPanel.replaceAc3withSilence.Tip=abilita, per mascherare frame 2/0 non voluti con fram 3/2 di silenzio (48khz,448kbps, ac3.bin required) +AudioPanel.addRiffToAc3=aggiunge intestazione RIFF WAVE all'audio AC-3 +AudioPanel.addRiffToAc3.Tip=crea un file .wav usando il formato AC-3 (tag 0x2000) +AudioPanel.addRiffToMpgAudioL12=MPA: aggiunge l'intestazione RIFF WAVE Layer1,2 +AudioPanel.addRiffToMpgAudioL12.Tip=Broadcast Wave Format (tag 0x0050), meglio per MPEG Layer 1 & 2 +AudioPanel.addRiffToMpgAudioL3=MPA: aggiunge l'intestazione RIFF WAVE Layer3 +AudioPanel.addRiffToMpgAudioL3.Tip=piu' comune della ACM Wave Format (tag 0x0055), meglio per MPEG Layer 3 +AudioPanel.pitchAudio=scarta ogni xxx frame audio: +AudioPanel.pitchAudio.Tip=compress/pitch Audio (solo per ES) +AudioPanel.allowSpaces=permette spazio tra i frame (h.w.c.!) +AudioPanel.allowSpaces.Tip=verifica solo la correttezza dele intestazioni ma senza verificare la lunghezza dei frame (possibile psb. di dimensione errata) +AudioPanel.createDDWave=AC-3/DTS: salva come DD/DTS-Wave +AudioPanel.createDDWave.Tip=salva Ac3/DTS come DD/DTS-Wave, a intestazione fissa: PCM 44.1kHz,16bit,2-ch + +#SubtitleTab +SubtitlePanel.Title=DVB teletext, DVB sottotitoli (demultiplex) +SubtitlePanel.Title.Teletext=DVB Teletext (demultiplex) +SubtitlePanel.decodeMegaradio=test: esporta MegaRadioョ MP3-stream +SubtitlePanel.decodeMegaradio.Tip=trasmessa da Hotbird 13ーE, 11.054GHz Hor., SR 27500, FEC 5/6, TTX-PID 553 +SubtitlePanel.decodeHiddenRows=decode hidden rows of teletext (id 0xFF, means offline pages) +SubtitlePanel.decodeHiddenRows.Tip=alcune pagine o alcune teletexts/subtitles sono nascosti, quindi potrebbe aiutare +SubtitlePanel.rebuildPTS=ri-costruisce TTX-PTS dal primo flusso MpgAudio +SubtitlePanel.rebuildPTS.Tip=usare SOLO per flussi TTX inclusi in un file (TS,PES..) ma senza una base dei tempi adatta al video +SubtitlePanel.keepOriginalTimecode=mantine la base dei tempi originale (PTS) su decodifica indipendenti +SubtitlePanel.keepOriginalTimecode.Tip=senza un video da demultiplexare la nuova base dei tempi non parte da 0 +SubtitlePanel.exportTextAsUnicode=usa Unicode (UTF-16 BE) per il testo +SubtitlePanel.exportTextAsUnicode.Tip=usa Unicode (UTF-16 BE) per il testo +SubtitlePanel.exportTextAsUTF8=use Unicode (UTF-8) per il testo +SubtitlePanel.exportTextAsUTF8.Tip=use Unicode (UTF-8) per il testo +SubtitlePanel.TtxPages=teletext pages da decodificare: +SubtitlePanel.TtxPages.Tip=identificazione automatica dei caratteri speciali sulla base delle specifiche Teletex 1.5 in Unicode +SubtitlePanel.Language= linguaggio: +SubtitlePanel.Language.Tip=fissa la coppia di linguaggi, se il cambio automatico non e' supportato dalla rete +SubtitlePanel.Format.Tip=il formato preferito per il salvataggio +SubtitlePanel.Format.Free=testo +SubtitlePanel.Format=formato sottotitoli: +SubtitlePanel.Colormodel.Mode0=(0) 4 colori +SubtitlePanel.Colormodel.Mode1=(1) 16 colori +SubtitlePanel.Colormodel.Mode2=(2) 256 colori +SubtitlePanel.PageId.Value.Tip=campo vuoto = usa quello che c'e', altrementi: la chiave nella pagina ID di interesse (dipende dal canale) +SubtitlePanel.Colormodel=simula il modello di colore per le DVB DVB Subpictures IRD: +SubtitlePanel.Colormodel.Tip=impatta l'aspetto dei sottotitoli esportati. Il setting migliore dipende da quello che vuoi. +SubtitlePanel.PageId= fissa il pageID: +SubtitlePanel.showPreview=mostra l'anteprima sottotitoli +SubtitlePanel.Format.SUP.Values.Tip= (posizione da imbasso a sinistra) Dimensione del font; BckGrd Alpha; Yoffset; Xoffset; Xwidth; H(non usato); V; Yoffset2; n. massimo di linee +SubtitlePanel.SupValues= Val: +SubtitlePanel.Font.LoadError=Errore nel recuperare i font di sistema +SubtitlePanel.useTextOutline=disenga il testo con il bordo nero (solo SUP) +SubtitlePanel.useTextOutline.Tip=disegna un bordo di 3 pixel intorno a ciascun carattere con un massimo di 2 'speaker colors' per immagine, altrementi lo sfondo nero e' usato +SubtitlePanel.Font=Schriftart: +SubtitlePanel.Font.Tip=bei SUP-Export +SubtitlePanel.specialTermination=supporto per chiusura speciale delle pagine ttx(test) +SubtitlePanel.specialTermination.Tip=forza il timeout per le pagine non chiuse +SubtitlePanel.ChangeDisplay=cambia visualizzazione: +SubtitlePanel.ChangeDisplay.Tip=solo quando un file .sup in ingresso (da DVD o come un ES) +SubtitlePanel.MovePosition=sposta la posizione dell'immagine: +SubtitlePanel.MovePosition.Tip=lasciare vuoto, se serve un ulteriore scostamento X,Y come: -20,-40 (alto-sinistra) + +#Autoload +autoload.title=lista di cartelle sorgenti predefinite +autoload.dir.remove.tip=rimuove la cartella dalla lista per l'auto caricamento +autoload.dir.add.tip=aggiunge la cartella alla lista per l'auto caricamento +autoload.dir.refresh.tip=aggiorna la lista dei file +autoload.ftp.add.tip=rimuove un ftp alla lista per l'auto caricamento +autoload.add.coll.tip=crea una nuova collezione per ogni file e lo aggiunge +autoload.add.file.tip=aggiunge il/i file alla collezione +autoload.rename.tip=doppio click sinistro o enter per aggiungere il/i file alla collezione, click col destro per rinmominare +autoload.dialog.rename=rinomina +autoload.dialog.fileexists=Il file esiste! Sovrascrivere? +autoload.close=chiudi la finestra + +#splitreset +splitreset.novideo=! -> nessun video PTS, taglio disabilitato + +#checkpts +checkpts.1st.latter=!> 1st video PTS inizia piu' tardi che l'ultimo PTS di questo flusso! Critico per la sincronizzazione +checkpts.last.ends=!> l'ultimo video PTS finoisce prima dell'inizio del PTS di questo flusso! Impossiible sincronizzare + +#parseSecondaryPES +parseSecondaryPES.continue=-> continua usando i dati grezzi estratti da +parseSecondaryPES.demux.pes=demultiplexa PES file +parseSecondaryPES.missing.startcode=!> codice di inizio mancante @ +parseSecondaryPES.found.startcode=!> trovato codice di inizio @ +parseSecondaryPES.packet.length=-> ! la lunghezza del pacchetto e' 0 @ +parseSecondaryPES.miss.next.startcode=!> codice di inizio successivo mancante @ {0} da {1} (PES-ID 0x{2}), ignorando il pacchetto.. +parseSecondaryPES.packs=pacchetti: {0} {1}% {2} +parseSecondaryPES.found.pesid=-> trovato PES-ID 0x{0} {1} @ {2} +parseSecondaryPES.ac3.audio=--> AC-3/DTS Audio +parseSecondaryPES.teletext=--> Teletext +parseSecondaryPES.mpeg.audio=--> MPEG Audio +parseSecondaryPES.lpcm.audio=--> LPCM Audio +parseSecondaryPES.subpic=--> Subpicture +parseSecondaryPES.eof.error=parseSecondaryPES EOF raggiunto in errore: +parseSecondaryPES.io.error=parseSecondaryPES File I/O errore: +parseSecondaryPES.msg.noexport=--> flusso ignorato + +#ID type +idtype.mpeg.video.ignored=(MPEG Video) -> ignorato +idtype.mpeg.audio=(MPEG Audio) +idtype.private.stream=(private stream 1) +idtype.mpeg.video=(MPEG Video) +idtype.mapped.to= mappato in 0x +idtype.mapped.to.e0= mappato in 0xE0 +idtype.ignored= -> ignorato +idtype.video=(Video) +idtype.main.audio=(mainAudio) +idtype.additional=(additional) +idtype.has.pesid= ha PES-ID 0x + +#parsePrimaryPES +parsePrimaryPES.special.pes=-> PES-IDs speciali per la ricerca definiti +parsePrimaryPES.continue=continua col file +parsePrimaryPES.demuxing=demultiplexing +parsePrimaryPES.converting=convestione +parsePrimaryPES.avpes.file=A/V PES file +parsePrimaryPES.missing.startcode=!> codice inizio mancante @ +parsePrimaryPES.found.startcode=!> codice inizio trovato @ +parsePrimaryPES.split.cellids=-> VobID {0} CellID {1} @ {2} (GOP#{3} / Frame#{4}) +parsePrimaryPES.packet.length=-> ! lunghezza del pacchetto e' 0 @ +parsePrimaryPES.miss.startcode=!> codice inizio successivo mancante (dimensione pacchetto=0) @ {0} from {1} /I-Buffer {2} +parsePrimaryPES.miss.startcode2=!> codice inizio successivo mancante @ {0} da {1} (PES-ID 0x{2}), ignorando pacchetti.. +parsePrimaryPES.packs=pacchetti +parsePrimaryPES.dump.1st=-> salva il primo pacchetto su file +parsePrimaryPES.found.pesid=-> trovato PES-ID 0x +parsePrimaryPES.pes.incoming=!> PES-ID 0x{0}, i pacchetti PES sono senza dati o con dati di intestazione errati @ {1} +parsePrimaryPES.actual.written=-> numero effettivo di vframes scritti: +parsePrimaryPES.switch=cambia a file: +parsePrimaryPES.ac3=--> AC-3/DTS Audio +parsePrimaryPES.teletext=--> Teletext (SubID 0x +parsePrimaryPES.mpeg.audio=--> MPEG Audio (0x +parsePrimaryPES.lpcm.audio=--> LPCM Audio (SubID 0x +parsePrimaryPES.subpic=--> Subpicture (SubID 0x +parsePrimaryPES.eof.error=parsePrimaryPES EOF raggiunta in errore: +parsePrimaryPES.io.error=parsePrimaryPES File I/O errore: +parsePrimaryPES.msg.noexport=--> flusso ignorato (0x + +#parseTS +parseTS.sid=-> Service ID 0x +parseTS.pmt.refers=-> PMT 0x{0} si riferisce a questi flussi utili: +parseTS.no.pmt=-> nessun PMT trovato (nella ricerca breve) +parseTS.special.pids=-> PIDs speciali definiti per la ricerca +parseTS.continue=continua col file: +parseTS.demuxing=demultiplexing +parseTS.converting=conversione +parseTS.dvb.mpeg= DVB MPEG-TS file +parseTS.incomplete=!> trovato pacchetto TS incompleto alla EOF @ +parseTS.comp.failed=!> completamento del pacchetto ts packet fallita :-( +parseTS.missing.sync=!> mancanza del byte di sincronizzazione @ +parseTS.comp.ok=!> completamento del pacchetto ts packet riuscita :-) +parseTS.found.sync=!> byte di sincronizzazione trovato @ +parseTS.bit.error=!> PID 0x{0} -> TS bit errore nel pacchetto {1} @ pos. {2}, ignorando.. +parseTS.stuffing=--> PID 0x1FFF => pacchetto riempitivo -> ignorato +parseTS.scrambled=-> PID 0x{0} => marchiato come dati criptati, pacchetti {1} @ {2} -> ignorati +parseTS.clear=-> PID 0x{0} => dati in chiaro, pacchetti {1} @ {2} +parseTS.outof.sequence=!> PID 0x{0} -> pachetto {1} @ pos. {2} fuori sequenza ({3}/{4}) (riordinando..) +parseTS.priv.stream2.ignored=-> PID 0x{0}(private stream 2) -> ignorato +parseTS.scrambled.notignored=-> PID 0x{0} => marchiato come dati criptati (not ignorato){1} +parseTS.ignored= -> ignorato +parseTS.pid.has.pes=ok> PID 0x{0} ha PES-ID 0x{1} {2} +parseTS.lackof.pes=!> PID 0x{0} manca di PES Data -> pacchetto ignorato +parseTS.actual.vframes=-> numero di vframes effettivi: +parseTS.tryto.complete=!> tentativo di completare il pacchetto TS incompleto... +parseTS.packs=pacchetti: {0} {1}% {2} +parseTS.ac3.audio=--> AC-3/DTS Audio in PID 0x +parseTS.teletext.onpid=--> Teletext in PID 0x +parseTS.mpeg.audio=--> MPEG Audio (0x{0}) in PID 0x{1} +parseTS.subpicture=--> Subpicture (SubID 0x +parseTS.eof.error=raw EOF raggiunto in errore: +parseTS.io.error=raw File I/O errore: +parseTS.switch.to=cambia a file: +parseTS.msg.noexport=--> stream (0x{0}) in PID 0x{1} ignorato + +#nextfile +nextfile.io.error=file successivo File I/O errore: +nextfile.shift.auto=-> spostato automaticamente il PTS originale indietro di {0} ore +nextfile.shift.manual=-> spostato manualmente il PTS originale indietro di {0} ore +nextfile.next.file.start=-> i dati successivi iniziano con PTS: {0} / l'ultimo PTS e' {1} +nextfile.next.file.start.adaption=-> usa nuovo scostamento PTS-Offset: {0} per i dati successivi + +#overlapPVA +overlappva.io.error=errore di lettura sovrapposizione PVA: + +#parsePVA +parsePVA.special.pids=-> PIDs speciali definiti per la ricerca +parsePVA.streamtype.ac3= (AC-3/DTS) +parsePVA.streamtype.ttx= (TTX) +parsePVA.streamtype.mpeg.audio= (MPEG Audio) +parsePVA.streamtype.mpeg.video= (MPEG Video) +parsePVA.continue=continua col file: +parsePVA.demuxing=demultiplexing +parsePVA.converting=convesione +parsePVA.pvafile= PVA file +parsePVA.missing.sync=!> syncword mancante @ +parsePVA.found.sync=!> syncword trovata @ +parsePVA.file.overlap=File-Overlap individuata @ posizione: +parsePVA.packs=pacchetti +parsePVA.found.id=-> trovato ID 0x +parsePVA.outof.sequence=!> ID 0x{0} -> pacchetto {1} @ pos. {2} fuori sequenza ({3}/{4}) (riordinando..) +parsePVA.id.0x=-> ID 0x +parsePVA.actual.vframes=-> numero di vframes effettivi: +parsePVA.ac3.onid=--> AC-3/DTS Audio in ID 0x +parsePVA.teletext.onid=--> Teletext in ID 0x +parsePVA.mpeg.audio.onid=--> MPEG Audio in ID 0x +parsePVA.eof.error=pva EOF raggiunto in errore: +parsePVA.io.error=pva File I/O errore: +parsePVA.msg.noexport=--> flusso ignorato in ID (0x + +#Audioprocess +audio.progress=controlla & sincronizza audio file +audio.status.pre-insert=pre-inserimento... +audio.status.insert=inserimento... +audio.status.write=scrittura... +audio.status.pause=pausa... +audio.status.add=aggiunta... +audio.status.finish=finito... +audio.convert=-> converti MPA : +audio.decode=-> decodifica MPA : +audio.restart=!> rinizia elaborazione audio, causata da cambiamenti @ al frame# +audio.error.io=file I/O errore: +audio.msg.pts.discard=!> {0} PTS scartati nel flusso +audio.msg.pts.firstonly=-> prende solo il primo Audio PTS (per sincronizzare i tempi) +audio.msg.pts.start_end=Audio PTS: primo pacchetto {0}, ultimo pacchetto +audio.msg.pts.mismatch=-> !! video & audio PTS non combaciano mai! +audio.msg.pts.wo_frame=!> PTS senza un frame +audio.msg.adjust.at.videopts=-> adeguando l'Audio alla base dei tempi del video +audio.msg.adjust.at.ownpts=-> adeguando l'Audio alla propria base dei tempi +audio.msg.addriff.acm=-> aggiungi RIFF WAVE header a MPEG Audio come ACM Waveformat +audio.msg.addriff.bwf=-> aggiungi RIFF WAVE header a MPEG Audio come BWF Waveformat +audio.msg.addriff.ac3=-> aggiugni RIFF WAVE header a AC-3 Audio +audio.msg.syncword.lost=!> syncword mancante @ {0}, @ +audio.msg.syncword.found=!> syncword trovata @ +audio.msg.frame.discard=!> scarta il frame# +audio.msg.crc.error=!> controllo CRC{0} fallito @ +audio.msg.source=-> src_audio: {0} @ +audio.msg.source.max=-> src_audio: visualizzazione interrotta, piu' di 100 cambi di modo individuati in un file, velocita' di elaborazione ridotta +audio.msg.summary.skip=!> sourceframe(s) ignorati @ +audio.msg.summary.pre-insert=!> {0} frame(s) ({1}ms) pre-inseriti @ +audio.msg.summary.insert=!> {0} frame(s) ({1}ms) inseriti @ +audio.msg.summary.add=!> {0} frame(s) ({1}ms) aggiunti @ +audio.msg.summary.frames=audio frames: scritti-pre-ignorati-inseriti-aggiunti {0} @ {1} fatti... +audio.msg.summary.jstereo=-> {0} cambiamento/i stereo/jointstereo individuati... +audio.msg.audio=Audio +audio.msg.newfile.left=(sinistra): +audio.msg.newfile.right=(destra): +audio.msg.noaudio=!> nessun Audio trovato in questo flusso... +audio.msg.convert.disabled=!> il frame originale non cambacia con nessun criterio di ricodifica, funzione disattivata.. (frame# {0}) +audio.msg.convert.error=!> il frame originale ha generato un errore di conversione (errore {0}), (frame# {1}) + +#Videoprocess +video.msg.pts.start_end=Video PTS: inizio 1.GOP {0}, fine ultimo GOP +video.msg.summary=-> Video: fr-ct-1p-cg-og-dg -> +video.progress=analizza il file del flusso video +video.msg.skip.sec=-> salta sequence_end_code dopo il GOP# {0} @ +video.error.io=!> errore di puro accesso video +video.msg.error.lackofdata=!> GOP# {0} - dati mancanti, ignorato... +video.msg.error.nopts.use_goptc=!> GOP# {0} non ha PTS, GOP TC usato per sincronizzazione +video.msg.error.nopts.use_lastpts=!> GOP# {0} non ha PTS, ultimo PTS usato per sincronizzazione +video.msg.basics=-> elemnti video: +video.msg.newformat=GOP# {0}, individuato nuovo formato nel successivo sequenceheader: +video.msg.error.pesext_in_es=!> GOP# {0}, PES_header and estensione trovato in ES, riempito di zeri... (GOP {1}) +video.msg.error.pes_in_es=!> GOP# {0}, PES_header trovato in ES, riempito di zeri... (GOP offs. {1}) +video.msg.error.frame.wrong=!> tipo di frame errato {0}, tref +video.msg.export.start=-> inizio esportazione dei dati video @ GOP# +video.msg.pts.diff=!> individuata una differenza di PTS {0} ({1}) dall'ultimo GOP esportato +video.msg.error.brokenlink=(broken_link corrected) +video.msg.frame.drop=!> ignorando B-Frames inutile @ GOP# {0} / nuova base dei tempi +video.msg.error.frame.not=!> GOP# {0} non contiene frame +video.msg.error.frame.not.i=!> GOP# {0} non inizia con un IFrame a tref '0' +video.msg.error.pts.early=!> il PTS di inizio del GOP# {0} e' prima della fine dell'ultimo GOP.. (atteso. {1}) +video.msg.error.gop.drop=!> ignorando GOP# {0} @ orig.PTS {1} ({2}) +video.msg.error.gop.diff=!> Immagini esp/cnt {0}, inGOP PTS diff. {1}ms, nuova base dei tempi +video.msg.error.gop.dump=-> salva GOP nel file: +video.msg.io.non=no +video.msg.io.int=interlacciato +video.msg.io.pro=progressivo +video.msg.io.int_pro=interlacciato & progressivo +video.msg.length=-> Lunghezza del Video: {0} frame @ +video.msg.gop.summary=-> GOP sintesi: min. {0}, max. {1} fields; contiene {2} frame +video.error.pts.same=-> trovato {0} GOPs con lo stesso PTS per differenti immagini! +video.summary=.Video {0}:\t{1} Frames\t{2}\t\t +video.msg.bitrate.avg=-> avg. bitrate {0}bps (min/max: {1}) +video.msg.bitrate.avgnom=-> avg. nom. bitrate {0}bps (min/max: {1}) +video.msg.bitrate.vbr=-> imposta il primo sequenceheader bitrate a VBR +video.msg.bitrate.val=-> imposta il primo sequenceheader bitrate a {0}bps +video.msg.resolution=-> imposta la risoluzione nel primo sequenceheader da {0} a + +#Teletextprocess +teletext.msg.nooutput=!> nessun formato in uscita per il teletext specificato... +teletext.msg.output=-> formato di uscita: +teletext.msg.tmpfile=-> file temp.: {0} ({1} bytes) +teletext.msg.page=numero pagina +teletext.msg.megaradio=MegaRadio mp3 stream +teletext.progress=ricerca & decodifica +teletext.msg.search=-> cercando +teletext.status=pagine: +teletext.msg.discard=!> {0} PTS scartati nel flusso +teletext.msg.pts.start_end=Teletext PTS: primo pacchetto {0}, ultimo pacchetto +teletext.msg.pts.missed=!> il flusso teletext non usa PTS, impossibile sincronizzare +teletext.msg.pts.mismatch=!> video & teletext PTS non combaciano mai! +teletext.msg.adjust.at.video=-> adeguando la base dei tempi del teletext al video +teletext.msg.adjust.at.own=-> adeguando la base dei tempi del teletext a se stessa +teletext.msg.syncword.lost=!> syncword mancante @ +teletext.msg.syncword.found=!> syncword trovata @ +teletext.msg.vps=-> VPS status: {0} @ PTS +teletext.msg.provider=-> provider: +teletext.msg.program=-> programma: +teletext.msg.summary={0} pagine di No. {1} scritte... +teletext.summary=Teletext {0}:\t{1} pages of No. {2}\t{3}\t +teletext.error.eof=!> Teletext EOF raggiunto in errore: +teletext.error.io=!> Teletext I/O errore: {0} / +teletext.msg.newrun=-> eseguendo 2nd SUP Yoffset + +#Subpictureprocess +subpicture.msg.error3=!> errore nella decodifica delle DVB Subpicture +subpicture.msg.error4=!> mancanza di dati nel pacchetto +subpicture.msg.error5=!> la dimensione del pacchetto non combacia con i dati +subpicture.msg.error6=!> wrong chunk position index +subpicture.msg.error7=!> wrong chunk position +subpicture.msg.error8=!> wrong end of chunk index +subpicture.msg.error9=!> wrong end of chunk +subpicture.msg.model=-> DVB subpicture modello di colore selezionato: {0} ; fissato nel id di pagina: +subpicture.msg.output=-> formato di uscita: +subpicture.msg.tmpfile=-> file temp.: {0} ({1} bytes) +subpicture.progress=controlla & sincronizza +subpicture.msg.discard=!> {0} PTS scartati nel flusso +subpicture.msg.pts.mismatch=!> video & subpicture PTS non combaciano mai! +subpicture.msg.adjust.at.video=-> adeguando la base dei tempi delle subpicture al video +subpicture.msg.adjust.at.own=-> adeguando la base dei tempi delle subpicture a se stesse +subpicture.msg.syncword.lost=!> syncword mancante @ +subpicture.msg.syncword.found=!> syncword trovata @ +subpicture.msg.error={0} @ {1}, ignorando picture... +subpicture.msg.dvbsource=-> la sorgente e' un DVB Subtitle... +subpicture.status=pic's: +subpicture.preview.title.dvdexport=/ picture {0} -> in: {1} durata: +subpicture.preview.title.dvbexport=/ page id {0} / picture {1} -> in: {2} durata: +subpicture.msg.forced=da picture +subpicture.msg.forced.no=-> display status: not forzato, +subpicture.msg.forced.yes=-> display status: forzato, +subpicture.preview.title.noexport=/ picture not esportata... +subpicture.msg.pts.start_end=Subpicture PTS: primo pacchetto {0}, ultimo pacchetto +subpicture.msg.summary={0} subpictures scritte... +subpicture.summary=SubPicture {0}:\t{1} subpictures\t{2}\t +subpicture.msg.error.eof=!> Subpicture EOF raggiunto in errore: +subpicture.msg.error.io=!> Subpicture IO errore {0} / +subpicture.msg.error.dvbdecoding=!> errore di decodifica: {0}, Region_Id {1} (pts {2}) + +#LPCMprocess +lpcm.msg.develop=... in sviluppo ... +lpcm.msg.tmpfile=-> file temp. : {0} ({1} bytes) +lpcm.progress=ccontrolla & sincronizza +lpcm.msg.pts.mismatch=!> video & LPCM PTS non combaciano mai! +lpcm.msg.adjust.at.video=-> adeguando la base dei tempi LPCM al video +lpcm.msg.adjust.at.own=-> adeguando la base dei tempi LPCM a se stesse +lpcm.msg.syncword.lost=!> syncword mancante @ +lpcm.msg.syncword.found=!> syncword trovata @ +lpcm.msg.source=-> src_audio: {0} @ +lpcm.msg.source.max=-> src_audio: visualizzazione interrotta, piu' di 100 cambi di modo individuati in un file, velocita' di elaborazione ridotta +lpcm.msg.error.align=!> pacchetto non WORD aligned +lpcm.msg.pts.start_end=LPCM PTS: primo pacchetto {0}, ultimo pacchetto +lpcm.msg.summary={0} pacchetti scritti... +lpcm.summary=LPCM {0}:\t{1} pacchetti\t{2}\t +lpcm.error.eof=!> LPCM EOF raggiunto in errore: +lpcm.error.io=!> LPCM IO errore: {0} / + +#various +all.msg.pts.faked=--> utilizzando PTS fittizzi per i seguenti dati: +logalias.error.io=!> Logalias IO Error: +all.msg.error.max=-> piu' di 500 errori/avvisi, interrotto il log.. +all.msg.error.summary=-> we have {0} warnings/errors. +all.msg.noprimaryfile=!> il tipo di file non e' supportato come file secondari. Contollare ordine dei file/segmentazione. + +#demux +demux.error.audio.startcode=!> startcode invalido, pacchetto PES rifiutato +demux.error.audio.io=!> errore demultiplex Audio: +demux.error.video.io=!> errore demultiplex Video: +demux.msg.celltimes=--> Celltimes in: {0}CellTimes.txt +demux.error.video.startcode=!> startcode ivalido, pacchetto PES rifiutato +demux.error.video.payload=!> pacchetti PES in ingresso senza dati o con intestazione errata +demux.msg.skip.sec=-> ignora sequence_end_code dopo il GOP# +demux.error.gop.toobig=!> scartando i dati video, GOP piu' grande di 6MB + +#ftpchooser +ftpchooser.server.tip=Nome o indirizzo IP del server ftp +ftpchooser.server=Server: +ftpchooser.port.tip=Porta del server ftp +ftpchooser.port=Porta: +ftpchooser.user.tip=Utente ftp +ftpchooser.user=User: +ftpchooser.password.tip=Password ftp +ftpchooser.password=Password: +ftpchooser.directory.tip=Cartella sul server ftp +ftpchooser.directory=Cartella: +ftpchooser.test=Test +ftpchooser.state.tip=Stato +ftpchooser.state=Stato: +ftpchooser.untested=non provata, provare a connettersi +ftpchooser.ok=OK +ftpchooser.cancel=Cancel +ftpchooser.title=Identifica server ftp +ftpchooser.msg.noconnect=Impossibile collegarsi. +ftpchooser.msg.nologin=Impossibile fare login. +ftpchooser.msg.nodirectory=Impossibile cambiare la cartella. +ftpchooser.msg.success=Tutto a posto. +ftp.command.label=Comando FTP: +ftp.command.tip=comandi FTP specifici per la connessione, per piu' comandi usare il delimitatore '|' +FtpServer.Commands=comando FTP: +FtpServer.Commands.Tip=comandi FTP specifici per la connessione, per piu' comandi usare il delimitatore '|' +FtpPanel.Title=Configurazione FTP + + +#JobCollection +JobCollection.NoInfo=nessuna Info +JobCollection.InProgress=In laovro! +JobCollection.Idle=Nulla da fare. +JobCollection.Action=Azione: +JobCollection.unspecified=non specif. +JobCollection.PrimaryFileSegments=Segmenti file: +JobCollection.SecondaryFiles=File second.: +JobCollection.Cutpoints=Tagli: +JobCollection.Chapters=Capitoli: +JobCollection.PidSelection=Selezione PID: +JobCollection.OwnSettings=configurazione sep.: +JobCollection.AllSize=Dimensione \u03A3: + +#CollectionTable +CollectionTable.FileLocation=Cartella +CollectionTable.FileName=Nome file +CollectionTable.Size=Dimensione +CollectionTable.lastModified=Ultima modifica +CollectionTable.Streamtype=Tipo flusso +CollectionTable.Source=Sorgente + +#PreviewPanel +PreviewPanel.saveCurrentPicture=salva immagine corrente.. +PreviewPanel.saveCurrentPictureDAR=salva immagine corrente con DAR.. + +#NetPanel +NetPanel.WebServerPort=Porta: +NetPanel.WebServerAccess=Stringa di accesso: +NetPanel.autostartWebServer=Avvia automaticamente WebIFServer +NetPanel.Title=Interfaccia Web +NetPanel.autostartWebServer.Tip= +NetPanel.WebServerPort.Tip= +NetPanel.WebServerAccess.Tip= diff -Nru project-x-0.90.4dfsg/resources/pjxresources_nl.properties project-x-0.91.0/resources/pjxresources_nl.properties --- project-x-0.90.4dfsg/resources/pjxresources_nl.properties 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/resources/pjxresources_nl.properties 2009-10-03 09:24:02.000000000 +0000 @@ -0,0 +1,1232 @@ +# Project-X Resource File +# dutch, V 1.2 +# vertaald in NL door Laverda +# + +Common.File=&Bestand +Common.Save=&Opslaan +Common.SaveAs=Opslaan &als.. +Common.Open=O&penen.. +Common.Load=Op&en.. +Common.Edit=&Bewerken +Common.Messages=&Meldingen +Common.Options=Optie&s +Common.Close=S&luiten +Common.Cancel=Afbre&ken +Common.Exit=A&fsluiten +Common.LogFile=Log&bestand +Common.Preferences=&Instellingen +Common.Addons=E&xtra's + +General.Yes=Ja +General.No=Nee + +StartUp.Title=X Starten, laden van componenten... +StartUp.Error=Fout bij het starten van Project-X: +StartUp.Error.Title=Project-X opstartfout +StartUp.Init=Initialiseren +StartUp.Wait=Wachten a.u.b.... +StartUp.Choose=Opties kiezen... + +# +PreferencesPanel.Title=Instellingen +PreferencesPanel.Button=Instellingen + +Application.SaveSettingsOnExit=Instellingen bij afsluiten bewaren + +# Popupmenu +popup.what=wat +popup.cutspecials=open snijden/extra's.. +popup.url=URL toevoegen.. +popup.add=Toevoegen.. +popup.remove=Verwijderen +popup.newOutName=Opslaan als.. +popup.rename=Hernoemen.. +popup.openhex=Openen in Hexviewer.. +popup.patchbasics=Bewerken videobBasics.. +popup.sendtocl3=Stuur aan CL#3.. +popup.changeTimestamp=Bestand tijdsdata bijwerken... +popup.copyInfoToClipboard=Bestandsinformatie van tijdelijk bestand kopieren +popup.assignStreamType=Streamtype direct toewijzen.. +popup.assignActionType=Aktie direct toewijzen.. +popup.unspecified=niet specifiek +popup.automatic=automatisch +popup.fixHpAc3=create corrected Hpョ ac3 file.. +popup.stripAudio=strip raw audio data from DD/DTS-Wave.. + +#Filechooser +FileChooser.Select=Kiezen +FileChooser.Title=Keuze + +#dialog +dialog.input.url=URL ingeven.. + +#File Menu +file.menu=&Bestand +file.url=&URL toevoegen.. +file.add=&Toevoegen.. +file.remove=&Verwijderen +file.rename=&Hernoemen.. +file.exit=&Sluiten + +#Settings Menu +settings.menu=&Instellingen +settings.settings=&Instellingen.. + +#Language Menu +language.menu=&Taal +language.system=&Systeem Standaard +language.check=Controleer &online + +#General Menu +general.menu=&Uiterlijk + +#Options Menu +options.menu=&Bewerken +options.opencutspecials=Open videoschnijden/&extra's.. +options.openhexview=Open in &HexViewer.. +options.pachtbasics=&Patch video basics.. +options.subtitlepreview=Toon &ondertitel preview.. +options.teletext=Toon &teletekst pagina matrix.. + +#Help Menu +help.menu=&Help +help.about=&Over Project-X.. +help.help=&Help.. +help.version=&Versie online controleren +help.version.info=Nieuwste versie: +help.version.info.title=Nieuwste versie van Project-X +help.version.error=Fout bij het controleren van de nieuwste versie van Project-X: + +progress.title=Voortgang + +#Html Frame +html.title=Help + +#Buttons +button.go=&Start! +button.go.Tip=Start, pauze of zet huidig proces voort +button.i=&I +button.i.Tip=Korte bewerking/Scan de invoerdata (in ingevoerde bestandsdata, zie tabblad Export) +button.c=&C +button.c.Tip=Beindigd het lopende proces +button.p=&P +button.p.Tip=Onderbreekt het huidige proces of zet het voort +button.e=&E +button.e.Tip=PVA raw-bestands Extractie, volgens een opgegeven ID: (druk op 'I' om de ID's te vinden) + +#Mainpanel +MainPanel.Process=Proces +MainPanel.Process.Tip=In plaats van demultiplex, wordt een streamformaat gewijzigd in een ander formaat(Datakopie zonder foutcorrectie) +MainPanel.BitrateMonitor.Tip=actuele Bitrate van de GOP, van 0...10 Mbps (afhankelijk van de berekeningswijze) / GOP-Structuur / Afspeeltijd +MainPanel.writtenMB=exp. MB +MainPanel.writtenMB.Tip=Totaal van de weggeschreven MB's van alle nieuw gemaakte bestanden van de actuele collectie (zonder temp. bestanden) +MainPanel.useAllCollections=Alle collecties na elkaar bewerken +MainPanel.useAllCollections.Tip=Activeren, om alle collecties in 鳬n passage te bewerken +MainPanel.enablePostProcessing=Nabewerking activeren +MainPanel.enablePostProcessing.Tip=Activeer nabewerking (-> zie Instellingen 'Extern') +MainPanel.simpleMPG=MPG=>sPES +MainPanel.simpleMPG.Tip=Eenvoudige PES-splitsing; activering MPEG-PS bestanden zonder standaard splitsing van de private_stream_1 +MainPanel.enhancedPES=sPES=>MPG +MainPanel.enhancedPES.Tip=Uitgebreide PES-splitsing; activeren voor PES bestanden met splitsing van de private_stream_1 +MainPanel.useAutoPidFilter=Filter voor PMT-PIDs gebruiken +MainPanel.useAutoPidFilter.Tip=Negeert niet gelinkte PIDs in MP-TS bestanden +MainPanel.nonVideoExportStatus=Niet gestart +MainPanel.nonVideoExportStatus.Tip=Status van de export van audiodata of ondertitels +MainPanel.AudioVideoOffset=A/V afstand +MainPanel.AudioVideoOffset.Tip=Geeft het A/V tijdverschil aan van elke GOP in ms: a/b/c

(Snijpunten,variabele GOPs laten de afstand varieren)

a) A/V PTS Abstand in den Quelldaten

b) momentaner A/V Abstand in der aktuellen GOP in den demultiplexten Dateien

c) endgltiger A/V Abstand in der aktuellen GOP in den demultiplexten Dateien +MainPanel.ConversionMode.demux=demultiplex +MainPanel.ConversionMode.toVDR=naar VDR +MainPanel.ConversionMode.toM2P=naar M2P +MainPanel.ConversionMode.toPVA=naar PVA +MainPanel.ConversionMode.toTS=naar TS +MainPanel.ConversionMode.PidFilter=PID-Filter (1:1 Copy) +MainPanel.ConversionModePriority=Collec. heeft voorrang +MainPanel.ConversionModePriority.Tip=Voorrang heeft de collectie-instelling +MainPanel.Collection=Collecties +MainPanel.QuickStart=SnelStart +MainPanel.QuickStart.Tip=Start het proces direct met de laatste gebruikte instellingen + +#usage note +usage=Korte CL (Commando regels) Help: \n\ +Tip: CL laadt geen GUI (Swing), behalve bij optie [-gui]\n\ + ...start de grafische interface\n\ +Volgorde van de commandostring is willekeurig, niet herkende opties gelden als invoerbestand\n\ +\n\ +Optionen: \n\ +[-ini ] ..gebruikt een ander configuratiebestand dan de Standaard X.ini\n\ +[-dvx1] ..maak een .d2v projectbestand bij het demuxen\n\ +[-dvx2] ..maak een .d2v projectbestand + .ac3.wav (RIFF WAVE Header)\n\ +[-dvx3] ..maak een .d2v projectbestand + .mpa.wav (RIFF WAVE Header)\n\ +[-dvx4] ..maak een .d2v projectbestand + .ac3.wav + mpa.wav (RIFF WAVE Header)\n\ +[-out ] ..gebruik dit pad als doelpad \n\ +[-name ] ..gebruik deze bestandsnaam als doelbestand \n\ +[-cut ] ..gebruik dit bestand als lijst voor snijden \n\ +[-chp ] ..use that text based file as chapterpoint list\n\ +[-id ] ..gebruik alleen deze (P)IDs, gescheiden door een komma \",\"\n\ +[-gui] ..open GUI met de opgegeven CLI opties \n\ +[-log] ..schrijf een normaal logbestand \n\ +[-saveini] ..bij openen van CLI gewijzigde instellingen opslaan \n\ +[-split ] ..split output at xxx MB\n\ +[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..Type van acties + +#conditions +terms=\n\ +GEBRUIKERSVOORWAARDEN:\n\ +(1) Dit is een vrij te gebruiken Java demux gereedschap.\n\ +(2) Het is enkel voor opleiding en niet als commerciel testproject geschreven.\n\ +(3) De broncode is volgens de licenties van GNU GPL gepubliceerd.\n\ +(4) Op de software wordt geen enkele vorm van garantie gegeven.\n\ +(5) Gebruik van de software voor eigen risico en voor zelfstudie.\n\ + + + +terms.disagree=Ik weiger (afsluiten) +terms.agree=Ik accepteer + + +about.title=Over.. +about.ok=Ok + +#version info +version.info=TEST VERSIE +version.user=, Gebruiker: + + +#JavaEV +javaev.java.version=Java.Versie +javaev.java.vendor=Java.Herst. +javaev.java.home=Java.Pad +javaev.java.vm.version=Java.VM.Vers. +javaev.java.vm.vendor=Java.VM.Herst. +javaev.java.vm.name=Java.VM.Naam +javaev.java.class.vers=Java.Kl.Vers +javaev.java.class.path=Java.Kl.Pad +javaev.java.os.name=BS.Naam +javaev.java.os.arch=BS.Archit. +javaev.java.os.version=BS.Versie +javaev.java.user.name=Gebr.Naam +javaev.java.user.home=Gebr.Pad +javaev.java.user.lang=Gebr.Taal +javaev.java.ini.file=ini.bestand +javaev.java.disk.access=ext.HD.toegang + +#messages +msg.infomessage=Informatie +msg.new.language=De Taalkeuze vereist een herstart van Project-X. +msg.loadlang.error=Fout bij het laden van de taalinstellingen. +msg.init.error=Initialisatiefout. +msg.loadini.error=Fout bij het starten van het ini bestand. +msg.saveini.error=Fout bij het schrijven naar het ini bestand. +msg.loading.cutpoints=-> laden {0} Snijpunten. +msg.loading.cutpoints.error=Fout bij het laden van de snijpunten. +msg.loading.pids=-> laden {0} (P)IDs... +msg.ptsfile.error=..pts-bestand toegangsfout: +msg.savecut=-> schrijf snijpunt PTS waarde ({0}) in bestand.. +msg.savecut.error=Fout bij het opslaan van de snijpunten: +msg.log.error=Fout bij het logbestand schrijven: +msg.cuts.cutin=-> Exporteren gestart bij GOP# {0} / nieuw Beeldnr. {1} / nieuwe tijdindex {2} +msg.cuts.cutout=-> Exporteren gestopt bij GOP# {0} +msg.newfile=---> nieuw bestand: +msg.browser.launcher.error=Fout bij het starten van de browser: + +#Hex Viewer +hexviewer.title=Hex waarde +hexviewer.file=Hex waarde voor bestand +hexviewer.filesize= Grootte +hexviewer.error=..Bestandstoegang niet mogelijk +hexviewer.save=Hex waarde, sla op +hexviewer.close=Afsluiten +hexviewer.to=Tot +hexviewer.extractfrom=Extraheer van: (hex.) +hexviewer.extractfrom.Tip=Drukken, om geselecteerde deel in een nieuw bestand te extraheren +hexviewer.extract.Tip=Extraheer bestandsdeel in een nieuw bestand +hexviewer.jumptohex=Spring naar Hex.: +hexviewer.jumptodec=Spring naar Dec.: +hexviewer.jumpto.Tip=Enter-toets drukken om naar bestandspositie te springen. +hexviewer.textmode=Tekstmodus + +#TeletextPageMatrix +ttpagematrix.title=Teletekst pagina matrix +ttpagematrix.Tip=Verminderd de snelheid, wanneer zichtbaar +ttpagematrix.file=Bestand +ttpagematrix.composition1=Teletekst paginanummer samenstelling +ttpagematrix.composition2='MXY' : M = Magazinenummer, XY = paginanummer +ttpagematrix.composition3=Magazinenummer kleuren + +#Scan +scan.unsupported=Bestandstype wordt niet ondersteund +scan.msg1=Geen video gevonden bij kort scannen +scan.msg2=Geen audio gevonden bij kort scannen +scan.msg3=Geen teletekst gevonden bij kort scannen +scan.msg4=Geen ondertitel gevonden bij kort scannen +scan.msg5=Geen PMT gevonden +scan.msg6=PMT Analysefout (taalherkenning) +scan.msg7=Videodata zonder sequenceheader gevonden bij kort scannen +scan.msg8=Analysefout +scan.msg9=Bestand start niet met een sequenceheader! + +#TS +ts.msg1=!> Geen programma-IDs gevonden! ..gebruik standaard-PMT + +#WSS +wss.run_in=Run-In-Code gevonden +wss.no_run_in=Geen Run-In-Code gevonden +wss.startcode=Start-code gevonden +wss.no_startcode=Geen Start-code gevonden +wss.start=Start +wss.group_1=Groep 1 (Beeldformaat) +wss.group_2=Groep 2 (Beeldverbeteringen) +wss.group_3=Groep 3 (Ontertitels) +wss.group_4=Groep 4 (Andere) +wss.group_1.0001=4:3 full format, 576 lines, full screen +wss.group_1.1000=14:9 letterbox, 504 lines, center +wss.group_1.0100=14:9 letterbox, 504 lines, top +wss.group_1.1101=16:9 letterbox, 432 lines, center +wss.group_1.0010=16:9 letterbox, 432 lines, top +wss.group_1.0111=14:9 full format, 576 lines, center, full screen +wss.group_1.1110=16:9 full format, 576 lines, full screen +wss.group_1.error=error parsing group 1 (bits0..3) +wss.group_2.0.01=camera mode +wss.group_2.0.10=film mode +wss.group_2.0.00=error parsing bit4 +wss.group_2.1.01=standaard PAL +wss.group_2.1.10=MACP (motion adaptive color plus) +wss.group_2.1.00=error parsing bit5 +wss.group_2.2.01=no helper +wss.group_2.2.10=helper modulation (PALplus) +wss.group_2.2.00=error parsing bit6 +wss.group_2.3.01=gereserveerd (0) +wss.group_2.3.10=gereserveerd (1) +wss.group_2.3.00=error parsing bit7 +wss.group_3.0.01=geen ondertitel in teletekst +wss.group_3.0.10=ondertitel in teletekst +wss.group_3.0.00=error parsing bit8 +wss.group_3.1.00=no 'open ondertitels' +wss.group_3.1.01='open ondertitels' in actief beeld +wss.group_3.1.10='open ondertitels' buiten actief beeld +wss.group_3.1.11=gereserveerd (11) +wss.group_3.1.err=error parsing bit9..10 +wss.group_4.0.01=no surround sound +wss.group_4.0.10=surround sound +wss.group_4.0.00=error parsing bit11 +wss.group_4.1.01=no copyright/unknown +wss.group_4.1.10=copyright asserted +wss.group_4.1.00=error parsing bit12 +wss.group_4.2.01=copying not restricted +wss.group_4.2.10=copying restricted +wss.group_4.2.00=error parsing bit13 +wss.group_4.1.err=error parsing bit12..13 + +#Subpicture +subpicture.title=Ondertitel preview +subpicture.in_time=In +subpicture.duration=Tijdsduur +subpicture.msg1=!> Ondertitel, Exportfout +subpicture.msg2=!> Eenvoudig pakket (wordt constant weergegeven) +subpicture.msg3=!> Onbekend commando + +#RawRead +rawread.msg1=Deaktiveert of programmbibliotheek niet gevonden + +#Common +common.rename_error1=!> Hernoemen mislukt: +common.rename_error2=naar + +#TabPanel +TabPanel.LogwindowPanel=Log +TabPanel.FileinfoPanel=Info +TabPanel.ExportPanel=Exporteren +TabPanel.SpecialPanel=Extra's +TabPanel.VideoPanel=Video +TabPanel.AudioPanel=Audio +TabPanel.SubtitlePanel=Ondertitel +TabPanel.ExternPanel=Extern +TabPanel.OptionPanel=Opties +TabPanel.PostCommandsPanel=Nabewerken +TabPanel.NetPanel=Net + +#Tab.Ftp +FtpPanel.Title=FTP instellingen + +#Tab.logwindow +ProcessWindow.Title=Procesvenster +ProcessWindowPanel.Button=Openen >>> +ProcessWindowPanel.Title=Logmeldingen +ProcessWindowPanel.Action=Aktie: +LogwindowPanel.showTtxHeader=TTX +LogwindowPanel.showTtxHeader.Tip=Toont de teletekst kopregel en de VPS status bij decoderen (verminderd de snelheid) +LogwindowPanel.showTtxHeader.Tip1=Teletekst kopregel van de actuele gedecodeerde pagina (Regel 0) +LogwindowPanel.showVpsLabel.Tip=VPS status (VBI-regel 16), een paar stations zenden 'zinvolle' VPS data via DVB-teletekst uit + +#Tab.msg +MessagePanel.Title=Meldingen sturen +MessagePanel.logSequenceError=Sequence-/bitfouten vermelden +MessagePanel.logSequenceError.Tip=Deaktiveren, als deze meldingen vaak komt en de snelheid sterk verminderd +MessagePanel.logMissingStartcode=Foute startcodes/synchronisatiewoorden melden +MessagePanel.logMissingStartcode.Tip=Deaktiveren, als deze meldingen vaak komt en de snelheid sterk verminderd +MessagePanel.logESError=Fouten in de elementaire stream melden +MessagePanel.logESError.Tip=Deaktiveren, als deze meldingen vaak komt en de snelheid sterk verminderd +MessagePanel.leadingTimeIndex=Tijdindex van het proces naar alle log-meldingen toevoegen +MessagePanel.leadingTimeIndex.Tip= +MessagePanel.logWSS=WSS meeloggen +MessagePanel.logWSS.Tip= +MessagePanel.logVPS=VPS ook loggen +MessagePanel.logVPS.Tip= +MessagePanel.logRDS=RDS ook loggen +MessagePanel.logRDS.Tip= +MessagePanel.hideProcessWindow=Procesvenster na de start verbergen +MessagePanel.hideProcessWindow.Tip= +MessagePanel.minimizeMainFrame=Hoofdvenster na de start minimaliseren +MessagePanel.minimizeMainFrame.Tip= +MessagePanel.showSubpictureWindow=Ondertitel preview tijdens UT-beeldexport +MessagePanel.showSubpictureWindow.Tip= +MessagePanel.logErrorMaximum=log max. 500 warnings/errors +MessagePanel.logErrorMaximum.Tip= + +#Tab.options +OptionPanel.Various.Title=Diverse +OptionPanel.LookAndFeel=Genstalleerde 'look & feels': +OptionPanel.LookAndFeel.Info1=Kies je favoriete 'look & feel' +OptionPanel.LookAndFeel.Info2=Diverse 'look & feel's zijn niet volledig compatibel +OptionPanel.DebugLog=Grootte van het logbestand automatisch opslaan +OptionPanel.DebugLog.Tip=Verminderde snelheid, alleen voor testdoeleinden +OptionPanel.NormalLog=Normaal logbestand automatisch opslaan +OptionPanel.NormalLog.Tip=Schrijft de logvensterinhoud naar een bestand +OptionPanel.dumpDroppedGop=Geweigerde GOP's in een bestand opslaan +OptionPanel.dumpDroppedGop.Tip=Voor gebruik bij latere foutanalyse +OptionPanel.StartPath=Standaard pad voor bestandslocatie: +OptionPanel.StartPath.Value.Tip=Leeglaten of pad opgeven, een '?' aan het begin zet het pad altijd naar dit pad terug +OptionPanel.Buffer.Title=Buffer +OptionPanel.MainBuffer=Hoofdbuffergrootte in Bytes voor lezen/schrijven +OptionPanel.MainBuffer.Tip=Te wijzigen, een lage waarde verminderd intern geheugengebrek -> 'OutOfMemory' Fout +OptionPanel.PesPreBuffer=I-Buffergrootte in Bytes (bij PES pakketgrootte=0 !) +OptionPanel.PesPreBuffer.Tip=Te wijzigen, voor logbestand, stream met hoge videobitrate vereist een hogere waarde +OptionPanel.ScanBuffer=Buffergrootte in Bytes bij een snelle bestandsscan +OptionPanel.ScanBuffer.Tip=Te wijzigen, probeer een andere waarde, wanneer bekende data niet of verkeerd herkend worden +OptionPanel.PreviewBuffer=Laat buffergrotte in Bytes zien tijdens preview +OptionPanel.PreviewBuffer.Tip=Lagere waarde verhoogd de previewsnelheid, maar kunnen beeldfouten veroorzaken +OptionPanel.callGc=Geheugen vrijgave +OptionPanel.callGc.Tip=Roept de 'prullebak' op +OptionPanel.closeOnEnd=Programma na taak beindigen afsluiten +OptionPanel.closeOnEnd.Tip=Programma na taak beindigen afsluiten +OptionPanel.holdStreamInfoOnOSD=Laat StreamInfo zien in OSD +OptionPanel.holdStreamInfoOnOSD.Tip=Deze optie laat de streaminfo zien in de OSD + + +#ScanInfo +ScanInfo.Location=Speicherort: +ScanInfo.Name=Naam: +ScanInfo.Size=Grootte: +ScanInfo.Bytes=Bytes +ScanInfo.Type=Type: +ScanInfo.Date=Datum: +ScanInfo.Video=Video: +ScanInfo.Audio=Audio: +ScanInfo.Teletext=Teletekst: +ScanInfo.Subpicture=Ondertitel: +ScanInfo.Playtime=geschatte speelduur: +ScanInfo.NotFound=Bestand bestaat niet! + +#Execute +PostCommands.Title=Externe programma's +PostCommands.PostProcessing=Nabewerking: +PostCommands.PostProcessing.Tip=na beendiging van een splitgedeelte dit commando uitvoeren +PostCommands.Execute=uitvoeren +PostCommands.Close=sluiten +PostCommands.Error=!> Fout bij programma uitvoeren: + +#CollectionPanel +CollectionPanel.Title=Collectie extra instellingen +CollectionPanel.Title2=Collectie # +CollectionPanel.Title.processingPreview=verwerkte preview... +CollectionPanel.CutPanel=Preview / gesneden video +CollectionPanel.CutPanel.Tip1=gebruik ook de sneltoetsen voor navigatie, preview alleen bij Bytepos. snijden actief +CollectionPanel.CutPanel.Tip2=actieve bestand/aantal van bestanden + actuele bestandsnaam +CollectionPanel.CutPanel.Tip3=verwerkte (P) ID om actueel beeld te behouden +CollectionPanel.CutPanel.Tip4=getal/nummer hier ingeven, of door middel van Drag'n'Drop een snijpuntbestand hier heen zetten +CollectionPanel.addPoint=toevoegen +CollectionPanel.removePoint=verwijderen +CollectionPanel.NumberOfPoints=Snijpunten +CollectionPanel.NumberOfPoints.Tip=alle waarden worden automatisch gesorteert +CollectionPanel.NumberOfChapters=Hoofdstuk +CollectionPanel.NumberOfChapters.Tip=alle waarden worden automatisch gesorteert +CollectionPanel.expectedSize=Grootte: ~ +CollectionPanel.Preview.offline=Preview niet beschikbaar +CollectionPanel.Preview.processedPid=verwerkte video (P)ID 0x +CollectionPanel.Various=Diverse +CollectionPanel.Preview.fastDecode=Preview snelheid +CollectionPanel.Preview.fastDecode.Tip=lagere kwaliteit, reconstrueerd in interpoleerd alleen 1 van 64 pixles +CollectionPanel.Preview.LiveUpdate=Liveupdate bij het Scrollen +CollectionPanel.Preview.LiveUpdate.Tip=niet aan te bevelen op langzame systemen, zie ook preview buffer +CollectionPanel.Preview.AllGops=GOPs zonder Sequ.Header laten zien +CollectionPanel.Preview.AllGops.Tip=voor DVB data meestal onnodig; alleen activeren als bestanden geen beeld tonen (benvloed snijpunten!) +CollectionPanel.PidList=PES(&Sub)-ID / PID Lijst: +CollectionPanel.PidList.Tip1=Invoer van PED-ID of Sub-ID (MPG etc) of PID (PVA,TS); lege Lijst == gebruik alle IDs +CollectionPanel.PidList.Tip2=dubbelklik om een gekozen notitie te verwijderen +CollectionPanel.transferPids1=transporteer (P)IDs in een nieuwe coll.# +CollectionPanel.transferPids1.Tip=alle gekozen (P) ID's in de lijst naar een nieuwe collectie overbrengen +CollectionPanel.transferPids2=transporteer Pkt.sets in een nieuwe coll.# +CollectionPanel.transferPids2.Tip=Elk snijpuntset wordt in een nieuwe collectie overgebracht +CollectionPanel.ExportLimits=verdere export-beperkingen: +CollectionPanel.OptionHorizontalResolution=H-Resolutie.: +CollectionPanel.OptionHorizontalResolution.Tip=globaal,..negeert alle niet relevante video sequensen +CollectionPanel.OptionDAR=DAR: +CollectionPanel.OptionDAR.Tip=globaal,..negeert alle niet relevante video sequensen +CollectionPanel.loadCutpointList=Snijpunten uit een bestand importeren +CollectionPanel.loadCutpointList.Tip=Snijpuntbestand openen of door middel van Drag'n'Drop hier heen slepen +CollectionPanel.saveCutpointList=Snijpunten in een bestand opslaan +CollectionPanel.ApplyAndClose=overnemen & sluiten +CollectionPanel.Apply=overnemen +CollectionPanel.CutMode.Bytepos=(0) gebruik bytepos. voor snijpunt +CollectionPanel.CutMode.Gop=(1) gebruik GOP nummer voor snijpunt +CollectionPanel.CutMode.Frame=(2) gebruik beeldnummer voor snijpunt +CollectionPanel.CutMode.Pts=(3) gebruik PTS voor snijpunt +CollectionPanel.CutMode.Timecode=(4) gebruik tijdindex voor snijpunt +CollectionPanel.Preview.Error=Preview fouten: +CollectionPanel.FileAccessError=.. kan het bestand niet openen +CollectionPanel.Title.Error=Collectie speciaal instellungen voor coll.# {0} -> Fout! Collectie bestaat niet +CollectionPanel.loadCutpointList.Error=Fout bij het openen van het bestand + +#makeVDR +StreamConverter.IOError=!> IO fout bij stream uitvoer : +StreamConverter.PayloadError=!> ontvangen PES pakket zonder data of met foutieve kopdata +StreamConverter.Summary=Multiplex: + +#patch +PatchPanel.Title=Bewerk video informatie in de 1e sequenskop +PatchPanel.Error=Patch fout +PatchPanel.Error2=Patch fout 2 +PatchPanel.Change=wijzigen +PatchPanel.Cancel=afbreken + +#CutListener +cutlistener.wrongnumber=-> Foutief nummer als ID + +#GoListener +golistener.msg.cancelled=<<< Bewerking afgebroken >>> +golistener.msg.paused=<<< Bewerking onderbroken >>> +golistener.msg.resumed=<<< Bewerking voortgezet >>> +golistener.msg.extracting=extraheer roh(PES) data uit ID 0x + +#AC3 +ac3.msg.loading.start=Open AC3 frames: +ac3.msg.loading.error=Fout bij het openen van het bestand ac3.bin +ac3.msg.frames=ac3.bin bevat {0} AC3 frames + +#Run +run.prepare.colls=Bereid collectie(s) voor... +run.av.offset=A/V tijdverschil +run.session.infos=<<< Sessie informatie >>> +run.working.coll=-> bewerk samenstelling +run.split.output=-> splits uitvoer globaal +run.add.time.offset=-> voeg {0} ms tijdverschil aan audio/ttx/pics toe (als het na een video komt) +run.stream.type.disabled=-> PES stream type uitgeschakeld: +run.write.output.to=-> Schrijf uitvoer bestand: +run.write.output.notexists=!> Opgegeven uitvoer map is niet toegankelijk +run.write.output.nowriteaccess=!> Geen schrijftoegang in uitvoer map +run.cutpoints.defined=Snijpunt(en) geplaatst +run.start.quick.info=<<< Korte informatie >>> +run.end.quick.info=<<< Einde korte informatie >>> +run.no.input=Geen invoerbestand.. +run.write.raw=Schrijf separaat raw-bestand naar: +run.coll.empty=Samenstelling is leeg... +run.done=Gereed... {0} samentelling(en) verwerkt in.. +run.stopped=Gestopt... +run.status=Gereed... +run.splitpart=Actueel deel van gesplitste uitvoer + +#Working +working.convertType.demux=-> demultiplex +working.convertType.makeVDR=-> maak VDR (A/V PES) +working.convertType.makeMPG2=-> maak MPG2 +working.convertType.makePVA=-> maak PVA +working.convertType.makeTS=-> maak TS +working.convertType.packetFilter=-> eenvoudig pakket filter +working.file=+> Bronbestand {0}: {1} ({2} Bytes) +working.file.not.found=!> Bestand niet gevonden ! +working.filetype=-> Bestandstype is {0} +working.file.notsupported=!> Bestandstype wordt niet ondersteund ! +working.end.of.part=---> EINDE VAN DEEL +working.summary=Samenvatting van de gemaakte media bestanden: +working.post.command=-> Laatste taak uitgevoerd: +working.bytes.written=Bytes geschreven... +working.log.error2=Protocol fout 2: +working.output.std=[res] zelfde locatie als 1ste bestand in collectie + +#MPVD +mpvdecoder.tip1=rechts klik om dit beeld als BMP op te slaan + +#FilePanel +FilePanel.DragDrop.Tip=Bestand(en) via Drag & Drop toevoegen of het tekst menu gebruiken +FilePanel.FileUp.Tip=verplaats het (de) geselecteerde bestand(en) omhoog +FilePanel.FileDown.Tip=verplaats het (de) geselecteerde bestand(en) omlaag +FilePanel.FileRemove.Tip=verwijder de bestand(en) uit de collectie +FilePanel.FileAdd.Tip=Bestand(en) aan de collectie toevoegen +FilePanel.CollectionNumber=Coll.# +FilePanel.CollectionNumber.Tip=Kies actieve bestandscollectie uit +FilePanel.addCollection.Tip=voeg nieuwe bestandscollectie toe +FilePanel.removeCollection.Tip=verwijder bestandscollectie +FilePanel.openAutoloadPanel.Tip=open het venster om bestand te selecteren +FilePanel.OutputDirectory=Uitvoermap: +FilePanel.OutputDirectory.Tip=specificatie uitvoermap van geselecteerde collecties, is doelmap +FilePanel.recentOutputDirectories=Laatste uitvoermappen: +FilePanel.addRecentOutputDirectory.Tip=Voeg nieuw pad aan de lijst toe +FilePanel.removeRecentOutputDirectory.Tip=verwijder map uit de lijst van uitvoermappen +FilePanel.Textfield.Tip=collectie-informatie + +#ExternTab +ExternPanel.Title1=Extern / Nabewerking +ExternPanel.Title1.Tip=geef je favoriete programma's op +ExternPanel.Applications=Nabewerking +ExternPanel.createVdrIndex=Maak index.vdr bij "naar VDR" +ExternPanel.createVdrIndex.Tip=gemaakte VDR bestandsdelen worden dan hernoemd naar 0xx.vdr +ExternPanel.createCellTimes=Genereer automatisch CellTimes.txt +ExternPanel.createCellTimes.Tip=..demux alleen, voeg een ingang toe voor het framenummer wanneer van bestand gewisseld wordt of bij een snijpunt (nieuw hoofdstuk) +ExternPanel.exportPts=Sla PTS waardes van snijpunten automatisch op +ExternPanel.exportPts.Tip=voor het delen en hergebruiken van {PTS snijpunt} in een ander X situatie +ExternPanel.save1stFrameOfGop=sla elk 1e I-frame automatisch op als .bmp +ExternPanel.save1stFrameOfGop.Tip=..als BMP, en alleen bij demuxen.. +ExternPanel.createChapters=Sla tijdindex automatisch op bij mode wisseling +ExternPanel.createChapters.Tip=exporteert een extra tijdcode invoer aan de lijst indien een wissel in code volgt +ExternPanel.renameAudio=Hernoem alle MPEG-audio naar *.mpa +ExternPanel.renameAudio.Tip=in plaats van de Layer-Nummer -> .mp1, .mp2, .mp3 +ExternPanel.renameVideo=Hernoem alle MPEG-video naar *.mpv +ExternPanel.renameVideo.Tip=in plaats van MPEG type -> .m1v, .m2v +ExternPanel.Title2=Projectbestands eigenschappen +ExternPanel.Title2.Tip=wijzig de waarden, als je weet waar je mee bezig bent.. +ExternPanel.createM2sIndex=Mpeg2Schnitt idd Versie: V2/A3 +ExternPanel.createM2sIndex.Tip=Maak *.idd projectbestand bij demuxen: +ExternPanel.createD2vIndex=Maak *.d2v projectbestand bij demuxen: +ExternPanel.createD2vIndex.Tip=indien elk deel apart nabewerkt moet worden +ExternPanel.createDgiIndex=Maak *.dgi.d2v projectbestand bij demuxen: +ExternPanel.createDgiIndex.Tip=indien elk deel apart nabewerkt moet worden +ExternPanel.splitProjectFile=Splits video, maar behoud als 鳬n project +ExternPanel.splitProjectFile.Tip=deelt automatisch video op in opgegeven grootte, beter voor grote bestanden op <=FAT32 systemen (maximaal 2GB) +ExternPanel.ProjectFileSplitSize=-> Deel video alleen bij xxx MB: +ExternPanel.ProjectFileSplitSize.Tip=Deel video alleen bij een opgegeven grootte +ExternPanel.appendExtension=Bestands extensie wijziging (PES) +ExternPanel.appendExtension.Tip=behoud de oorspronkelijke bestandsnaam (inclusief extensie) van alle secondaire PES streams + +FtpPanel.killFtpClient=Sluit client zonder uit te loggen +FtpPanel.killFtpClient.Tip=niet gebruiken, behalve als FTP-server geen uitloggen accepteert voordat alle data overgezet is (kan nare gevolgen hebben) +FtpPanel.useFtpServerResume=Server ondersteunt 'Resume' +FtpPanel.useFtpServerResume.Tip=Server ondersteunt hervatten van downloaden + +#SpecialTab +SpecialPanel.Title1=Extra's 1 +SpecialPanel.PtsShift=Globale PTS verschuiving (in uren): +SpecialPanel.PtsShift.Tip=probeer 'auto' of 1..13, in het geval dat het bronbestand A/V PTS fouten bevat, of als het demuxen niet werkt (std=0) +SpecialPanel.PVA.FileOverlap=PVA: op overlappende bestand. contr. +SpecialPanel.PVA.FileOverlap.Tip=uitschakelen, indien meer PVA's in 鳬n opname niet overlappen +SpecialPanel.PVA.Audio=PVA: Audio alleen vlgs specificatie verwerken +SpecialPanel.PVA.Audio.Tip=inschakelen, om foutmeldingen te vermijden, veel niet conforme PVA formaten maken inschakelen noodzakelijk +SpecialPanel.VOB.resetPts=VOB: Bepaal verschillende Cell-timelines +SpecialPanel.VOB.resetPts.Tip=inschakelen, indien timelines niet doorlopend zijn in VobIds/Cells. +SpecialPanel.TS=Alleen TS-formaat gerelateerd: +SpecialPanel.TS.ignoreScrambled=TS: Negeer gecodeerde pakketten +SpecialPanel.TS.ignoreScrambled.Tip=uitschakelen, als je denkt van niet, maar aangegeven worden als gecodeerd +SpecialPanel.TS.blindSearch=TS: Zoeken naar ongecodeerde pakketten +SpecialPanel.TS.blindSearch.Tip=inschakelen, als de PID detectie stopt bij onbekende inhoud +SpecialPanel.TS.joinPackets=TS: Voeg bestandsdelen samen (Dreamboxョ) +SpecialPanel.TS.joinPackets.Tip=inschakelen om onvolledige pakketten aan begin en eind van meerdere bestanden samen te voegen. +SpecialPanel.TS.HumaxAdaption=TS: Humaxョ bestandsformaat lezen. +SpecialPanel.TS.HumaxAdaption.Tip=inschakelen om het speciale Humaxョ TS formaat te kunnen inlezen +SpecialPanel.TS.FinepassAdaption=TS: Finepassョ bestandsformaat inlezen +SpecialPanel.TS.FinepassAdaption.Tip=inschakelen om het speciale Finepassョ formaat in te kunnen lezen +SpecialPanel.TS.JepssenAdaption=TS: Jepssenョ bestandsformaat lezen. +SpecialPanel.TS.JepssenAdaption.Tip=inschakelen om het speciale Jepssenョ TS formaat te kunnen inlezen +SpecialPanel.TS.KoscomAdaption=TS: Koscomョ bestandsformaat lezen. +SpecialPanel.TS.KoscomAdaption.Tip=inschakelen om het speciale Koscomョ TS formaat te kunnen inlezen +SpecialPanel.TS.ArionAdaption=TS: Arionョ bestandsformaat lezen. +SpecialPanel.TS.ArionAdaption.Tip=inschakelen om het speciale Arionョ TS formaat te kunnen inlezen +SpecialPanel.TS.generatePmt=TS: genereer PMT stream afhankelijkheid +SpecialPanel.TS.generatePmt.Tip=uitschakelen om onafhankelijk gedefinieerde standaard PMT te genereren +SpecialPanel.TS.generateTtx=TS: genereerd info TTX service (test) +SpecialPanel.TS.generateTtx.Tip=toevoegen van een teletekst service (Pid 0x9F) voor statusinformatie op pagina 150 (alleen bij userPMT) +SpecialPanel.TS.HeaderMode0=(0) geen extra TS header +SpecialPanel.TS.HeaderMode1=(1) genereerd Topfieldョ 4000 header +SpecialPanel.TS.HeaderMode2=(2) genereerd Topfieldョ 5000 header +SpecialPanel.TS.HeaderMode3=(3) genereerd Topfieldョ 5x00 header (nieuw) +SpecialPanel.TS.HeaderMode4=(4) genereerd Topfieldョ 5x00(C) header (nieuw) +SpecialPanel.TS.HeaderMode5=(5) genereerd Arionョ header +SpecialPanel.TS.setMainAudioAc3=TFョ-Header: zet AC3 als aktief audiospoor +SpecialPanel.TS.setMainAudioAc3.Tip=TFョ-Header: zet AC3 als 1ste audiospoor +SpecialPanel.Title2=Extra's 2 +SpecialPanel.Input.getEnclosedPackets=Accept. alleen gesloten ES/TS paketten +SpecialPanel.Input.getEnclosedPackets.Tip=uitschakelen als er geen pakket of veel fouten worden gevonden +SpecialPanel.Input.concatenateForeignRecords=Voeg verschillende opnames samen +SpecialPanel.Input.concatenateForeignRecords.Tip=inschakelen om een beter samen te voegen van opnames onafhankelijk van type (PVA,MPEG,VDR,PES), maar verschillende tijden +SpecialPanel.Audio.ignoreErrors=Audio: alleen eerste sync.pkt gebruiken +SpecialPanel.Audio.ignoreErrors.Tip=synchroniseert alleen het startpunt, verdere synchronisatiefouten worden genegeerd, gaten niet opgevuld +SpecialPanel.Audio.limitPts=Audio: alleen eerste sync.pkt gebruiken +SpecialPanel.Audio.limitPts.Tip=beter dan de eerste optie, audio blijft waarschijnlijk synchroon lopen +SpecialPanel.Video.ignoreErrors=Video: fouten na de 1ste GOP negeren +SpecialPanel.Video.ignoreErrors.Tip=inschakelen als er vermoedelijk alleen video PTS fouten optreden (die fout behandeld worden) +SpecialPanel.Video.trimPts=Video: accepteer overlopende PTSs +SpecialPanel.Video.trimPts.Tip=inschakelen indien audio export vroegtijdig stopt, veroorzaakt door overlappende PTS-verschuiving +SpecialPanel.Conversion=Alleen op 'XYZ' conversie gerelateerd: +SpecialPanel.Conversion.startWithVideo=1ste PES-pakket moet met video starten +SpecialPanel.Conversion.startWithVideo.Tip=inschakelen, daar sommige spelers problemen hebben, indien niet dan uitschakelen +SpecialPanel.Conversion.addPcrToStream=Genereer PCR/SCR uit PTS +SpecialPanel.Conversion.addPcrToStream.Tip=geef de PCR afstand op, DVB vereist vaak hogere waarden dan DVD, net als hogere Bitrates +SpecialPanel.Conversion.PcrCounter=incTScnt +SpecialPanel.Conversion.PcrCounter.Tip=verhoog TS-pakket teller ook zonder Payload (PCR-only); niet conform spcificatie, maar vaak nodig + +#OutTab +ExportPanel.SplitPanel=Uitvoer delen +ExportPanel.SplitSize=splits bij circa xxx MB +ExportPanel.SplitSize.Tip=andere waarde mogelijk, de deelgrootte heeft betrekking op de geschreven videodata (mpv) +ExportPanel.Overlap=Overlap met +ExportPanel.Overlap.Tip= +ExportPanel.StreamtypePanel=Verwerking van de elementaire streams +ExportPanel.StreamtypePanel.Tip=De of selecteer het stream type dan je wilt genereren (werkt niet bij'ES' als invoerbestand) +ExportPanel.Streamtype.MpgVideo=MPEG video +ExportPanel.Streamtype.MpgAudio=MPEG audio +ExportPanel.Streamtype.Ac3Audio=AC3/DTS audio +ExportPanel.Streamtype.PcmAudio=LPCM audio +ExportPanel.Streamtype.Teletext=Teletekst +ExportPanel.Streamtype.Subpicture=Ondertitel +ExportPanel.Streamtype.Vbi=Generic_VBI +ExportPanel.Streamtype.MpgVideo.Tip=MPEG video +ExportPanel.Streamtype.MpgAudio.Tip=MPEG audio +ExportPanel.Streamtype.Ac3Audio.Tip=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio.Tip=LPCM Audio +ExportPanel.Streamtype.Teletext.Tip=Teletekst +ExportPanel.Streamtype.Subpicture.Tip=Ondertitel +ExportPanel.Streamtype.Vbi.Tip=Generic_VBI +ExportPanel.WriteOptions=Schrijfopties algemeen +ExportPanel.WriteOptions.Tip=werkt bij demuxen en alle converteringen +ExportPanel.WriteOptions.writeVideo=schrijf videodata +ExportPanel.WriteOptions.writeVideo.Tip=schrijf videodata +ExportPanel.WriteOptions.writeAudio=schrijf alle andere data +ExportPanel.WriteOptions.writeAudio.Tip=schrijf alle andere data +ExportPanel.WriteOptions.InfoScan=snelle demux/convertering van de eerste MB: +ExportPanel.additionalOffset.Title=extra tijdverschil (demultiplex) +ExportPanel.additionalOffset=activeert offset +ExportPanel.additionalOffset.Tip=de oorspronkelijke start van de data wordt overeenkomstig verschoven +ExportPanel.additionalOffset.Value.Tip=Waarde in milliseconden, ingeven en bevstigen; geldt voor alle data die na een video komen +ExportPanel.createSubDirNumber=maak een nieuwe submap (directory) voor elk collectienummer (beter voor zelfde bestanden in verschillende collecties) +ExportPanel.createSubDirNumber.Tip=global: aanbevolen, maakt een nieuwe submap (directory) voor elk collectienummer (beter voor zelfde bestanden in verschillende collecties) +ExportPanel.createSubDirName=maak in de collectie-bronmap een nieuwe submap +ExportPanel.createSubDirName.Tip=global: aanbevolen, als het zelfde bestand gelijktijdig in meerdere collecties verwerkt wordt. + +#VideoTab +VideoPanel.Title1=Video correcties (demultiplex) +VideoPanel.addEndcode=Sequencendcode aan het einde toevoegen +VideoPanel.addEndcode.Tip=inschakelen voor conforme MPEG sequence einde +VideoPanel.insertEndcode=Sequencendcode aan het einde toevoegen +VideoPanel.insertEndcode.Tip=inschakelen voor conforme MPEG sequence einde +VideoPanel.addSequenceHeader=Voeg ontbr. sequencehead toe aan elke GOP +VideoPanel.addSequenceHeader.Tip=verbeterd het (versneld) spoelen in de video bij afspelen +VideoPanel.patchToProgressive=Zet alle beelden op progressive +VideoPanel.patchToProgressive.Tip=plaats de progressive Bit +VideoPanel.patchToInterlaced=Zet alle beelden op 'interlaced' +VideoPanel.patchToInterlaced.Tip=verwijderd de progressive Bit +VideoPanel.toggleFieldorder=Wijzig weergave volgorde +VideoPanel.toggleFieldorder.Tip=wissel 'field' volgorde +VideoPanel.clearCdf=Composite.display.flag uitschakelen +VideoPanel.clearCdf.Tip=moet het 'groene blokje probleem' van bepaalde oude HW-Decoder Chips oplossen +VideoPanel.patchResolution.Tip=beperkte patch van de 1ste horizontale beeldlijn +VideoPanel.patchResolution=1ste H-res.: +VideoPanel.patchResolutionValue.0=(0) nooit +VideoPanel.patchResolutionValue.1=(1) altijd +VideoPanel.patchResolutionValue.2=(2) als <> 352|720 +VideoPanel.patchResolutionValue.3=(3) als <> naar 352|704|720 +VideoPanel.addSde=Resolutie op SDE zetten +VideoPanel.addSde.Tip=wijzigd bestannde of voeg een nieuwe vermelding toe, leeg veld betekend zelfde sequenceregel: m.a.w. 720*576 +VideoPanel.SdeValue.Tip=舅dert existierende oder erg舅zt Eintr臠e, leeres Feld setzt die Daten lt. Sequenzkopf; Bsp: 720*576 +VideoPanel.Title2=Nieuwe Bitratewaardes (demultiplex) +VideoPanel.Unchanged=Ongewijzigd +VideoPanel.ChangeVbvBuffer=VBV buffer: +VideoPanel.ChangeVbvBuffer.Tip=alternatieve waarden +VideoPanel.ChangeVbvBuffer.Mode1=(1 SD maximum (112*16384) +VideoPanel.ChangeVbvDelay=VBV vertraging: +VideoPanel.ChangeVbvDelay.Tip=wijzig als je meent dit nodig te vinden +VideoPanel.ChangeVbvDelay.Mode1=(1) maximum tijd +VideoPanel.ChangeAspectRatio=Aspect ratio: +VideoPanel.ChangeAspectRatio.Tip=alternatieve waardes, indien je denkt dat het nodig is +VideoPanel.patchBitrateValue=Bitrate waarde naar Sequence: +VideoPanel.patchBitrateValue.0=(0) behoud origineel +VideoPanel.patchBitrateValue.1=(1) bereken uit de GOP lengte +VideoPanel.patchBitrateValue.2=(2) bereken uit de VBV +VideoPanel.patchBitrateValue.3=(3) markeer als VBR (MPEG-1 Video) +VideoPanel.patchBitrateValue.4=(4) fix 3 Mbps +VideoPanel.patchBitrateValue.5=(5) fix 6 Mbps +VideoPanel.patchBitrateValue.6=(6) fix 9 Mbps +VideoPanel.patchBitrateValue.7=(7) fix 12 Mbps +VideoPanel.patchBitrateValue.8=(8) fix 15 Mbps +VideoPanel.patch1stBitrateValue=Bitrate waardes per sequence: +VideoPanel.patch1stBitrateValue.0=(0) behoud origineel +VideoPanel.patch1stBitrateValue.1=(1) bereken gemiddelde (nominal) +VideoPanel.patch1stBitrateValue.2=(2) bereken maximum <= 9.0 Mbps(DVD) +VideoPanel.patch1stBitrateValue.3=(3) bereken maximum (b.v. HDTV) +VideoPanel.patch1stBitrateValue.4=(4) markeer als VBR (MPEG-1 Video) + +#AudioTab +AudioPanel.Title1=Audio convertering (demultiplex) +AudioPanel.losslessMpaConversion.Tip1=directe verliesvrije convertering (beperkt) +AudioPanel.losslessMpaConversion.Tip2=naar MPEG-1, Layer2, 48kHz, 56..384kbps) : +AudioPanel.losslessMpaConversion.Tip=indien ingeschakeld, blijven bitrate & channelmode constant +AudioPanel.losslessMpaConversionMode0=(0) geen convertering +AudioPanel.losslessMpaConversionMode1=(1) 1-kanaal naar 3D-stereo (L+R = origineel) +AudioPanel.losslessMpaConversionMode2=(2) 1-kanaal naar stereo (L+R = origineel) +AudioPanel.losslessMpaConversionMode3=(3) 1-kanaal naar J-stereo (L+R = origineel) +AudioPanel.losslessMpaConversionMode4=(4) 2-kanaal/stereo naar 2* 1-kanaal (1=L,2=R) +AudioPanel.decodeMpgAudio=Decodeer MPEG Layer1,2 naar PCM: +AudioPanel.decodeMpgAudio.Tip=MPEG-Audio decoder (niet voor Layer 3), Std-uitvoer in stereo pcm +AudioPanel.decodeMpgAudio.resampleAudioMode0=(0) geen resampling +AudioPanel.decodeMpgAudio.resampleAudioMode1=(1) lineares resampling 48kHz naar 32kHz +AudioPanel.decodeMpgAudio.resampleAudioMode2=(2) lineares resampling 48kHz naar 44.1kHz +AudioPanel.decodeMpgAudio.Normalize=Normalize naar % : +AudioPanel.decodeMpgAudio.Normalize.Tip=normalize L+R gelijkmatig, waarden van 0...100 zijn mogelijk, std is 98%; verseist herstart indien nodig +AudioPanel.NormalizeValue.Tip=normalize L+R gelijkmatig, waarden van 0...100 zijn mogelijk, std is 98%; verseist herstart indien nodig +AudioPanel.decodeMpgAudio.Downmix=Downmix en exporteer als 1-kanaals audio +AudioPanel.decodeMpgAudio.Downmix.Tip=downmix stereo/2-kanaal bronbestand naar 1 kanaals audio +AudioPanel.decodeMpgAudio.changeByteorder=Sla op in Motorola Byte volgorde +AudioPanel.decodeMpgAudio.changeByteorder.Tip=betekend MSB eerst, nonIntel type +AudioPanel.decodeMpgAudio.addRiffHeader=RIFF(RIFX)header toevoegen (.wav) +AudioPanel.decodeMpgAudio.addRiffHeader.Tip=PC standaard +AudioPanel.decodeMpgAudio.addAiffHeader=AIFF header toevoegen (.aif) +AudioPanel.decodeMpgAudio.addAiffHeader.Tip=Apple standaard +AudioPanel.Title2=Title2=Audio aanpassingen (demultiplex) +AudioPanel.validateCRC=Controleer CRC (AC-3 / MPEG-Audio L1,2) +AudioPanel.validateCRC.Tip=verminderd de de kans op fouten, indien ingeschakeld, verminderd de snelheid +AudioPanel.clearCRC=Verwijder CRC (MPEG-Audio Layer1,2) +AudioPanel.clearCRC.Tip=indien ingeschakeld, kan dit sommige audio foutmeldingen verminderen (CRC normaal niet vereist) +AudioPanel.fillGapsWithLastFrame=Vul gaten met copy vorig frame +AudioPanel.fillGapsWithLastFrame.Tip=in plaats van stilte in te voegen, wordt een copy laatste frame ingevoegd +AudioPanel.addFrames=Frames aan het einde invoegen +AudioPanel.addFrames.Tip=wanneer audio voor video eindigd, om nagenoeg gelijke afspeelduur te verkrijgen +AudioPanel.patch1stAc3Header=AC-3: patch 1ste kof naar 3/2 kanaalmodus +AudioPanel.patch1stAc3Header.Tip=veel software gaat uit van de info in de eerste kop voor bepaalde instellingen +AudioPanel.replaceAc3withSilence=AC-3: vervang alle non-3/2 met 3/2 stilte +AudioPanel.replaceAc3withSilence.Tip=activeren, om ongewenste stilte met 3/2 Stilte te maskeren (48khz,448kbps, ac3.bin vereist) +AudioPanel.addRiffToAc3=RIFF WAVE header aan AC-3 audio toevoegen +AudioPanel.addRiffToAc3.Tip=maak een .wav bestand volgens het AC-3 formaat (tag 0x2000) header +AudioPanel.addRiffToMpgAudioL12=MPA: RIFF WAVE header toevoegen Layer1,2 +AudioPanel.addRiffToMpgAudioL12.Tip=maak een .wav bestand met gebruikmaking van het 'Broadcast Wave Format' (tag 0x0050) +AudioPanel.addRiffToMpgAudioL3=MPA: RIFF WAVE header toevoegen Layer3 +AudioPanel.addRiffToMpgAudioL3.Tip=maak een .wav met gebruikmaking van het 'ACM Wave Format' (tag 0x0055) +AudioPanel.pitchAudio=Negeer elk xxx. audioframe: +AudioPanel.pitchAudio.Tip=versneld audio (alleen bij elementaire streams) +AudioPanel.allowSpaces=Sta leegtes toe tussen Frames (h.w.c.!) +AudioPanel.allowSpaces.Tip=detecteerd alleen geldige frame headers, maar zonder frame-lengte! (resulterend in niet correcte psb. grootte +AudioPanel.createDDWave=AC-3/DTS: output as DD/DTS-Wave +AudioPanel.createDDWave.Tip=output Ac3/DTS as DD/DTS-Wave, fixed header: PCM 44.1kHz,16bit,2-ch + +#SubtitleTab +SubtitlePanel.Title=DVB/DVD ondertitel-uitvoer (demultiplex) +SubtitlePanel.Title.Teletext=DVB Teletekst (demultiplex) +SubtitlePanel.decodeMegaradio=(Test) exporteer MegaRadioョ MP3-stream +SubtitlePanel.decodeMegaradio.Tip=vroeger uitgezonden op Hotbird 13ーE, 11.054GHz Hor., SR 27500, FEC 5/6, TTX-PID 553, aus NBC/Giga Teletext +SubtitlePanel.decodeHiddenRows=Decodeer inaktieve regels in de teletekst +SubtitlePanel.decodeHiddenRows.Tip=veel regels, pagina's en diensten zijn 'verborgen' +SubtitlePanel.rebuildPTS=Repareer TTX-PTS uit de 1ste MpgAudio stream +SubtitlePanel.rebuildPTS.Tip=alleen gebruiken bij TTX data (die zich bevinden in TS,Mpg,VDR..) maar zonder correcte tijd-link aan video +SubtitlePanel.keepOriginalTimcode=Originele Timecode(PTS) behouden +SubtitlePanel.keepOriginalTimcode.Tip=alleen bij demultiplex/decodierung zonder video blijft de originele tijd behouden (voor eventueel later gebruik)) +SubtitlePanel.exportTextAsUnicode=Unicode (UTF-16 BE) bij tekst export +SubtitlePanel.exportTextAsUnicode.Tip=Unicode (UTF-16 Big-Endian) bij tekst export +SubtitlePanel.exportTextAsUTF8=Unicode (UTF-8) bij tekst export +SubtitlePanel.exportTextAsUTF8.Tip=Unicode (UTF-8) bij tekst export +SubtitlePanel.TtxPages=Te decoderen teletekst pagina's: +SubtitlePanel.TtxPages.Tip=autodetectie van speciala karakters gebaseerd op 'Teletext Level 1.5 codepages in unicode' +SubtitlePanel.Language=Taal: +SubtitlePanel.Language.Tip=taalkeuze, indien de taal niet automatisch gekozen wordt, wegens onvolledige ondersteuning door zender +SubtitlePanel.Format=Ondertitel export formaat: +SubtitlePanel.Format.Free=Tekst +SubtitlePanel.Format.Tip=selecteer je favoriete export formaat +SubtitlePanel.Format.SUP.Values.Tip=Lettergrootte(recht!); BG-Transparant; Y-Diff.; X-Diff.; X-Breedte; Beeldbreedte; Beeldhoogte; Y2-Diff.; maximum aantal regels +SubtitlePanel.Colormodel=Simuleer DVB ondertitel IRD kleurmodel: +SubtitlePanel.Colormodel.Tip=Heeft direct betrekking op de kwaliteit van de decodering, de beste instellingen hangen van verder gebruik af +SubtitlePanel.Colormodel.Mode0=(0) 4 kleuren +SubtitlePanel.Colormodel.Mode1=(1) 16 kleuren +SubtitlePanel.Colormodel.Mode2=(2) 256 kleuren +SubtitlePanel.PageId=ken toe aan pagina ID: +SubtitlePanel.PageId.Value.Tip=Leeg laten voor automatische herkenning, anders invoeren van paginanummer bij meerdere pagina's (afhankelijk van de overdracht) +SubtitlePanel.showPreview=Preview ondertitel +SubtitlePanel.SupValues=Waarde: +SubtitlePanel.Font=Lettertype: +SubtitlePanel.Font.Tip=Bij SUP-Export +SubtitlePanel.Font.LoadError=Fout bij laden systeem lettertypen +SubtitlePanel.useTextOutline=Tekst letters met zwarte randen +SubtitlePanel.useTextOutline.Tip=SUP-Export: voorziet elek letter met 3 pixles rand bij maximaal 2 'speaker colors' per frame, anders hele karakter zwart + +#Autoload +autoload.title=Lijst van voorgedefinieerde bron directories +autoload.dir.remove.Tip=verwijder map uit de lijst +autoload.dir.add.Tip=voeg directorie aan de lijst toe +autoload.dir.refresh.Tip=Directory lijst vernieuwen +autoload.ftp.add.Tip=voeg FTP Server directorie aan de lijst toe +autoload.add.coll.Tip=maak een nieuwe collektie voor elke geselecteerd bestand en voeg deze toe +autoload.rename.Tip=links dubbelklikken of 'Enter' toets om bestand(en) toe te voegen, rechts dubbelklikken om naam te wijzigen +autoload.dialog.rename=Naam wijzigen +autoload.dialog.fileexists=Bestand bestaat! Overschrijven? +autoload.close=Venster sluiten + +#splitreset +splitreset.novideo=! -> geen videobestand PTS, delen (split) uitgeschakeld + +#checkpts +checkpts.1st.latter=!> eertste video PTS start later dan de laatste PTS uit deze stream! kritisch voor synchronisatie +checkpts.last.ends=!> laatste video PTS eindigd voor de start van PTS uit deze stream! Synchronisatie niet mogelijk! + +#parseSecondaryPES +parseSecondaryPES.continue=-> ge verder met de gextraheerde raw data van +parseSecondaryPES.demux.pes=demultiplex PES bestand +parseSecondaryPES.missing.startcode=!> Startcode mist pos.: +parseSecondaryPES.found.startcode=!> Startcode gevonden bij pos.: +parseSecondaryPES.packet.length=-> ! Pakketlengte is 0 bij +parseSecondaryPES.miss.next.startcode=!> volgende startcode mist bij pos.: {0} van {1} (PES-ID 0x{2}), negeer pakket... +parseSecondaryPES.packs=packs: {0} {1}% {2} +parseSecondaryPES.found.pesid=-> gevonden: PES-ID 0x{0} {1} bij {2} +parseSecondaryPES.ac3.audio=--> AC-3/DTS audio +parseSecondaryPES.teletext=--> Teletekst +parseSecondaryPES.mpeg.audio=--> MPEG audio +parseSecondaryPES.lpcm.audio=--> LPCM audio +parseSecondaryPES.subpic=--> Ondertitel +parseSecondaryPES.eof.error=parseSecondaryPES EOF bereikt bij fout: +parseSecondaryPES.io.error=parseSecondaryPES bastands I/O fout: +parseSecondaryPES.msg.noexport=--> Stream weggelaten + +#ID type +idtype.mpeg.video.ignored=(MPEG Video) -> genegeerd +idtype.mpeg.audio=(MPEG Audio) +idtype.private.stream=(private_stream_1) +idtype.mpeg.video=(MPEG Video) +idtype.mapped.to=gewijzigd in 0x +idtype.mapped.to.e0=gewijzigd in 0xE0 +idtype.ignored= -> genegeerd +idtype.video=(Video) +idtype.main.audio=(hoofd-audio) +idtype.additional=(extra's) +idtype.has.pesid= heeft PES-ID 0x + +#parsePrimaryPES +parsePrimaryPES.special.pes=-> speciale PES-IDs voor de het zoeken gedefinieerd +parsePrimaryPES.continue=ga verder met bestand: +parsePrimaryPES.demuxing=demultiplex +parsePrimaryPES.converting=converteer +parsePrimaryPES.avpes.file=A/V PES bestand +parsePrimaryPES.missing.startcode=!> Startcode mist bij pos.: +parsePrimaryPES.found.startcode=!> Startcode gevonden bij pos.: +parsePrimaryPES.split.cellids=-> VobID {0} CellID {1} bij {2} (GOP#{3} / Bild#{4}) +parsePrimaryPES.packet.length=-> ! Pakketlenngte is 0 bij +parsePrimaryPES.miss.startcode=!> volgende startcode mist bij pos.: {0} van {1} (pakketgrootte=0) / I-buffer {2} +parsePrimaryPES.miss.startcode2=!> volgende startcode mist bij pos.: {0} van {1} (PES-ID 0x{2}), negeer pakket.. +parsePrimaryPES.packs=Paketten +parsePrimaryPES.dump.1st=-> schrijf 1ste pakket in bestand +parsePrimaryPES.found.pesid=-> gevonden: PES-ID 0x +parsePrimaryPES.pes.incoming=!> PES-ID 0x{0}, gemporteerde PES pakket zonder data of foutieve header bij {1} +parsePrimaryPES.actual.written=-> tot nu toe geschreven beelden: +parsePrimaryPES.switch=wissel naar bestand: +parsePrimaryPES.ac3=--> AC-3/DTS audio +parsePrimaryPES.teletext=--> Teletekst (SubID 0x +parsePrimaryPES.mpeg.audio=--> MPEG audio (0x +parsePrimaryPES.lpcm.audio=--> LPCM audio (SubID 0x +parsePrimaryPES.subpic=--> Ondertitel (SubID 0x +parsePrimaryPES.eof.error=parsePrimaryPES EOF bereikt met Fout: +parsePrimaryPES.io.error=parsePrimaryPES bestands I/O fout: +parsePrimaryPES.msg.noexport=--> Stream weggelaten (0x + +#parseTS +parseTS.sid=-> Service ID 0x +parseTS.pmt.refers=-> PMT 0x{0} verwijst naar deze bruikbare streams: +parseTS.no.pmt=-> geen PMT gevonden (met korte Scan) +parseTS.special.pids=-> speciale PIDs voor de het zoeken gedefinieerd +parseTS.continue=ga verder met bestand: +parseTS.demuxing=demultiplex +parseTS.converting=konverteer +parseTS.dvb.mpeg= DVB MPEG-TS bestand +parseTS.incomplete=!> incompleet TS-pakket aan het bestandseinde gevonden bij +parseTS.comp.failed=!> TS-Paket completering mislukt :-( +parseTS.missing.sync=!> missend synchronisatie byte bij +parseTS.comp.ok=!> TS-Paket completering ok :-) +parseTS.found.sync=!> Synchronisatie byte gevonden bij pos.: +parseTS.bit.error=!> PID 0x{0} -> TS beeldfout in pakket {1} bij pos. {2}, negeer.. +parseTS.stuffing=-> PID 0x1FFF >> vul-pakket -> genegeerd +parseTS.scrambled=!> PID 0x{0} >> Data gecodeerd, pakket {1} bij {2} -> genegeerd +parseTS.clear=-> PID 0x{0} >> ongecodeerde data gevonden, pakket {1} bij {2} +parseTS.outof.sequence=!> PID 0x{0} -> Paket {1} bei pos.: {2} au゚erhalb der Sequenz ({3}/{4}) (Z臧lerkorrektur..) +parseTS.priv.stream2.ignored=-> PID 0x{0}(private_stream_2) -> genegeerd +parseTS.scrambled.notignored=-> PID 0x{0} >> Data als gecodeerd gemarkeerd (niet genegeerd){1} +parseTS.ignored= -> genegeerd +parseTS.pid.has.pes=ok> PID 0x{0} heeft PES-ID 0x{1} {2} +parseTS.lackof.pes=!> PID 0x{0} heeft geen PES data -> pakket overgeslagen +parseTS.actual.vframes=-> tot nu toe geschreven beelden: +parseTS.tryto.complete=!> probeer onvolledig TS-pakket compleet te maken.. +parseTS.packs=packs: {0} {1}% {2} +parseTS.ac3.audio=--> AC-3/DTS audio bij PID 0x +parseTS.teletext.onpid=--> Teletekst bij PID 0x +parseTS.mpeg.audio=--> MPEG audio (0x{0}) bij PID 0x{1} +parseTS.subpicture=--> Ondertitel (SubID 0x +parseTS.eof.error=ts EOF bereikt met fout: +parseTS.io.error=ts bestands I/O fout: +parseTS.switch.to=wissel naar bestand: +parseTS.msg.noexport=--> StreamID (0x{0}) bij PID 0x{1} weggelaten + +#nextfile +nextfile.io.error=volgend bestands I/O fout: +nextfile.shift.auto=-> verschuif originele PTS automatisch terug met {0} uren(n) +nextfile.shift.manual=-> verschuif originele PTS handmatig terug met {0} uren(n) +nextfile.next.file.start=-> volgend bestand starten met PTS: {0} / laatste actuele PTS is {1} +nextfile.next.file.start.adaption=-> gebruik PTS-Offset: {0} vanaf hier + +#overlapPVA +overlappva.io.error=overlap leesfouten: + +#parsePVA +parsePVA.special.pids=-> speciale PIDs voor de het zoeken gedefinieerd +parsePVA.streamtype.ac3= (AC-3/DTS) +parsePVA.streamtype.ttx= (TTX) +parsePVA.streamtype.mpeg.audio= (MPEG audio) +parsePVA.streamtype.mpeg.video= (MPEG video) +parsePVA.continue=ga verder met bestand: +parsePVA.demuxing=demultiplex +parsePVA.converting=konverteer +parsePVA.pvafile= PVA bestand +parsePVA.missing.sync=!> Synchronisatie byte mist bij pos.: +parsePVA.found.sync=!> Synchronisatie byte gevonden bij pos.: +parsePVA.file.overlap=Bestandsoverlapping gevonden bij pos.: +parsePVA.packs=Paketten +parsePVA.found.id=-> gevonden: ID 0x +parsePVA.outof.sequence=!> ID 0x{0} -> pakket {1} bij pos.: {2} buiten de sequence ({3}/{4}) (Tellercorrectie..) +parsePVA.id.0x=-> ID 0x +parsePVA.actual.vframes=-> tot nu toe geschreven beelden: +parsePVA.ac3.onid=--> AC-3/DTS audio bij ID 0x +parsePVA.teletext.onid=--> Teletekst bij ID 0x +parsePVA.mpeg.audio.onid=--> MPEG audio bij ID 0x +parsePVA.eof.error=PVA EOF bereikt met fout: +parsePVA.io.error=PVA I/O fout: +parsePVA.msg.noexport=--> Stream weggelaten bij ID 0x + +#Audioprocess +audio.progress=test & synchroniseer audiobestand +audio.status.pre-insert=voeg aan het begin in... +audio.status.insert=voeg in... +audio.status.write=schrijf... +audio.status.pause=wacht... +audio.status.add=voeg toe... +audio.status.finish=gestopt... +audio.convert=-> converteer MPA : +audio.decode=-> decodeer MPA : +audio.restart=!> start audiobewerking nieuw, veroorzaakt door wijzigingen in het uitvoer frame# +audio.error.io=Audio I/O fout: +audio.msg.pts.discard=!> {0} PTS's weggelaten in de stream +audio.msg.pts.firstonly=-> gebruik alleen de eerste audio PTS (om startpunt te synchroniseren) +audio.msg.pts.start_end=Audio PTS: eerste pakket {0}, laatste pakket +audio.msg.pts.mismatch=!> Video & audio PTS komen geen moment overeen! +audio.msg.pts.wo_frame=!> PTS zonder een frame +audio.msg.adjust.at.videopts=-> pas de audio aan video-tijdlijn aan +audio.msg.adjust.at.ownpts=-> pas de audio aan eigen tijdlijn aan +audio.msg.addriff.acm=-> voeg RIFF WAVE header toe aan MPEG audio in ACM Waveformaat +audio.msg.addriff.bwf=-> voeg RIFF WAVE header toe aan MPEG audio in BWF Waveformaat +audio.msg.addriff.ac3=-> voeg RIFF WAVE header toe aan AC-3 audio +audio.msg.syncword.lost=!> Synchronisatie byte mist bij pos.:{0}, @ +audio.msg.syncword.found=!> Synchronisatie byte gevonden bij pos.: +audio.msg.frame.discard=!> negeer frame# +audio.msg.crc.error=!> CRC{0} Test mislukt bij pos.: +audio.msg.source=-> Origineel formaat: {0} @ +audio.msg.source.max=-> Origineel formaat: stop meldingen, meer dan 100 Modi-wisselingen in 鳬n bestand verlagen de snelheid +audio.msg.summary.skip=!> beelden in bron overgeslagen @ +audio.msg.summary.pre-insert=!> {0} Frame(s) ({1}ms) vooraan ingevoegd @ +audio.msg.summary.insert=!> {0} Frame(s) ({1}ms) ingevoegd @ +audio.msg.summary.add=!> {0} Frame(s) ({1}ms) aangevuld @ +audio.msg.summary.frames=Audio frames: wri-pre-skip-ins-add {0} @ {1} afgesloten... +audio.msg.summary.jstereo=-> {0} stereo/jointstereo overgang gevonden... +audio.msg.audio=Audio +audio.msg.newfile.left=(links): +audio.msg.newfile.right=(rechts): +audio.msg.noaudio=!> geen audiodata in deze stream gevonden... +audio.msg.convert.disabled=!> Origineel-frame voldoet niet aan de converteringscriteria, funktie gedeactiveerd.. (Frame# {0}) +audio.msg.convert.error=!> Origineel-frame veroorzaakt een converteringsfout (Fout {0}), (frame# {1}) + +#Videoprocess +video.msg.pts.start_end=Video PTS: Start 1ste GOP {0}, einde laatste GOP +video.msg.summary=-> Video: fr-ct-1p-cg-og-dg -> +video.progress=analiseer videobestand +video.msg.skip.sec=-> negeer sequence_end_code volgend op GOP# {0} bij +video.error.io=!> Bestands I/O fout: +video.msg.error.lackofdata=!> GOP# {0} - te weinig Data, genegeerd... +video.msg.error.nopts.use_goptc=!> GOP# {0} heeft geen PTS, gebruik GOP tijdindex voor de synchronisatie +video.msg.error.nopts.use_lastpts=!> GOP# {0} heeft geen PTS, gebruik laatste PTS voor de synchronisatie +video.msg.basics=-> Video eigenschappen: +video.msg.newformat=GOP# {0}, nieuw formaat in de volgende sequence-header ontdekt: +video.msg.error.pesext_in_es=!> GOP# {0}, PES-header en -uitbreidingen in ES gevonden, met '0' opgevuld... (GOP Byte {1}) +video.msg.error.pes_in_es=!> GOP# {0}, PES-header in ES gevonden, met '0' opgevuld... (GOP Byte {1}) +video.msg.error.frame.wrong=!> ongeldig beeldtype {0}, T-Ref +video.msg.export.start=-> start export van Videodata bij GOP# +video.msg.pts.diff=!> PTS verschil van {0} ({1}) tot de laatst gexporteerte GOP gevonden +video.msg.error.brokenlink=(broken_link Flag gecorrigeerd) +video.msg.frame.drop=!> negeer overbodige B-frames bij GOP# {0} / nieuwe tijdindex +video.msg.error.frame.not=!> GOP# {0} bevat geen beelden +video.msg.error.frame.not.i=!> GOP# {0} start niet met een I-Frame bij T-Ref '0' +video.msg.error.pts.early=!> Start-PTS vanaf GOP# {0} is kleiner dan het einde van de laatste GOP.. (verwacht {1}) +video.msg.error.gop.drop=!> negeer GOP# {0} bij originele PTS {1} ({2}) +video.msg.error.gop.diff=!> Beelden verwacht {0}, inGOP PTS verschillen {1}ms, nieuwe tijdindex +video.msg.error.gop.dump=-> sla GOP in bestand op: +video.msg.io.non=geen +video.msg.io.int=interlaced +video.msg.io.pro=progressive +video.msg.io.int_pro=interlaced & progressive +video.msg.length=-> Videolengte: {0} beelden in +video.msg.gop.summary=-> GOP samenvatting: min. {0}, max. {1} velden; bevat {2} +video.error.pts.same=-> {0} GOPs met gelijke PTS-Waarde voor verschillende beelden gevonden! +video.summary=.Video {0}:\t{1} beelden\t{2}\t\t +video.msg.bitrate.avg=-> gemiddelde Bitrate {0}bps (min/max: {1}) +video.msg.bitrate.avgnom=-> gemiddelde nom. Bitrate {0}bps (min/max: {1}) +video.msg.bitrate.vbr=-> zet de Bitrate in de eerste sequence-header op VBR +video.msg.bitrate.val=-> zet de Bitrate in de eerste sequence-header op {0}bps +video.msg.resolution=-> zet de resolutie van de eersten sequence-header van {0} op + +#Teletextprocess +teletext.msg.nooutput=!> geen uitgangsformaat voor teletekst opgegeven.. +teletext.msg.output=-> Exportformaat: +teletext.msg.tmpfile=-> temp. bestand: {0} ({1} Bytes) +teletext.msg.page=Pagina nr. +teletext.msg.megaradio=MegaRadio mp3 Stream +teletext.progress=zoek & decodeer +teletext.msg.search=-> zoek naar +teletext.status=Pagina's: +teletext.msg.discard=!> {0} PTS's weglaten in de stream +teletext.msg.pts.start_end=Teletekst PTS: eerste pakket {0}, laatste pakket +teletext.msg.pts.missed=!> Teletekst stream gebruikt geen PTS, synchronisatie niet mogelijk +teletext.msg.pts.mismatch=!> Video & teletekst PTS komen op geen moment overeen! +teletext.msg.adjust.at.video=-> pas de teletekst aan de video-tijdlijn aan +teletext.msg.adjust.at.own=-> pas de teletekst aan de eigen tijdlijn aan +teletext.msg.syncword.lost=!> Synchronisatie-byte mist bij pos.: +teletext.msg.syncword.found=!> Synchronisatie-byte gevonden bij pos.: +teletext.msg.vps=-> VPS Status: {0} @ PTS +teletext.msg.provider=-> Aanbieder: +teletext.msg.program=-> Programma: +teletext.msg.summary={0} Pagina nrs. {1} geschreven +teletext.summary=Teletext {0}:\t{1} Pagina's van nr. {2}\t{3}\t +teletext.error.eof=!> Teletekst EOF bereikt met fouten: +teletext.error.io=!> Teletekst I/O fout: {0} / +teletext.msg.newrun=-> verwerk 2. SUP Y-afstand + +#Subpictureprocess +subpicture.msg.error3=!> Fout bij het decoderen van DVB ondertitels +subpicture.msg.error4=!> Te weinig data in pakket +subpicture.msg.error5=!> Pakketgrootte past niet bij pakketdata +subpicture.msg.error6=!> Verkeerde 鳬nheid positie-index +subpicture.msg.error7=!> Verkeerde positie voor 鳬nheid +subpicture.msg.error8=!> Verkeerd einde van de 鳬nheid-index +subpicture.msg.error9=!> Verkeerd einde van de 鳬nheid +subpicture.msg.model=-> gekozen DVB ondertitel kleurmodel: {0} ; gefixeerd op paginanr.: +subpicture.msg.output=-> Export formaat: +subpicture.msg.tmpfile=-> temp. bestandi: {0} ({1} Bytes) +subpicture.progress=test & synchroniseer +subpicture.msg.discard=!> {0} PTS's weggelaten in de stream +subpicture.msg.pts.mismatch=!> Video & ondertitel PTS komen op geen moment overeen! +subpicture.msg.adjust.at.video=-> pas de teletekst aan de video-tijdlijn aan +subpicture.msg.adjust.at.own=-> pas de teletekst aan de eigen tijdlijn aan +subpicture.msg.syncword.lost=!> Synchronisatie-byte mist bij pos.: +subpicture.msg.syncword.found=!> Synchronisatie-byte gevonden bij pos.: +subpicture.msg.error={0} bij pos.: {1}, negeer beeld... +subpicture.msg.dvbsource=-> Bron bevat DVB ondertitel... +subpicture.status=Beelden: +subpicture.preview.title.dvdexport=/ beeld {0} -> in: {1} duur: +subpicture.preview.title.dvbexport=/ pagina nr. {0} / beeld {1} -> in: {2} duur: +subpicture.msg.forced=vanaf beeld nr. +subpicture.msg.forced.no=-> Beeldstatus: niet geforceerd, +subpicture.msg.forced.yes=-> Beeldstatus: geforceerd, +subpicture.preview.title.noexport=/ Beeld niet gexporteerd... +subpicture.msg.pts.start_end=Ondertitel PTS: eerste pakket {0}, laatste pakket +subpicture.msg.summary={0} Ondertitel(s) geschreven... +subpicture.summary=Ondertitel {0}:\t{1} beelden\t{2}\t +subpicture.msg.error.eof=!> Ondertitel EOF bereikt met fouten: +subpicture.msg.error.io=!> Ondertitel I/O fout: {0} / +subpicture.msg.error.dvbdecoding=!> Decodeer fout: {0}, Bereik_Id {1} (PTS {2}) + +#LPCMprocess +lpcm.msg.develop=...in ontwikkeling... +lpcm.msg.tmpfile=-> temp. bestand: {0} ({1} Bytes) +lpcm.progress=test & synchroniseer +lpcm.msg.pts.mismatch=!> Video & audio PTS komen op geen moment overeen! +lpcm.msg.adjust.at.video=-> pas de LPCM aan de video-tijdlijn aan +lpcm.msg.adjust.at.own=-> pas de LPCM aan de eigen tijdlijn aan +lpcm.msg.syncword.lost=!> Synchronisatie-byte mist bij pos.: +lpcm.msg.syncword.found=!> Synchronisatie-byte gevonden bij pos.: +lpcm.msg.source=-> Oorsprongs formaat: {0} @ +lpcm.msg.source.max=-> Oorsprongs formaat: stop meldungen, meer dans 100 Modi-wisselingen in een bestand verlagen de snelheid +lpcm.msg.error.align=!> Pakket niet naar 'WORD' aangepast +lpcm.msg.pts.start_end=LPCM PTS: eerste pakket {0}, laatste pakket +lpcm.msg.summary={0} Paketten geschreven... +lpcm.summary=LPCM {0}:\t{1} pakketten\t{2}\t +lpcm.error.eof=!> LPCM EOF bereikt met fouten: +lpcm.error.io=!> LPCM I/O fout: {0} / + +#various +all.msg.pts.faked=--> gebruik imaginaire PTS voor de volgende data: +logalias.error.io=!> Logalias I/O fout: +all.msg.error.max=-> more than 500 warnings/errors, stop logging.. +all.msg.error.summary=-> we have {0} warnings/errors. +all.msg.noprimaryfile=!> filetype is not supported as a secondary file. check the file order/segmentation. + +#demux +demux.error.audio.startcode=!> Ongeldige startcode, negeer PES pakket +demux.error.audio.io=!> demultiplex audio fout: +demux.error.video.io=!> demultiplex video fout: +demux.msg.celltimes=--> Celltimes in: {0}CellTimes.txt +demux.error.video.startcode=!> Ongeldige startcode, negeer video PES pakket +demux.error.video.payload=!> Bevat PES pakket zonder data of met foutieve header informatie +demux.msg.skip.sec=-> Sla sequence-code over volgend op GOP# +demux.error.gop.toobig=!> Negeer videodata, GOP groter dan 6MB + +#ftpchooser +ftpchooser.server.Tip=Naam of IP-dresse van de FTP-Server +ftpchooser.server=Server: +ftpchooser.port.Tip=Poort van de FTP Server +ftpchooser.port=Poort: +ftpchooser.user.Tip=Gebruiker voor FTP-verbinding +ftpchooser.user=Gebruiker: +ftpchooser.password.Tip=Wachtwoord voor de FTP-verbinding +ftpchooser.password=Wachtwoord: +ftpchooser.directory.Tip=Directory op de FTP-Server +ftpchooser.directory=Directory: +ftpchooser.test=Test +ftpchooser.state.Tip=Status van de verbinding +ftpchooser.state=Status: +ftpchooser.untested=niet getest, test verbinding +ftpchooser.ok=OK +ftpchooser.cancel=Afbreken +ftpchooser.title=FTP-Server keuze +ftpchooser.msg.noconnect=Verbinding niet mogelijk. +ftpchooser.msg.nologin=Aanmelden mislukt. +ftpchooser.msg.nodirectory=Kan niet van directory veranderen. +ftpchooser.msg.success=Verbinding tot stand gebracht. +FtpServer.Commands=FTP Commando: +FtpServer.Commands.Tip=speciale gebruikers commando om te verbinden met FTP-server, meerdere commando's scheiden met '|' + +#JobCollection +JobCollection.NoInfo=Geen informatie +JobCollection.InProgress=Bewerking loopt! +JobCollection.Idle=Standby. +JobCollection.Action=Aktie: +JobCollection.unspecified=niet gespec.. +JobCollection.PrimaryFileSegments=Besatnds-segmenten: +JobCollection.SecondaryFiles=Sec. bestanden: +JobCollection.Cutpoints=Snijpunten: +JobCollection.Chapters=Hoofdstukken: +JobCollection.PidSelection=PID-selektie: +JobCollection.OwnSettings=sep.Instel.: +JobCollection.AllSize=Grootte \u03A3: + +#CollectionTable +CollectionTable.FileLocation=Directory +CollectionTable.FileName=Bestandsnaam +CollectionTable.Size=Grootte +CollectionTable.lastModified=Gewijzigd op +CollectionTable.Streamtype=Stream type +CollectionTable.Source=Src + +#PreviewPanel +PreviewPanel.saveCurrentPicture=save current picture.. +PreviewPanel.saveCurrentPictureDAR=save current picture with DAR.. + +#NetPanel +NetPanel.WebServerPort=Port: +NetPanel.WebServerAccess=AccessString: +NetPanel.autostartWebServer=autostart WebIFServer diff -Nru project-x-0.90.4dfsg/resources/pjxresources_se.properties project-x-0.91.0/resources/pjxresources_se.properties --- project-x-0.90.4dfsg/resources/pjxresources_se.properties 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/resources/pjxresources_se.properties 2009-10-03 09:24:14.000000000 +0000 @@ -0,0 +1,1256 @@ +# Project-X Resource File +# svenska, std, V 1.0 +# av gazonk.del + +# +Common.File=&Arkiv +Common.Save=&Save +Common.SaveAs=Save &as.. +Common.Open=&Open.. +Common.Load=&Load.. +Common.Edit=&Edit +Common.Messages=&Messages +Common.Options=&Options +Common.Close=&Close +Common.Cancel=&Cancel +Common.Exit=A&vsluta +Common.LogFile=&Logfile +Common.Preferences=&PreSettings +Common.Addons=Addo&ns + +General.Yes=Yes +General.No=No + +StartUp.Title=X Startup, load components... +StartUp.Error=Error while starting Project-X: +StartUp.Error.Title=Project-X Startup Error +StartUp.Init=Initializing. +StartUp.Wait=Please wait... +StartUp.Choose=Choose an option... + +# +PreferencesPanel.Title=PreSettings +PreferencesPanel.Button=PreSettings + +Application.SaveSettingsOnExit=Save Settings on Exit + +# Popupmenu +popup.what=vad +popup.cutspecials=ppna Videoklipp & Specialare... +popup.url=URL hinzufgen.. +popup.add=l臠g till... +popup.remove=ta bort +popup.newOutName=Ausgabe als.. +popup.rename=byt namn.. +popup.openhex=ppna i Hexviewer.. +popup.patchbasics=舅dra grundl臠gande videoattribut... +popup.sendtocl3=skicka till CL#3.. +popup.newOutName=new Output as.. +popup.changeTimestamp=update timestamp of file.. +popup.copyInfoToClipboard=copy file info to clipboard +popup.assignStreamType=assign stream type directly.. +popup.automatic=automatic +popup.assignActionType=assign action type directly.. +popup.unspecified=unspecified +popup.fixHpAc3=create corrected Hpョ ac3 file.. +popup.stripAudio=strip raw audio data from DD/DTS-Wave.. + +#Filechooser +FileChooser.Select=V舁j +FileChooser.Title=Val + +#dialog +dialog.input.url=URL eingeben.. + +#File Menu +file.menu=&Arkiv +file.url=UR&L hinzufgen.. +file.add=&L臠g till... +file.remove=Ta &bort +file.rename=Byt &namn... +file.exit=&Avsluta + +#Settings Menu +settings.menu=&Inst舁lningar +settings.settings=&Inst舁lningar... + +#Language Menu +language.menu=&Spr虧 +language.system=S&ystem default +language.check=check &online + +#General Menu +general.menu=&Visa + +#Options Menu +options.menu=&Redigera +options.opencutspecials=ヨppna &Videoklipp & Specialare... +options.openhexview=ヨppna i &HexViewer... +options.pachtbasics=&トndra grundl臠gande videoattribut... +options.subtitlepreview=Frhandsvisa &DVB-textning... +options.teletext=Matris ver &Text-TV-sidor... + +#Help Menu +help.menu=&Hj舁p +help.about=&Om ProjectX... +help.help=&Hj舁p.. +help.version=&Neueste Version? +help.version.info=Neueste Version: +help.version.info.title=Neueste Version von Project-X +help.version.error=Fehler beim Prfen auf die neueste Project-X Version: + +progress.title=Progress + +#Html Frame +html.title=Hj舁p + +#Buttons +button.go=&Kr! +button.go.Tip=starts, pauses or resumes the process +button.i=&I +button.i.Tip=kort bearbetning fr att f info om strm-ID funna i en fil med m蚣ga strmmar (see ut-fliken: snabbdemux) +button.c=&A +button.c.Tip=avbryt den nuvarande bearbetningen +button.p=&P +button.p.Tip=gr en paus i bearbetningen eller forts舩t +button.e=&U +button.e.Tip=givet en strms ID, gr ett r蚯t PVA-filutdrag av en viss strm (tryck 'i' fr att f se funna ID) + +#Mainpanel +MainPanel.Collection=Collection +MainPanel.Process=arbete att utfra +MainPanel.Process.Tip=om inte DEMUX, s konverteras ett strmformat till ett annat (strminneh虱l kopieras utan felkorrigering) +MainPanel.BitrateMonitor.Tip=verklig bithastighet hos GOP fr蚣 0 till 10 Mbps (beror p beaarbetning/GOP-struktur/videotid) +MainPanel.writtenMB=utstorlek +MainPanel.writtenMB.Tip=skrivna antal MB i skapade filer baserade p en hopsamling av filmavsnitt +MainPanel.useAllCollections=ta med alla film. +MainPanel.useAllCollections.Tip=se till att kra alla ihopsamlade filmavsnitt i en krning +MainPanel.enablePostProcessing=efterbearbetn. +MainPanel.enablePostProcessing.Tip=utfr efterbearbetning (se extern-fliken, om f舁tet inte l舂nats tomt) +MainPanel.simpleMPG=MPG=>sPES +MainPanel.simpleMPG.Tip=enkel PES-analys, sl p fr MPEG-PS med data som saknar vanlig sub-ID fr private_stream_1 +MainPanel.enhancedPES=sPES=>MPG +MainPanel.enhancedPES.Tip=enhanced PES parsing, enable for PES including data with a sub ID of private_stream_1 +MainPanel.nonVideoExportStatus=inte p蘆rjad +MainPanel.nonVideoExportStatus.Tip=status p ljudextrahering eller p skrivna DVB-textnings- eller text-TV-sidor +MainPanel.AudioVideoOffset=AV-offset +MainPanel.AudioVideoOffset.Tip=visar frskjutning mellan A- och V-strmmar vid brjan av varje GOP, uttryckt i ms: a/b/c

(klipp orsakar olika frskjutningar)

a avser AV-PTS-frskjutning i ursprungsfilen

b avser AV-rams inledande frskjutning fr faktisk GOP i 'demuxad' fil

c avser ny verklig AV-frskjutning fr faktisk GOP in 'demuxad' fil +MainPanel.ConversionMode.demux=demux (separera) +MainPanel.ConversionMode.toVDR=till VDR +MainPanel.ConversionMode.toM2P=till M2P +MainPanel.ConversionMode.toPVA=till PVA +MainPanel.ConversionMode.toTS=till TS +MainPanel.ConversionMode.PidFilter=PID-filter (1:1 Copy) +MainPanel.ConversionModePriority=Collection has priority +MainPanel.ConversionModePriority.Tip=use collections action type +MainPanel.useAutoPidFilter=apply PMT-PID filter +MainPanel.useAutoPidFilter.Tip= + +ProcessWindow.Title=ProcessWindow +ProcessWindowPanel.Button=open >>> +ProcessWindowPanel.Title=Logmessages +ProcessWindowPanel.Action=Action: + +#Tab.msg +MessagePanel.Title=message handling +MessagePanel.logSequenceError=log 'packets out of sequence' / bit errors +MessagePanel.logSequenceError.Tip=disable, if this message bombs the logwindow (and decrease the speed) +MessagePanel.logMissingStartcode=log 'missing startcodes' +MessagePanel.logMissingStartcode.Tip=disable, if this message bombs the logwindow (and decrease the speed) +MessagePanel.logESError=log 'PES header found in ES' +MessagePanel.logESError.Tip=disable, if this message bombs the logwindow (and decrease the speed) +MessagePanel.leadingTimeIndex=add time index of process to all log messages +MessagePanel.leadingTimeIndex.Tip= +MessagePanel.logWSS=log WSS +MessagePanel.logWSS.Tip= +MessagePanel.logVPS=log VPS +MessagePanel.logVPS.Tip= +MessagePanel.logRDS=log RDS +MessagePanel.logRDS.Tip= +MessagePanel.hideProcessWindow=hide process window while processing +MessagePanel.hideProcessWindow.Tip= +MessagePanel.minimizeMainFrame=minimize main frame while processing +MessagePanel.minimizeMainFrame.Tip= +MessagePanel.showSubpictureWindow=show subpicture preview while creating subpictures +MessagePanel.showSubpictureWindow.Tip= +MessagePanel.logErrorMaximum=log max. 500 warnings/errors +MessagePanel.logErrorMaximum.Tip= + +#usage note +usage=frenklad kommandoradsintro:: \n\ +Note: CL doesn't load the GUI components, except with switch [-gui]\n\ +without options ...starts the GUI\n\ +switches and inputfiles can be in any order\n\ +\n\ +varianter:\n\ +[-ini ] ..anv舅der denna inifil ist舁let fr den vanliga\n\ +[-dvx1] ..skapar en .d2v-projektfil vid demux\n\ +[-dvx2] ..skapar en .d2v-projektfil + .ac3.wav (RIFF-WAVE-huvud)\n\ +[-dvx3] ..skapar en .d2v-projektfil + .mpa.wav (RIFF-WAVE-huvud)\n\ +[-dvx4] ..skapar en .d2v-projektfil + .ac3.wav + mpa.wav (RIFF-WAVE-huvud)\n\ +[-out ] ..anv舅der denna skv臠 fr utresultatet\n\ +[-name ] ..anv舅der detta filnamn fr utresultatet\n\ +[-cut ] ..anv舅der denna textfil som en lista med klippmarkeringar\n\ +[-chp ] ..use that text based file as chapterpoint list\n\ +[-id ] ..anv舅d endast dessa (P)IDar, 蚯skilda med komma (\",\")\n\ +[-gui] ..display the GUI using all given CLI options\n\ +[-log] ..skriv ut den vanliga loggfilen\n\ +[-saveini] ..save changes made bei CLI in active .ini +[-split ] ..split output at xxx MB\n\ +[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..action types + +#conditions +terms=\n\ +VILLKOR FヨR ANVトNDNING:\n\ +(1) Detta 舐 ett gratis Java-baserat nyttoprogram fr demultiplexering.\n\ +(2) Det 舐 endast avsett fr utbildnings舅dam虱 som ett icke-kommersiellt projekt\n\ +(3) och utgivna under reglerna beskrivna p engelska i GNU GPL.\n\ +(4) Det finns INGEN GARANTI kopplad till denna programvara.\n\ +(5) Anv舅ds p egen risk och fr egen utbildning.\n\ + +terms.disagree=Inst舂mer inte. (Programmet avslutas) +terms.agree=Inst舂mer. + +startup.title=X g蚌 ig蚣g genom att ladda komponenter... +startup.error=Fehler beim starten von Project-X: +startup.error.title=Project-X Startup Fehler + +about.title=Om X.. +about.ok=OK +about.credits.label=Tack till: + +#version info +version.info=TESTPROJEKT ENDAST +version.user=, Anv舅dare: + +#JavaEV +javaev.java.version=java.version +javaev.java.vendor=java.vendor +javaev.java.home=java.home +javaev.java.vm.version=java.vm.version +javaev.java.vm.vendor=java.vm.vendor +javaev.java.vm.name=java.vm.name +javaev.java.class.vers=java.class.vers +javaev.java.class.path=java.class.path +javaev.java.os.name=os.name +javaev.java.os.arch=os.arch +javaev.java.os.version=os.version +javaev.java.user.name=user.name +javaev.java.user.home=user.home +javaev.java.user.lang=user.language +javaev.java.ini.file=ini.file +javaev.java.disk.access=ext.disk.access + +#messages +msg.infomessage=Information +msg.new.language=Bytet av spr虧 kr舸er en omstart av ProjectX +msg.loadlang.error=fel vid inladdning av spr虧: +msg.init.error=Initialisierungsfehler: +msg.loadini.error=fel vid ini-inladdning: +msg.saveini.error=fel vid ini-sparande: +msg.loading.cutpoints=-> laddar {0} klippmarkeringar... +msg.loading.cutpoints.error=fel vid laddning av klippmarkerinar +msg.loading.pids=-> laddar {0} (P)ID... +msg.ptsfile.error=...fel vid 蚯komst av PTS-fil: +msg.savecut=-> sparar klipp-PTS-v舐de ({0}) p fil... +msg.savecut.error=fel vid sparande av klippmarkeringar: +msg.log.error=loggfel: +msg.cuts.cutin=-> klippstart @ GOP# {0} / ny v-ram {1} / ny tidskod {2} +msg.cuts.cutout=-> klippstopp @ GOP# {0} +msg.newfile=---> ny fil: +msg.browser.launcher.error=Fel vid start av browserfunktion: + +#Hex Viewer +hexviewer.title=Hex-granskning +hexviewer.file=Hex-granskning av fil +hexviewer.filesize= Storlek +hexviewer.error=...kan inte komma 蚯 filen +hexviewer.save=Hex-granskning, spara +hexviewer.close= st舅g +hexviewer.to=till +hexviewer.extractfrom=Extrahera fr蚣: (hex) +hexviewer.extractfrom_tip=klicka fr att extrahera till fil +hexviewer.extract_tip=extrahera filsegment to ny fil +hexviewer.jumptohex=トndra till hex.: +hexviewer.jumptodec=トndra till dec.: +hexviewer.jumpto_tip=tryck p Enter fr att hoppa till filpositionen +hexviewer.textmode=textl臠e + +#TeletextPageMatrix +ttpagematrix.title=Matris ver text-TV-sidor +ttpagematrix.tip=om synlig s minskar demux-hastigheten +ttpagematrix.file=fil +ttpagematrix.composition1=sammans舩tning av text-TV-sidor +ttpagematrix.composition2='MXY' : M = magasinsnummer, XY = sidnummer +ttpagematrix.composition3=magasinsnummerf舐ger + +#Scan +scan.unsupported=Filtypen 舐 inte understdd +scan.msg1=ingen video funnen efter kort avskning +scan.msg2=ingen audio funnen efter kort avskning +scan.msg3=inga till舂pliga text-TV-sidor funna efter en kort avskning +scan.msg4=ingen DVB-textning funnen efter en kort avskning +scan.msg5=ingen PMT funnen +scan.msg6=PMT-tolkningsproblem (spr虧) +scan.msg7=video-data, men inget sekvenshuvud funnet efter en kort avskning +scan.msg8=problem vid kontroll +scan.msg9=filen startar inte med ett sekvenshuvud + +#TS +ts.msg1=!> inga IDn funna! ..Anv舅der fix PMT + +#WSS +wss.run_in=Run-In-Code funnen +wss.no_run_in=ingen Run-In-Code funnen +wss.startcode=Start-Code funnen +wss.no_startcode=ingen Start-Code funnen +wss.start=start +wss.group_1=Grupp 1 (Bildformat) +wss.group_2=Group 2 (Bildfrb舩tringar) +wss.group_3=Group 3 (Textningar) +wss.group_4=Group 4 (andra) +wss.group_1.0001=4:3 stort format, 576 rader, fullsk舐m +wss.group_1.1000=14:9 brevl蘚eformat, 504 rader, centrerat +wss.group_1.0100=14:9 brevl蘚eformat, 504 reder, upptill +wss.group_1.1101=16:9 brevl蘚eformat, 432 rader, centrerat +wss.group_1.0010=16:9 brevl蘚eformat, 432 rader, upptill +wss.group_1.0111=14:9 stort format, 576 rader, centrerat, fullsk舐m +wss.group_1.1110=16:9 stort format, 576 rader, fullsk舐m +wss.group_1.error=problem att tolka grupp 1 (bitarna 0..3) +wss.group_2.0.01=kameral臠e +wss.group_2.0.10=filml臠e +wss.group_2.0.00=problem att tolka bit 4 +wss.group_2.1.01=standard-PAL +wss.group_2.1.10=MACP (motion adaptive color plus) +wss.group_2.1.00=problem att tolka bit 5 +wss.group_2.2.01=ingen hj舁preda +wss.group_2.2.10=hj舁predsmodulation (PALplus) +wss.group_2.2.00=problem att tolka bit 56 +wss.group_2.3.01=reserverad (0) +wss.group_2.3.10=reserverad (1) +wss.group_2.3.00=problem att tolka bit 7 +wss.group_3.0.01=no textning i text-TV +wss.group_3.0.10=textning i text-TV +wss.group_3.0.00=problem att tolka bit 8 +wss.group_3.1.00=ingen 'ppen DVB-textning' +wss.group_3.1.01='ppna DVB-textning' inne i den aktiva bilden +wss.group_3.1.10='ppna DVB-textning' utanfr den aktiva bilden +wss.group_3.1.11=reserverad (11) +wss.group_3.1.err=problem att tolka bitarna 9..10 +wss.group_4.0.01=inget surroundljud +wss.group_4.0.10=surround sound +wss.group_4.0.00=problem att tolka bit 11 +wss.group_4.1.01=no copyright/unknown +wss.group_4.1.10=copyright asserted +wss.group_4.1.00=error parsing bit12 +wss.group_4.2.01=copying not restricted +wss.group_4.2.10=copying restricted +wss.group_4.2.00=error parsing bit13 +wss.group_4.1.err=problem att tolka bitarna 12..13 + +#Subpicture +subpicture.title=Frhandsgranskning av DVB-textning +subpicture.in_time=in +subpicture.duration=l舅gd +subpicture.msg1=!> skrivfel DVB-textning +subpicture.msg2=!> enkelt bildpaket +subpicture.msg3=!> ogiltigt DVB-textningskommando + +#RawRead +rawread.msg1=avsaknad eller bibliotek saknas + +#Common +common.rename_error1=!> kan inte byta namn +common.rename_error2=till + +#TabPanel +TabPanel.LogwindowPanel=logg +TabPanel.FileinfoPanel=info +TabPanel.MessagePanel=medd +TabPanel.ExportPanel=ut +TabPanel.SpecialPanel=special +TabPanel.VideoPanel=video +TabPanel.AudioPanel=audio +TabPanel.SubtitlePanel=textning +TabPanel.ExternPanel=extern +TabPanel.OptionPanel=varianter +TabPanel.NetPanel=net +TabPanel.PostCommandsPanel=postprocess + +#Tab.logwindow +LogwindowPanel.showTtxHeader=Text-TV +LogwindowPanel.showTtxHeader.Tip=visar text-TV-rubrikrad och VPS-status (drar ner farten, om p蚶laget) +LogwindowPanel.showTtxHeader.Tip1=rubrikrad i uts舅d sida (rad 0) +LogwindowPanel.showVpsLabel.Tip=kortfattad VPS-status (VBI-rad 16), vissa s舅dare har meingsfulla VPS-data via Text-TV + +#Tab.msg +MessagePanel.Title=hantering av meddelanden +MessagePanel.Msg1=logga 'paket ej i sekvens' +MessagePanel.Msg1.Tip=sl p, om detta meddelande verlastar loggfnstret och drar ner farten +MessagePanel.Msg2=logga 'startkod saknas' +MessagePanel.Msg1.Tip=sl p, om detta meddelande verlastar loggfnstret och drar ner farten +MessagePanel.Msg3='PES Kopf in ES gefunden' nicht melden +MessagePanel.Msg3.Tip=aktivieren, wenn diese Meldungen sehr h舫fig kommen und die Geschwindigkeit stark reduzieren +MessagePanel.Msg4=Zeitindex vom Prozess zu allen Log-Meldungen hinzufgen +MessagePanel.Msg4.Tip= +MessagePanel.Msg5=WSS mitloggen +MessagePanel.Msg5.Tip= +MessagePanel.Msg6=VPS mitloggen +MessagePanel.Msg6.Tip= +MessagePanel.Msg7=RDS mitloggen +MessagePanel.Msg7.Tip= + +#Tab.options +OptionPanel.Various.Title=diverse +OptionPanel.LookAndFeel=installerade fnsterutseenden +OptionPanel.LookAndFeel.Info1=v舁j fnsterutseende, det h舅der att +OptionPanel.LookAndFeel.Info2=andra fnsterutseenden kraschar internt +OptionPanel.DebugLog=stor loggfil +OptionPanel.DebugLog.Tip=drar mer p farten, fr test舅dam虱 +OptionPanel.NormalLog=normalstor loggfil +OptionPanel.NormalLog.Tip=skriver loggfnstrets inneh虱l till en fil +OptionPanel.dumpDroppedGop=dumpa kastade GOP:ar till separata filer +OptionPanel.dumpDroppedGop.Tip=endast avsett fr senare analys +OptionPanel.StartPath=startkatalog fr filval: +OptionPanel.StartPath.Value.Tip=l舂na tom eller fyll i en startkatalog, ett inledande '?' 蚯erst舁ler till denna katalog fre +OptionPanel.Buffer.Title=Buffert +OptionPanel.MainBuffer=I/O-buffertstorlek uttryckt i byte +OptionPanel.MainBuffer.Tip=l虍a v舐den kan frebygga minnesverutnyttjande (OutOfMemory-fel) +OptionPanel.PesPreBuffer=I-Buffersize in bytes (only PES packetsize=0 !) +OptionPanel.PesPreBuffer.Tip=prva med l臠re/hgre v舐den vid arbete med videostrmmar med hg bitrate +OptionPanel.ScanBuffer=frgranska buffertstorlek (uttryckt i byte) +OptionPanel.ScanBuffer.Tip=prva med l臠re/hgre v舐den om k舅da filtyper inte detekteras +OptionPanel.PreviewBuffer=Vorschau Puffergr゚e in Bytes +OptionPanel.PreviewBuffer.Tip=kleinere Werte beschleunigen die Vorschau, aber mglicherweise fehlen dann Bilddaten +OptionPanel.callGc=skr舊insamlare (garbage collector) +OptionPanel.callGc.Tip=anropar skr舊insamlaren +OptionPanel.closeOnEnd=Programm nach Ausfhrung schlie゚en +OptionPanel.closeOnEnd.Tip=Programm nach Ausfhrung schlie゚en + +#ScanInfo +ScanInfo.Location=Plats: +ScanInfo.Name=Namn: +ScanInfo.Size=Storlek: +ScanInfo.Bytes=byte +ScanInfo.Type=Typ: +ScanInfo.Date=Datum: +ScanInfo.Video=Video: +ScanInfo.Audio=Audio: +ScanInfo.Teletext=Text-TV-text: +ScanInfo.Subpicture=DVB-textning: +ScanInfo.Playtime=skattad speltid: +ScanInfo.NotFound=Filen finns inte! + +#Execute +PostCommands.Title=externa program +PostCommands.PostProcessing=efterbearbetningskommandon: +PostCommands.PostProcessing.Tip=utfr detta kommandon efter att hopsamling/uppdelning har bearbetats +PostCommands.Execute=utfr +PostCommands.Close=st舅g +PostCommands.Error=!> exekveringsfel: + +#Collection +CollectionPanel.Title=hopsamlingsvariant +CollectionPanel.Title2=hopsamlingsvariant fr hopsaml.# +CollectionPanel.Title.processingPreview=frgransning av bearbetning... +CollectionPanel.CutPanel=frhandsgranskning av videoklipp +CollectionPanel.CutPanel.Tip1=anv舅d ocks tangenbordsknapparna, frhandsgranskning fungerar endast med byte-positionsklipp +CollectionPanel.CutPanel.Tip2=aktivt segment eller antal segment + filnamn p aktivt segment +CollectionPanel.CutPanel.Tip3=bearbetat (P)ID fr att 蚶tadkomma nuvarande bild +CollectionPanel.CutPanel.Tip4=sl in ett nummer eller dra&sl舊p klippunktsfil h舐 ver +CollectionPanel.addPoint=l臠g till punkt +CollectionPanel.removePoint=ta bort punkt +CollectionPanel.NumberOfPoints=Antal punkter +CollectionPanel.NumberOfPoints.Tip=all nummer sorteras automatiskt +CollectionPanel.NumberOfChapters=Chapters +CollectionPanel.NumberOfChapters.Tip=all numbers are automatically sorted +CollectionPanel.expectedSize=storlek: ~ +CollectionPanel.Preview.offline=frhandsgranskning ej tillg舅glig +CollectionPanel.Preview.processedPid=bearbetar video (P)ID 0x +CollectionPanel.Various=diverse +CollectionPanel.Preview.fastDecode=snabbare/s舂re avkodning av frhandsgranskning +CollectionPanel.Preview.fastDecode.Tip=蚯erskapa och interpolera endast vre v舅stra bildpunkten i varje makroblock +CollectionPanel.Preview.LiveUpdate=Liveupdate beim Scrollen +CollectionPanel.Preview.LiveUpdate.Tip=nicht empfohlen bei langsamen Systemen oder Datenzugriffen, siehe auch Vorschau-Puffer +CollectionPanel.Preview.AllGops=frhandsgranska 舸en GOP:ar utan sekvenshuvud +CollectionPanel.Preview.AllGops.Tip=ej att rekommendera fr DVB-data, sl p endast fr strmmar med endast ett sekvenshuvud +CollectionPanel.PidList=PES(&sub)-ID/PID-lista: +CollectionPanel.PidList.Tip1=ange PES-ID eller sub-ID (MPG etc) eller PID (PVA,TS); tom lista == anv舅d alla ID +CollectionPanel.PidList.Tip2=dubbelklicka fr att ta bort vald del +CollectionPanel.transferPids1=verfr valda (P)IDar till nytt hopsamlingsnummer +CollectionPanel.transferPids1.Tip=fr舅dringar i den nuvarande hopsamlingen som m蚶te aktiveras +CollectionPanel.transferPids2=verfr klippunktspar till den nya hopsamlingen +CollectionPanel.transferPids2.Tip=fr舅dringar i den nuvarande hopsamlingen som m蚶te aktiveras +CollectionPanel.ExportLimits=ytterligare exportbegr舅sningar: +CollectionPanel.OptionHorizontalResolution=H-upplsn. +CollectionPanel.OptionHorizontalResolution.Tip=global,..som automatiskt struntar i alla andra videosekvenser +CollectionPanel.OptionDAR=DAR: +CollectionPanel.OptionDAR.Tip=global,..som automatiskt struntar i alla andra videosekvenser +CollectionPanel.loadCutpointList=ladda klippunkter fr蚣 fil +CollectionPanel.loadCutpointList.Tip=ppna en klippuntsfil eller dra hit den +CollectionPanel.saveCutpointList=spara klippunkter till fil +CollectionPanel.ApplyAndClose=verkst舁l och st舅g fnstret +CollectionPanel.Apply=verkst舁l +CollectionPanel.CutMode.Bytepos=(0) anv舅d byteposition fr klipp +CollectionPanel.CutMode.Gop=(1) anv舅d GOP-number for klipp +CollectionPanel.CutMode.Frame=(2) anv舅d ramnummer fr klipp +CollectionPanel.CutMode.Pts=(3) anv舅d PTS fr klipp +CollectionPanel.CutMode.Timecode=(4) use Timecode for cuts +CollectionPanel.Preview.Error=frgranskningsfel: +CollectionPanel.FileAccessError=.. kan inte komma 蚯 filen +CollectionPanel.Title.Error=detaljer fr hopsamling #{0} -> FEL! Hopsamling saknas +CollectionPanel.loadCutpointList.Error=fel vid laddning + +#makeVDR +StreamConverter.IOError=!> strm-IO-fel: +StreamConverter.PayloadError=!> inkommande PES-paket utan inneh虱l eller felaktiga data i huvudet +StreamConverter.Summary=Strm: + +#patch +PatchPanel.Title=redigera grundl臠gande videoinformation i 1:a sekvenshuvudet +PatchPanel.Error=patch-fel +PatchPanel.Error2=patch-fel 2 +PatchPanel.Change=舅dra +PatchPanel.Cancel=avbryta + +#CutListener +cutlistener.wrongnumber=-> felaktigt ID-nummer + +#GoListener +golistener.msg.cancelled=--- bearbetning avbruten ---- +golistener.msg.paused=--- bearbetning pausad ---- +golistener.msg.resumed=--- bearbetning startad igen ---- +golistener.msg.extracting=extraherar r藺 (PES-)data med ID 0x + +#AC3 +ac3.msg.loading.start=lade AC3 Frames: +ac3.msg.loading.error=fel vid laddning av ac3.bin +ac3.msg.frames=ac3.bin inneh虱ler {0} AC3-ramar + +#Run +run.prepare.colls=frbeder hopsamlingar... +run.av.offset=A/V-offset +run.session.infos=<<< sessionsinfo >>> +run.working.coll=-> bearbetar hopsamling +run.split.output=-> dela upp utresultat vid c:a +run.add.time.offset=-> l臠g till tidsoffset till audio/textn/bilder : {0} ms (om det kommer efter video) +run.stream.type.disabled=-> PES-strmtyp avslagen +run.write.output.to=-> skriv utfiler till +run.write.output.notexists=!> spezifiziertes Ausgabeverzeichnis nicht verfgbar +run.write.output.nowriteaccess=!> kein Schreibzugriff im spezifizierten Ausgabeverzeichnis +run.cutpoints.defined=klippunkt(er) nu satta +run.start.quick.info=<<< Kurzinformationen >>> +run.end.quick.info=<<< slut p snabbinfo >>> +run.no.input=ingen infil... +run.write.raw=skriv separerad r蘿il till: +run.coll.empty=Hopsamlingen 舐 tom... +run.done=klart... {0} hopsamling(ar) bearbetade @ +run.stopped=stoppad... +run.status=klar... +run.splitpart=verklig del av delat utresultat + +#Working +working.convertType.demux=-> demux +working.convertType.makeVDR=-> skapa en VDR (A/V PES) +working.convertType.makeMPG2=-> skapa en MPG2 +working.convertType.makePVA=-> skapa en a PVA +working.convertType.makeTS=-> skapa en TS +working.convertType.packetFilter=-> enkelt paketfilter +working.file=+> Infil {0}: {1} ({2} byte) +working.file.not.found=!> Kunde inte hitta filen! +working.filetype=-> Filen 舐 av typ {0} +working.file.notsupported=!> Filetypen 舐 inte undetstdd! +working.end.of.part=---> SLUT Pナ AVSNITT +working.summary=sammanst舁lning av skapade mediafiler: +working.post.command=-> utfrt efterbearbetningskommando: +working.bytes.written=skrivna byte... +working.log.error2=loggfel2: +working.output.std=[res] samma st舁le som 1:a filen i hopsamlingen + +#MPVD +mpvdecoder.tip1=hgerklicka fr att spara som bmp + +#FilePanel +FilePanel.DragDrop.Tip=dra & sl舊p fil(er) hit, eller anv舅d den sammanhrande menyn +FilePanel.FileUp.Tip=flytta upp fil(er) i hopsamlingslistan +FilePanel.FileDown.Tip=flytta ner fil(er) i hopsamlingslistan +FilePanel.FileRemove.Tip=remove file(s) from collection list +FilePanel.CollectionNumber=job # +FilePanel.CollectionNumber.Tip=v舁j aktiv samling av filer +FilePanel.addCollection.Tip=skapa en ny samling av filer +FilePanel.removeCollection.Tip=ta bort en samling av filer +FilePanel.openAutoloadPanel.Tip=ppna automatfilladdningsfnstret +FilePanel.OutputDirectory=mapp fr utresultatet: +FilePanel.OutputDirectory.Tip=mapp fr denna utvalda hopsamlingen +FilePanel.recentOutputDirectories=tidigare mappar fr utresultatet +FilePanel.addRecentOutputDirectory.Tip=l臠g till mapp till tidigare mappar fr utresultat +FilePanel.removeRecentOutputDirectory.Tip=ta bort mapp fr蚣 tidigare mappar fr utresultat +FilePanel.Textfield.Tip=Collection-Infos +FilePanel.FileAdd.Tip=add file(s) to collection list + +#ExternTab +ExternPanel.Title1=externt / efterbearbetning +ExternPanel.Title1.Tip=best舂 egna program att kras +ExternPanel.Applications=externa program... +ExternPanel.createVdrIndex=skapa index.vdr i: +ExternPanel.createVdrIndex.Tip=skapade vdr filsegment byter sedan namn till 0xx.vdr +ExternPanel.createCellTimes=skapa cellTimes.txt for multipla infiler/klipp +ExternPanel.createCellTimes.Tip=endast demux, l臠ger till en post fr ramnummer vid v艀ling av fil och vid inklipping (nytt kapitel) +ExternPanel.exportPts=autospara PTSv舐den fr klippunkter +ExternPanel.exportPts.Tip=fr attdela och 蚯erladda med {PTS-klipp} i en annan ProjectX-instans +ExternPanel.save1stFrameOfGop=autospara GOPs frsta I-ram som .bmp +ExternPanel.save1stFrameOfGop.Tip=endast demux... +ExternPanel.createChapters=autospara tidkod vid formatfr舅dringar +ExternPanel.createChapters.Tip=exporterar en ytterligare tidkodspost om formatet p videon 舅dras +ExternPanel.renameAudio=舅dra all MPEG-audio till .mpa +ExternPanel.renameAudio.Tip=ist舁let fr att anv舅da MPEG-variantnummer -> .mp1, .mp2, .mp3 +ExternPanel.renameVideo=rename all MPEG-Videos to *.mpv +ExternPanel.renameVideo.Tip=ist舁let fr att anv舅d MPEG-typ -> .m1v, .m2v +ExternPanel.Title2=Projektfilsinst舁lningar +ExternPanel.Title2.Tip=舅dra bara om du vet vad du gr +ExternPanel.createM2sIndex=Mpeg2Schnitt idd-version: V2/A3 +ExternPanel.createM2sIndex.Tip=skapa .idd-projektfil vid demux: +ExternPanel.createD2vIndex=skapa .d2v-projektfil vid demux: +ExternPanel.createD2vIndex.Tip=om varje del ska konverteras separat +ExternPanel.createDgiIndex=skapa .dgi.d2v-projektfil vid demux: +ExternPanel.createDgiIndex.Tip=om varje del ska konverteras separat +ExternPanel.splitProjectFile=auto-dela upp video, men bibeh虱l ett projekt +ExternPanel.splitProjectFile.Tip=auto-dela upp demuxad video i frangiven delstorlek, inte audio; b舩tre fr stora filer p FAT-filsystem +ExternPanel.ProjectFileSplitSize=dela upp video endast vid MB: +ExternPanel.ProjectFileSplitSize.Tip= +ExternPanel.appendExtension=l臠g till nya filtyper (PES) +ExternPanel.appendExtension.Tip=bibeh虱ler filnamnet inkl. filtyp i alla sekund舐a PES-strmmar + +FtpPanel.killFtpClient=schlie゚e Client ohne Logout +FtpPanel.killFtpClient.Tip=nicht benutzen, ausser der FTP-Server akzeptiert keinen Logout ehe alle Daten bertragen wurden (Verbdg. bleibt mgw. erhalten!) +FtpPanel.useFtpServerResume=Server untersttzt 'Resume' +FtpPanel.useFtpServerResume.Tip= + +#SpecialTab +SpecialPanel.Title1=specialare 1 +SpecialPanel.PtsShift=global PTS-skiftning (in timmar): +SpecialPanel.PtsShift.Tip=prva 'auto' eller 1..13', ifall k舁l-AV-PTS inte matchar eller om den inte demux:ar audio (std=0) +SpecialPanel.PVA.FileOverlap=PVA: kontroller verlappning vid l舖ning +SpecialPanel.PVA.FileOverlap.Tip=sl av, if om multipla PVAer fr蚣 en inspelning har spelats in utan verlappning +SpecialPanel.PVA.Audio=PVA: flj spec:ar fr audiostrmmar till punk och pricka +SpecialPanel.PVA.Audio.Tip=sl p fr att unvika feldetektering: men i vissa filer finns saknade flaggor (MD) +SpecialPanel.VOB.resetPts=VOB: versch. Cell-Zeitlinen beachten +SpecialPanel.VOB.resetPts.Tip=aktivieren, falls die Zeitlinien von aufeinanderfolgenden VobIds/Cells nicht fortlaufend sind. +SpecialPanel.TS=endast TS-relaterat: +SpecialPanel.TS.ignoreScrambled=TS: strunta i felaktiga paket +SpecialPanel.TS.ignoreScrambled.Tip=sl av, ifall du anser att paketen inte 舐 felaktiga, men 舐 makerade som felaktiga +SpecialPanel.TS.blindSearch=TS: frb舩trat skande efter ppna paket +SpecialPanel.TS.blindSearch.Tip=sl p om PID-detektering stopppar skningen i en till synes ej tolkningsbar fil +SpecialPanel.TS.joinPackets=TS: sl ihop filsegment (fr蚣 Dreamboxョ) +SpecialPanel.TS.joinPackets.Tip=sl p fr att sammanfoga ofullst舅diga TS-paket vid gr舅serna fr multipla filsegment +SpecialPanel.TS.HumaxAdaption=TS: Humaxョ filformatsanpassning +SpecialPanel.TS.HumaxAdaption.Tip=sl p fr att f specielll Humaxョ HD-filformat of TS +SpecialPanel.TS.FinepassAdaption=TS: Finepassョ filformatsanpassning +SpecialPanel.TS.FinepassAdaption.Tip=sl p fr att f specielll Finepassョ HD-filformat of TS +SpecialPanel.TS.JepssenAdaption=TS: Jepssenョ filformatsanpassning +SpecialPanel.TS.JepssenAdaption.Tip=sl p fr att f specielll Jepssenョ HD-filformat of TS +SpecialPanel.TS.KoscomAdaption=TS: Koscomョ filformatsanpassning +SpecialPanel.TS.KoscomAdaption.Tip=sl p fr att f specielll Koscomョ HD-filformat of TS +SpecialPanel.TS.ArionAdaption=TS: Arionョ filformatsanpassning +SpecialPanel.TS.ArionAdaption.Tip=sl p fr att f specielll Arionョ HD-filformat of TS +SpecialPanel.TS.generatePmt=TS: generera PMT-strmberoende +SpecialPanel.TS.generatePmt.Tip=sl av fr att generera an oberoende frdefinierad PMT som ocks passar de flesta strmmar +SpecialPanel.TS.generateTtx=TS: generera info-text-tv-service (fr test) +SpecialPanel.TS.generateTtx.Tip=l臠g till en text-tv-servicestrm (PID 0x9F) for statusinformation p sidan 150 (endast vid auto-PMT) +SpecialPanel.TS.HeaderMode0=(0) no ytterligare TS header +SpecialPanel.TS.HeaderMode1=(1) l臠g p Topfieldョ 4000-huvud till TS +SpecialPanel.TS.HeaderMode2=(2) l臠g p Topfieldョ 5000-huvud till TS +SpecialPanel.TS.HeaderMode3=(3) l臠g p Topfieldョ 5x00-huvud till TS (new) +SpecialPanel.TS.HeaderMode4=(4) l臠g p Topfieldョ 5x00(C)-huvud till TS (new) +SpecialPanel.TS.HeaderMode5=(5) l臠g p Arionョ till TS +SpecialPanel.TS.setMainAudioAc3=TFョ-huvud: s舩t AC3 som huvudljudsp蚌 +SpecialPanel.TS.setMainAudioAc3.Tip=TFョ-Header: setze AC3 als aktive Tonspur +SpecialPanel.Title2=specialare 2 +SpecialPanel.Input.getEnclosedPackets=ta bara med medfljande PES/TS-paket +SpecialPanel.Input.getEnclosedPackets.Tip=sl avom inga paket gick att hitta (om n舖ta MPEG-startkod saknas vid paketslut, dvs. vid bilder) +SpecialPanel.Input.concatenateForeignRecords=l臠g ihop olika inspelningar +SpecialPanel.Input.concatenateForeignRecords.Tip=sl p om du avser att sl ihop likv舐diga type av PVA-, MPEG- eller VDR-filer fr蚣 olika inspelningstillf舁len +SpecialPanel.Audio.ignoreErrors=anv舅d endast frsta audio-PTSen fr synk +SpecialPanel.Audio.ignoreErrors.Tip=r臾nad audiotiden fr蚣 dess raml舅gder efter synkning av AV-startpunkten, struntar i fel +SpecialPanel.Audio.limitPts=begr舅sar synkpunkter fr audio-PTS +SpecialPanel.Audio.limitPts.Tip=b舩tre 舅 frsta audio-PTS endast (som ovan), audio kan frbli synkad +SpecialPanel.Video.ignoreErrors=strunta i videofel efter inledande PTS/GOP +SpecialPanel.Video.ignoreErrors.Tip=sl p om det 舐 sannolikt att endast video-PTS-fel uppst蚌 (bilder ser OK ut) +SpecialPanel.Video.trimPts=Video: gleitende PTSs ausgleichen +SpecialPanel.Video.trimPts.Tip=aktivieren, falls Audioexport frhzeitig stoppt, ausgelst durch schleichende PTS-Verschiebung +SpecialPanel.Conversion=endast relaterat till 'XYZ'-konverteringar: +SpecialPanel.Conversion.startWithVideo=se till att frsta PES-paketet brjar med video +SpecialPanel.Conversion.startWithVideo.Tip=sl p, vissa spelare har problem om den ej p蚶lagen; sl av vid konv. av endast audio +SpecialPanel.Conversion.addPcrToStream=generera PCR/SCR fr蚣 PTS +SpecialPanel.Conversion.addPcrToStream.Tip=ange the PCR-avst蚣d, DVB behver mer 舅 DBD, hg bitrate behver mer 舅 l虍 +SpecialPanel.Conversion.PcrCounter=kaTSr臾n +SpecialPanel.Conversion.PcrCounter.Tip=ka p TS-paketr臾naren 舸en vid tomt inneh虱l (endast PCR); inte standard, men ibland ndv舅digt + +#OutTab +ExportPanel.SplitPanel=dela upp utresultatet +ExportPanel.SplitSize=dela vid ung. xxx MB +ExportPanel.SplitSize.Tip=舅dra i f舁tet fr att f annan storlek; f.n. s speglar v舐det storleken p videofilen (mpv) endast +ExportPanel.Overlap=verlappning med +ExportPanel.Overlap.Tip= +ExportPanel.StreamtypePanel=typer av strmmar att bearbeta +ExportPanel.StreamtypePanel.Tip=sl p/av de typer av strmmar som nskas bearbetade (ej till舂plig d inpur 舐 ES) +ExportPanel.Streamtype.MpgVideo=Mpg-video +ExportPanel.Streamtype.MpgAudio=Mpg-audio +ExportPanel.Streamtype.Ac3Audio=AC3/DTS-audio +ExportPanel.Streamtype.PcmAudio=LPCM-audio +ExportPanel.Streamtype.Teletext=Text-TV +ExportPanel.Streamtype.Subpicture=DVB-textning +ExportPanel.Streamtype.Vbi=Generic_VBI +ExportPanel.Streamtype.MpgVideo.Tip=Mpg Video +ExportPanel.Streamtype.MpgAudio.Tip=Mpg Audio +ExportPanel.Streamtype.Ac3Audio.Tip=AC3/DTS Audio +ExportPanel.Streamtype.PcmAudio.Tip=LPCM Audio +ExportPanel.Streamtype.Teletext.Tip=Teletext +ExportPanel.Streamtype.Subpicture.Tip=Untertitel +ExportPanel.Streamtype.Vbi.Tip=Generic_VBI +ExportPanel.WriteOptions=skrivvarianter fr konvertering & demux +ExportPanel.WriteOptions.Tip=som 舸en p蛆erkar funktionen 'till VDR/MPG/PVA/TS' fr att ta med audio- och/eller video-ES +ExportPanel.WriteOptions.writeVideo=skiva alla video-data +ExportPanel.WriteOptions.writeAudio=skriv alla andra data +ExportPanel.WriteOptions.writeVideo.Tip=skiva alla video-data +ExportPanel.WriteOptions.writeAudio.Tip=skriv alla andra data +ExportPanel.WriteOptions.InfoScan=snabb-demux/-konvering (in MB): +ExportPanel.additionalOffset.Title=ytterligare tidsoffset +ExportPanel.additionalOffset=sl p offsethantering +ExportPanel.additionalOffset.Tip=ursprunglig start i denna strm flyttas med denna offset, p蛆erkar alla strmmer som fljer p en videostrm +ExportPanel.additionalOffset.Value.Tip=ange tidsoffset i millisek. och tryck +ExportPanel.createSubDirNumber=spara hopsamlingen som underkatalog +ExportPanel.createSubDirNumber.Tip=global: ska ny underkatalog fr varje hopsamling (b舩tre fr samma fil vid olika hopsamlingar av klippunkter) +ExportPanel.createSubDirName=skapa underkatalog med basnamnet +ExportPanel.createSubDirName.Tip=global: skapa ny underkatalog baserad p frsta filnamnet i varje hopsamling + + +#VideoTab +VideoPanel.Title1=video-korrigeringar +VideoPanel.ChangeVbvBuffer.Tip=ibland 舐 det b舩tre att s舩ta en maxstorlek +VideoPanel.Unchanged=舅dra inde +VideoPanel.ChangeVbvBuffer.Mode1=(1) maximum (112*16384) +VideoPanel.ChangeVbvBuffer=vbv-buffer: +VideoPanel.ChangeVbvDelay.Tip=max. rekommenderad tid +VideoPanel.ChangeVbvDelay.Mode1=(1) maxtid (0xFFFF) +VideoPanel.ChangeVbvDelay=vbv-frdrjning: +VideoPanel.ChangeAspectRatio.Tip=舅dra om det anses ndv舅digt +VideoPanel.ChangeAspectRatio=bildformatfrh虱lande +VideoPanel.addEndcode=l臠g till sekvensens slutkod +VideoPanel.addEndcode.Tip=sl p fr att f ett sammanh舅gande MPEG-sekvensslut +VideoPanel.insertEndcode=Sequenzendcode bei Wechseln einfgen +VideoPanel.insertEndcode.Tip=aktivieren fr konformen Sequenzabschlu゚ +VideoPanel.patchToProgressive=舅dra alla ramar till progressiva +VideoPanel.patchToProgressive.Tip=s舩ter progressivbitarna fr att minska f舁tnurmet +VideoPanel.patchToInterlaced=舅dra alla ramar till att bli sammanfl舩ade +VideoPanel.patchToInterlaced.Tip=ta bort progressivbitarna +VideoPanel.toggleFieldorder=舅dra f舁tordning +VideoPanel.toggleFieldorder.Tip=sl p och av Topfield_first-biten +VideoPanel.addSequenceHeader=s臾erst舁l att varje GOP har ett sekvenshuvud +VideoPanel.addSequenceHeader.Tip=蚯erinitiera (upplsn. & q-matris) bildavkodning vid varje GOP-gr舅s (sker autom. vid uppdelning) +VideoPanel.clearCdf=舅dra cd-flaggaad infoormation om bilder +VideoPanel.clearCdf.Tip=kan lsa 'gron bild'-problem i vissa gamla h蚌dvaruavkodare +VideoPanel.patchResolution.Tip=villkoring 舅dring av frsta horisontella upplsningen +VideoPanel.patchResolution=舅dr 1:a H-upplsn.: +VideoPanel.patchResolutionValue.0=(0) aldrig +VideoPanel.patchResolutionValue.1=(1) n舐somhelst +VideoPanel.patchResolutionValue.2=(2) om <> 352|720 +VideoPanel.patchResolutionValue.3=(3) om <> 352|704|720 +VideoPanel.Title2=nya bitrate-v舐den +VideoPanel.patchBitrateValue.0=(0) beh虱l original +VideoPanel.patchBitrateValue.1=(1) h舐ledd fr蚣 GOP-bitl舅gd +VideoPanel.patchBitrateValue.2=(2) h舐ledd fr蚣 VBV +VideoPanel.patchBitrateValue.3=(3) markera som VBR (MPEG-1-video) +VideoPanel.patchBitrateValue.4=(4) fix 3 Mbps +VideoPanel.patchBitrateValue.5=(5) fix 6 Mbps +VideoPanel.patchBitrateValue.6=(6) fix 9 Mbps +VideoPanel.patchBitrateValue.7=(7) fix 12 Mbps +VideoPanel.patchBitrateValue.8=(8) fix 15 Mbps +VideoPanel.patchBitrateValue=bitrate-v舐den per sekvens: +VideoPanel.patch1stBitrateValue.0=(0) beh虱l original +VideoPanel.patch1stBitrateValue.1=(1) utr臾nat medel (nominellt) +VideoPanel.patch1stBitrateValue.2=(2) utr臾nat maximum <= 9.0 Mbps (DVD) +VideoPanel.patch1stBitrateValue.3=(3) utr臾nat maximum (t.ex. HDTV) +VideoPanel.patch1stBitrateValue.4=(4) markeras som VBR (MPEG-1-video) +VideoPanel.patch1stBitrateValue=bitrate-v舐de i frsta sekvensen: +VideoPanel.addSde=Auflsung in SDE setzen +VideoPanel.addSde.Tip=舅dert existierende oder erg舅zt Eintr臠e, leeres Feld setzt die Daten lt. Sequenzkopf; Bsp: 720*576 +VideoPanel.SdeValue.Tip=舅dert existierende oder erg舅zt Eintr臠e, leeres Feld setzt die Daten lt. Sequenzkopf; Bsp: 720*576 + +#AudioTab +AudioPanel.Title1=audio-konverteringar +AudioPanel.losslessMpaConversion.Tip1=direkt frlustfri konverterad (begr舅sad +AudioPanel.losslessMpaConversion.Tip2=till MPEG-1, niv 2, 48 kHz, 56..384 kbps): +AudioPanel.losslessMpaConversion.Tip=om konvertering valts, blir bitrate och kanalmetod konstanta i hela filen +AudioPanel.losslessMpaConversionMode0=(0) ingen konvertering +AudioPanel.losslessMpaConversionMode1=(1) singel to 3D-stereo (V+H = original) +AudioPanel.losslessMpaConversionMode2=(2) single to stereo (V+H = original) +AudioPanel.losslessMpaConversionMode3=(3) single to blandstereo (V+H = original) +AudioPanel.losslessMpaConversionMode4=(4) dela upp 2-kanals till 2 enklare (1=V,2=H) +AudioPanel.decodeMpgAudio=avkoda MPEG-niv蘰r 1, 2 till PCM: +AudioPanel.decodeMpgAudio.Tip=MPEG-audiodekoder (inte fr niv 3), std-utmatning till PCM-stereo +AudioPanel.decodeMpgAudio.resampleAudioMode0=(0) ingen omsampling +AudioPanel.decodeMpgAudio.resampleAudioMode1=(1) linj舐 omsampling 48 kHz to 32 kHz +AudioPanel.decodeMpgAudio.resampleAudioMode2=(2) linear omampling 48 kHz to 44.1 kHz +AudioPanel.decodeMpgAudio.Normalize=normalisera till %: +AudioPanel.decodeMpgAudio.Normalize.Tip=normalisera v+H likadant, v舐den 0..100 舐 mjliga std 舐 98%; p蚯vingar omstarter om ndv舅digt +AudioPanel.NormalizeValue.Tip=normalisera v+H likadant, v舐den 0..100 舐 mjliga std 舐 98%; p蚯vingar omstarter om ndv舅digt +AudioPanel.decodeMpgAudio.Downmix=mix ner och mata ut till en kanal +AudioPanel.decodeMpgAudio.Downmix.Tip=mixa ner stereo/2-kanalsk舁la till en enda kanal +AudioPanel.decodeMpgAudio.changeByteorder=spara i Motorola-byte-ordning (big-endian) +AudioPanel.decodeMpgAudio.changeByteorder.Tip=avser MSB frst, ej Intel-ordning +AudioPanel.decodeMpgAudio.addRiffHeader=l臠g till RIFF(RIFX)-huvud till PCM (.wav) +AudioPanel.decodeMpgAudio.addRiffHeader.Tip=PC-standard +AudioPanel.decodeMpgAudio.addAiffHeader=l臠g till AIFF-huvud till PCM (.aif) +AudioPanel.decodeMpgAudio.addAiffHeader.Tip=Apple-standard +AudioPanel.Title2=audio-manipulateringar +AudioPanel.validateCRC=kolla CRC of AC-3/MPEG-audioniv蘰r 1,2 +AudioPanel.validateCRC.Tip=om p蚶lagen, garanteras l臠sta mjliga felniv p utresultatet, med s舂re prestanda som fljd +AudioPanel.clearCRC=ta bort CRC i MPEG-audioniv蘰r 1,2 +AudioPanel.clearCRC.Tip=if p蚶laget, s frhindras vissa audio-felmeddelanden +AudioPanel.fillGapsWithLastFrame=fyller gap med tidig. ramar +AudioPanel.fillGapsWithLastFrame.Tip=ist舁let fr att stoppa in tysta ramar; 舐 std fr AC3 om ac3.bin inte inneh虱ler en passande ram fr AC3 +AudioPanel.addFrames=l臠g till ramar +AudioPanel.addFrames.Tip=om audio slutar fre video, fr att 蚶tadkomma samma l舅gd som video +AudioPanel.patch1stAc3Header=舅dra 1:a AC3-huvudet till 3.2-kanaler +AudioPanel.patch1stAc3Header.Tip=vissa AC3-avkodningsprogram behber det fr att avkoda alla kanaler 舸en om det 舐 f舐re +AudioPanel.replaceAc3withSilence=ers舩t alla icke-3.2-AC3 med 3.2-lfe-tystnad +AudioPanel.replaceAc3withSilence.Tip=sl p fr att maska ut ick nsv舐da 2.0-ramar med 3.2-tystnad (48 kHz, 448 kbps, ac3.bin behvs) +AudioPanel.addRiffToAc3=l臠g till RIFF WAVE-huvud till AC3-audio +AudioPanel.addRiffToAc3.Tip=skapa en .wav-fil, anv舅dandes AC3-v虍formatet (tagg 0x2000) i huvudet +AudioPanel.addRiffToMpgAudioL12=MPA: l臠g till RIFF WAVE-huvud Niv 1,2 +AudioPanel.addRiffToMpgAudioL12.Tip=Broadcast-.wav-format (tagg 0x0050), b舩tre fr MPEG-niv蘰rna 1 & 2 +AudioPanel.addRiffToMpgAudioL3=MPA: l臠g till RIFF WAVE-huvud Niv 3 +AudioPanel.addRiffToMpgAudioL3.Tip=vanligare ACM-.wav-format (tagg 0x0055), b舩tre fr MPEG niv 3 +AudioPanel.pitchAudio=hoppa ver var x:te audioram: +AudioPanel.pitchAudio.Tip=komprimera/reducera audio (endast ES) +AudioPanel.allowSpaces=till蚯 mellanrum mellan ramar +AudioPanel.allowSpaces.Tip=detektera giltiga ramhuvuden, men utan att verifiera raml舅gd (som mjligen kan ge ogiltiga storlekar) +AudioPanel.createDDWave=AC-3/DTS: output as DD/DTS-Wave +AudioPanel.createDDWave.Tip=output Ac3/DTS as DD/DTS-Wave, fixed header: PCM 44.1kHz,16bit,2-ch + +#SubtitleTab +SubtitlePanel.Title=DVB-text-TV, DVB-textning +SubtitlePanel.Title.Teletext=DVB Teletext (demultiplex) +SubtitlePanel.decodeMegaradio=test: exportera MegaRadioョ MP3-strm +SubtitlePanel.decodeMegaradio.Tip=verfrdes tidigare via Hotbird 13ーE, 11.054 GHz Hor., SR 27500, FEC 5/6, TTX-PID 553 +SubtitlePanel.decodeHiddenRows=avkoda gmda rader i text-TV (id 0xFF) +SubtitlePanel.decodeHiddenRows.Tip=vissa sidor eller kompletta text-TV-sidor fr text-TV-textning 舐 gmda, s det kan vara till hj舁p +SubtitlePanel.rebuildPTS=gr om text-TV-PTS fr蚣 1:a MPG-audiostrmmen +SubtitlePanel.rebuildPTS.Tip=anv舅d den endast fr text-TV-strmmar som 舐 med i en strmfil (TS,PES...) men utan vederbrlig tidbas i frh虱lande till video +SubtitlePanel.keepOriginalTimcode=beh虱l original-tidkod (PTS) vid oberoende avkodning +SubtitlePanel.keepOriginalTimcode.Tip=utan inledande video vid demux, s startar inte tidkoden p 0 +SubtitlePanel.exportTextAsUnicode=Unicode (UTF-16 BE) on text export +SubtitlePanel.exportTextAsUnicode.Tip=Unicode (UTF-16 Big-Endian) on text export +SubtitlePanel.exportTextAsUTF8=Unicode (UTF-8) on text export +SubtitlePanel.exportTextAsUTF8.Tip=Unicode (UTF-8) on text export +SubtitlePanel.TtxPages=text-TV-sidor att avkoda: +SubtitlePanel.TtxPages.Tip=autodetektering av specialtecken baserade p text-TV Niv 1.5-kodsidor i Unicode +SubtitlePanel.Language= spr虧: +SubtitlePanel.Language.Tip=fast fr ett spr虧par, om inte en automatisk omkoppling inte 舐 understdd av uts舅dningsfretaget +SubtitlePanel.Format.Tip=v舁j exportformat +SubtitlePanel.Format.Free=fritt +SubtitlePanel.Format=textningsexportformat: +SubtitlePanel.Colormodel.Mode0=(0) 4 f舐ger +SubtitlePanel.Colormodel.Mode1=(1) 16 f舐ger +SubtitlePanel.Colormodel.Mode2=(2) 256 f舐ger +SubtitlePanel.PageId.Value.Tip=tom f舁t = anv舅d det som komemr, annars nyckel till sidnumret som nskas (beror p uts舅dning) +SubtitlePanel.Colormodel=simulera DVB-textningens IRD-f舐gmodell: +SubtitlePanel.Colormodel.Tip=som verkligen p蛆erkar utseendet av textningen, b舖ta inst舁lningen beror p vad som nskas uppn蚯t +SubtitlePanel.PageId= fast till sid-ID: +SubtitlePanel.showPreview=visa frhandsgranskning av textning +SubtitlePanel.Format.SUP.Values.Tip=(avst蚣d fr蚣 nedre v舅stra hrnet) typsnittsstorlek,bakgrundsalfa; Y-avst蚣d; X-avst蚣d; X-bredd; H(anv舅ds ej); V; Y-avst蚣d-2; max rader +SubtitlePanel.SupValues= V舐de: +SubtitlePanel.Font.LoadError=Fehler beim Laden der Systemschriftarten +SubtitlePanel.useTextOutline=zeichne Textzeichen mit schwarzer Umrandung (SUP-Export) +SubtitlePanel.useTextOutline.Tip=umgibt jedes Zeichen mit 3 Pixeln Rand bei max. 2 'Sprecherfarben' pro Bild, ansonsten gesamter Hg schwarz +SubtitlePanel.Font=Schriftart: +SubtitlePanel.Font.Tip=bei SUP-Export + +#Autoload +autoload.title=lista med frdefinierade input-filkataloger +autoload.dir.remove.tip=ta bort filkatalog fr蚣 autoladdningslistan +autoload.dir.add.tip=l臠g till filkatalog till autoladdningslistan +autoload.dir.refresh.tip=skriv om fillistan +autoload.add.coll.tip=skapa ny hopsamling fr var och en av filerna och l臠g till den +autoload.add.file.tip=l臠g till fil(er) till en hopsamling +autoload.rename.tip=v舅ster-dubbelklicka eller tryck p enter fr att 舁gga till filer till en hopsamling, hgerklicka fr att byta namn +autoload.dialog.rename=byt namn +autoload.dialog.fileexists=Filen finns redan. Skriv ver? +autoload.close=st舅ger fnstret +autoload.ftp.add.tip=fge FTP Server Verzeichnis der Liste hinzu +autoload.dialog.newOutName=neuer Dateiname + +#splitreset +splitreset.novideo=! -> ingen videofils-PTS, s舐slagning sl av + +#checkpts +checkpts.1st.latter=!> frsta video-PTS startar senare 舅 sista PTSen i denna strm -- kritiskt fr synk +checkpts.last.ends=!> sista video-PTS slutar fre start-PTSen fr denna strm -- synk omjlig + +#parseSecondaryPES +parseSecondaryPES.continue=-> forts舩t vid anv舅dade av r蘚ata fr蚣 +parseSecondaryPES.demux.pes=demux:ar PES-fil +parseSecondaryPES.missing.startcode=!> startkod saknas vid +parseSecondaryPES.found.startcode=!> startkod funnen vid +parseSecondaryPES.packet.length=-> ! paketl舅gden 舐 0 vid +parseSecondaryPES.miss.next.startcode=!> n舖ta startkod saknas vid {0} fr蚣 {1} (PES-ID 0x{2}), kastar paketet... +parseSecondaryPES.packs=packs: {0} {1}% {2} +parseSecondaryPES.found.pesid=-> fann PES-ID 0x{0} {1} vid {2} +parseSecondaryPES.ac3.audio=--> AC-3/DTS-audio +parseSecondaryPES.teletext=--> Text-TV +parseSecondaryPES.mpeg.audio=--> MPEG-audio +parseSecondaryPES.lpcm.audio=--> LPCM-audio +parseSecondaryPES.subpic=--> Textning +parseSecondaryPES.eof.error=PES-tolkning: Filslut n蚯t vid fel: +parseSecondaryPES.io.error=PES-tolkning: Fil-I/O-fel: +parseSecondaryPES.msg.noexport=--> Strom bergangen + +#ID type +idtype.mpeg.video.ignored=(MPEG-video) -> hoppar ver +idtype.mpeg.audio=(MPEG-audio) +idtype.private.stream=(privat strm 1) +idtype.mpeg.video=(MPEG-video) +idtype.mapped.to= kopplad till 0x +idtype.mapped.to.e0= kopplad till 0xE0 +idtype.ignored= -> ignoreras +idtype.video=(video) +idtype.main.audio=(huvud-audio) +idtype.additional=(ytterligare) +idtype.has.pesid= har PES-ID 0x + +#parsePrimaryPES +parsePrimaryPES.special.pes=-> special-PES-ID fr skning har definierats +parsePrimaryPES.continue=forts舩ter med fil +parsePrimaryPES.demuxing=demux:ar +parsePrimaryPES.converting=konverterar +parsePrimaryPES.avpes.file=AV-PES-fil +parsePrimaryPES.missing.startcode=!> startkod saknas vid +parsePrimaryPES.found.startcode=!> startkod funnen vid +parsePrimaryPES.split.cellids=-> VOB-ID {0} Cell-ID {1} @ {2} (GOP-#{3}/Ram-#{4}) +parsePrimaryPES.packet.length=-> ! paketl舅gd 0 vid +parsePrimaryPES.miss.startcode=!> n舖ta startkod saknas (paketstorlek=0) vid {0} fr蚣 {1}/inbuffert {2} +parsePrimaryPES.miss.startcode2=!> n舖ta starkod saknas vid {0} fr蚣 {1} (PES-ID 0x{2}), kastar paketet... +parsePrimaryPES.packs=packar +parsePrimaryPES.dump.1st=-> dumpa frsta paketet till fil +parsePrimaryPES.found.pesid=-> fann PES-ID 0x +parsePrimaryPES.pes.incoming=!> PES-ID 0x{0}, inkommande PES-paket utan inneh虱l eller felaktiga huvuddata vid {1} +parsePrimaryPES.actual.written=-> faktisktt skrivan v-ramar: +parsePrimaryPES.switch=byt till fil: +parsePrimaryPES.ac3=--> AC3/DTS-audio +parsePrimaryPES.teletext=--> Text-TV (SubID 0x +parsePrimaryPES.mpeg.audio=--> MPEG-audio (0x +parsePrimaryPES.lpcm.audio=--> LPCM-audio (sub-ID 0x +parsePrimaryPES.subpic=--> DVB-textning (sub-ID 0x +parsePrimaryPES.eof.error=VDR-tolkning: filslut n蚯t vid fel: +parsePrimaryPES.io.error=VDR-tolkning: fil-I/O-fel: +parsePrimaryPES.msg.noexport=--> Strom bergangen (0x + +#parseTS +parseTS.sid=-> Service-ID 0x +parseTS.pmt.refers=-> PMT 0x{0} h舅visar till dessa anv舅dbara strmmar: +parseTS.video= Video +parseTS.audio= Audio +parseTS.teletext= Text-TV +parseTS.subpic= DVB-textning +parseTS.no.pmt=-> ingen PMT funnen (efter kort skning) +parseTS.special.pids=-> special-PIDar fr skning har definierats +parseTS.continue=forts舩t me dfil +parseTS.demuxing=demux:ar +parseTS.converting=konverterar +parseTS.dvb.mpeg= DVB-MPEG-TS-fil +parseTS.incomplete=!> ofullst舅digt TS-paket vid filskut funnet vid +parseTS.comp.failed=!> TS paketslutfrandet misslyckades :-( +parseTS.missing.sync=!> synk-byte saknas vid +parseTS.comp.ok=!> TS-paketslutfrande OK :-) +parseTS.found.sync=!> fann synk-byte vid +parseTS.bit.error=!> PID 0x{0} -> TS-bitfel i paket {1} vid pos. {2}, kastar... +parseTS.stuffing=-> PID 0x1FFF => utfyllnadspaket -> ignoreras +parseTS.scrambled=-> PID 0x{0} => markerad som ihopblandade data, paket {1} vid {2} -> ignoreras +parseTS.clear=-> PID 0x{0} => h舂tar rena data, paket {1} @ {2} +parseTS.outof.sequence=!> PID 0x{0} -> paket {1} vid pos. {2} ur sekvens ({3}/{4}) (skiftar...) +parseTS.priv.stream2.ignored=-> PID 0x{0}(privat strm 2) -> ignoreras +parseTS.scrambled.notignored=-> PID 0x{0} => markerade som ihopblandade data (ignoreras inte){1} +parseTS.ignored= -> ignoreras +parseTS.pid.has.pes=ok> PID 0x{0} har PES-ID 0x{1} {2} +parseTS.lackof.pes=!> PID 0x{0} avsaknad av PES-data -> paket slopat +parseTS.actual.vframes=-> faktiskt antal skrivna v-ramar: +parseTS.tryto.complete=!> frsker att fylla i ofullst舅diga TS-paket... +parseTS.packs=packar: {0} {1}% {2} +parseTS.ac3.audio=--> AC3/DTS-audio on PID 0x +parseTS.teletext.onpid=--> Text-TV on PID 0x +parseTS.mpeg.audio=--> MPEG-audio (0x{0}) on PID 0x{1} +parseTS.subpicture=--> DVB-textning (sub-ID 0x +parseTS.eof.error=r蚯t format: filavslut p蚯r臟fat vid fel: +parseTS.io.error=r蚯t format: fil-I/O-fell: +parseTS.switch.to=byt till fil: +parseTS.msg.noexport=--> StromID (0x{0}) unter PID 0x{1} bergangen + +#nextfile +nextfile.io.error=n舖ta fil: fil-I/O-fel: +nextfile.shift.auto=-> skifta original-PTS bak蚯 automatiskt med {0} timmar +nextfile.shift.manual=-> skifta original-TS bak蚯 manuelltt med {0} timmar +nextfile.next.file.start=-> n舖ta fil: starta med PTS: {0}/sista faktiska PTS 舐 {1} +nextfile.next.file.start.adaption=-> verwende PTS-Offset: {0} ab hier + +#overlapPVA +overlappva.io.error=l舖fel vid verlappning: + +#parsePVA +parsePVA.special.pids=-> special-PIDar fr skning definierade +parsePVA.streamtype.ac3= (AC3/DTS) +parsePVA.streamtype.ttx= (Text-TV) +parsePVA.streamtype.mpeg.audio= (MPEG-audio) +parsePVA.streamtype.mpeg.video= (MPEG-video) +parsePVA.continue=forts舩t med fil: +parsePVA.demuxing=demux:ar +parsePVA.converting=konverterar +parsePVA.pvafile= PVA-fil +parsePVA.missing.sync=!> synk-ord saknas vid +parsePVA.found.sync=!> fann synk-ord vid +parsePVA.file.overlap=filverlappning detekterad vid filposition: +parsePVA.packs=packar +parsePVA.found.id=-> fann ID 0x +parsePVA.outof.sequence=!> ID 0x{0} -> paket {1} vid pos. {2} ej i sekvens ({3}/{4}) (skiftar...) +parsePVA.id.0x=-> ID 0x +parsePVA.actual.vframes=-> faktiskt skrivna v-ramar: +parsePVA.ac3.onid=--> AC3/DTS-audio p ID 0x +parsePVA.teletext.onid=--> Text-TV p ID 0x +parsePVA.mpeg.audio.onid=--> MPEG-audio p ID 0x +parsePVA.eof.error=PVA: filslut n蚯t vid fel: +parsePVA.io.error=PVA: fil-I/O-fel: +parsePVA.msg.noexport=--> Strom bergangen auf ID 0x + +#Audioprocess +audio.progress=kontrollerar och synkroniserar audiofilen +audio.status.pre-insert=s舩ter in fre... +audio.status.insert=s舩ter in... +audio.status.write=skriver... +audio.status.pause=pausad... +audio.status.add=l臠ger till... +audio.status.finish="klart..." +audio.convert=-> konvertera MPA: +audio.decode=-> avkoda MPA: +audio.restart=!> start om audio-bearbetning, tvingat av fr舅dringar vid utmatad ram +audio.error.io=fil-I/O-fel: +audio.msg.pts.discard=!> {0} PTSer som hoppats ver i strmmen +audio.msg.pts.firstonly=-> ta endast med frsta audio-PTSen (fr att synka starttiden) +audio.msg.pts.start_end=Audio-PTS: first paketet {0}, sista paketet +audio.msg.pts.mismatch=-> !! video- & audio-PTS matchar aldrig +audio.msg.pts.wo_frame=!> PTS utan en enda ram +audio.msg.adjust.at.videopts=-> justerar audio p video-tidbas +audio.msg.adjust.at.ownpts=-> justerar audio p dess egen tidbas +audio.msg.addriff.acm=-> l臠g till RIFF WAVE-huvud till MPEG-audio som ACM-v虍format +audio.msg.addriff.bwf=-> l臠g till RIFF WAVE-huvud till MPEG-audio som BWF-v虍format +audio.msg.addriff.ac3=-> l臠g till RIFF WAVE-huvud till AC3-audio +audio.msg.syncword.lost=!> synkord saknas vid {0}, vid +audio.msg.syncword.found=!> fann synkord vid +audio.msg.frame.discard=-> hoppar ver ram med nummer +audio.msg.crc.error=!> CRC{0}-check misslyckades vid +audio.msg.source=-> ursprunglig audio: {0} vid +audio.msg.source.max=-> ursprunglig audio: sluta visa, fler 舅 100 audio-modfr舅dringar i en fil frs舂rar farten +audio.msg.summary.skip=-> hoppade ver ursprungsramar vid +audio.msg.summary.pre-insert=-> {0} ram(ar) ({1} ms) insatta fre vid +audio.msg.summary.insert=-> {0} ram(ar) ({1} ms) insatta vid +audio.msg.summary.add=-> {0} ram(ar) ({1}ms) insatta vid +audio.msg.summary.frames=audioramar: skr-frins-verhopp-ins-tillagda {0} vid {1} klart... +audio.msg.summary.jstereo=-> {0} fr舅dringar stereo/ihoppsatt stereo funna... +audio.msg.audio=Audio +audio.msg.newfile.left=(v舅ster): +audio.msg.newfile.right=(right): +audio.msg.noaudio=!> ingen audio funnen i denna strm... +audio.msg.convert.disabled=!> Ursprungs-Frame erfllt nicht die Konvertierungskriterien, Funktion deaktiviert.. (Frame# {0}) +audio.msg.convert.error=!> Ursprungs-Frame verursachte einen Konvertierungsfehler (Fehler {0}), (Frame# {1}) + +#Videoprocess +video.msg.pts.start_end=Video-PTS: start 1:a GOP {0}, slut sista GOP +video.msg.summary=-> Video: fr-ct-1p-cg-og-dg -> +video.progress=analyserar videostrmfil +video.msg.skip.sec=-> hoppar ver sekvens-slutkod som fljer p GOP nr {0} @ +video.error.io=!> fel vid ren video蚯komst +video.msg.error.lackofdata=!> GOP# {0} - data saknas, ignoreras... +video.msg.error.nopts.use_goptc=!> GOP nr {0} har ingen PTS, anv GOP TC fr synkn +video.msg.error.nopts.use_lastpts=!> GOP nr {0} har ingen PTS, anv舅der sista PTS fr synkn +video.msg.basics=-> grundl臠gande video: +video.msg.newformat=GOP# {0}, nytt format i n舖ta inledande sekvenshuvud funnen: +video.msg.error.pesext_in_es=!> GOP nr {0}, PES-huvud och frl舅gning funnen i ES, utfylld med nollor... (GOP-offset {1}) +video.msg.error.pes_in_es=!> GOP nr {0}, PES-huvud funnet i ES, utfylld med nollor... (GOP-offset {1}) +video.msg.error.frame.wrong=!> felaktig ramtyp {0} +video.msg.export.start=-> p蘆rjar export av video-data vid GOP nr +video.msg.pts.diff=!> detekterade PTS-skillnad p {0} ({1}) till senaste exported GOP +video.msg.error.brokenlink=(avbruten l舅k korrigerad) +video.msg.frame.drop=!> kastar oanv舅dbara B-ramar vid GOP no {0} / ny tidkod +video.msg.error.frame.not=!> GOP nr {0} inneh虱ler inga ramar +video.msg.error.frame.not.i=!> GOP nr {0} startar inte med en I-ram vid vid t-ref '0' +video.msg.error.pts.early=!> start-PTS fr GOP nr {0} kommer tidigare 舅 slutet p senaste GOP... (frv. {1}) +video.msg.error.gop.drop=!> kastar GOP nr {0} vid orig PTS {1} ({2}) +video.msg.error.gop.diff=!> Bilder frv/r臾n {0}, vid GOP-PTS-diff {1} ms, ny tidkod +video.msg.error.gop.dump=-> dumpar GOP till fil: +video.msg.io=ingen +video.msg.io=sammanfl舩ad (interlaced) +video.msg.io=progressiv +video.msg.io=sammanfl舩ad & progressiv +video.msg.length=-> Video-l舅gd: {0} ramar vid +video.msg.gop.summary=-> GOP-sammanfattn: min. {0}, max. {1} f舁d; inneh虱ler {2} ramar +video.error.pts.same=-> fann {0} GOPar med samma PTS-v舐de fr olika bilder! +video.summary=.Video {0}:\t{1} Ramar\t{2}\t\t +video.msg.bitrate.avg=-> genomsnittlig bitrate {0}bps (min/max: {1}) +video.msg.bitrate.avgnom=-> genomsnittlig nom. bitrate {0}bps (min/max: {1}) +video.msg.bitrate.vbr=-> s舩t frsta sekvenshuvudets bitrate till VBR +video.msg.bitrate.val=-> s舩t frsta sekvenshuvudets bitrate till {0} bps +video.msg.resolution=-> 舅dra frsta sekvenshuvudets upplsning from {0} to + +#Teletextprocess +teletext.msg.nooutput=!> inget utformat specificerat fr text-TV-text... +teletext.msg.output=-> exportformat: +teletext.msg.tmpfile=-> temp-fil: {0} ({1} byte) +teletext.msg.page=sida nummer +teletext.msg.megaradio=MegaRadio MP3-strm +teletext.progress=sker och kodar av +teletext.msg.search=-> letar efter +teletext.status=sidor: +teletext.msg.discard=!> {0} PTS:er kastade fr蚣 strm +teletext.msg.pts.start_end=Text-TV-PTS: frsta paket {0}, sista paket +teletext.msg.pts.missed=!> text-TV-strmmen anv舅der inte PTSer, synk omjlig +teletext.msg.pts.mismatch=!> video- & text-TV-PTS passar inte n虍on g蚣g ihop +teletext.msg.adjust.at.video=-> anpassar text-TV-text till video-tidbasen +teletext.msg.adjust.at.own=-> anpassar text-TV-text till dess egen tidbas +teletext.msg.syncword.lost=!> synkord saknas vid +teletext.msg.syncword.found=!> fann synkord vid +teletext.msg.vps=-> VPS status: {0} vid PTS +teletext.msg.provider=-> leverantr: +teletext.msg.program=-> program: +teletext.msg.summary={0} sidor fr蚣 nr {1} skrivna... +teletext.summary=Text-TV {0}:\t{1} sidor fr蚣 nr {2}\t{3}\t +teletext.error.eof=!> Text-TV-textfilslut med felet: +teletext.error.io!> Text-TV-text-I/O-fel: {0} / +teletext.msg.newrun-> utfr 2:a SUP Y-offset + +#Subpictureprocess +subpicture.msg.error3=!> fel vid avkodning av DVD-textning +subpicture.msg.error4=!> paketdata saknas +subpicture.msg.error5=!> paketstorlek matchar inte paketdata +subpicture.msg.error6=!> felaktigt positionsindex fr stycke +subpicture.msg.error7=!> felaktig position fr stycke +subpicture.msg.error8=!> felaktigt slut p index fr stycke +subpicture.msg.error9=!> felaktigt slut p stycke +subpicture.msg.model=-> vald DVD-textningsf舐gmodell: {0} ; koppplad till sida med nr: +subpicture.msg.output=-> exportformat: +subpicture.msg.tmpfile=-> temp.-fil: {0} ({1} byte) +subpicture.progress=verifierar och synkroniserar +subpicture.msg.discard=!> {0} PTS:er kastade fr蚣 strm +subpicture.msg.pts.mismatch=!> video- & DVB-textnings-PTS passar inte n虍on g蚣g ihop +subpicture.msg.adjust.at.video=-> anpassar DVB-textning till video-tidbas +subpicture.msg.adjust.at.own=-> anpassar DVB-textning till dess egen tidbas +subpicture.msg.syncword.lost=!> synkord saknas vid +subpicture.msg.syncword.found=!> fann synkord vid +subpicture.msg.error={0} @ {1}, kastar bild... +subpicture.msg.dvbsource=-> ursprung 舐 DVB-textning... +subpicture.status=pic's: +subpicture.preview.title.dvdexport=/ bild {0} -> in: {1} varaktighet: +subpicture.preview.title.dvbexport=/ sidnr {0} / bild {1} -> in: {2} varaktighet: +subpicture.msg.forced=fr蚣 bild +subpicture.msg.forced.no=-> visa status: inte forcerad +subpicture.msg.forced.yes=-> visa status: forcerad, +subpicture.preview.title.noexport=/ bild exporterades inte... +subpicture.msg.pts.start_end=DVB-textnings-PTS: frst paket {0}, sista paket +subpicture.msg.summary=skrev {0} DBV-texter... +subpicture.summary=DVB-textning {0}:\t{1} texter\t{2}\t +subpicture.msg.error.eof=!> DBB-textnings-filslut med felet: +subpicture.msg.error.io=!> DBB-textnings-I/O-fel: {0} / +subpicture.msg.error.dvbdecoding=!> avkodningsfel: {0}, Regions-id {1} (pts {2}) + +#LPCMprocess +lpcm.msg.develop=...under utveckling... +lpcm.msg.tmpfile=-> temp.-file {0} ({1} byte) +lpcm.progress=verifierar & synkroniserar +lpcm.msg.pts.mismatch=!> video- & LPCM-PTS passar inte en enda g蚣g +lpcm.msg.adjust.at.video=-> anpassar LPCM till video-tidbas +lpcm.msg.adjust.at.own=-> anpassar LPCM till dess egen tidbas +lpcm.msg.syncword.lost=!> synkord saknas vid +lpcm.msg.syncword.found=!> fann synkord vid. +lpcm.msg.source=-> k舁l-audio: {0} vid +lpcm.msg.source.max=-> k舁l-audio: sluta visa, fler 舅 100 audio-modfr舅dringari en fil slar ner bearbetningen +lpcm.msg.error.align=!> paketet brjar inte p ett j舂nt ORD +lpcm.msg.pts.start_end=LPCM-PTS: frsta paket {0}, sista packet +lpcm.msg.summary={0} packar skrevs... +lpcm.summary=LPCM {0}:\t{1} packar\t{2}\t +lpcm.error.eof=!> LPCM-filslut med felet: +lpcm.error.io=!> LPCM-I/O-fel: {0} / + +#various +all.msg.pts.faked=--> anv舅der konstgjord PTS fr fljande data: +logalias.error.io=!> Loggalias-I/O-fel: +all.msg.error.max=-> more than 500 warnings/errors, stop logging.. +all.msg.error.summary=-> we have {0} warnings/errors. +all.msg.noprimaryfile=!> filetype is not supported as a secondary file. check the file order/segmentation. + +#demux +demux.error.audio.startcode=!> ogiltig startkod, struntar i PES-paket +demux.error.audio.io=!> fel vid audio-avkodning: +demux.error.video.io=!> fel vid video-avkodning: +demux.msg.celltimes=--> Celltider (-abrott) skrevs till: {0}CellTimes.txt +demux.error.video.startcode=!> ogiltig startkod, struntar i PES-paket +demux.error.video.payload=!> inkommande PES-paket utan inneh虱l eller med felaktiga huvud-data +demux.msg.skip.sec=-> hoppa ver sekvensslutkod som fljer p GOB nr +demux.error.gop.toobig=!> kastar video-data, GOP 舐 strre 舅 6MB + +#ftpchooser +ftpchooser.server.tip=Name oder IP Adresse des FTP-Servers +ftpchooser.server=Server: +ftpchooser.port.tip=Port des FTP Servers +ftpchooser.port=Port: +ftpchooser.user.tip=Benutzer fr FTP-Verbindung +ftpchooser.user=Benutzer: +ftpchooser.password.tip=Passwort fr FTP-Verbindung +ftpchooser.password=Passwort: +ftpchooser.directory.tip=Verzeichnis auf dem FTP-Server +ftpchooser.directory=Verzeichnis: +ftpchooser.test=Test +ftpchooser.state.tip=Zustand der Verbindung +ftpchooser.state=Zustand: +ftpchooser.untested=ungetestet, prfe Verbindung +ftpchooser.ok=OK +ftpchooser.cancel=Abbrechen +ftpchooser.title=FTP-Serverauswahl +ftpchooser.msg.noconnect=Verbindung nicht mglich. +ftpchooser.msg.nologin=Anmeldung fehlgeschlagen. +ftpchooser.msg.nodirectory=kann Verzeichnis nicht wechseln. +ftpchooser.msg.success=Verbindung erfolgreich. +ftp.command.label=FTP Kommando: +ftp.command.tip=benutzerspezifische FTP Kommandos fr FTP-Zugriff, mehrere Kommandos trennen mit '|' +FtpServer.Commands=FTP Kommando: +FtpServer.Commands.Tip=benutzerspezifische FTP Kommandos fr FTP-Zugriff, mehrere Kommandos trennen mit '|' +FtpPanel.Title=FTP Settings + + +#JobCollection +JobCollection.NoInfo=no Info +JobCollection.InProgress=In Progresst! +JobCollection.Idle=Idle. +JobCollection.Action=Action: +JobCollection.unspecified=not specif. +JobCollection.PrimaryFileSegments=FileSegments: +JobCollection.SecondaryFiles=second. Files: +JobCollection.Cutpoints=Cutpoints: +JobCollection.Chapters=Chapters: +JobCollection.PidSelection=PID-Selection: +JobCollection.OwnSettings=sep.Settings: +JobCollection.AllSize=Size \u03A3: + +#CollectionTable +CollectionTable.FileLocation=Location +CollectionTable.FileName=Filename +CollectionTable.Size=Size +CollectionTable.lastModified=lastModified +CollectionTable.Streamtype=Streamtype +CollectionTable.Source=Src + +#PreviewPanel +PreviewPanel.saveCurrentPicture=save current picture.. +PreviewPanel.saveCurrentPictureDAR=save current picture with DAR.. + +#NetPanel +NetPanel.WebServerPort=Port: +NetPanel.WebServerAccess=AccessString: +NetPanel.autostartWebServer=autostart WebIFServer Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/refresh.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/refresh.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/remchap.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/remchap.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/remcoll.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/remcoll.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/remcut.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/remcut.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/rem.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/rem.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/remove.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/remove.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/rf.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/rf.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/right2.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/right2.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/rightarrow2x.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/rightarrow2x.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/rightarrow3x.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/rightarrow3x.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/rightarrowstep1x.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/rightarrowstep1x.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/rightchap.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/rightchap.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/rightcut.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/rightcut.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/rightsteparrow1x.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/rightsteparrow1x.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/save.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/save.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/sbg.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/sbg.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/scan2.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/scan2.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/slidestart.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/slidestart.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/slidestop.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/slidestop.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/trans.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/trans.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/up2.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/up2.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/up.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/up.gif differ Binary files /tmp/byOzG9Pdnt/project-x-0.90.4dfsg/resources/x.gif and /tmp/9lC2Ez7oEt/project-x-0.91.0/resources/x.gif differ diff -Nru project-x-0.90.4dfsg/sources.lst project-x-0.91.0/sources.lst --- project-x-0.90.4dfsg/sources.lst 2006-03-25 00:59:52.000000000 +0000 +++ project-x-0.91.0/sources.lst 2011-03-27 13:02:42.000000000 +0000 @@ -4,9 +4,9 @@ src/net/sourceforge/dvb/projectx/audio/AudioFormatLPCM.java src/net/sourceforge/dvb/projectx/audio/AudioFormatWAV.java src/net/sourceforge/dvb/projectx/audio/AudioFormatMPA.java +src/net/sourceforge/dvb/projectx/audio/AudioFormatAAC.java src/net/sourceforge/dvb/projectx/audio/MpaConverter.java src/net/sourceforge/dvb/projectx/audio/MpaDecoder.java -src/net/sourceforge/dvb/projectx/audio/RIFFHeader.java src/net/sourceforge/dvb/projectx/common/Common.java src/net/sourceforge/dvb/projectx/common/GuiInterface.java src/net/sourceforge/dvb/projectx/common/GuiInterfaceIF.java @@ -21,6 +21,7 @@ src/net/sourceforge/dvb/projectx/io/RawFile.java src/net/sourceforge/dvb/projectx/io/StandardBuffer.java src/net/sourceforge/dvb/projectx/net/WebInterface.java +src/net/sourceforge/dvb/projectx/net/X_URLDecoder.java src/net/sourceforge/dvb/projectx/parser/CommonParsing.java src/net/sourceforge/dvb/projectx/parser/Gop.java src/net/sourceforge/dvb/projectx/parser/GopArray.java @@ -47,6 +48,8 @@ src/net/sourceforge/dvb/projectx/parser/StreamProcessLPCMAudio.java src/net/sourceforge/dvb/projectx/parser/StripAudio.java src/net/sourceforge/dvb/projectx/parser/StripRelook.java +src/net/sourceforge/dvb/projectx/parser/StripMedion.java +src/net/sourceforge/dvb/projectx/parser/TS_PMTParser.java src/net/sourceforge/dvb/projectx/parser/VBI.java src/net/sourceforge/dvb/projectx/subtitle/Bitmap.java src/net/sourceforge/dvb/projectx/subtitle/BMP.java @@ -55,6 +58,8 @@ src/net/sourceforge/dvb/projectx/subtitle/Subpicture.java src/net/sourceforge/dvb/projectx/subtitle/Teletext.java src/net/sourceforge/dvb/projectx/subtitle/UnicodeWriter.java +src/net/sourceforge/dvb/projectx/subtitle/Sup2VobSub.java +src/net/sourceforge/dvb/projectx/subtitle/ColorAreas.java src/net/sourceforge/dvb/projectx/thirdparty/Chapters.java src/net/sourceforge/dvb/projectx/thirdparty/D2V.java src/net/sourceforge/dvb/projectx/thirdparty/Ifo.java @@ -114,3 +119,10 @@ src/net/sourceforge/dvb/projectx/gui/TextFieldKeyListener.java src/net/sourceforge/dvb/projectx/gui/UISwitchListener.java src/net/sourceforge/dvb/projectx/gui/X_JFileChooser.java +src/net/sourceforge/dvb/projectx/gui/FileProperties.java +src/net/sourceforge/dvb/projectx/gui/CollectionProperties.java +src/net/sourceforge/dvb/projectx/gui/CutPanel.java +src/net/sourceforge/dvb/projectx/gui/ScanView.java +src/net/sourceforge/dvb/projectx/gui/FilterPanel.java +src/net/sourceforge/dvb/projectx/gui/PlayerFrame.java +src/net/sourceforge/dvb/projectx/gui/GOPEditor.java diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatAAC.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatAAC.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatAAC.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatAAC.java 2009-12-30 11:01:40.000000000 +0000 @@ -0,0 +1,208 @@ +/* + * @(#)AudioFormatAAC.java - parse Audioheaders, + * + * Copyright (c) 2007-2008 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * The part of audio parsing was derived from the MPEG/Audio + * Software Simulation Group's audio codec and ATSC A/52 in a special modified manner. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.audio; + +import net.sourceforge.dvb.projectx.audio.AudioFormat; +import net.sourceforge.dvb.projectx.common.Common; + +public class AudioFormatAAC extends AudioFormat { + +//unused !! + + public AudioFormatAAC() + { + super(); + } + + /** + * + */ + private int[] frequency_index = { + 96000, 88200, 64000, 48000, 44100, 32000, + 24000, 22050, 16000, 12000, 11025, 8000, 0, 0, 0, 0 + }; + + + /** + * + */ + private int[] bitrate_index = { + 32000, 56000, 64000, 96000, 112000, 128000, + 192000, 224000, 256000, 320000, 384000, + 448000, 512000, 576000, 640000, 768000, + }; + + /** + * + */ + private String[] acmod = { + "1", "DM", "2/0", "2/0" + }; + + /** + * + */ + private int[] channels = { + 1,2,2,2, 2,3,3,4, 4,5,6,6, 7,8,0,0, + }; + + /** + * parse aac Header + */ + public int parseHeader(byte[] frame, int pos) + { + boolean latm = false; + int aac_length = 0; + + // 0x2B7 LATM + latm = frame[pos] == 0x56 && (0xE0 & frame[pos + 1]) == 0xE0; + + if (latm) + { + aac_length = 3 + ((0x1F & frame[pos + 1])<<8 | (0xFF & frame[pos + 2])); + pos += 3; + } + + if (frame.length == 4) //pushmpa = 4! + return (latm && (0xFF & frame[pos]) == 0xFF ? aac_length : -1); + + //syncword ADTS + if ((0xFF & frame[pos]) != 0xFF && (0xE0 & frame[pos + 1]) != 0xE0) + return -1; + + //ADTS fixed + setID(1 & frame[pos + 1]>>>3); + setLayer(3 & frame[pos + 1]>>>1); + setProtectionBit(1 ^ (1 & frame[pos + 1])); + setMode(3 & frame[pos + 2]>>>6); //profile + setSamplingFrequency(frequency_index[0xF & frame[pos + 2]>>>2]); + setPrivateBit(1 & frame[pos + 2]>>>1); + setChannel(7 & frame[pos + 2]<<2 | 3 & frame[pos + 3]>>>6); //see specif. + setCopyright(1 & frame[pos + 3]>>>5); + setOriginal(1 & frame[pos + 3]>>>4); //home + setEmphasis(3 & frame[pos + 3]>>>2); + // setFrameTimeLength(169344000.0 / getSamplingFrequency()); + setFrameTimeLength(3840); + setBitrate(1000); + + //ADTS variabel + //copyright_identification_bit 1 bslbf pos+3 + //copyright_identification_start 1 bslbf pos+3 + setSizeBase((0xFF & frame[pos + 4])<<5 | (0x1F & frame[pos + 5]>>3)); //frame_length 13 bslbf + setSize(getSizeBase()); + //adts_buffer_fullness 11 bslbf + //number_of_raw_data_blocks_in_frame 2 uimsfb + + return getLayer(); + } + + /** + * parse next aac Header + */ + public int parseNextHeader(byte[] frame, int pos) + { + boolean latm = false; + int aac_length = 0; + + latm = frame[pos] == 0x56 && (0xE0 & frame[pos + 1]) == 0xE0; + + if (latm) + { + aac_length = 3 + ((0x1F & frame[pos + 1])<<8 | (0xFF & frame[pos + 2])); + pos += 3; + } + + if ((0xFF & frame[pos]) != 0xFF && (0xE0 & frame[pos + 1]) != 0xE0) + return -1; + + setNextID(1 & frame[pos + 1]>>>3); + setNextLayer(3 & frame[pos + 1]>>>1); + setNextProtectionBit(1 ^ (1 & frame[pos + 1])); + setNextMode(3 & frame[pos + 2]>>>6); //profile + setNextSamplingFrequency(frequency_index[0xF & frame[pos + 2]>>>2]); + setNextPrivateBit(1 & frame[pos + 2]>>>1); + setNextChannel(7 & frame[pos + 2]<<2 | 3 & frame[pos + 3]>>>6); //see specif. + setNextCopyright(1 & frame[pos + 3]>>>5); + setNextOriginal(1 & frame[pos + 3]>>>4); //home + setNextEmphasis(3 & frame[pos + 3]>>>2); + // setNextFrameTimeLength(169344000.0 / getNextSamplingFrequency()); + setNextFrameTimeLength(3840); + setNextBitrate(1000); + + //ADTS variabel + //copyright_identification_bit 1 bslbf pos+3 + //copyright_identification_start 1 bslbf pos+3 + setNextSizeBase((0xFF & frame[pos + 4])<<5 | (0x1F & frame[pos + 5]>>3)); //frame_length 13 bslbf + setNextSize(getNextSizeBase()); + //adts_buffer_fullness 11 bslbf + //number_of_raw_data_blocks_in_frame 2 uimsfb + + return getNextLayer(); + } + + /** + * verify current & last header + */ + public int compareHeader() + { + if (getLastID() != getID()) + return 0x1; + + else if (getLastLayer() != getLayer()) + return 0x2; + + else if (getLastSamplingFrequency() != getSamplingFrequency()) + return 0x4; + + else if (getLastBitrate() != getBitrate()) + return 0x8; + + else if (getLastMode() != getMode()) + return 0x10; + + else if (getLastModeExtension() != getModeExtension()) + return 0x20; + + else if (getLastSize() != getSize()) + return 0x40; + + else + return 0; + } + + /** + * display last aac header + */ + public String displayHeader() + { + return ("AAC, " + acmod[getLastMode()] + "(" + channels[getLastChannel()] + "), " + getLastSamplingFrequency() + "Hz, " + (getLastBitrate() / 1000.0) + "kbps, " + getLastSize() + "BpF"); + } + +} \ No newline at end of file diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatAC3.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatAC3.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatAC3.java 2006-02-02 04:30:18.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatAC3.java 2009-05-16 14:10:54.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)AudioFormatAC3.java - parse Audioheaders, ac3 * - * Copyright (c) 2003-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -31,7 +31,9 @@ package net.sourceforge.dvb.projectx.audio; -import net.sourceforge.dvb.projectx.audio.AudioFormat; +import java.util.Arrays; + +import net.sourceforge.dvb.projectx.parser.CommonParsing; public class AudioFormatAC3 extends AudioFormat { @@ -39,9 +41,11 @@ { super(); - ac3_crc_init(); + initCRCTable(); } + private int bsid = 0; + private int CRC16_POLY = 0x18005; //((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)); private int[] crc_table = new int[256]; @@ -54,11 +58,11 @@ 320000, 384000, 448000, 512000, 576000, 640000, 0,0,0,0,0,0,0,0,0,0,0,0,0 // (fix4) }; - + private int[][] ac3_size_table = { - { 128,160,192,224,256,320,384,448,512,640,768,896,1024,1280,1536,1792,2080,2304,2560 }, - { 138,174,208,242,278,348,416,486,556,696,834,974,1114,1392,1670,1950,2228,2506,2786 }, - { 192,240,288,336,384,480,576,672,768,960,1152,1344,1536,1920,2304,2688,3120,3456,3840 } + { 128,160,192,224,256,320,384,448,512,640,768,896,1024,1280,1536,1792,2048,2304,2560 }, //48khz + { 138,174,208,242,278,348,416,486,556,696,834,974,1114,1392,1670,1950,2228,2506,2786 }, //44.1khz + { 192,240,288,336,384,480,576,672,768,960,1152,1344,1536,1920,2304,2688,3120,3456,3840 } //32khz }; private String[] bsmod = { ", CM" , ", ME" , ", K:VI" , ", K:HI" , ", K:D" , ", K:C" , ", K:E" , ", K:VO" }; @@ -75,57 +79,62 @@ */ public int parseHeader(byte[] frame, int pos) { - if ( (0xFF & frame[pos]) != 0x0B || (0xFF & frame[pos + 1]) != 0x77 ) + if ( !hasAC3Syncword(frame, pos)) return -1; - ID = 0; - Emphasis = 0; - Private_bit = 0; + setID(0); + setEmphasis(0); + setPrivateBit(0); + // setProtectionBit(0 ^ 1); + setSamplingFrequency(getAC3SamplingFrequency(frame, pos)); - Protection_bit = 0 ^ 1; - - if ((Sampling_frequency = ac3_frequency_index[3 & frame[pos + 4]>>>6]) < 1) + if (getSamplingFrequency() < 1) return -4; - if ((Bitrate = ac3_bitrate_index[0x1F & frame[pos + 4]>>>1]) < 1) + setBitrate(getAC3Bitrate(frame, pos)); + + if (getBitrate() < 1) return -3; - Layer = 7 & frame[pos + 5]; //bsmod - Padding_bit = 1 & frame[pos + 4]; - Mode = 7 & frame[pos + 6]>>>5; - Mode_extension = 0; + setProtectionBit((0x1F & frame[pos + 5]>>3)); //bsid + setLayer(getAC3Bsmod(frame, pos)); //bsmod + setPaddingBit(1 & frame[pos + 4]); + setMode(getAC3Mode(frame, pos)); + setModeExtension(0); int mode = (0xFF & frame[pos + 6])<<8 | (0xFF & frame[pos + 7]); int skip=0; - if ((Mode & 1) > 0 && Mode != 1) // cmix + if ((getMode() & 1) > 0 && getMode() != 1) // cmix { - Emphasis = 1 + (3 & frame[pos + 6]>>>3); + setEmphasis(1 + (3 & frame[pos + 6]>>>3)); skip++; } - if ((Mode & 4) > 0) //surmix + if ((getMode() & 4) > 0) //surmix { - Private_bit = 1 + (3 & frame[pos + 6]>>>(skip > 0 ? 1 : 3)); + setPrivateBit(1 + (3 & frame[pos + 6]>>>(skip > 0 ? 1 : 3))); skip++; } - if (Mode == 2) + if (getMode() == 2) { - Mode_extension |= 6 & mode>>>(10 - (2 * skip)); //DS + setModeExtension(getModeExtension() | (6 & mode>>>(10 - (2 * skip)))); //DS skip++; } if (skip < 4) { - Mode_extension |= 1 & mode>>>(12 - (2 * skip)); //lfe - Original = 0x1F & mode>>>(7 - (2 * skip)); //dialnorm + setModeExtension(getModeExtension() | (1 & mode>>>(12 - (2 * skip)))); //lfe + setOriginal(0x1F & mode>>>(7 - (2 * skip))); //dialnorm } - - Channel = ac3_channels[Mode] + (1 & Mode_extension); - Copyright = 0; - Time_length = 138240000.0 / Sampling_frequency; - Size = (Size_base = ac3_size_table[3 & frame[pos + 4]>>>6][0x1F & frame[pos + 4]>>>1]) + Padding_bit * 2; + + setChannel(ac3_channels[getMode()] + (1 & getModeExtension())); + setCopyright(0); + + setFrameTimeLength(138240000.0 / getSamplingFrequency()); + setSizeBase(ac3_size_table[3 & frame[pos + 4]>>>6][0x1F & frame[pos + 4]>>>1]); + setSize(getSamplingFrequency() == ac3_frequency_index[1] ? getSizeBase() + (getPaddingBit() * 2) : getSizeBase()); return 1; } @@ -136,85 +145,141 @@ public int parseNextHeader(byte[] frame, int pos) { - if ( (0xFF & frame[pos]) != 0xB || (0xFF & frame[pos+1]) != 0x77 ) + if ( !hasAC3Syncword(frame, pos)) return -1; - nID = 0; - nEmphasis = 0; - nPrivate_bit = 0; + setNextID(0); + setNextEmphasis(0); + setNextPrivateBit(0); + // setNextProtectionBit(0 ^ 1); - nProtection_bit = 0 ^ 1; - - if ( (nSampling_frequency = ac3_frequency_index[3 & frame[pos+4]>>>6]) < 1) + setNextSamplingFrequency(getAC3SamplingFrequency(frame, pos)); + + if (getNextSamplingFrequency() < 1) return -4; - - if ( (nBitrate = ac3_bitrate_index[0x1F & frame[pos+4]>>>1]) < 1) + + setNextBitrate(getAC3Bitrate(frame, pos)); + + if (getNextBitrate() < 1) return -3; - nLayer = 7 & frame[pos+5]; //bsmod - nPadding_bit = 1 & frame[pos+4]; - - nMode = 7 & frame[pos+6]>>>5; - int mode = (0xFF & frame[pos+6])<<8 | (0xFF & frame[pos+7]); + setNextProtectionBit((0x1F & frame[pos + 5]>>3)); //bsid + setNextLayer(getAC3Bsmod(frame, pos)); //bsmod + setNextPaddingBit(1 & frame[pos + 4]); + setNextMode(getAC3Mode(frame, pos)); + setNextModeExtension(0); +// + int mode = (0xFF & frame[pos + 6])<<8 | (0xFF & frame[pos + 7]); int skip=0; - - if ( (nMode & 1) > 0 && nMode != 1) - { //cmix - nEmphasis = 1 + (3 & frame[pos+6]>>>3); + + if ((getNextMode() & 1) > 0 && getNextMode() != 1) // cmix + { + setNextEmphasis(1 + (3 & frame[pos + 6]>>>3)); skip++; } - if ( (nMode & 4) > 0) - { //surmix - nPrivate_bit = 1 + (3 & frame[pos+6]>>>(skip > 0 ? 1 : 3)); + if ((getNextMode() & 4) > 0) //surmix + { + setNextPrivateBit(1 + (3 & frame[pos + 6]>>>(skip > 0 ? 1 : 3))); skip++; } - - if ( nMode == 2 ) - { //DS mode - nMode_extension |= 6 & mode>>>(10 - (2 * skip)); //DS + + if (getNextMode() == 2) + { + setNextModeExtension(getNextModeExtension() | (6 & mode>>>(10 - (2 * skip)))); //DS skip++; } if (skip < 4) { - nMode_extension |= 1 & mode>>>(12 - (2 * skip)); //lfe - nOriginal = 0x1F & mode>>>(7 - (2 * skip)); //dialnorm + setNextModeExtension(getNextModeExtension() | (1 & mode>>>(12 - (2 * skip)))); //lfe + setNextOriginal(0x1F & mode>>>(7 - (2 * skip))); //dialnorm } - - nChannel = ac3_channels[nMode] + (1 & nMode_extension); - nCopyright = 0; - nTime_length = 138240000.0 / nSampling_frequency; - nSize = (nSize_base = ac3_size_table[3 & frame[pos+4]>>>6][5 & frame[pos+4]>>>1]) + nPadding_bit * 2; + + setNextChannel(ac3_channels[getNextMode()] + (1 & getNextModeExtension())); + setNextCopyright(0); + + setNextFrameTimeLength(138240000.0 / getNextSamplingFrequency()); + setNextSizeBase(ac3_size_table[3 & frame[pos + 4]>>>6][0x1F & frame[pos + 4]>>>1]); + setNextSize(getNextSamplingFrequency() == ac3_frequency_index[1] ? getNextSizeBase() + (getNextPaddingBit() * 2) : getNextSizeBase()); return 1; } - + + /** + * + */ + private boolean hasAC3Syncword(byte[] frame, int offs) + { + if (frame[offs] != 0x0B || frame[offs + 1] != 0x77) + return false; + + return true; + } + + /** + * + */ + private int getAC3SamplingFrequency(byte[] frame, int offs) + { + return ac3_frequency_index[3 & frame[offs + 4]>>>6]; + } + + /** + * + */ + private int getAC3Bitrate(byte[] frame, int offs) + { + return ac3_bitrate_index[0x1F & frame[offs + 4]>>>1]; + } + + /** + * + */ + private int getAC3Bsmod(byte[] frame, int offs) + { + return (7 & frame[offs + 5]); + } + + /** + * + */ + private int getAC3Mode(byte[] frame, int offs) + { + return (7 & frame[offs + 6]>>>5); + } + /** * compare current & last ac3 header */ public int compareHeader() { - if (lLayer != Layer) - return 1; + if (getLastID() != getID()) + return 0x1; - else if (lBitrate != Bitrate) - return 2; + else if (getLastLayer() != getLayer()) + return 0x2; + + else if (getLastSamplingFrequency() != getSamplingFrequency()) + return 0x4; - else if (lSampling_frequency != Sampling_frequency) - return 3; + else if (getLastBitrate() != getBitrate()) + return 0x8; - else if (lMode != Mode) - return 4; + else if (getLastMode() != getMode()) + return 0x10; - else if (lMode_extension != Mode_extension) - return 5; + else if (getLastModeExtension() != getModeExtension()) + return 0x20; - else if (lOriginal != Original) - return 6; + else if (getLastOriginal() != getOriginal()) + return 0x40; - else if (lEmphasis != Emphasis) - return 7; + else if (getLastEmphasis() != getEmphasis()) + return 0x80; + + else if (getLastProtectionBit() != getProtectionBit()) + return 0x100; else return 0; @@ -225,21 +290,140 @@ */ public String displayHeader() { - return ("AC-3" + bsmod[lLayer] + + return ("AC-3" + bsmod[getLastLayer()] + ", " + - acmod[lMode] + - lfe[1][1 & lMode_extension] + + acmod[getLastMode()] + + lfe[1][1 & getLastModeExtension()] + "(" + - ac3_channels[lMode] + - lfe[0][1 & lMode_extension] + + ac3_channels[getLastMode()] + + lfe[0][1 & getLastModeExtension()] + ")" + - ", dn -" + lOriginal + "dB" + - dsurmod[lMode_extension>>>1] + - cmixlev[lEmphasis] + - surmixlev[lPrivate_bit] + + ", bsid " + getLastProtectionBit() + + ", dn -" + getLastOriginal() + "dB" + + dsurmod[getLastModeExtension()>>>1] + + cmixlev[getLastEmphasis()] + + surmixlev[getLastPrivateBit()] + ", " + - lSampling_frequency + "Hz, " + - (lBitrate / 1000) + "kbps"); + getLastSamplingFrequency() + "Hz, " + + (getLastBitrate() / 1000) + "kbps"); + } + + /** + * + */ + public byte[] editFrame(byte[] frame, int mode) + { + switch (mode) + { + case 1: //patch only to 3/2 + setChannelFlags(frame, 7); + // computeCRC(frame, framesize); + break; + + case 2: + frame = setNewBitrate(frame); + break; + + case 3: + frame = setSilence(frame); + break; + + case 4: + frame = setBsid(frame); + break; + } + + return frame; + } + + /** + * fix to 3+2 channels, note the following bits will be dispointed and the frame is corrupted + */ + private void setChannelFlags(byte[] frame, int mode) + { + frame[6] = (byte)((0xF & frame[6]) | (mode<<5)); + } + + /** + * bitrate edit + */ + private byte[] setNewBitrate(byte[] frame) + { + int size_index_src = 0x1F & frame[4]>>>1; + int size_index = (int)(0x1FL & (CommonParsing.getAudioProcessingFlags()>>>4)); + + if (size_index_src == size_index) + return frame; + + else if (size_index_src > size_index) + { + size_index = size_index_src; + + if ((CommonParsing.getAudioProcessingFlags()>>>18) > 0) // not first frame + CommonParsing.setAudioProcessingFlags(CommonParsing.getAudioProcessingFlags() | 0xCL); //restart marker + } + + CommonParsing.setAudioProcessingFlags((~0xFF0L & CommonParsing.getAudioProcessingFlags()) | size_index<<4); //common bitrate index + + byte[] newframe = new byte[ac3_size_table[3 & frame[4]>>>6][size_index]]; + + System.arraycopy(frame, 0, newframe, 0, frame.length); + + newframe[4] &= 0xC0; //keep samplerate + newframe[4] |= (size_index<<1); //set index + + clearCRC(newframe, frame.length); + computeCRC(newframe, ac3_size_table[3 & newframe[4]>>>6][size_index]); + + return newframe; + } + + /** + * set silence + */ + private byte[] setSilence(byte[] frame) + { + byte[] newframe = new byte[frame.length]; + + System.arraycopy(frame, 0, newframe, 0, frame.length); + + int bitpos = getBSI(newframe, 0); + + if ((bitpos & 7) == 0) //byte aligned + Arrays.fill(newframe, bitpos>>>3, newframe.length, (byte) 0); + + else + { + Arrays.fill(newframe, (bitpos + 1)>>>3, newframe.length, (byte) 0); + newframe[bitpos>>>3] &= (0xFF00>>>(bitpos & 7)); + } + + clearCRC(newframe, newframe.length); + computeCRC(newframe, ac3_size_table[3 & newframe[4]>>>6][0x1F & newframe[4]>>>1]); + + return newframe; + } + + /** + * set bsid + */ + private byte[] setBsid(byte[] frame) + { + byte[] newframe = new byte[frame.length]; + + System.arraycopy(frame, 0, newframe, 0, frame.length); + + if (getLastProtectionBit() == (0x1F & newframe[5]>>3)) + return newframe; + + newframe[5] = (byte)(getLastProtectionBit()<<3 | (7 & newframe[5])); + + clearCRC(newframe, newframe.length); + computeCRC(newframe, ac3_size_table[3 & newframe[4]>>>6][0x1F & newframe[4]>>>1]); + + // net.sourceforge.dvb.projectx.common.Common.setMessage("bsid " + (0x1F & frame[5]>>3) + " /n " + (0x1F & newframe[5]>>3)); + + return newframe; } /** @@ -249,41 +433,30 @@ { // frame_size is BYTE int words = frame_size>>>1; //to word - int frame_size_58 = 2* ((words>>>1) + (words>>>3)); //frame_size_58 + int frame_size_58 = 2 * ((words>>>1) + (words>>>3)); //frame_size_58 int crc = -1; //crc1 - if ((crc = ac3_crc(frame, 2, frame_size_58, 0)) != 0) + if ((crc = determineCRC(frame, 2, frame_size_58, 0)) != 0) return 1; //crc2 - if ((crc = ac3_crc(frame, frame_size_58, frame_size, crc)) != 0) + if ((crc = determineCRC(frame, frame_size_58, frame_size, crc)) != 0) return 2; return 0; } /** - * - */ - public byte[] editFrame(byte[] frame, int framesize, int mode) - { - if (mode == 1) - { - setChannelFlags(frame); - // computeCRC(frame, framesize); - } - - return frame; - } - - /** - * 3+2 channels, note the following bits will be dispointed and the frame is corrupted + * clear crc */ - private void setChannelFlags(byte[] frame) + private void clearCRC(byte[] frame, int size) { - frame[6] = (byte)((0xF & frame[6]) | 0xE0); + frame[2] = (byte) 0; + frame[3] = (byte) 0; + frame[size - 2] = (byte) 0; + frame[size - 1] = (byte) 0; } /** @@ -291,18 +464,17 @@ */ private void computeCRC(byte[] frame, int frame_size) { - // frame_size is WORD - frame_size >>>= 1; //to word - - int frame_size_58 = (frame_size>>>1) + (frame_size>>>3); + // frame_size is BYTE + int words = frame_size>>>1; //to word + int frame_size_58 = 2 * ((words>>>1) + (words>>>3)); //frame_size_58 int crc1 = -1; int crc2 = -1; int crc_inv = -1; - crc1 = ac3_crc(frame, 4, 2 * frame_size_58, 0); + crc1 = determineCRC(frame, 4, frame_size_58, 0); - crc_inv = pow_poly((CRC16_POLY >>> 1), (16 * frame_size_58) - 16, CRC16_POLY); + crc_inv = pow_poly((CRC16_POLY >>> 1), (frame_size_58<<3) - 16, CRC16_POLY); //crc1 crc1 = mul_poly(crc_inv, crc1, CRC16_POLY); @@ -310,15 +482,15 @@ frame[3] = (byte)(0xFF & crc1); //crc2 - crc2 = ac3_crc(frame, 2 * frame_size_58, (2 * frame_size) - 2, 0); - frame[(2* frame_size) - 2] = (byte)(0xFF & (crc2 >> 8)); - frame[(2* frame_size) - 1] = (byte)(0xFF & crc2); + crc2 = determineCRC(frame, frame_size_58, (words<<1) - 2, 0); + frame[(2* words) - 2] = (byte)(0xFF & (crc2 >> 8)); + frame[(2* words) - 1] = (byte)(0xFF & crc2); } /** * ac3 crc init table */ - private void ac3_crc_init() + private void initCRCTable() { for (int n = 0, c, k; n < 256; n++) { @@ -340,11 +512,9 @@ /** * ac3 crc */ - private int ac3_crc(byte[] data, int offs, int len, int crc) + private int determineCRC(byte[] data, int offs, int len, int crc) { - int i; - - for (i = offs; i < len; i++) + for (int i = offs; i < len; i++) crc = (crc_table[(0xFF & data[i]) ^ (crc >> 8)] ^ (crc << 8)) & 0xFFFF; return crc; @@ -391,6 +561,85 @@ return r; } + + /** + * bsi , taken from Doc A/52 + */ + private int getBSI(byte[] frame, int pos) + { + //start at frame[5] + + int[] BitPos = { pos<<3 }; + int acmod = 0; + int val = 0; + + getBits(frame, BitPos, 16); //sync + getBits(frame, BitPos, 16); //crc1 + getBits(frame, BitPos, 2); //freq + getBits(frame, BitPos, 6); //size + getBits(frame, BitPos, 5); //bsi + getBits(frame, BitPos, 3); //bsmod + + acmod = getBits(frame, BitPos, 3); //acmod + if ((acmod & 1) > 0 && acmod != 1) + getBits(frame, BitPos, 2); //cmixlev // if 3 front channels + if ((acmod & 4) > 0) + getBits(frame, BitPos, 2); //surmixlev // if a surround channel exists + if (acmod == 2) + getBits(frame, BitPos, 2); //dsurmod // if in 2/0 mode + + getBits(frame, BitPos, 1); //lfeon + getBits(frame, BitPos, 5); //dialnorm + + if (getBits(frame, BitPos, 1) == 1) //compre + getBits(frame, BitPos, 8); //compr + + if (getBits(frame, BitPos, 1) == 1) //langcode + getBits(frame, BitPos, 8); //langcod + + if (getBits(frame, BitPos, 1) == 1) //audprodie + { + getBits(frame, BitPos, 5); //mixlevel + getBits(frame, BitPos, 2); //roomtyp + } + + if (acmod == 0) // if 1+1 mode (dual mono, so some items need a second value) + { + getBits(frame, BitPos, 5); //dialnorm2 + + if (getBits(frame, BitPos, 1) == 1) //compr2e + getBits(frame, BitPos, 8); //compr2 + + if (getBits(frame, BitPos, 1) == 1) //langcod2e + getBits(frame, BitPos, 8); //langcod2 + + if (getBits(frame, BitPos, 1) == 1) //audprodi2e + { + getBits(frame, BitPos, 5); //mixlevel2 + getBits(frame, BitPos, 2); //roomtyp2 + } + } + + getBits(frame, BitPos, 1); //copyrightb + getBits(frame, BitPos, 1); //origbs + + if (getBits(frame, BitPos, 1) == 1) //timecod1e + getBits(frame, BitPos, 14); //timecod1 + + if (getBits(frame, BitPos, 1) == 1) //timecod2e + getBits(frame, BitPos, 14); //timecod2 + + if (getBits(frame, BitPos, 1) == 1) //addbsie + { + val = getBits(frame, BitPos, 6); //addbsil + getBits(frame, BitPos, (val + 1) * 8); //addbsi + } + + return BitPos[0]; + } + + + /** * ac3 riff header stuff */ @@ -421,7 +670,7 @@ * riffdata from ac3 audio * awaiting a frame byte array, only the header is used */ - public int[] parseRiffData(byte[] frame) + public void parseRiffData(byte[] frame, int channel) { int[] riffdata = new int[10]; @@ -434,7 +683,150 @@ // nBlockAlign riffdata[8] = ac3const[(0xC0 & frame[4])>>>6][(0x3E & frame[4])>>>1] + (((1 & frame[4])!=0) ? 2 : 0); - return riffdata; + setExtraWaveData(riffdata, channel); + } + + /** + * part for RIFF wave header data processing + */ + + private WaveHeader WaveHeader_Ch1; + + /** + * + */ + public void initExtraWaveHeader(boolean bool_ACM, boolean bool_BWF, boolean bool_AC3) + { + WaveHeader_Ch1 = new WaveHeader(bool_AC3); + } + + /** + * + */ + public byte[] getExtraWaveHeader(int channel, boolean placeholder) + { + if (channel == 1) + return (placeholder ? WaveHeader_Ch1.getPlaceHolder() : WaveHeader_Ch1.getHeader()); + + return (new byte[0]); + } + + /** + * + */ + public void setExtraWaveData(int[] array, int channel) + { + if (channel == 1) + WaveHeader_Ch1.setWaveData(array); + } + + /** + * + */ + public void setExtraWaveLength(long filelength, long timelength, int channel) + { + if (channel == 1) + WaveHeader_Ch1.setWaveLength(filelength, timelength); + } + + /** + * + */ + private class WaveHeader { + + private byte[] riffac3 = { + 82, 73, 70, 70, 0, 0, 0, 0, 87, 65, 86, 69,102,109,116, 32, + 18, 0, 0, 0, 0, 32, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 0,100, 97,116, 97, 0, 0, 0, 0, + }; + + private long Samples = 0; + private long SampleCount = 0; + + private final int HeaderLength_AC3 = 46; + private final int AC3_WaveFormat = 1; + + private int WaveFormat; + + //init + public WaveHeader(boolean bool_AC3) + { + WaveFormat = bool_AC3 ? AC3_WaveFormat : 0; + } + + /** + * get place holder + */ + public byte[] getPlaceHolder() + { + if (WaveFormat == AC3_WaveFormat) + return (new byte[HeaderLength_AC3]); + + return (new byte[0]); + } + + /** + * get updated header + */ + public byte[] getHeader() + { + if (WaveFormat == AC3_WaveFormat) + return riffac3; + + return (new byte[0]); + } + + /** + * set wave data + */ + public void setWaveData(int[] riffdata) + { + Samples += riffdata[2]; + SampleCount++; + + int nSamplesPerSec = getValue(riffac3, 24, 4, true); + int nBlockAlign = getValue(riffac3, 32, 2, true); + + //nBlockAlign + if (nBlockAlign == 0) + setValue(riffac3, 32, 2, true, riffdata[8]); + + else if (nBlockAlign != 1 && nBlockAlign != riffdata[8]) + setValue(riffac3, 32, 2, true, 1); + + //nSamplesPerSec + if (nSamplesPerSec == 1) + setValue(riffac3, 24, 4, true, riffdata[2]); + + else if (nSamplesPerSec != 0 && nSamplesPerSec != riffdata[2]) + setValue(riffac3, 24, 4, true, 0); + + // nChannels + if ((0xFF & riffac3[22]) < riffdata[4]) + riffac3[22] = (byte) riffdata[4]; + } + + /** + * + */ + public void setWaveLength(long filelength, long timelength) + { + int lengthAC3 = (int)filelength - HeaderLength_AC3; + + for (int i = 0; i < 4; i++) + { + riffac3[4 + i] = (byte)(0xFF & (lengthAC3 + 38)>>>(i * 8)); + riffac3[42 + i] = (byte)(0xFF & lengthAC3>>>(i * 8)); + } + + if (filelength <= 100) + return; + + int time = (int)timelength; + int nAvgBytePerSecAC3 = (int)(1000L * lengthAC3 / time); + + setValue(riffac3, 28, 4, true, nAvgBytePerSecAC3); + } } } \ No newline at end of file diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatDTS.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatDTS.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatDTS.java 2005-12-17 21:08:46.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatDTS.java 2008-08-30 11:35:00.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)AudioFormatDTS.java - parse Audioheaders, dts * - * Copyright (c) 2003-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -89,33 +89,35 @@ if (frame[pos] != 0x7F || frame[pos + 1] != (byte)0xFE || frame[pos + 2] != (byte)0x80 || frame[pos + 3] != 1 ) return -1; - ID = 0; - Emphasis = 0; - Protection_bit = 0 ^ 1; + setID(0); + setEmphasis(0); + setProtectionBit(0 ^ 1); - if ((Sampling_frequency = dts_frequency_index[0xF & (frame[pos + 8]>>>2)]) < 1) + setSamplingFrequency(dts_frequency_index[0xF & (frame[pos + 8]>>>2)]); + + if (getSamplingFrequency() < 1) return -4; - Bitrate = dts_bitrate_index[((3 & frame[pos + 8])<<3) | (7 & (frame[pos + 9]>>>5))]; + setBitrate(dts_bitrate_index[((3 & frame[pos + 8])<<3) | (7 & (frame[pos + 9]>>>5))]); - if (Bitrate < 1) + if (getBitrate() < 1) return -3; - Layer = 0; - Padding_bit = 0; - Private_bit = 0; - - Mode = ((0xF & frame[pos + 7])<<2) | ((0xC0 & frame[pos + 8])>>>6); - Mode_extension = 0; - Channel = dts_channels[Mode]; - Copyright = 0; - Original = 0; - Size = ((1 & frame[pos + 4])<<6) | ((0xFC & frame[pos + 5])>>>2); - Size = (Size + 1)<<5; - Time_length = 90000.0 * Size / Sampling_frequency; - Size = ((3 & frame[pos + 5])<<12) | ((0xFF & frame[pos + 6])<<4) | ((0xF0 & frame[pos + 7])>>>4); - Size++; - Size_base = Size; + setLayer(0); + setPaddingBit(0); + setPrivateBit(0); + + setMode(((0xF & frame[pos + 7])<<2) | ((0xC0 & frame[pos + 8])>>>6)); + setModeExtension(0); + setChannel(dts_channels[getMode()]); + setCopyright(0); + setOriginal(0); + setSize(((1 & frame[pos + 4])<<6) | ((0xFC & frame[pos + 5])>>>2)); + setSize((getSize() + 1)<<5); + setFrameTimeLength(90000.0 * getSize() / getSamplingFrequency()); + setSize(((3 & frame[pos + 5])<<12) | ((0xFF & frame[pos + 6])<<4) | ((0xF0 & frame[pos + 7])>>>4)); + setSize(getSize() + 1); + setSizeBase(getSize()); return 1; } @@ -125,36 +127,38 @@ */ public int parseNextHeader(byte[] frame, int pos) { - if (frame[pos] != 0x7F || frame[pos + 1] != (byte)0xFE || frame[pos + 2] != (byte)0x80 || frame[pos + 3] != 1) + if (frame[pos] != 0x7F || frame[pos + 1] != (byte)0xFE || frame[pos + 2] != (byte)0x80 || frame[pos + 3] != 1 ) return -1; - - nID = 0; - nEmphasis = 0; - nProtection_bit = 0 ^ 1; - if ((nSampling_frequency = dts_frequency_index[0xF & (frame[pos + 8]>>>2)]) < 1) + setNextID(0); + setNextEmphasis(0); + setNextProtectionBit(0 ^ 1); + + setNextSamplingFrequency(dts_frequency_index[0xF & (frame[pos + 8]>>>2)]); + + if (getNextSamplingFrequency() < 1) return -4; - nBitrate = dts_bitrate_index[((3 & frame[pos + 8])<<3) | (7 & (frame[pos + 9]>>>5))]; + setNextBitrate(dts_bitrate_index[((3 & frame[pos + 8])<<3) | (7 & (frame[pos + 9]>>>5))]); - if (nBitrate < 1) + if (getNextBitrate() < 1) return -3; - - nLayer = 0; - nPadding_bit = 0; - nPrivate_bit = 0; - - nMode = ((0xF & frame[pos + 7])<<2) | ((0xC0 & frame[pos + 8])>>>6); - nMode_extension = 0; - nChannel = dts_channels[nMode]; - nCopyright = 0; - nOriginal = 0; - nSize = ((1 & frame[pos + 4])<<6) | ((0xFC & frame[pos + 5])>>>2); - nSize = (nSize + 1)<<5; - nTime_length = 90000.0 * nSize / nSampling_frequency; - nSize = ((3 & frame[pos + 5])<<12) | ((0xFF & frame[pos + 6])<<4) | ((0xF0 & frame[pos + 7])>>>4); - nSize++; - nSize_base = nSize; + + setNextLayer(0); + setNextPaddingBit(0); + setNextPrivateBit(0); + + setNextMode(((0xF & frame[pos + 7])<<2) | ((0xC0 & frame[pos + 8])>>>6)); + setNextModeExtension(0); + setNextChannel(dts_channels[getNextMode()]); + setNextCopyright(0); + setNextOriginal(0); + setNextSize(((1 & frame[pos + 4])<<6) | ((0xFC & frame[pos + 5])>>>2)); + setNextSize((getNextSize() + 1)<<5); + setNextFrameTimeLength(90000.0 * getNextSize() / getNextSamplingFrequency()); + setNextSize(((3 & frame[pos + 5])<<12) | ((0xFF & frame[pos + 6])<<4) | ((0xF0 & frame[pos + 7])>>>4)); + setNextSize(getNextSize() + 1); + setNextSizeBase(getNextSize()); return 1; } @@ -164,23 +168,26 @@ */ public int compareHeader() { - if (lLayer != Layer) - return 1; + if (getLastID() != getID()) + return 0x1; + + else if (getLastLayer() != getLayer()) + return 0x2; - else if (lBitrate != Bitrate) - return 2; + else if (getLastSamplingFrequency() != getSamplingFrequency()) + return 0x4; - else if (lSampling_frequency != Sampling_frequency) - return 3; + else if (getLastBitrate() != getBitrate()) + return 0x8; - else if (lMode != Mode) - return 4; + else if (getLastMode() != getMode()) + return 0x10; - else if (lMode_extension != Mode_extension) - return 5; + else if (getLastModeExtension() != getModeExtension()) + return 0x20; - else if (lSize != Size) - return 6; + else if (getLastSize() != getSize()) + return 0x40; else return 0; @@ -191,7 +198,7 @@ */ public String displayHeader() { - return ("DTS, " + dts_acmod[lMode] + "(" + dts_channels[lMode] + "), " + lSampling_frequency + "Hz, " + (lBitrate / 1000.0) + "kbps, " + lSize + "BpF"); + return ("DTS, " + dts_acmod[getLastMode()] + "(" + dts_channels[getLastMode()] + "), " + getLastSamplingFrequency() + "Hz, " + (getLastBitrate() / 1000.0) + "kbps, " + getLastSize() + "BpF"); } //ROne18122003 diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormat.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormat.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormat.java 2005-12-29 17:29:40.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormat.java 2009-12-29 20:50:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)AudioFormat.java - parse Audioheaders, basic class * - * Copyright (c) 2003-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -29,259 +29,1095 @@ package net.sourceforge.dvb.projectx.audio; -import java.io.File; import java.io.RandomAccessFile; import java.io.IOException; import net.sourceforge.dvb.projectx.parser.CommonParsing; import net.sourceforge.dvb.projectx.common.Common; -import net.sourceforge.dvb.projectx.audio.AudioFormatDTS; -import net.sourceforge.dvb.projectx.audio.AudioFormatAC3; -import net.sourceforge.dvb.projectx.audio.AudioFormatLPCM; -import net.sourceforge.dvb.projectx.audio.AudioFormatWAV; -import net.sourceforge.dvb.projectx.audio.AudioFormatMPA; +public class AudioFormat extends Object { + + private AudioFormat impl = null; + + /** + * + */ + public AudioFormat(int type) + { + setNewType(type); + } + + /** + * + */ + public AudioFormat(byte[] frame) + { + //unused, meant for autodetection + } + + /** + * + */ + public AudioFormat() + { + init(); + } + + /** + * + */ + public void setNewType(int type) + { + switch (type) + { + case CommonParsing.DTS_AUDIO: + impl = new AudioFormatDTS(); + break; + + case CommonParsing.AC3_AUDIO: + impl = new AudioFormatAC3(); + break; + + case CommonParsing.LPCM_AUDIO: + impl = new AudioFormatLPCM(); + break; + + case CommonParsing.WAV_AUDIO: + impl = new AudioFormatWAV(); + break; + + case CommonParsing.MPEG_AUDIO: + impl = new AudioFormatMPA(); + break; + + case CommonParsing.AAC_AUDIO: + impl = new AudioFormatAAC();// + break; + } + } + + private boolean INTEL; + + private int ID; + private int Layer; + private int Protection_bit; + private int Private_bit; + private int Bitrate; + private int Sampling_frequency; + private int Padding_bit; + private int Mode; + private int Mode_extension; + private int Copyright; + private int Original; + private int Channel; + private int Emphasis; + private int Size; + private int Size_base; + private double Time_length; + + private int nID; + private int nLayer; + private int nProtection_bit; + private int nPrivate_bit; + private int nBitrate; + private int nSampling_frequency; + private int nPadding_bit; + private int nMode; + private int nMode_extension; + private int nCopyright; + private int nOriginal; + private int nChannel; + private int nEmphasis; + private int nSize; + private int nSize_base; + private double nTime_length; + + private int lID; + private int lLayer; + private int lProtection_bit; + private int lPrivate_bit; + private int lBitrate; + private int lSampling_frequency; + private int lPadding_bit; + private int lMode; + private int lMode_extension; + private int lCopyright; + private int lOriginal; + private int lChannel; + private int lEmphasis; + private int lSize; + private int lSize_base; + private double lTime_length; + + /** + * + */ + public void init() + { + setINTEL(false); + + setID(0); + setLayer(0); + setProtectionBit(0); + setPrivateBit(0); + setBitrate(0); + setSamplingFrequency(0); + setPaddingBit(0); + setPrivateBit(0); + setMode(0); + setModeExtension(0); + setCopyright(0); + setOriginal(0); + setChannel(0); + setEmphasis(0); + setSize(0); + setSizeBase(0); + setFrameTimeLength(0.0); + } + + + /** + * + */ + public boolean isINTEL() + { + return (impl == null ? INTEL : impl.isINTEL()); + } + + /** + * + */ + public void setINTEL(boolean b) + { + if (impl != null) + impl.setINTEL(b); + + INTEL = b; + } + + /** + * + */ + public int getID() + { + return (impl == null ? ID : impl.getID()); + } + + /** + * + */ + public void setID(int val) + { + if (impl != null) + impl.setID(val); + + ID = val; + } + + /** + * + */ + public int getLayer() + { + return (impl == null ? Layer : impl.getLayer()); + } + + /** + * + */ + public void setLayer(int val) + { + if (impl != null) + impl.setLayer(val); + + Layer = val; + } + + /** + * + */ + public int getBitrate() + { + return (impl == null ? Bitrate : impl.getBitrate()); + } + + /** + * + */ + public void setBitrate(int val) + { + if (impl != null) + impl.setBitrate(val); + + Bitrate = val; + } + + /** + * + */ + public int getSamplingFrequency() + { + return (impl == null ? Sampling_frequency : impl.getSamplingFrequency()); + } + + /** + * + */ + public void setSamplingFrequency(int val) + { + if (impl != null) + impl.setSamplingFrequency(val); + + Sampling_frequency = val; + } + + /** + * + */ + public int getMode() + { + return (impl == null ? Mode : impl.getMode()); + } + + /** + * + */ + public void setMode(int val) + { + if (impl != null) + impl.setMode(val); + + Mode = val; + } + + /** + * + */ + public int getModeExtension() + { + return (impl == null ? Mode_extension : impl.getModeExtension()); + } + + /** + * + */ + public void setModeExtension(int val) + { + if (impl != null) + impl.setModeExtension(val); + + Mode_extension = val; + } + + /** + * + */ + public int getEmphasis() + { + return (impl == null ? Emphasis : impl.getEmphasis()); + } + + /** + * + */ + public void setEmphasis(int val) + { + if (impl != null) + impl.setEmphasis(val); + + Emphasis = val; + } + + /** + * + */ + public int getSize() + { + return (impl == null ? Size : impl.getSize()); + } + + /** + * + */ + public void setSize(int val) + { + if (impl != null) + impl.setSize(val); + + Size = val; + } + + /** + * + */ + public int getSizeBase() + { + return (impl == null ? Size_base : impl.getSizeBase()); + } + + /** + * + */ + public void setSizeBase(int val) + { + if (impl != null) + setSizeBase(val); + + Size_base = val; + } + + /** + * + */ + public int getChannel() + { + return (impl == null ? Channel : impl.getChannel()); + } + + /** + * + */ + public void setChannel(int val) + { + if (impl != null) + impl.setChannel(val); + + Channel = val; + } + + /** + * + */ + public int getPaddingBit() + { + return (impl == null ? Padding_bit : impl.getPaddingBit()); + } + + /** + * + */ + public void setPaddingBit(int val) + { + if (impl != null) + impl.setPaddingBit(val); + + Padding_bit = val; + } + + /** + * + */ + public int getPrivateBit() + { + return (impl == null ? Private_bit : impl.getPrivateBit()); + } + + /** + * + */ + public void setPrivateBit(int val) + { + if (impl != null) + impl.setPrivateBit(val); + + Private_bit = val; + } + + /** + * + */ + public int getOriginal() + { + return (impl == null ? Original : impl.getOriginal()); + } + + /** + * + */ + public void setOriginal(int val) + { + if (impl != null) + impl.setOriginal(val); + + Original = val; + } + + /** + * + */ + public int getCopyright() + { + return (impl == null ? Copyright : impl.getCopyright()); + } + + /** + * + */ + public void setCopyright(int val) + { + if (impl != null) + impl.setCopyright(val); + + Copyright = val; + } + + /** + * + */ + public int getProtectionBit() + { + return (impl == null ? Protection_bit : impl.getProtectionBit()); + } + + /** + * + */ + public void setProtectionBit(int val) + { + if (impl != null) + impl.setProtectionBit(val); + + Protection_bit = val; + } + + /** + * + */ + public double getFrameTimeLength() + { + return (impl == null ? Time_length : impl.getFrameTimeLength()); + } + + /** + * + */ + public void setFrameTimeLength(double val) + { + if (impl != null) + impl.setFrameTimeLength(val); + + Time_length = val; + } + +/////// + + /** + * + */ + public int getLastID() + { + return (impl == null ? lID : impl.getLastID()); + } + + /** + * + */ + public void setLastID(int val) + { + if (impl != null) + impl.setLastID(val); + + lID = val; + } + + /** + * + */ + public int getLastLayer() + { + return (impl == null ? lLayer : impl.getLastLayer()); + } + + /** + * + */ + public void setLastLayer(int val) + { + if (impl != null) + impl.setLastLayer(val); + + lLayer = val; + } + + /** + * + */ + public int getLastBitrate() + { + return (impl == null ? lBitrate : impl.getLastBitrate()); + } + + /** + * + */ + public void setLastBitrate(int val) + { + if (impl != null) + impl.setLastBitrate(val); + + lBitrate = val; + } + + /** + * + */ + public int getLastSamplingFrequency() + { + return (impl == null ? lSampling_frequency : impl.getLastSamplingFrequency()); + } + + /** + * + */ + public void setLastSamplingFrequency(int val) + { + if (impl != null) + impl.setLastSamplingFrequency(val); + + lSampling_frequency = val; + } + + /** + * + */ + public int getLastMode() + { + return (impl == null ? lMode : impl.getLastMode()); + } + + /** + * + */ + public void setLastMode(int val) + { + if (impl != null) + impl.setLastMode(val); + + lMode = val; + } + + /** + * + */ + public int getLastModeExtension() + { + return (impl == null ? lMode_extension : impl.getLastModeExtension()); + } + + /** + * + */ + public void setLastModeExtension(int val) + { + if (impl != null) + impl.setLastModeExtension(val); + + lMode_extension = val; + } + + /** + * + */ + public int getLastEmphasis() + { + return (impl == null ? lEmphasis : impl.getLastEmphasis()); + } + + /** + * + */ + public void setLastEmphasis(int val) + { + if (impl != null) + impl.setLastEmphasis(val); + + lEmphasis = val; + } + + /** + * + */ + public int getLastSize() + { + return (impl == null ? lSize : impl.getLastSize()); + } + + /** + * + */ + public void setLastSize(int val) + { + if (impl != null) + impl.setLastSize(val); + + lSize = val; + } + + /** + * + */ + public int getLastSizeBase() + { + return (impl == null ? lSize_base : impl.getLastSizeBase()); + } + + /** + * + */ + public void setLastSizeBase(int val) + { + if (impl != null) + impl.setLastSizeBase(val); + + lSize_base = val; + } + + /** + * + */ + public int getLastChannel() + { + return (impl == null ? lChannel : impl.getLastChannel()); + } + + /** + * + */ + public void setLastChannel(int val) + { + if (impl != null) + impl.setLastChannel(val); + + lChannel = val; + } + + /** + * + */ + public int getLastPaddingBit() + { + return (impl == null ? lPadding_bit : impl.getLastPaddingBit()); + } + + /** + * + */ + public void setLastPaddingBit(int val) + { + if (impl != null) + impl.setLastPaddingBit(val); + + lPadding_bit = val; + } + + /** + * + */ + public int getLastPrivateBit() + { + return (impl == null ? lPrivate_bit : impl.getLastPrivateBit()); + } + + /** + * + */ + public void setLastPrivateBit(int val) + { + if (impl != null) + impl.setLastPrivateBit(val); + + lPrivate_bit = val; + } + + /** + * + */ + public int getLastOriginal() + { + return (impl == null ? lOriginal : impl.getLastOriginal()); + } + + /** + * + */ + public void setLastOriginal(int val) + { + if (impl != null) + impl.setLastOriginal(val); + + lOriginal = val; + } + + /** + * + */ + public int getLastCopyright() + { + return (impl == null ? lCopyright : impl.getLastCopyright()); + } + + /** + * + */ + public void setLastCopyright(int val) + { + if (impl != null) + impl.setLastCopyright(val); + + lCopyright = val; + } + + /** + * + */ + public int getLastProtectionBit() + { + return (impl == null ? lProtection_bit : impl.getLastProtectionBit()); + } -public class AudioFormat extends Object { + /** + * + */ + public void setLastProtectionBit(int val) + { + if (impl != null) + impl.setLastProtectionBit(val); - private AudioFormat impl = null; + lProtection_bit = val; + } /** - * + * */ - public AudioFormat(int type) + public double getLastFrameTimeLength() { - setNewType(type); + return (impl == null ? lTime_length : impl.getLastFrameTimeLength()); } /** - * + * */ - public AudioFormat(byte[] frame) + public void setLastFrameTimeLength(double val) { - //unused, meant for autodetection + if (impl != null) + impl.setLastFrameTimeLength(val); + + lTime_length = val; } +/////// + + /** - * + * */ - public AudioFormat() + public int getNextID() { - init(); + return (impl == null ? nID : impl.getNextID()); } /** - * + * */ - public void setNewType(int type) + public void setNextID(int val) { - switch (type) - { - case CommonParsing.DTS_AUDIO: - impl = new AudioFormatDTS(); - break; + if (impl != null) + impl.setNextID(val); - case CommonParsing.AC3_AUDIO: - impl = new AudioFormatAC3(); - break; + nID = val; + } - case CommonParsing.LPCM_AUDIO: - impl = new AudioFormatLPCM(); - break; + /** + * + */ + public int getNextLayer() + { + return (impl == null ? nLayer : impl.getNextLayer()); + } - case CommonParsing.WAV_AUDIO: - impl = new AudioFormatWAV(); - break; + /** + * + */ + public void setNextLayer(int val) + { + if (impl != null) + impl.setNextLayer(val); - case CommonParsing.MPEG_AUDIO: - impl = new AudioFormatMPA(); - break; - } + nLayer = val; + } + + /** + * + */ + public int getNextBitrate() + { + return (impl == null ? nBitrate : impl.getNextBitrate()); } - public static boolean INTEL; + /** + * + */ + public void setNextBitrate(int val) + { + if (impl != null) + impl.setNextBitrate(val); - public static int ID; - public static int Layer; - public static int Protection_bit; - public static int Private_bit; - public static int Bitrate; - public static int Sampling_frequency; - public static int Padding_bit; - public static int public_bit; - public static int Mode; - public static int Mode_extension; - public static int Copyright; - public static int Original; - public static int Channel; - public static int Emphasis; - public static int Size; - public static int Size_base; - public static int Bound; - public static int Sblimit; - public static double Time_length; - - public int nID; - public int nLayer; - public int nProtection_bit; - public int nPrivate_bit; - public int nBitrate; - public int nSampling_frequency; - public int nPadding_bit; - public int npublic_bit; - public int nMode; - public int nMode_extension; - public int nCopyright; - public int nOriginal; - public int nChannel; - public int nEmphasis; - public int nSize; - public int nSize_base; - public double nTime_length; - - public static int lID; - public static int lLayer; - public static int lProtection_bit; - public static int lPrivate_bit; - public static int lBitrate; - public static int lSampling_frequency; - public static int lPadding_bit; - public static int lpublic_bit; - public static int lMode; - public static int lMode_extension; - public static int lCopyright; - public static int lOriginal; - public static int lChannel; - public static int lEmphasis; - public static int lSize; - public static int lSize_base; - public static double lTime_length; + nBitrate = val; + } /** - * + * */ - public void init() + public int getNextSamplingFrequency() + { + return (impl == null ? nSampling_frequency : impl.getNextSamplingFrequency()); + } + + /** + * + */ + public void setNextSamplingFrequency(int val) { - INTEL = false; + if (impl != null) + impl.setNextSamplingFrequency(val); - ID = 0; - Layer = 0; - Protection_bit = 0; - Private_bit = 0; - Bitrate = 0; - Sampling_frequency = 0; - Padding_bit = 0; - Private_bit = 0; - Mode = 0; - Mode_extension = 0; - Copyright = 0; - Original = 0; - Channel = 0; - Emphasis = 0; - Size = 0; - Size_base = 0; - Bound = 0; - Sblimit = 32; - Time_length = 0.0; + nSampling_frequency = val; } /** * */ - public int getLastModeExtension() + public int getNextMode() { - return lMode_extension; + return (impl == null ? nMode : impl.getNextMode()); } /** * */ - public int getID() + public void setNextMode(int val) { - return ID; + if (impl != null) + impl.setNextMode(val); + + nMode = val; } /** * */ - public int getLayer() + public int getNextModeExtension() { - return Layer; + return (impl == null ? nMode_extension : impl.getNextModeExtension()); } /** * */ - public int getBitrate() + public void setNextModeExtension(int val) { - return Bitrate; + if (impl != null) + impl.setNextModeExtension(val); + + nMode_extension = val; } /** * */ - public int getSamplingFrequency() + public int getNextEmphasis() { - return Sampling_frequency; + return (impl == null ? nEmphasis : impl.getNextEmphasis()); } /** * */ - public int getMode() + public void setNextEmphasis(int val) + { + if (impl != null) + impl.setNextEmphasis(val); + + nEmphasis = val; + } + + /** + * + */ + public int getNextSize() { - return Mode; + return (impl == null ? nSize : impl.getNextSize()); } /** * */ - public int getModeExtension() + public void setNextSize(int val) { - return Mode_extension; + if (impl != null) + impl.setNextSize(val); + + nSize = val; } /** * */ - public int getEmphasis() + public int getNextSizeBase() { - return Emphasis; + return (impl == null ? nSize_base : impl.getNextSizeBase()); } /** * */ - public int getSize() + public void setNextSizeBase(int val) { - return Size; + if (impl != null) + impl.setNextSizeBase(val); + + nSize_base = val; } /** * */ - public int getSizeBase() + public int getNextChannel() { - return Size_base; + return (impl == null ? nChannel : impl.getNextChannel()); } /** * */ - public int getChannel() + public void setNextChannel(int val) { - return Channel; + if (impl != null) + impl.setNextChannel(val); + + nChannel = val; } /** * */ - public double getFrameTimeLength() + public int getNextPaddingBit() + { + return (impl == null ? nPadding_bit : impl.getNextPaddingBit()); + } + + /** + * + */ + public void setNextPaddingBit(int val) + { + if (impl != null) + impl.setNextPaddingBit(val); + + nPadding_bit = val; + } + + /** + * + */ + public int getNextPrivateBit() + { + return (impl == null ? nPrivate_bit : impl.getNextPrivateBit()); + } + + /** + * + */ + public void setNextPrivateBit(int val) + { + if (impl != null) + impl.setNextPrivateBit(val); + + nPrivate_bit = val; + } + + /** + * + */ + public int getNextOriginal() + { + return (impl == null ? nOriginal : impl.getNextOriginal()); + } + + /** + * + */ + public void setNextOriginal(int val) + { + if (impl != null) + impl.setNextOriginal(val); + + nOriginal = val; + } + + /** + * + */ + public int getNextCopyright() + { + return (impl == null ? nCopyright : impl.getNextCopyright()); + } + + /** + * + */ + public void setNextCopyright(int val) + { + if (impl != null) + impl.setNextCopyright(val); + + nCopyright = val; + } + + /** + * + */ + public int getNextProtectionBit() + { + return (impl == null ? nProtection_bit : impl.getNextProtectionBit()); + } + + /** + * + */ + public void setNextProtectionBit(int val) + { + if (impl != null) + impl.setNextProtectionBit(val); + + nProtection_bit = val; + } + + /** + * + */ + public double getNextFrameTimeLength() + { + return (impl == null ? nTime_length : impl.getNextFrameTimeLength()); + } + + /** + * + */ + public void setNextFrameTimeLength(double val) { - return Time_length; + if (impl != null) + impl.setNextFrameTimeLength(val); + + nTime_length = val; } + + + +////// + /** * */ @@ -320,23 +1156,23 @@ */ public void saveHeader() { - lID = ID; - lLayer = Layer; - lProtection_bit = Protection_bit; - lPrivate_bit = Private_bit; - lBitrate = Bitrate; - lSampling_frequency = Sampling_frequency; - lPadding_bit = Padding_bit; - lPrivate_bit = Private_bit; - lMode = Mode; - lMode_extension = Mode_extension; - lCopyright = Copyright; - lOriginal = Original; - lChannel = Channel; - lEmphasis = Emphasis; - lSize = Size; - lSize_base = Size_base; - lTime_length = Time_length; + setLastID(getID()); + setLastLayer(getLayer()); + setLastProtectionBit(getProtectionBit()); + setLastPrivateBit(getPrivateBit()); + setLastBitrate(getBitrate()); + setLastSamplingFrequency(getSamplingFrequency()); + setLastPaddingBit(getPaddingBit()); + setLastPrivateBit(getPrivateBit()); + setLastMode(getMode()); + setLastModeExtension(getModeExtension()); + setLastCopyright(getCopyright()); + setLastOriginal(getOriginal()); + setLastChannel(getChannel()); + setLastEmphasis(getEmphasis()); + setLastSize(getSize()); + setLastSizeBase(getSizeBase()); + setLastFrameTimeLength(getFrameTimeLength()); } /** @@ -368,18 +1204,30 @@ /** * */ - public byte[] editFrame(byte[] frame, int framesize, int mode) + public byte[] editFrame(byte[] frame, int mode) { - return (impl == null ? frame : impl.editFrame(frame, framesize, mode)); + return (impl == null ? frame : impl.editFrame(frame, mode)); } /** * */ - public void removeCRC(byte[] frame) + public byte[][] convertFrame(byte[] frame, int mode) + { + if (impl == null) + return (new byte[][]{ frame, new byte[0] }); + + return impl.convertFrame(frame, mode); +// return (impl == null ? frame : impl.convertFrame(frame, mode)); + } + + /** + * + */ + public void removeCRC(byte[] frame, boolean remove) { if (impl != null) - impl.removeCRC(frame); + impl.removeCRC(frame, remove); } /** @@ -402,18 +1250,53 @@ /** * */ - public void decodeAncillaryData(byte[] frame) + public String decodeAncillaryData(byte[] frame, double frametime) + { + return (impl == null ? null : impl.decodeAncillaryData(frame, frametime)); + } + + /** + * + */ + public void parseRiffData(byte[] frame, int channel) + { + if (impl != null) + impl.parseRiffData(frame, channel); + } + + /** + * + */ + public void initExtraWaveHeader(boolean bool_ACM, boolean bool_BWF, boolean bool_AC3) + { + if (impl != null) + impl.initExtraWaveHeader(bool_ACM, bool_BWF, bool_AC3); + } + + /** + * + */ + public byte[] getExtraWaveHeader(int channel, boolean placeholder) + { + return (impl == null ? (new byte[0]) : impl.getExtraWaveHeader(channel, placeholder)); + } + + /** + * + */ + public void setExtraWaveData(int[] array, int channel) { if (impl != null) - impl.decodeAncillaryData(frame); + impl.setExtraWaveData(array, channel); } /** * */ - public int[] parseRiffData(byte[] frame) + public void setExtraWaveLength(long filelength, long timelength, int channel) { - return (impl == null ? null : impl.parseRiffData( frame)); + if (impl != null) + impl.setExtraWaveLength(filelength, timelength, channel); } /** @@ -481,7 +1364,7 @@ riff.seek(3); - if (!INTEL) + if (!isINTEL()) riff.write((byte)'X'); riff.seek(4); @@ -523,13 +1406,33 @@ return value; } - + + /** + * + */ + public int getValue(byte[] data, int offset, int len, boolean reverse) + { + return littleEndian(data, offset, len, reverse); + } + + /** + * + */ + public void setValue(byte[] array, int offset, int len, boolean bytereordering, int value) + { + for (int i = 0; bytereordering && i < len; i++) + array[i + offset] = (byte)(0xFF & (value>>>(i * 8))); + + for (int i = 0, j = len - 1; !bytereordering && i < len; i++, j--) + array[i + offset] = (byte)(0xFF & (value>>>(j * 8))); + } + /** * */ public int littleEndian(int data, int len) { - return littleEndian(data, len, INTEL); + return littleEndian(data, len, isINTEL()); } /** @@ -547,4 +1450,25 @@ return ( (0xFF & data>>>8) | (0xFF & data)<<8 ); } + /** + * + */ + public int getBits(byte buf[], int BitPos[], int N) + { + int Pos, Val; + + Pos = BitPos[0]>>>3; + + Val = (0xFF & buf[Pos])<<24 | + (0xFF & buf[Pos+1])<<16 | + (0xFF & buf[Pos+2])<<8 | + (0xFF & buf[Pos+3]); + + Val <<= BitPos[0] & 7; + Val >>>= 32-N; + BitPos[0] += N; + + return Val; + } + } \ No newline at end of file diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatLPCM.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatLPCM.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatLPCM.java 2005-12-17 21:08:58.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatLPCM.java 2008-08-30 11:35:20.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)AudioFormatLPCM.java - parse Audioheaders, lpcm * - * Copyright (c) 2003-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -47,30 +47,30 @@ */ public int parseHeader(byte[] frame_header, int pos) { - INTEL=true; // force intel/wav output + setINTEL(true); // force intel/wav output - ID = 0xFF & frame_header[pos]; // no of frameheaders - Padding_bit = (0xFF & frame_header[pos + 1])<<8 | (0xFF & frame_header[pos + 2]); // first_access_unit_pointer - Layer = 0xFF & frame_header[pos + 3]; // audio_frame_number - - Protection_bit = 0^1; - Private_bit = 0; - Copyright = 0; - Original = 0; - Size_base = 0; - - Size = lpcm_bps_index[(3 & frame_header[pos + 4]>>>6)]; //bits per sample - Sampling_frequency = lpcm_frequency_index[(1 & frame_header[pos + 4]>>>4)]; // samplerate - Channel = 1 + (7 & frame_header[pos + 4]); // channels - Emphasis = 0xFF & frame_header[pos + 5]; // dynamic_range - Mode = (Channel * Size) / 8; // block_align, bytes per sample + setID(0xFF & frame_header[pos]); // no of frameheaders + setPaddingBit((0xFF & frame_header[pos + 1])<<8 | (0xFF & frame_header[pos + 2])); // first_access_unit_pointer + setLayer(0xFF & frame_header[pos + 3]); // audio_frame_number + + setProtectionBit(0^1); + setPrivateBit(0); + setCopyright(0); + setOriginal(0); + setSizeBase(0); + + setSize(lpcm_bps_index[(3 & frame_header[pos + 4]>>>6)]); //bits per sample + setSamplingFrequency(lpcm_frequency_index[(1 & frame_header[pos + 4]>>>4)]); // samplerate + setChannel(1 + (7 & frame_header[pos + 4])); // channels + setEmphasis(0xFF & frame_header[pos + 5]); // dynamic_range + setMode((getChannel() * getSize()) / 8); // block_align, bytes per sample - Bitrate = Channel * Sampling_frequency * Size; // bitrate per second + setBitrate(getChannel() * getSamplingFrequency() * getSize()); // bitrate per second - if (Size < 1) + if (getSize() < 1) return -1; - Time_length = 90000.0 / Sampling_frequency; // 1 frame = 150 * timelength + setFrameTimeLength(90000.0 / getSamplingFrequency()); // 1 frame = 150 * timelength return 0; } @@ -80,30 +80,30 @@ */ public int parseNextHeader(byte[] frame_header, int pos) { - INTEL=true; // force intel/wav output + setINTEL(true); // force intel/wav output - nID = 0xFF & frame_header[pos]; // no of frameheaders - nPadding_bit = (0xFF & frame_header[pos + 1])<<8 | (0xFF & frame_header[pos + 2]); // first_access_unit_pointer - nLayer = 0xFF & frame_header[pos + 3]; // audio_frame_number - - nProtection_bit = 0^1; - nPrivate_bit = 0; - nCopyright = 0; - nOriginal = 0; - nSize_base = 0; - - nSize = lpcm_bps_index[(3 & frame_header[pos + 4]>>>6)]; //bits per sample - nSampling_frequency = lpcm_frequency_index[(1 & frame_header[pos + 4]>>>4)]; // samplerate - nChannel = 1 + (7 & frame_header[pos + 4]); // channels - nEmphasis = 0xFF & frame_header[pos + 5]; // dynamic_range - nMode = (nChannel * nSize) / 8; // block_align, bytes per sample + setNextID(0xFF & frame_header[pos]); // no of frameheaders + setNextPaddingBit((0xFF & frame_header[pos + 1])<<8 | (0xFF & frame_header[pos + 2])); // first_access_unit_pointer + setNextLayer(0xFF & frame_header[pos + 3]); // audio_frame_number + + setNextProtectionBit(0^1); + setNextPrivateBit(0); + setNextCopyright(0); + setNextOriginal(0); + setNextSizeBase(0); + + setNextSize(lpcm_bps_index[(3 & frame_header[pos + 4]>>>6)]); //bits per sample + setNextSamplingFrequency(lpcm_frequency_index[(1 & frame_header[pos + 4]>>>4)]); // samplerate + setNextChannel(1 + (7 & frame_header[pos + 4])); // channels + setNextEmphasis(0xFF & frame_header[pos + 5]); // dynamic_range + setNextMode((getNextChannel() * getNextSize()) / 8); // block_align, bytes per sample - nBitrate = nChannel * nSampling_frequency * nSize; // bitrate per second + setNextBitrate(getNextChannel() * getNextSamplingFrequency() * getNextSize()); // bitrate per second - if (nSize < 1) + if (getNextSize() < 1) return -1; - nTime_length = 90000.0 / nSampling_frequency; // 1 frame = 150 * timelength + setNextFrameTimeLength(90000.0 / getNextSamplingFrequency()); // 1 frame = 150 * timelength return 0; } @@ -113,7 +113,7 @@ */ public String displayHeader() { - return ("LPCM, DR-" + lEmphasis + ", " + lChannel + "-ch, " + lSampling_frequency + "Hz, " + lSize + "bit, " + (lBitrate / 1000.0) + "kbps"); + return ("LPCM, DR-" + getLastEmphasis() + ", " + getLastChannel() + "-ch, " + getLastSamplingFrequency() + "Hz, " + getLastSize() + "bit, " + (getLastBitrate() / 1000.0) + "kbps"); } /** @@ -121,16 +121,16 @@ */ public int compareHeader() { - if (lChannel != Channel) + if (getLastChannel() != getChannel()) return 1; - else if (lSampling_frequency != Sampling_frequency) + else if (getLastSamplingFrequency() != getSamplingFrequency()) return 2; - else if (lSize != Size) + else if (getLastSize() != getSize()) return 3; - else if (lEmphasis != Emphasis) + else if (getLastEmphasis() != getEmphasis()) return 4; else diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatMPA.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatMPA.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatMPA.java 2006-03-19 17:52:44.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatMPA.java 2009-02-21 13:40:08.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)AudioFormatMPA.java - parse Audioheaders, mpa, incl. RDS * - * Copyright (c) 2003-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -33,25 +33,32 @@ import java.util.ArrayList; import java.io.IOException; -import java.io.RandomAccessFile; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.BufferedOutputStream; -import net.sourceforge.dvb.projectx.audio.MpaDecoder; import net.sourceforge.dvb.projectx.common.Common; -import net.sourceforge.dvb.projectx.audio.AudioFormat; + public class AudioFormatMPA extends AudioFormat { private String instanced_time = ""; + private MpaConverter MPAConverter; + public AudioFormatMPA() { super(); + instanced_time = String.valueOf(System.currentTimeMillis()); + + initCRCTable(); } + private int CRC16_POLY = 0x18005; //((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)); + + private int[] crc_table = new int[256]; + private int[][][] bitrate_index = {{ {-1,8000,16000,24000,32000,40000,48000,56000,64000, 80000,96000,112000,128000,144000,160000,0 }, //MPG-2, L3 @@ -88,7 +95,9 @@ private String[] dCRC = { "noCRC", "CRC" }; private String[] dMode = { "stereo", "jstereo", "dual", "mono" }; - + private int Bound = 0; + private int Sblimit = 32; + /** * parse mpa Header */ @@ -99,60 +108,66 @@ if ( (0xFF & frame[pos]) != 0xFF || (0xF0 & frame[pos + 1]) != 0xF0 ) return -1; - ID = 1 & frame[pos + 1]>>>3; - Emphasis = 3 & frame[pos + 3]; - - if (ID == 1 && Emphasis == 2) - ID = 2; + setID(1 & frame[pos + 1]>>>3); + setEmphasis(3 & frame[pos + 3]); - if ( (Layer = 3 & frame[pos + 1]>>>1) < 1) + if (getID() == 1 && getEmphasis() == 2) + setID(2); + + setLayer(3 & frame[pos + 1]>>>1); + + if (getLayer() < 1) return -2; - Protection_bit = (1 & frame[pos + 1]) ^ 1; + setProtectionBit((1 & frame[pos + 1]) ^ 1); - if ( (Bitrate = bitrate_index[ID][Layer - 1][0xF & frame[pos + 2]>>>4]) < 1) + setBitrate(bitrate_index[getID()][getLayer() - 1][0xF & frame[pos + 2]>>>4]); + + if (getBitrate() < 1) return -3; - if ( (Sampling_frequency = frequency_index[ID][3 & frame[pos + 2]>>>2]) == 0) + setSamplingFrequency(frequency_index[getID()][3 & frame[pos + 2]>>>2]); + + if (getSamplingFrequency() == 0) return -4; - Padding_bit = 1 & frame[pos + 2]>>>1; - Private_bit = 1 & frame[pos + 2]; + setPaddingBit(1 & (frame[pos + 2]>>>1)); + setPrivateBit(1 & frame[pos + 2]); - Mode = 3 & frame[pos + 3]>>>6; - Mode_extension = 3 & frame[pos + 3]>>>4; + setMode(3 & frame[pos + 3]>>>6); + setModeExtension(3 & frame[pos + 3]>>>4); - if (Mode == 0) - Mode_extension = 0; - - Bound = Mode == 1 ? ((Mode_extension + 1) << 2) : sblimit; - Channel = Mode == 3 ? 1 : 2; - Copyright = 1 & frame[pos + 3]>>>3; - Original = 1 & frame[pos + 3]>>>2; - Time_length = time_index[Layer] / Sampling_frequency; + if (getMode() == 0) + setModeExtension(0); - if (ID == 1 && Layer == 2) // MPEG-1, L2 restrictions + Bound = getMode() == 1 ? ((getModeExtension() + 1) << 2) : sblimit; + setChannel(getMode() == 3 ? 1 : 2); + setCopyright(1 & frame[pos + 3]>>>3); + setOriginal(1 & frame[pos + 3]>>>2); + setFrameTimeLength(time_index[getLayer()] / getSamplingFrequency()); + + if (getID() == 1 && getLayer() == 2) // MPEG-1, L2 restrictions { - if (Bitrate / Channel < 32000) + if (getBitrate() / getChannel() < 32000) return -5; /* unsupported bitrate */ - if (Bitrate / Channel > 192000) + if (getBitrate() / getChannel() > 192000) return -6; /* unsupported bitrate */ - if (Bitrate / Channel < 56000) + if (getBitrate() / getChannel() < 56000) { - if(Sampling_frequency == 32000) + if(getSamplingFrequency() == 32000) Sblimit = 12; else Sblimit = 8; } - else if (Bitrate / Channel < 96000) + else if (getBitrate() / getChannel() < 96000) Sblimit = 27; else { - if (Sampling_frequency == 48000) + if (getSamplingFrequency() == 48000) Sblimit = 27; else Sblimit = 30; @@ -162,26 +177,30 @@ Bound = Sblimit; } - else if (Layer == 2) // MPEG-2 + else if (getLayer() == 2) // MPEG-2 { Sblimit = 30; } - if (Layer < 3) + if (getLayer() < 3) { if (Bound > Sblimit) Bound = Sblimit; - Size = (Size_base = 144 * Bitrate / Sampling_frequency) + Padding_bit; + setSizeBase((getID() == 0 && getLayer() == 1 ? 72 : 144) * getBitrate() / getSamplingFrequency()); + setSize(getSizeBase() + getPaddingBit()); + + return 1; } else { Sblimit = 32; - Size = (Size_base = (12 * Bitrate / Sampling_frequency) * 4) + (4 * Padding_bit); - } + setSizeBase((12 * getBitrate() / getSamplingFrequency())<<2); + setSize(getSizeBase() + (getPaddingBit()<<2)); - return (Layer < 3 ? 1 : 2); + return 2; + } } /** @@ -189,53 +208,69 @@ */ public int parseNextHeader(byte[] frame, int pos) { - - if ( (0xFF&frame[pos])!=0xFF || (0xF0&frame[pos+1])!=0xF0 ) + + if ( (0xFF & frame[pos]) != 0xFF || (0xF0 & frame[pos + 1]) != 0xF0 ) return -1; - nID = 1&frame[pos+1]>>>3; - nEmphasis = 3&frame[pos+3]; + setNextID(1 & frame[pos + 1]>>>3); + setNextEmphasis(3 & frame[pos + 3]); - if (nID==1 && nEmphasis==2) - nID = 2; - - if ( (nLayer = 3&frame[pos+1]>>>1) < 1) + if (getNextID() == 1 && getNextEmphasis() == 2) + setNextID(2); + + setNextLayer(3 & frame[pos + 1]>>>1); + + if (getNextLayer() < 1) return -2; - nProtection_bit = (1&frame[pos+1]) ^ 1; + setNextProtectionBit((1 & frame[pos + 1]) ^ 1); - if ( (nBitrate = bitrate_index[nID][nLayer-1][0xF&frame[pos+2]>>>4]) < 1) + setNextBitrate(bitrate_index[getNextID()][getNextLayer() - 1][0xF & frame[pos + 2]>>>4]); + + if (getNextBitrate() < 1) return -3; - if ( (nSampling_frequency = frequency_index[nID][3&frame[pos+2]>>>2]) == 0) + setNextSamplingFrequency(frequency_index[getNextID()][3 & frame[pos + 2]>>>2]); + + if (getNextSamplingFrequency() == 0) return -4; - nPadding_bit = 1&frame[pos+2]>>>1; - nPrivate_bit = 1&frame[pos+2]; + setNextPaddingBit(1 & (frame[pos + 2]>>>1)); + setNextPrivateBit(1 & frame[pos + 2]); - nMode = 3&frame[pos+3]>>>6; - nMode_extension = 3&frame[pos+3]>>>4; + setNextMode(3 & frame[pos + 3]>>>6); + setNextModeExtension(3 & frame[pos + 3]>>>4); - if (nMode==0) - nMode_extension=0; + if (getNextMode() == 0) + setNextModeExtension(0); - nChannel = (nMode==3) ? 1: 2; - nCopyright = 1&frame[pos+3]>>>3; - nOriginal = 1&frame[pos+3]>>>2; - nTime_length = time_index[nLayer]/nSampling_frequency; - - if (nID==1 && nLayer==2) { // MPEG-1,L2 restrictions - if(nBitrate/Channel < 32000) + setNextChannel(getNextMode() == 3 ? 1 : 2); + setNextCopyright(1 & frame[pos + 3]>>>3); + setNextOriginal(1 & frame[pos + 3]>>>2); + setNextFrameTimeLength(time_index[getNextLayer()] / getNextSamplingFrequency()); + + if (getNextID() == 1 && getNextLayer() == 2) // MPEG-1, L2 restrictions + { + if (getNextBitrate() / getNextChannel() < 32000) return -5; /* unsupported bitrate */ - if(nBitrate/Channel > 192000) + + if (getNextBitrate() / getNextChannel() > 192000) return -6; /* unsupported bitrate */ } - - if (nLayer<3) { - nSize = (nSize_base = 144*nBitrate/nSampling_frequency) + nPadding_bit; + + if (getNextLayer() < 3) + { + setNextSizeBase((getNextID() == 0 && getNextLayer() == 1 ? 72 : 144) * getNextBitrate() / getNextSamplingFrequency()); + setNextSize(getNextSizeBase() + getNextPaddingBit()); + return 1; - } else { - nSize = (nSize_base = (12*nBitrate/nSampling_frequency)*4) + (4*nPadding_bit); + } + + else + { + setNextSizeBase((12 * getNextBitrate() / getNextSamplingFrequency())<<2); + setNextSize(getNextSizeBase() + (getNextPaddingBit()<<2)); + return 2; } } @@ -245,28 +280,28 @@ */ public int compareHeader() { - if (lID != ID) - return 1; + if (getLastID() != getID()) + return 0x1; - else if (lLayer != Layer) - return 2; + else if (getLastLayer() != getLayer()) + return 0x2; - else if (lBitrate != Bitrate) - return 3; + else if (getLastSamplingFrequency() != getSamplingFrequency()) + return 0x4; - else if (lSampling_frequency != Sampling_frequency) - return 4; + else if (getLastBitrate() != getBitrate()) + return 0x8; - else if (lProtection_bit != Protection_bit) - return 5; + else if (getLastProtectionBit() != getProtectionBit()) + return 0x10; - else if (lMode != Mode) + else if (getLastMode() != getMode()) { - if (Mode + lMode < 2) - return 6; + if (getMode() + getLastMode() < 2) + return 0x20; else - return 7; + return 0x40; } else @@ -278,15 +313,54 @@ */ public String displayHeader() { - return ("" + dID[lID] + ", " + dLayer[lLayer] + ", " + lSampling_frequency + "Hz, " + dMode[lMode] + ", "+ (lBitrate/1000) + "kbps, " + dCRC[lProtection_bit]); + return ("" + dID[getLastID()] + ", " + dLayer[getLastLayer()] + ", " + getLastSamplingFrequency() + "Hz, " + dMode[getLastMode()] + ", "+ (getLastBitrate() / 1000) + "kbps, " + dCRC[getLastProtectionBit()]); } - + + /** + * link to mpa conversion + */ + public byte[][] convertFrame(byte[] frame, int mode) + { + if (MPAConverter == null) + MPAConverter = new MpaConverter(); + + byte[][] newframes = MPAConverter.modifyframe(frame, mode); + + parseRiffData(newframes[0], 1); + + if (mode >= MpaConverter.SPLIT_INTO_SINGLE) + parseRiffData(newframes[1], 2); + + return newframes; + } + + /** + * edit frame + */ +/** public byte[] editFrame(byte[] frame, int mode) + { + return frame; + } +**/ + + /** + * link to mpa decoder + */ +/** public byte[] decodeFrame(byte[] frame, int mode) + { + if (MPADecoder == null) + MPADecoder = new MpaDecoder(); + + return MPADecoder.decodeArray(frame); + } +**/ + /** * remove CRC from mpa **/ - public void removeCRC(byte[] frame) + public void removeCRC(byte[] frame, boolean remove) { - if (Layer < 2) + if (getLayer() < 2 || !remove) return; removePrivateBit(frame); @@ -299,7 +373,7 @@ frame[1] |= 1; - Protection_bit = 1; + setProtectionBit(1); } /** @@ -312,7 +386,47 @@ frame[2] &= ~1; - Private_bit = 0; + setPrivateBit(0); + } + + /** + * crc init table + */ + private void initCRCTable() + { + for (int n = 0, c, k; n < 256; n++) + { + c = n << 8; + + for (k = 0; k < 8; k++) + { + if ((c & (1 << 15)) != 0) + c = ((c << 1) & 0xFFFF) ^ (CRC16_POLY & 0xFFFF); + + else + c = c << 1; + } + + crc_table[n] = c; + } + } + + /** + * crc + */ + private int determineCRC(byte[] data, int offs, int len, int crc) + { + int end = offs + (len>>>3); + + for (int i = offs; i < end; i++) + crc = (crc_table[(0xFF & data[i]) ^ (crc >> 8)] ^ (crc << 8)) & 0xFFFF; + + int remaining_bits = len & 7; + + if (remaining_bits > 0) + crc = (crc_table[((0xFF >> (8 - remaining_bits)) & (data[end] >> (8 - remaining_bits))) ^ (crc >> (16 - remaining_bits))] ^ (crc << remaining_bits)) & 0xFFFF; + + return crc; } /** @@ -320,7 +434,7 @@ */ public int validateCRC(byte[] _data, int offs, int len) { - if (Layer < 2 || Protection_bit==0) + if (getLayer() < 2 || getProtectionBit() == 0) return 0; int crc_val = (0xFF & _data[4])<<8 | (0xFF & _data[5]); @@ -331,10 +445,10 @@ int ch, sb, offset = 2, nr_bits = 16, BitPos[] = { 32 }; - if (Layer==3) // BAL only, of 32 subbands + if (getLayer() == 3) // BAL only, of 32 subbands { for( sb=0; sb 20) { @@ -367,7 +481,7 @@ for( sb=0; sb0) nr_bits += 2; } - int[] g = { 1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1 }; // x^16 + x^15 + x^2 + 1 - - int[] shift_reg = new int[16]; - int crc = 0; - - Arrays.fill(shift_reg, 1); - - for (int bit_count=0, bit_in_byte=0, data_bit, j = data.length; bit_count < nr_bits; bit_count++) - { - if (offset >= j) - break; - - data_bit = (data[offset] & 0x80>>>(bit_in_byte++)) != 0 ? 1 : 0; - - if ((bit_in_byte &= 7) == 0) - offset++; - - data_bit ^= shift_reg[15]; - - for (int i = 15; i > 0; i--) - shift_reg[i] = g[i]==1 ? (shift_reg[i-1] ^ data_bit) : shift_reg[i-1]; - - shift_reg[0] = data_bit; - } - - for (int i=0; i<16; i++) - crc = ((crc << 1) | (shift_reg[15-i])); - - if (crc != crc_val) - return 1; - else - return 0; - } - - /** - * - */ - private int getBits(byte buf[], int BitPos[], int N) - { - int Pos, Val; - - Pos = BitPos[0]>>>3; - - Val = (0xFF & buf[Pos])<<24 | - (0xFF & buf[Pos+1])<<16 | - (0xFF & buf[Pos+2])<<8 | - (0xFF & buf[Pos+3]); + int crc = 0xFFFF; - Val <<= BitPos[0] & 7; - Val >>>= 32-N; - BitPos[0] += N; + // look up table is faster + crc = determineCRC(data, offset, nr_bits, crc); - return Val; + return ((crc != crc_val) ? 1 : 0); } @@ -471,7 +538,7 @@ * riffdata from mpeg audio * awaiting a frame byte array, only the header is used */ - public int[] parseRiffData(byte[] rh) + public void parseRiffData(byte[] rh, int channel) { int[] riffdata = new int[10]; @@ -498,13 +565,13 @@ if ((2 & rh[2]) != 0) riffdata[8] += rpadding[(6 & rh[1])>>>1]; - return riffdata; + setExtraWaveData(riffdata, channel); } + /** - * RDS-Test, cant find any similars to RDS, I-RDS, RBDS i.e. group/block coding - * PI-Code is missing, WDR2 shall have Dx92 + * RDS-Test, * */ ArrayList _list = new ArrayList(); @@ -514,7 +581,12 @@ private boolean Debug = false; private boolean hasRawData = false; - private String[] rds_values = new String[7]; + private final byte RDS_identifier = (byte) 0xFD; + private final int RDS_startcode = 0xFE; + private final int RDS_endcode = 0xFF; + + private String[] rds_values = new String[9]; //buffer of messages + private final String[] pty_list = { "undefined", "News", "Current Affairs", "Information", "Sport", "Education", "Drama", "Culture", "Science", "Varied", "Pop Music", "Rock Music", "Easy Listening", "Light Classical", "Seriuos Classical", "Other Music", @@ -536,7 +608,6 @@ 0x00e2, 0x00e4, 0x00ea, 0x00eb, 0x00ee, 0x00ef, 0x00f4, 0x00f6, 0x00fb, 0x00fc, 0x00f1, 0x00e7, 0x015f, 0x011f, 0x0131, 0x0133 }; - /** * */ @@ -550,43 +621,43 @@ /** * */ - public void decodeAncillaryData(byte[] frame) + public String decodeAncillaryData(byte[] frame, double frametime) { if (!DecodeRDS) - return; + return null; - int neg_offs = Size - 1; + int neg_offs = getSize() - 1; - if (frame[neg_offs] != (byte)0xFD) + if (frame[neg_offs] != RDS_identifier) { - neg_offs -= 2; + // neg_offs -= 2; - if (frame[neg_offs] != (byte)0xFD) - return; + // if (frame[neg_offs + 2] != 0 || frame[neg_offs + 1] != 0 || frame[neg_offs] != RDS_identifier) + return null; } int len = 0xFF & frame[neg_offs - 1]; - for (int i = neg_offs - 2, val; i > neg_offs - 2 - len; i--) + for (int i = neg_offs - 2, val; i > 3 && i > neg_offs - 2 - len; i--) { val = 0xFF & frame[i]; _list.add(String.valueOf(val)); } - decodeChunk(_list); + return decodeChunk(_list, frametime); } /** * */ - private void decodeChunk(ArrayList list) + private String decodeChunk(ArrayList list, double frametime) { - int index = list.indexOf("254"); //0xfe, start + int index = list.indexOf(String.valueOf(RDS_startcode)); if (index < 0) { list.clear(); - return; + return null; } while (index > 0) @@ -595,15 +666,15 @@ index--; } - int eom_index = list.indexOf("255"); //0xff, end + int eom_index = list.indexOf(String.valueOf(RDS_endcode)); if (eom_index < 0) - return; + return null; else if (eom_index < 5) //fe xx yy zz ll aa { list.remove(0); - return; + return null; } if (Debug) @@ -625,11 +696,11 @@ int type = -1; // fill bytearray, excluding crc + EOM, correct special bytes - for (int i = 0, j = 0, k = 0, value; i <= eom_index; i++, list.remove(0)) + for (int i = 0, j = 0, k = 0, value, identifier_int = (0xFF & RDS_identifier); i <= eom_index; i++, list.remove(0)) { value = Integer.parseInt(list.get(0).toString()); - if (i < 5 || value > 0xFD) + if (i < 5 || value > identifier_int) continue; if (i == 5) @@ -639,7 +710,7 @@ } // coding of 0xFD,FE,FF - if (value == 0xFD) + if (value == identifier_int) { j = 1; continue; @@ -647,7 +718,7 @@ if (j == 1) { - value += 0xFD; + value += identifier_int; j = 0; } @@ -662,52 +733,60 @@ if (real_length != chunk_length) type = -1; - String str; + String str = null; switch (type) { - case 0xDA: //Video-programminfos + case 0xDA: //RASS getRawData(bo.toByteArray()); break; case 0x0A: //RT - compareMsg(getRT(bo.toByteArray()), 0); + str = compareMsg(getRT(bo.toByteArray()), 0, frametime); break; case 0x01: //PI - compareMsg(getPI(bo.toByteArray()), 1); + str = compareMsg(getPI(bo.toByteArray()), 1, frametime); break; case 0x02: //PS program service name - compareMsg(getPS(bo.toByteArray()), 2); + str = compareMsg(getPS(bo.toByteArray()), 2, frametime); break; case 0x03: //TA - compareMsg(getTP(bo.toByteArray()), 3); + str = compareMsg(getTP(bo.toByteArray()), 3, frametime); break; case 0x05: //MS - compareMsg(getMS(bo.toByteArray()), 4); + str = compareMsg(getMS(bo.toByteArray()), 4, frametime); break; case 0x07: //PTY - compareMsg(getPTY(bo.toByteArray()), 5); + str = compareMsg(getPTY(bo.toByteArray()), 5, frametime); break; case 0x0D: //RTC - compareMsg(getRTC(bo.toByteArray()), 6); + str = compareMsg(getRTC(bo.toByteArray()), 6, frametime); break; case 0x30: //TMC + str = compareMsg("transmits TMC messages", 7, frametime); + break; + + case 0x46: //ODA data + str = compareMsg("transmits ODA messages", 8, frametime); + break; + case 0x40: //ODA SMC case 0x42: //ODA free - case 0x46: //ODA data case 0x4A: //CT case 0x06: //PIN break; } bo.reset(); + + return str; } /** @@ -736,10 +815,10 @@ if (!hasRawData) { hasRawData = true; - Common.setMessage("-> exporting RDS data type 0xDA to '" + instanced_time + "_rawdata_0xDA_RDS'"); + Common.setMessage("-> exporting RDS data (RASS) to '" + instanced_time + "_RASS@RDS'"); } - BufferedOutputStream rawdata = new BufferedOutputStream(new FileOutputStream(Common.getCollection().getOutputNameParent(instanced_time + "_rawdata@RDS"), true)); + BufferedOutputStream rawdata = new BufferedOutputStream(new FileOutputStream(Common.getCollection().getOutputNameParent(instanced_time + "_RASS@RDS"), true)); for (int i = index, k; i < end; i++) { @@ -763,14 +842,14 @@ /** * */ - private void compareMsg(String str, int index) + private String compareMsg(String str, int index, double frametime) { if (str == null || str.equals(rds_values[index])) - return; + return null; rds_values[index] = str; - Common.setMessage(str); + return ("-> RDS @ " + Common.formatTime_1((long) (frametime / 90.0)) + ": " + str); } /** @@ -965,4 +1044,235 @@ } + /** + * part for RIFF wave header data processing + */ + + private WaveHeader WaveHeader_Ch1; + private WaveHeader WaveHeader_Ch2; + + /** + * + */ + public void initExtraWaveHeader(boolean bool_ACM, boolean bool_BWF, boolean bool_AC3) + { + WaveHeader_Ch1 = new WaveHeader(bool_ACM, bool_BWF); + WaveHeader_Ch2 = new WaveHeader(bool_ACM, bool_BWF); + } + + /** + * + */ + public byte[] getExtraWaveHeader(int channel, boolean placeholder) + { + switch (channel) + { + case 1: + return (placeholder ? WaveHeader_Ch1.getPlaceHolder() : WaveHeader_Ch1.getHeader()); + + case 2: + return (placeholder ? WaveHeader_Ch2.getPlaceHolder() : WaveHeader_Ch2.getHeader()); + } + + return (new byte[0]); + } + + /** + * + */ + public void setExtraWaveData(int[] array, int channel) + { + switch (channel) + { + case 1: + WaveHeader_Ch1.setWaveData(array); + break; + + case 2: + WaveHeader_Ch2.setWaveData(array); + break; + } + } + + /** + * + */ + public void setExtraWaveLength(long filelength, long timelength, int channel) + { + switch (channel) + { + case 1: + WaveHeader_Ch1.setWaveLength(filelength, timelength); + break; + + case 2: + WaveHeader_Ch2.setWaveLength(filelength, timelength); + break; + } + } + + + /** + * + */ + private class WaveHeader { + + private byte[] riffacm = { + 82, 73, 70, 70, 0, 0, 0, 0, 87, 65, 86, 69,102,109,116, 32, + 30, 0, 0, 0, 85, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 12, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, + 113, 5,102, 97, 99,116, 4, 0, 0, 0, 0, 0, 0, 0,100, 97, + 116, 97, 0, 0, 0, 0 + }; + + private byte[] riffbwf = { + 82, 73, 70, 70, 0, 0, 0, 0, 87, 65, 86, 69,102,109,116, 32, + 40, 0, 0, 0, 80, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 97, 99,116, + 4, 0, 0, 0, 0, 0, 0, 0,100, 97,116, 97, 0, 0, 0, 0 + }; + + private long Samples = 0; + private long SampleCount = 0; + + private final int HeaderLength_ACM = 70; + private final int HeaderLength_BWF = 80; + private final int ACM_WaveFormat = 1; + private final int BWF_WaveFormat = 2; + + private int WaveFormat; + + //init + public WaveHeader(boolean bool_ACM, boolean bool_BWF) + { + WaveFormat = bool_ACM ? ACM_WaveFormat : bool_BWF ? BWF_WaveFormat : 0; + } + + /** + * get place holder + */ + public byte[] getPlaceHolder() + { + switch (WaveFormat) + { + case ACM_WaveFormat: + return (new byte[HeaderLength_ACM]); + + case BWF_WaveFormat: + return (new byte[HeaderLength_BWF]); + } + + return (new byte[0]); + } + + /** + * get updated header + */ + public byte[] getHeader() + { + switch (WaveFormat) + { + case ACM_WaveFormat: + return riffacm; + + case BWF_WaveFormat: + return riffbwf; + } + + return (new byte[0]); + } + + /** + * set wave data + */ + public void setWaveData(int[] riffdata) + { + Samples += riffdata[2]; + SampleCount++; + + int nSamplesPerSec = getValue(riffbwf, 24, 4, true); + int dwHeadBitrate = getValue(riffbwf, 40, 4, true); + int nBlockAlign = getValue(riffbwf, 32, 2, true); + + //nBlockAlign + if (nBlockAlign == 0) + { + setValue(riffacm, 44, 2, true, riffdata[8]); + setValue(riffbwf, 32, 2, true, riffdata[8]); + } + + else if (nBlockAlign != 1 && nBlockAlign != riffdata[8]) + setValue(riffbwf, 32, 2, true, 1); + + //nSamplesPerSec + if (nSamplesPerSec == 1) + { + setValue(riffacm, 24, 4, true, riffdata[2]); + setValue(riffbwf, 24, 4, true, riffdata[2]); + } + + else if (nSamplesPerSec != 0 && nSamplesPerSec != riffdata[2]) + { + setValue(riffacm, 24, 4, true, 0); + setValue(riffbwf, 24, 4, true, 0); + } + + //dwHeadBitrate + if (dwHeadBitrate == 1) + setValue(riffbwf, 40, 4, true, riffdata[6]); + + else if (dwHeadBitrate != 0 && dwHeadBitrate != riffdata[6]) + setValue(riffbwf, 40, 4, true, 0); + + // fwHeadModeExt + if (riffdata[3] == 2) + riffbwf[46] |= (byte) riffdata[5]; + + // nChannels + if (riffbwf[22] == 1) + riffacm[22] = riffbwf[22] = (byte) riffdata[4]; + + riffbwf[38] |= (byte) riffdata[1]; // fwHeadLayer + riffbwf[44] |= (byte) riffdata[3]; // fwHeadMode + riffbwf[48] |= (byte) riffdata[7]; // wHeadEmphasis + riffbwf[50] |= (byte) riffdata[0]; // fwHeadFlags + } + + /** + * + */ + public void setWaveLength(long filelength, long timelength) + { + int lengthACM = (int)filelength - HeaderLength_ACM; + int lengthBWF = (int)filelength - HeaderLength_BWF; + + for (int i = 0; i < 4; i++) + { + riffacm[4 + i] = (byte)(0xFF & (lengthACM + 62)>>>(i * 8)); + riffbwf[4 + i] = (byte)(0xFF & (lengthBWF + 72)>>>(i * 8)); + riffacm[66 + i] = (byte)(0xFF & lengthACM>>>(i * 8)); + riffbwf[76 + i] = (byte)(0xFF & lengthBWF>>>(i * 8)); + } + + if (filelength <= 100) + return; + + int time = (int)timelength; + int nAvgBytePerSecACM = (int)(1000L * lengthACM / time); + int nAvgBytePerSecBWF = (int)(1000L * lengthBWF / time); + + for (int i = 0; i < 4; i++) + { + riffacm[28 + i] = (byte)(0xFF & nAvgBytePerSecACM>>>(i * 8)); + riffbwf[28 + i] = (byte)(0xFF & nAvgBytePerSecBWF>>>(i * 8)); + } + + int fact = (int)(1L * (Samples/SampleCount) * time /1000); + + for (int i = 0; i < 4; i++) + riffacm[58 + i] = riffbwf[68 + i] = (byte)(0xFF & fact>>>(i * 8)); + } + } + } \ No newline at end of file diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatWAV.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatWAV.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/AudioFormatWAV.java 2005-12-17 21:09:40.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/AudioFormatWAV.java 2008-08-30 11:34:36.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)AudioFormatWAV.java - parse Audioheaders, wav / riff * - * Copyright (c) 2003-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -62,20 +62,20 @@ */ public int parseHeader(byte[] frame, int pos) { - INTEL = false; + setINTEL(false); if (frame[pos] != 0x52 || frame[pos + 1] != 0x49 || frame[pos + 2] != 0x46 ) return -1; if (frame[pos + 3] == 0x46) - INTEL=true; + setINTEL(true); else if (frame[pos + 3] != 0x58) return -2; - ID = INTEL ? 0 : 1; - Emphasis = 0; - Protection_bit = 0 ^ 1; + setID(isINTEL() ? 0 : 1); + setEmphasis(0); + setProtectionBit(0 ^ 1); Arrays.sort(WaveChunks); @@ -92,60 +92,60 @@ if (chunk == WaveChunks[4]) { //fmt chunk read info datas - chunksize = littleEndian(frame, a + 4, 4, INTEL); - Layer = littleEndian(frame, a + 8, 2, INTEL); // Compression type (1=PCM) - Channel = littleEndian(frame, a + 10, 2, INTEL); // channels - Sampling_frequency = littleEndian(frame, a + 12, 4, INTEL); // samplerate - Bitrate = littleEndian(frame, a + 16, 4, INTEL) * 8; // avg bits per second - Mode = littleEndian(frame, a + 20, 2, INTEL); // block align, bytes per sample - Size = littleEndian(frame, a + 22, 2, INTEL); //bits per sample + chunksize = littleEndian(frame, a + 4, 4, isINTEL()); + setLayer(littleEndian(frame, a + 8, 2, isINTEL())); // Compression type (1=PCM) + setChannel(littleEndian(frame, a + 10, 2, isINTEL())); // channels + setSamplingFrequency(littleEndian(frame, a + 12, 4, isINTEL())); // samplerate + setBitrate(littleEndian(frame, a + 16, 4, isINTEL()) * 8); // avg bits per second + setMode(littleEndian(frame, a + 20, 2, isINTEL())); // block align, bytes per sample + setSize(littleEndian(frame, a + 22, 2, isINTEL())); //bits per sample //extrabits not of interest } else if (chunk == WaveChunks[2]) { //data chunk, sample data - chunksize = littleEndian(frame, a + 4, 4, INTEL); - Size_base = chunksize; // length of whole sample data - Emphasis = a + 8; // real start of whole sample data + chunksize = littleEndian(frame, a + 4, 4, isINTEL()); + setSizeBase(chunksize); // length of whole sample data + setEmphasis(a + 8); // real start of whole sample data } else - chunksize = littleEndian(frame, a + 4, 4, INTEL); + chunksize = littleEndian(frame, a + 4, 4, isINTEL()); a += chunksize + 3; } //PTS low+high may exists in 'fact' of MPEG1audio ! - if (Bitrate < 1 || Sampling_frequency < 1 || Channel < 1) + if (getBitrate() < 1 || getSamplingFrequency() < 1 || getChannel() < 1) return -4; - Padding_bit = 0; - Private_bit = 0; - Copyright = 0; - Original = 0; - Time_length = 90000.0 / Sampling_frequency; + setPaddingBit(0); + setPrivateBit(0); + setCopyright(0); + setOriginal(0); + setFrameTimeLength(90000.0 / getSamplingFrequency()); - switch (Layer) + switch (getLayer()) { case 1: - Mode_extension = 1; + setModeExtension(1); return 1; case 0x50: - Mode_extension = 2; + setModeExtension(2); return 0; case 0x55: - Mode_extension = 3; + setModeExtension(3); return 0; case 0x2000: - Mode_extension = 4; + setModeExtension(4); return 0; default: - Mode_extension = 0; + setModeExtension(0); } return 0; @@ -159,7 +159,7 @@ */ public String displayHeader() { - return ("RIF" + LSB_mode[lID] + ", " + (lMode_extension > 0 ? compression[lMode_extension] : "tag 0x" + Integer.toHexString(Layer)) + ", " + lChannel + "-ch, " + lSampling_frequency + "Hz, " + lSize + "bit, " + (lBitrate/1000.0) + "kbps"); + return ("RIF" + LSB_mode[getLastID()] + ", " + (getLastModeExtension() > 0 ? compression[getLastModeExtension()] : "tag 0x" + Integer.toHexString(getLastLayer())) + ", " + getLastChannel() + "-ch, " + getLastSamplingFrequency() + "Hz, " + getLastSize() + "bit, " + (getLastBitrate() / 1000.0) + "kbps"); } } \ No newline at end of file diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/MpaConverter.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/MpaConverter.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/MpaConverter.java 2005-12-17 21:10:28.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/MpaConverter.java 2006-12-15 19:08:26.000000000 +0000 @@ -1,7 +1,7 @@ /* - * @(#)MpaConverter.java - converter M1L2,48khz losless + * @(#)MpaConverter.java - converter M1L2,48khz lossless * - * Copyright (c) 2002-2005 by dvb.matt, All rights reserved. + * Copyright (c) 2002-2006 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -84,10 +84,12 @@ private final int DUAL = 2; private final int SINGLE = 3; - private final int SINGLE_TO_3DSTEREO= 1; - private final int SINGLE_TO_STEREO = 2; - private final int SINGLE_TO_JSTEREO = 3; - private final int SPLIT_INTO_SINGLE = 4; + public static final int SINGLE_TO_3DSTEREO= 1; + public static final int SINGLE_TO_STEREO = 2; + public static final int SINGLE_TO_JSTEREO = 3; + public static final int SPLIT_INTO_SINGLE = 4; + public static final int SPLIT_INTO_SINGLE_DOUBLED = 5; + public static final int SPLIT_DUAL_INTO_SINGLE_DOUBLED = 6; private boolean[] framebuffer; @@ -138,8 +140,8 @@ if (Audio.parseHeader(AudioFrame, 0) != 1 || Audio.getID() != 1 || Audio.getLayer() != 2 || Audio.getSamplingFrequency() != 48000 || Audio.getBitrate() < 56000 || (Audio.getMode() == SINGLE && Audio.getBitrate() > 192000) || (Audio.getMode() != SINGLE && Audio.getBitrate() < 112000)) { - System.arraycopy(AudioFrame,0,newAudioFrames[0],0,AudioFrame.length); - System.arraycopy(AudioFrame,0,newAudioFrames[1],0,AudioFrame.length); // copy frame + System.arraycopy(AudioFrame, 0, newAudioFrames[0], 0, AudioFrame.length); + System.arraycopy(AudioFrame, 0, newAudioFrames[1], 0, AudioFrame.length); // copy frame Common.setMessage(Resource.getString("audio.msg.convert.disabled", "" + (CommonParsing.getAudioProcessingFlags()>>>18))); @@ -149,7 +151,7 @@ } //explicit call necessary, if crc removing is disabled in presettings - Audio.removeCRC(AudioFrame); + Audio.removeCRC(AudioFrame, true); switch(MpaConversionMode) { @@ -165,8 +167,18 @@ break; case SPLIT_INTO_SINGLE: //dual-stereo-jointstereo to 2 x mono + case SPLIT_INTO_SINGLE_DOUBLED: //dual-stereo-jointstereo to 2 x jstereo - doubled mono if (Audio.getChannel() == 2) - newAudioFrames = createByteArrays(splitTwoChannel(createBitArray(AudioFrame),MpaConversionMode)); + newAudioFrames = createByteArrays(splitTwoChannel(createBitArray(AudioFrame), MpaConversionMode)); + + else + newAudioFrames = adaptSourceFrame(AudioFrame, newAudioFrames, MpaConversionMode); //check to pass BR + + break; + + case SPLIT_DUAL_INTO_SINGLE_DOUBLED: //dual-only to 2 x jstereo - doubled mono + if (Audio.getMode() == DUAL) + newAudioFrames = createByteArrays(splitTwoChannel(createBitArray(AudioFrame), MpaConversionMode)); else newAudioFrames = adaptSourceFrame(AudioFrame, newAudioFrames, MpaConversionMode); //check to pass BR @@ -199,65 +211,79 @@ int[] size = new int[2]; size[1] = size[0] = (0xF0 & AudioFrame[2])>>>4; - if (MpaConversionMode != SPLIT_INTO_SINGLE) + switch(MpaConversionMode) { - if (size[0] == BRindex[0]) //same size - return input; - - else if (size[0] > BRindex[0]) - { //restart with new size - if (BRindex[0] != 0) - Restart |= 3; - - BRindex[0] = size[0]; + case SINGLE_TO_3DSTEREO: //single channel to 3D + case SINGLE_TO_STEREO: //single channel to stereo + case SINGLE_TO_JSTEREO: //single channel to jstereo - return input; - } - } + if (size[0] == BRindex[0]) //same size + return input; - else - { - if (size[0] == BRindex[1] && size[1] == BRindex[2]) //same size - return input; + else if (size[0] > BRindex[0]) + { //restart with new size + if (BRindex[0] != 0) + Restart |= 3; - else - { //restart with new size - if (size[0] > BRindex[1]) - { //fill to size L - if (BRindex[1] != 0) - Restart |= 1; + BRindex[0] = size[0]; - BRindex[1] = size[0]; + return input; } - if (size[1] > BRindex[2]) - { //fill to size R - if (BRindex[2] != 0) - Restart |= 2; - BRindex[2] = size[1]; - } + break; + + case SPLIT_INTO_SINGLE: //dual-stereo-jointstereo to 2 x mono + case SPLIT_INTO_SINGLE_DOUBLED: //dual-stereo-jointstereo to 2 x jstereo - doubled mono + case SPLIT_DUAL_INTO_SINGLE_DOUBLED: //dual-only to 2 x jstereo - doubled mono - if (Restart > 0) + if (size[0] == BRindex[1] && size[1] == BRindex[2] && Audio.getChannel() == 2) //same size return input; - } + + else + { //restart with new size + if (size[0] > BRindex[1]) + { //fill to size L + if (BRindex[1] != 0) + Restart |= 1; + + BRindex[1] = size[0]; + } + + if (size[1] > BRindex[2]) + { //fill to size R + if (BRindex[2] != 0) + Restart |= 2; + + BRindex[2] = size[1]; + } + + if (Restart > 0) + return input; + } } byte[][] output = new byte[2][0]; - for (int ch=0; ch<2; ch++) + for (int ch = 0; ch < 2; ch++) { output[ch] = new byte[Sizes[BRindex[ch + (MpaConversionMode>>>2)]]>>>3]; System.arraycopy(input[ch], 0, output[ch], 0, input[ch].length); - output[ch][2] &= (byte)~0xF0; - output[ch][2] |= (byte)BRindex[ch + (MpaConversionMode>>>2)]<<4; + output[ch][2] &= (byte) ~0xF0; + output[ch][2] |= (byte) BRindex[ch + (MpaConversionMode>>>2)]<<4; - if (MpaConversionMode != SPLIT_INTO_SINGLE) + if (MpaConversionMode < SPLIT_INTO_SINGLE) break; - else if (BRindex[ch+1] > 10) - output[ch] = createByteArray(makeTwoChannel(createBitArray(output[ch]), 3, ch + 1)); + else if (MpaConversionMode > SPLIT_INTO_SINGLE) + { + if (Audio.getChannel() == 1) + output[ch] = createByteArray(makeTwoChannel(createBitArray(output[ch]), SINGLE_TO_JSTEREO, ch + 1)); + } + + else if (BRindex[ch + 1] > 10) + output[ch] = createByteArray(makeTwoChannel(createBitArray(output[ch]), SINGLE_TO_JSTEREO, ch + 1)); } return output; @@ -325,8 +351,8 @@ { int size = 0; - for (int a=0; a<4; a++) - size |= input[a + 16] ? 8>>>a : 0; + for (int i = 0; i < 4; i++) + size |= input[i + 16] ? 8>>>i : 0; size = Sizes[size]; @@ -347,8 +373,8 @@ size = updateCBRIndex(size, channel); - for (int a=0; a < 4; a++) - input[a + 16] = (size & 8>>a) != 0 ? true : false; + for (int i = 0; i < 4; i++) + input[i + 16] = (size & 8>>i) != 0 ? true : false; } //update Bitrate index for CBR @@ -575,6 +601,7 @@ case SINGLE_TO_STEREO: // make a stereo case SINGLE_TO_JSTEREO: // make a jointstereo mode 00, sb 4..31 shared + case SPLIT_DUAL_INTO_SINGLE_DOUBLED: int Bal_length = Bal.length; int[] allocation = new int[Bal_length]; int[] scfsi = new int[Bal_length]; @@ -691,7 +718,7 @@ setError(1); } - setChannelMode(output, 1 & MpaConversionMode); //set to stereo/jstereo + setChannelMode(output, MpaConversionMode < SPLIT_INTO_SINGLE ? (1 & MpaConversionMode) : JSTEREO); //set to stereo/jstereo setBitRateIndex(output, o, channel); //set BR_index } @@ -879,7 +906,7 @@ setChannelMode(output[ch], SINGLE); //set to mono setBitRateIndex(output[ch], o[ch], ch + 1); //set BR_index - if (getSizeFromIndex(output[ch]) > Sizes[10]) + if (getSizeFromIndex(output[ch]) > Sizes[10] || MpaConversionMode == SPLIT_INTO_SINGLE_DOUBLED || MpaConversionMode == SPLIT_DUAL_INTO_SINGLE_DOUBLED) output[ch] = makeTwoChannel(output[ch], 3, ch + 1); } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/MpaDecoder.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/MpaDecoder.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/MpaDecoder.java 2006-03-29 01:46:46.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/MpaDecoder.java 2009-02-20 19:52:32.000000000 +0000 @@ -44,302 +44,310 @@ public class MpaDecoder extends Object { -static int ERROR_CODE=0, ERROR_CODE1=0; + static int ERROR_CODE = 0; + static int ERROR_CODE1 = 0; -static final double table_b1[] = { // scalefactors - 2.00000000000000, 1.58740105196820, 1.25992104989487, 1.00000000000000, - 0.79370042498410, 0.62996052494744, 0.50000000000000, 0.39685026299205, - 0.31498026247372, 0.25000000000000, 0.19842513149602, 0.15749013123686, - 0.12500000000000, 0.09921256574801, 0.07874506561843, 0.06250000000000, - - 0.04960628287401, 0.03937253280921, 0.03125000000000, 0.02480314143700, - 0.01968626640461, 0.01562500000000, 0.01240157071850, 0.00984313320230, - 0.00781250000000, 0.00620078535925, 0.00492156660115, 0.00390625000000, - 0.00310039267963, 0.00246078330058, 0.00195312500000, 0.00155019633981, + // scalefactors + static final double table_b1[] = { + 2.00000000000000, 1.58740105196820, 1.25992104989487, 1.00000000000000, + 0.79370042498410, 0.62996052494744, 0.50000000000000, 0.39685026299205, + 0.31498026247372, 0.25000000000000, 0.19842513149602, 0.15749013123686, + 0.12500000000000, 0.09921256574801, 0.07874506561843, 0.06250000000000, + + 0.04960628287401, 0.03937253280921, 0.03125000000000, 0.02480314143700, + 0.01968626640461, 0.01562500000000, 0.01240157071850, 0.00984313320230, + 0.00781250000000, 0.00620078535925, 0.00492156660115, 0.00390625000000, + 0.00310039267963, 0.00246078330058, 0.00195312500000, 0.00155019633981, - 0.00123039165029, 0.00097656250000, 0.00077509816991, 0.00061519582514, - 0.00048828125000, 0.00038754908495, 0.00030759791257, 0.00024414062500, - 0.00019377454248, 0.00015379895629, 0.00012207031250, 0.00009688727124, - 0.00007689947814, 0.00006103515625, 0.00004844363562, 0.00003844973907, - - 0.00003051757813, 0.00002422181781, 0.00001922486954, 0.00001525878906, - 0.00001211090890, 0.00000961243477, 0.00000762939453, 0.00000605545445, - 0.00000480621738, 0.00000381469727, 0.00000302772723, 0.00000240310869, - 0.00000190734863, 0.00000151386361, 0.00000120155435, 1E-20 -}; + 0.00123039165029, 0.00097656250000, 0.00077509816991, 0.00061519582514, + 0.00048828125000, 0.00038754908495, 0.00030759791257, 0.00024414062500, + 0.00019377454248, 0.00015379895629, 0.00012207031250, 0.00009688727124, + 0.00007689947814, 0.00006103515625, 0.00004844363562, 0.00003844973907, + + 0.00003051757813, 0.00002422181781, 0.00001922486954, 0.00001525878906, + 0.00001211090890, 0.00000961243477, 0.00000762939453, 0.00000605545445, + 0.00000480621738, 0.00000381469727, 0.00000302772723, 0.00000240310869, + 0.00000190734863, 0.00000151386361, 0.00000120155435, 1E-20 + }; -static final int table_b2ab_nbal[] = { // sblimit 27,30 - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2 -}; - -static final int table_b2cd_nbal[] = { // sblimit 8,12 - 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 -}; - -static final int table_MPG2_nbal[] = { // sblimit 30 - 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ,2 ,2 -}; - -static final int table_b2_4a[] = { - 0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 - //0, 1,_3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 changed due to grouping -}; - -static final int table_b2_4b[] = { - 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17 - //0, 1, 2,_3,_4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17 changed due to grouping -}; - -static final int table_b2_4c[] = { - 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 - //0, 1, 2,_4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 changed due to grouping -}; - -static final int table_b2_3a[] = { - 0, 1, 2, 4, 3, 5, 6, 17 - //0, 1, 2,_3,_4, 5, 6, 17 changed due to grouping -}; - -static final int table_b2_3b[] = { - 0, 1, 2, 3, 5, 6, 7, 8 - //0, 1, 2,_4, 5, 6, 7,_127 changed due to grouping -}; - -static final int table_b2_2[] = { - 0, 1, 2, 17 - //0, 1, 2, 17 -}; - -static final int table_MPG2_a[] = { - //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 changed due to grouping - 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -}; - -static final int table_MPG2_b[] = { - //0, 1, 2, 4, 5, 6, 7, 8 changed due to grouping - 0, 1, 2, 3, 5, 6, 7, 8 -}; - -static final int table_MPG2_c[] = { - //0, 1, 2, 4 changed due to grouping - 0, 1, 2, 3 -}; - -static final int table_MPG2[][] = { - table_MPG2_a, table_MPG2_a, table_MPG2_a, table_MPG2_a, - table_MPG2_b, table_MPG2_b, table_MPG2_b, table_MPG2_b, - table_MPG2_b, table_MPG2_b, table_MPG2_b, table_MPG2_c, - table_MPG2_c, table_MPG2_c, table_MPG2_c, table_MPG2_c, - table_MPG2_c, table_MPG2_c, table_MPG2_c, table_MPG2_c, - table_MPG2_c, table_MPG2_c, table_MPG2_c, table_MPG2_c, - table_MPG2_c, table_MPG2_c, table_MPG2_c, table_MPG2_c, - table_MPG2_c, table_MPG2_c -}; - -static final int table_b2ab[][] = { //sblimit 27,30 - table_b2_4a, table_b2_4a, table_b2_4a, table_b2_4b, - table_b2_4b, table_b2_4b, table_b2_4b, table_b2_4b, - table_b2_4b, table_b2_4b, table_b2_4b, table_b2_3a, - table_b2_3a, table_b2_3a, table_b2_3a, table_b2_3a, - table_b2_3a, table_b2_3a, table_b2_3a, table_b2_3a, - table_b2_3a, table_b2_3a, table_b2_3a, table_b2_2, - table_b2_2, table_b2_2, table_b2_2, table_b2_2, - table_b2_2, table_b2_2, table_b2_2, table_b2_2 -}; - -static final int table_b2cd[][] = { //sblimit 8,12 - table_b2_4c, table_b2_4c, table_b2_3b, table_b2_3b, - table_b2_3b, table_b2_3b, table_b2_3b, table_b2_3b, - table_b2_3b, table_b2_3b, table_b2_3b, table_b2_3b -}; - -static final double table_b4[][] = { //c,d,bits,step - {0.0, 0.0, 0, 0}, - {1.0+1.0/3.0, 1.0/2.0, 5, 3}, - {1.0+3.0/5.0, 1.0/2.0, 7, 5}, - {1.0+7.0/9.0, 1.0/2.0, 10, 9}, - {1.0+1.0/7.0, 1.0/4.0, 3, 4}, - {1.0+1.0/15.0, 1.0/8.0, 4, 8}, - {1.0+1.0/31.0, 1.0/16.0, 5, 16}, - {1.0+1.0/63.0, 1.0/32.0, 6, 32}, - {1.0+1.0/127.0, 1.0/64.0, 7, 64}, - {1.0+1.0/255.0, 1.0/128.0, 8, 128}, - {1.0+1.0/511.0, 1.0/256.0, 9, 256}, - {1.0+1.0/1023.0, 1.0/512.0, 10, 512}, - {1.0+1.0/2047.0, 1.0/1024.0, 11, 1024}, - {1.0+1.0/4095.0, 1.0/2048.0, 12, 2048}, - {1.0+1.0/8191.0, 1.0/4096.0, 13, 4096}, - {1.0+1.0/16383.0, 1.0/8192.0, 14, 8192}, - {1.0+1.0/32767.0, 1.0/16384.0, 15, 16384}, - {1.0+1.0/65535.0, 1.0/32768.0, 16, 32768} -}; - -static final double table_b3[] = { - 0.000000000, -0.000015259, -0.000015259, -0.000015259, - -0.000015259, -0.000015259, -0.000015259, -0.000030518, - -0.000030518, -0.000030518, -0.000030518, -0.000045776, - -0.000045776, -0.000061035, -0.000061035, -0.000076294, /* 15 */ - - -0.000076294, -0.000091553, -0.000106812, -0.000106812, - -0.000122070, -0.000137329, -0.000152588, -0.000167847, - -0.000198364, -0.000213623, -0.000244141, -0.000259399, - -0.000289917, -0.000320435, -0.000366211, -0.000396729, /* 31 */ - - -0.000442505, -0.000473022, -0.000534058, -0.000579834, - -0.000625610, -0.000686646, -0.000747681, -0.000808716, - -0.000885010, -0.000961304, -0.001037598, -0.001113892, - -0.001205444, -0.001296997, -0.001388550, -0.001480103, /* 47 */ - - -0.001586914, -0.001693726, -0.001785278, -0.001907349, - -0.002014160, -0.002120972, -0.002243042, -0.002349854, - -0.002456665, -0.002578735, -0.002685547, -0.002792358, - -0.002899170, -0.002990723, -0.003082275, -0.003173828, /* 63 */ - - 0.003250122, 0.003326416, 0.003387451, 0.003433228, - 0.003463745, 0.003479004, 0.003479004, 0.003463745, - 0.003417969, 0.003372192, 0.003280640, 0.003173828, - 0.003051758, 0.002883911, 0.002700806, 0.002487183, /* 79 */ - - 0.002227783, 0.001937866, 0.001617432, 0.001266479, - 0.000869751, 0.000442505, -0.000030518, -0.000549316, - -0.001098633, -0.001693726, -0.002334595, -0.003005981, - -0.003723145, -0.004486084, -0.005294800, -0.006118774, /* 95 */ - - -0.007003784, -0.007919312, -0.008865356, -0.009841919, - -0.010848999, -0.011886597, -0.012939453, -0.014022827, - -0.015121460, -0.016235352, -0.017349243, -0.018463135, - -0.019577026, -0.020690918, -0.021789551, -0.022857666, /* 111 */ - - -0.023910522, -0.024932861, -0.025909424, -0.026840210, - -0.027725220, -0.028533936, -0.029281616, -0.029937744, - -0.030532837, -0.031005859, -0.031387329, -0.031661987, - -0.031814575, -0.031845093, -0.031738281, -0.031478882, /* 127 */ - - 0.031082153, 0.030517578, 0.029785156, 0.028884888, - 0.027801514, 0.026535034, 0.025085449, 0.023422241, - 0.021575928, 0.019531250, 0.017257690, 0.014801025, - 0.012115479, 0.009231567, 0.006134033, 0.002822876, /* 143 */ - - -0.000686646, -0.004394531, -0.008316040, -0.012420654, - -0.016708374, -0.021179199, -0.025817871, -0.030609131, - -0.035552979, -0.040634155, -0.045837402, -0.051132202, - -0.056533813, -0.061996460, -0.067520142, -0.073059082, /* 159 */ - - -0.078628540, -0.084182739, -0.089706421, -0.095169067, - -0.100540161, -0.105819702, -0.110946655, -0.115921021, - -0.120697021, -0.125259399, -0.129562378, -0.133590698, - -0.137298584, -0.140670776, -0.143676758, -0.146255493, /* 175 */ - - -0.148422241, -0.150115967, -0.151306152, -0.151962280, - -0.152069092, -0.151596069, -0.150497437, -0.148773193, - -0.146362305, -0.143264771, -0.139450073, -0.134887695, - -0.129577637, -0.123474121, -0.116577148, -0.108856201, /* 191 */ - - 0.100311279, 0.090927124, 0.080688477, 0.069595337, - 0.057617187, 0.044784546, 0.031082153, 0.016510010, - 0.001068115, -0.015228271, -0.032379150, -0.050354004, - -0.069168091, -0.088775635, -0.109161377, -0.130310059, /* 207 */ - - -0.152206421, -0.174789429, -0.198059082, -0.221984863, - -0.246505737, -0.271591187, -0.297210693, -0.323318481, - -0.349868774, -0.376800537, -0.404083252, -0.431655884, - -0.459472656, -0.487472534, -0.515609741, -0.543823242, /* 223 */ - - -0.572036743, -0.600219727, -0.628295898, -0.656219482, - -0.683914185, -0.711318970, -0.738372803, -0.765029907, - -0.791213989, -0.816864014, -0.841949463, -0.866363525, - -0.890090942, -0.913055420, -0.935195923, -0.956481934, /* 239 */ - - -0.976852417, -0.996246338, -1.014617920, -1.031936646, - -1.048156738, -1.063217163, -1.077117920, -1.089782715, - -1.101211548, -1.111373901, -1.120223999, -1.127746582, - -1.133926392, -1.138763428, -1.142211914, -1.144287109, /* 255 */ - - 1.144989014, 1.144287109, 1.142211914, 1.138763428, - 1.133926392, 1.127746582, 1.120223999, 1.111373901, - 1.101211548, 1.089782715, 1.077117920, 1.063217163, - 1.048156738, 1.031936646, 1.014617920, 0.996246338, /* 271 */ - - 0.976852417, 0.956481934, 0.935195923, 0.913055420, - 0.890090942, 0.866363525, 0.841949463, 0.816864014, - 0.791213989, 0.765029907, 0.738372803, 0.711318970, - 0.683914185, 0.656219482, 0.628295898, 0.600219727, /* 287 */ - - 0.572036743, 0.543823242, 0.515609741, 0.487472534, - 0.459472656, 0.431655884, 0.404083252, 0.376800537, - 0.349868774, 0.323318481, 0.297210693, 0.271591187, - 0.246505737, 0.221984863, 0.198059082, 0.174789429, /* 304 */ - - 0.152206421, 0.130310059, 0.109161377, 0.088775635, - 0.069168091, 0.050354004, 0.032379150, 0.015228271, - -0.001068115, -0.016510010, -0.031082153, -0.044784546, - -0.057617187, -0.069595337, -0.080688477, -0.090927124, /* 319 */ - - 0.100311279, 0.108856201, 0.116577148, 0.123474121, - 0.129577637, 0.134887695, 0.139450073, 0.143264771, - 0.146362305, 0.148773193, 0.150497437, 0.151596069, - 0.152069092, 0.151962280, 0.151306152, 0.150115967, /* 335 */ - - 0.148422241, 0.146255493, 0.143676758, 0.140670776, - 0.137298584, 0.133590698, 0.129562378, 0.125259399, - 0.120697021, 0.115921021, 0.110946655, 0.105819702, - 0.100540161, 0.095169067, 0.089706421, 0.084182739, /* 351 */ - - 0.078628540, 0.073059082, 0.067520142, 0.061996460, - 0.056533813, 0.051132202, 0.045837402, 0.040634155, - 0.035552979, 0.030609131, 0.025817871, 0.021179199, - 0.016708374, 0.012420654, 0.008316040, 0.004394531, /* 367 */ - - 0.000686646, -0.002822876, -0.006134033, -0.009231567, - -0.012115479, -0.014801025, -0.017257690, -0.019531250, - -0.021575928, -0.023422241, -0.025085449, -0.026535034, - -0.027801514, -0.028884888, -0.029785156, -0.030517578, /* 383 */ - - 0.031082153, 0.031478882, 0.031738281, 0.031845093, - 0.031814575, 0.031661987, 0.031387329, 0.031005859, - 0.030532837, 0.029937744, 0.029281616, 0.028533936, - 0.027725220, 0.026840210, 0.025909424, 0.024932861, /* 399 */ - - 0.023910522, 0.022857666, 0.021789551, 0.020690918, - 0.019577026, 0.018463135, 0.017349243, 0.016235352, - 0.015121460, 0.014022827, 0.012939453, 0.011886597, - 0.010848999, 0.009841919, 0.008865356, 0.007919312, /* 415 */ - - 0.007003784, 0.006118774, 0.005294800, 0.004486084, - 0.003723145, 0.003005981, 0.002334595, 0.001693726, - 0.001098633, 0.000549316, 0.000030518, -0.000442505, - -0.000869751, -0.001266479, -0.001617432, -0.001937866, /* 431 */ - - -0.002227783, -0.002487183, -0.002700806, -0.002883911, - -0.003051758, -0.003173828, -0.003280640, -0.003372192, - -0.003417969, -0.003463745, -0.003479004, -0.003479004, - -0.003463745, -0.003433228, -0.003387451, -0.003326416, /* 447 */ - - 0.003250122, 0.003173828, 0.003082275, 0.002990723, - 0.002899170, 0.002792358, 0.002685547, 0.002578735, - 0.002456665, 0.002349854, 0.002243042, 0.002120972, - 0.002014160, 0.001907349, 0.001785278, 0.001693726, /* 463 */ - - 0.001586914, 0.001480103, 0.001388550, 0.001296997, - 0.001205444, 0.001113892, 0.001037598, 0.000961304, - 0.000885010, 0.000808716, 0.000747681, 0.000686646, - 0.000625610, 0.000579834, 0.000534058, 0.000473022, /* 479 */ - - 0.000442505, 0.000396729, 0.000366211, 0.000320435, - 0.000289917, 0.000259399, 0.000244141, 0.000213623, - 0.000198364, 0.000167847, 0.000152588, 0.000137329, - 0.000122070, 0.000106812, 0.000106812, 0.000091553, /* 495 */ - - 0.000076294, 0.000076294, 0.000061035, 0.000061035, - 0.000045776, 0.000045776, 0.000030518, 0.000030518, - 0.000030518, 0.000030518, 0.000015259, 0.000015259, - 0.000015259, 0.000015259, 0.000015259, 0.000015259 /* 511 */ -}; + // sblimit 27,30 + static final int table_b2ab_nbal[] = { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2 + }; + + // sblimit 8,12 + static final int table_b2cd_nbal[] = { + 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 + }; + + // sblimit 30 + static final int table_MPG2_nbal[] = { + 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ,2 ,2 + }; + + static final int table_b2_4a[] = { + 0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 + //0, 1,_3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 changed due to grouping + }; + + static final int table_b2_4b[] = { + 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17 + //0, 1, 2,_3,_4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17 changed due to grouping + }; + + static final int table_b2_4c[] = { + 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 + //0, 1, 2,_4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 changed due to grouping + }; + + static final int table_b2_3a[] = { + 0, 1, 2, 4, 3, 5, 6, 17 + //0, 1, 2,_3,_4, 5, 6, 17 changed due to grouping + }; + + static final int table_b2_3b[] = { + 0, 1, 2, 3, 5, 6, 7, 8 + //0, 1, 2,_4, 5, 6, 7,_127 changed due to grouping + }; + + static final int table_b2_2[] = { + 0, 1, 2, 17 + //0, 1, 2, 17 + }; + + static final int table_MPG2_a[] = { + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 changed due to grouping + 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + }; + + static final int table_MPG2_b[] = { + //0, 1, 2, 4, 5, 6, 7, 8 changed due to grouping + 0, 1, 2, 3, 5, 6, 7, 8 + }; + + static final int table_MPG2_c[] = { + //0, 1, 2, 4 changed due to grouping + 0, 1, 2, 3 + }; + + static final int table_MPG2[][] = { + table_MPG2_a, table_MPG2_a, table_MPG2_a, table_MPG2_a, + table_MPG2_b, table_MPG2_b, table_MPG2_b, table_MPG2_b, + table_MPG2_b, table_MPG2_b, table_MPG2_b, table_MPG2_c, + table_MPG2_c, table_MPG2_c, table_MPG2_c, table_MPG2_c, + table_MPG2_c, table_MPG2_c, table_MPG2_c, table_MPG2_c, + table_MPG2_c, table_MPG2_c, table_MPG2_c, table_MPG2_c, + table_MPG2_c, table_MPG2_c, table_MPG2_c, table_MPG2_c, + table_MPG2_c, table_MPG2_c + }; + + //sblimit 27,30 + static final int table_b2ab[][] = { + table_b2_4a, table_b2_4a, table_b2_4a, table_b2_4b, + table_b2_4b, table_b2_4b, table_b2_4b, table_b2_4b, + table_b2_4b, table_b2_4b, table_b2_4b, table_b2_3a, + table_b2_3a, table_b2_3a, table_b2_3a, table_b2_3a, + table_b2_3a, table_b2_3a, table_b2_3a, table_b2_3a, + table_b2_3a, table_b2_3a, table_b2_3a, table_b2_2, + table_b2_2, table_b2_2, table_b2_2, table_b2_2, + table_b2_2, table_b2_2, table_b2_2, table_b2_2 + }; + + //sblimit 8,12 + static final int table_b2cd[][] = { + table_b2_4c, table_b2_4c, table_b2_3b, table_b2_3b, + table_b2_3b, table_b2_3b, table_b2_3b, table_b2_3b, + table_b2_3b, table_b2_3b, table_b2_3b, table_b2_3b + }; + + //c,d,bits,step + static final double table_b4[][] = { + {0.0, 0.0, 0, 0}, + {1.0+1.0/3.0, 1.0/2.0, 5, 3}, + {1.0+3.0/5.0, 1.0/2.0, 7, 5}, + {1.0+7.0/9.0, 1.0/2.0, 10, 9}, + {1.0+1.0/7.0, 1.0/4.0, 3, 4}, + {1.0+1.0/15.0, 1.0/8.0, 4, 8}, + {1.0+1.0/31.0, 1.0/16.0, 5, 16}, + {1.0+1.0/63.0, 1.0/32.0, 6, 32}, + {1.0+1.0/127.0, 1.0/64.0, 7, 64}, + {1.0+1.0/255.0, 1.0/128.0, 8, 128}, + {1.0+1.0/511.0, 1.0/256.0, 9, 256}, + {1.0+1.0/1023.0, 1.0/512.0, 10, 512}, + {1.0+1.0/2047.0, 1.0/1024.0, 11, 1024}, + {1.0+1.0/4095.0, 1.0/2048.0, 12, 2048}, + {1.0+1.0/8191.0, 1.0/4096.0, 13, 4096}, + {1.0+1.0/16383.0, 1.0/8192.0, 14, 8192}, + {1.0+1.0/32767.0, 1.0/16384.0, 15, 16384}, + {1.0+1.0/65535.0, 1.0/32768.0, 16, 32768} + }; + + static final double table_b3[] = { + 0.000000000, -0.000015259, -0.000015259, -0.000015259, + -0.000015259, -0.000015259, -0.000015259, -0.000030518, + -0.000030518, -0.000030518, -0.000030518, -0.000045776, + -0.000045776, -0.000061035, -0.000061035, -0.000076294, /* 15 */ + + -0.000076294, -0.000091553, -0.000106812, -0.000106812, + -0.000122070, -0.000137329, -0.000152588, -0.000167847, + -0.000198364, -0.000213623, -0.000244141, -0.000259399, + -0.000289917, -0.000320435, -0.000366211, -0.000396729, /* 31 */ + + -0.000442505, -0.000473022, -0.000534058, -0.000579834, + -0.000625610, -0.000686646, -0.000747681, -0.000808716, + -0.000885010, -0.000961304, -0.001037598, -0.001113892, + -0.001205444, -0.001296997, -0.001388550, -0.001480103, /* 47 */ + + -0.001586914, -0.001693726, -0.001785278, -0.001907349, + -0.002014160, -0.002120972, -0.002243042, -0.002349854, + -0.002456665, -0.002578735, -0.002685547, -0.002792358, + -0.002899170, -0.002990723, -0.003082275, -0.003173828, /* 63 */ + + 0.003250122, 0.003326416, 0.003387451, 0.003433228, + 0.003463745, 0.003479004, 0.003479004, 0.003463745, + 0.003417969, 0.003372192, 0.003280640, 0.003173828, + 0.003051758, 0.002883911, 0.002700806, 0.002487183, /* 79 */ + + 0.002227783, 0.001937866, 0.001617432, 0.001266479, + 0.000869751, 0.000442505, -0.000030518, -0.000549316, + -0.001098633, -0.001693726, -0.002334595, -0.003005981, + -0.003723145, -0.004486084, -0.005294800, -0.006118774, /* 95 */ + + -0.007003784, -0.007919312, -0.008865356, -0.009841919, + -0.010848999, -0.011886597, -0.012939453, -0.014022827, + -0.015121460, -0.016235352, -0.017349243, -0.018463135, + -0.019577026, -0.020690918, -0.021789551, -0.022857666, /* 111 */ + + -0.023910522, -0.024932861, -0.025909424, -0.026840210, + -0.027725220, -0.028533936, -0.029281616, -0.029937744, + -0.030532837, -0.031005859, -0.031387329, -0.031661987, + -0.031814575, -0.031845093, -0.031738281, -0.031478882, /* 127 */ + + 0.031082153, 0.030517578, 0.029785156, 0.028884888, + 0.027801514, 0.026535034, 0.025085449, 0.023422241, + 0.021575928, 0.019531250, 0.017257690, 0.014801025, + 0.012115479, 0.009231567, 0.006134033, 0.002822876, /* 143 */ + + -0.000686646, -0.004394531, -0.008316040, -0.012420654, + -0.016708374, -0.021179199, -0.025817871, -0.030609131, + -0.035552979, -0.040634155, -0.045837402, -0.051132202, + -0.056533813, -0.061996460, -0.067520142, -0.073059082, /* 159 */ + + -0.078628540, -0.084182739, -0.089706421, -0.095169067, + -0.100540161, -0.105819702, -0.110946655, -0.115921021, + -0.120697021, -0.125259399, -0.129562378, -0.133590698, + -0.137298584, -0.140670776, -0.143676758, -0.146255493, /* 175 */ + + -0.148422241, -0.150115967, -0.151306152, -0.151962280, + -0.152069092, -0.151596069, -0.150497437, -0.148773193, + -0.146362305, -0.143264771, -0.139450073, -0.134887695, + -0.129577637, -0.123474121, -0.116577148, -0.108856201, /* 191 */ + + 0.100311279, 0.090927124, 0.080688477, 0.069595337, + 0.057617187, 0.044784546, 0.031082153, 0.016510010, + 0.001068115, -0.015228271, -0.032379150, -0.050354004, + -0.069168091, -0.088775635, -0.109161377, -0.130310059, /* 207 */ + + -0.152206421, -0.174789429, -0.198059082, -0.221984863, + -0.246505737, -0.271591187, -0.297210693, -0.323318481, + -0.349868774, -0.376800537, -0.404083252, -0.431655884, + -0.459472656, -0.487472534, -0.515609741, -0.543823242, /* 223 */ + + -0.572036743, -0.600219727, -0.628295898, -0.656219482, + -0.683914185, -0.711318970, -0.738372803, -0.765029907, + -0.791213989, -0.816864014, -0.841949463, -0.866363525, + -0.890090942, -0.913055420, -0.935195923, -0.956481934, /* 239 */ + + -0.976852417, -0.996246338, -1.014617920, -1.031936646, + -1.048156738, -1.063217163, -1.077117920, -1.089782715, + -1.101211548, -1.111373901, -1.120223999, -1.127746582, + -1.133926392, -1.138763428, -1.142211914, -1.144287109, /* 255 */ + + 1.144989014, 1.144287109, 1.142211914, 1.138763428, + 1.133926392, 1.127746582, 1.120223999, 1.111373901, + 1.101211548, 1.089782715, 1.077117920, 1.063217163, + 1.048156738, 1.031936646, 1.014617920, 0.996246338, /* 271 */ + + 0.976852417, 0.956481934, 0.935195923, 0.913055420, + 0.890090942, 0.866363525, 0.841949463, 0.816864014, + 0.791213989, 0.765029907, 0.738372803, 0.711318970, + 0.683914185, 0.656219482, 0.628295898, 0.600219727, /* 287 */ + + 0.572036743, 0.543823242, 0.515609741, 0.487472534, + 0.459472656, 0.431655884, 0.404083252, 0.376800537, + 0.349868774, 0.323318481, 0.297210693, 0.271591187, + 0.246505737, 0.221984863, 0.198059082, 0.174789429, /* 304 */ + + 0.152206421, 0.130310059, 0.109161377, 0.088775635, + 0.069168091, 0.050354004, 0.032379150, 0.015228271, + -0.001068115, -0.016510010, -0.031082153, -0.044784546, + -0.057617187, -0.069595337, -0.080688477, -0.090927124, /* 319 */ + + 0.100311279, 0.108856201, 0.116577148, 0.123474121, + 0.129577637, 0.134887695, 0.139450073, 0.143264771, + 0.146362305, 0.148773193, 0.150497437, 0.151596069, + 0.152069092, 0.151962280, 0.151306152, 0.150115967, /* 335 */ + + 0.148422241, 0.146255493, 0.143676758, 0.140670776, + 0.137298584, 0.133590698, 0.129562378, 0.125259399, + 0.120697021, 0.115921021, 0.110946655, 0.105819702, + 0.100540161, 0.095169067, 0.089706421, 0.084182739, /* 351 */ + + 0.078628540, 0.073059082, 0.067520142, 0.061996460, + 0.056533813, 0.051132202, 0.045837402, 0.040634155, + 0.035552979, 0.030609131, 0.025817871, 0.021179199, + 0.016708374, 0.012420654, 0.008316040, 0.004394531, /* 367 */ + + 0.000686646, -0.002822876, -0.006134033, -0.009231567, + -0.012115479, -0.014801025, -0.017257690, -0.019531250, + -0.021575928, -0.023422241, -0.025085449, -0.026535034, + -0.027801514, -0.028884888, -0.029785156, -0.030517578, /* 383 */ + + 0.031082153, 0.031478882, 0.031738281, 0.031845093, + 0.031814575, 0.031661987, 0.031387329, 0.031005859, + 0.030532837, 0.029937744, 0.029281616, 0.028533936, + 0.027725220, 0.026840210, 0.025909424, 0.024932861, /* 399 */ + + 0.023910522, 0.022857666, 0.021789551, 0.020690918, + 0.019577026, 0.018463135, 0.017349243, 0.016235352, + 0.015121460, 0.014022827, 0.012939453, 0.011886597, + 0.010848999, 0.009841919, 0.008865356, 0.007919312, /* 415 */ + + 0.007003784, 0.006118774, 0.005294800, 0.004486084, + 0.003723145, 0.003005981, 0.002334595, 0.001693726, + 0.001098633, 0.000549316, 0.000030518, -0.000442505, + -0.000869751, -0.001266479, -0.001617432, -0.001937866, /* 431 */ + + -0.002227783, -0.002487183, -0.002700806, -0.002883911, + -0.003051758, -0.003173828, -0.003280640, -0.003372192, + -0.003417969, -0.003463745, -0.003479004, -0.003479004, + -0.003463745, -0.003433228, -0.003387451, -0.003326416, /* 447 */ + + 0.003250122, 0.003173828, 0.003082275, 0.002990723, + 0.002899170, 0.002792358, 0.002685547, 0.002578735, + 0.002456665, 0.002349854, 0.002243042, 0.002120972, + 0.002014160, 0.001907349, 0.001785278, 0.001693726, /* 463 */ + + 0.001586914, 0.001480103, 0.001388550, 0.001296997, + 0.001205444, 0.001113892, 0.001037598, 0.000961304, + 0.000885010, 0.000808716, 0.000747681, 0.000686646, + 0.000625610, 0.000579834, 0.000534058, 0.000473022, /* 479 */ + + 0.000442505, 0.000396729, 0.000366211, 0.000320435, + 0.000289917, 0.000259399, 0.000244141, 0.000213623, + 0.000198364, 0.000167847, 0.000152588, 0.000137329, + 0.000122070, 0.000106812, 0.000106812, 0.000091553, /* 495 */ + + 0.000076294, 0.000076294, 0.000061035, 0.000061035, + 0.000045776, 0.000045776, 0.000030518, 0.000030518, + 0.000030518, 0.000030518, 0.000015259, 0.000015259, + 0.000015259, 0.000015259, 0.000015259, 0.000015259 /* 511 */ + }; -static final double table_Nik[][] = { - { + static final double table_Nik[][] = { + { 0.707106781186547573, -0.707106781186547462, -0.707106781186547684, 0.707106781186547351, 0.707106781186547684, -0.707106781186547906, -0.707106781186547129, 0.707106781186547795, 0.707106781186547240, -0.707106781186547795, -0.707106781186547351, 0.707106781186546352, @@ -348,7 +356,7 @@ 0.707106781186545241, -0.707106781186546018, -0.707106781186547906, 0.707106781186548350, 0.707106781186545463, -0.707106781186545796, -0.707106781186548017, 0.707106781186548239, 0.707106781186545574, -0.707106781186545574, -0.707106781186548239, 0.707106781186548017, - },{ + },{ 0.671558954847018330, -0.803207531480644832, -0.514102744193221772, 0.903989293123443449, 0.336889853392220051, -0.970031253194544085, -0.146730474455361665, 0.998795456205172405, -0.049067674327417293, -0.989176509964780903, 0.242980179903262428, 0.941544065183020806, @@ -357,7 +365,7 @@ -0.941544065183021361, -0.242980179903264426, 0.989176509964780570, 0.049067674327415829, -0.998795456205172405, 0.146730474455359611, 0.970031253194543308, -0.336889853392220606, -0.903989293123444004, 0.514102744193224659, 0.803207531480644166, -0.671558954847017664, - },{ + },{ 0.634393284163645488, -0.881921264348354939, -0.290284677254462442, 0.995184726672196929, -0.098017140329560840, -0.956940335732208713, 0.471396736825997364, 0.773010453362736549, -0.773010453362736993, -0.471396736825998308, 0.956940335732208935, 0.098017140329559285, @@ -366,7 +374,7 @@ 0.098017140329560631, 0.956940335732208602, -0.471396736825999529, -0.773010453362734995, 0.773010453362735106, 0.471396736825999307, -0.956940335732208602, -0.098017140329560382, 0.995184726672196818, -0.290284677254464552, -0.881921264348353495, 0.634393284163643378, - },{ + },{ 0.595699304492433357, -0.941544065183020806, -0.049067674327418029, 0.970031253194544085, -0.514102744193221439, -0.671558954847018108, 0.903989293123443005, 0.146730474455361803, -0.989176509964780903, 0.427555093430283306, 0.740951125354960105, -0.857728610000271674, @@ -375,7 +383,7 @@ 0.857728610000272895, -0.740951125354960882, -0.427555093430282196, 0.989176509964780570, -0.146730474455362997, -0.903989293123444004, 0.671558954847020440, 0.514102744193221883, -0.970031253194543308, 0.049067674327419257, 0.941544065183021361, -0.595699304492435466, - },{ + },{ 0.555570233019602289, -0.980785280403230431, 0.195090322016128304, 0.831469612302545014, -0.831469612302545125, -0.195090322016128026, 0.980785280403230320, -0.555570233019601512, -0.555570233019602622, 0.980785280403230431, -0.195090322016128581, -0.831469612302544903, @@ -384,7 +392,7 @@ -0.831469612302543459, -0.195090322016130968, 0.980785280403230875, -0.555570233019600512, -0.555570233019603621, 0.980785280403230209, -0.195090322016127360, -0.831469612302545569, 0.831469612302545125, 0.195090322016128082, -0.980785280403230320, 0.555570233019602955, - },{ + },{ 0.514102744193221661, -0.998795456205172405, 0.427555093430282140, 0.595699304492433246, -0.989176509964781014, 0.336889853392220218, 0.671558954847018219, -0.970031253194544085, 0.242980179903262428, 0.740951125354960105, -0.941544065183020251, 0.146730474455360332, @@ -393,7 +401,7 @@ -0.146730474455359361, 0.941544065183021139, -0.740951125354960771, -0.242980179903264926, 0.970031253194543419, -0.671558954847017664, -0.336889853392217609, 0.989176509964781125, -0.595699304492435466, -0.427555093430282862, 0.998795456205172294, -0.514102744193227101, - },{ + },{ 0.471396736825997587, -0.995184726672196929, 0.634393284163645599, 0.290284677254462553, -0.956940335732208713, 0.773010453362736993, 0.098017140329560812, -0.881921264348354383, 0.881921264348355494, -0.098017140329561242, -0.773010453362736771, 0.956940335732208824, @@ -402,7 +410,7 @@ 0.956940335732208602, -0.773010453362737326, -0.098017140329560382, 0.881921264348355050, -0.881921264348354828, 0.098017140329559896, 0.773010453362737548, -0.956940335732208491, 0.290284677254460832, 0.634393284163647042, -0.995184726672197373, 0.471396736826001694, - },{ + },{ 0.427555093430282196, -0.970031253194543974, 0.803207531480645054, -0.049067674327418424, -0.740951125354958662, 0.989176509964781014, -0.514102744193221217, -0.336889853392219552, 0.941544065183020806, -0.857728610000271674, 0.146730474455360332, 0.671558954847017331, @@ -411,7 +419,7 @@ -0.671558954847017886, -0.146730474455359611, 0.857728610000273117, -0.941544065183021028, 0.336889853392216942, 0.514102744193222105, -0.989176509964780570, 0.740951125354957996, 0.049067674327416808, -0.803207531480646719, 0.970031253194545751, -0.427555093430284638, - },{ + },{ 0.382683432365089837, -0.923879532511286850, 0.923879532511286850, -0.382683432365089893, -0.382683432365090559, 0.923879532511286738, -0.923879532511287072, 0.382683432365089560, 0.382683432365090892, -0.923879532511286294, 0.923879532511286850, -0.382683432365089227, @@ -420,7 +428,7 @@ -0.382683432365091947, 0.923879532511288071, -0.923879532511287849, 0.382683432365091447, 0.382683432365089005, -0.923879532511286850, 0.923879532511286294, -0.382683432365094389, -0.382683432365092613, 0.923879532511285628, -0.923879532511284851, 0.382683432365090781, - },{ + },{ 0.336889853392220051, -0.857728610000272118, 0.989176509964781014, -0.671558954847018885, 0.049067674327417418, 0.595699304492433468, -0.970031253194543863, 0.903989293123442894, -0.427555093430283195, -0.242980179903263954, 0.803207531480645720, -0.998795456205172405, @@ -429,7 +437,7 @@ 0.998795456205172183, -0.803207531480643944, 0.242980179903264454, 0.427555093430279587, -0.903989293123444226, 0.970031253194544085, -0.595699304492435244, -0.049067674327413380, 0.671558954847013334, -0.989176509964781681, 0.857728610000270564, -0.336889853392219440, - },{ + },{ 0.290284677254462331, -0.773010453362736882, 0.995184726672196818, -0.881921264348354828, 0.471396736825997364, 0.098017140329560812, -0.634393284163645599, 0.956940335732209380, -0.956940335732208935, 0.634393284163644378, -0.098017140329560992, -0.471396736825998752, @@ -438,7 +446,7 @@ -0.471396736825999085, -0.098017140329560631, 0.634393284163646820, -0.956940335732209824, 0.956940335732209490, -0.634393284163640381, 0.098017140329566488, 0.471396736825993867, -0.881921264348353828, 0.995184726672196929, -0.773010453362736549, 0.290284677254460111, - },{ + },{ 0.242980179903263982, -0.671558954847018330, 0.941544065183020695, -0.989176509964781014, 0.803207531480644832, -0.427555093430281807, -0.049067674327418521, 0.514102744193220773, -0.857728610000272562, 0.998795456205172405, -0.903989293123442783, 0.595699304492433468, @@ -447,7 +455,7 @@ -0.595699304492433357, 0.903989293123442672, -0.998795456205172516, 0.857728610000270897, -0.514102744193227101, 0.049067674327418764, 0.427555093430286415, -0.803207531480642611, 0.989176509964781236, -0.941544065183023138, 0.671558954847019440, -0.242980179903259930, - },{ + },{ 0.195090322016128331, -0.555570233019602178, 0.831469612302545014, -0.980785280403230320, 0.980785280403230431, -0.831469612302545014, 0.555570233019601512, -0.195090322016128581, -0.195090322016126777, 0.555570233019602844, -0.831469612302545014, 0.980785280403230098, @@ -456,7 +464,7 @@ 0.980785280403230098, -0.831469612302547012, 0.555570233019602955, -0.195090322016126888, -0.195090322016124973, 0.555570233019607285, -0.831469612302545902, 0.980785280403229764, -0.980785280403229320, 0.831469612302544570, -0.555570233019605175, 0.195090322016122558, - },{ + },{ 0.146730474455361748, -0.427555093430282474, 0.671558954847018108, -0.857728610000272340, 0.970031253194543863, -0.998795456205172405, 0.941544065183020362, -0.803207531480644610, 0.595699304492433690, -0.336889853392221328, 0.049067674327416683, 0.242980179903260873, @@ -465,7 +473,7 @@ -0.242980179903260873, -0.049067674327420228, 0.336889853392221328, -0.595699304492433690, 0.803207531480644610, -0.941544065183020362, 0.998795456205172294, -0.970031253194544751, 0.857728610000274116, -0.671558954847021994, 0.427555093430287303, -0.146730474455368354, - },{ + },{ 0.098017140329560548, -0.290284677254462442, 0.471396736825997975, -0.634393284163645377, 0.773010453362736549, -0.881921264348354383, 0.956940335732209380, -0.995184726672197040, 0.995184726672196818, -0.956940335732208824, 0.881921264348355272, -0.773010453362737548, @@ -474,7 +482,7 @@ -0.773010453362735439, 0.881921264348355272, -0.956940335732207825, 0.995184726672196818, -0.995184726672196596, 0.956940335732207270, -0.881921264348357714, 0.773010453362738659, -0.634393284163645266, 0.471396736825994755, -0.290284677254456336, 0.098017140329565516, - },{ + },{ 0.049067674327417904, -0.146730474455361443, 0.242980179903264232, -0.336889853392219329, 0.427555093430282807, -0.514102744193220662, 0.595699304492432247, -0.671558954847017220, 0.740951125354960216, -0.803207531480645831, 0.857728610000272784, -0.903989293123443782, @@ -483,7 +491,7 @@ 0.903989293123443671, -0.857728610000272562, 0.803207531480641390, -0.740951125354960105, 0.671558954847014444, -0.595699304492434911, 0.514102744193217442, -0.427555093430284194, 0.336889853392215777, -0.242980179903266591, 0.146730474455357668, -0.049067674327421214, - },{ + },{ 0.000000000000000061, -0.000000000000000184, 0.000000000000000306, -0.000000000000000429, 0.000000000000000551, 0.000000000000001103, -0.000000000000000980, 0.000000000000000858, -0.000000000000000735, 0.000000000000000613, -0.000000000000000491, -0.000000000000003185, @@ -492,7 +500,7 @@ -0.000000000000006371, -0.000000000000004409, 0.000000000000000979, 0.000000000000002451, -0.000000000000005881, -0.000000000000004899, 0.000000000000001469, 0.000000000000001961, -0.000000000000005392, -0.000000000000005389, 0.000000000000001959, 0.000000000000001472, - },{ + },{ -0.049067674327418008, 0.146730474455361942, -0.242980179903264509, 0.336889853392220218, -0.427555093430281807, 0.514102744193222660, -0.595699304492433801, 0.671558954847018441, -0.740951125354958884, 0.803207531480644388, -0.857728610000273228, 0.903989293123444115, @@ -501,7 +509,7 @@ -0.903989293123441229, 0.857728610000269787, -0.803207531480642611, 0.740951125354956774, -0.671558954847016221, 0.595699304492431358, -0.514102744193219996, 0.427555093430280642, -0.336889853392218996, 0.242980179903263260, -0.146730474455361554, 0.049067674327418272, - },{ + },{ -0.098017140329560645, 0.290284677254462054, -0.471396736825997476, 0.634393284163646043, -0.773010453362736993, 0.881921264348355494, -0.956940335732208935, 0.995184726672196818, -0.995184726672197040, 0.956940335732208491, -0.881921264348356493, 0.773010453362737104, @@ -510,7 +518,7 @@ 0.773010453362738992, -0.881921264348354494, 0.956940335732207270, -0.995184726672197262, 0.995184726672196929, -0.956940335732210157, 0.881921264348352385, -0.773010453362736216, 0.634393284163647930, -0.471396736825991758, 0.290284677254460111, -0.098017140329562588, - },{ + },{ -0.146730474455361859, 0.427555093430282140, -0.671558954847018885, 0.857728610000271896, -0.970031253194544085, 0.998795456205172405, -0.941544065183020917, 0.803207531480645720, -0.595699304492432469, 0.336889853392220162, -0.049067674327419250, -0.242980179903261595, @@ -519,7 +527,7 @@ 0.242980179903262289, 0.049067674327411423, -0.336889853392219440, 0.595699304492437687, -0.803207531480643166, 0.941544065183021806, -0.998795456205172183, 0.970031253194543752, -0.857728610000268565, 0.671558954847019440, -0.427555093430278033, 0.146730474455365439, - },{ + },{ -0.195090322016128193, 0.555570233019601845, -0.831469612302545125, 0.980785280403230431, -0.980785280403230320, 0.831469612302544792, -0.555570233019602733, 0.195090322016126888, 0.195090322016128220, -0.555570233019600956, 0.831469612302545569, -0.980785280403230986, @@ -528,7 +536,7 @@ -0.980785280403230431, 0.831469612302544014, -0.555570233019598736, 0.195090322016122086, 0.195090322016122558, -0.555570233019599069, 0.831469612302544348, -0.980785280403230542, 0.980785280403229986, -0.831469612302542682, 0.555570233019596627, -0.195090322016133605, - },{ + },{ -0.242980179903263871, 0.671558954847018330, -0.941544065183021028, 0.989176509964780903, -0.803207531480645498, 0.427555093430281419, 0.049067674327416926, -0.514102744193222327, 0.857728610000271452, -0.998795456205172294, 0.903989293123442339, -0.595699304492432913, @@ -537,7 +545,7 @@ 0.595699304492432136, -0.903989293123441895, 0.998795456205172627, -0.857728610000275671, 0.514102744193216998, -0.049067674327414358, -0.427555093430283750, 0.803207531480644943, -0.989176509964780681, 0.941544065183022028, -0.671558954847022327, 0.242980179903257071, - },{ + },{ -0.290284677254462387, 0.773010453362737215, -0.995184726672196929, 0.881921264348355272, -0.471396736825998308, -0.098017140329561242, 0.634393284163644378, -0.956940335732208824, 0.956940335732208491, -0.634393284163643378, 0.098017140329563560, 0.471396736825996254, @@ -546,7 +554,7 @@ 0.471396736826000362, 0.098017140329566002, -0.634393284163645266, 0.956940335732207159, -0.956940335732208158, 0.634393284163647930, -0.098017140329555261, -0.471396736825997364, 0.881921264348352163, -0.995184726672196596, 0.773010453362738992, -0.290284677254457280, - },{ + },{ -0.336889853392220162, 0.857728610000272007, -0.989176509964781125, 0.671558954847018219, -0.049067674327418521, -0.595699304492433801, 0.970031253194544418, -0.903989293123443671, 0.427555093430285082, 0.242980179903265148, -0.803207531480644166, 0.998795456205172183, @@ -555,7 +563,7 @@ -0.998795456205172183, 0.803207531480644943, -0.242980179903259458, -0.427555093430277588, 0.903989293123443116, -0.970031253194542975, 0.595699304492437687, 0.049067674327417300, -0.671558954847021328, 0.989176509964780126, -0.857728610000272562, 0.336889853392216665, - },{ + },{ -0.382683432365089726, 0.923879532511286850, -0.923879532511286738, 0.382683432365089060, 0.382683432365089560, -0.923879532511286960, 0.923879532511286294, -0.382683432365091225, -0.382683432365089005, 0.923879532511286738, -0.923879532511286516, 0.382683432365088505, @@ -564,7 +572,7 @@ 0.382683432365084009, -0.923879532511284629, 0.923879532511288626, -0.382683432365093501, -0.382683432365086729, 0.923879532511285739, -0.923879532511287405, 0.382683432365090781, 0.382683432365089449, -0.923879532511286850, 0.923879532511286294, -0.382683432365088061, - },{ + },{ -0.427555093430282251, 0.970031253194543974, -0.803207531480645387, 0.049067674327418397, 0.740951125354959106, -0.989176509964780903, 0.514102744193220995, 0.336889853392221217, -0.941544065183021361, 0.857728610000272895, -0.146730474455359361, -0.671558954847017886, @@ -573,7 +581,7 @@ 0.671558954847013667, 0.146730474455364940, -0.857728610000272118, 0.941544065183021806, -0.336889853392225935, -0.514102744193225880, 0.989176509964781236, -0.740951125354960105, -0.049067674327413380, 0.803207531480648718, -0.970031253194543197, 0.427555093430281974, - },{ + },{ -0.471396736825997698, 0.995184726672196929, -0.634393284163645377, -0.290284677254462553, 0.956940335732208935, -0.773010453362736771, -0.098017140329560992, 0.881921264348355272, -0.881921264348356493, 0.098017140329563560, 0.773010453362735106, -0.956940335732209713, @@ -582,7 +590,7 @@ -0.956940335732210268, 0.773010453362738326, 0.098017140329565516, -0.881921264348354050, 0.881921264348352607, -0.098017140329562588, -0.773010453362740213, 0.956940335732209380, -0.290284677254457280, -0.634393284163644156, 0.995184726672196374, -0.471396736825986540, - },{ + },{ -0.514102744193221661, 0.998795456205172405, -0.427555093430282696, -0.595699304492434023, 0.989176509964780903, -0.336889853392219829, -0.671558954847018441, 0.970031253194544085, -0.242980179903264426, -0.740951125354960882, 0.941544065183021139, -0.146730474455359611, @@ -591,7 +599,7 @@ 0.146730474455364940, -0.941544065183023027, 0.740951125354962104, 0.242980179903262788, -0.970031253194544529, 0.671558954847014444, 0.336889853392214833, -0.989176509964780681, 0.595699304492432469, 0.427555093430285971, -0.998795456205172738, 0.514102744193224548, - },{ + },{ -0.555570233019602289, 0.980785280403230431, -0.195090322016128026, -0.831469612302545014, 0.831469612302544792, 0.195090322016128442, -0.980785280403230320, 0.555570233019600179, 0.555570233019603843, -0.980785280403230209, 0.195090322016127610, 0.831469612302545236, @@ -600,7 +608,7 @@ 0.831469612302544348, 0.195090322016129303, -0.980785280403230542, 0.555570233019602400, 0.555570233019601512, -0.980785280403230764, 0.195090322016130246, 0.831469612302543792, -0.831469612302547012, -0.195090322016124473, 0.980785280403232318, -0.555570233019594628, - },{ + },{ -0.595699304492433357, 0.941544065183020695, 0.049067674327417418, -0.970031253194544085, 0.514102744193220773, 0.671558954847018441, -0.903989293123443671, -0.146730474455363497, 0.989176509964780570, -0.427555093430282196, -0.740951125354960771, 0.857728610000273117, @@ -609,7 +617,7 @@ -0.857728610000272118, 0.740951125354962104, 0.427555093430286859, -0.989176509964780903, 0.146730474455365439, 0.903989293123445892, -0.671558954847017331, -0.514102744193219108, 0.970031253194542420, -0.049067674327415822, -0.941544065183024803, 0.595699304492438797, - },{ + },{ -0.634393284163645377, 0.881921264348355050, 0.290284677254462664, -0.995184726672196818, 0.098017140329559285, 0.956940335732208824, -0.471396736825998752, -0.773010453362737548, 0.773010453362737104, 0.471396736825996254, -0.956940335732209713, -0.098017140329563560, @@ -618,7 +626,7 @@ -0.098017140329562089, -0.956940335732210157, 0.471396736826001250, 0.773010453362738104, -0.773010453362741212, -0.471396736825996920, 0.956940335732207381, 0.098017140329557217, -0.995184726672197151, 0.290284677254468104, 0.881921264348361711, -0.634393284163641158, - },{ + },{ -0.671558954847018441, 0.803207531480644721, 0.514102744193221328, -0.903989293123443449, -0.336889853392221550, 0.970031253194543974, 0.146730474455360110, -0.998795456205172405, 0.049067674327415829, 0.989176509964780570, -0.242980179903264926, -0.941544065183021028, @@ -627,7 +635,7 @@ 0.941544065183021806, 0.242980179903262788, -0.989176509964780903, -0.049067674327420721, 0.998795456205172627, -0.146730474455355253, -0.970031253194542642, 0.336889853392223604, 0.903989293123448667, -0.514102744193233874, -0.803207531480637615, 0.671558954847025991, - },{ + },{ -0.707106781186547462, 0.707106781186547684, 0.707106781186547795, -0.707106781186547351, -0.707106781186546352, 0.707106781186547573, 0.707106781186548572, -0.707106781186547906, -0.707106781186545796, 0.707106781186545574, 0.707106781186548017, -0.707106781186548350, @@ -636,7 +644,7 @@ -0.707106781186544242, 0.707106781186552236, 0.707106781186551458, -0.707106781186544908, -0.707106781186548683, 0.707106781186547684, 0.707106781186546018, -0.707106781186540467, -0.707106781186543243, 0.707106781186543243, 0.707106781186540467, -0.707106781186546018, - },{ + },{ -0.740951125354959217, 0.595699304492433246, 0.857728610000271896, -0.427555093430281308, -0.941544065183020251, 0.242980179903264093, 0.989176509964781125, -0.049067674327419250, -0.998795456205172405, -0.146730474455362997, 0.970031253194543419, 0.336889853392216942, @@ -645,7 +653,7 @@ -0.336889853392225935, -0.970031253194544529, 0.146730474455365439, 0.998795456205172627, 0.049067674327416808, -0.989176509964782014, -0.242980179903265148, 0.941544065183017476, 0.427555093430285527, -0.857728610000273117, -0.595699304492427029, 0.740951125354968321, - },{ + },{ -0.773010453362736993, 0.471396736825997975, 0.956940335732209046, -0.098017140329559174, -0.995184726672197040, -0.290284677254462109, 0.881921264348354716, 0.634393284163643934, -0.634393284163643600, -0.881921264348354939, 0.290284677254465051, 0.995184726672197040, @@ -654,7 +662,7 @@ 0.995184726672196263, 0.290284677254459167, -0.881921264348354494, -0.634393284163649818, 0.634393284163648707, 0.881921264348355161, -0.290284677254457779, -0.995184726672197817, -0.098017140329574287, 0.956940335732211822, 0.471396736825992591, -0.773010453362737771, - },{ + },{ -0.803207531480644832, 0.336889853392220051, 0.998795456205172405, 0.242980179903262428, -0.857728610000272562, -0.740951125354958884, 0.427555093430285082, 0.989176509964780570, 0.146730474455359611, -0.903989293123444004, -0.671558954847017664, 0.514102744193222105, @@ -663,7 +671,7 @@ -0.514102744193225880, 0.671558954847014444, 0.903989293123445892, -0.146730474455355253, -0.989176509964782014, -0.427555093430276256, 0.740951125354963103, 0.857728610000276670, -0.242980179903268478, -0.998795456205171850, -0.336889853392216720, 0.803207531480638170, - },{ + },{ -0.831469612302545347, 0.195090322016127915, 0.980785280403230320, 0.555570233019601512, -0.555570233019602733, -0.980785280403230320, -0.195090322016128082, 0.831469612302547123, 0.831469612302545458, -0.195090322016131218, -0.980785280403230320, -0.555570233019600179, @@ -672,7 +680,7 @@ -0.555570233019599513, -0.980785280403230431, -0.195090322016124973, 0.831469612302548899, 0.831469612302547567, -0.195090322016141293, -0.980785280403228099, -0.555570233019609283, 0.555570233019597848, 0.980785280403230875, 0.195090322016126888, -0.831469612302547900, - },{ + },{ -0.857728610000272007, 0.049067674327418154, 0.903989293123443449, 0.803207531480644721, -0.146730474455362164, -0.941544065183020917, -0.740951125354961104, 0.242980179903261123, 0.970031253194543308, 0.671558954847020440, -0.336889853392217609, -0.989176509964780570, @@ -681,7 +689,7 @@ 0.989176509964781236, 0.336889853392214833, -0.671558954847017331, -0.970031253194542642, -0.242980179903265148, 0.740951125354963103, 0.941544065183021139, 0.146730474455369797, -0.803207531480652825, -0.903989293123440674, -0.049067674327418764, 0.857728610000268121, - },{ + },{ -0.881921264348354939, -0.098017140329560840, 0.773010453362736549, 0.956940335732208935, 0.290284677254462220, -0.634393284163645932, -0.995184726672196818, -0.471396736825999529, 0.471396736825999307, 0.995184726672196818, 0.634393284163643378, -0.290284677254461998, @@ -690,7 +698,7 @@ -0.290284677254462442, 0.634393284163643045, 0.995184726672197484, 0.471396736825993479, -0.471396736825986540, -0.995184726672196707, -0.634393284163638049, 0.290284677254454948, 0.956940335732209824, 0.773010453362745875, -0.098017140329557703, -0.881921264348358935, - },{ + },{ -0.903989293123443338, -0.242980179903264509, 0.595699304492433468, 0.998795456205172405, 0.671558954847018441, -0.146730474455362414, -0.857728610000271008, -0.941544065183021250, -0.336889853392220606, 0.514102744193221883, 0.989176509964781125, 0.740951125354957996, @@ -699,7 +707,7 @@ -0.740951125354960105, -0.989176509964780681, -0.514102744193219108, 0.336889853392223604, 0.941544065183017476, 0.857728610000276670, 0.146730474455369797, -0.671558954847012890, -0.998795456205172738, -0.595699304492438020, 0.242980179903258958, 0.903989293123441451, - },{ + },{ -0.923879532511286738, -0.382683432365089893, 0.382683432365089060, 0.923879532511286183, 0.923879532511286850, 0.382683432365089116, -0.382683432365091447, -0.923879532511286516, -0.923879532511287960, -0.382683432365088283, 0.382683432365089005, 0.923879532511285517, @@ -708,7 +716,7 @@ 0.923879532511285628, 0.382683432365095777, -0.382683432365088061, -0.923879532511287849, -0.923879532511289292, -0.382683432365078569, 0.382683432365092169, 0.923879532511284074, 0.923879532511282187, 0.382683432365087617, -0.382683432365083065, -0.923879532511291179, - },{ + },{ -0.941544065183020806, -0.514102744193221439, 0.146730474455361803, 0.740951125354960105, 0.998795456205172405, 0.803207531480644388, 0.242980179903265148, -0.427555093430282196, -0.903989293123444004, -0.970031253194543308, -0.595699304492435466, 0.049067674327416808, @@ -717,7 +725,7 @@ -0.049067674327413380, 0.595699304492432469, 0.970031253194542420, 0.903989293123448667, 0.427555093430285527, -0.242980179903268478, -0.803207531480652825, -0.998795456205172738, -0.740951125354957774, -0.146730474455351367, 0.514102744193213668, 0.941544065183020473, - },{ + },{ -0.956940335732208824, -0.634393284163644822, -0.098017140329561492, 0.471396736825998419, 0.881921264348354605, 0.995184726672196818, 0.773010453362735217, 0.290284677254461498, -0.290284677254461498, -0.773010453362735217, -0.995184726672197151, -0.881921264348357936, @@ -726,7 +734,7 @@ -0.881921264348357936, -0.995184726672196485, -0.773010453362735217, -0.290284677254461498, 0.290284677254461498, 0.773010453362735217, 0.995184726672196485, 0.881921264348357936, 0.471396736826004692, -0.098017140329550875, -0.634393284163636606, -0.956940335732205050, - },{ + },{ -0.970031253194543974, -0.740951125354959328, -0.336889853392220107, 0.146730474455362025, 0.595699304492432469, 0.903989293123443782, 0.998795456205172405, 0.857728610000271230, 0.514102744193224659, 0.049067674327419257, -0.427555093430282862, -0.803207531480646719, @@ -735,7 +743,7 @@ 0.803207531480648718, 0.427555093430285971, -0.049067674327415822, -0.514102744193233874, -0.857728610000273117, -0.998795456205171850, -0.903989293123440674, -0.595699304492438020, -0.146730474455351367, 0.336889853392218552, 0.740951125354949891, 0.970031253194544640, - },{ + },{ -0.980785280403230431, -0.831469612302545125, -0.555570233019601512, -0.195090322016128581, 0.195090322016126888, 0.555570233019600179, 0.831469612302547123, 0.980785280403230875, 0.980785280403230209, 0.831469612302545125, 0.555570233019602955, 0.195090322016130246, @@ -744,7 +752,7 @@ 0.195090322016123530, 0.555570233019603177, 0.831469612302541350, 0.980785280403230209, 0.980785280403229431, 0.831469612302539129, 0.555570233019611726, 0.195090322016133605, -0.195090322016128803, -0.555570233019607618, -0.831469612302552230, -0.980785280403228543, - },{ + },{ -0.989176509964781014, -0.903989293123443116, -0.740951125354959217, -0.514102744193222549, -0.242980179903265509, 0.049067674327415579, 0.336889853392220384, 0.595699304492435910, 0.803207531480644166, 0.941544065183021361, 0.998795456205172294, 0.970031253194545751, @@ -753,7 +761,7 @@ -0.970031253194543197, -0.998795456205172738, -0.941544065183024803, -0.803207531480637615, -0.595699304492427029, -0.336889853392216720, -0.049067674327418764, 0.242980179903258958, 0.514102744193213668, 0.740951125354949891, 0.903989293123447779, 0.989176509964781903, - },{ + },{ -0.995184726672196929, -0.956940335732209046, -0.881921264348354716, -0.773010453362737882, -0.634393284163644267, -0.471396736825999751, -0.290284677254465051, -0.098017140329563809, 0.098017140329564045, 0.290284677254465273, 0.471396736825999918, 0.634393284163647153, @@ -762,7 +770,7 @@ 0.634393284163646820, 0.471396736825999529, 0.290284677254451229, 0.098017140329563560, -0.098017140329571359, -0.290284677254458723, -0.471396736826006413, -0.634393284163641824, -0.773010453362742767, -0.881921264348352385, -0.956940335732211267, -0.995184726672196263, - },{ + },{ -0.998795456205172405, -0.989176509964781014, -0.970031253194544085, -0.941544065183020251, -0.903989293123442783, -0.857728610000273228, -0.803207531480644166, -0.740951125354960771, -0.671558954847017664, -0.595699304492435466, -0.514102744193227101, -0.427555093430284638, @@ -771,7 +779,7 @@ 0.427555093430281974, 0.514102744193224548, 0.595699304492438797, 0.671558954847025991, 0.740951125354968321, 0.803207531480638170, 0.857728610000268121, 0.903989293123441451, 0.941544065183020473, 0.970031253194544640, 0.989176509964781903, 0.998795456205172849, - },{ + },{ -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, @@ -780,7 +788,7 @@ -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, -1.000000000000000000, - },{ + },{ -0.998795456205172405, -0.989176509964781125, -0.970031253194543863, -0.941544065183020917, -0.903989293123443671, -0.857728610000271008, -0.803207531480646053, -0.740951125354958440, -0.671558954847020773, -0.595699304492433468, -0.514102744193225436, -0.427555093430283306, @@ -789,7 +797,7 @@ 0.427555093430279365, 0.514102744193233874, 0.595699304492435688, 0.671558954847012224, 0.740951125354964990, 0.803207531480643500, 0.857728610000265013, 0.903989293123444892, 0.941544065183018142, 0.970031253194546306, 0.989176509964780681, 0.998795456205171739, - },{ + },{ -0.995184726672196929, -0.956940335732208713, -0.881921264348354383, -0.773010453362736771, -0.634393284163645932, -0.471396736825995866, -0.290284677254461276, -0.098017140329560382, 0.098017140329559896, 0.290284677254460832, 0.471396736826001694, 0.634393284163648263, @@ -798,7 +806,7 @@ 0.634393284163638049, 0.471396736825989982, 0.290284677254454948, 0.098017140329553804, -0.098017140329566488, -0.290284677254467161, -0.471396736826001250, -0.634393284163647930, -0.773010453362738326, -0.881921264348355605, -0.956940335732208935, -0.995184726672196818, - },{ + },{ -0.989176509964781014, -0.903989293123443338, -0.740951125354959994, -0.514102744193220884, -0.242980179903264204, 0.049067674327419986, 0.336889853392217387, 0.595699304492432913, 0.803207531480645942, 0.941544065183019807, 0.998795456205172405, 0.970031253194545306, @@ -807,7 +815,7 @@ -0.970031253194542531, -0.998795456205172183, -0.941544065183016476, -0.803207531480648718, -0.595699304492430914, -0.336889853392208394, -0.049067674327424635, 0.242980179903266591, 0.514102744193232208, 0.740951125354954443, 0.903989293123444448, 0.989176509964782680, - },{ + },{ -0.980785280403230431, -0.831469612302545569, -0.555570233019602622, -0.195090322016126777, 0.195090322016128220, 0.555570233019603843, 0.831469612302545458, 0.980785280403230209, 0.980785280403230986, 0.831469612302543792, 0.555570233019607285, 0.195090322016128803, @@ -816,7 +824,7 @@ 0.195090322016134576, 0.555570233019600290, 0.831469612302539129, 0.980785280403232207, 0.980785280403230431, 0.831469612302550010, 0.555570233019592963, 0.195090322016125917, -0.195090322016122086, -0.555570233019613391, -0.831469612302547900, -0.980785280403229653, - },{ + },{ -0.970031253194543974, -0.740951125354958662, -0.336889853392219552, 0.146730474455360332, 0.595699304492433468, 0.903989293123444115, 0.998795456205172183, 0.857728610000273117, 0.514102744193222105, 0.049067674327416808, -0.427555093430284638, -0.803207531480647607, @@ -825,7 +833,7 @@ 0.803207531480650494, 0.427555093430289079, -0.049067674327411916, -0.514102744193217887, -0.857728610000270564, -0.998795456205172294, -0.903989293123443116, -0.595699304492431692, -0.146730474455358167, 0.336889853392224992, 0.740951125354963658, 0.970031253194546084, - },{ + },{ -0.956940335732208824, -0.634393284163645377, -0.098017140329559174, 0.471396736825996920, 0.881921264348355272, 0.995184726672196707, 0.773010453362737326, 0.290284677254465051, -0.290284677254464329, -0.773010453362736771, -0.995184726672196596, -0.881921264348357270, @@ -834,7 +842,7 @@ -0.881921264348356604, -0.995184726672198150, -0.773010453362737771, -0.290284677254452117, 0.290284677254456835, 0.773010453362740879, 0.995184726672195930, 0.881921264348354272, 0.471396736825985707, -0.098017140329557703, -0.634393284163652482, -0.956940335732206715, - },{ + },{ -0.941544065183020806, -0.514102744193221994, 0.146730474455360582, 0.740951125354958884, 0.998795456205172405, 0.803207531480643944, 0.242980179903261345, -0.427555093430278921, -0.903989293123442228, -0.970031253194544418, -0.595699304492428139, 0.049067674327418279, @@ -843,7 +851,7 @@ -0.049067674327430505, 0.595699304492441128, 0.970031253194544862, 0.903989293123444448, 0.427555093430289968, -0.242980179903277027, -0.803207531480649273, -0.998795456205172294, -0.740951125354962437, -0.146730474455372711, 0.514102744193231320, 0.941544065183022472, - },{ + },{ -0.923879532511286850, -0.382683432365090559, 0.382683432365089560, 0.923879532511286850, 0.923879532511286405, 0.382683432365088283, -0.382683432365088505, -0.923879532511287849, -0.923879532511286850, -0.382683432365092613, 0.382683432365090781, 0.923879532511288737, @@ -852,7 +860,7 @@ 0.923879532511286738, 0.382683432365085785, -0.382683432365097609, -0.923879532511291623, -0.923879532511291179, -0.382683432365096665, 0.382683432365086729, 0.923879532511287072, 0.923879532511284851, 0.382683432365081289, -0.382683432365102105, -0.923879532511282631, - },{ + },{ -0.903989293123443227, -0.242980179903263482, 0.595699304492433912, 0.998795456205172405, 0.671558954847017442, -0.146730474455363247, -0.857728610000273006, -0.941544065183020029, -0.336889853392217831, 0.514102744193217887, 0.989176509964780348, 0.740951125354961770, @@ -861,7 +869,7 @@ -0.740951125354967655, -0.989176509964781125, -0.514102744193210337, 0.336889853392219440, 0.941544065183025469, 0.857728610000272118, 0.146730474455375598, -0.671558954847018774, -0.998795456205173071, -0.595699304492432469, 0.242980179903251381, 0.903989293123444004, - },{ + },{ -0.881921264348355050, -0.098017140329560687, 0.773010453362737993, 0.956940335732208380, 0.290284677254464329, -0.634393284163646598, -0.995184726672197151, -0.471396736825996476, 0.471396736825995644, 0.995184726672196263, 0.634393284163641824, -0.290284677254463386, @@ -870,7 +878,7 @@ -0.290284677254465273, 0.634393284163640381, 0.995184726672197928, 0.471396736826009854, -0.471396736826007301, -0.995184726672197595, -0.634393284163642601, 0.290284677254462442, 0.956940335732207825, 0.773010453362741434, -0.098017140329549904, -0.881921264348361711, - },{ + },{ -0.857728610000272118, 0.049067674327417418, 0.903989293123442894, 0.803207531480645720, -0.146730474455363497, -0.941544065183021250, -0.740951125354958440, 0.242980179903264454, 0.970031253194544085, 0.671558954847013334, -0.336889853392219440, -0.989176509964781903, @@ -879,7 +887,7 @@ 0.989176509964779571, 0.336889853392231431, -0.671558954847014444, -0.970031253194543641, -0.242980179903256127, 0.740951125354949891, 0.941544065183023138, 0.146730474455362025, -0.803207531480648718, -0.903989293123437676, -0.049067674327426591, 0.857728610000271119, - },{ + },{ -0.831469612302545236, 0.195090322016128942, 0.980785280403230431, 0.555570233019602844, -0.555570233019600956, -0.980785280403230209, -0.195090322016131218, 0.831469612302545125, 0.831469612302543792, -0.195090322016133605, -0.980785280403229320, -0.555570233019604842, @@ -888,7 +896,7 @@ -0.555570233019597071, -0.980785280403228321, -0.195090322016128803, 0.831469612302538574, 0.831469612302542460, -0.195090322016122086, -0.980785280403232540, -0.555570233019602733, 0.555570233019592186, 0.980785280403229431, 0.195090322016134576, -0.831469612302551120, - },{ + },{ -0.803207531480644943, 0.336889853392220218, 0.998795456205172405, 0.242980179903264093, -0.857728610000273228, -0.740951125354958329, 0.427555093430282196, 0.989176509964781125, 0.146730474455356696, -0.903989293123445004, -0.671558954847016221, 0.514102744193223327, @@ -897,7 +905,7 @@ -0.514102744193216221, 0.671558954847022438, 0.903989293123441451, -0.146730474455364940, -0.989176509964781236, -0.427555093430281086, 0.740951125354959106, 0.857728610000272562, -0.242980179903261817, -0.998795456205172183, -0.336889853392224048, 0.803207531480641723, - },{ + },{ -0.773010453362736882, 0.471396736825997364, 0.956940335732209380, -0.098017140329560992, -0.995184726672196818, -0.290284677254461276, 0.881921264348356604, 0.634393284163646820, -0.634393284163640381, -0.881921264348353828, 0.290284677254460111, 0.995184726672196263, @@ -906,7 +914,7 @@ 0.995184726672195930, 0.290284677254462442, -0.881921264348359379, -0.634393284163653259, 0.634393284163644933, 0.881921264348351053, -0.290284677254452117, -0.995184726672197040, -0.098017140329552832, 0.956940335732205605, 0.471396736825999529, -0.773010453362741545, - },{ + },{ -0.740951125354959106, 0.595699304492432691, 0.857728610000272451, -0.427555093430282973, -0.941544065183019807, 0.242980179903264926, 0.989176509964781125, -0.049067674327415586, -0.998795456205172183, -0.146730474455360582, 0.970031253194545529, 0.336889853392222216, @@ -915,125 +923,142 @@ -0.336889853392223160, -0.970031253194545306, 0.146730474455375626, 0.998795456205172183, 0.049067674327421699, -0.989176509964779127, -0.242980179903257071, 0.941544065183020140, 0.427555093430291744, -0.857728610000276670, -0.595699304492433357, 0.740951125354953222, - } -}; + } + }; -static final float Resample[][] = { //0: 48000 to 32000, 1: 48000 to 44100 - { - -1, 0, 0.5f // write pcm, save act pcm, save act pcm before recalc to new pcm - },{ - -1, 0, - 0.088435374f, 0.17687075f, 0.26530612f, 0.3537415f, 0.44217688f, 0.53061223f, 0.61904764f, 0.707483f, 0.79591835f, 0.88435376f, 0.9727891f, 0, - 0.06122449f, 0.14965986f, 0.23809524f, 0.3265306f, 0.414966f, 0.50340134f, 0.59183675f, 0.6802721f, 0.76870745f, 0.85714287f, 0.9455782f, 0, - 0.034013607f, 0.12244898f, 0.21088435f, 0.2993197f, 0.3877551f, 0.47619048f, 0.56462586f, 0.6530612f, 0.7414966f, 0.829932f, 0.9183673f, 0, - 0.006802721f, 0.0952381f, 0.18367347f, 0.27210885f, 0.3605442f, 0.4489796f, 0.53741497f, 0.6258503f, 0.71428573f, 0.8027211f, 0.89115644f, 0.97959185f, 0, - 0.06802721f, 0.15646258f, 0.24489796f, 0.33333334f, 0.4217687f, 0.5102041f, 0.5986394f, 0.68707484f, 0.7755102f, 0.8639456f, 0.95238096f, 0, - 0.040816326f, 0.1292517f, 0.21768707f, 0.30612245f, 0.39455783f, 0.4829932f, 0.5714286f, 0.65986395f, 0.7482993f, 0.8367347f, 0.92517006f, 0, - 0.013605442f, 0.10204082f, 0.1904762f, 0.27891156f, 0.36734694f, 0.45578232f, 0.5442177f, 0.63265306f, 0.7210884f, 0.8095238f, 0.8979592f, 0.9863946f, 0, - 0.07482993f, 0.1632653f, 0.25170067f, 0.34013605f, 0.42857143f, 0.5170068f, 0.60544217f, 0.6938776f, 0.7823129f, 0.8707483f, 0.9591837f, 0, - 0.04761905f, 0.13605443f, 0.2244898f, 0.31292516f, 0.40136054f, 0.48979592f, 0.5782313f, 0.6666667f, 0.75510204f, 0.8435374f, 0.9319728f, 0, - 0.020408163f, 0.108843535f, 0.19727892f, 0.2857143f, 0.37414965f, 0.46258503f, 0.5510204f, 0.6394558f, 0.72789115f, 0.81632656f, 0.9047619f, 0.99319726f, 0, - 0.08163265f, 0.17006803f, 0.2585034f, 0.3469388f, 0.43537414f, 0.52380955f, 0.6122449f, 0.70068026f, 0.78911567f, 0.877551f, 0.9659864f, 0, - 0.054421768f, 0.14285715f, 0.23129252f, 0.3197279f, 0.40816328f, 0.49659863f, 0.585034f, 0.67346936f, 0.7619048f, 0.8503401f, 0.93877554f, 0, - 0.027210884f, 0.11564626f, 0.20408164f, 0.292517f, 0.3809524f, 0.46938777f, 0.5578231f, 0.64625853f, 0.7346939f, 0.82312924f, 0.91156465f - } -}; - -static final int Resample_frequency[][] = { //0: 48000 to 32000, 1: 48000 to 44100 - { 2, 3 }, - { 147, 160 } -}; - -public static byte RIFF[] = { - 0x52, 0x49, 0x46, 0x46, //RIFF - 0, 0, 0, 0, //32-bit filesize-8 - 0x57, 0x41, 0x56, 0x45, //WAVE - 0x66, 0x6d, 0x74, 0x20, //fmt chunk - 0, 0, 0, 0, //chunk size - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x64, 0x61, 0x74, 0x61, //data chunk - 0, 0, 0, 0 //chunk size -}; - -//DM07022004 081.6 int16 new -public static byte AIFF[] = { - 0x46, 0x4F, 0x52, 0x4D, //FORM - 0, 0, 0, 0, //32-bit filesize-8 - 0x41, 0x49, 0x46, 0x46, //AIFF - 0x43, 0x4F, 0x4D, 0x4D, //COMM chunk - 0, 0, 0, 0x12, //chunk size - 0, 0, // number of channels - 0, 0, 0, 0, // number of samples - 0, 0, // bits per sample - 0, 0, 0, 0, // sample rate + ? - 0, 0, 0, 0, 0, 0, - 0x53, 0x53, 0x4E, 0x44, //SSND chunk - 0, 0, 0, 0 //chunk size -}; - - -static class HEADER { - int ID; - int layer; - int protection_bit; - int bitrate_index; - int sampling_frequency; - int new_sampling_frequency=0; //DM30122003 081.6 int10 add - int padding_bit; - int private_bit; - int mode; - int mode_extension; - int copyright; - int original; - int channel; - int newchannel=0; //DM30122003 081.6 int10 changed - int bound; - int emphasis; - int sblimit; - int framesize; - int bits_per_sample; + //0: 48000 to 32000, 1: 48000 to 44100 + static final float Resample[][] = { + { + -1, 0, 0.5f // write pcm, save act pcm, save act pcm before recalc to new pcm + },{ + -1, 0, + 0.088435374f, 0.17687075f, 0.26530612f, 0.3537415f, 0.44217688f, 0.53061223f, 0.61904764f, 0.707483f, 0.79591835f, 0.88435376f, 0.9727891f, 0, + 0.06122449f, 0.14965986f, 0.23809524f, 0.3265306f, 0.414966f, 0.50340134f, 0.59183675f, 0.6802721f, 0.76870745f, 0.85714287f, 0.9455782f, 0, + 0.034013607f, 0.12244898f, 0.21088435f, 0.2993197f, 0.3877551f, 0.47619048f, 0.56462586f, 0.6530612f, 0.7414966f, 0.829932f, 0.9183673f, 0, + 0.006802721f, 0.0952381f, 0.18367347f, 0.27210885f, 0.3605442f, 0.4489796f, 0.53741497f, 0.6258503f, 0.71428573f, 0.8027211f, 0.89115644f, 0.97959185f, 0, + 0.06802721f, 0.15646258f, 0.24489796f, 0.33333334f, 0.4217687f, 0.5102041f, 0.5986394f, 0.68707484f, 0.7755102f, 0.8639456f, 0.95238096f, 0, + 0.040816326f, 0.1292517f, 0.21768707f, 0.30612245f, 0.39455783f, 0.4829932f, 0.5714286f, 0.65986395f, 0.7482993f, 0.8367347f, 0.92517006f, 0, + 0.013605442f, 0.10204082f, 0.1904762f, 0.27891156f, 0.36734694f, 0.45578232f, 0.5442177f, 0.63265306f, 0.7210884f, 0.8095238f, 0.8979592f, 0.9863946f, 0, + 0.07482993f, 0.1632653f, 0.25170067f, 0.34013605f, 0.42857143f, 0.5170068f, 0.60544217f, 0.6938776f, 0.7823129f, 0.8707483f, 0.9591837f, 0, + 0.04761905f, 0.13605443f, 0.2244898f, 0.31292516f, 0.40136054f, 0.48979592f, 0.5782313f, 0.6666667f, 0.75510204f, 0.8435374f, 0.9319728f, 0, + 0.020408163f, 0.108843535f, 0.19727892f, 0.2857143f, 0.37414965f, 0.46258503f, 0.5510204f, 0.6394558f, 0.72789115f, 0.81632656f, 0.9047619f, 0.99319726f, 0, + 0.08163265f, 0.17006803f, 0.2585034f, 0.3469388f, 0.43537414f, 0.52380955f, 0.6122449f, 0.70068026f, 0.78911567f, 0.877551f, 0.9659864f, 0, + 0.054421768f, 0.14285715f, 0.23129252f, 0.3197279f, 0.40816328f, 0.49659863f, 0.585034f, 0.67346936f, 0.7619048f, 0.8503401f, 0.93877554f, 0, + 0.027210884f, 0.11564626f, 0.20408164f, 0.292517f, 0.3809524f, 0.46938777f, 0.5578231f, 0.64625853f, 0.7346939f, 0.82312924f, 0.91156465f + } + }; + + //0: 48000 to 32000, 1: 48000 to 44100 + static final int Resample_frequency[][] = { + { 2, 3 }, + { 147, 160 } + }; + + public static byte RIFF[] = { + 0x52, 0x49, 0x46, 0x46, //RIFF + 0, 0, 0, 0, //32-bit filesize-8 + 0x57, 0x41, 0x56, 0x45, //WAVE + 0x66, 0x6d, 0x74, 0x20, //fmt chunk + 0, 0, 0, 0, //chunk size + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x64, 0x61, 0x74, 0x61, //data chunk + 0, 0, 0, 0 //chunk size + }; + + //DM07022004 081.6 int16 new + public static byte AIFF[] = { + 0x46, 0x4F, 0x52, 0x4D, //FORM + 0, 0, 0, 0, //32-bit filesize-8 + 0x41, 0x49, 0x46, 0x46, //AIFF + 0x43, 0x4F, 0x4D, 0x4D, //COMM chunk + 0, 0, 0, 0x12, //chunk size + 0, 0, // number of channels + 0, 0, 0, 0, // number of samples + 0, 0, // bits per sample + 0, 0, 0, 0, // sample rate + ? + 0, 0, 0, 0, 0, 0, + 0x53, 0x53, 0x4E, 0x44, //SSND chunk + 0, 0, 0, 0 //chunk size + }; + + + static class HEADER { + + int ID; + int layer; + int protection_bit; + int bitrate_index; + int sampling_frequency; + int new_sampling_frequency = 0; //DM30122003 081.6 int10 add + int padding_bit; + int private_bit; + int mode; + int mode_extension; + int copyright; + int original; + int channel; + int newchannel = 0; //DM30122003 081.6 int10 changed + int bound; + int emphasis; + int sblimit; + int framesize; + int bits_per_sample; - public HEADER() { - return; + public HEADER() { + return; + } } -} -static class WORK { - double area[] = new double[2048]; - int offset; + static class WORK { - public WORK() { - return; + double area[] = new double[2048]; + int offset; + + public WORK() { + return; + } } -} -private static byte[] buf; -private static boolean[] Bits; -private static int BitPos=0, BufferPos=0, resample=0, Frame=0; -private static HEADER head = new HEADER(); -private static WORK work = new WORK(); -private static ByteArrayOutputStream out1 = new ByteArrayOutputStream(); -private static ByteArrayOutputStream out2 = new ByteArrayOutputStream(); -private static double saveS[] = new double[2]; //DM14052004 081.7 int02 changed - -public static boolean PRESCAN = false; - -private static int LEFT_RIGHT = 0; -public static boolean MOTOROLA=false, DOWNSAMPLE=false, DOWNMIX=false, - WAVE=true, MONO=false, RESET=false, NORMALIZE=false; - -public static double MULTIPLY = 1; //DM10042004 081.7 int01 changed -public static int MAX_VALUE = 32767; //DM10042004 081.7 int01 add - - -public static int check_sync() { - if ( (0xFF&buf[BufferPos]) != 0xFF || (0xF0&buf[BufferPos+1]) != 0xF0) - return 0; - else + private static byte[] buf; + private static boolean[] Bits; + private static int BitPos = 0; + private static int BufferPos = 0; + private static int resample = 0; + private static int Frame = 0; + + private static HEADER head = new HEADER(); + private static WORK work = new WORK(); + private static ByteArrayOutputStream out1 = new ByteArrayOutputStream(); + private static ByteArrayOutputStream out2 = new ByteArrayOutputStream(); + private static double saveS[] = new double[2]; //DM14052004 081.7 int02 changed + + public static boolean PRESCAN = false; + + private static int LEFT_RIGHT = 0; + public static boolean MOTOROLA = false; + public static boolean DOWNSAMPLE = false; + public static boolean DOWNMIX = false; + public static boolean WAVE = true; + public static boolean MONO = false; + public static boolean RESET = false; + public static boolean NORMALIZE = false; + + + public static boolean LEVELSCAN = false; + + public static double MULTIPLY = 1; //DM10042004 081.7 int01 changed + public static int MAX_VALUE = 32767; //DM10042004 081.7 int01 add + + + public static int check_sync() + { + if ((0xFF & buf[BufferPos]) != 0xFF || (0xF0 & buf[BufferPos + 1]) != 0xF0) + return 0; + return 1; -} + } /*** public static void loadbits(int size) { @@ -1055,51 +1080,53 @@ } ***/ -public static void loadbits(int size) -{ - Bits = new boolean[size*8]; - BitPos = 0; - - for (int a=0; a < size; a++) - for (int b=0; b < 8; b++) - if (((0x80>>>b) & buf[BufferPos + a]) != 0) - Bits[(a * 8) + b] = true; + public static void loadbits(int size) + { + Bits = new boolean[size*8]; + BitPos = 0; - BufferPos += size; -} + for (int a=0; a < size; a++) + for (int b=0; b < 8; b++) + if (((0x80>>>b) & buf[BufferPos + a]) != 0) + Bits[(a * 8) + b] = true; -//DM10062004 081.7 int04 fixed -public static int getbits(int N) -{ - int Val=0; - - for (int a = 0; a < N && BitPos + a < Bits.length; a++) - if (Bits[BitPos + a]) - Val |= 1<<(N - 1 - a); + BufferPos += size; + } - BitPos += N; - return Val; -} + //DM10062004 081.7 int04 fixed + public static int getbits(int N) + { + int Val=0; -//DM10062004 081.7 int04 fixed -public static int showbits(int N) -{ - int Val=0; - - for (int a = 0; a < N && BitPos + a < Bits.length; a++) - if (Bits[BitPos + a]) - Val |= 1<<(N-1-a); + for (int a = 0; a < N && BitPos + a < Bits.length; a++) + if (Bits[BitPos + a]) + Val |= 1<<(N - 1 - a); - return Val; -} + BitPos += N; + return Val; + } -public static void flushbits(int N) { - BitPos += N; -} + //DM10062004 081.7 int04 fixed + public static int showbits(int N) + { + int Val=0; -public static void flushBuffer(int N) { - BufferPos += N; -} + for (int a = 0; a < N && BitPos + a < Bits.length; a++) + if (Bits[BitPos + a]) + Val |= 1<<(N-1-a); + + return Val; + } + + public static void flushbits(int N) + { + BitPos += N; + } + + public static void flushBuffer(int N) + { + BufferPos += N; + } /** * @@ -1134,767 +1161,899 @@ baos.write(intel_ByteOrder(value)); } -//DM30122003 081.6 int10 changed & moved+ -final static int bitrate[][][] = { - { - {-1,8000,16000,24000,32000,40000,48000,56000,64000, - 80000,96000,112000,128000,144000,160000,0 }, //MPG-2, L3 - {-1,8000,16000,24000,32000,40000,48000,56000,64000,80000, //MPG-2, L2 - 96000,112000,128000,144000,160000,0 }, - {-1,32000,48000,56000,64000,80000,96000,112000,128000, //MPG-2, L1 - 144000,160000,176000,192000,224000,256000,0 } - },{ - {-1,32000,40000,48000,56000,64000,80000,96000, - 112000,128000,160000,192000,224000,256000,320000, 0 }, //MPG-1, L3 - {-1, 32000, 48000, 56000, 64000, 80000, 96000, 112000, //MPG-1, L2 - 128000, 160000, 192000, 224000, 256000, 320000, 384000, 0 }, - {-1,32000,64000,96000,128000,160000,192000,224000, //MPG-1, L1 - 256000,288000,320000,352000,384000,416000,448000,0 } - },{ - {-1, 6000, 8000, 10000, 12000, 16000, 20000, 24000, //MPG-2.5, L3?? - 28000, 320000, 40000, 48000, 56000, 64000, 80000, 0 }, - {-1, 6000, 8000, 10000, 12000, 16000, 20000, 24000, //MPG-2.5, L2 - 28000, 320000, 40000, 48000, 56000, 64000, 80000, 0 }, - {-1, 8000, 12000, 16000, 20000, 24000, 32000, 40000, //MPG-2.5, L1 - 48000, 560000, 64000, 80000, 96000, 112000, 128000, 0 } - } -}; - - -final static int frequency[][] = { - { 22050,24000,16000,0 }, //MPG-2 - { 44100,48000,32000,0 }, //MPG-1 - { 11025,12000,8000,0 } //MPG-2.5 -}; -//DM30122003 081.6 int10 moved- - -public static int parse_header() { - - int channel_bitrate, newfrequency=0; - int sblimit = 32; - - head.ID = 1&buf[BufferPos+1]>>>3; - head.emphasis = 3&buf[BufferPos+3]; - - if (head.ID==1 && head.emphasis==2) - head.ID = 2; - - if ( (head.layer = 3&buf[BufferPos+1]>>>1) < 1) //DM30122003 081.6 int10 changed - return -3; - - head.protection_bit = (1&buf[BufferPos+1]) ^ 1; - - if ( (head.bitrate_index = bitrate[head.ID][head.layer-1][0xF&buf[BufferPos+2]>>>4]) < 1) //DM30122003 081.6 int10 changed - return -4; - - if ( (newfrequency = frequency[head.ID][3&buf[BufferPos+2]>>>2]) == 0) - return -5; - - head.sampling_frequency = newfrequency; - head.padding_bit = 1&buf[BufferPos+2]>>>1; - head.private_bit = 1&buf[BufferPos+2]; - - head.mode = 3&buf[BufferPos+3]>>>6; - head.mode_extension = 3&buf[BufferPos+3]>>>4;; - if (head.mode==0) - head.mode_extension=0; - - switch(head.mode){ - case 0: /* stereo */ - case 2: { /* dual channel */ - head.channel = 2; - head.bound = sblimit; - break; - } - case 1: { /* intensity stereo */ - head.channel = 2; - head.bound = (head.mode_extension + 1) << 2; - break; - } - case 3: { /* monaural */ - head.channel = 1; - head.bound = sblimit; - break; - } - } - - head.copyright = 1&buf[BufferPos+3]>>>3; - head.original = 1&buf[BufferPos+3]>>>2; - - if (head.ID==1 && head.layer==2) { // MPEG-1 - if(head.channel == 2) { - channel_bitrate = head.bitrate_index / 2; - if(channel_bitrate < 32000) - return -6; /* unsupported bitrate */ - } else { - channel_bitrate = head.bitrate_index; - if(channel_bitrate > 192000) - return -7; /* unsupported bitrate */ + //DM30122003 081.6 int10 changed & moved+ + final static int bitrate[][][] = { + { + {-1,8000,16000,24000,32000,40000,48000,56000,64000, + 80000,96000,112000,128000,144000,160000,0 }, //MPG-2, L3 + {-1,8000,16000,24000,32000,40000,48000,56000,64000,80000, //MPG-2, L2 + 96000,112000,128000,144000,160000,0 }, + {-1,32000,48000,56000,64000,80000,96000,112000,128000, //MPG-2, L1 + 144000,160000,176000,192000,224000,256000,0 } + },{ + {-1,32000,40000,48000,56000,64000,80000,96000, + 112000,128000,160000,192000,224000,256000,320000, 0 }, //MPG-1, L3 + {-1, 32000, 48000, 56000, 64000, 80000, 96000, 112000, //MPG-1, L2 + 128000, 160000, 192000, 224000, 256000, 320000, 384000, 0 }, + {-1,32000,64000,96000,128000,160000,192000,224000, //MPG-1, L1 + 256000,288000,320000,352000,384000,416000,448000,0 } + },{ + {-1, 6000, 8000, 10000, 12000, 16000, 20000, 24000, //MPG-2.5, L3?? + 28000, 320000, 40000, 48000, 56000, 64000, 80000, 0 }, + {-1, 6000, 8000, 10000, 12000, 16000, 20000, 24000, //MPG-2.5, L2 + 28000, 320000, 40000, 48000, 56000, 64000, 80000, 0 }, + {-1, 8000, 12000, 16000, 20000, 24000, 32000, 40000, //MPG-2.5, L1 + 48000, 560000, 64000, 80000, 96000, 112000, 128000, 0 } + } + }; + + + final static int frequency[][] = { + { 22050,24000,16000,0 }, //MPG-2 + { 44100,48000,32000,0 }, //MPG-1 + { 11025,12000,8000,0 } //MPG-2.5 + }; + //DM30122003 081.6 int10 moved- + + public static int parse_header() { + + int channel_bitrate; + int newfrequency=0; + int sblimit = 32; + + head.ID = 1 & buf[BufferPos + 1]>>>3; + head.emphasis = 3 & buf[BufferPos + 3]; + + if (head.ID == 1 && head.emphasis == 2) + head.ID = 2; + + if ( (head.layer = 3 & buf[BufferPos + 1]>>>1) < 1) //DM30122003 081.6 int10 changed + return -3; + + head.protection_bit = (1 & buf[BufferPos + 1]) ^ 1; + + if ( (head.bitrate_index = bitrate[head.ID][head.layer - 1][0xF & buf[BufferPos + 2]>>>4]) < 1) //DM30122003 081.6 int10 changed + return -4; + + if ( (newfrequency = frequency[head.ID][3 & buf[BufferPos + 2]>>>2]) == 0) + return -5; + + head.sampling_frequency = newfrequency; + head.padding_bit = 1 & buf[BufferPos + 2]>>>1; + head.private_bit = 1 & buf[BufferPos + 2]; + + head.mode = 3 & buf[BufferPos + 3]>>>6; + head.mode_extension = 3 & buf[BufferPos + 3]>>>4;; + + if (head.mode == 0) + head.mode_extension = 0; + + switch(head.mode) + { + case 0: /* stereo */ + case 2: /* dual channel */ + head.channel = 2; + head.bound = sblimit; + break; + + case 1: /* intensity stereo */ + head.channel = 2; + head.bound = (head.mode_extension + 1) << 2; + break; + + case 3: /* monaural */ + head.channel = 1; + head.bound = sblimit; + break; } + + head.copyright = 1 & buf[BufferPos + 3]>>>3; + head.original = 1 & buf[BufferPos + 3]>>>2; + + if (head.ID == 1 && head.layer == 2) + { // MPEG-1 + if (head.channel == 2) + { + channel_bitrate = head.bitrate_index / 2; + + if (channel_bitrate < 32000) + return -6; /* unsupported bitrate */ + } + else + { + channel_bitrate = head.bitrate_index; + + if(channel_bitrate > 192000) + return -7; /* unsupported bitrate */ + } - if (channel_bitrate < 56000) { - if(head.sampling_frequency == 32000) - head.sblimit = 12; - else - head.sblimit = 8; - } else if (channel_bitrate < 96000) - head.sblimit = 27; - else { - if (head.sampling_frequency == 48000) + if (channel_bitrate < 56000) + { + if (head.sampling_frequency == 32000) + head.sblimit = 12; + else + head.sblimit = 8; + } + else if (channel_bitrate < 96000) head.sblimit = 27; - else + + else + { + if (head.sampling_frequency == 48000) + head.sblimit = 27; + else + head.sblimit = 30; + } + + if (head.bound > head.sblimit) + head.bound = head.sblimit; + } + else if (head.layer == 2) + { // MPEG-2 head.sblimit = 30; } - if (head.bound > head.sblimit) - head.bound = head.sblimit; - } else if (head.layer==2) { // MPEG-2 - head.sblimit = 30; - } - - head.bits_per_sample=16; - - flushBuffer(4); - if(head.protection_bit>0) flushBuffer(2); - if (head.layer==2) { - if (head.bound > head.sblimit) - head.bound = head.sblimit; - head.framesize = 144*head.bitrate_index/head.sampling_frequency+head.padding_bit; - return 2; - }else if (head.layer==1) { //DM30122003 081.6 int10 new - if (head.bound > head.sblimit) - head.bound = head.sblimit; - head.framesize = 144*head.bitrate_index/head.sampling_frequency+head.padding_bit; - return 1; - } else { - head.sblimit = 32; - head.framesize = (12*head.bitrate_index/head.sampling_frequency+head.padding_bit)*4; - return 3; - } -} - -public static int decode_layer2() throws IOException { + head.bits_per_sample = 16; - loadbits(head.framesize-4-(head.protection_bit*2)); + flushBuffer(4); - short[] pcm = new short[2]; - int i,j,k,n,m; - int step; - int bits; - int o1,o2; - int code; - int sb,ch,gr; - - int[][] allocation = new int[32][2]; - int[][] scfsi = new int[32][2]; - int[][][] scalefactor = new int[32][2][3]; - double[][][][] sample = new double[12][3][32][2]; + if(head.protection_bit > 0) + flushBuffer(2); - double[] U = new double[1024]; - double[] W = new double[1024]; + if (head.layer==2) + { + if (head.bound > head.sblimit) + head.bound = head.sblimit; - double[] s = new double[2]; - int[] ss = new int[2]; - - final int[] table_nbal; - final int[][] table_alloc; + head.framesize = 144 * head.bitrate_index / head.sampling_frequency + head.padding_bit; - if (head.ID==1) { - if(head.sblimit > 20) { - table_nbal = table_b2ab_nbal; - table_alloc = table_b2ab; - } else { - table_nbal = table_b2cd_nbal; - table_alloc = table_b2cd; + return 2; } - } else { - table_nbal = table_MPG2_nbal; - table_alloc = table_MPG2; - } + else if (head.layer == 1) + { //DM30122003 081.6 int10 new + if (head.bound > head.sblimit) + head.bound = head.sblimit; - /* read allocation */ - for(sb=0;sb0) scfsi[sb][ch] = getbits(2); + return 3; } } - /* read scalefactor */ - for(sb=0;sb0){ - scalefactor[sb][ch][0] = getbits(6); - switch(scfsi[sb][ch]){ - case 0: { - scalefactor[sb][ch][1] = getbits(6); - scalefactor[sb][ch][2] = getbits(6); - break; } - case 1: { - scalefactor[sb][ch][1] = scalefactor[sb][ch][0]; - scalefactor[sb][ch][2] = getbits(6); - break; } - case 2: { - scalefactor[sb][ch][2] = scalefactor[sb][ch][1] = scalefactor[sb][ch][0]; - break; } - case 3: { - scalefactor[sb][ch][2] = scalefactor[sb][ch][1] = getbits(6); - break; } - } - } - } + private static int[][] allocation = new int[32][2]; + private static int[][] scfsi = new int[32][2]; + private static int[][][] scalefactor = new int[32][2][3]; + private static double[][][][] sample = new double[12][3][32][2]; + + private static double[] U = new double[1024]; + private static double[] W = new double[1024]; + + private static int[][][] sample1 = new int[12][32][2]; + private static double[][][] fraction = new double[12][32][2]; + + private static void resetArraysLayer2() + { + resetArrays(); + + for (int i = 0; i < sample.length; i++) + for (int j = 0; j < sample[i].length; j++) + for (int k = 0; k < sample[i][j].length; k++) + Arrays.fill(sample[i][j][k], 0); } - /* read sample and requantize and normalize */ - for(gr=0;gr<12;gr++){ - for(sb=0;sb>>2]]; - code /= step; - } - }else{ - bits = (int)table_b4[n][2]; //bits - step = (int)table_b4[n][3]; //step - for(i=0;i<3;i++){ - m = getbits(bits); - m -= step; - sample[gr][i][sb][ch] = m; - sample[gr][i][sb][ch] /= step; - sample[gr][i][sb][ch] += table_b4[n][1]; // d - sample[gr][i][sb][ch] *= table_b4[n][0]; // c - sample[gr][i][sb][ch] *= table_b1[scalefactor[sb][ch][gr>>>2]]; - } - } - } - } - for(sb=head.bound;sb>>2]]; - sample[gr][i][sb][1] *= table_b1[scalefactor[sb][1][gr>>>2]]; - code /= step; - } - }else{ - bits = (int)table_b4[n][2]; //bits - step = (int)table_b4[n][3]; //step - for(i=0;i<3;i++){ - m = getbits(bits); - m -= step; - sample[gr][i][sb][0] = m; - sample[gr][i][sb][0] /= step; - sample[gr][i][sb][0] += table_b4[n][1]; // d - sample[gr][i][sb][0] *= table_b4[n][0]; // c - sample[gr][i][sb][1] = sample[gr][i][sb][0]; - sample[gr][i][sb][0] *= table_b1[scalefactor[sb][0][gr>>>2]]; - sample[gr][i][sb][1] *= table_b1[scalefactor[sb][1][gr>>>2]]; - } - } - } + private static void resetArraysLayer1() + { + resetArrays(); - /** downmix */ - if (DOWNMIX && head.channel==2) { //12,3,32,2 - for (sb=0;sb<32;sb++) - for (i=0;i<3;i++) - sample[gr][i][sb][0] = (sample[gr][i][sb][0] + sample[gr][i][sb][1]) * 0.5f; - } + for (int i = 0; i < sample1.length; i++) + for (int j = 0; j < sample1[i].length; j++) + Arrays.fill(sample1[i][j], 0); + for (int i = 0; i < fraction.length; i++) + for (int j = 0; j < fraction[i].length; j++) + Arrays.fill(fraction[i][j], 0); } - /** downmix */ - if (DOWNMIX && head.channel==2) - head.newchannel=1; + private static void resetArrays() + { + // Arrays.fill(U, 0); + // Arrays.fill(W, 0); - else - head.newchannel=2; + // for (int i = 0; i < allocation.length; i++) + // Arrays.fill(allocation[i], 0); - int channel = head.channel; - int last_resample = resample; + // for (int i = 0; i < scfsi.length; i++) + // Arrays.fill(scfsi[i], 0); + + // for (int i = 0; i < scalefactor.length; i++) + // for (int j = 0; j < scalefactor[i].length; j++) + // Arrays.fill(scalefactor[i][j], 0); + } - writeLoop: - while (true) + public static int decode_layer2() throws IOException { - out1.reset(); - out2.reset(); + loadbits(head.framesize - 4 - (head.protection_bit * 2)); - resample = last_resample; + int i,j,k,n,m; + int step; + int bits; + int o1,o2; + int code; + int sb,ch,gr; + + resetArraysLayer2(); + + short[] pcm = new short[2]; + double[] s = new double[2]; + int[] ss = new int[2]; + + final int[] table_nbal; + final int[][] table_alloc; - // subband synthesis - for(gr = 0; gr < 12; gr++) + if (head.ID == 1) { - for(m = 0; m < 3; m++) + if (head.sblimit > 20) + { + table_nbal = table_b2ab_nbal; + table_alloc = table_b2ab; + } + else { - // shifting - work.offset -= 128; - work.offset &= 0x7FF; + table_nbal = table_b2cd_nbal; + table_alloc = table_b2cd; + } + } + else + { + table_nbal = table_MPG2_nbal; + table_alloc = table_MPG2; + } - // matrixing - for(i = 0; i < 64; i++) + /* read allocation */ + for (sb = 0; sb < head.bound; sb++) + for (ch = 0; ch < head.channel; ch++) + allocation[sb][ch] = table_alloc[sb][getbits(table_nbal[sb])]; + + for (sb = head.bound; sb < head.sblimit; sb++) + allocation[sb][0] = allocation[sb][1] = table_alloc[sb][getbits(table_nbal[sb])]; + + /* read scalefactor selection information */ + for (sb = 0; sb < head.sblimit; sb++) + for (ch = 0; ch < head.channel; ch++) + if (allocation[sb][ch] > 0) + scfsi[sb][ch] = getbits(2); + + /* read scalefactor */ + for (sb = 0; sb < head.sblimit; sb++) + { + for (ch = 0; ch < head.channel; ch++) + if (allocation[sb][ch] > 0) { - j = work.offset + i * 2; + scalefactor[sb][ch][0] = getbits(6); - for(ch = 0; ch < head.channel; ch++) + switch(scfsi[sb][ch]) { - work.area[j + ch] = table_Nik[i][0] * sample[gr][m][0][ch]; - - for(k = 1; k < head.sblimit; k++) - work.area[j + ch] += table_Nik[i][k] * sample[gr][m][k][ch]; + case 0: + scalefactor[sb][ch][1] = getbits(6); + scalefactor[sb][ch][2] = getbits(6); + break; + + case 1: + scalefactor[sb][ch][1] = scalefactor[sb][ch][0]; + scalefactor[sb][ch][2] = getbits(6); + break; + + case 2: + scalefactor[sb][ch][2] = scalefactor[sb][ch][1] = scalefactor[sb][ch][0]; + break; + + case 3: + scalefactor[sb][ch][2] = scalefactor[sb][ch][1] = getbits(6); + break; } } + } - // build vector U - for(i = 0; i < 8; i++) + /* read sample and requantize and normalize */ + for (gr = 0; gr < 12; gr++) + { + for (sb = 0; sb < head.bound; sb++) + { + for (ch = 0; ch < head.channel; ch++) { - j = work.offset + i * 256; + n = allocation[sb][ch]; - o1 = j & 0x7FF; - o2 = (j + 192) & 0x7FF; + if (n == 0) + {} // samples are already zero - for(k = 0; k < 32; k++) + else if (n < 4) { - j = (i * 64 + k) * 2; - n = o1 + k * 2; - - U[j] = work.area[n]; - U[j + 1] = work.area[n + 1]; + bits = (int) table_b4[n][2]; //bits + step = (int) table_b4[n][3]; //step + code = getbits(bits); - j = (i * 64 + 32 + k) * 2; - n = o2 + k * 2; + for ( i = 0; i <3 ; i++) + { + m = code % step; + m -= (step-1); + sample[gr][i][sb][ch] = m; + sample[gr][i][sb][ch] /= (step-1); + sample[gr][i][sb][ch] += table_b4[n][1]; // d + sample[gr][i][sb][ch] *= table_b4[n][0]; // c + sample[gr][i][sb][ch] *= table_b1[scalefactor[sb][ch][gr>>>2]]; + code /= step; + } + } + else + { + bits = (int) table_b4[n][2]; //bits + step = (int) table_b4[n][3]; //step - U[j] = work.area[n]; - U[j + 1] = work.area[n + 1]; + for (i = 0; i < 3; i++) + { + m = getbits(bits); + m -= step; + sample[gr][i][sb][ch] = m; + sample[gr][i][sb][ch] /= step; + sample[gr][i][sb][ch] += table_b4[n][1]; // d + sample[gr][i][sb][ch] *= table_b4[n][0]; // c + sample[gr][i][sb][ch] *= table_b1[scalefactor[sb][ch][gr>>>2]]; + } } - } + } + } - // window - for(i = 0; i < 512; i++) - { - j = i * 2; + for (sb = head.bound; sb < head.sblimit; sb++) + { + n = allocation[sb][0]; - W[j] = U[j] * table_b3[i]; - W[j + 1] = U[j + 1] * table_b3[i]; - } + if (n == 0) + {} // samples are already zero - // calc sample - for(i = 0; i < 32; i++) + else if (n < 4) { - j = i * 2; - - s[0] = W[j]; - s[1] = W[j + 1]; + bits = (int) table_b4[n][2]; //bits + step = (int) table_b4[n][3]; //step + code = getbits(bits); - for(k = 1; k < 16; k++) + for (i = 0; i < 3; i++) { - j = (32 * k + i) * 2; + m = code % step; + m -= (step-1); + sample[gr][i][sb][0] = m; + sample[gr][i][sb][0] /= (step - 1); + sample[gr][i][sb][0] += table_b4[n][1]; // d + sample[gr][i][sb][0] *= table_b4[n][0]; // c + sample[gr][i][sb][1] = sample[gr][i][sb][0]; + sample[gr][i][sb][0] *= table_b1[scalefactor[sb][0][gr>>>2]]; + sample[gr][i][sb][1] *= table_b1[scalefactor[sb][1][gr>>>2]]; + code /= step; + } + } + else + { + bits = (int) table_b4[n][2]; //bits + step = (int) table_b4[n][3]; //step - s[0] += W[j]; - s[1] += W[j + 1]; + for (i = 0; i < 3; i++) + { + m = getbits(bits); + m -= step; + sample[gr][i][sb][0] = m; + sample[gr][i][sb][0] /= step; + sample[gr][i][sb][0] += table_b4[n][1]; // d + sample[gr][i][sb][0] *= table_b4[n][0]; // c + sample[gr][i][sb][1] = sample[gr][i][sb][0]; + sample[gr][i][sb][0] *= table_b1[scalefactor[sb][0][gr>>>2]]; + sample[gr][i][sb][1] *= table_b1[scalefactor[sb][1][gr>>>2]]; } + } + } - s[0] *= 32768; - s[1] *= 32768; + /** downmix */ + if (DOWNMIX && head.channel == 2) + { //12,3,32,2 + for (sb = 0; sb < 32; sb++) + for (i = 0; i < 3; i++) + sample[gr][i][sb][0] = (sample[gr][i][sb][0] + sample[gr][i][sb][1]) * 0.5f; + } + } - if (resample == Resample[LEFT_RIGHT>>>3 & 1].length) - resample = 0; +// + if (LEVELSCAN) + { + getFrameLevel(sample); + return 4; + } +// + /** downmix */ + if (DOWNMIX && head.channel == 2) + head.newchannel = 1; - if (head.sampling_frequency == 48000 && (LEFT_RIGHT & 0xC) != 0) //resample - { - double interpolator = Resample[LEFT_RIGHT>>>3 & 1][resample]; + else + head.newchannel = 2; - if (interpolator == -1) - resample++; + int channel = head.channel; + int last_resample = resample; - if (interpolator == 0) - { - resample++; - System.arraycopy(s, 0, saveS, 0, 2); - continue; - } - else if (interpolator > 0) - { - resample++; - double saveS2[] = new double[2]; - System.arraycopy(s, 0, saveS2, 0, 2); - s[0] = interpolator * s[0] + (1 - interpolator) * saveS[0]; - s[1] = interpolator * s[1] + (1 - interpolator) * saveS[1]; - System.arraycopy(saveS2, 0, saveS, 0, 2); - } - } + writeLoop: + while (true) + { + out1.reset(); + out2.reset(); - ss[0] = (int)(s[0] * MULTIPLY); - ss[1] = (int)(s[1] * MULTIPLY); + resample = last_resample; - if(ss[0] > MAX_VALUE) + // subband synthesis + for (gr = 0; gr < 12; gr++) + { + for (m = 0; m < 3; m++) + { + // shifting + work.offset -= 128; + work.offset &= 0x7FF; + + // matrixing + for (i = 0; i < 64; i++) { - if (NORMALIZE) - MULTIPLY = 1.0 * MAX_VALUE / s[0]; + j = work.offset + i * 2; + + for (ch = 0; ch < head.channel; ch++) + { + work.area[j + ch] = table_Nik[i][0] * sample[gr][m][0][ch]; - pcm[0] = (short)MAX_VALUE; + for (k = 1; k < head.sblimit; k++) + work.area[j + ch] += table_Nik[i][k] * sample[gr][m][k][ch]; + } } - else if(ss[0] < -(MAX_VALUE + 1)) + // build vector U + for (i = 0; i < 8; i++) { - if (NORMALIZE) - MULTIPLY = Math.abs(1.0 * -(MAX_VALUE + 1) / s[0]); + j = work.offset + i * 256; - pcm[0] = (short)(-(MAX_VALUE + 1)); - } + o1 = j & 0x7FF; + o2 = (j + 192) & 0x7FF; - else - { - pcm[0] = (short)ss[0]; - } + for (k = 0; k < 32; k++) + { + j = (i * 64 + k) * 2; + n = o1 + k * 2; - if(ss[1] > MAX_VALUE) - { - if (NORMALIZE) - MULTIPLY = 1.0 * MAX_VALUE / s[1]; + U[j] = work.area[n]; + U[j + 1] = work.area[n + 1]; + + j = (i * 64 + 32 + k) * 2; + n = o2 + k * 2; - pcm[1] = (short)MAX_VALUE; + U[j] = work.area[n]; + U[j + 1] = work.area[n + 1]; + } } - else if(ss[1] < -(MAX_VALUE + 1)) + // window + for (i = 0; i < 512; i++) { - if (NORMALIZE) - MULTIPLY = Math.abs(1.0 * -(MAX_VALUE + 1) / s[1]); + j = i * 2; - pcm[1] = (short)(-(MAX_VALUE + 1)); + W[j] = U[j] * table_b3[i]; + W[j + 1] = U[j + 1] * table_b3[i]; } - else + // calc sample + for (i = 0; i < 32; i++) { - pcm[1] = (short)ss[1]; + j = i * 2; + + s[0] = W[j]; + s[1] = W[j + 1]; + + for(k = 1; k < 16; k++) + { + j = (32 * k + i) * 2; + + s[0] += W[j]; + s[1] += W[j + 1]; } - if ((LEFT_RIGHT & 1) != 1) // exchange r<->l - writeSample(out1, pcm[0]); + s[0] *= 32768; + s[1] *= 32768; - else - writeSample(out1, pcm[1]); + if (resample == Resample[LEFT_RIGHT>>>3 & 1].length) + resample = 0; - if (!MONO) - { - if (head.channel == 1) - { - if ((LEFT_RIGHT & 1) != 1) - writeSample(out1, pcm[0]); + if (head.sampling_frequency == 48000 && (LEFT_RIGHT & 0xC) != 0) //resample + { + double interpolator = Resample[LEFT_RIGHT>>>3 & 1][resample]; - else - writeSample(out1, pcm[1]); + if (interpolator == -1) + resample++; - channel = 2; + if (interpolator == 0) + { + resample++; + System.arraycopy(s, 0, saveS, 0, 2); + continue; + } + else if (interpolator > 0) + { + resample++; + double saveS2[] = new double[2]; + System.arraycopy(s, 0, saveS2, 0, 2); + s[0] = interpolator * s[0] + (1 - interpolator) * saveS[0]; + s[1] = interpolator * s[1] + (1 - interpolator) * saveS[1]; + System.arraycopy(saveS2, 0, saveS, 0, 2); + } } - else + ss[0] = (int)(s[0] * MULTIPLY); + ss[1] = (int)(s[1] * MULTIPLY); + + if (ss[0] > MAX_VALUE) { - if ((LEFT_RIGHT & 1) != 1) - writeSample(out1, pcm[1]); + if (NORMALIZE) + MULTIPLY = 1.0 * MAX_VALUE / s[0]; - else - writeSample(out1, pcm[0]); + pcm[0] = (short)MAX_VALUE; } - } - else - { - channel = 1; - writeSample(out2, pcm[1]); - } + else if (ss[0] < -(MAX_VALUE + 1)) + { + if (NORMALIZE) + MULTIPLY = Math.abs(1.0 * -(MAX_VALUE + 1) / s[0]); - if (DOWNSAMPLE) - i++; - } - } - } + pcm[0] = (short)(-(MAX_VALUE + 1)); + } - break; - } + else + { + pcm[0] = (short)ss[0]; + } - head.newchannel = channel; + if (ss[1] > MAX_VALUE) + { + if (NORMALIZE) + MULTIPLY = 1.0 * MAX_VALUE / s[1]; - return 1; -} + pcm[1] = (short)MAX_VALUE; + } + + else if (ss[1] < -(MAX_VALUE + 1)) + { + if (NORMALIZE) + MULTIPLY = Math.abs(1.0 * -(MAX_VALUE + 1) / s[1]); + pcm[1] = (short)(-(MAX_VALUE + 1)); + } -public static int decode_layer1() throws IOException { + else + { + pcm[1] = (short)ss[1]; + } - out1.reset(); - out2.reset(); + if ((LEFT_RIGHT & 1) != 1) // exchange r<->l + writeSample(out1, pcm[0]); - loadbits(head.framesize-4-(head.protection_bit*2)); + else + writeSample(out1, pcm[1]); - short pcm[] = new short[2]; - int i,k,n,gr; - int o1,o2; + if (!MONO) + { + if (head.channel == 1) + { + if ((LEFT_RIGHT & 1) != 1) + writeSample(out1, pcm[0]); + + else + writeSample(out1, pcm[1]); + + channel = 2; + } + + else + { + if ((LEFT_RIGHT & 1) != 1) + writeSample(out1, pcm[1]); + + else + writeSample(out1, pcm[0]); + } + } - int sb,ch; + else + { + channel = 1; + writeSample(out2, pcm[1]); + } - int allocation[][] = new int[32][2]; - int scalefactor[][] = new int[32][2]; - int sample[][][] = new int[12][32][2]; - double fraction[][][] = new double[12][32][2]; + if (DOWNSAMPLE) + i++; + } + } + } - double U[] = new double[1024]; - double W[] = new double[1024]; + break; + } - double s[] = new double[2]; - int ss[] = new int[2]; + head.newchannel = channel; - /* read allocation */ - for(sb=0;sb0){ - scalefactor[sb][ch] = getbits(6); + /* read scalefactor */ + for (sb = 0; sb < head.sblimit; sb++) + for (ch = 0; ch < head.channel; ch++) + { + if(allocation[sb][ch] > 0) + scalefactor[sb][ch][0] = getbits(6); } - } - } - // lay1 s = (s' + 2^(-nb+1) ) * 2^nb / (2^nb-1) , lay2 s = s' * c + d - // read 1 sample of each allocated subband per channel, then continue with next sample for each sb , -> do this ever for 12samples per frame + // lay1 s = (s' + 2^(-nb+1) ) * 2^nb / (2^nb-1) , lay2 s = s' * c + d + // read 1 sample of each allocated subband per channel, then continue with next sample for each sb , -> do this ever for 12samples per frame - /* read sample and requantize and normalize */ - for (gr=0;gr<12;gr++) { - for(sb=0;sb 0) { // samples of interest - sample[gr][sb][ch] = getbits(++n); //read sample (read alloc +1 bit mehr = sample) + /* read sample and requantize and normalize */ + for (gr = 0; gr < 12;gr++) + { + for (sb = 0; sb < head.bound; sb++) + { + for (ch = 0; ch < head.channel; ch++) + { + if ( (n = allocation[sb][ch]) > 0) + { // samples of interest + sample1[gr][sb][ch] = getbits(++n); //read sample (read alloc +1 bit mehr = sample) - if (((sample[gr][sb][ch]>>n-1) &1) != 1) fraction[gr][sb][ch] = -1.0; + if (((sample1[gr][sb][ch]>>n-1) & 1) != 1) + fraction[gr][sb][ch] = -1.0; - fraction[gr][sb][ch] += (double)(sample[gr][sb][ch] & ((1< 0) { // samples of interest - sample[gr][sb][0] = getbits(++n); //read sample - if (((sample[gr][sb][0]>>n-1) &1) != 1) fraction[gr][sb][0] = -1.0; + for (sb = head.bound; sb < head.sblimit; sb++) + { + if ( (n = allocation[sb][0]) > 0) + { // samples of interest + sample1[gr][sb][0] = getbits(++n); //read sample + + if (((sample1[gr][sb][0]>>n-1) &1) != 1) + fraction[gr][sb][0] = -1.0; - fraction[gr][sb][0] += (double)(sample[gr][sb][0] & ((1<>>3 & 1].length) - resample=0; + /* window */ + for (i = 0; i < 512; i++) + { + W[i * 2 + 0] = U[i * 2 + 0] * table_b3[i]; + W[i * 2 + 1] = U[i * 2 + 1] * table_b3[i]; + } - if (head.sampling_frequency == 48000 && (LEFT_RIGHT & 0xC) != 0) //resample + /* calc sample */ + for (i = 0; i < 32; i++) { - double interpolator = Resample[LEFT_RIGHT>>>3 & 1][resample]; - if (interpolator == -1) - resample++; + s[0] = W[i * 2 + 0]; + s[1] = W[i * 2 + 1]; - if (interpolator == 0) + for (k = 1; k < 16; k++) { - resample++; - System.arraycopy(s, 0, saveS, 0, 2); - continue; + s[0] += W[(32 * k + i) * 2 + 0]; + s[1] += W[(32 * k + i) * 2 + 1]; } - else if (interpolator > 0) + + //DM10042004 081.7 int01 changed+ + s[0] *= 32768; + s[1] *= 32768; + + //DM14052004 081.7 int02 changed++ + if (resample == Resample[LEFT_RIGHT>>>3 & 1].length) + resample=0; + + if (head.sampling_frequency == 48000 && (LEFT_RIGHT & 0xC) != 0) //resample { - resample++; - double saveS2[] = new double[2]; - System.arraycopy(s, 0, saveS2, 0, 2); - s[0] = interpolator * s[0] + (1 - interpolator) * saveS[0]; - s[1] = interpolator * s[1] + (1 - interpolator) * saveS[1]; - System.arraycopy(saveS2, 0, saveS, 0, 2); + double interpolator = Resample[LEFT_RIGHT>>>3 & 1][resample]; + + if (interpolator == -1) + resample++; + + if (interpolator == 0) + { + resample++; + System.arraycopy(s, 0, saveS, 0, 2); + continue; + } + else if (interpolator > 0) + { + resample++; + double saveS2[] = new double[2]; + System.arraycopy(s, 0, saveS2, 0, 2); + s[0] = interpolator * s[0] + (1 - interpolator) * saveS[0]; + s[1] = interpolator * s[1] + (1 - interpolator) * saveS[1]; + System.arraycopy(saveS2, 0, saveS, 0, 2); + } } - } - //DM14052004 081.7 int02 changed++ + //DM14052004 081.7 int02 changed++ - ss[0] = (int)(s[0] * MULTIPLY); - ss[1] = (int)(s[1] * MULTIPLY); + ss[0] = (int)(s[0] * MULTIPLY); + ss[1] = (int)(s[1] * MULTIPLY); - if(ss[0] > MAX_VALUE) - { - if (NORMALIZE) - MULTIPLY = 1.0 * MAX_VALUE / s[0]; + if(ss[0] > MAX_VALUE) + { + if (NORMALIZE) + MULTIPLY = 1.0 * MAX_VALUE / s[0]; - pcm[0] = (short)MAX_VALUE; - } - else if(ss[0] < -(MAX_VALUE+1)) - { - if (NORMALIZE) - MULTIPLY = Math.abs(1.0 * -(MAX_VALUE+1) / s[0]); + pcm[0] = (short)MAX_VALUE; + } + else if(ss[0] < -(MAX_VALUE+1)) + { + if (NORMALIZE) + MULTIPLY = Math.abs(1.0 * -(MAX_VALUE + 1) / s[0]); - pcm[0] = (short)(-(MAX_VALUE+1)); - } - else - { - pcm[0] = (short)ss[0]; - } + pcm[0] = (short)(-(MAX_VALUE+1)); + } + else + { + pcm[0] = (short)ss[0]; + } - if(ss[1] > MAX_VALUE) - { - if (NORMALIZE) - MULTIPLY = 1.0 * MAX_VALUE / s[1]; + if(ss[1] > MAX_VALUE) + { + if (NORMALIZE) + MULTIPLY = 1.0 * MAX_VALUE / s[1]; - pcm[1] = (short)MAX_VALUE; - } - else if(ss[1] < -(MAX_VALUE+1)) - { - if (NORMALIZE) - MULTIPLY = Math.abs(1.0 * -(MAX_VALUE+1) / s[1]); + pcm[1] = (short)MAX_VALUE; + } + else if(ss[1] < -(MAX_VALUE+1)) + { + if (NORMALIZE) + MULTIPLY = Math.abs(1.0 * -(MAX_VALUE+1) / s[1]); - pcm[1] = (short)(-(MAX_VALUE+1)); - } - else - { - pcm[1] = (short)ss[1]; - } - //DM10042004 081.7 int01 changed- + pcm[1] = (short)(-(MAX_VALUE+1)); + } + else + { + pcm[1] = (short)ss[1]; + } + //DM10042004 081.7 int01 changed- - if ((LEFT_RIGHT & 1) != 1) - writeSample(out1, pcm[0]); + if ((LEFT_RIGHT & 1) != 1) + writeSample(out1, pcm[0]); - else - writeSample(out1, pcm[1]); + else + writeSample(out1, pcm[1]); - if (!MONO) - { - if (head.channel==1) - { - if ((LEFT_RIGHT & 1) != 1) - writeSample(out1, pcm[0]); + if (!MONO) + { + if (head.channel==1) + { + if ((LEFT_RIGHT & 1) != 1) + writeSample(out1, pcm[0]); - else - writeSample(out1, pcm[1]); + else + writeSample(out1, pcm[1]); - channel=2; - } - else + channel = 2; + } + else { - if ((LEFT_RIGHT & 1) != 1) - writeSample(out1, pcm[1]); + if ((LEFT_RIGHT & 1) != 1) + writeSample(out1, pcm[1]); - else - writeSample(out1, pcm[0]); + else + writeSample(out1, pcm[0]); + } } - } - else - channel=1; + else + channel = 1; - if (DOWNSAMPLE) - i++; + if (DOWNSAMPLE) + i++; + } } - } - head.newchannel = channel; + head.newchannel = channel; - return 1; -} + return 1; + } /** * @@ -2018,7 +2177,8 @@ expon = 0; hiMant = 0; loMant = 0; - } + } + else { for (int a = 1; a < 32; a++) @@ -2035,6 +2195,7 @@ hiMant = 0; loMant = 0; /* infinity */ } + else { /* Finite */ expon += 16382; @@ -2153,7 +2314,7 @@ /** * */ - public static byte[] decodeArray(byte[] data) throws IOException + public static byte[] decodeArray(byte[] data) { buf = data; BufferPos = 0; @@ -2173,18 +2334,23 @@ if (head.newchannel == 0) head.newchannel = DOWNMIX ? 1 : 2; - switch (ERROR_CODE1) - { - case 1: - silentSamples(head.new_sampling_frequency); - break; + try { + switch (ERROR_CODE1) + { + case 1: + silentSamples(head.new_sampling_frequency); + break; - case 2: - ERROR_CODE = decode_layer2(); - break; + case 2: + ERROR_CODE = decode_layer2(); + break; - case 3: - ERROR_CODE = decode_layer1(); + case 3: + ERROR_CODE = decode_layer1(); + } + + } catch (Exception e) { + } if (ERROR_CODE == 1) @@ -2246,16 +2412,16 @@ { amp = (1.0 * (fade_mode == 2 ? (load - i) : i)) / load; - for (int ch = 0, sample; ch < head.newchannel; ch++) + for (int ch = 0, _sample; ch < head.newchannel; ch++) { - sample = (0xFF & array[i])<<8 | (0xFF & array[i + 1]); - sample = littleEndian(sample, 2); - sample = (0x8000 & sample) != 0 ? (0xFFFF0000 | sample) : sample; - sample = (int) (amp * sample); - sample = littleEndian(sample, 2); + _sample = (0xFF & array[i])<<8 | (0xFF & array[i + 1]); + _sample = littleEndian(_sample, 2); + _sample = (0x8000 & _sample) != 0 ? (0xFFFF0000 | _sample) : _sample; + _sample = (int) (amp * _sample); + _sample = littleEndian(_sample, 2); - array[i] = (byte) (0xFF & sample>>8); - array[i + 1] = (byte) (0xFF & sample); + array[i] = (byte) (0xFF & _sample>>8); + array[i + 1] = (byte) (0xFF & _sample); i += bytes_per_sample; } @@ -2264,5 +2430,43 @@ pcm_file.seek(seek_position); pcm_file.write(array); } + + /** + * + */ + private static void getFrameLevel(double[][][][] _sample) + { + double[] sample_level = new double[2]; + + for (int gr = 0; gr < 12; gr++) + for (int sb = 0; sb < 32; sb++) + for (int i = 0; i < 3; i++) + for(int ch = 0; ch < 2; ch++) + if (Math.abs(_sample[gr][i][sb][ch]) > sample_level[ch]) + sample_level[ch] = Math.abs(_sample[gr][i][sb][ch]); + + out1.reset(); + out1.write((byte) (sample_level[0] * 100.0)); + out1.write((byte) (sample_level[1] * 100.0)); + } + + /** + * + */ + private static void getFrameLevel(int[][][] _sample) + { + int[] sample_level = new int[2]; + + for (int gr = 0; gr < 12; gr++) + for (int sb = 0; sb < 32; sb++) + for(int ch = 0; ch < 2; ch++) + if (Math.abs(_sample[gr][sb][ch]) > sample_level[ch]) + sample_level[ch] = Math.abs(_sample[gr][sb][ch]); + + out1.reset(); + out1.write((byte) (sample_level[0] * 100.0)); + out1.write((byte) (sample_level[1] * 100.0)); + } + } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/RIFFHeader.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/RIFFHeader.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/audio/RIFFHeader.java 2005-12-17 21:13:04.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/audio/RIFFHeader.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,177 +0,0 @@ -/* - * @(#)RIFFHeader.java - create a RIFF Header for nonPCM data - * - * Copyright (c) 2002-2005 by dvb.matt, All Rights Reserved. - * - * This file is part of ProjectX, a free Java based demux utility. - * By the authors, ProjectX is intended for educational purposes only, - * as a non-commercial test project. - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -package net.sourceforge.dvb.projectx.audio; - -public class RIFFHeader extends Object { - - byte[] riffacm = { 82, 73, 70, 70, 0, 0, 0, 0, 87, 65, 86, 69,102,109,116, 32, - 30, 0, 0, 0, 85, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 12, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, - 113, 5,102, 97, 99,116, 4, 0, 0, 0, 0, 0, 0, 0,100, 97, - 116, 97, 0, 0, 0, 0 }; - - byte[] riffbwf = { 82, 73, 70, 70, 0, 0, 0, 0, 87, 65, 86, 69,102,109,116, 32, - 40, 0, 0, 0, 80, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 22, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 97, 99,116, - 4, 0, 0, 0, 0, 0, 0, 0,100, 97,116, 97, 0, 0, 0, 0 }; - - byte[] riffac3 = { 82, 73, 70, 70, 0, 0, 0, 0, 87, 65, 86, 69,102,109,116, 32, - 18, 0, 0, 0, 0, 32, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 0,100, 97,116, 97, 0, 0, 0, 0, }; - - long Samples=0, SampleCount=0; - - - public void RiffData(int[] riffdata) { - - Samples += riffdata[2]; - SampleCount++; - - int nSamplesPerSec = (255&riffbwf[24]) | (255&riffbwf[24+1])<<8 | (255&riffbwf[24+2])<<16 | (255&riffbwf[24+3])<<24; - int dwHeadBitrate = (255&riffbwf[40]) | (255&riffbwf[40+1])<<8 | (255&riffbwf[40+2])<<16 | (255&riffbwf[40+3])<<24; - int nBlockAlign = (255&riffbwf[32]) | (255&riffbwf[32+1])<<8; - - if ( nBlockAlign == 0 ) //nBlockAlign - for (int a=0;a<2;a++) - riffacm[44+a] = riffbwf[32+a] = (byte)(255 & riffdata[8]>>>(a*8)); - else if ( nBlockAlign != 1 && nBlockAlign != riffdata[8] ) { - riffbwf[32] = 1; - riffbwf[32+1] = 0; - } - - if ( nSamplesPerSec == 1 ) //nSamplesPerSec - for (int a=0;a<4;a++) - riffacm[24+a] = riffbwf[24+a] = (byte)(255 & riffdata[2]>>>(a*8)); - else if ( nSamplesPerSec != 0 && nSamplesPerSec != riffdata[2] ) - for (int a=0;a<4;a++) - riffacm[24+a] = riffbwf[24+a] = 0; - - if ( dwHeadBitrate == 1 ) //dwHeadBitrate - for (int a=0;a<4;a++) - riffbwf[40+a] = (byte)(255 & riffdata[6]>>>(a*8)); - else if ( dwHeadBitrate != 0 && dwHeadBitrate != riffdata[6] ) - for (int a=0;a<4;a++) - riffbwf[40+a] = 0; - - if ( riffdata[3]==2 ) // fwHeadModeExt - riffbwf[46] |= (byte)riffdata[5]; - - if ( riffbwf[22]==1 ) // nChannels - riffacm[22] = riffbwf[22] = (byte)riffdata[4]; - - riffbwf[38] |= (byte)riffdata[1]; // fwHeadLayer - riffbwf[44] |= (byte)riffdata[3]; // fwHeadMode - riffbwf[48] |= (byte)riffdata[7]; // wHeadEmphasis - riffbwf[50] |= (byte)riffdata[0]; // fwHeadFlags - - } - - - public void AC3RiffData(int[] riffdata) { - - Samples += riffdata[2]; - SampleCount++; - - int nSamplesPerSec = (255&riffac3[24]) | (255&riffac3[24+1])<<8 | (255&riffac3[24+2])<<16 | (255&riffac3[24+3])<<24; - int nBlockAlign = (255&riffac3[32]) | (255&riffac3[32+1])<<8; - - if ( nBlockAlign == 0 ) //nBlockAlign - for (int a=0;a<2;a++) - riffac3[32+a] = (byte)(255 & riffdata[8]>>>(a*8)); - else if ( nBlockAlign != 1 && nBlockAlign != riffdata[8] ) { - riffac3[32] = 1; - riffac3[32+1] = 0; - } - - if ( nSamplesPerSec == 1 ) //nSamplesPerSec - for (int a=0;a<4;a++) - riffac3[24+a] = (byte)(255 & riffdata[2]>>>(a*8)); - else if ( nSamplesPerSec != 0 && nSamplesPerSec != riffdata[2] ) - for (int a=0;a<4;a++) - riffac3[24+a] = 0; - - if ( (0xFF&riffac3[22]) < riffdata[4] ) // nChannels - riffac3[22] = (byte)riffdata[4]; - - } - - /** placeholder **/ - public byte[] ACMnull() { - return new byte[70]; - } - public byte[] BWFnull() { - return new byte[80]; - } - public byte[] AC3null() { - return new byte[46]; - } - - /** update header **/ - public byte[] ACM() { - return riffacm; - } - public byte[] BWF() { - return riffbwf; - } - public byte[] AC3() { - return riffac3; - } - - public void Length(long filelength, long timelength) { - int lengthACM = (int)filelength-70; - int lengthBWF = (int)filelength-80; - int lengthAC3 = (int)filelength-46; - - for (int a=0;a<4;a++) { - riffacm[4+a] = (byte)(255 & (lengthACM+62)>>>(a*8)); - riffbwf[4+a] = (byte)(255 & (lengthBWF+72)>>>(a*8)); - riffac3[4+a] = (byte)(255 & (lengthAC3+38)>>>(a*8)); - riffacm[66+a] = (byte)(255 & lengthACM>>>(a*8)); - riffbwf[76+a] = (byte)(255 & lengthBWF>>>(a*8)); - riffac3[42+a] = (byte)(255 & lengthAC3>>>(a*8)); - } - - if (filelength>100) { - int time = (int)timelength; - int nAvgBytePerSecACM = (int)(1000L*lengthACM / time ); - int nAvgBytePerSecBWF = (int)(1000L*lengthBWF / time ); - int nAvgBytePerSecAC3 = (int)(1000L*lengthAC3 / time ); - - for (int a=0;a<4;a++) { - riffacm[28+a] = (byte)(255 & nAvgBytePerSecACM>>>(a*8)); - riffbwf[28+a] = (byte)(255 & nAvgBytePerSecBWF>>>(a*8)); - riffac3[28+a] = (byte)(255 & nAvgBytePerSecAC3>>>(a*8)); - } - - int fact = (int)(1L * (Samples/SampleCount) * time /1000); - for (int a=0;a<4;a++) - riffacm[58+a] = riffbwf[68+a] = (byte)(255 & fact>>>(a*8)); - } - } -} - diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Common.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Common.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Common.java 2006-03-31 00:04:34.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Common.java 2011-03-27 12:46:38.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)Common.java - carries various stuff, the center class * - * Copyright (c) 2004-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2004-2011 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -59,17 +59,12 @@ import net.sourceforge.dvb.projectx.audio.AudioFormat; -import net.sourceforge.dvb.projectx.common.Resource; -import net.sourceforge.dvb.projectx.common.Keys; -import net.sourceforge.dvb.projectx.common.JobCollection; -import net.sourceforge.dvb.projectx.common.Settings; -import net.sourceforge.dvb.projectx.common.GuiInterface; - import net.sourceforge.dvb.projectx.parser.CommonParsing; import net.sourceforge.dvb.projectx.parser.Scan; import net.sourceforge.dvb.projectx.parser.MainProcess; import net.sourceforge.dvb.projectx.subtitle.Subpicture; +import net.sourceforge.dvb.projectx.subtitle.Teletext; import net.sourceforge.dvb.projectx.video.MpvDecoder; @@ -86,8 +81,8 @@ public final class Common extends Object { /* main version index */ - private static String version_name = "ProjectX 0.90.4.00"; - private static String version_date = "30.03.2006"; + private static String version_name = "ProjectX 0.91.0.00"; + private static String version_date = "31.03.2011"; private static String line_separator = System.getProperty("line.separator"); @@ -98,6 +93,7 @@ private static int ProcessedPercent = 0; private static int ErrorCount = 0; + private static int FileID = 0; private static boolean showGUI = false; private static boolean runningCLI = false; @@ -127,6 +123,7 @@ private static DateFormat time_format_2 = new SimpleDateFormat("HH:mm:ss:SSS"); private static DateFormat time_format_3 = new SimpleDateFormat("dd.MM.yy HH:mm"); private static DateFormat time_format_4 = new SimpleDateFormat("HH:mm:ss"); + private static DateFormat time_format_5 = new SimpleDateFormat("yyyyMMddHHmm"); private static byte temp_byte; @@ -138,11 +135,16 @@ private static int SplitPart = 0; private static String StatusString = null; + /* preview autom. buffer */ + private static int LastPreviewBitrate = 1875000; + /* linkage to x.swing components */ private static GuiInterface guiInterface = null; private static Subpicture subpicture = null; + private static Teletext teletext = null; + private static Scan scan = null; private static MpvDecoder mpvdecoder = null; @@ -235,6 +237,7 @@ scan = new Scan(); subpicture = new Subpicture(); + teletext = new Teletext(); mpvdecoder = new MpvDecoder(); subpicture_colormodels = loadColorModels(); } @@ -316,6 +319,14 @@ /** * */ + public static Teletext getTeletextClass() + { + return teletext; + } + + /** + * + */ public static Scan getScanClass() { return scan; @@ -383,6 +394,20 @@ /** * */ + public static void killMainProcess() + { + if (!isRunningProcess()) + return; + + breakMainProcess(); + + mainprocess.stop(); + mainprocess = null; + } + + /** + * + */ public static void setRunningProcess(boolean b) { runningProcess = b; @@ -739,9 +764,9 @@ /** * */ - public static String adaptString(int str, int len) + public static String adaptString(int value, int len) { - return adaptString(String.valueOf(str), len); + return adaptString(String.valueOf(value), len); } /** @@ -780,6 +805,15 @@ /** * */ + public static String formatTime_2a(long time_value) + { + time_format_2.setTimeZone(TimeZone.getTimeZone("GMT+0:00")); + return time_format_2.format(new Date(time_value)); + } + + /** + * + */ public static String formatTime_3(long time_value) { //time_format_3.setTimeZone(TimeZone.getTimeZone("GMT+0:00")); @@ -798,6 +832,15 @@ /** * */ + public static String formatTime_5(long time_value) + { + time_format_5.setTimeZone(TimeZone.getDefault()); + return time_format_5.format(new Date(time_value)); + } + + /** + * + */ public static Object[] getColorModels() { return subpicture_colormodels.toArray(); @@ -935,7 +978,7 @@ AC3list.add(ac3data); - a += audio.Size; + a += audio.getSize(); frame_counter++; } @@ -1080,7 +1123,7 @@ } if (MaxLog && ErrorCount == 500) - msg += getLineSeparator() + Resource.getString("all.msg.error.max"); + msg += getLineSeparator() + getLineSeparator() + Resource.getString("all.msg.error.max") + getLineSeparator(); if (TimeLog) msg = "[" + formatTime_1(System.currentTimeMillis()) + "] " + msg; @@ -1215,6 +1258,7 @@ case CommonParsing.ACTION_TO_TS: cmdl = getSettings().getProperty(Keys.KEY_PostCommands_Cmd8); + break; default: return; @@ -1277,9 +1321,16 @@ try { - Runtime.getRuntime().exec(arguments); + Process subprocess = Runtime.getRuntime().exec(commandline); // anyone has told that works better + // Process subprocess = Runtime.getRuntime().exec(arguments); + + if (getSettings().getBooleanProperty(Keys.KEY_PostProcessCompletion)) + { + setMessage("-> waiting for completion of subprocess.."); + setMessage("-> returncode of subprocess: " + subprocess.waitFor()); + } - } catch (IOException re) { + } catch (Exception re) { setExceptionMessage(re); } @@ -1667,4 +1718,42 @@ return (arraylist.isEmpty() ? new Object[0] : arraylist.toArray()); } + /** + * + */ + public static void setLastPreviewBitrate(int value) + { + LastPreviewBitrate = value / 8; + } + + /** + * + */ + public static int getPreviewBufferValue() + { + String str = getSettings().getProperty(Keys.KEY_PreviewBuffer); + int buffervalue = LastPreviewBitrate; + + try { + if (!str.equals("auto")) + buffervalue = Integer.parseInt(str); + + } catch (Exception e) {} + + if (buffervalue < 128000 || buffervalue > 5120000) + LastPreviewBitrate = buffervalue = 1875000; + + return buffervalue; + } + + /** + * + */ + public static String getNewFileID() + { + FileID++; + + return String.valueOf(FileID); + } + } \ No newline at end of file diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/GuiInterfaceIF.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/GuiInterfaceIF.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/GuiInterfaceIF.java 2005-12-17 22:04:04.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/GuiInterfaceIF.java 2008-09-10 17:15:22.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)GuiInterfaceIF.java * - * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -68,6 +68,7 @@ public void showChapterIcon(Object[] obj, Object list); public void updatePreviewPixel(); public void repaintPicturePanel(); + public byte[] editGOP(byte[] data, long[][] pts_indices); } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/GuiInterface.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/GuiInterface.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/GuiInterface.java 2005-12-17 22:03:56.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/GuiInterface.java 2008-09-28 09:54:04.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)GuiInterface.java * - * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -59,6 +59,8 @@ } } catch (Exception e) { + //System.out.println(e.toString()); + Common.setExceptionMessage(e); // no gui class found } } @@ -441,5 +443,16 @@ if (isAvailable()) impl.repaintPicturePanel(); } + + /** + * + */ + public byte[] editGOP(byte[] data, long[][] pts_indices) + { + if (isAvailable()) + return impl.editGOP(data, pts_indices); + + return data; + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/JobCollection.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/JobCollection.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/JobCollection.java 2006-01-30 03:36:04.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/JobCollection.java 2008-04-20 08:28:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)JobCollection.java - all about a collection * - * Copyright (c) 2005-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -27,7 +27,6 @@ package net.sourceforge.dvb.projectx.common; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Hashtable; @@ -39,20 +38,12 @@ import java.io.FileOutputStream; import java.io.ByteArrayInputStream; -import net.sourceforge.dvb.projectx.common.Common; -import net.sourceforge.dvb.projectx.common.Keys; -import net.sourceforge.dvb.projectx.common.Resource; -import net.sourceforge.dvb.projectx.common.JobProcessing; -import net.sourceforge.dvb.projectx.common.Settings; - import net.sourceforge.dvb.projectx.xinput.XInputFile; import net.sourceforge.dvb.projectx.parser.Gop; import net.sourceforge.dvb.projectx.parser.GopArray; import net.sourceforge.dvb.projectx.parser.CommonParsing; -//import net.sourceforge.dvb.projectx.thirdparty.D2V; -//import net.sourceforge.dvb.projectx.thirdparty.Chapters; /** * saves all stuff of a collection @@ -231,7 +222,12 @@ if (index < 0) index = input_files.size(); - input_files.add(index, input); + XInputFile xInputFile = ((XInputFile) input).getNewInstance(); + + xInputFile.setFileID(Common.getNewFileID()); + + input_files.add(index, xInputFile); + // input_files.add(index, input); determinePrimaryFileSegments(); } @@ -433,7 +429,7 @@ { String str = output_directory; - if (str == null || str.length() == 0) + if (str == null || str.length() == 0 || str.startsWith("[res]")) { if (input_files.size() == 0) return ""; @@ -455,20 +451,19 @@ */ private boolean checkWriteAccess(String path) { - File _path = new File(path); - String _file = path + getFileSeparator() + "~$pjx$.tmp"; - - if (path == null || !_path.exists()) - return false; - try { + File _path = new File(path); + String _file = path + getFileSeparator() + "~$pjx$.tmp"; + + if (path == null || !_path.exists()) + return false; RandomAccessFile raf = new RandomAccessFile(_file, "rw"); raf.close(); new File(_file).delete(); - } catch (IOException e) { + } catch (Exception ex2) { return false; } @@ -823,9 +818,17 @@ /** * */ + public int getSecondaryInputFileSegments() + { + return (getInputFilesCount() - getPrimaryInputFileSegments()); + } + + /** + * + */ public int[] getCutImage(Object obj) { - if (cut_images.containsKey(obj)) + if (obj != null && cut_images.containsKey(obj)) return ((int[]) cut_images.get(obj)); return null; @@ -857,23 +860,25 @@ { int size = getInputFilesCount(); - Object[][] table = new Object[size > 5 ? size : 5][11]; + Object[][] table = new Object[size > 10 ? size : 10][12]; for (int i = 0; i < size; i++) { XInputFile xInputFile = (XInputFile) getInputFile(i); - table[i][0] = new Integer(i); + table[i][0] = xInputFile.getFileID(); + // table[i][0] = xInputFile.getStreamInfo().getFileID(); table[i][1] = xInputFile.getStreamInfo().getFileSourceBase(); - table[i][2] = xInputFile.getName(); - table[i][3] = (xInputFile.getParent().length() > 0 ? xInputFile.getParent() : xInputFile.toString().substring(0, xInputFile.toString().indexOf(xInputFile.getName()))); - table[i][4] = String.valueOf(xInputFile.length() / 1048576L) + " MB"; - table[i][5] = Common.formatTime_3(xInputFile.lastModified()); - table[i][6] = new Integer(xInputFile.getStreamInfo().getVideoStreams().length); - table[i][7] = new Integer(xInputFile.getStreamInfo().getAudioStreams().length); - table[i][8] = new Integer(xInputFile.getStreamInfo().getTeletextStreams().length); - table[i][9] = new Integer(xInputFile.getStreamInfo().getSubpictureStreams().length); - table[i][10] = xInputFile.getStreamInfo().getFileType(); + table[i][2] = i < getPrimaryInputFileSegments() ? new Integer(i) : new Integer(-i); + table[i][3] = xInputFile.getName(); + table[i][4] = (xInputFile.getParent().length() > 0 ? xInputFile.getParent() : xInputFile.toString().substring(0, xInputFile.toString().indexOf(xInputFile.getName()))); + table[i][5] = String.valueOf(xInputFile.length() / 1048576L) + " MB"; + table[i][6] = Common.formatTime_3(xInputFile.lastModified()); + table[i][7] = new Integer(xInputFile.getStreamInfo().getVideoStreams().length); + table[i][8] = new Integer(xInputFile.getStreamInfo().getAudioStreams().length); + table[i][9] = new Integer(xInputFile.getStreamInfo().getTeletextStreams().length); + table[i][10] = new Integer(xInputFile.getStreamInfo().getSubpictureStreams().length); + table[i][11] = xInputFile.getStreamInfo().getFileType(); } return table; @@ -919,7 +924,7 @@ str += line_separator; str += Resource.getString("JobCollection.PrimaryFileSegments") + " " + getPrimaryInputFileSegments(); str += line_separator; - str += Resource.getString("JobCollection.SecondaryFiles") + " " + (getInputFilesCount() - getPrimaryInputFileSegments()); + str += Resource.getString("JobCollection.SecondaryFiles") + " " + getSecondaryInputFileSegments(); str += line_separator; str += Resource.getString("JobCollection.Cutpoints") + " " + getCutpointCount(); str += line_separator; @@ -935,6 +940,14 @@ } /** + * + */ + public boolean hasSettings() + { + return (settings != null); + } + + /** * routing returning settings */ public Settings getSettings() @@ -948,13 +961,27 @@ /** * collection specific settings */ - public void setSettings(Settings _settings) throws IOException + public void setSettings(Settings _settings) { if (isActive()) return; + else if (_settings == null) + { + settings = null; + return; + } + settings = new Settings(); - settings.loadProperties(new ByteArrayInputStream(_settings.storeProperties())); + + try { + settings.loadProperties(new ByteArrayInputStream(_settings.storeProperties())); + + } catch (IOException e) { + + settings = null; + Common.setExceptionMessage(e); + } } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/JobProcessing.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/JobProcessing.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/JobProcessing.java 2006-01-30 03:38:32.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/JobProcessing.java 2009-10-17 08:46:20.000000000 +0000 @@ -29,19 +29,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - -import java.io.File; -import java.io.RandomAccessFile; -import java.io.PrintStream; -import java.io.PrintWriter; -import java.io.IOException; -import java.io.FileOutputStream; - -import net.sourceforge.dvb.projectx.common.Keys; -import net.sourceforge.dvb.projectx.common.Resource; -import net.sourceforge.dvb.projectx.common.JobCollection; - -import net.sourceforge.dvb.projectx.xinput.XInputFile; +import java.util.Hashtable; import net.sourceforge.dvb.projectx.parser.Gop; import net.sourceforge.dvb.projectx.parser.GopArray; @@ -68,8 +56,14 @@ private List TempFileList; private List InfoAtEnd; private List CellTimesList; +// + private Hashtable StreamObjects; + private Object[] AudioStreamInfo; +// + private int[] stream_number; private int[] clv; + private int SourceVideoFrameNumber; private int ExportedVideoFrameNumber; private int FileNumber; @@ -134,7 +128,11 @@ TempFileList = new ArrayList(); InfoAtEnd = new ArrayList(); CellTimesList = new ArrayList(); +// + StreamObjects = new Hashtable(); +// clv = new int[10]; + stream_number = new int[10]; gop = new Gop(collection); gop_array = new GopArray(); @@ -191,7 +189,10 @@ InfoAtEnd = null; CellTimesList = null; clv = null; - + stream_number = null; +// + StreamObjects = null; +// gop = null; gop_array = null; d2v = null; @@ -307,6 +308,14 @@ /** * */ + public void addCellTime(int value) + { + addCellTime(String.valueOf(value)); + } + + /** + * + */ public int[] getStatusVariables() { return clv; @@ -323,6 +332,22 @@ /** * */ + public int[] getStreamNumbers() + { + return stream_number; + } + + /** + * + */ + public void clearStreamNumbers() + { + Arrays.fill(stream_number, 0); + } + + /** + * + */ public String[] getStatusStrings() { return VBASIC; @@ -964,4 +989,49 @@ return savedOutputDirectory; } + /** + * + */ + public Hashtable getStreamObjects() + { + return StreamObjects; + } + + /** + * + */ + public void setAudioStreamInfo(Object[] obj) + { + AudioStreamInfo = obj; + } + + /** + * + */ + public String getAudioStreamLanguage(int pid) + { + String str = ""; + String str1 = ""; + + if (AudioStreamInfo == null) + return str; + + for (int i = 0, j = 0, k = 0; i < AudioStreamInfo.length; i++) + { + str1 = AudioStreamInfo[i].toString(); + + if (str1.indexOf(Common.adaptString(Integer.toHexString(pid).toUpperCase(), 4)) < 0) + continue; + + j = str1.indexOf("{"); + k = str1.indexOf("}"); + + if (j > 0 && k > j) + str = "_" + str1.substring(j + 1, k); + + break; + } + + return str; + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Keys.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Keys.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Keys.java 2006-03-29 01:53:12.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Keys.java 2009-10-31 17:45:48.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)Keys.java - static, fixed keys * - * Copyright (c) 2005 by dvb.matt, All rights reserved. + * Copyright (c) 2005-2009 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -48,8 +48,8 @@ public final static String[] KEY_FtpServer_Commands = { "FtpServer.Commands", "" }; public final static String[] KEY_WindowPositionMain_X = { "WindowPosition.Main.X", "50" }; public final static String[] KEY_WindowPositionMain_Y = { "WindowPosition.Main.Y", "50" }; - public final static String[] KEY_WindowPositionMain_Width = { "WindowPosition.Main.Width", "906" }; - public final static String[] KEY_WindowPositionMain_Height = { "WindowPosition.Main.Height", "652" }; + public final static String[] KEY_WindowPositionMain_Width = { "WindowPosition.Main.Width", "852" }; //866 + public final static String[] KEY_WindowPositionMain_Height = { "WindowPosition.Main.Height", "632" }; //626 /** * PostCommands @@ -90,6 +90,8 @@ public final static String[] KEY_simpleMPG = { "MainPanel.simpleMPG", "0" }; //cbox[14] public final static String[] KEY_enhancedPES = { "MainPanel.enhancedPES", "0" }; //cbox[14] public final static String[] KEY_useAutoPidFilter = { "MainPanel.useAutoPidFilter", "0" }; + public final static String[] KEY_PostProcessCompletion = { "MainPanel.PostProcessCompletion", "0" }; + public final static String[] KEY_useGOPEditor = { "MainPanel.useGOPEditor", "0" }; /** * LogWindowPanel @@ -114,6 +116,7 @@ public final static String[] KEY_ExportPanel_Export_Overlap = { "ExportPanel.Overlap", "0" }; public final static String[] KEY_ExportPanel_createSubDirNumber = { "ExportPanel.createSubDirNumber", "0" }; //cbox[2] public final static String[] KEY_ExportPanel_createSubDirName = { "ExportPanel.createSubDirName", "0" }; //cbox[71] + public final static String[] KEY_ExportPanel_createSubDirVdr = { "ExportPanel.createSubDirVdr", "0" }; public final static String[] KEY_ExportPanel_SplitSize_Value = { "ExportPanel.SplitSize.Value", "650" }; //combox[2] public final static String[] KEY_ExportPanel_Overlap_Value = { "ExportPanel.Overlap.Value", "0" }; //combox[25] public final static String[] KEY_ExportPanel_Infoscan_Value = { "ExportPanel.Infoscan.Value", "5" }; //combox[21] @@ -143,7 +146,8 @@ public final static String[] KEY_PreviewBuffer = { "OptionPanel.PreviewBuffer", "1024000" }; //combobox[38] public final static String[] KEY_holdStreamInfoOnOSD = { "OptionPanel.holdStreamInfoOnOSD", "0" }; public final static String[] KEY_OptionPanelIndex = { "OptionPanel.PanelIndex", "0" }; - public final static String[] KEY_additionalInputBuffer = { "OptionPanel.additionalInputBuffer", "1" }; //test + public final static String[] KEY_additionalInputBuffer = { "OptionPanel.additionalInputBuffer", "0" }; //test + public final static String[] KEY_enableHDDemux = { "OptionPanel.enableHDDemux", "0" }; /** * SpecialPanel @@ -156,15 +160,21 @@ public final static String[] KEY_TS_joinPackets = { "SpecialPanel.TS.joinPackets", "1" }; //cbox[53], true public final static String[] KEY_TS_HumaxAdaption = { "SpecialPanel.TS.HumaxAdaption", "0" }; //cbox[70] public final static String[] KEY_TS_FinepassAdaption = { "SpecialPanel.TS.FinepassAdaption", "0" }; + public final static String[] KEY_TS_JepssenAdaption = { "SpecialPanel.TS.JepssenAdaption", "0" }; + public final static String[] KEY_TS_KoscomAdaption = { "SpecialPanel.TS.KoscomAdaption", "0" }; + public final static String[] KEY_TS_ArionAdaption = { "SpecialPanel.TS.ArionAdaption", "0" }; public final static String[] KEY_TS_generatePmt = { "SpecialPanel.TS.generatePmt", "1" }; //cbox[41], true public final static String[] KEY_TS_generateTtx = { "SpecialPanel.TS.generateTtx", "0" }; //cbox[42] --ts !! public final static String[] KEY_TS_setMainAudioAc3 = { "SpecialPanel.TS.setMainAudioAc3", "0" }; //cbox[37] --ts !! public final static String[] KEY_Input_getEnclosedPackets = { "SpecialPanel.Input.getEnclosedPackets", "1" }; //cbox[33], true public final static String[] KEY_Input_concatenateForeignRecords = { "SpecialPanel.Input.concatenateForeignRecords", "1" }; //cbox[49], true + public final static String[] KEY_Input_useReadOverhead = { "SpecialPanel.Input.useReadOverhead", "1" }; public final static String[] KEY_Audio_ignoreErrors = { "SpecialPanel.Audio.ignoreErrors", "0" }; //cbox[24] public final static String[] KEY_Audio_limitPts = { "SpecialPanel.Audio.limitPts", "0" }; //cbox[15] + public final static String[] KEY_Audio_allowFormatChanges = { "SpecialPanel.Audio.allowFormatChanges", "0" }; public final static String[] KEY_Video_ignoreErrors = { "SpecialPanel.Video.ignoreErrors", "0" }; //cbox[39] public final static String[] KEY_Video_trimPts = { "SpecialPanel.Video.trimPts", "0" }; //cbox[73] + public final static String[] KEY_Video_cutPts = { "SpecialPanel.Video.cutPts", "0" }; public final static String[] KEY_Conversion_startWithVideo = { "SpecialPanel.Conversion.startWithVideo", "1" }; //cbox[23] -streamconv !! public final static String[] KEY_Conversion_addPcrToStream = { "SpecialPanel.Conversion.addPcrToStream", "1" }; //cbox[36] -streamconv !! public final static String[] KEY_Conversion_PcrCounter = { "SpecialPanel.Conversion.PcrCounter", "0" }; //cbox[46] -streamconv !! @@ -201,6 +211,8 @@ public final static String[] KEY_ExternPanel_splitProjectFile = { "ExternPanel.splitProjectFile", "0" }; //cbox[30] !! public final static String[] KEY_ExternPanel_ProjectFileSplitSize = { "ExternPanel.ProjectFileSplitSize", "2048" }; public final static String[] KEY_ExternPanel_createInfoIndex = { "ExternPanel.createInfoIndex", "0" }; + public final static String[] KEY_ExternPanel_appendPidToFileName = { "ExternPanel.appendPidToFileName", "0" }; + public final static String[] KEY_ExternPanel_appendLangToFileName = { "ExternPanel.appendLangToFileName", "0" }; public final static String[] KEY_killFtpClient = { "FtpPanel.killFtpClient", "0" }; //cbox[80] !! public final static String[] KEY_useFtpServerResume = { "FtpPanel.useFtpServerResume", "1" }; @@ -242,6 +254,7 @@ public final static String[] KEY_SubtitlePanel_decodeMegaradio = { "SubtitlePanel.decodeMegaradio", "0" }; //cbox[17] public final static String[] KEY_SubtitlePanel_decodeHiddenRows = { "SubtitlePanel.decodeHiddenRows", "0" }; //cbox[22] public final static String[] KEY_SubtitlePanel_rebuildPTS = { "SubtitlePanel.rebuildPTS", "0" }; //cbox[62] !! + public final static String[] KEY_SubtitlePanel_rebuildPictPTS = { "SubtitlePanel.rebuildPictPTS", "0" }; public final static String[] KEY_SubtitlePanel_keepOriginalTimecode = { "SubtitlePanel.keepOriginalTimecode", "0" }; //cbox[67] public final static String[] KEY_SubtitlePanel_exportTextAsUnicode = { "SubtitlePanel.exportTextAsUnicode", "0" }; public final static String[] KEY_SubtitlePanel_exportTextAsUTF8 = { "SubtitlePanel.exportTextAsUTF8", "0" }; @@ -265,9 +278,13 @@ public final static String[] KEY_SubpictureColorModel = { "SubtitlePanel.SubpictureColorModel", "(0) 4 colors" }; public final static String[] KEY_SubtitleChangeDisplay = { "SubtitlePanel.ChangeDisplay", "0" }; public final static String[] KEY_SubtitleMovePosition_Value = { "SubtitlePanel.MovePosition.Value", "" }; - -//test public final static String[] KEY_SubtitlePanel_specialTermination = { "SubtitlePanel.specialTermination", "1" }; + public final static String[] KEY_SubtitlePanel_keepColourTable = { "SubtitlePanel.keepColourTable", "0" }; + public final static String[] KEY_SubtitlePanel_exportAsVobSub = { "SubtitlePanel.exportAsVobSub", "0" }; + public final static String[] KEY_SubtitlePanel_TtxExportBoxedOnly = { "SubtitlePanel.TtxExportBoxedOnly", "0" }; + public final static String[] KEY_SubtitlePanel_useTextAlignment = { "SubtitlePanel.useTextAlignment", "0" }; + + public final static String[] KEY_SubtitlePanel_enableHDSub = { "SubtitlePanel.enableHDSub", "0" }; public static Object[] ITEMS_TtxLanguagePair = { "auto", "basic latin", "polish", "turkish", "cro,slo,rum", "est,lit,rus", @@ -283,8 +300,9 @@ public final static String[] KEY_AudioPanel_clearCRC = { "AudioPanel.clearCRC", "1" }; //cbox[1] public final static String[] KEY_AudioPanel_fillGapsWithLastFrame = { "AudioPanel.fillGapsWithLastFrame", "0" }; //cbox[0] public final static String[] KEY_AudioPanel_addFrames = { "AudioPanel.addFrames", "1" }; //cbox[20] - public final static String[] KEY_AudioPanel_patch1stAc3Header = { "AudioPanel.patch1stAc3Header", "0" }; //cbox[9] - public final static String[] KEY_AudioPanel_replaceAc3withSilence = { "AudioPanel.replaceAc3withSilence", "0" }; //cbox[10] + public final static String[] KEY_AudioPanel_AC3_patch1stHeader = { "AudioPanel.patch1stAc3Header", "0" }; //cbox[9] + public final static String[] KEY_AudioPanel_AC3_replaceWithSilence = { "AudioPanel.replaceAc3withSilence", "0" }; //cbox[10] + public final static String[] KEY_AudioPanel_AC3_BitrateAdaption = { "AudioPanel.AC3BitrateAdaption", "0" }; public final static String[] KEY_AudioPanel_allowSpaces = { "AudioPanel.allowSpaces", "0" }; //cbox[69] public final static String[] KEY_AudioPanel_addRiffToAc3 = { "AudioPanel.addRiffToAc3", "0" }; //cbox[12] public final static String[] KEY_AudioPanel_addRiffToMpgAudio = { "AudioPanel.addRiffToMpgAudioL12", "0" }; //cbox[4] + rbutton[14] riff fr layer1+2 @@ -301,9 +319,9 @@ public final static String[] KEY_AudioPanel_fadeInOut = { "AudioPanel.fadeInOut", "0" }; public final static String[] KEY_AudioPanel_fadeInOutMillis = { "AudioPanel.fadeInOutMillis", "2000" }; - public final static String[] KEY_AudioPanel_loslessMpaConversionMode = { "AudioPanel.loslessMpaConversionMode", "0" }; + public final static String[] KEY_AudioPanel_losslessMpaConversionMode = { "AudioPanel.losslessMpaConversionMode", "0" }; - public static Object[] ITEMS_loslessMpaConversionMode = null; + public static Object[] ITEMS_losslessMpaConversionMode = null; public final static String[] KEY_AudioPanel_resampleAudioMode = { "AudioPanel.decodeMpgAudio.resampleAudioMode", "0" }; @@ -312,7 +330,10 @@ public final static String[] KEY_Preview_disable = { "CollectionPanel.Preview.disable", "0" }; public final static String[] KEY_Preview_fastDecode = { "CollectionPanel.Preview.fastDecode", "0" }; //rbutton[10] public final static String[] KEY_Preview_LiveUpdate = { "CollectionPanel.Preview.LiveUpdate", "1" }; //rbutton[16] + public final static String[] KEY_Preview_fullScaled = { "CollectionPanel.Preview.fullScaled", "0" }; public final static String[] KEY_Preview_AllGops = { "CollectionPanel.Preview.AllGops", "0" }; //rbutton[6] + public final static String[] KEY_Preview_SliderWidth = { "CollectionPanel.Preview.SliderWidth", "1" }; + public final static String[] KEY_Preview_YGain = { "CollectionPanel.Preview.YGain", "0" }; public final static String[] KEY_OptionHorizontalResolution = { "CollectionPanel.OptionHorizontalResolution", "0" }; //cbox[52] public final static String[] KEY_OptionDAR = { "CollectionPanel.OptionDAR", "0" }; //cbox[47] @@ -345,7 +366,8 @@ Resource.getString("MainPanel.ConversionMode.toM2P"), Resource.getString("MainPanel.ConversionMode.toPVA"), Resource.getString("MainPanel.ConversionMode.toTS"), - Resource.getString("MainPanel.ConversionMode.PidFilter") + Resource.getString("MainPanel.ConversionMode.PidFilter"), + Resource.getString("MainPanel.ConversionMode.binaryCopy") }; this.ITEMS_ConversionMode = ITEMS_ConversionMode; @@ -353,7 +375,9 @@ Resource.getString("SpecialPanel.TS.HeaderMode0"), Resource.getString("SpecialPanel.TS.HeaderMode1"), Resource.getString("SpecialPanel.TS.HeaderMode2"), - Resource.getString("SpecialPanel.TS.HeaderMode3") + Resource.getString("SpecialPanel.TS.HeaderMode3"), + Resource.getString("SpecialPanel.TS.HeaderMode4"), + Resource.getString("SpecialPanel.TS.HeaderMode5") }; this.ITEMS_TsHeaderMode = ITEMS_TsHeaderMode; @@ -406,14 +430,16 @@ }; this.ITEMS_BitrateInFirstSequence = ITEMS_BitrateInFirstSequence; - Object[] ITEMS_loslessMpaConversionMode = { - Resource.getString("AudioPanel.loslessMpaConversionMode0"), - Resource.getString("AudioPanel.loslessMpaConversionMode1"), - Resource.getString("AudioPanel.loslessMpaConversionMode2"), - Resource.getString("AudioPanel.loslessMpaConversionMode3"), - Resource.getString("AudioPanel.loslessMpaConversionMode4") + Object[] ITEMS_losslessMpaConversionMode = { + Resource.getString("AudioPanel.losslessMpaConversionMode0"), + Resource.getString("AudioPanel.losslessMpaConversionMode1"), + Resource.getString("AudioPanel.losslessMpaConversionMode2"), + Resource.getString("AudioPanel.losslessMpaConversionMode3"), + Resource.getString("AudioPanel.losslessMpaConversionMode4"), + Resource.getString("AudioPanel.losslessMpaConversionMode5"), + Resource.getString("AudioPanel.losslessMpaConversionMode6") }; - this.ITEMS_loslessMpaConversionMode = ITEMS_loslessMpaConversionMode; + this.ITEMS_losslessMpaConversionMode = ITEMS_losslessMpaConversionMode; Object[] ITEMS_resampleAudioMode = { Resource.getString("AudioPanel.decodeMpgAudio.resampleAudioMode0"), @@ -442,23 +468,25 @@ this.ITEMS_SubtitleChangeDisplay = ITEMS_SubtitleChangeDisplay; Object[] ITEMS_FileTypes = { - Resource.getString("scan.unsupported"), - "PES (incl. MPEG Video)", - "MPEG-1 PS/SS (PES Container)", - "MPEG-2 PS/SS (PES Container)", - "PVA (PES Container of TTョ)", - "TS (generic PES Container)", - "PES (MPEG Audio first)", - "PES (private stream 1 first)", - "ES (MPEG Video)", - "ES (MPEG Audio)", - "ES (AC-3 Audio)", - "ES (AC-3 Audio) (psb. SMPTE)", - "ES (DTS Audio)", - "ES (DTS Audio) (psb. SMPTE)", - "ES (RIFF Audio)", - "ES (compressed RIFF Audio)", - "ES (Subpicture 2-bit RLE)" + Resource.getString("scan.unsupported"), //0 + "PES (incl. MPEG Video)", //1 + "MPEG-1 PS/SS (PES Container)", //2 + "MPEG-2 PS/SS (PES Container)", //3 + "PVA (TTョ PES Container)", //4 + "TS (generic PES Container)", //5 + "PES (MPEG Audio first)", //6 + "PES (private stream 1 first)", //7 + "ES (MPEG Video)", //8 + "ES (MPEG Audio)", //9 + "ES (AC-3 Audio)", //10 + "ES (AC-3 Audio) (psb. SMPTE)", //11 + "ES (DTS Audio)", //12 + "ES (DTS Audio) (psb. SMPTE)", //13 + "ES (RIFF Audio)", //14 + "ES (compressed RIFF Audio)", //15 + "ES (Subpicture 2-bit RLE)", //16 + "", "", "", "", "", "", "", "", "", "", "", "", "", "", //17-30 + "PjX PTS File" //31 }; this.ITEMS_FileTypes = ITEMS_FileTypes; } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Resource.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Resource.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Resource.java 2005-12-17 22:07:38.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Resource.java 2008-02-18 18:32:08.000000000 +0000 @@ -26,14 +26,10 @@ package net.sourceforge.dvb.projectx.common; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedReader; +//import java.awt.event.ActionEvent; +//import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; -import java.io.FileReader; -import java.io.IOException; -import java.io.PrintWriter; import java.net.JarURLConnection; import java.net.URL; import java.net.URLConnection; diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Settings.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Settings.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Settings.java 2005-12-30 18:19:14.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Settings.java 2008-02-18 18:32:58.000000000 +0000 @@ -45,10 +45,7 @@ import java.util.Properties; import java.util.Set; import java.util.TreeMap; -import java.net.URL; - -import net.sourceforge.dvb.projectx.common.Common; import net.sourceforge.dvb.projectx.xinput.XInputDirectory; /** diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Start.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Start.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/common/Start.java 2005-12-30 21:32:52.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/common/Start.java 2009-07-05 12:39:08.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)Start.java - main start class * - * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -52,15 +52,8 @@ import java.util.ArrayList; import java.util.StringTokenizer; -import net.sourceforge.dvb.projectx.common.Resource; -import net.sourceforge.dvb.projectx.common.Keys; -import net.sourceforge.dvb.projectx.common.Common; -import net.sourceforge.dvb.projectx.common.JobCollection; - import net.sourceforge.dvb.projectx.xinput.XInputFile; -import net.sourceforge.dvb.projectx.parser.MainProcess; - /** * the holy start */ @@ -102,9 +95,18 @@ */ /** + * remove the stdout re-direction of sys infos + */ + if ((index = getSwitch(">")) >= 0) + { + if (index < cli_switches.size()) + cli_switches.remove(index); + } + + /** * get version switch */ - if (getBooleanSwitch("-version")) + // if (getBooleanSwitch("-version")) System.out.println("Version: " + Common.getVersionName() + "/" + Common.getVersionDate()); System.out.println("Reading GUI-Switch..."); @@ -241,12 +243,14 @@ if (readSwitches(cli_switches)) System.out.println("Error while reading CLI Switches ..."); + System.out.println("Preparing GUI (if enabled)..."); + /** * initialize the gui interface */ Common.prepareGui(showGUI); // access after the keys has been loaded!, separate to userinterface later - System.out.println("Checking Commons-Net library access..."); + System.out.println("Check Commons-Net library access..."); /** * planned to disable ftp only, if commons-net is missing @@ -323,7 +327,13 @@ StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); - Common.getGuiInterface().showErrorMessageDialog(Resource.getString("StartUp.Error") + Common.getLineSeparator() + Common.getLineSeparator() + sw.toString(), Resource.getString("StartUp.Error.Title")); + /** + * message to the commandline + */ + String message = Resource.getString("StartUp.Error") + Common.getLineSeparator() + Common.getLineSeparator() + sw.toString(); + System.err.println(message); + + Common.getGuiInterface().showErrorMessageDialog(message, Resource.getString("StartUp.Error.Title")); } /** @@ -389,6 +399,7 @@ int index = -1; try { + /** * get switches */ @@ -454,6 +465,32 @@ Common.getSettings().setProperty(Keys.KEY_ConversionMode[0], "5"); /** + * any ini key from CLI, must be a loop + */ + while ((index = getSwitch("-set")) >= 0) + { + switch_error = false; + + if (index < cli_switches.size()) + { + str = cli_switches.get(index).toString(); + + Common.getSettings().setProperty(str.substring(0, str.indexOf("=")), str.substring(str.indexOf("=") + 1)); + + cli_switches.remove(index); + } + + else + switch_error = false; + + if (switch_error) + { + System.out.println("can't set property ..."); + error = true; + } + } + + /** * split output */ if ((index = getSwitch("-split")) >= 0) diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/BitrateMonitor.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/BitrateMonitor.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/BitrateMonitor.java 2005-12-17 22:21:20.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/BitrateMonitor.java 2006-11-11 16:50:54.000000000 +0000 @@ -94,6 +94,7 @@ private boolean greatgop = false; private Color[] GOP = { Color.black, Color.cyan, Color.magenta, Color.white, Color.green, Color.red, Color.red, Color.red, Color.yellow }; private byte[] frame = new byte[0]; + private int maxbitrate_index = 22500; /** * @@ -168,16 +169,19 @@ big.drawString(timeStr, 60, h - descent); // .. Draw History Graph .. - big.setColor(graphColor); int graphX = 2; int graphY = 1; int graphW = 50; // w =55 int graphH = 30; // h=55. 48 + + big.setColor(graphColor); graphOutlineRect.setRect(graphX, graphY, graphW, graphH); big.draw(graphOutlineRect); int graphRow = graphH / 5; + big.setColor(graphColor); + // .. Draw row .. for (int j = graphY; j <= graphH + graphY; j += graphRow) big.drawLine(graphX, j, graphX + graphW, j); @@ -188,19 +192,6 @@ for (int j = graphX; j < graphW + graphX; j += graphColumn) big.drawLine(j, graphY, j, graphY + graphH); - //.. 9Mbps - big.setColor(Color.red); - big.drawLine(2, 5, 52, 5); - - //.. 2.5Mbps - big.setColor(Color.magenta); - big.drawLine(2, 28, 52, 28); - - //.. max,min Mbps - big.setColor(Color.white); - big.drawLine(52, (graphY + graphH - (maxbitrate / divisor)), 56, (graphY + graphH - (maxbitrate / 695))); - big.drawLine(52, (graphY + graphH - (minbitrate / divisor)), 56, (graphY + graphH - (minbitrate / 695))); - //.. frametypegraph int b = frame.length > 17 ? 17 : frame.length; @@ -242,15 +233,8 @@ pts[ptNum] = 0; for (int j = graphX + graphW - ptNum, k = 0; k < ptNum; k++, j++) - { if (k != 0) - { - if (pts[k] != pts[k - 1]) - big.drawLine(j - 1, pts[k - 1], j, pts[k]); - else - big.fillRect(j, pts[k], 1, 1); - } - } + big.drawLine(j - 1, graphH, j - 1, pts[k]); if (ptNum + 2 == pts.length) { @@ -263,6 +247,19 @@ else ptNum++; } + + //.. 9Mbps + big.setColor(Color.red); + big.drawLine(2, 5, 52, 5); + + //.. 2.5Mbps + big.setColor(Color.magenta); + big.drawLine(2, 28, 52, 28); + + //.. max,min Mbps + big.setColor(Color.white); + big.drawLine(52, (graphY + graphH - (maxbitrate / divisor)), 56, (graphY + graphH - (maxbitrate / 695))); + big.drawLine(52, (graphY + graphH - (minbitrate / divisor)), 56, (graphY + graphH - (minbitrate / 695))); } /** diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CollectionPanel.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CollectionPanel.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CollectionPanel.java 2005-12-30 20:43:42.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CollectionPanel.java 2009-01-16 18:44:58.000000000 +0000 @@ -26,74 +26,23 @@ package net.sourceforge.dvb.projectx.gui; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Comparator; - -import javax.swing.JFrame; import javax.swing.JPanel; -import javax.swing.JTextField; import javax.swing.JLabel; -import javax.swing.JButton; -import javax.swing.JList; -import javax.swing.JSlider; -import javax.swing.JTabbedPane; import javax.swing.JComboBox; -import javax.swing.JScrollPane; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JCheckBox; -import javax.swing.JFileChooser; -import javax.swing.SwingUtilities; -import javax.swing.SwingConstants; -import javax.swing.UIManager; -import javax.swing.event.ChangeListener; -import javax.swing.event.ChangeEvent; -import javax.swing.JComponent; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; import java.awt.BorderLayout; -import java.awt.GridLayout; -import java.awt.Color; import java.awt.Dimension; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.dnd.DropTarget; -import java.awt.dnd.DropTargetDragEvent; -import java.awt.dnd.DropTargetDropEvent; -import java.awt.dnd.DropTargetEvent; -import java.awt.dnd.DropTargetListener; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; import net.sourceforge.dvb.projectx.common.Keys; import net.sourceforge.dvb.projectx.common.Common; import net.sourceforge.dvb.projectx.common.Resource; -import net.sourceforge.dvb.projectx.common.JobCollection; - -import net.sourceforge.dvb.projectx.parser.CommonParsing; - -import net.sourceforge.dvb.projectx.video.Preview; -import net.sourceforge.dvb.projectx.video.PreviewObject; -import net.sourceforge.dvb.projectx.xinput.XInputFile; - -import net.sourceforge.dvb.projectx.gui.ComboBoxIndexListener; import net.sourceforge.dvb.projectx.gui.ComboBoxItemListener; import net.sourceforge.dvb.projectx.gui.CheckBoxListener; import net.sourceforge.dvb.projectx.gui.CommonGui; @@ -103,1845 +52,146 @@ */ public class CollectionPanel extends JPanel { - private X_JFileChooser chooser; - - private JList includeList; - private JSlider slider; - - private JTextField includeField; - private JTextField cutfield; - private JTextField chapterfield; - private JTextField pointslength; - private JTextField chp; - private JTextField firstfile; - private JTextField scannedPID; - - private JLabel titleLabel; - - private JButton cutdel; - private JButton cutadd; - private JButton chapterdel; - private JButton chapteradd; - private JButton loadlist; - private JButton savelist; - - private JComboBox cut_combobox; - private JComboBox chapter_combobox; - private JComboBox cutmode_combobox; - - private JTabbedPane tabbedPane; - - private List previewList = new ArrayList(); - - private DNDListener2 dnd2 = new DNDListener2(); - private CutListener cutAction = new CutListener(); - private JumpListener jumpAction = new JumpListener(); - - private boolean action = false; - private boolean decode = false; - - private String file = " "; - private String title = ""; - private String navigation[] = { - "bwd_ncp.gif", "bwd_100.gif", "bwd_10.gif", "bwd_gop.gif", - "fwd_gop.gif", "fwd_10.gif", "fwd_100.gif", "fwd_ncp.gif" - }; - - private int filetype = 0; - private int active_collection = 0; - private int loadSizeForward = 2560000; + private boolean ToggleControls; - private long lastPosition = 0; - - private Preview Preview = new Preview(loadSizeForward); - private JobCollection collection; - - private CutView cutview; -// + private ComboBoxItemListener _ComboBoxItemListener; + private CheckBoxListener _CheckBoxListener; /** - * class to control short OSD fadings + * */ - private class SlideShow implements Runnable { - - private Thread clockThread = null; - - private long value = 0; - private long skip = 50000; - - private Object[] cutpoints = null; - - /** - * - */ - public void start(long _value) - { - if (clockThread == null) - { - clockThread = new Thread(this, "SlideShow"); - clockThread.setPriority(Thread.MIN_PRIORITY); - - value = _value; - skip = getLoadSize() / 8; - - getCutPoints(); - - clockThread.start(); - } - } - - /** - * - */ - private void getCutPoints() - { - cutpoints = collection == null ? null : collection.getCutpoints(); - } - - /** - * - */ - public void run() - { - Thread myThread = Thread.currentThread(); - - while (clockThread == myThread) - { - try { - - for (long val;; ) - { - val = update(value); - Thread.sleep(5); - - if (!slideshow || val < value) - break; - - value = skipArea(val); - - if (value < val) - break; - } - - stop(); + public CollectionPanel() + { + initialize(); + } - } catch (InterruptedException e) {} + /** + * + */ + private void initialize() + { + _ComboBoxItemListener = new ComboBoxItemListener(); + _CheckBoxListener = new CheckBoxListener(); - } - } + setLayout( new BorderLayout() ); - /** - * - */ - private long update(long val) - { - return preview(val); - } + JPanel grid = new JPanel(); + grid.setLayout(new BorderLayout()); /** * */ - private long skipArea(long val) - { - // next gop - if (cutpoints == null || cutpoints.length == 0) - return (val + skip); - - int index = getCutIndex(cutpoints, String.valueOf(val)); - - // area among cutpoints - if (index < 0) - { - // next gop "in" area - if ((index & 1) == 0) - return (val + skip); - - // stop - if (-index > cutpoints.length) - return (val - skip); - - // jump to next export area (-index - 1) - return Long.parseLong(cutpoints[index + 1].toString()); - } - - // exact cut point "in" area - if ((index & 1) == 0) - return (val + skip); - - // stop - if (index + 1 >= cutpoints.length) - return (val - skip); - - // jump to next exported area - return Long.parseLong(cutpoints[index + 1].toString()); - } + final JPanel previewPanel = new JPanel(); + previewPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLoweredBevelBorder(), Resource.getString("CollectionPanel.CutPanel"))); + previewPanel.setLayout ( new BorderLayout() ); + previewPanel.setToolTipText(Resource.getString("CollectionPanel.CutPanel.Tip1")); + previewPanel.add(CommonGui.getPicturePanel()); /** * */ - public void stop() - { - clockThread = null; - } - } - - private SlideShow cl = new SlideShow(); - private boolean slideshow = false; - -// - ComboBoxIndexListener _ComboBoxIndexListener = new ComboBoxIndexListener(); - ComboBoxItemListener _ComboBoxItemListener = new ComboBoxItemListener(); - CheckBoxListener _CheckBoxListener = new CheckBoxListener(); - - class DNDListener2 implements DropTargetListener - { - public void drop(DropTargetDropEvent e) - { - try { - int dropaction = e.getDropAction(); // 1=copy, 2=move - - if ( dropaction == 0 || dropaction > 2) - { - e.rejectDrop(); - - return; - } - - e.acceptDrop(dropaction); - - Transferable tr = e.getTransferable(); - DataFlavor[] df = tr.getTransferDataFlavors(); - List li = (List) tr.getTransferData(df[0]); // see note about mac os x - - Object[] val = li.toArray(); - - if (val.length > 0) - loadList(val[0].toString()); - - e.dropComplete(true); - - } catch (Exception eee) { - - e.dropComplete(false); - Common.setExceptionMessage(eee); - } - } - - public void dragEnter(DropTargetDragEvent e) - {} - - public void dragExit(DropTargetEvent e) - {} - - public void dragOver(DropTargetDragEvent e) - {} - - public void dropActionChanged(DropTargetDragEvent e) - {} - } - - class JumpListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - if (collection == null) - return; - - if (!action) - return; - - String actName = e.getActionCommand(); - int val = slider.getValue(); - - /** - * prev. cut point pos. - */ - if (actName.equals(navigation[0])) - { - int i = 0; - int ic = cut_combobox.getItemCount(); - - if (ic > 0) - { - i = ic - 1; - - if (lastPosition > Long.parseLong(cut_combobox.getItemAt(0).toString())) - while (lastPosition <= Long.parseLong(cut_combobox.getItemAt(i).toString())) - i--; - - cut_combobox.setSelectedIndex(i); - } - } - - else if (actName.equals(navigation[1])) - slider.setValue(val - 3125000); - - else if (actName.equals(navigation[2])) - slider.setValue(val - 312500); - - else if (actName.equals(navigation[3])) - slider.setValue(val - 2); - - else if (actName.equals(navigation[4])) - slider.setValue(val + 2); - - else if (actName.equals(navigation[5])) - slider.setValue(val + 312500); - - else if (actName.equals(navigation[6])) - slider.setValue(val + 3125000); - - /** - * next cut point pos. - */ - else if (actName.equals(navigation[7])) - { - int i = 0; - int ic = cut_combobox.getItemCount(); - - if (ic > 0) - { - if (lastPosition < Long.parseLong(cut_combobox.getItemAt(ic - 1).toString())) - while (lastPosition >= Long.parseLong(cut_combobox.getItemAt(i).toString())) - i++; - - cut_combobox.setSelectedIndex(i); - } - } - - else if (actName.equals("loadlist")) - loadList(); - - else if (actName.equals("savelist")) - saveList(); - } - } + final JPanel previewControlPanel = buildPreviewControlPanel(); - class CutListener implements ActionListener - { - public void actionPerformed(ActionEvent e) + previewPanel.addMouseListener(new MouseAdapter() { - if (collection == null) - return; - - if (!action) - return; - - action = false; - String actName = e.getActionCommand(); - - if (actName.equals("delpoint")) - { - if (cut_combobox.getItemCount() > 0) - removeCutpoint(cut_combobox.getSelectedIndex()); - } - - else if (actName.equals("cutnumber") || actName.equals("addpoint")) - { - String value = cutfield.getText(); - - if (!value.equals("") && addCutpoint(value)) - { - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) - collection.setCutImage(value, Common.getMpvDecoderClass().getCutImage()); - } - - cutfield.setText(""); - } - - else if (actName.equals("delchapter")) - { - if (chapter_combobox.getItemCount() > 0) - removeChapterpoint(chapter_combobox.getSelectedIndex()); - } - - else if (actName.equals("addchapter")) - { - String value = cutfield.getText(); - - if (!value.equals("") && addChapterpoint(value)) - {} - } - - else if (actName.equals("ID")) - { - try { - - String value = includeField.getText(); - - if (!value.equals("")) - { - if (!value.startsWith("0x")) - value = "0x" + Integer.toHexString(0x1FFF & Integer.parseInt(value)); - - value = value.toUpperCase().replace('X', 'x'); - - collection.addPID(value); - includeList.setListData(collection.getPIDs()); - includeList.ensureIndexIsVisible(collection.getPIDs().length - 1); - } - - } catch (NumberFormatException ne) { - - Common.setOSDErrorMessage(Resource.getString("cutlistener.wrongnumber")); - } - - includeField.setText(""); - action = true; - - return; - } - - /** - * changes will be saved immediately - */ - else if (actName.equals("transferPIDs")) - { - try { - - Object[] values = includeList.getSelectedValues(); - - if (values.length > 0) - { - JobCollection new_collection = Common.addCollection(collection.getNewInstance()); - - collection.removePID(values); - - new_collection.clearPIDs(); - new_collection.addPID(values); - - new_collection.determinePrimaryFileSegments(); - - entry(Common.getActiveCollection()); - } - - } catch (Exception e2) { - - Common.setExceptionMessage(e2); - } - - action = true; - - return; - } - - /** - * changes will be saved immediately - */ - else if (actName.equals("transferCuts")) - { - try { - - int NumOfPts = 0; - - if ((NumOfPts = cut_combobox.getItemCount()) > 2) //2cutpoints are not enough - { - for (int b = 2; b < NumOfPts; b += 2) - { - JobCollection new_collection = Common.addCollection(collection.getNewInstance()); - - new_collection.clearCutpoints(); - - for (int c = 0; c < 2 && b + c < NumOfPts; c++) - new_collection.addCutpoint( collection.removeCutpoint(2)); - - new_collection.determinePrimaryFileSegments(); - } - - entry(Common.getActiveCollection()); - - action = true; - } - - } catch (Exception e2) { - - Common.setExceptionMessage(e2); - } - - action = true; - - return; - } - - /** - * stuff completion for add and del cutpoints - */ - if (cut_combobox.getItemCount() > 0) - { - Object[] obj = collection.getCutpoints(); - - int index = cut_combobox.getSelectedIndex(); - - Common.getGuiInterface().showCutIcon((index & 1) == 0, obj, previewList); - - if (actName.equals("cutbox") || actName.equals("delpoint")) - { - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) - preview(Long.parseLong(obj[index].toString())); - } - - if (actName.equals("addpoint")) - updateCutView(String.valueOf(lastPosition)); - } - - else + public void mouseClicked(MouseEvent e) { - Common.getGuiInterface().showCutIcon(true, null, previewList); - updateCutView(String.valueOf(lastPosition)); - } - - /** - * stuff completion for add and del chapterpoints - */ - if (chapter_combobox.getItemCount() > 0) - { - Object[] obj = collection.getChapterpoints(); - - int index = chapter_combobox.getSelectedIndex(); + previewPanel.removeAll(); - chapterfield.setText(String.valueOf(index + 1)); + if ((ToggleControls = !ToggleControls)) + previewPanel.add(previewControlPanel); - Common.getGuiInterface().showChapterIcon(obj, previewList); - - if (actName.equals("chapterbox")) + else { - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) - preview(Long.parseLong(obj[index].toString())); + previewPanel.add(CommonGui.getPicturePanel()); } - } - - else - { - Common.getGuiInterface().showChapterIcon(null, previewList); - - chapterfield.setText(""); - } - - /** - * - */ - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) - slider.requestFocus(); - - getExpectedSize(); - - action = true; - } - } - - /** - * - */ - public CollectionPanel() - { - initialize(); - } - - - /** - * - */ - protected JPanel buildRightPanel() - { - JPanel panel = new JPanel(); - - tabbedPane = new JTabbedPane(); - tabbedPane.setTabPlacement(SwingConstants.BOTTOM); - tabbedPane.addTab("Settings", buildPanel_1()); - tabbedPane.addTab("CutViews", buildPanel_2()); + previewPanel.validate(); + previewPanel.repaint(); + } + }); - final String[] object = Keys.KEY_OptionPanelIndex; - - int index = Common.getSettings().getIntProperty(object); - - if (index >= 0 && index < tabbedPane.getTabCount()) - tabbedPane.setSelectedIndex(index); - - tabbedPane.addMouseListener(new MouseAdapter() - { - public void mouseClicked(MouseEvent e) - { - Common.getSettings().setProperty(object[0], String.valueOf(tabbedPane.getSelectedIndex())); - } - }); - panel.add(tabbedPane, BorderLayout.CENTER); + grid.add(previewPanel); + // grid.add(CommonGui.getPicturePanel().getSliderPanel(), BorderLayout.EAST); - return panel; + add(grid); } /** * */ - protected JPanel buildPanel_1() + protected JPanel buildPreviewControlPanel() { JPanel panel = new JPanel(); panel.setLayout (new ColumnLayout()); String[][] objects = { + Keys.KEY_holdStreamInfoOnOSD, Keys.KEY_Preview_disable, Keys.KEY_Preview_fastDecode, Keys.KEY_Preview_LiveUpdate, Keys.KEY_Preview_AllGops, - Keys.KEY_OptionHorizontalResolution, - Keys.KEY_OptionDAR + Keys.KEY_Preview_SliderWidth, + Keys.KEY_Preview_fullScaled }; - JCheckBox[] box = new JCheckBox[objects.length]; - for (int i = 0; i < objects.length; i++) { - box[i] = new JCheckBox(Resource.getString(objects[i][0])); - box[i].setPreferredSize(new Dimension(220, 20)); - box[i].setMaximumSize(new Dimension(220, 20)); - box[i].setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); - box[i].setActionCommand(objects[i][0]); - box[i].setSelected(Common.getSettings().getBooleanProperty(objects[i])); - box[i].addActionListener(_CheckBoxListener); - } + JCheckBox box = new JCheckBox(Resource.getString(objects[i][0])); + box.setPreferredSize(new Dimension(250, 20)); + box.setMaximumSize(new Dimension(250, 20)); + box.setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); + box.setActionCommand(objects[i][0]); + box.setSelected(Common.getSettings().getBooleanProperty(objects[i])); - for (int i = 0; i < 4; i++) - panel.add(box[i]); + box.addActionListener(_CheckBoxListener); - panel.add(Box.createRigidArea(new Dimension(1, 4))); + if (i == 1) + panel.add(Box.createRigidArea(new Dimension(1, 10))); + if (i == 2 && Common.getMpvDecoderClass().isAccelerated()) + { + box.setSelected(true); + Common.getSettings().setBooleanProperty(objects[i][0], box.isSelected()); + } - panel.add(new JLabel(Resource.getString("CollectionPanel.ExportLimits"))); + panel.add(box); + } - /** - * - */ - JPanel CL2 = new JPanel(); - CL2.setLayout(new BoxLayout(CL2, BoxLayout.X_AXIS)); + String[][] keys = { + Keys.KEY_Preview_YGain, + Keys.KEY_PreviewBuffer + }; - box[4].setPreferredSize(new Dimension(110, 20)); - box[4].setMaximumSize(new Dimension(110, 20)); - CL2.add(box[4]); - - - JComboBox combobox_34 = new JComboBox(Keys.ITEMS_ExportHorizontalResolution); - combobox_34.setMaximumRowCount(7); - combobox_34.setPreferredSize(new Dimension(90, 20)); - combobox_34.setMaximumSize(new Dimension(90, 20)); - combobox_34.setActionCommand(Keys.KEY_ExportHorizontalResolution[0]); - combobox_34.setEditable(true); - combobox_34.setSelectedItem(Common.getSettings().getProperty(Keys.KEY_ExportHorizontalResolution)); - combobox_34.addActionListener(_ComboBoxItemListener); - CL2.add(combobox_34); + Object[][] object_items = { + { "1", "-128", "-112", "-96", "-80", "-64", "-48", "-32", "-16", "0", "16", "32", "48", "64", "80", "96", "112", "128" }, + { "auto", "256000", "384000", "512000", "768000", "1024000", "1536000", "2048000", "2560000", "3072000" } + }; - panel.add(CL2); + for (int i = 0; i < keys.length; i++) + { + JComboBox combobox = new JComboBox(object_items[i]); + combobox.setPreferredSize(new Dimension(100, 24)); + combobox.setMaximumSize(new Dimension(100, 24)); + combobox.setEditable(true); + combobox.setMaximumRowCount(6); + combobox.setActionCommand(keys[i][0]); + combobox.setSelectedItem(Common.getSettings().getProperty(keys[i])); + combobox.addActionListener(_ComboBoxItemListener); + JLabel label = new JLabel(Resource.getString(keys[i][0])); + label.setToolTipText(Resource.getString(keys[i][0] + Keys.KEY_Tip)); - /** - * - */ - JPanel CL3 = new JPanel(); - CL3.setLayout(new BoxLayout(CL3, BoxLayout.X_AXIS)); - - box[5].setPreferredSize(new Dimension(80, 20)); - box[5].setMaximumSize(new Dimension(80, 20)); - CL3.add(box[5]); - - JComboBox combobox_24 = new JComboBox(Keys.ITEMS_ExportDAR); - combobox_24.setMaximumRowCount(7); - combobox_24.setPreferredSize(new Dimension(120, 20)); - combobox_24.setMaximumSize(new Dimension(120, 20)); - combobox_24.setActionCommand(Keys.KEY_ExportDAR[0]); - combobox_24.setSelectedIndex(Common.getSettings().getIntProperty(Keys.KEY_ExportDAR)); - combobox_24.addActionListener(_ComboBoxIndexListener); - CL3.add(combobox_24); - - panel.add(CL3); - - panel.add(Box.createRigidArea(new Dimension(1, 4))); - - - /** - * - */ - JPanel CL4 = new JPanel(); - CL4.setLayout(new BoxLayout(CL4, BoxLayout.X_AXIS)); - CL4.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), Resource.getString("CollectionPanel.PidList"))); - - includeField = new JTextField(""); - includeField.setPreferredSize(new Dimension(80, 25)); - includeField.setMaximumSize(new Dimension(80, 25)); - includeField.setEditable(true); - includeField.setActionCommand("ID"); - includeField.setToolTipText(Resource.getString("CollectionPanel.PidList.Tip1")); - - includeList = new JList(); - includeList.setToolTipText(Resource.getString("CollectionPanel.PidList.Tip2")); - CL4.add(includeField); - - includeField.addActionListener(cutAction); - - CL4.add(new JLabel("=>")); - - JScrollPane scrollList = new JScrollPane(); - scrollList.setPreferredSize(new Dimension(80, 100)); - scrollList.setMaximumSize(new Dimension(80, 100)); - scrollList.setViewportView(includeList); - CL4.add(scrollList); - - includeList.addMouseListener( new MouseAdapter() { - public void mouseClicked(MouseEvent e) - { - if (collection == null) - return; - - if (e.getClickCount() >= 2) - { - Object[] val = includeList.getSelectedValues(); - - collection.removePID(val); - includeList.setListData(collection.getPIDs()); - } - } - }); - - panel.add(CL4); - - panel.add(Box.createRigidArea(new Dimension(1, 4))); - - JButton pids = new JButton(Resource.getString("CollectionPanel.transferPids1")); - pids.setPreferredSize(new Dimension(220, 20)); - pids.setMaximumSize(new Dimension(220, 20)); - pids.setActionCommand("transferPIDs"); - pids.setToolTipText(Resource.getString("CollectionPanel.transferPids1.Tip")); - pids.addActionListener(cutAction); - panel.add(pids); - - JButton cpoints = new JButton(Resource.getString("CollectionPanel.transferPids2")); - cpoints.setPreferredSize(new Dimension(220,20)); - cpoints.setMaximumSize(new Dimension(220,20)); - cpoints.setActionCommand("transferCuts"); - cpoints.setToolTipText(Resource.getString("CollectionPanel.transferPids2.Tip")); - cpoints.addActionListener(cutAction); - panel.add(cpoints); - - panel.add(Box.createRigidArea(new Dimension(1, 6))); - - return panel; - } - - /** - * - */ - protected JPanel buildPanel_2() - { - JPanel panel = new JPanel(); - panel.setLayout (new BorderLayout()); - - panel.add(cutview = new CutView()); - - return panel; - } - - /** - * - */ - protected void setComponentColor(JComponent comp, Color c) - { - comp.setBackground(c); - comp.setForeground(c); - } - - /** - * - */ - private void initialize() - { - chooser = CommonGui.getMainFileChooser(); - - setLayout( new BorderLayout() ); - - JPanel grid = new JPanel(); - grid.setLayout(new BorderLayout()); - - /** - * - */ - JPanel previewPanel = new JPanel(); - previewPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLoweredBevelBorder(), Resource.getString("CollectionPanel.CutPanel"))); - previewPanel.setLayout ( new BorderLayout() ); - previewPanel.setToolTipText(Resource.getString("CollectionPanel.CutPanel.Tip1")); - previewPanel.add(CommonGui.getPicturePanel()); - - - /** - * - */ - slider = new JSlider(0, (10240000 / 16), 0); - slider.setPreferredSize(new Dimension(512, 24)); - slider.setMaximumSize(new Dimension(512, 24)); - slider.setValue(0); - - slider.addMouseListener(new MouseAdapter() - { - public void mouseClicked(MouseEvent e) - { - if (slideshow || previewList.isEmpty() || Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE) - { - slideshow = false; - return; - } - - if (e.getClickCount() < 2) - return; - - slideshow = true; - cl.start(lastPosition); - } - }); - - - /** - * - */ - JPanel grid_3 = new JPanel(); - grid_3.setLayout(new BoxLayout(grid_3, BoxLayout.X_AXIS)); - grid_3.add(buildCutPointPanel()); - grid_3.add(buildChapterPointPanel()); - - /** - * - */ - JPanel grid_1 = new JPanel(); - grid_1.setLayout(new GridLayout(0, 2)); - grid_1.add(buildNavigationPanel()); - grid_1.add(grid_3); - - /** - * - */ - JPanel grid_2 = new JPanel(); - grid_2.setLayout(new BorderLayout()); - grid_2.setBorder(BorderFactory.createRaisedBevelBorder()); - grid_2.add(slider); - grid_2.add(grid_1, BorderLayout.SOUTH); - - previewPanel.add(grid_2, BorderLayout.SOUTH); - - slider.addChangeListener(new ChangeListener() - { - public void stateChanged(ChangeEvent e) - { - if (collection == null) - return; - - if (!action) - return; - - if (slider.getValueIsAdjusting() && !Common.getSettings().getBooleanProperty(Keys.KEY_Preview_LiveUpdate)) - return; - - long val = (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE ? 16L : 1L) * slider.getValue(); - - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE && val != (lastPosition & ~15)) - preview(val); - - else if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE) - scannedPID.setText(Resource.getString("CollectionPanel.Preview.offline")); - - getType(); - } - }); - - slider.addKeyListener(new KeyAdapter() - { - public void keyPressed(KeyEvent e) - { - if (collection == null) - return; - - int i = 0; - int ic = 0; - int offs = 0; - int keyval=e.getKeyCode(); - - switch(e.getKeyChar()) - { - case 'p': - ic=cut_combobox.getItemCount(); - if (ic > 0) { - i = ic - 1; - if (lastPosition>Long.parseLong(cut_combobox.getItemAt(0).toString())) - while (lastPosition <= Long.parseLong(cut_combobox.getItemAt(i).toString())) - i--; - cut_combobox.setSelectedIndex(i); - } - return; - - case 'n': - ic=cut_combobox.getItemCount(); - if (ic > 0) { - if (lastPosition= Long.parseLong(cut_combobox.getItemAt(i).toString())) - i++; - cut_combobox.setSelectedIndex(i); - } - return; - - case 'a': - cutadd.doClick(); - return; - - case 'd': - cutdel.doClick(); - return; - } - - if (e.isShiftDown()) - offs = 62500; - - else if (e.isControlDown()) - offs = 312500; - - else if (e.isAltDown()) - offs = 3125000; - - else - return; - - switch (keyval) - { - case KeyEvent.VK_RIGHT: - slider.setValue(slider.getValue() + offs); - break; - - case KeyEvent.VK_LEFT: - slider.setValue(slider.getValue() - offs); - } - } - }); - - grid.add(previewPanel); - - - JPanel cutPanel = new JPanel(); - cutPanel.setBorder(BorderFactory.createTitledBorder( BorderFactory.createEtchedBorder(), Resource.getString("CollectionPanel.Various"))); - cutPanel.setLayout ( new ColumnLayout() ); - - titleLabel = new JLabel(""); - titleLabel.setPreferredSize(new Dimension(230, 22)); - titleLabel.setMaximumSize(new Dimension(230, 22)); - // cutPanel.add(titleLabel); - - cutPanel.add(buildRightPanel()); - - cutmode_combobox = new JComboBox(Keys.ITEMS_CutMode); - cutmode_combobox.setPreferredSize(new Dimension(230, 22)); - cutmode_combobox.setMaximumSize(new Dimension(230, 22)); - cutmode_combobox.setActionCommand(Keys.KEY_CutMode[0]); - cutmode_combobox.setSelectedIndex(Common.getSettings().getIntProperty(Keys.KEY_CutMode)); - cutmode_combobox.addActionListener(_ComboBoxIndexListener); - cutPanel.add(cutmode_combobox); - - - loadlist = new JButton(Resource.getString("CollectionPanel.loadCutpointList")); - loadlist.setPreferredSize(new Dimension(230, 22)); - loadlist.setMaximumSize(new Dimension(230, 22)); - loadlist.setToolTipText(Resource.getString("CollectionPanel.loadCutpointList.Tip")); //DM18022004 081.6 int17 new - loadlist.setActionCommand("loadlist"); - loadlist.addActionListener(jumpAction); - - savelist = new JButton(Resource.getString("CollectionPanel.saveCutpointList")); - savelist.setPreferredSize(new Dimension(230, 22)); - savelist.setMaximumSize(new Dimension(230, 22)); - savelist.setActionCommand("savelist"); - savelist.addActionListener(jumpAction); - - cutPanel.add(loadlist); - cutPanel.add(savelist); - - - DropTarget dropTarget_3 = new DropTarget(loadlist, dnd2); - DropTarget dropTarget_4 = new DropTarget(cutfield, dnd2); - - grid.add(cutPanel, BorderLayout.EAST); - - add(grid); - - setTitle(Resource.getString("CollectionPanel.Title2")); - } - - /** - * - */ - protected JPanel buildNavigationPanel() - { - /** - * - */ - JPanel jumpPanel = new JPanel(); - jumpPanel.setLayout(new BoxLayout(jumpPanel, BoxLayout.X_AXIS)); + JPanel panel_1 = new JPanel(); + panel_1.add(label); + panel_1.add(combobox); - JButton jump[] = new JButton[navigation.length]; - - for (int i = 0; i < jump.length; i++) - { - jump[i] = new JButton(CommonGui.loadIcon(navigation[i])); - jump[i].setPreferredSize(new Dimension(31, 22)); - jump[i].setMaximumSize(new Dimension(31, 22)); - jump[i].setActionCommand(navigation[i]); - jump[i].addActionListener(jumpAction); - jumpPanel.add(jump[i]); + panel.add(panel_1); } - /** - * - */ - firstfile = new JTextField(file); - firstfile.setToolTipText(Resource.getString("CollectionPanel.CutPanel.Tip2")); - firstfile.setBackground(new Color(230, 230, 230)); - firstfile.setEditable(false); - - JPanel panel_1 = new JPanel(); - panel_1.setLayout(new GridLayout(1, 1)); - panel_1.setPreferredSize(new Dimension(248, 22)); - panel_1.setMaximumSize(new Dimension(248, 22)); - panel_1.setMinimumSize(new Dimension(248, 22)); - panel_1.add(firstfile); - - /** - * - */ - scannedPID = new JTextField(""); - scannedPID.setToolTipText(Resource.getString("CollectionPanel.CutPanel.Tip3")); - scannedPID.setBackground(new java.awt.Color(230, 230, 230)); - scannedPID.setEditable(false); - - JPanel panel_2 = new JPanel(); - panel_2.setLayout(new GridLayout(1, 1)); - panel_2.setPreferredSize(new Dimension(248, 22)); - panel_2.setMaximumSize(new Dimension(248, 22)); - panel_2.setMinimumSize(new Dimension(248, 22)); - panel_2.add(scannedPID); - - /** - * - */ - JPanel panel = new JPanel(); - panel.setLayout(new ColumnLayout()); - panel.add(jumpPanel); - panel.add(panel_2); - panel.add(panel_1); - - return panel; - } - - /** - * - */ - protected JPanel buildCutPointPanel() - { - /** - * - */ - cutadd = new JButton(CommonGui.loadIcon("add.gif")); - cutadd.setActionCommand("addpoint"); - cutadd.setPreferredSize(new Dimension(34, 22)); - cutadd.setMaximumSize(new Dimension(34, 22)); - - cutfield = new JTextField(""); - cutfield.setPreferredSize(new Dimension(112, 22)); - cutfield.setMaximumSize(new Dimension(112, 22)); - cutfield.setToolTipText(Resource.getString("CollectionPanel.CutPanel.Tip4")); - cutfield.setActionCommand("cutnumber"); - - /** - * - */ - JPanel panel_1 = new JPanel(); - panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.X_AXIS)); - panel_1.add(cutadd); - panel_1.add(cutfield); - - /** - * - */ - cutdel = new JButton(CommonGui.loadIcon("rem.gif")); - cutdel.setActionCommand("delpoint"); - cutdel.setPreferredSize(new Dimension(34, 22)); - cutdel.setMaximumSize(new Dimension(34, 22)); - - cut_combobox = new JComboBox(); - cut_combobox.setMaximumRowCount(8); - cut_combobox.setPreferredSize(new Dimension(112, 22)); - cut_combobox.setMaximumSize(new Dimension(112, 22)); - cut_combobox.setActionCommand("cutbox"); - - /** - * - */ - JPanel panel_2 = new JPanel(); - panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS)); - panel_2.add(cutdel); - panel_2.add(cut_combobox); - - /** - * - */ - pointslength = new JTextField(Resource.getString("CollectionPanel.NumberOfPoints")); - pointslength.setToolTipText(Resource.getString("CollectionPanel.NumberOfPoints.Tip")); - pointslength.setBackground(new java.awt.Color(230, 230, 230)); - pointslength.setEditable(false); - - JPanel panel_3 = new JPanel(); - panel_3.setLayout(new GridLayout(1, 1)); - panel_3.setPreferredSize(new Dimension(146, 22)); - panel_3.setMaximumSize(new Dimension(146, 22)); - panel_3.setMinimumSize(new Dimension(146, 22)); - panel_3.add(pointslength); - - cutdel.addActionListener(cutAction); - cutadd.addActionListener(cutAction); - cut_combobox.addActionListener(cutAction); - cutfield.addActionListener(cutAction); - - /** - * - */ - JPanel panel = new JPanel(); - panel.setLayout(new ColumnLayout()); - panel.add(panel_1); - panel.add(panel_2); - panel.add(panel_3); - - Color c = new Color(200, 150, 200); - setComponentColor(cutadd, c); - setComponentColor(cutdel, c); - setComponentColor(panel, c); - - return panel; - } - - /** - * - */ - protected JPanel buildChapterPointPanel() - { - /** - * - */ - chapteradd = new JButton(CommonGui.loadIcon("add.gif")); - chapteradd.setActionCommand("addchapter"); - chapteradd.setPreferredSize(new Dimension(34, 22)); - chapteradd.setMaximumSize(new Dimension(34, 22)); - - chapterdel = new JButton(CommonGui.loadIcon("rem.gif")); - chapterdel.setActionCommand("delchapter"); - chapterdel.setPreferredSize(new Dimension(34, 22)); - chapterdel.setMaximumSize(new Dimension(34, 22)); - - chapterfield = new JTextField(""); - chapterfield.setPreferredSize(new Dimension(34, 22)); - chapterfield.setMaximumSize(new Dimension(34, 22)); - chapterfield.setEditable(false); - - /** - * - */ - JPanel panel_1 = new JPanel(); - panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.X_AXIS)); - panel_1.add(chapteradd); - panel_1.add(chapterdel); - panel_1.add(chapterfield); - - /** - * - */ - - chapter_combobox = new JComboBox(); - chapter_combobox.setMaximumRowCount(8); - chapter_combobox.setPreferredSize(new Dimension(102, 22)); - chapter_combobox.setMaximumSize(new Dimension(102, 22)); - chapter_combobox.setActionCommand("chapterbox"); - - /** - * - */ - JPanel panel_2 = new JPanel(); - panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS)); - panel_2.add(chapter_combobox); - - /** - * - */ - chp = new JTextField(Resource.getString("CollectionPanel.NumberOfChapters")); - chp.setToolTipText(Resource.getString("CollectionPanel.NumberOfChapters.Tip")); - chp.setBackground(new java.awt.Color(230, 230, 230)); - chp.setEditable(false); - - JPanel panel_3 = new JPanel(); - panel_3.setLayout(new GridLayout(1, 1)); - panel_3.setPreferredSize(new Dimension(102, 22)); - panel_3.setMaximumSize(new Dimension(102, 22)); - panel_3.setMinimumSize(new Dimension(102, 22)); - panel_3.add(chp); - - - chapterdel.addActionListener(cutAction); - chapteradd.addActionListener(cutAction); - chapter_combobox.addActionListener(cutAction); - chp.addActionListener(cutAction); - - /** - * - */ - JPanel panel = new JPanel(); - panel.setLayout(new ColumnLayout()); - panel.add(panel_1); - panel.add(panel_2); - panel.add(panel_3); - - Color c = new Color(195, 205, 255); - setComponentColor(chapteradd, c); - setComponentColor(chapterdel, c); - setComponentColor(panel, c); + // panel.add(Box.createRigidArea(new Dimension(1, 4))); return panel; } - - /** - * - */ - private void getType() - { - /** - * cuts - */ - Object[] obj = collection != null ? collection.getCutpoints() : new Object[0]; - int index; - - if (obj.length > 0) - { - index = getCutIndex(obj, String.valueOf(lastPosition)); - - Common.getGuiInterface().showCutIcon((index & 1) == 0, obj, previewList); - } - - else - Common.getGuiInterface().showCutIcon(true, null, previewList); - - /** - * chapters - */ - obj = collection != null ? collection.getChapterpoints() : new Object[0]; - - if (obj.length > 0) - Common.getGuiInterface().showChapterIcon(obj, previewList); - - else - Common.getGuiInterface().showChapterIcon(null, previewList); - - } - - /** - * - */ - private int getLoadSize() - { - try { - int val = Integer.parseInt(Common.getSettings().getProperty(Keys.KEY_PreviewBuffer)); - - return val; - } - catch (Exception e) { - Common.setMessage("!> wrong preview_buffer field entry", true); - } - - return loadSizeForward; - } - - /** - * - */ - private long preview(long position) - { - boolean direction = false; - - try { - - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE || previewList.isEmpty()) - { - scannedPID.setText(Resource.getString("CollectionPanel.Preview.offline")); - - return lastPosition; - } - - action = false; - - int loadSize = getLoadSize(); // bytes for searching the next I-frame ;changed for X0.81 - - if (position>>>4 >= (long)slider.getMaximum()) // last - { - position = position > loadSize ? position - loadSize : 0; - direction = true; - } - - else if (position > 0 && position < lastPosition && ((lastPosition>>>4) - (position>>>4)) < 3L ) - { - position = position > loadSize ? position - loadSize : 0; - direction = true; - } - - position = Preview.load(position, ((direction && position == 0) ? (int)lastPosition : loadSize), previewList, direction, Common.getSettings().getBooleanProperty(Keys.KEY_Preview_AllGops), Common.getSettings().getBooleanProperty(Keys.KEY_Preview_fastDecode), collection.getPIDs(), active_collection); - - String str = Preview.getProcessedFile(); - - if (str.length() > 32) - { - int i = str.indexOf('-'); - - String _str = str.substring(0, i + 2); - str = _str + "..." + str.substring(i + 2 + (str.length() - 34 - i), str.length()); - } - - firstfile.setText(str); - - scannedPID.setText(Resource.getString("CollectionPanel.Preview.processedPid") + Preview.getProcessedPID()); - - lastPosition = position; - - slider.setValue((int)(lastPosition / 16)); - cutfield.setText(String.valueOf(lastPosition)); - slider.requestFocus(); - - } catch (IOException e6) { - - Common.setExceptionMessage(e6); - } - - setTitle(title); - getExpectedSize(); - - updateCutView(String.valueOf(lastPosition)); - - action = true; - - return lastPosition; - } - - /** - * - */ - private boolean addChapterpoint(String value) - { - int index = 0; - - index = getCutIndex(collection.getChapterpoints(), value); - - if (index >= 0) - return false; - - collection.addChapterpoint(-index - 1, value); - - reloadChapterpoints(); - - chapter_combobox.setSelectedItem(value); - - return true; - } - - /** - * - */ - private Object removeChapterpoint(int index) - { - Object obj = collection.removeChapterpoint(index); - - reloadChapterpoints(); - - Object[] objects = collection.getChapterpoints(); - - if (objects.length > 0) - { - int _index = -getCutIndex(collection.getChapterpoints(), obj.toString()) - 1; - - if (_index >= objects.length) - _index = objects.length - 1; - - chapter_combobox.setSelectedIndex(_index); - } - - return obj; - } - - /** - * - */ - private void reloadChapterpoints() - { - chapter_combobox.removeAllItems(); - - Object[] object = collection != null ? collection.getChapterpoints() : new Object[0]; - - for (int i = 0; i < object.length; i++) - chapter_combobox.addItem(object[i]); - } - - /** - * - */ - private boolean addCutpoint(String value) - { - int index = 0; - - index = getCutIndex(collection.getCutpoints(), value); - - if (index >= 0) - return false; - - collection.addCutpoint(-index - 1, value); - - reloadCutpoints(); - - cut_combobox.setSelectedItem(value); - - return true; - } - - /** - * - */ - private Object removeCutpoint(int index) - { - Object obj = collection.removeCutpoint(index); - - reloadCutpoints(); - - Object[] objects = collection.getCutpoints(); - - if (objects.length > 0) - { - int _index = -getCutIndex(collection.getCutpoints(), obj.toString()) - 1; - - if (_index >= objects.length) - _index = objects.length - 1; - - cut_combobox.setSelectedIndex(_index); - } - - return obj; - } - - /** - * - */ - private void reloadCutpoints() - { - cut_combobox.removeAllItems(); - - Object[] object = collection != null ? collection.getCutpoints() : new Object[0]; - - for (int i = 0; i < object.length; i++) - cut_combobox.addItem(object[i]); - } - - /** - * - */ - private int getCutIndex(Object[] obj, String value) - { - class MyComparator implements Comparator - { - public int compare(Object o1, Object o2) - { - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_TIME) - return Long.toString(CommonParsing.parseCutValue(o1.toString(), false)).compareTo(Long.toString(CommonParsing.parseCutValue(o2.toString(), false))); - - else - return Long.valueOf(o1.toString()).compareTo(Long.valueOf(o2.toString())); - } - } - - /** - * handle wrong numbers - */ - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) - if (CommonParsing.parseCutValue(value, false) < 0) - return 0; - - return Arrays.binarySearch(obj, value, new MyComparator()); // is already sorted - } - - /** - * updates last and next cutpoint view - */ - private void updateCutView(String value) - { - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE) - { - cutview.clearViews(); - return; - } - - Object[] listData = collection == null ? null : collection.getCutpoints(); - - if (listData == null || listData.length == 0) - { - cutview.clearViews(); - return; - } - - int index = getCutIndex(listData, value); - - if (index < 0) - { - int i = -index - 1; - - cutview.setMatchingPoint(false, listData, index); - cutview.setImage(i < listData.length ? collection.getCutImage(listData[i]) : null, listData, i, cutview.getBottom()); - cutview.setImage(i - 1 >= 0 && i - 1 < listData.length ? collection.getCutImage(listData[i - 1]) : null, listData, i - 1, cutview.getTop()); - } - - else - { - if (collection.getCutImage(listData[index]) == null) - collection.setCutImage(value, Common.getMpvDecoderClass().getCutImage()); - - cutview.setMatchingPoint(true, listData, index); - cutview.setImage(index + 1 < listData.length ? collection.getCutImage(listData[index + 1]) : null, listData, index + 1, cutview.getBottom()); - cutview.setImage(index - 1 >= 0 ? collection.getCutImage(listData[index - 1]) : null, listData, index - 1, cutview.getTop()); - } - } - - /** - * - */ - private boolean checkActiveCollection() - { - if (active_collection >= 0) - return true; - - collection = null; - - action = false; - - includeList.setListData(new Object[0]); - previewList.clear(); - reloadCutpoints(); - reloadChapterpoints(); - Common.getGuiInterface().showCutIcon(true, null, previewList); - Common.getGuiInterface().showChapterIcon(null, previewList); - - scannedPID.setText(Resource.getString("CollectionPanel.Preview.offline")); - firstfile.setText(""); - slider.setMaximum(1); - setTitle(Resource.getString("CollectionPanel.Title2")); - - Common.setOSDMessage(Resource.getString("CollectionPanel.Preview.offline")); - - action = true; - - return false; - } - - /** - * - */ - public void entry(int _active_collection) - { - if (active_collection != _active_collection) - cutview.clearViews(); - - active_collection = _active_collection; - - Common.getMpvDecoderClass().clearPreviewPixel(); - - /** - * - */ - if (!checkActiveCollection()) - return; - - CommonGui.getPicturePanel().showCollectionNumber(active_collection); - - cutmode_combobox.setSelectedIndex(Common.getSettings().getIntProperty(Keys.KEY_CutMode)); - - collection = Common.getCollection(active_collection); - - includeList.setListData(collection.getPIDs()); - - List input_files = collection.getInputFilesAsList(); - previewList.clear(); - - file = !input_files.isEmpty() ? input_files.get(0).toString() : ""; - - /** - * determine primary file segments, scan only if changed (date modified) or not scanned - */ - long start = 0; - long end = 0; - int size = input_files.size(); - int primaryFilesCount = 1; - - if (Common.getSettings().getBooleanProperty(Keys.KEY_Preview_disable)) - size = 0; - - filesearch: - for (int a = 0, b = -1, type = -1; a < size; a++) - { - XInputFile xInputFile = ((XInputFile) input_files.get(a)).getNewInstance(); - - if (xInputFile == null) - continue; - - if (xInputFile.getStreamInfo() == null) - Common.getScanClass().getStreamInfo(xInputFile); //note: is a new instance - - type = xInputFile.getStreamInfo().getStreamType(); - - if (b != -1 && b != type) - { - primaryFilesCount = a; - break filesearch; - } - - switch (type) - { - case CommonParsing.PES_AV_TYPE: - case CommonParsing.MPEG1PS_TYPE: - case CommonParsing.MPEG2PS_TYPE: - case CommonParsing.PVA_TYPE: - case CommonParsing.TS_TYPE: - case CommonParsing.ES_MPV_TYPE: - b = type; - - start = end; - end += xInputFile.length(); - previewList.add(new PreviewObject(start, end, type, xInputFile)); - break; - - default: - break filesearch; - } - } - - action = false; - - slider.setMaximum(end > 16 ? (int)(end / 16) : 1); - - action = true; - - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE && !previewList.isEmpty()) - preview(0); - - else - { - scannedPID.setText(Resource.getString("CollectionPanel.Preview.offline")); - firstfile.setText(""); - - Common.getMpvDecoderClass().clearPreviewPixel(); - Common.setOSDMessage(Resource.getString("CollectionPanel.Preview.offline")); - } - - title = Resource.getString("CollectionPanel.Title2") + " " + active_collection; - setTitle(title); - - action = false; - - reloadCutpoints(); - reloadChapterpoints(); - cut_combobox.setSelectedIndex(cut_combobox.getItemCount() - 1); - - getExpectedSize(); - getType(); - - action = true; - } - - /** - * - */ - private void saveList() - { - Object[] object = collection.getCutpoints(); - - if (object.length == 0) - return; - - String newfile = file + "[" + active_collection + "].Xcl"; - - chooser.setSelectedFile(new File(newfile)); - chooser.rescanCurrentDirectory(); - - int retval = chooser.showSaveDialog(this); - - if(retval == JFileChooser.APPROVE_OPTION) - { - File theFile = chooser.getSelectedFile(); - - if(theFile != null && !theFile.isDirectory()) - { - newfile = theFile.getAbsolutePath(); - } - } - - else - return; - - try { - - BufferedWriter listwriter = new BufferedWriter(new FileWriter(newfile)); - - listwriter.write(Keys.KEY_CutMode[0] + "=" + Common.getSettings().getProperty(Keys.KEY_CutMode)); - listwriter.newLine(); - - for (int i = 0; i < object.length; i++) - { - listwriter.write(object[i].toString()); - listwriter.newLine(); - } - - listwriter.close(); - } - - catch (IOException e) { - - Common.setMessage(Resource.getString("CollectionPanel.FileAccessError") + " " + file); - } - } - - /** - * - */ - private void loadList() - { - loadList(""); - } - - /** - * - */ - private void loadList(String newfile) - { - List pointlist = new ArrayList(); - - String point = ""; - - if (!(new File(newfile).exists())) - { - chooser.rescanCurrentDirectory(); - int retval = chooser.showOpenDialog(this); - - if(retval == JFileChooser.APPROVE_OPTION) - { - File theFile = chooser.getSelectedFile(); - - if(theFile != null && !theFile.isDirectory()) - newfile = theFile.getAbsolutePath(); - } - else - return; - } - - try { - - BufferedReader listreader = new BufferedReader(new FileReader(newfile)); - - while (true) - { - point = listreader.readLine(); - - if (point == null) - break; - - if (point.trim().equals("")) - continue; - - if (point.startsWith(Keys.KEY_CutMode[0])) - { - cutmode_combobox.setSelectedIndex(Integer.parseInt(point.substring(point.indexOf("=") + 1).trim())); - continue; - } - - if (point.startsWith("(")) - continue; - - pointlist.add(point); - } - - listreader.close(); - - } catch (IOException e5) { - - Common.setMessage(Resource.getString("CollectionPanel.loadCutpointList.Error") + " " + file); - } - - Object[] obj = pointlist.toArray(); - - if (obj.length > 0) - { - long[] cutPoints = new long[obj.length]; - - for (int i = 0; i < cutPoints.length; i++) - cutPoints[i] = CommonParsing.parseCutValue(obj[i].toString(), false); - - Arrays.sort(cutPoints); - - for (int i = 0; i < cutPoints.length; i++) - collection.addCutpoint(CommonParsing.parseCutValue(cutPoints[i])); - - action = false; - - reloadCutpoints(); - cut_combobox.setSelectedIndex(cut_combobox.getItemCount() - 1); - } - - getExpectedSize(); - getType(); - - action = true; - } - - /** - * - */ - private void getExpectedSize() - { - if (previewList.isEmpty()) - { - pointslength.setText(Resource.getString("CollectionPanel.NumberOfPoints") + " " + cut_combobox.getItemCount()); - return; - } - - Object[] object = collection.getCutpoints(); - - long newSize[] = new long[object.length]; - long start = 0; - long diff = 0; - long end = 0; - - if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) - { - for (int i = 0; i < newSize.length; i++) - newSize[i] = Long.parseLong(object[i].toString()); - - if (newSize.length == 0 || (newSize.length & 1) == 1) - end = ((PreviewObject) previewList.get(previewList.size() - 1)).getEnd(); - - else - end = newSize[newSize.length - 1]; - - for (int i = 0; i < newSize.length; i += 2) - { - diff += newSize[i] - start; - start = i + 1 < newSize.length ? newSize[i + 1] : start; - } - } - - String length = Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE ? (Resource.getString("CollectionPanel.expectedSize") + ((end - diff) / 1048576L) + "MB") : ""; - - pointslength.setText(length); - chp.setText(Resource.getString("CollectionPanel.NumberOfChapters") + " " + chapter_combobox.getItemCount()); - } - - private void setTitle(String str) - { - titleLabel.setText(str); - } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CollectionProperties.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CollectionProperties.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CollectionProperties.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CollectionProperties.java 2011-03-13 08:54:06.000000000 +0000 @@ -0,0 +1,1644 @@ +/* + * @(#)ColelctionProperties.java + * + * Copyright (c) 2006-2009 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.gui; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.KeyEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseAdapter; +import java.awt.Color; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.UIManager; +import javax.swing.SwingConstants; +import javax.swing.JMenuBar; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.KeyStroke; +import javax.swing.JList; +import javax.swing.JScrollPane; + +import net.sourceforge.dvb.projectx.gui.UISwitchListener; +import net.sourceforge.dvb.projectx.gui.CommonGui; +import net.sourceforge.dvb.projectx.gui.ColumnLayout; + + +import net.sourceforge.dvb.projectx.common.Keys; +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Resource; +import net.sourceforge.dvb.projectx.common.JobCollection; + +/** + * + */ +public class CollectionProperties extends JFrame { + + private String title = Resource.getString("General.CollectionProperties"); + private int collection_number = -1; + + private final Color head_color = new Color(224, 224, 224); + + private CPComboBoxIndexListener _ComboBoxIndexListener = new CPComboBoxIndexListener(); + private CPComboBoxItemListener _ComboBoxItemListener = new CPComboBoxItemListener(); + private CPCheckBoxListener _CheckBoxListener = new CPCheckBoxListener(); + private CPTextFieldListener _TextFieldListener = new CPTextFieldListener(); + private CPTextFieldKeyListener _TextFieldKeyListener = new CPTextFieldKeyListener(); + + private JobCollection collection; + + private JPanel container; + private JPanel tabPanel; + + + /** + * Constructor + */ + public CollectionProperties() + { + addWindowListener(new WindowAdapter() + { + public void windowClosing(WindowEvent e) + { + close(); + } + }); + + container = new JPanel(); + container.setLayout(new BorderLayout()); + + buildMenu(); + + getContentPane().add(container); + + setTitle(title); + setBounds(200, 100, 720, 480); + setResizable(false); + + UIManager.addPropertyChangeListener(new UISwitchListener(getRootPane())); + } + + /** + * + */ + public void open(JobCollection collection, int value) + { + if (value < 0) + return; + + this.collection = collection; + collection_number = value; + + clearTabPanel(); + + if (!collection.hasSettings()) + collection.setSettings(Common.getSettings()); + + tabPanel = buildTabPanel(); + container.add(tabPanel); + + setTitle(title + " # " + collection_number); + show(); + } + + /** + * + */ + public void close() + { + collection = null; + + container.remove(tabPanel); + tabPanel = null; + + dispose(); + } + + /** + * + */ + public void closeAndRevert() + { + if (collection != null) + collection.setSettings(null); + + collection = null; + + container.remove(tabPanel); + tabPanel = null; + + dispose(); + } + + /** + * + */ + private void clearTabPanel() + { + if (tabPanel != null) + container.remove(tabPanel); + + tabPanel = null; + } + + /** + * + */ + public void savePreferences() + { + String str = CommonGui.getUserInput(this, "save ini", "save inifile", Common.getSettings().getInifile()); + + if (str != null && str.length() > 0) + Common.saveSettings(str); + + toFront(); + } + + /** + * + */ + private boolean getBooleanProperty(String[] str) + { + boolean b = false; + + if (collection == null) + return b; + + b = collection.getSettings().getBooleanProperty(str); + + return b; + } + + /** + * + */ + private int getIntProperty(String[] str) + { + int value = 0; + + if (collection == null) + return value; + + value = collection.getSettings().getIntProperty(str); + + return value; + } + + /** + * + */ + private String getProperty(String[] str) + { + String obj = ""; + + if (collection == null) + return obj; + + obj = collection.getSettings().getProperty(str); + + return obj; + } + + /** + * + */ + private void setBooleanProperty(String str, boolean b) + { + if (collection == null) + return; + + collection.getSettings().setBooleanProperty(str, b); + + } + + /** + * + */ + private void setProperty(String str1, String str2) + { + if (collection == null) + return; + + collection.getSettings().setProperty(str1, str2); + + } + + /** + * + */ + private void setProperty(String str, Object obj) + { + if (collection == null) + return; + + collection.getSettings().setProperty(str, obj); + + } + + /** + * + */ + protected void buildMenu() + { + JMenuBar menuBar = new JMenuBar(); + + menuBar.add(buildFileMenu()); + + setJMenuBar(menuBar); + } + + /** + * + */ + protected JMenu buildFileMenu() + { + JMenu fileMenu = new JMenu(); + CommonGui.localize(fileMenu, "Common.File"); + + JMenuItem save = new JMenuItem(); + CommonGui.localize(save, "Common.SaveAs"); + save.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + savePreferences(); + } + }); + + fileMenu.add(save); + fileMenu.addSeparator(); + + JMenuItem closeAndRevert = new JMenuItem(); + CommonGui.localize(closeAndRevert, "Common.CloseAndRevert"); + closeAndRevert.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.ALT_MASK)); + closeAndRevert.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + closeAndRevert(); + } + }); + + fileMenu.add(closeAndRevert); + fileMenu.addSeparator(); + + JMenuItem close = new JMenuItem(); + CommonGui.localize(close, "Common.Close"); + close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); + close.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + close(); + } + }); + + fileMenu.add(close); + + return fileMenu; + } + + /** + * + */ + protected JPanel buildTabPanel() + { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setBorder(BorderFactory.createEmptyBorder(5, 2, 2, 2)); + + JTabbedPane logtab = new JTabbedPane(SwingConstants.LEFT); + + logtab.addTab( "Main", buildMainPanel()); + logtab.addTab( Resource.getString("TabPanel.ExportPanel"), buildExportPanel()); + logtab.addTab( Resource.getString("TabPanel.SpecialPanel"), buildSpecialPanel()); + logtab.addTab( Resource.getString("TabPanel.VideoPanel"), buildVideoPanel()); + logtab.addTab( Resource.getString("TabPanel.AudioPanel"), buildAudioPanel()); + logtab.addTab( Resource.getString("TabPanel.SubtitlePanel"), buildSubtitlePanel()); + logtab.addTab( Resource.getString("TabPanel.ExternPanel"), buildExternPanel()); + logtab.addTab( Resource.getString("TabPanel.PostCommandsPanel"), buildPostCommandsPanel()); + + logtab.setSelectedIndex(0); + + panel.add(logtab, BorderLayout.CENTER); + + return panel; + } + + /** + * + */ + protected JPanel buildHeadPanel(JPanel panel, String str) + { + JPanel panel_1 = new JPanel(new BorderLayout()); + panel_1.setBackground(head_color); + panel_1.setBorder(BorderFactory.createTitledBorder("")); + panel_1.add(new JLabel(" " + str)); + + JPanel panel_2 = new JPanel(new BorderLayout()); + panel_2.add(panel, BorderLayout.CENTER); + panel_2.add(panel_1, BorderLayout.NORTH); + + return panel_2; + } + + /** + * + */ + protected JPanel buildMainPanel() + { + JPanel panel = new JPanel(); + panel.setLayout( new BorderLayout() ); + panel.setBorder( BorderFactory.createTitledBorder("") ); + + panel.add(new JLabel(Resource.getString("General.CollectionProperties.Hint"))); + + return buildHeadPanel(panel, "Main"); + } + + /** + * + */ + protected JPanel buildSpecialPanel() + { + JPanel idbigPanel = new JPanel(); + idbigPanel.setLayout( new GridLayout(1,2) ); + + JPanel idPanel3 = new JPanel(); + idPanel3.setLayout ( new ColumnLayout() ); + idPanel3.setBorder( BorderFactory.createTitledBorder(Resource.getString("SpecialPanel.Title1")) ); + + String[][] objects = { + Keys.KEY_VOB_resetPts, + Keys.KEY_PVA_FileOverlap, + Keys.KEY_PVA_Audio, + Keys.KEY_TS_ignoreScrambled, + Keys.KEY_TS_blindSearch, + Keys.KEY_TS_joinPackets, + Keys.KEY_TS_HumaxAdaption, + Keys.KEY_TS_FinepassAdaption, + Keys.KEY_TS_JepssenAdaption, + Keys.KEY_TS_KoscomAdaption, + //Keys.KEY_TS_ArionAdaption, + Keys.KEY_TS_generatePmt, + Keys.KEY_TS_generateTtx, + Keys.KEY_TS_setMainAudioAc3 + }; + + for (int i = 0; i < objects.length; i++) + { + JCheckBox box = new JCheckBox(Resource.getString(objects[i][0])); + box.setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); + box.setPreferredSize(new Dimension(270, 20)); + box.setMaximumSize(new Dimension(270, 20)); + box.setActionCommand(objects[i][0]); + box.setSelected(getBooleanProperty(objects[i])); + box.addActionListener(_CheckBoxListener); + + // if (i == 3) + // idPanel3.add(Box.createRigidArea(new Dimension(1, 10))); + + idPanel3.add(box); + } + + + JComboBox tsheader_mode = new JComboBox(Keys.ITEMS_TsHeaderMode); + tsheader_mode.setPreferredSize(new Dimension(270, 20)); + tsheader_mode.setMaximumSize(new Dimension(270, 20)); + tsheader_mode.setActionCommand(Keys.KEY_TsHeaderMode[0]); + tsheader_mode.setSelectedIndex(getIntProperty(Keys.KEY_TsHeaderMode)); + tsheader_mode.addActionListener(_ComboBoxIndexListener); + idPanel3.add(tsheader_mode); + + idbigPanel.add(idPanel3); + + + // next grid + + JPanel idPanel2 = new JPanel(); + idPanel2.setLayout ( new ColumnLayout() ); + idPanel2.setBorder( BorderFactory.createTitledBorder(Resource.getString("SpecialPanel.Title2")) ); + + JLabel gpts = new JLabel(Resource.getString("SpecialPanel.PtsShift") + " "); + gpts.setToolTipText(Resource.getString("SpecialPanel.PtsShift.Tip")); + + JComboBox pts_shift = new JComboBox(Keys.ITEMS_PtsShift); + pts_shift.setPreferredSize(new Dimension(60, 20)); + pts_shift.setMaximumSize(new Dimension(60, 20)); + pts_shift.setEditable(true); + pts_shift.setActionCommand(Keys.KEY_PtsShift_Value[0]); + pts_shift.setSelectedItem(getProperty(Keys.KEY_PtsShift_Value)); + pts_shift.addActionListener(_ComboBoxItemListener); + + JPanel spec5 = new JPanel(); + spec5.setLayout(new BoxLayout(spec5, BoxLayout.X_AXIS)); + spec5.add(gpts); + spec5.add(pts_shift); + + idPanel2.add(spec5); + + String[][] objects_2 = { + Keys.KEY_Input_getEnclosedPackets, + Keys.KEY_Input_concatenateForeignRecords, + Keys.KEY_Input_useReadOverhead, + Keys.KEY_Audio_ignoreErrors, + Keys.KEY_Audio_limitPts, + Keys.KEY_Audio_allowFormatChanges, + Keys.KEY_Video_ignoreErrors, + Keys.KEY_Video_trimPts, + Keys.KEY_Video_cutPts + }; + + for (int i = 0; i < objects_2.length; i++) + { + JCheckBox box = new JCheckBox(Resource.getString(objects_2[i][0])); + box.setToolTipText(Resource.getString(objects_2[i][0] + Keys.KEY_Tip)); + box.setPreferredSize(new Dimension(270, 20)); + box.setMaximumSize(new Dimension(270, 20)); + box.setActionCommand(objects_2[i][0]); + box.setSelected(getBooleanProperty(objects_2[i])); + box.addActionListener(_CheckBoxListener); + + if (i == 3 || i == 6) + idPanel2.add(Box.createRigidArea(new Dimension(1, 2))); + + idPanel2.add(box); + } + + //idPanel2.add(Box.createRigidArea(new Dimension(1, 10))); + + idPanel2.add(new JLabel(Resource.getString("SpecialPanel.Conversion"))); + + String[][] objects_3 = { Keys.KEY_Conversion_startWithVideo }; + + JCheckBox box_1 = new JCheckBox(Resource.getString(objects_3[0][0])); + box_1.setToolTipText(Resource.getString(objects_3[0][0] + Keys.KEY_Tip)); + box_1.setPreferredSize(new Dimension(270, 20)); + box_1.setMaximumSize(new Dimension(270, 20)); + box_1.setActionCommand(objects_3[0][0]); + box_1.setSelected(getBooleanProperty(objects_3[0])); + box_1.addActionListener(_CheckBoxListener); + idPanel2.add(box_1); + + String[][] objects_4 = { Keys.KEY_Conversion_addPcrToStream }; + + JCheckBox box_2 = new JCheckBox(Resource.getString(objects_4[0][0])); + box_2.setToolTipText(Resource.getString(objects_4[0][0] + Keys.KEY_Tip)); + box_2.setPreferredSize(new Dimension(192, 20)); + box_2.setMaximumSize(new Dimension(192, 20)); + box_2.setActionCommand(objects_4[0][0]); + box_2.setSelected(getBooleanProperty(objects_4[0])); + box_2.addActionListener(_CheckBoxListener); + + String[][] objects_5 = { Keys.KEY_Conversion_PcrCounter }; + + JCheckBox box_3 = new JCheckBox(Resource.getString(objects_5[0][0])); + box_3.setToolTipText(Resource.getString(objects_5[0][0] + Keys.KEY_Tip)); + box_3.setPreferredSize(new Dimension(80, 20)); + box_3.setMaximumSize(new Dimension(80, 20)); + box_3.setActionCommand(objects_5[0][0]); + box_3.setSelected(getBooleanProperty(objects_5[0])); + box_3.addActionListener(_CheckBoxListener); + + JPanel spec3 = new JPanel(); + spec3.setLayout(new BoxLayout(spec3, BoxLayout.X_AXIS)); + spec3.add(box_2); + spec3.add(box_3); + + idPanel2.add(spec3); + + + JComboBox pcr_delta = new JComboBox(Keys.ITEMS_PcrDelta); + pcr_delta.setPreferredSize(new Dimension(60, 20)); + pcr_delta.setMaximumSize(new Dimension(60, 20)); + pcr_delta.setEditable(true); + pcr_delta.setActionCommand(Keys.KEY_PcrDelta_Value[0]); + pcr_delta.setSelectedItem(getProperty(Keys.KEY_PcrDelta_Value)); + pcr_delta.addActionListener(_ComboBoxItemListener); + idPanel2.add(pcr_delta); + + idbigPanel.add(idPanel2); + + return buildHeadPanel(idbigPanel, Resource.getString("TabPanel.SpecialPanel")); + } + + /** + * + */ + protected JPanel buildExportPanel() + { + JPanel exportPanel = new JPanel(); + exportPanel.setLayout( new GridLayout(2, 2) ); + + JPanel op1 = new JPanel(); + op1.setLayout( new ColumnLayout() ); + op1.setBorder( BorderFactory.createTitledBorder(Resource.getString("ExportPanel.SplitPanel")) ); + + String[][] objects = { + Keys.KEY_SplitSize, + Keys.KEY_ExportPanel_Export_Overlap, + Keys.KEY_additionalOffset + }; + + JCheckBox[] box = new JCheckBox[objects.length]; + + for (int i = 0; i < objects.length; i++) + { + box[i] = new JCheckBox(Resource.getString(objects[i][0])); + box[i].setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); + box[i].setActionCommand(objects[i][0]); + box[i].setSelected(getBooleanProperty(objects[i])); + box[i].addActionListener(_CheckBoxListener); + } + + JComboBox split_sizes = new JComboBox(Keys.ITEMS_Export_SplitSize); + split_sizes.setPreferredSize(new Dimension(100, 22)); + split_sizes.setMaximumSize(new Dimension(100, 22)); + split_sizes.setEditable(true); + split_sizes.setActionCommand(Keys.KEY_ExportPanel_SplitSize_Value[0]); + split_sizes.setSelectedItem(getProperty(Keys.KEY_ExportPanel_SplitSize_Value)); + split_sizes.addActionListener(_ComboBoxItemListener); + + JPanel sp1 = new JPanel(); + sp1.setLayout(new BoxLayout(sp1, BoxLayout.X_AXIS)); + sp1.add(box[0]); + sp1.add(split_sizes); + + op1.add(sp1); + + + JComboBox overlap = new JComboBox(Keys.ITEMS_Export_Overlap); + overlap.setPreferredSize(new Dimension(100, 22)); + overlap.setMaximumSize(new Dimension(100, 22)); + overlap.setActionCommand(Keys.KEY_ExportPanel_Overlap_Value[0]); + overlap.setSelectedIndex(getIntProperty(Keys.KEY_ExportPanel_Overlap_Value)); + overlap.addActionListener(_ComboBoxIndexListener); + + JPanel sp2 = new JPanel(); + sp2.setLayout(new BoxLayout(sp2, BoxLayout.X_AXIS)); + sp2.add(box[1]); + sp2.add(overlap); + + op1.add(sp2); + + op1.add(Box.createRigidArea(new Dimension(1, 10))); + + JPanel op6 = new JPanel(); + op6.setLayout(new BoxLayout(op6, BoxLayout.X_AXIS)); + op6.add(new JLabel(Resource.getString("ExportPanel.WriteOptions.InfoScan"))); + + JComboBox infoscan = new JComboBox(Keys.ITEMS_Infoscan); + infoscan.setPreferredSize(new Dimension(60, 22)); + infoscan.setMaximumSize(new Dimension(60, 22)); + infoscan.setEditable(true); + infoscan.setActionCommand(Keys.KEY_ExportPanel_Infoscan_Value[0]); + infoscan.setSelectedItem(getProperty(Keys.KEY_ExportPanel_Infoscan_Value)); + infoscan.addActionListener(_ComboBoxItemListener); + op6.add(infoscan); + + op1.add(op6); + + exportPanel.add(op1); + + + JPanel op5 = new JPanel(); + op5.setLayout( new ColumnLayout() ); + op5.setBorder( BorderFactory.createTitledBorder(Resource.getString("ExportPanel.additionalOffset.Title")) ); + + JPanel op7 = new JPanel(); + op7.setLayout(new BoxLayout(op7, BoxLayout.X_AXIS)); + + op7.add(box[2]); + + JTextField offset_value = new JTextField(getProperty(Keys.KEY_ExportPanel_additionalOffset_Value)); + offset_value.setPreferredSize(new Dimension(80, 22)); + offset_value.setMaximumSize(new Dimension(80, 22)); + offset_value.setToolTipText(Resource.getString(Keys.KEY_ExportPanel_additionalOffset_Value[0] + Keys.KEY_Tip)); + offset_value.setEditable(true); + offset_value.setActionCommand(Keys.KEY_ExportPanel_additionalOffset_Value[0]); + offset_value.addActionListener(_TextFieldListener); + offset_value.addKeyListener(_TextFieldKeyListener); + op7.add(offset_value); + + op5.add(op7); + + exportPanel.add(op5); + + return buildHeadPanel(exportPanel, Resource.getString("TabPanel.ExportPanel")); + } + + /** + * + */ + protected JPanel buildVideoPanel() + { + JPanel video1 = new JPanel(); + video1.setLayout( new GridLayout(1, 2) ); + + JPanel video2Panel = new JPanel(); + video2Panel.setLayout( new ColumnLayout() ); + video2Panel.setBorder( BorderFactory.createTitledBorder(Resource.getString("VideoPanel.Title1")) ); + + String[][] objects = { + Keys.KEY_VideoPanel_addEndcode, + Keys.KEY_VideoPanel_insertEndcode, + Keys.KEY_VideoPanel_addSequenceHeader, + Keys.KEY_VideoPanel_clearCDF, + Keys.KEY_VideoPanel_patchToProgressive, + Keys.KEY_VideoPanel_patchToInterlaced, + Keys.KEY_VideoPanel_toggleFieldorder, + Keys.KEY_VideoPanel_addSde + }; + + final JCheckBox[] box = new JCheckBox[objects.length]; + + for (int i = 0; i < objects.length; i++) + { + box[i] = new JCheckBox(Resource.getString(objects[i][0])); + box[i].setPreferredSize(new Dimension(270, 20)); + box[i].setMaximumSize(new Dimension(270, 20)); + box[i].setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); + box[i].setActionCommand(objects[i][0]); + box[i].setSelected(getBooleanProperty(objects[i])); + box[i].addActionListener(_CheckBoxListener); + } + + ActionListener al = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + JCheckBox checkBox = (JCheckBox)e.getSource(); + String str = checkBox.getActionCommand(); + + if (str.equals(Keys.KEY_VideoPanel_patchToProgressive[0]) && checkBox.isSelected()) + { + box[5].setSelected(false); + Common.getSettings().setBooleanProperty(Keys.KEY_VideoPanel_patchToInterlaced[0], false); + return; + } + + else if (str.equals(Keys.KEY_VideoPanel_patchToInterlaced[0]) && checkBox.isSelected()) + { + box[4].setSelected(false); + Common.getSettings().setBooleanProperty(Keys.KEY_VideoPanel_patchToProgressive[0], false); + return; + } + } + }; + + box[4].addActionListener(al); + box[5].addActionListener(al); + + for (int i = 0; i < 7; i++) + video2Panel.add(box[i]); + + JPanel SdePanel = new JPanel(); + SdePanel.setLayout(new BoxLayout(SdePanel, BoxLayout.X_AXIS)); + + box[7].setPreferredSize(new Dimension(180, 20)); + box[7].setMaximumSize(new Dimension(180, 20)); + SdePanel.add(box[7]); + + JTextField sde_value = new JTextField(getProperty(Keys.KEY_VideoPanel_SdeValue)); + sde_value.setPreferredSize(new Dimension(80, 20)); + sde_value.setMaximumSize(new Dimension(80, 20)); + sde_value.setToolTipText(Resource.getString(Keys.KEY_VideoPanel_SdeValue[0] + Keys.KEY_Tip)); + sde_value.setEditable(true); + sde_value.setActionCommand(Keys.KEY_VideoPanel_SdeValue[0]); + sde_value.addActionListener(_TextFieldListener); + sde_value.addKeyListener(_TextFieldKeyListener); + SdePanel.add(sde_value); + + video2Panel.add(SdePanel); + + video2Panel.add(new JLabel (Resource.getString("VideoPanel.patchResolution"))); + + + JPanel hPPanel = new JPanel(); + hPPanel.setLayout(new BoxLayout(hPPanel, BoxLayout.X_AXIS)); + hPPanel.setToolTipText(Resource.getString("VideoPanel.patchResolution.Tip")); + + JComboBox combobox_35 = new JComboBox(Keys.ITEMS_ConditionalHorizontalPatch); + combobox_35.setPreferredSize(new Dimension(160, 20)); + combobox_35.setMaximumSize(new Dimension(160, 20)); + combobox_35.setActionCommand(Keys.KEY_ConditionalHorizontalPatch[0]); + combobox_35.setSelectedIndex(getIntProperty(Keys.KEY_ConditionalHorizontalPatch)); + combobox_35.addActionListener(_ComboBoxIndexListener); + hPPanel.add(combobox_35); + + JComboBox combobox_22 = new JComboBox(Keys.ITEMS_ExportHorizontalResolution); + combobox_22.setPreferredSize(new Dimension(50, 20)); + combobox_22.setMaximumSize(new Dimension(50, 20)); + combobox_22.setActionCommand(Keys.KEY_ConditionalHorizontalResolution[0]); + combobox_22.setSelectedItem(getProperty(Keys.KEY_ConditionalHorizontalResolution)); + combobox_22.addActionListener(_ComboBoxItemListener); + hPPanel.add(combobox_22); + + video2Panel.add(hPPanel); + + video2Panel.add(Box.createRigidArea(new Dimension(1, 10))); + + JPanel video2 = new JPanel(); + video2.setLayout(new ColumnLayout()); + video2.setBorder( BorderFactory.createTitledBorder(Resource.getString("VideoPanel.Title1")) ); + + String[] labels = { + Resource.getString("VideoPanel.ChangeVbvBuffer"), + Resource.getString("VideoPanel.ChangeVbvDelay"), + Resource.getString("VideoPanel.ChangeAspectRatio") + }; + + Object[][] items = { + Keys.ITEMS_ChangeVbvBuffer, + Keys.ITEMS_ChangeVbvDelay, + Keys.ITEMS_ChangeAspectRatio, + }; + + String[][] keys = { + Keys.KEY_ChangeVbvBuffer, + Keys.KEY_ChangeVbvDelay, + Keys.KEY_ChangeAspectRatio + }; + + for (int i = 0; i < keys.length; i++) + { + JLabel label = new JLabel(labels[i]); + label.setPreferredSize(new Dimension(120, 20)); + label.setMaximumSize(new Dimension(120, 20)); + + JComboBox combobox = new JComboBox(items[i]); + combobox.setPreferredSize(new Dimension(150, 20)); + combobox.setMaximumSize(new Dimension(150, 20)); + combobox.setActionCommand(keys[i][0]); + combobox.setSelectedIndex(getIntProperty(keys[i])); + combobox.addActionListener(_ComboBoxIndexListener); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + panel.setToolTipText(labels[i] + Keys.KEY_Tip); + panel.add(label); + panel.add(combobox); + + video2Panel.add(panel); + } + + video1.add(video2Panel); + + + JPanel video3 = new JPanel(); + video3.setLayout( new GridLayout(2, 1) ); + + + JPanel newBrPanel = new JPanel(); + newBrPanel.setLayout(new ColumnLayout()); + newBrPanel.setBorder( BorderFactory.createTitledBorder(Resource.getString("VideoPanel.Title2")) ); + + String[] labels_2 = { + Resource.getString("VideoPanel.patchBitrateValue"), + Resource.getString("VideoPanel.patch1stBitrateValue") + }; + + Object[][] items_2 = { + Keys.ITEMS_BitrateInAllSequences, + Keys.ITEMS_BitrateInFirstSequence + }; + + String[][] keys_2 = { + Keys.KEY_ChangeBitrateInAllSequences, + Keys.KEY_ChangeBitrateInFirstSequence + }; + + for (int i = 0; i < keys_2.length; i++) + { + JLabel label = new JLabel(labels_2[i]); + label.setPreferredSize(new Dimension(270, 20)); + label.setMaximumSize(new Dimension(270, 20)); + label.setToolTipText(labels_2[i] + Keys.KEY_Tip); + + JComboBox combobox = new JComboBox(items_2[i]); + combobox.setPreferredSize(new Dimension(270, 20)); + combobox.setMaximumSize(new Dimension(270, 20)); + combobox.setActionCommand(keys_2[i][0]); + combobox.setSelectedIndex(getIntProperty(keys_2[i])); + combobox.addActionListener(_ComboBoxIndexListener); + + newBrPanel.add(label); + newBrPanel.add(combobox); + } + + video3.add(newBrPanel); + + video1.add(video3); + + return buildHeadPanel(video1, Resource.getString("TabPanel.VideoPanel")); + } + + /** + * + */ + protected JPanel buildExternPanel() + { + JPanel video2 = new JPanel(); + video2.setLayout( new GridLayout(1, 2) ); + + JPanel video2Panel = new JPanel(); + video2Panel.setLayout( new ColumnLayout() ); + video2Panel.setBorder( BorderFactory.createTitledBorder(Resource.getString("ExternPanel.Title1")) ); + video2Panel.setToolTipText(Resource.getString("ExternPanel.Title1.Tip")); + + // Keys.KEY_ExternPanel_save1stFrameOfGop, + + String[][] objects = { + Keys.KEY_ExternPanel_createVdrIndex, + Keys.KEY_ExternPanel_createCellTimes, + Keys.KEY_ExternPanel_exportPts, + Keys.KEY_ExternPanel_createChapters, + Keys.KEY_ExternPanel_renameAudio, + Keys.KEY_ExternPanel_renameVideo, + Keys.KEY_ExternPanel_appendExtension, + Keys.KEY_ExternPanel_appendPidToFileName, + Keys.KEY_ExternPanel_appendLangToFileName, + Keys.KEY_ExternPanel_createM2sIndex, + Keys.KEY_ExternPanel_createInfoIndex, + Keys.KEY_ExternPanel_createD2vIndex, + Keys.KEY_ExternPanel_createDgiIndex, + Keys.KEY_ExternPanel_splitProjectFile + }; + + JCheckBox[] box = new JCheckBox[objects.length]; + + for (int i = 0, j = 12; i < objects.length; i++) + { + box[i] = new JCheckBox(Resource.getString(objects[i][0])); + box[i].setPreferredSize(new Dimension(270, 20)); + box[i].setMaximumSize(new Dimension(270, 20)); + box[i].setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); + box[i].setActionCommand(objects[i][0]); + box[i].setSelected(getBooleanProperty(objects[i])); + box[i].addActionListener(_CheckBoxListener); + + if (i == j) + box[i].setEnabled(false); + } + + // left grid + for (int i = 0; i < 9; i++) + video2Panel.add(box[i]); + + video2.add(video2Panel); + + // next grid + + JPanel video3Panel = new JPanel(); + video3Panel.setLayout( new ColumnLayout() ); + video3Panel.setBorder( BorderFactory.createTitledBorder(Resource.getString("ExternPanel.Title2")) ); + video3Panel.setToolTipText(Resource.getString("ExternPanel.Title2.Tip")); + + video3Panel.add(new JLabel(Resource.getString("ExternPanel.createM2sIndex"))); + + // right grid + video3Panel.add(box[9]); + + video3Panel.add(Box.createRigidArea(new Dimension(1, 10))); + + video3Panel.add(new JLabel(Resource.getString("ExternPanel.createInfoLabel"))); + + video3Panel.add(box[10]); + + video3Panel.add(Box.createRigidArea(new Dimension(1, 10))); + + video3Panel.add(new JLabel(Resource.getString("ExternPanel.createD2vIndex"))); + + // right grid + for (int i = 11; i < objects.length; i++) + video3Panel.add(box[i]); + + JTextField d2v_splitsize = new JTextField(getProperty(Keys.KEY_ExternPanel_ProjectFileSplitSize)); + d2v_splitsize.setPreferredSize(new Dimension(70, 20)); + d2v_splitsize.setToolTipText(Resource.getString(Keys.KEY_ExternPanel_ProjectFileSplitSize[0] + Keys.KEY_Tip)); + d2v_splitsize.setEditable(true); + d2v_splitsize.setActionCommand(Keys.KEY_ExternPanel_ProjectFileSplitSize[0]); + d2v_splitsize.addActionListener(_TextFieldListener); + d2v_splitsize.addKeyListener(_TextFieldKeyListener); + + JPanel d2vPanel = new JPanel(); + JLabel d2vLabel = new JLabel (Resource.getString("ExternPanel.ProjectFileSplitSize")); + d2vPanel.add(d2vLabel); + d2vPanel.add(d2v_splitsize); + + video3Panel.add(d2vPanel); + + video2.add(video3Panel); + + return buildHeadPanel(video2, Resource.getString("TabPanel.ExternPanel")); + } + + /** + * + */ + protected JPanel buildAudioPanel() + { + JPanel audio = new JPanel(); + audio.setLayout( new GridLayout(1,2) ); + + JPanel audio0 = new JPanel(); + audio0.setLayout( new ColumnLayout() ); + audio0.setBorder( BorderFactory.createTitledBorder(Resource.getString("AudioPanel.Title1")) ); + + audio0.add(new JLabel(Resource.getString("AudioPanel.losslessMpaConversion.Tip1"))); + audio0.add(new JLabel(Resource.getString("AudioPanel.losslessMpaConversion.Tip2"))); + audio0.setToolTipText(Resource.getString("AudioPanel.losslessMpaConversion.Tip")); + + JComboBox conversion_selection = new JComboBox(Keys.ITEMS_losslessMpaConversionMode); + conversion_selection.setPreferredSize(new Dimension(270, 20)); + conversion_selection.setMaximumSize(new Dimension(270, 20)); + conversion_selection.setActionCommand(Keys.KEY_AudioPanel_losslessMpaConversionMode[0]); + conversion_selection.setSelectedIndex(getIntProperty(Keys.KEY_AudioPanel_losslessMpaConversionMode)); + conversion_selection.addActionListener(_ComboBoxIndexListener); + audio0.add(conversion_selection); + + //audio0.add(new JLabel(" ")); + audio0.add(Box.createRigidArea(new Dimension(1, 20))); + + String[][] objects = { + Keys.KEY_AudioPanel_decodeMpgAudio, + Keys.KEY_AudioPanel_Normalize, + Keys.KEY_AudioPanel_Downmix, + Keys.KEY_AudioPanel_fadeInOut, + Keys.KEY_AudioPanel_changeByteorder, + Keys.KEY_AudioPanel_addRiffHeader, + Keys.KEY_AudioPanel_addAiffHeader, + Keys.KEY_AudioPanel_validateCRC, + Keys.KEY_AudioPanel_clearCRC, + Keys.KEY_AudioPanel_fillGapsWithLastFrame, + Keys.KEY_AudioPanel_addFrames, + Keys.KEY_AudioPanel_allowSpaces, + Keys.KEY_AudioPanel_addRiffToMpgAudio, + Keys.KEY_AudioPanel_addRiffToMpgAudioL3, + Keys.KEY_AudioPanel_addRiffToAc3, + Keys.KEY_AudioPanel_AC3_patch1stHeader, + Keys.KEY_AudioPanel_AC3_replaceWithSilence, + Keys.KEY_AudioPanel_AC3_BitrateAdaption, + Keys.KEY_AudioPanel_createDDWave + }; + + final JCheckBox[] box = new JCheckBox[objects.length]; + + for (int i = 0; i < objects.length; i++) + { + box[i] = new JCheckBox(Resource.getString(objects[i][0])); + box[i].setPreferredSize(new Dimension(270, 20)); + box[i].setMaximumSize(new Dimension(270, 20)); + box[i].setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); + box[i].setActionCommand(objects[i][0]); + box[i].setSelected(getBooleanProperty(objects[i])); + box[i].addActionListener(_CheckBoxListener); + } + + audio0.add(box[0]); + + JComboBox resample_selection = new JComboBox(Keys.ITEMS_resampleAudioMode); + resample_selection.setPreferredSize(new Dimension(270, 20)); + resample_selection.setMaximumSize(new Dimension(270, 20)); + resample_selection.setActionCommand(Keys.KEY_AudioPanel_resampleAudioMode[0]); + resample_selection.setSelectedIndex(getIntProperty(Keys.KEY_AudioPanel_resampleAudioMode)); + resample_selection.addActionListener(_ComboBoxIndexListener); + audio0.add(resample_selection); + + final JTextField normalize_value = new JTextField(getProperty(Keys.KEY_AudioPanel_NormalizeValue)); + normalize_value.setPreferredSize(new Dimension(50, 20)); + normalize_value.setMaximumSize(new Dimension(50, 20)); + normalize_value.setToolTipText(Resource.getString(Keys.KEY_AudioPanel_NormalizeValue[0] + Keys.KEY_Tip)); + normalize_value.setEditable(true); + normalize_value.setActionCommand(Keys.KEY_AudioPanel_NormalizeValue[0]); + normalize_value.addActionListener(_TextFieldListener); + normalize_value.addKeyListener(_TextFieldKeyListener); + normalize_value.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + String str = normalize_value.getText(); + + if (str.length() == 0) + { + normalize_value.setText("98"); + return; + } + + try { + int val = Integer.parseInt(str); + + if (val > 100 || val < 0) + val = 98; + + normalize_value.setText("" + val); + + } catch (Exception pe) { + + normalize_value.setText("98"); + } + } + }); + + box[1].setPreferredSize(new Dimension(180, 20)); + box[1].setMaximumSize(new Dimension(180, 20)); + + JPanel audio5 = new JPanel(); + audio5.setLayout(new BoxLayout(audio5, BoxLayout.X_AXIS)); + audio5.add(box[1]); + audio5.add(normalize_value); + + audio0.add(audio5); + + for (int i = 2; i < 7; i++) + audio0.add(box[i]); + + + ActionListener al = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + JCheckBox checkBox = (JCheckBox)e.getSource(); + String str = checkBox.getActionCommand(); + + if (str.equals(Keys.KEY_AudioPanel_changeByteorder[0]) && getBooleanProperty(Keys.KEY_AudioPanel_addAiffHeader)) + { + box[4].setSelected(true); + Common.getSettings().setBooleanProperty(Keys.KEY_AudioPanel_changeByteorder[0], true); + return; + } + + else if (str.equals(Keys.KEY_AudioPanel_addRiffHeader[0]) && checkBox.isSelected()) + { + box[6].setSelected(false); + Common.getSettings().setBooleanProperty(Keys.KEY_AudioPanel_addAiffHeader[0], false); + return; + } + + else if (str.equals(Keys.KEY_AudioPanel_addAiffHeader[0]) && checkBox.isSelected()) + { + box[4].setSelected(true); + box[5].setSelected(false); + Common.getSettings().setBooleanProperty(Keys.KEY_AudioPanel_changeByteorder[0], true); + Common.getSettings().setBooleanProperty(Keys.KEY_AudioPanel_addRiffHeader[0], false); + return; + } + } + }; + + box[4].addActionListener(al); + box[5].addActionListener(al); + box[6].addActionListener(al); + + + JPanel audio1 = new JPanel(); + audio1.setLayout( new ColumnLayout() ); + audio1.setBorder( BorderFactory.createTitledBorder(Resource.getString("AudioPanel.Title2")) ); + + for (int i = 7; i < objects.length; i++) + { + if (i == 12 || i == 15 || i == 18) + audio1.add(Box.createRigidArea(new Dimension(1, 10))); + + audio1.add(box[i]); + } + + ActionListener al_2 = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + JCheckBox checkBox = (JCheckBox)e.getSource(); + String str = checkBox.getActionCommand(); + + if (str.equals(Keys.KEY_AudioPanel_addRiffToMpgAudioL3[0]) && checkBox.isSelected()) + { + box[12].setSelected(false); + Common.getSettings().setBooleanProperty(Keys.KEY_AudioPanel_addRiffToMpgAudio[0], false); + return; + } + + else if (str.equals(Keys.KEY_AudioPanel_addRiffToMpgAudio[0]) && checkBox.isSelected()) + { + box[13].setSelected(false); + Common.getSettings().setBooleanProperty(Keys.KEY_AudioPanel_addRiffToMpgAudioL3[0], false); + return; + } + } + }; + + box[12].addActionListener(al_2); + box[13].addActionListener(al_2); + + audio.add(audio0); + audio.add(audio1); + + return buildHeadPanel(audio, Resource.getString("TabPanel.AudioPanel")); + } + + /** + * + */ + protected JPanel buildSubtitlePanel() + { + JPanel teletext = new JPanel(); + teletext.setLayout( new GridLayout( 1, 2) ); + + JPanel panel_0 = new JPanel(); + panel_0.setLayout( new ColumnLayout() ); + panel_0.setBorder( BorderFactory.createTitledBorder(Resource.getString("SubtitlePanel.Title.Teletext")) ); + + String[][] objects = { + //Keys.KEY_SubtitlePanel_decodeMegaradio, + Keys.KEY_SubtitlePanel_decodeHiddenRows, + Keys.KEY_SubtitlePanel_rebuildPTS, + Keys.KEY_SubtitlePanel_rebuildPictPTS, + Keys.KEY_SubtitlePanel_keepOriginalTimecode, + Keys.KEY_SubtitlePanel_TtxExportBoxedOnly, + Keys.KEY_SubtitlePanel_exportTextAsUnicode, + Keys.KEY_SubtitlePanel_exportTextAsUTF8, + Keys.KEY_SubtitlePanel_useTextOutline, + Keys.KEY_SubtitlePanel_useTextAlignment, + Keys.KEY_SubtitlePanel_keepColourTable, + Keys.KEY_SubtitlePanel_exportAsVobSub + }; + + final JCheckBox[] box = new JCheckBox[objects.length]; + + for (int i = 0; i < objects.length; i++) + { + box[i] = new JCheckBox(Resource.getString(objects[i][0])); + box[i].setPreferredSize(new Dimension(260, 20)); + box[i].setMaximumSize(new Dimension(260, 20)); + box[i].setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); + box[i].setActionCommand(objects[i][0]); + box[i].setSelected(getBooleanProperty(objects[i])); + box[i].addActionListener(_CheckBoxListener); + } + + for (int i = 0; i < 7; i++) + panel_0.add(box[i]); + + //toggle action + ActionListener al = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + JCheckBox checkBox = (JCheckBox)e.getSource(); + String str = checkBox.getActionCommand(); + + if (str.equals(Keys.KEY_SubtitlePanel_exportTextAsUnicode[0]) && checkBox.isSelected()) + { + box[6].setSelected(false); + Common.getSettings().setBooleanProperty(Keys.KEY_SubtitlePanel_exportTextAsUTF8[0], false); + return; + } + + else if (str.equals(Keys.KEY_SubtitlePanel_exportTextAsUTF8[0]) && checkBox.isSelected()) + { + box[5].setSelected(false); + Common.getSettings().setBooleanProperty(Keys.KEY_SubtitlePanel_exportTextAsUnicode[0], false); + return; + } + } + }; + + box[5].addActionListener(al); + box[6].addActionListener(al); + + + // panel_0.add(Box.createRigidArea(new Dimension(1, 10))); + + JLabel page_decode = new JLabel(Resource.getString("SubtitlePanel.TtxPages")); + page_decode.setToolTipText(Resource.getString("SubtitlePanel.TtxPages.Tip")); + panel_0.add(page_decode); + + JPanel panel_0_1 = new JPanel(); + panel_0_1.setLayout(new BoxLayout(panel_0_1, BoxLayout.X_AXIS)); + + JPanel panel_0_2 = new JPanel(); + panel_0_2.setLayout(new BoxLayout(panel_0_2, BoxLayout.X_AXIS)); + + String[][] keys = { + Keys.KEY_SubtitlePanel_TtxPage1, + Keys.KEY_SubtitlePanel_TtxPage2, + Keys.KEY_SubtitlePanel_TtxPage3, + Keys.KEY_SubtitlePanel_TtxPage4, + Keys.KEY_SubtitlePanel_TtxPage5, + Keys.KEY_SubtitlePanel_TtxPage6, + Keys.KEY_SubtitlePanel_TtxPage7, + Keys.KEY_SubtitlePanel_TtxPage8 + }; + + Object[] pagenumber = { "null", "149", "150", "199", "299", "599", "691", "692", "693", "694", "699", "777", "779", "784", "785", "786", "881", "882", "884", "885", "886", "887", "888", "889" }; + + for (int i = 0; i < keys.length; i++) + { + JComboBox combobox = new JComboBox(pagenumber); + combobox.setPreferredSize(new Dimension(64, 22)); + combobox.setMaximumSize(new Dimension(64, 22)); + combobox.setEditable(true); + combobox.setActionCommand(keys[i][0]); + combobox.setSelectedItem(getProperty(keys[i])); + combobox.addActionListener(_ComboBoxItemListener); + + if (i < 4) + panel_0_1.add(combobox); + else + panel_0_2.add(combobox); + } + + panel_0.add(panel_0_1); + panel_0.add(panel_0_2); + + JPanel panel_0_3 = new JPanel(); + panel_0_3.setLayout(new BoxLayout(panel_0_3, BoxLayout.X_AXIS)); + + JLabel lang_decode = new JLabel(Resource.getString("SubtitlePanel.Language")); + lang_decode.setToolTipText(Resource.getString("SubtitlePanel.Language.Tip")); + lang_decode.setPreferredSize(new Dimension(80, 22)); + lang_decode.setMaximumSize(new Dimension(80, 22)); + panel_0_3.add(lang_decode); + + JComboBox language_pair = new JComboBox(Keys.ITEMS_TtxLanguagePair); + language_pair.setPreferredSize(new Dimension(140, 22)); + language_pair.setMaximumSize(new Dimension(140, 22)); + language_pair.setActionCommand(Keys.KEY_TtxLanguagePair[0]); + language_pair.setSelectedIndex(getIntProperty(Keys.KEY_TtxLanguagePair)); + language_pair.addActionListener(_ComboBoxIndexListener); + panel_0_3.add(language_pair); + + panel_0.add(panel_0_3); + + panel_0.add(Box.createRigidArea(new Dimension(1, 10))); + + JPanel panel_0_4 = new JPanel(); + panel_0_4.setLayout(new BoxLayout(panel_0_4, BoxLayout.X_AXIS)); + panel_0_4.setToolTipText(Resource.getString("SubtitlePanel.Format.Tip")); + panel_0_4.add(new JLabel("1. " + Resource.getString("SubtitlePanel.Format"))); + + JComboBox export_format = new JComboBox(Keys.ITEMS_SubtitleExportFormat); + export_format.setPreferredSize(new Dimension(80, 22)); + export_format.setMaximumSize(new Dimension(80, 22)); + export_format.setActionCommand(Keys.KEY_SubtitleExportFormat[0]); + export_format.setSelectedItem(getProperty(Keys.KEY_SubtitleExportFormat)); + export_format.addActionListener(_ComboBoxItemListener); + panel_0_4.add(export_format); + + panel_0.add(panel_0_4); + + JPanel panel_0_5 = new JPanel(); + panel_0_5.setLayout(new BoxLayout(panel_0_5, BoxLayout.X_AXIS)); + panel_0_5.setToolTipText(Resource.getString("SubtitlePanel.Format.Tip")); + panel_0_5.add(new JLabel("2. " + Resource.getString("SubtitlePanel.Format"))); + + JComboBox export_format_2 = new JComboBox(Keys.ITEMS_SubtitleExportFormat); + export_format_2.setPreferredSize(new Dimension(80, 22)); + export_format_2.setMaximumSize(new Dimension(80, 22)); + export_format_2.setActionCommand(Keys.KEY_SubtitleExportFormat_2[0]); + export_format_2.setSelectedItem(getProperty(Keys.KEY_SubtitleExportFormat_2)); + export_format_2.addActionListener(_ComboBoxItemListener); + panel_0_5.add(export_format_2); + + panel_0.add(panel_0_5); + + teletext.add(panel_0); + + + JPanel panel_1 = new JPanel(); + panel_1.setLayout( new ColumnLayout() ); + // panel_1.setBorder( BorderFactory.createTitledBorder(Resource.getString("SubtitlePanel.Title")) ); + panel_1.setBorder( BorderFactory.createTitledBorder(Resource.getString("SubtitlePanel.Title.Teletext")) ); + + // panel_1.add(new JLabel(Resource.getString("SubtitlePanel.Title.Teletext"))); + + panel_1.add(box[7]); + panel_1.add(box[8]); + + JPanel panel_1_2 = new JPanel(); + panel_1_2.setLayout(new BoxLayout(panel_1_2, BoxLayout.X_AXIS)); + + JLabel font = new JLabel(Resource.getString("SubtitlePanel.Font")); + font.setToolTipText(Resource.getString("SubtitlePanel.Font.Tip")); + font.setPreferredSize(new Dimension(100, 22)); + font.setMaximumSize(new Dimension(100, 22)); + panel_1_2.add(font); + + JComboBox font_list = new JComboBox(Common.getFonts()); + font_list.setPreferredSize(new Dimension(160, 22)); + font_list.setMaximumSize(new Dimension(160, 22)); + font_list.setActionCommand(Keys.KEY_SubtitleFont[0]); + font_list.setSelectedItem(getProperty(Keys.KEY_SubtitleFont)); + font_list.addActionListener(_ComboBoxItemListener); + panel_1_2.add(font_list); + + panel_1.add(panel_1_2); + + JPanel panel_1_3 = new JPanel(); + panel_1_3.setLayout(new BoxLayout(panel_1_3, BoxLayout.X_AXIS)); + + JLabel sup_label = new JLabel(Resource.getString("SubtitlePanel.SupValues")); + sup_label.setPreferredSize(new Dimension(60, 22)); + sup_label.setMaximumSize(new Dimension(60, 22)); + panel_1_3.add(sup_label); + + JTextField subpicture_values = new JTextField(getProperty(Keys.KEY_SubtitlePanel_Format_SUP_Values)); + subpicture_values.setPreferredSize(new Dimension(200, 22)); + subpicture_values.setMaximumSize(new Dimension(200, 22)); + subpicture_values.setToolTipText(Resource.getString(Keys.KEY_SubtitlePanel_Format_SUP_Values[0] + Keys.KEY_Tip)); + subpicture_values.setEditable(true); + subpicture_values.setActionCommand(Keys.KEY_SubtitlePanel_Format_SUP_Values[0]); + subpicture_values.addActionListener(_TextFieldListener); + subpicture_values.addKeyListener(_TextFieldKeyListener); + + panel_1_3.add(subpicture_values); + + panel_1.add(panel_1_3); + + panel_1.add(Box.createRigidArea(new Dimension(1, 15))); + + JLabel color_model = new JLabel(Resource.getString("SubtitlePanel.Colormodel")); + color_model.setToolTipText(Resource.getString("SubtitlePanel.Colormodel.Tip")); + panel_1.add(color_model); + + JComboBox color_table = new JComboBox(Common.getColorModels()); + color_table.setPreferredSize(new Dimension(130, 22)); + color_table.setMaximumSize(new Dimension(130, 22)); + color_table.setActionCommand(Keys.KEY_SubpictureColorModel[0]); + color_table.setSelectedItem(getProperty(Keys.KEY_SubpictureColorModel)); + color_table.addActionListener(_ComboBoxItemListener); + panel_1.add(color_table); + + JPanel panel_2_1 = new JPanel(); + panel_2_1.setLayout(new BoxLayout(panel_2_1, BoxLayout.X_AXIS)); + + panel_2_1.add(new JLabel(Resource.getString("SubtitlePanel.PageId"))); + + JTextField page_id = new JTextField(getProperty(Keys.KEY_SubtitlePanel_PageId_Value)); + page_id.setPreferredSize(new Dimension(40, 20)); + page_id.setMaximumSize(new Dimension(100, 20)); + page_id.setToolTipText(Resource.getString(Keys.KEY_SubtitlePanel_PageId_Value[0] + Keys.KEY_Tip)); + page_id.setEditable(true); + page_id.setActionCommand(Keys.KEY_SubtitlePanel_PageId_Value[0]); + page_id.addActionListener(_TextFieldListener); + page_id.addKeyListener(_TextFieldKeyListener); + + panel_2_1.add(page_id); + + panel_1.add(panel_2_1); + + panel_1.add(Box.createRigidArea(new Dimension(1, 10))); + panel_1.add(new JLabel(Resource.getString("SubtitlePanel.Title"))); + + JPanel panel_2_2 = new JPanel(); + panel_2_2.setLayout(new BoxLayout(panel_2_2, BoxLayout.X_AXIS)); + panel_2_2.setToolTipText(Resource.getString("SubtitlePanel.ChangeDisplay.Tip")); + + JLabel label_2_2_1 = new JLabel(Resource.getString("SubtitlePanel.ChangeDisplay")); + label_2_2_1.setPreferredSize(new Dimension(140, 22)); + label_2_2_1.setMaximumSize(new Dimension(140, 22)); + panel_2_2.add(label_2_2_1); + + JComboBox display_mode = new JComboBox(Keys.ITEMS_SubtitleChangeDisplay); + display_mode.setPreferredSize(new Dimension(120, 22)); + display_mode.setMaximumSize(new Dimension(120, 22)); + display_mode.setActionCommand(Keys.KEY_SubtitleChangeDisplay[0]); + display_mode.setSelectedIndex(getIntProperty(Keys.KEY_SubtitleChangeDisplay)); + display_mode.addActionListener(_ComboBoxIndexListener); + panel_2_2.add(display_mode); + + panel_1.add(panel_2_2); + + JPanel panel_2_3 = new JPanel(); + panel_2_3.setLayout(new BoxLayout(panel_2_3, BoxLayout.X_AXIS)); + panel_2_3.setToolTipText(Resource.getString("SubtitlePanel.MovePosition.Tip")); + + JLabel label_2_3_1 = new JLabel(Resource.getString("SubtitlePanel.MovePosition")); + label_2_3_1.setPreferredSize(new Dimension(140, 22)); + label_2_3_1.setMaximumSize(new Dimension(140, 22)); + panel_2_3.add(label_2_3_1); + + JTextField position_values = new JTextField(getProperty(Keys.KEY_SubtitleMovePosition_Value)); + position_values.setPreferredSize(new Dimension(120, 22)); + position_values.setMaximumSize(new Dimension(120, 22)); + position_values.setEditable(true); + position_values.setActionCommand(Keys.KEY_SubtitleMovePosition_Value[0]); + position_values.addActionListener(_TextFieldListener); + position_values.addKeyListener(_TextFieldKeyListener); + panel_2_3.add(position_values); + + panel_1.add(panel_2_3); + + panel_1.add(Box.createRigidArea(new Dimension(1, 10))); + panel_1.add(box[9]); + panel_1.add(box[10]); + + teletext.add(panel_1); + + return buildHeadPanel(teletext, Resource.getString("TabPanel.SubtitlePanel")); + } + + /** + * + */ + protected JPanel buildPostCommandsPanel() + { + ActionListener _ExecuteListener = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + try { + String actName = e.getActionCommand(); + String str = ""; + + if (actName.equals(Keys.KEY_PostCommands_Cmd1[0])) + str = getProperty(Keys.KEY_PostCommands_Cmd1); + + else if (actName.equals(Keys.KEY_PostCommands_Cmd2[0])) + str = getProperty(Keys.KEY_PostCommands_Cmd2); + + else if (actName.equals(Keys.KEY_PostCommands_Cmd3[0])) + str = getProperty(Keys.KEY_PostCommands_Cmd3); + + Common.performCommand(str); + + } catch (Exception ex) { + + Common.setExceptionMessage(ex); + } + } + }; + + JPanel container = new JPanel(); + container.setLayout( new ColumnLayout() ); + container.setBorder( BorderFactory.createTitledBorder(Resource.getString("PostCommands.Title"))); + + String[][] objects = { + Keys.KEY_PostCommands_Cmd1, + Keys.KEY_PostCommands_Cmd2, + Keys.KEY_PostCommands_Cmd3, + Keys.KEY_PostCommands_Cmd4, + Keys.KEY_PostCommands_Cmd5, + Keys.KEY_PostCommands_Cmd6, + Keys.KEY_PostCommands_Cmd7, + Keys.KEY_PostCommands_Cmd8 + }; + + for (int i = 0; i < 3; i++) + { + JTextField text_field = new JTextField(getProperty(objects[i])); + text_field.setPreferredSize(new Dimension(400, 25)); + text_field.setEditable(true); + text_field.setActionCommand(objects[i][0]); + text_field.addActionListener(_TextFieldListener); + text_field.addKeyListener(_TextFieldKeyListener); + + JButton exe = new JButton(Resource.getString("PostCommands.Execute")); + exe.setActionCommand(objects[i][0]); + exe.setPreferredSize(new Dimension(100, 20)); + exe.addActionListener(_ExecuteListener); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + panel.add(text_field); + panel.add(exe); + + container.add(panel); + } + + container.add(Box.createRigidArea(new Dimension(1, 10))); + + JLabel label = new JLabel(Resource.getString("PostCommands.PostProcessing")); + label.setToolTipText(Resource.getString("PostCommands.PostProcessing.Tip")); + + container.add(label); + + + for (int i = 3; i < objects.length; i++) + { + JTextField text_field = new JTextField(getProperty(objects[i])); + text_field.setPreferredSize(new Dimension(400, 25)); + text_field.setEditable(true); + text_field.setActionCommand(objects[i][0]); + text_field.addActionListener(_TextFieldListener); + text_field.addKeyListener(_TextFieldKeyListener); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + panel.add(text_field); + panel.add(new JLabel(Keys.ITEMS_ConversionMode[i - 3].toString())); + + container.add(panel); + } + + JCheckBox box = new JCheckBox(Resource.getString(Keys.KEY_PostProcessCompletion[0])); + box.setToolTipText(Resource.getString(Keys.KEY_PostProcessCompletion[0] + Keys.KEY_Tip)); + box.setActionCommand(Keys.KEY_PostProcessCompletion[0]); + box.setSelected(getBooleanProperty(Keys.KEY_PostProcessCompletion)); + box.addActionListener(_CheckBoxListener); + + container.add(box); + + + return buildHeadPanel(container, Resource.getString("TabPanel.PostCommandsPanel")); + } + + /** + * + */ + class CPCheckBoxListener implements ActionListener { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + + JCheckBox box = (JCheckBox) e.getSource(); + setBooleanProperty(actName, box.isSelected()); + } + } + + /** + * + */ + class CPComboBoxIndexListener implements ActionListener { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + JComboBox box = (JComboBox) e.getSource(); + + setProperty(actName, String.valueOf(box.getSelectedIndex())); + } + } + + /** + * + */ + class CPComboBoxItemListener implements ActionListener { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + + // refuse additional actioncommand "comboBoxEdit" from jre > 1.4 ? + if (actName.indexOf('.') < 0) + return; + + JComboBox box = (JComboBox) e.getSource(); + + setProperty(actName, box.getSelectedItem()); + } + } + + /** + * + */ + class CPTextFieldKeyListener extends KeyAdapter { + public void keyReleased(KeyEvent e) + { + JTextField textfield = (JTextField) e.getSource(); + + textfield.postActionEvent(); + } + } + + /** + * + */ + class CPTextFieldListener implements ActionListener { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + JTextField textfield = (JTextField) e.getSource(); + + setProperty(actName, textfield.getText()); + } + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CommonGui.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CommonGui.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CommonGui.java 2005-12-17 22:22:12.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CommonGui.java 2009-01-10 15:54:02.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)CommonGui * - * Copyright (c) 2004-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2004-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -33,9 +33,18 @@ import net.sourceforge.dvb.projectx.gui.X_JFileChooser; import net.sourceforge.dvb.projectx.gui.PicturePanel; +import net.sourceforge.dvb.projectx.gui.FileProperties; +import net.sourceforge.dvb.projectx.gui.CollectionProperties; +import net.sourceforge.dvb.projectx.gui.PatchDialog; +import net.sourceforge.dvb.projectx.gui.CutPanel; +import net.sourceforge.dvb.projectx.gui.PlayerFrame; +import net.sourceforge.dvb.projectx.gui.SubpictureFrame; import net.sourceforge.dvb.projectx.common.Resource; +/** + * + */ public class CommonGui extends Object { private static JFrame frame = null; @@ -44,8 +53,20 @@ private static X_JFileChooser chooser; + private static CutPanel cutpanel; + private static PicturePanel picturepanel; + private static FileProperties file_properties; + + private static CollectionProperties collection_properties; + + private static PatchDialog patch_dialog = null; + + private static PlayerFrame player_frame = null; + + private static SubpictureFrame subpicture_frame = null; + /** * */ @@ -54,6 +75,9 @@ chooser = new X_JFileChooser(); picturepanel = new PicturePanel(); + cutpanel = new CutPanel(); + file_properties = new FileProperties(); + collection_properties = new CollectionProperties(); } public static void setMainFrame(JFrame _frame) @@ -191,5 +215,62 @@ { return picturepanel; } + + /** + * + */ + public static CutPanel getCutPanel() + { + return cutpanel; + } + + /** + * + */ + public static FileProperties getFileProperties() + { + return file_properties; + } + + /** + * + */ + public static CollectionProperties getCollectionProperties() + { + return collection_properties; + } + + /** + * + */ + public static PatchDialog getPatchDialog() + { + if (patch_dialog == null) + patch_dialog = new PatchDialog(frame); + + return patch_dialog; + } + + /** + * + */ + public static PlayerFrame getPlayerFrame() + { + if (player_frame == null) + player_frame = new PlayerFrame(); + + return player_frame; + } + + /** + * + */ + public static SubpictureFrame getSubpictureFrame() + { + if (subpicture_frame == null) + subpicture_frame = new SubpictureFrame(); + + return subpicture_frame; + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CutPanel.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CutPanel.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CutPanel.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CutPanel.java 2009-08-23 19:52:44.000000000 +0000 @@ -0,0 +1,2291 @@ +/* + * @(#)CutPanel + * + * Copyright (c) 2006-2009 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.gui; + +import java.awt.dnd.DropTarget; +import java.awt.dnd.DropTargetDragEvent; +import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.DropTargetEvent; +import java.awt.dnd.DropTargetListener; + +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.image.MemoryImageSource; +import java.awt.Font; +import java.awt.GridLayout; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseMotionAdapter; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; +import java.util.Comparator; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.BorderFactory; + +import javax.swing.event.ChangeListener; +import javax.swing.event.ChangeEvent; + +// +import javax.swing.JSlider; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; + +import net.sourceforge.dvb.projectx.common.Keys; +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Resource; +import net.sourceforge.dvb.projectx.common.JobCollection; + +import net.sourceforge.dvb.projectx.parser.CommonParsing; + +import net.sourceforge.dvb.projectx.video.Preview; +import net.sourceforge.dvb.projectx.video.PreviewObject; + +import net.sourceforge.dvb.projectx.xinput.XInputFile; +import net.sourceforge.dvb.projectx.gui.ComboBoxIndexListener; + +/** + * + */ +public class CutPanel extends JPanel { + + private int active_collection = 0; + private int loadSizeForward = 2560000; + + private long lastPosition = 0; + private long divisor = 16L; + + private boolean matchingPoint = false; + + private boolean cut_top = true; + private boolean cut_bottom = false; + private boolean cut_match = false; + private boolean action = false; + + private String file = " "; + + private String navigation[] = { + "leftsteparrow1x.gif", "leftarrow3x.gif", "leftarrow2x.gif", + "rightarrow2x.gif", "rightarrow3x.gif", "rightsteparrow1x.gif", + "leftarrowstep1x.gif", "rightarrowstep1x.gif" + }; + + private JComboBox cutIndexList; + private JComboBox chapterIndexList; + private JComboBox cutmode_combobox; + + private JTextField includeField; + private JTextField positionField; + private JTextField estimatedSizeField; + private JTextField chapterCountField; + private JTextField chapterIndexField; + private JTextField cutCountField; + private JTextField cutIndexField; + + private JButton cutAdd; + private JButton cutDelete; + private JButton chapterAdd; + private JButton chapterDelete; + + private JButton[] jump; + + private JSlider slider; + + private X_JFileChooser chooser; + + private DNDListener2 dnd2 = new DNDListener2(); + private JumpListener jumpAction = new JumpListener(); + private CutListener cutAction = new CutListener(); + + private JobCollection collection; + + private CutView cutview; + private Preview Preview = new Preview(loadSizeForward); + + private List previewList = new ArrayList(); + + private ComboBoxIndexListener _ComboBoxIndexListener = new ComboBoxIndexListener(); + + private SlideShow cl = new SlideShow(); + + private CutMatrix cm = new CutMatrix(); + + private boolean slideshow = false; + + private JPanel sliderPanel; + + /** + * + */ + private class DNDListener2 implements DropTargetListener + { + public void drop(DropTargetDropEvent e) + { + try { + int dropaction = e.getDropAction(); // 1=copy, 2=move + + if ( dropaction == 0 || dropaction > 2) + { + e.rejectDrop(); + + return; + } + + e.acceptDrop(dropaction); + + Transferable tr = e.getTransferable(); + DataFlavor[] df = tr.getTransferDataFlavors(); + List li = (List) tr.getTransferData(df[0]); // see note about mac os x + + Object[] val = li.toArray(); + + if (val.length > 0) + loadCutList(val[0].toString()); + + e.dropComplete(true); + + } catch (Exception eee) { + + e.dropComplete(false); + Common.setExceptionMessage(eee); + } + } + + public void dragEnter(DropTargetDragEvent e) + {} + + public void dragExit(DropTargetEvent e) + {} + + public void dragOver(DropTargetDragEvent e) + {} + + public void dropActionChanged(DropTargetDragEvent e) + {} + } + + /** + * + */ + private class CutListener implements ActionListener + { + public void actionPerformed(ActionEvent e) + { + if (collection == null) + return; + + if (!action) + return; + + action = false; + String actName = e.getActionCommand(); + + if (actName.equals("delpoint")) + { + if (cutIndexList.getItemCount() > 0) + removeCutpoint(cutIndexList.getSelectedIndex()); + } + + else if (actName.equals("cutnumber") || actName.equals("addpoint")) + { + String value = positionField.getText(); + + if (!value.equals("") && addCutpoint(value)) + { + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) + collection.setCutImage(value, Common.getMpvDecoderClass().getCutImage()); + } + } + + else if (actName.equals("delchapter")) + { + if (chapterIndexList.getItemCount() > 0) + removeChapterpoint(chapterIndexList.getSelectedIndex()); + } + + else if (actName.equals("addchapter")) + { + String value = positionField.getText(); + + if (!value.equals("") && addChapterpoint(value)) + {} + } + + else if (actName.equals("movecutleft")) + { + if (cutIndexList.getItemCount() > 0) + { + int index = cutIndexList.getSelectedIndex(); + + action = true; + jump[6].doClick(); + action = false; + + removeCutpoint(index); + addCutpoint(positionField.getText()); + } + } + + else if (actName.equals("movecutright")) + { + if (cutIndexList.getItemCount() > 0) + { + int index = cutIndexList.getSelectedIndex(); + + action = true; + jump[7].doClick(); + action = false; + + removeCutpoint(index); + addCutpoint(positionField.getText()); + } + } + + else if (actName.equals("movechapterleft")) + { + if (chapterIndexList.getItemCount() > 0) + { + int index = chapterIndexList.getSelectedIndex(); + + action = true; + jump[6].doClick(); + action = false; + + removeChapterpoint(index); + addChapterpoint(positionField.getText()); + } + } + + else if (actName.equals("movechapterright")) + { + if (chapterIndexList.getItemCount() > 0) + { + int index = chapterIndexList.getSelectedIndex(); + + action = true; + jump[7].doClick(); + action = false; + + removeChapterpoint(index); + addChapterpoint(positionField.getText()); + } + } + + /** + * stuff completion for add and del cutpoints + */ + if (cutIndexList.getItemCount() > 0) + { + Object[] obj = collection.getCutpoints(); + + int index = cutIndexList.getSelectedIndex(); + + setCutIndexField(index + 1); + + showCutInfo((index & 1) == 0, obj, previewList); + //Common.getGuiInterface().showCutIcon((index & 1) == 0, obj, previewList); + + if (actName.equals("cutbox") || actName.equals("delpoint")) + { + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) + preview(Long.parseLong(obj[index].toString())); + } + + if (actName.equals("addpoint")) + updateCutView(String.valueOf(lastPosition)); + } + + else + { + showCutInfo(true, null, previewList); + //Common.getGuiInterface().showCutIcon(true, null, previewList); + + setCutIndexField(-1); + + updateCutView(String.valueOf(lastPosition)); + } + + /** + * stuff completion for add and del chapterpoints + */ + if (chapterIndexList.getItemCount() > 0) + { + Object[] obj = collection.getChapterpoints(); + + int index = chapterIndexList.getSelectedIndex(); + + setChapterIndexField(index + 1); + + Common.getGuiInterface().showChapterIcon(obj, previewList); + + if (actName.equals("chapterbox")) + { + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) + preview(Long.parseLong(obj[index].toString())); + } + } + + else + { + Common.getGuiInterface().showChapterIcon(null, previewList); + + setChapterIndexField(-1); + } + + /** + * + */ + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) + slider.requestFocus(); + + getExpectedSize(); + updatePositionField(); + + if (actName.startsWith("move")) + updateCutView(String.valueOf(lastPosition)); + + + action = true; + } + } + + /** + * + */ + private class JumpListener implements ActionListener + { + public void actionPerformed(ActionEvent e) + { + if (collection == null) + return; + + if (!action) + return; + + String actName = e.getActionCommand(); + int val = slider.getValue(); + + /** + * prev. cut point pos. + */ + if (actName.equals(navigation[0])) + { + int i = 0; + int ic = cutIndexList.getItemCount(); + + if (ic > 0) + { + i = ic - 1; + + if (lastPosition > Long.parseLong(cutIndexList.getItemAt(0).toString())) + while (lastPosition <= Long.parseLong(cutIndexList.getItemAt(i).toString())) + i--; + + cutIndexList.setSelectedIndex(i); + } + } + + else if (actName.equals(navigation[1])) + slider.setValue(val - 3125000); + + else if (actName.equals(navigation[2])) + slider.setValue(val - 312500); + + else if (actName.equals(navigation[6])) + slider.setValue(val - 2); + + else if (actName.equals(navigation[7])) + slider.setValue(val + 2); + + else if (actName.equals(navigation[3])) + slider.setValue(val + 312500); + + else if (actName.equals(navigation[4])) + slider.setValue(val + 3125000); + + /** + * next cut point pos. + */ + else if (actName.equals(navigation[5])) + { + int i = 0; + int ic = cutIndexList.getItemCount(); + + if (ic > 0) + { + if (lastPosition < Long.parseLong(cutIndexList.getItemAt(ic - 1).toString())) + while (lastPosition >= Long.parseLong(cutIndexList.getItemAt(i).toString())) + i++; + + cutIndexList.setSelectedIndex(i); + } + } + + else if (actName.equals("load_cutlist")) + loadCutList(); + + else if (actName.equals("save_cutlist")) + saveCutList(); + + else if (actName.equals("load_chapterlist")) + loadChapterList(); + + else if (actName.equals("save_chapterlist")) + saveChapterList(); + + else if (actName.equals("cut_scan")) + restartMatrix(); + } + } + + /** + * class to control play of slideshow + */ + private class SlideShow implements Runnable { + + private Thread clockThread = null; + + private long value = 0; + private long skip = 50; + + private Object[] cutpoints = null; + + /** + * + */ + public void start(long _value) + { + if (clockThread == null) + { + clockThread = new Thread(this, "SlideShow"); + // clockThread.setPriority(Thread.MIN_PRIORITY); + clockThread.setPriority(Thread.NORM_PRIORITY); + + value = _value; + //skip = getLoadSize()>>>5; + skip = getLoadSize()>>>6; + + getCutPoints(); + + clockThread.start(); + } + } + + /** + * + */ + private void getCutPoints() + { + cutpoints = collection == null ? null : collection.getCutpoints(); + } + + /** + * + */ + public void run() + { + Thread myThread = Thread.currentThread(); + + while (clockThread == myThread) + { + try { + + for (long val;; ) + { + val = update(value); + Thread.sleep(5); + + CommonGui.getPlayerFrame().repaintPicture(1); + + if (!slideshow || val < value) + break; + + value = skipArea(val); + + if (value < val) + break; + } + + stop(); + + } catch (InterruptedException e) {} + + } + } + + /** + * + */ + private long update(long val) + { + return preview(val); + } + + /** + * + */ + private long skipArea(long val) + { + // next gop + if (cutpoints == null || cutpoints.length == 0) + return (val + skip); + + int index = getCutIndex(cutpoints, String.valueOf(val)); + + // area among cutpoints + if (index < 0) + { + // next gop "in" area + if ((index & 1) == 0) + return (val + skip); + + // stop + if (-index > cutpoints.length) + return (val - skip); + + // jump to next export area (-index - 1) + return Long.parseLong(cutpoints[index + 1].toString()); + } + + // exact cut point "in" area + if ((index & 1) == 0) + return (val + skip); + + // stop + if (index + 1 >= cutpoints.length) + return (val - skip); + + // jump to next exported area + return Long.parseLong(cutpoints[index + 1].toString()); + } + + /** + * + */ + public void stop() + { + clockThread = null; + } + } + + /** + * class to control matrix preview + */ + private class CutMatrix implements Runnable { + + private Thread clockThread = null; + + private boolean stopit = false; + + private long tmp = 0; + private long value = 0; + private long start_value = 0; + private int scale = 1; + + /** + * + */ + public void restart(long value_1) + { + start(value_1); + scale = 1; + } + + /** + * + */ + public void start(long value_1) + { + breakLoop(); + + if (clockThread == null) + { + clockThread = new Thread(this, "CutMatrix"); + clockThread.setPriority(Thread.MIN_PRIORITY); + + start_value = value_1; + stopit = false; + + clockThread.start(); + } + } + + /** + * + */ + public void breakLoop() + { + stopit = true; + } + + /** + * + */ + public void run() + { + Thread myThread = Thread.currentThread(); + + while (clockThread == myThread) + { + try { + + if (!previewList.isEmpty()) + { + int[][] matrix_index = CommonGui.getPicturePanel().getMatrixTable(); + long end = ((PreviewObject) previewList.get(previewList.size() - 1)).getEnd(); + long div = end / matrix_index.length; + String str; + + div /= scale; + scale <<= 1; + + CommonGui.getPicturePanel().resetMatrixPositions(end); + + for (int i = 0; !stopit && i < matrix_index.length; i++) + { + tmp = start_value + (i * div); + + if (tmp > end) + break; + + value = update(tmp, i); + str = Common.getMpvDecoderClass().getInfo_2(); + str = str.substring(0, str.indexOf(",")); + + CommonGui.getPicturePanel().setMatrixIndexPosition(i, value, str); + + Thread.sleep(5); + } + } + + stop(); + + } catch (InterruptedException e) {} + + } + } + + /** + * + */ + private long update(long val, int index) + { + return previewMatrix(val, index); + } + + /** + * + */ + public void stop() + { + clockThread = null; + } + } + + + /** + * + */ + public CutPanel() + { + chooser = CommonGui.getMainFileChooser(); + + // setLayout(new BorderLayout()); + + sliderPanel = buildSliderPanel(); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + panel.add(buildPointPanel()); + panel.add(buildNavigationPanel()); + panel.add(cutview = new CutView()); + + + //cut-preview pic handling + cutview.addMouseListener(new MouseAdapter() + { + public void mouseClicked(MouseEvent e) + { + if (e.getClickCount() < 2) + return; + + try { + if (e.getX() < cutview.getBottom() - 20 && e.getY() < 104) + { + if (cutview.getTopIndex() != null) + preview(Long.parseLong(cutview.getTopIndex().toString())); + } + + else if (e.getX() > cutview.getBottom() && e.getY() < 104) + { + if (cutview.getBottomIndex() != null) + preview(Long.parseLong(cutview.getBottomIndex().toString())); + } + + } catch (Exception exc) {} + } + }); + + cutview.addMouseMotionListener(new MouseMotionAdapter() { + public void mouseDragged(MouseEvent e) + { + if (e.getY() > 104) + { + cutview.setSlider(e.getX()); + + if (collection == null) + return; + + CommonGui.getPicturePanel().setMixedPreviewPixel(collection.getCutImage(cutview.getPreviewPosition()), cutview.getTransparencyValue()); + CommonGui.getPicturePanel().repaint(); + } + } + + public void mouseMoved(MouseEvent e) + { + } + }); + + + add(panel); + + setVisible(true); + } + + /** + * + */ + protected JPanel buildSliderPanel() + { + slider = new JSlider(0, (int)(10240000L / divisor), 0); + slider.setPreferredSize(new Dimension(860, 30)); + slider.setMaximumSize(new Dimension(860, 30)); + slider.setMaximum(1); + slider.setMajorTickSpacing(1); + slider.setMinorTickSpacing(1); + slider.setPaintTicks(true); + slider.setValue(0); + + slider.addMouseListener(new MouseAdapter() + { + public void mouseClicked(MouseEvent e) + { + if (slideshow || previewList.isEmpty() || Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE) + { + slideshow = false; + return; + } + + if (e.getClickCount() < 2) + return; + + slideshow = true; + cl.start(lastPosition); + } + }); + + slider.addChangeListener(new ChangeListener() + { + public void stateChanged(ChangeEvent e) + { + if (collection == null) + return; + + if (!action) + return; + + if (slider.getValueIsAdjusting() && !Common.getSettings().getBooleanProperty(Keys.KEY_Preview_LiveUpdate)) + return; + + long val = (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE ? divisor : 1L) * slider.getValue(); + + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE && val != (lastPosition & ~15)) + preview(val); + + else if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE) + { + Common.getMpvDecoderClass().resetProcessedPosition(); + Common.getMpvDecoderClass().setPidAndFileInfo(Resource.getString("CollectionPanel.Preview.offline")); + } + + getType(); + } + }); + + slider.addKeyListener(new KeyAdapter() + { + public void keyPressed(KeyEvent e) + { + if (collection == null) + return; + + int i = 0; + int ic = 0; + int offs = 0; + int keyval=e.getKeyCode(); + + switch(e.getKeyChar()) + { + case 'p': + ic=cutIndexList.getItemCount(); + if (ic > 0) { + i = ic - 1; + if (lastPosition>Long.parseLong(cutIndexList.getItemAt(0).toString())) + while (lastPosition <= Long.parseLong(cutIndexList.getItemAt(i).toString())) + i--; + cutIndexList.setSelectedIndex(i); + } + return; + + case 'n': + ic=cutIndexList.getItemCount(); + if (ic > 0) { + if (lastPosition= Long.parseLong(cutIndexList.getItemAt(i).toString())) + i++; + cutIndexList.setSelectedIndex(i); + } + return; + + case 'a': + cutAdd.doClick(); + return; + + case 'd': + cutDelete.doClick(); + return; + } + + if (e.isShiftDown()) + offs = 62500; + + else if (e.isControlDown()) + offs = 312500; + + else if (e.isAltDown()) + offs = 3125000; + + else + return; + + switch (keyval) + { + case KeyEvent.VK_RIGHT: + slider.setValue(slider.getValue() + offs); + break; + + case KeyEvent.VK_LEFT: + slider.setValue(slider.getValue() - offs); + } + } + }); + + + JPanel panel = new JPanel(new BorderLayout()); + + if (!Common.getSettings().getBooleanProperty(Keys.KEY_Preview_SliderWidth)) + { + panel.add(Box.createRigidArea(new Dimension(145, 20)), BorderLayout.WEST); + panel.add(slider, BorderLayout.CENTER); + panel.add(Box.createRigidArea(new Dimension(194, 20)), BorderLayout.EAST); + } + else + panel.add(slider, BorderLayout.CENTER); + + + return panel; + } + + /** + * + */ + protected void setComponentColor(JComponent comp, Color c) + { + comp.setBackground(c); + comp.setForeground(c); + } + + /** + * + */ + protected JPanel buildNavigationPanel() + { + JPanel panel_1 = new JPanel(); + panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.X_AXIS)); + + JPanel panel_2 = new JPanel(); + panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS)); + + jump = new JButton[navigation.length]; + + for (int i = 0; i < jump.length; i++) + { + jump[i] = new JButton(CommonGui.loadIcon(navigation[i])); + jump[i].setPreferredSize(new Dimension(34, 24)); + jump[i].setMaximumSize(new Dimension(34, 24)); + jump[i].setActionCommand(navigation[i]); + jump[i].addActionListener(jumpAction); + + if (i < 6) + panel_1.add(jump[i]); + else + panel_2.add(jump[i]); + } + + positionField = new JTextField(""); + positionField.setPreferredSize(new Dimension(136, 24)); + positionField.setMaximumSize(new Dimension(136, 24)); + positionField.setToolTipText(Resource.getString("CollectionPanel.CutPanel.Tip4")); + positionField.setActionCommand("cutnumber"); + positionField.addActionListener(cutAction); + panel_2.add(positionField); + + + cutmode_combobox = new JComboBox(Keys.ITEMS_CutMode); + cutmode_combobox.setPreferredSize(new Dimension(204, 24)); + cutmode_combobox.setMaximumSize(new Dimension(204, 24)); + cutmode_combobox.setActionCommand(Keys.KEY_CutMode[0]); + cutmode_combobox.setSelectedIndex(Common.getSettings().getIntProperty(Keys.KEY_CutMode)); + cutmode_combobox.addActionListener(_ComboBoxIndexListener); + + + JPanel panel_3 = new JPanel(); + panel_3.setLayout(new BoxLayout(panel_3, BoxLayout.X_AXIS)); + + estimatedSizeField = new JTextField(""); + //estimatedSizeField.setToolTipText(Resource.getString("CollectionPanel.NumberOfPoints.Tip")); + estimatedSizeField.setBackground(new java.awt.Color(230, 230, 230)); + estimatedSizeField.setEditable(false); + estimatedSizeField.setPreferredSize(new Dimension(150, 24)); + estimatedSizeField.setMaximumSize(new Dimension(150, 24)); + estimatedSizeField.setMinimumSize(new Dimension(150, 24)); + panel_3.add(estimatedSizeField); + + JButton play = new JButton(CommonGui.loadIcon("slidestart.gif")); + play.setToolTipText("start SlideShow"); + play.setPreferredSize(new Dimension(27, 24)); + play.setMaximumSize(new Dimension(27, 24)); + play.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + if (slideshow || previewList.isEmpty() || Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE) + { + slideshow = false; + return; + } + + slideshow = true; + cl.start(lastPosition); + } + }); + + panel_3.add(play); + + JButton stop = new JButton(CommonGui.loadIcon("slidestop.gif")); + stop.setToolTipText("stop SlideShow"); + stop.setPreferredSize(new Dimension(27, 24)); + stop.setMaximumSize(new Dimension(27, 24)); + stop.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + slideshow = false; + } + }); + + panel_3.add(stop); + + /** + * + */ + JPanel panel = new JPanel(); + panel.setLayout(new ColumnLayout()); + panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Navigation")); + panel.add(panel_1); + panel.add(panel_2); + panel.add(panel_3); + panel.add(cutmode_combobox); + + + return panel; + } + + /** + * + */ + protected JPanel buildPointPanel() + { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + + panel.add(buildChapterPointPanel()); + panel.add(buildCutPointPanel()); + + return panel; + } + + /** + * + */ + protected JPanel buildCutPointPanel() + { + /** + * row 1 + */ + cutIndexField = new JTextField(); + cutIndexField.setBackground(new Color(230, 230, 230)); + cutIndexField.setPreferredSize(new Dimension(48, 24)); + cutIndexField.setMaximumSize(new Dimension(48, 24)); + cutIndexField.setEditable(false); + cutIndexField.setHorizontalAlignment(JTextField.CENTER); + + JButton cutMoveLeft = new JButton(CommonGui.loadIcon("leftcut.gif")); + cutMoveLeft.setActionCommand("movecutleft"); + cutMoveLeft.setPreferredSize(new Dimension(36, 24)); + cutMoveLeft.setMaximumSize(new Dimension(36, 24)); + cutMoveLeft.addActionListener(cutAction); + + JButton cutMoveRight = new JButton(CommonGui.loadIcon("rightcut.gif")); + cutMoveRight.setActionCommand("movecutright"); + cutMoveRight.setPreferredSize(new Dimension(36, 24)); + cutMoveRight.setMaximumSize(new Dimension(36, 24)); + cutMoveRight.addActionListener(cutAction); + + JPanel panel_1 = new JPanel(); + panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.X_AXIS)); + panel_1.add(cutMoveLeft); + panel_1.add(cutMoveRight); + panel_1.add(cutIndexField); + + + /** + * row 2 + */ + cutAdd = new JButton(CommonGui.loadIcon("addcut.gif")); + cutAdd.setActionCommand("addpoint"); + cutAdd.setPreferredSize(new Dimension(36, 24)); + cutAdd.setMaximumSize(new Dimension(36, 24)); + cutAdd.addActionListener(cutAction); + + DropTarget dropTarget_4 = new DropTarget(cutAdd, dnd2); + + cutDelete = new JButton(CommonGui.loadIcon("remcut.gif")); + cutDelete.setActionCommand("delpoint"); + cutDelete.setPreferredSize(new Dimension(36, 24)); + cutDelete.setMaximumSize(new Dimension(36, 24)); + cutDelete.addActionListener(cutAction); + + cutCountField = new JTextField(); + cutCountField.setToolTipText(Resource.getString("CollectionPanel.NumberOfPoints.Tip")); + cutCountField.setBackground(new Color(230, 230, 230)); + cutCountField.setPreferredSize(new Dimension(48, 24)); + cutCountField.setMaximumSize(new Dimension(48, 24)); + cutCountField.setHorizontalAlignment(JTextField.CENTER); + cutCountField.setEditable(false); + + JPanel panel_2 = new JPanel(); + panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS)); + panel_2.add(cutAdd); + panel_2.add(cutDelete); + panel_2.add(cutCountField); + + + /** + * row 3 + */ + cutIndexList = new JComboBox(); + cutIndexList.setMaximumRowCount(5); + cutIndexList.setPreferredSize(new Dimension(120, 24)); + cutIndexList.setMaximumSize(new Dimension(120, 24)); + cutIndexList.setActionCommand("cutbox"); + cutIndexList.addActionListener(cutAction); + + JPanel panel_3 = new JPanel(); + panel_3.setLayout(new BoxLayout(panel_3, BoxLayout.X_AXIS)); + panel_3.add(cutIndexList); + + + /** + * row 4 + */ + JButton cut_loadlist = new JButton(CommonGui.loadIcon("open.gif")); + cut_loadlist.setPreferredSize(new Dimension(32, 24)); + cut_loadlist.setMaximumSize(new Dimension(32, 24)); + cut_loadlist.setToolTipText(Resource.getString("CollectionPanel.loadCutpointList.Tip")); //DM18022004 081.6 int17 new + cut_loadlist.setActionCommand("load_cutlist"); + cut_loadlist.addActionListener(jumpAction); + + // JButton cut_savelist = new JButton("save"); + JButton cut_savelist = new JButton(CommonGui.loadIcon("save.gif")); + cut_savelist.setPreferredSize(new Dimension(32, 24)); + cut_savelist.setMaximumSize(new Dimension(32, 24)); + cut_savelist.setActionCommand("save_cutlist"); + cut_savelist.addActionListener(jumpAction); + + //JButton cut_scan = new JButton("scan"); + // JButton cut_scan = new JButton(CommonGui.loadIcon("scan2.gif")); + JButton cut_scan = new JButton(CommonGui.loadIcon("matrix.gif")); + cut_scan.setPreferredSize(new Dimension(50, 24)); + cut_scan.setMaximumSize(new Dimension(50, 24)); + cut_scan.setActionCommand("cut_scan"); + cut_scan.addActionListener(jumpAction); + cut_scan.setEnabled(true); +// cut_scan.setEnabled(false); + + JPanel panel_4 = new JPanel(); + panel_4.setLayout(new BoxLayout(panel_4, BoxLayout.X_AXIS)); + panel_4.add(cut_loadlist); + panel_4.add(cut_savelist); + panel_4.add(Box.createRigidArea(new Dimension(6, 1))); + panel_4.add(cut_scan); + + + /** + * + */ + JPanel panel = new JPanel(); + panel.setLayout(new ColumnLayout()); + panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), Resource.getString("CollectionPanel.NumberOfPoints"))); + panel.add(panel_2); + panel.add(panel_1); + panel.add(panel_3); + panel.add(panel_4); + + Color c = new Color(212, 175, 212); //new Color(200, 150, 200); + // setComponentColor(cutAdd, c); + // setComponentColor(cutDelete, c); + setComponentColor(panel, c); + setComponentColor(panel_4, c); + + return panel; + } + + /** + * + */ + protected JPanel buildChapterPointPanel() + { + /** + * row 1 + */ + chapterIndexField = new JTextField(); + chapterIndexField.setBackground(new Color(230, 230, 230)); + chapterIndexField.setPreferredSize(new Dimension(48, 24)); + chapterIndexField.setMaximumSize(new Dimension(48, 24)); + chapterIndexField.setEditable(false); + chapterIndexField.setHorizontalAlignment(JTextField.CENTER); + + JButton chapterMoveLeft = new JButton(CommonGui.loadIcon("leftchap.gif")); + chapterMoveLeft.setActionCommand("movechapterleft"); + chapterMoveLeft.setPreferredSize(new Dimension(36, 24)); + chapterMoveLeft.setMaximumSize(new Dimension(36, 24)); + chapterMoveLeft.addActionListener(cutAction); + + JButton chapterMoveRight = new JButton(CommonGui.loadIcon("rightchap.gif")); + chapterMoveRight.setActionCommand("movechapterright"); + chapterMoveRight.setPreferredSize(new Dimension(36, 24)); + chapterMoveRight.setMaximumSize(new Dimension(36, 24)); + chapterMoveRight.addActionListener(cutAction); + + JPanel panel_1 = new JPanel(); + panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.X_AXIS)); + panel_1.add(chapterMoveLeft); + panel_1.add(chapterMoveRight); + panel_1.add(chapterIndexField); + + + /** + * row 2 + */ + chapterAdd = new JButton(CommonGui.loadIcon("addchap.gif")); + chapterAdd.setActionCommand("addchapter"); + chapterAdd.setPreferredSize(new Dimension(36, 24)); + chapterAdd.setMaximumSize(new Dimension(36, 24)); + chapterAdd.addActionListener(cutAction); + + chapterDelete = new JButton(CommonGui.loadIcon("remchap.gif")); + chapterDelete.setActionCommand("delchapter"); + chapterDelete.setPreferredSize(new Dimension(36, 24)); + chapterDelete.setMaximumSize(new Dimension(36, 24)); + chapterDelete.addActionListener(cutAction); + + chapterCountField = new JTextField(); + chapterCountField.setToolTipText(Resource.getString("CollectionPanel.NumberOfChapters.Tip")); + chapterCountField.setBackground(new Color(230, 230, 230)); + chapterCountField.setPreferredSize(new Dimension(48, 24)); + chapterCountField.setMaximumSize(new Dimension(48, 24)); + chapterCountField.setEditable(false); + chapterCountField.setHorizontalAlignment(JTextField.CENTER); + chapterCountField.addActionListener(cutAction); + + JPanel panel_2 = new JPanel(); + panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS)); + panel_2.add(chapterAdd); + panel_2.add(chapterDelete); + panel_2.add(chapterCountField); + + + /** + * row 3 + */ + chapterIndexList = new JComboBox(); + chapterIndexList.setMaximumRowCount(5); + chapterIndexList.setPreferredSize(new Dimension(120, 24)); + chapterIndexList.setMaximumSize(new Dimension(120, 24)); + chapterIndexList.setActionCommand("chapterbox"); + chapterIndexList.addActionListener(cutAction); + + JPanel panel_3 = new JPanel(); + panel_3.setLayout(new BoxLayout(panel_3, BoxLayout.X_AXIS)); + panel_3.add(chapterIndexList); + + /** + * row 4 + */ + JButton chapter_loadlist = new JButton(CommonGui.loadIcon("open.gif")); + chapter_loadlist.setPreferredSize(new Dimension(32, 24)); + chapter_loadlist.setMaximumSize(new Dimension(32, 24)); + chapter_loadlist.setToolTipText(Resource.getString("CollectionPanel.loadCutpointList.Tip")); //DM18022004 081.6 int17 new + chapter_loadlist.setActionCommand("load_chapterlist"); + chapter_loadlist.addActionListener(jumpAction); + + // JButton chapter_savelist = new JButton("save"); + JButton chapter_savelist = new JButton(CommonGui.loadIcon("save.gif")); + chapter_savelist.setPreferredSize(new Dimension(32, 24)); + chapter_savelist.setMaximumSize(new Dimension(32, 24)); + chapter_savelist.setActionCommand("save_chapterlist"); + chapter_savelist.addActionListener(jumpAction); + + // JButton chapter_scan = new JButton("scan"); + JButton chapter_scan = new JButton(CommonGui.loadIcon("scan2.gif")); + chapter_scan.setPreferredSize(new Dimension(50, 24)); + chapter_scan.setMaximumSize(new Dimension(50, 24)); + chapter_scan.setActionCommand("chapter_scan"); + chapter_scan.addActionListener(jumpAction); + chapter_scan.setEnabled(false); + + JPanel panel_4 = new JPanel(); + panel_4.setLayout(new BoxLayout(panel_4, BoxLayout.X_AXIS)); + panel_4.add(chapter_loadlist); + panel_4.add(chapter_savelist); + panel_4.add(Box.createRigidArea(new Dimension(6, 1))); + panel_4.add(chapter_scan); + + /** + * + */ + JPanel panel = new JPanel(); + panel.setLayout(new ColumnLayout()); + panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), Resource.getString("CollectionPanel.NumberOfChapters"))); + panel.add(panel_2); + panel.add(panel_1); + panel.add(panel_3); + panel.add(panel_4); + + Color c = new Color(210, 217, 255); //new Color(195, 205, 255); + // setComponentColor(chapterAdd, c); + // setComponentColor(chapterDelete, c); + setComponentColor(panel, c); + setComponentColor(panel_4, c); + + return panel; + } + + + /** + * + */ + public JPanel getSliderPanel() + { + return sliderPanel; + } + + /** + * + */ + private void saveCutList() + { + Object[] object = collection.getCutpoints(); + + if (object.length == 0) + return; + + String newfile = file + "(" + active_collection + ").Xcl"; + + chooser.setSelectedFile(new File(newfile)); + chooser.rescanCurrentDirectory(); + + int retval = chooser.showSaveDialog(this); + + if (retval == JFileChooser.APPROVE_OPTION) + { + File theFile = chooser.getSelectedFile(); + + if (theFile != null && !theFile.isDirectory()) + { + newfile = theFile.getAbsolutePath(); + + if (theFile.exists() && !CommonGui.getUserConfirmation(Resource.getString("msg.overwrite", newfile))) + return; + } + else + return; + } + else + return; + + try { + + BufferedWriter listwriter = new BufferedWriter(new FileWriter(newfile)); + + listwriter.write(Keys.KEY_CutMode[0] + "=" + Common.getSettings().getProperty(Keys.KEY_CutMode)); + listwriter.newLine(); + + for (int i = 0; i < object.length; i++) + { + listwriter.write(object[i].toString()); + listwriter.newLine(); + } + + listwriter.close(); + } + + catch (IOException e) { + + Common.setMessage(Resource.getString("CollectionPanel.FileAccessError") + " " + file); + } + } + + /** + * + */ + private void loadCutList() + { + loadCutList(""); + } + + /** + * + */ + private void loadCutList(String newfile) + { + List pointlist = new ArrayList(); + + String point = ""; + + if (!(new File(newfile).exists())) + { + chooser.rescanCurrentDirectory(); + int retval = chooser.showOpenDialog(this); + + if(retval == JFileChooser.APPROVE_OPTION) + { + File theFile = chooser.getSelectedFile(); + + if(theFile != null && !theFile.isDirectory()) + newfile = theFile.getAbsolutePath(); + } + else + return; + } + + try { + + BufferedReader listreader = new BufferedReader(new FileReader(newfile)); + + while (true) + { + point = listreader.readLine(); + + if (point == null) + break; + + if (point.trim().equals("")) + continue; + + if (point.startsWith(Keys.KEY_CutMode[0])) + { + cutmode_combobox.setSelectedIndex(Integer.parseInt(point.substring(point.indexOf("=") + 1).trim())); + continue; + } + + if (point.startsWith("(")) + continue; + + pointlist.add(point); + } + + listreader.close(); + + } catch (IOException e5) { + + Common.setMessage(Resource.getString("CollectionPanel.loadCutpointList.Error") + " " + file); + } + + Object[] obj = pointlist.toArray(); + + if (obj.length > 0) + { + long[] cutPoints = new long[obj.length]; + + for (int i = 0; i < cutPoints.length; i++) + cutPoints[i] = CommonParsing.parseCutValue(obj[i].toString(), false); + + Arrays.sort(cutPoints); + + for (int i = 0; i < cutPoints.length; i++) + collection.addCutpoint(CommonParsing.parseCutValue(cutPoints[i])); + + action = false; + + reloadCutpoints(); + cutIndexList.setSelectedIndex(cutIndexList.getItemCount() - 1); + } + + getExpectedSize(); + getType(); + + action = true; + } + + /** + * + */ + private void saveChapterList() + { + Object[] object = collection.getChapterpoints(); + + if (object.length == 0) + return; + + String newfile = file + "[" + active_collection + "].Xcp"; + + chooser.setSelectedFile(new File(newfile)); + chooser.rescanCurrentDirectory(); + + int retval = chooser.showSaveDialog(this); + + if(retval == JFileChooser.APPROVE_OPTION) + { + File theFile = chooser.getSelectedFile(); + + if (theFile != null && !theFile.isDirectory()) + { + newfile = theFile.getAbsolutePath(); + + if (theFile.exists() && !CommonGui.getUserConfirmation(Resource.getString("msg.overwrite", newfile))) + return; + } + else + return; + } + else + return; + + if (!CommonGui.getUserConfirmation(Resource.getString("msg.overwrite", newfile))) + return; + + try { + + BufferedWriter listwriter = new BufferedWriter(new FileWriter(newfile)); + + listwriter.write(Keys.KEY_CutMode[0] + "=" + Common.getSettings().getProperty(Keys.KEY_CutMode)); + listwriter.newLine(); + + for (int i = 0; i < object.length; i++) + { + listwriter.write(object[i].toString()); + listwriter.newLine(); + } + + listwriter.close(); + } + + catch (IOException e) { + + Common.setMessage(Resource.getString("CollectionPanel.FileAccessError") + " " + file); + } + } + + /** + * + */ + private void loadChapterList() + { + loadChapterList(""); + } + + /** + * + */ + private void loadChapterList(String newfile) + { + List pointlist = new ArrayList(); + + String point = ""; + + if (!(new File(newfile).exists())) + { + chooser.rescanCurrentDirectory(); + int retval = chooser.showOpenDialog(this); + + if(retval == JFileChooser.APPROVE_OPTION) + { + File theFile = chooser.getSelectedFile(); + + if(theFile != null && !theFile.isDirectory()) + newfile = theFile.getAbsolutePath(); + } + else + return; + } + + try { + + BufferedReader listreader = new BufferedReader(new FileReader(newfile)); + + while (true) + { + point = listreader.readLine(); + + if (point == null) + break; + + if (point.trim().equals("")) + continue; + + if (point.startsWith(Keys.KEY_CutMode[0])) + { + cutmode_combobox.setSelectedIndex(Integer.parseInt(point.substring(point.indexOf("=") + 1).trim())); + continue; + } + + if (point.startsWith("(")) + continue; + + pointlist.add(point); + } + + listreader.close(); + + } catch (IOException e5) { + + Common.setMessage(Resource.getString("CollectionPanel.loadCutpointList.Error") + " " + file); + } + + Object[] obj = pointlist.toArray(); + + if (obj.length > 0) + { + long[] chpPoints = new long[obj.length]; + + for (int i = 0; i < chpPoints.length; i++) + chpPoints[i] = CommonParsing.parseCutValue(obj[i].toString(), false); + + Arrays.sort(chpPoints); + + for (int i = 0; i < chpPoints.length; i++) + collection.addChapterpoint(CommonParsing.parseCutValue(chpPoints[i])); + + action = false; + + reloadChapterpoints(); + chapterIndexList.setSelectedIndex(chapterIndexList.getItemCount() - 1); + } + + getExpectedSize(); + getType(); + + action = true; + } + + /** + * + */ + private void getExpectedSize() + { + if (previewList.isEmpty()) + { + estimatedSizeField.setText(" "); + return; + } + + Object[] object = collection.getCutpoints(); + + long newSize[] = new long[object.length]; + long start = 0; + long diff = 0; + long end = 0; + + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) + { + for (int i = 0; i < newSize.length; i++) + newSize[i] = Long.parseLong(object[i].toString()); + + if (newSize.length == 0 || (newSize.length & 1) == 1) + end = ((PreviewObject) previewList.get(previewList.size() - 1)).getEnd(); + + else + end = newSize[newSize.length - 1]; + + for (int i = 0; i < newSize.length; i += 2) + { + diff += newSize[i] - start; + start = i + 1 < newSize.length ? newSize[i + 1] : start; + } + } + + String length = Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE ? (Resource.getString("CollectionPanel.expectedSize") + " " + ((end - diff) / 1048576L) + "MB") : ""; + + estimatedSizeField.setText(length); + chapterCountField.setText(String.valueOf(chapterIndexList.getItemCount())); + cutCountField.setText(String.valueOf(cutIndexList.getItemCount())); + } + + /** + * + */ + private void getType() + { + /** + * cuts + */ + Object[] obj = collection != null ? collection.getCutpoints() : new Object[0]; + int index; + + if (obj.length > 0) + { + index = getCutIndex(obj, String.valueOf(lastPosition)); + + showCutInfo((index & 1) == 0, obj, previewList); + //Common.getGuiInterface().showCutIcon((index & 1) == 0, obj, previewList); + } + + else + showCutInfo(true, null, previewList); + //Common.getGuiInterface().showCutIcon(true, null, previewList); + + /** + * chapters + */ + obj = collection != null ? collection.getChapterpoints() : new Object[0]; + + if (obj.length > 0) + Common.getGuiInterface().showChapterIcon(obj, previewList); + + else + Common.getGuiInterface().showChapterIcon(null, previewList); + + } + + /** + * + */ + private int getCutIndex(Object[] obj, String value) + { + class MyComparator implements Comparator + { + public int compare(Object o1, Object o2) + { + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_TIME) + return Long.toString(CommonParsing.parseCutValue(o1.toString(), false)).compareTo(Long.toString(CommonParsing.parseCutValue(o2.toString(), false))); + + else + return Long.valueOf(o1.toString()).compareTo(Long.valueOf(o2.toString())); + } + } + + /** + * handle wrong numbers + */ + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE) + if (CommonParsing.parseCutValue(value, false) < 0) + return 0; + + return Arrays.binarySearch(obj, value, new MyComparator()); // is already sorted + } + + /** + * + */ + public long preview(long position) + { + boolean backward = false; + + try { + + CommonGui.getPicturePanel().disableMatrix(); + + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE || previewList.isEmpty()) + { + Common.getMpvDecoderClass().resetProcessedPosition(); + Common.getMpvDecoderClass().setPidAndFileInfo(Resource.getString("CollectionPanel.Preview.offline")); + + return lastPosition; + } + + action = false; + + int loadSize = getLoadSize(); // bytes for searching the next I-frame ;changed for X0.81 + + if (position / divisor >= (long)slider.getMaximum()) // last + { + position = position > loadSize ? position - loadSize : 0; + backward = true; + } + + else if (position > 0 && position < lastPosition && ((lastPosition / divisor) - (position / divisor)) < 3L ) + { + if (lastPosition - position < 50) + position = lastPosition; + + position = position > loadSize ? position - loadSize : 0; + backward = true; + } + + position = Preview.load(position, ((backward && position == 0) ? (int)lastPosition : loadSize), previewList, backward, Common.getSettings().getBooleanProperty(Keys.KEY_Preview_AllGops), Common.getSettings().getBooleanProperty(Keys.KEY_Preview_fastDecode), Common.getSettings().getIntProperty(Keys.KEY_Preview_YGain), collection.getPIDs(), active_collection); + + String str = Preview.getProcessedFile(); + + if (str.length() > 32) + { + int i = str.indexOf('-'); + + String _str = str.substring(0, i + 2); + str = _str + "..." + str.substring(i + 2 + (str.length() - 34 - i), str.length()); + } + + lastPosition = position; + + slider.setValue((int)(lastPosition / divisor)); + setPositionField(lastPosition); + slider.requestFocus(); + + } catch (Exception e6) { + + Common.setExceptionMessage(e6); + } + + getExpectedSize(); + + updateCutView(String.valueOf(lastPosition)); + + action = true; + + return lastPosition; + } + + /** + * + */ + public void startMatrix(long from_position) + { + cm.start(from_position); + } + + /** + * + */ + public void restartMatrix() + { + cm.restart(0); + } + + /** + * + */ + public void stopMatrix() + { + cm.breakLoop(); + } + + /** + * + */ + private long previewMatrix(long position, int matrix_index) + { + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE || previewList.isEmpty()) + return position; + + action = false; + + position = Preview.silentload(position, getLoadSize(), previewList, false, Common.getSettings().getBooleanProperty(Keys.KEY_Preview_AllGops), Common.getSettings().getBooleanProperty(Keys.KEY_Preview_fastDecode), Common.getSettings().getIntProperty(Keys.KEY_Preview_YGain), collection.getPIDs(), active_collection); + + CommonGui.getPicturePanel().setMatrixPreviewPixel(matrix_index); + CommonGui.getPicturePanel().repaint(); + + action = true; + + return position; + } + + /** + * updates last and next cutpoint view + */ + private void updateCutView(String value) + { + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE) + { + cutview.clearViews(); + return; + } + + Object[] listData = collection == null ? null : collection.getCutpoints(); + + if (listData == null || listData.length == 0) + { + cutview.clearViews(); + return; + } + + int index = getCutIndex(listData, value); + + if (index < 0) + { + int i = -index - 1; + + cutview.setMatchingPoint(false, listData, index); + cutview.setImage(i < listData.length ? collection.getCutImage(listData[i]) : null, listData, i, cutview.getBottom()); + cutview.setImage(i - 1 >= 0 && i - 1 < listData.length ? collection.getCutImage(listData[i - 1]) : null, listData, i - 1, cutview.getTop()); + } + + else + { + if (collection.getCutImage(listData[index]) == null) + collection.setCutImage(value, Common.getMpvDecoderClass().getCutImage()); + + cutview.setMatchingPoint(true, listData, index); + cutview.setImage(index + 1 < listData.length ? collection.getCutImage(listData[index + 1]) : null, listData, index + 1, cutview.getBottom()); + cutview.setImage(index - 1 >= 0 ? collection.getCutImage(listData[index - 1]) : null, listData, index - 1, cutview.getTop()); + } + } + + /** + * + */ + private int getLoadSize() + { + try { + int val = Common.getPreviewBufferValue(); + + return val; + } + catch (Exception e) { + Common.setMessage("!> wrong preview_buffer field entry", true); + } + + return loadSizeForward; + } + + /** + * + */ + private boolean checkActiveCollection() + { + if (active_collection >= 0) + return true; + + collection = null; + + action = false; + + previewList.clear(); + reloadCutpoints(); + reloadChapterpoints(); + showCutInfo(true, null, previewList); + //Common.getGuiInterface().showCutIcon(true, null, previewList); + Common.getGuiInterface().showChapterIcon(null, previewList); + + slider.setMaximum(1); + + Common.setOSDMessage(Resource.getString("CollectionPanel.Preview.offline")); + + action = true; + + return false; + } + + /** + * + */ + public void entry(int _active_collection) + { + if (active_collection != _active_collection) + cutview.clearViews(); + + active_collection = _active_collection; + + Common.getMpvDecoderClass().clearPreviewPixel(); + Common.getMpvDecoderClass().resetProcessedPosition(); + Common.getMpvDecoderClass().setPidAndFileInfo(Resource.getString("CollectionPanel.Preview.offline")); + + /** + * + */ + if (!checkActiveCollection()) + return; + + CommonGui.getPicturePanel().showCollectionNumber(active_collection); + + cutmode_combobox.setSelectedIndex(Common.getSettings().getIntProperty(Keys.KEY_CutMode)); + + collection = Common.getCollection(active_collection); + + List input_files = collection.getInputFilesAsList(); + previewList.clear(); + + file = !input_files.isEmpty() ? input_files.get(0).toString() : ""; + + /** + * determine primary file segments, scan only if changed (date modified) or not scanned + */ + long start = 0; + long end = 0; + long maximum; + int size = input_files.size(); + int primaryFilesCount = 1; + + if (Common.getSettings().getBooleanProperty(Keys.KEY_Preview_disable)) + size = 0; + + filesearch: + for (int a = 0, b = -1, type = -1; a < size; a++) + { + XInputFile xInputFile = ((XInputFile) input_files.get(a)).getNewInstance(); + + if (xInputFile == null) + continue; + + if (xInputFile.getStreamInfo() == null) + Common.getScanClass().getStreamInfo(xInputFile); //note: is a new instance + + type = xInputFile.getStreamInfo().getStreamType(); + + if (b != -1 && b != type) + { + primaryFilesCount = a; + break filesearch; + } + + switch (type) + { + case CommonParsing.PES_AV_TYPE: + case CommonParsing.MPEG1PS_TYPE: + case CommonParsing.MPEG2PS_TYPE: + case CommonParsing.PVA_TYPE: + case CommonParsing.TS_TYPE: + case CommonParsing.ES_MPV_TYPE: + b = type; + + start = end; + end += xInputFile.length(); + previewList.add(new PreviewObject(start, end, type, xInputFile)); + break; + + default: + break filesearch; + } + } + + action = false; + + // reduce slider maximum, fit int requirements + for (divisor = 16L; ; divisor += 16L) + { + maximum = end / divisor; + + if (maximum < 0x7FFFFFFFL) + break; + } + + if (maximum > divisor) + { + slider.setMaximum((int) maximum); + slider.setMajorTickSpacing((int) (maximum / 10)); + slider.setMinorTickSpacing((int) (maximum / 100)); + slider.setPaintTicks(true); + } + + else + { + slider.setMaximum(1); + slider.setMajorTickSpacing(1); + slider.setMinorTickSpacing(1); + slider.setPaintTicks(true); + } + + action = true; + + Common.setLastPreviewBitrate(CommonParsing.MAX_SD_BITRATE_VALUE); + + if (Common.getSettings().getIntProperty(Keys.KEY_CutMode) == CommonParsing.CUTMODE_BYTE && !previewList.isEmpty()) + preview(0); + + else + { + Common.getMpvDecoderClass().clearPreviewPixel(); + Common.setOSDMessage(Resource.getString("CollectionPanel.Preview.offline")); + } + + action = false; + + reloadCutpoints(); + reloadChapterpoints(); + cutIndexList.setSelectedIndex(cutIndexList.getItemCount() - 1); + + getExpectedSize(); + getType(); + + action = true; + } + + /** + * + */ + private boolean addChapterpoint(String value) + { + int index = 0; + + index = getCutIndex(collection.getChapterpoints(), value); + + if (index >= 0) + return false; + + collection.addChapterpoint(-index - 1, value); + + reloadChapterpoints(); + + chapterIndexList.setSelectedItem(value); + + return true; + } + + /** + * + */ + private Object removeChapterpoint(int index) + { + Object obj = collection.removeChapterpoint(index); + + reloadChapterpoints(); + + Object[] objects = collection.getChapterpoints(); + + if (objects.length > 0) + { + int _index = -getCutIndex(collection.getChapterpoints(), obj.toString()) - 1; + + if (_index >= objects.length) + _index = objects.length - 1; + + chapterIndexList.setSelectedIndex(_index); + } + + return obj; + } + + /** + * + */ + private void reloadChapterpoints() + { + chapterIndexList.removeAllItems(); + + Object[] object = collection != null ? collection.getChapterpoints() : new Object[0]; + + for (int i = 0; i < object.length; i++) + chapterIndexList.addItem(object[i]); + } + + /** + * + */ + private boolean addCutpoint(String value) + { + int index = 0; + + index = getCutIndex(collection.getCutpoints(), value); + + if (index >= 0) + return false; + + collection.addCutpoint(-index - 1, value); + + reloadCutpoints(); + + cutIndexList.setSelectedItem(value); + + return true; + } + + /** + * + */ + private Object removeCutpoint(int index) + { + Object obj = collection.removeCutpoint(index); + + reloadCutpoints(); + + Object[] objects = collection.getCutpoints(); + + if (objects.length > 0) + { + int _index = -getCutIndex(collection.getCutpoints(), obj.toString()) - 1; + + if (_index >= objects.length) + _index = objects.length - 1; + + cutIndexList.setSelectedIndex(_index); + } + + return obj; + } + + /** + * + */ + private void reloadCutpoints() + { + cutIndexList.removeAllItems(); + + Object[] object = collection != null ? collection.getCutpoints() : new Object[0]; + + for (int i = 0; i < object.length; i++) + cutIndexList.addItem(object[i]); + } + + /** + * + */ + private void setCutIndexField(int value) + { + Object[] obj = collection != null ? collection.getCutpoints() : null; + + cutIndexField.setText(obj == null || value < 0 ? "" : String.valueOf(value) + "/" + String.valueOf(obj.length)); + } + + /** + * + */ + private void setChapterIndexField(int value) + { + Object[] obj = collection != null ? collection.getChapterpoints() : null; + + chapterIndexField.setText(obj == null || value < 0 ? "" : String.valueOf(value) + "/" + String.valueOf(obj.length)); + } + + /** + * + */ + private void setPositionField(long value) + { + updatePositionField(String.valueOf(value)); + } + + /** + * + */ + private void updatePositionField() + { + updatePositionField(positionField.getText()); + } + + /** + * + */ + private void updatePositionField(String str) + { + boolean b = action; + + List list_1 = collection.getCutpointList(); + List list_2 = collection.getChapterpointList(); + + action = false; + + if (list_1.contains(str)) + positionField.setBackground(new Color(225, 200, 225)); + + else if (list_2.contains(str)) + positionField.setBackground(new Color(225, 230, 255)); + + else + positionField.setBackground(Color.white); + + positionField.setText(str); + + action = b; + } + + /** + * + */ + private void showCutInfo(boolean b, Object[] obj, Object list) + { + boolean b1 = false; + + if (!((List) list).isEmpty()) + { + if (collection.getSettings().getBooleanProperty(Keys.KEY_OptionDAR) && + collection.getSettings().getIntProperty(Keys.KEY_ExportDAR) + 1 != Common.getMpvDecoderClass().getAspectRatio()) + b1 = true; + + else if (collection.getSettings().getBooleanProperty(Keys.KEY_OptionHorizontalResolution) && + collection.getSettings().getIntProperty(Keys.KEY_ExportHorizontalResolution) != Common.getMpvDecoderClass().getWidth()) + b1 = true; + } + + CommonGui.getPicturePanel().setFilterStatus(b1); + Common.getGuiInterface().showCutIcon(b, obj, list); + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CutView.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CutView.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/CutView.java 2006-01-19 02:58:04.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/CutView.java 2007-07-09 15:50:46.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)CutView * - * Copyright (c) 2005-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2006 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -33,27 +33,37 @@ import java.awt.Image; import java.awt.image.MemoryImageSource; import java.awt.Font; +import java.awt.GridLayout; import java.util.Arrays; +import javax.swing.BoxLayout; import javax.swing.JPanel; - +/** + * + */ public class CutView extends JPanel { - private final int Top = 20; - private final int Bottom = 184; + private final int Top = 15; + private final int Bottom = 188; private int[] image_data; - private int width = 224; - private int height = 126; + private int width = 160; + private int height = 90; + + private int sliderPosition = 175; + + private Object index_top = null; + private Object index_bottom = null; private boolean matchingPoint = false; private boolean cut_top = true; private boolean cut_bottom = false; private boolean cut_match = false; + private boolean action = false; private String string_bottom = "Next:"; private String string_top = "Prev:"; @@ -67,10 +77,11 @@ private MemoryImageSource source_top; private MemoryImageSource source_bottom; - private final Color BackgroundColor; - private final Color RedColor; + private Color BackgroundColor; + private Color RedColor; + + private Font font; - private final Font font; /** * @@ -90,7 +101,11 @@ BackgroundColor = new Color(0, 35, 110); RedColor = new Color(255, 100, 100); - font = new Font("Tahoma", Font.PLAIN, 14); + font = new Font("Tahoma", Font.PLAIN, 12); + + setPreferredSize(new Dimension(350, 120)); + setMaximumSize(new Dimension(350, 120)); + setMinimumSize(new Dimension(350, 120)); setBackground(Color.black); setVisible(true); @@ -115,11 +130,74 @@ /** * */ + public Object getTopIndex() + { + return index_top; + } + + /** + * + */ + public Object getBottomIndex() + { + return index_bottom; + } + + /** + * + */ + public void setSlider(int val) + { + sliderPosition = val; + + repaint(); + } + + /** + * + */ + public Object getPreviewPosition() + { + if (sliderPosition < 168) + return getTopIndex(); + + if (sliderPosition > 182) + return getBottomIndex(); + + return null; + } + + /** + * + */ + public int getTransparencyValue() + { + double div = 255.0 / 168.0; + int factor = 0; + + if (sliderPosition < 168) + factor = -sliderPosition + 168; + + if (sliderPosition > 182) + factor = sliderPosition - 182; + + div *= factor; + factor = (int) div; + factor = factor > 255 ? 255 : factor; + + return factor; + } + + /** + * + */ public void clearViews() { matchingPoint = false; clearView(Top); clearView(Bottom); + + CommonGui.getPicturePanel().setMixedPreviewPixel(null, 0); } /** @@ -148,15 +226,17 @@ if (position < 100) { source_top.newPixels(); - string_top = "Prev: " + (object != null ? "#" + index + " @ " + object[index] + string_in_out[index & 1] : "= Collection Begin"); + string_top = "Prev: " + (object != null ? "#" + (index + 1) + " - " + object[index] + string_in_out[index & 1] : "= Collection Begin"); cut_top = object != null ? (index & 1) == 0 : (!matchingPoint ? !cut_bottom : false); + index_top = object != null ? object[index] : null; } else { source_bottom.newPixels(); - string_bottom = "Next: " + (object != null ? "#" + index + " @ " + object[index] + string_in_out[index & 1] : "= Collection End"); + string_bottom = "Next: " + (object != null ? "#" + (index + 1) + " - " + object[index] + string_in_out[index & 1] : "= Collection End"); cut_bottom = object != null ? (index & 1) == 0 : false; + index_bottom = object != null ? object[index] : null; } repaint(); @@ -173,18 +253,41 @@ return; } - System.arraycopy(data, 0, image_data, 0 , data.length); + scaleCutImage(data); updateView(position, object, index); } /** + * create new smaller cutimage pixel data + */ + private void scaleCutImage(int[] data) + { + int source_width = 512; + int source_height = 288; + + float Y = 0; + float X = 0; + float decimate_height = (float)source_height / height; + float decimate_width = (float)source_width / width; + + for (int y = 0, tmp1, tmp2; Y < source_height && y < height; Y += decimate_height, y++, X = 0) + { + tmp1 = y * width; + tmp2 = (int)Y * source_width; + + for (int x = 0; X < source_width && x < width; X += decimate_width, x++) + image_data[x + tmp1] = data[(int)X + tmp2]; + } + } + + /** * */ public void setMatchingPoint(boolean b, Object[] object, int index) { matchingPoint = b; - string_matchingpoint = matchingPoint ? "This: #" + index + " @ " + object[index] + string_in_out[index & 1] : ""; + string_matchingpoint = matchingPoint ? "This: #" + (index + 1) + " @ " + object[index] + string_in_out[index & 1] : ""; cut_match = (index & 1) == 0; } @@ -194,26 +297,60 @@ public void paint(Graphics g) { g.setColor(BackgroundColor); - g.fillRect(0, 0, 300, 500); + g.fillRect(0, 0, 600, 120); g.setFont(font); g.setColor(cut_top ? Color.green : RedColor); - g.drawRect(0, Top - 1, width - 1, height + 1); - g.drawString(string_top, 8, Top - 4); + g.drawRect(2, Top - 1, width - 1, height + 1); + g.drawString(string_top, 2, Top - 4); g.setColor(cut_bottom ? Color.green : RedColor); - g.drawRect(0, Bottom - 1, width - 1, height + 1); - g.drawString(string_bottom, 8, Bottom - 4); + // g.drawRect(0, Bottom - 1, width - 1, height + 1); + // g.drawString(string_bottom, 8, Bottom - 4); + g.drawRect(Bottom, Top - 1, width - 1, height + 1); + g.drawString(string_bottom, Bottom + 2, Top - 4); if (matchingPoint) { g.setColor(cut_match ? Color.green : RedColor); - g.drawString(string_matchingpoint, 8, Bottom - 21); + g.drawString(string_matchingpoint, 2, Bottom - 21); } - g.drawImage(image_top, 0, Top, this); - g.drawImage(image_bottom, 0, Bottom, this); + g.drawImage(image_top, 2, Top, this); + // g.drawImage(image_bottom, 0, Bottom, this); + g.drawImage(image_bottom, Bottom, Top, this); + paintSlider(g); } + + /** + * + */ + public void paintSlider(Graphics g) + { + int i = 6; + + g.setColor(cut_top ? Color.green : RedColor); + g.fillRect(i, 110, 40, 6); + g.fillRect(i + 44, 110, 32, 6); + g.fillRect(i + 80, 110, 24, 6); + g.fillRect(i + 108, 110, 16, 6); + g.fillRect(i + 128, 110, 10, 6); + g.fillRect(i + 142, 110, 6, 6); + g.fillRect(i + 152, 110, 4, 6); + + g.setColor(cut_bottom ? Color.green : RedColor); + g.fillRect(Bottom, 110, 4, 6); + g.fillRect(Bottom + 8, 110, 6, 6); + g.fillRect(Bottom + 18, 110, 10, 6); + g.fillRect(Bottom + 32, 110, 16, 6); + g.fillRect(Bottom + 52, 110, 24, 6); + g.fillRect(Bottom + 80, 110, 32, 6); + g.fillRect(Bottom + 116, 110, 40, 6); + + g.setColor(Color.yellow); + g.drawRect(sliderPosition - 7, 108, 14, 10); + } + } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/FileProperties.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/FileProperties.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/FileProperties.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/FileProperties.java 2008-12-19 20:42:44.000000000 +0000 @@ -0,0 +1,782 @@ +/* + * @(#)FileProperties.java + * + * Copyright (c) 2006-2008 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.gui; + +import java.awt.Image; +import java.awt.image.MemoryImageSource; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.KeyEvent; +import java.awt.Color; +import java.awt.Graphics; +import javax.swing.event.*; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.JTextArea; +import javax.swing.UIManager; +import javax.swing.SwingConstants; +import javax.swing.JMenuBar; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.KeyStroke; +import javax.swing.JSlider; +import javax.swing.JScrollPane; +import javax.swing.JViewport; + +import java.io.IOException; +import java.util.Arrays; + +import net.sourceforge.dvb.projectx.gui.UISwitchListener; +import net.sourceforge.dvb.projectx.gui.CommonGui; +import net.sourceforge.dvb.projectx.gui.ColumnLayout; +import net.sourceforge.dvb.projectx.gui.ComboBoxIndexListener; +import net.sourceforge.dvb.projectx.gui.ComboBoxItemListener; +import net.sourceforge.dvb.projectx.gui.CheckBoxListener; +import net.sourceforge.dvb.projectx.gui.TextFieldListener; +import net.sourceforge.dvb.projectx.gui.TextFieldKeyListener; + +import net.sourceforge.dvb.projectx.common.Keys; +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Resource; +import net.sourceforge.dvb.projectx.common.JobCollection; + +import net.sourceforge.dvb.projectx.xinput.XInputFile; + +import net.sourceforge.dvb.projectx.video.Preview; + +import net.sourceforge.dvb.projectx.parser.HpFix; +import net.sourceforge.dvb.projectx.parser.StripAudio; +import net.sourceforge.dvb.projectx.parser.StripRelook; +import net.sourceforge.dvb.projectx.parser.StripMedion; +import net.sourceforge.dvb.projectx.parser.CommonParsing; + +/** + * + */ +public class FileProperties extends JFrame { + + private String title = Resource.getString("General.FileProperties"); + + private ComboBoxIndexListener _ComboBoxIndexListener = new ComboBoxIndexListener(); + private ComboBoxItemListener _ComboBoxItemListener = new ComboBoxItemListener(); + private CheckBoxListener _CheckBoxListener = new CheckBoxListener(); + private TextFieldListener _TextFieldListener = new TextFieldListener(); + private TextFieldKeyListener _TextFieldKeyListener = new TextFieldKeyListener(); + + private XInputFile inputfile = null; + + private JTextArea area = null; + private JLabel length = null; + private JSlider slider = null; + private View view; + + private Color bg_color = new Color(0, 150, 0); + + private int loadSizeForward = 1024000; + private int collection_number = 0; + private int collection_index = 0; + private int tmp_value = 0; + + private boolean silent = false; + + private Preview Preview = new Preview(loadSizeForward); + + /** + * Constructor + */ + public FileProperties() + { + addWindowListener(new WindowAdapter() + { + public void windowClosing(WindowEvent e) + { + close(); + } + }); + + JPanel container = new JPanel(); + container.setLayout(new BorderLayout()); + + buildMenu(); + + container.add(buildMainPanel()); + getContentPane().add(container); + + setTitle(title); + setBounds(200, 100, 660, 360); + setResizable(false); + + UIManager.addPropertyChangeListener(new UISwitchListener(getRootPane())); + } + + /** + * + */ + protected void buildMenu() + { + JMenuBar menuBar = new JMenuBar(); + + menuBar.add(buildFileMenu()); + menuBar.add(buildEditMenu()); + menuBar.add(buildPreprocessMenu()); + menuBar.add(buildStreamMenu()); + + setJMenuBar(menuBar); + } + + /** + * + */ + protected JMenu buildFileMenu() + { + JMenu menu = new JMenu(); + CommonGui.localize(menu, "Common.File"); + + menu.addSeparator(); + + JMenuItem close = new JMenuItem(); + CommonGui.localize(close, "Common.Close"); + close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); + close.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + close(); + } + }); + + JMenuItem item_2 = new JMenuItem(Resource.getString("popup.rename")); + item_2.setActionCommand("rename"); + + JMenuItem item_3 = new JMenuItem(Resource.getString("popup.openhex")); + item_3.setActionCommand("viewAsHex"); + + menu.add(item_2); + menu.addSeparator(); + menu.add(item_3); + menu.addSeparator(); + menu.add(close); + + item_2.addActionListener(_MenuListener); + item_3.addActionListener(_MenuListener); + + return menu; + } + + /** + * + */ + protected JMenu buildEditMenu() + { + JMenu menu = new JMenu(); + CommonGui.localize(menu, "Common.Edit"); + + JMenuItem item_1 = new JMenuItem(Resource.getString("popup.changeTimestamp")); + item_1.setActionCommand("changeTimestamp"); + + JMenuItem item_2 = new JMenuItem(Resource.getString("popup.patchbasics")); + item_2.setActionCommand("editBasics"); + + menu.add(item_1); + menu.addSeparator(); + menu.add(item_2); + + item_1.addActionListener(_MenuListener); + item_2.addActionListener(_MenuListener); + + return menu; + } + + /** + * + */ + protected JMenu buildPreprocessMenu() + { + JMenu menu = new JMenu(); + CommonGui.localize(menu, "Common.Preprocess"); + + JMenuItem item_1 = new JMenuItem(Resource.getString("popup.fixHpAc3")); + item_1.setActionCommand("fixHpAc3"); + + JMenuItem item_2 = new JMenuItem(Resource.getString("popup.stripAudio")); + item_2.setActionCommand("stripAudio"); + + JMenuItem item_3 = new JMenuItem("strip Relookョ type 0 to separate pes.."); + item_3.setActionCommand("stripRelook"); + + JMenuItem item_4 = new JMenuItem("strip Relookョ type 1 to separate pes.."); + item_4.setActionCommand("stripRelook1"); + + JMenuItem item_5 = new JMenuItem("strip Medionョ to separate pes.."); + item_5.setActionCommand("stripMedion"); + + + menu.add(item_1); + menu.addSeparator(); + menu.add(item_2); + menu.addSeparator(); + menu.add(item_3); + menu.add(item_4); + menu.addSeparator(); + menu.add(item_5); + + item_1.addActionListener(_MenuListener); + item_2.addActionListener(_MenuListener); + item_3.addActionListener(_MenuListener); + item_4.addActionListener(_MenuListener); + item_5.addActionListener(_MenuListener); + + return menu; + } + + /** + * + */ + protected JMenu buildStreamMenu() + { + JMenu menu = new JMenu(Resource.getString("popup.assignStreamType")); + + Object[] objects = Keys.ITEMS_FileTypes; + + for (int i = 0; i <= objects.length; i++) + { + JMenuItem item = new JMenuItem(i == objects.length ? Resource.getString("popup.automatic") : objects[i].toString()); + item.setActionCommand("assignStreamtype"); + item.addActionListener(_MenuListener); + + if (i == objects.length) + menu.addSeparator(); + + menu.add(item); + } + + return menu; + } + + + /** + * + */ + protected JPanel buildMainPanel() + { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + + JPanel panel_1 = new JPanel(); + panel_1.setLayout( new ColumnLayout() ); + panel_1.setBorder( BorderFactory.createTitledBorder("Preview") ); + + panel_1.add(view = new View()); + + panel_1.add(Box.createRigidArea(new Dimension(1, 5))); + + slider = new JSlider(); + slider.setPreferredSize(new Dimension(160, 30)); + slider.setMaximumSize(new Dimension(160, 30)); + slider.setMinimumSize(new Dimension(160, 30)); + slider.setMaximum(100); + slider.setValue(0); + + slider.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) + { + if (!silent) + scanFile(32L * slider.getValue()); + } + }); + + panel_1.add(slider); + + panel_1.add(Box.createRigidArea(new Dimension(1, 5))); + + length = new JLabel("ScanPos: "); + + panel_1.add(length); + + //file info + JPanel panel_2 = new JPanel(); + panel_2.setLayout( new ColumnLayout() ); + panel_2.setBorder( BorderFactory.createTitledBorder("File Info") ); + + area = new JTextArea(); + area.setEditable(true); + + JScrollPane scroll = new JScrollPane(); + scroll.setPreferredSize(new Dimension(460, 280)); + scroll.setMaximumSize(new Dimension(460, 280)); + scroll.setMinimumSize(new Dimension(460, 280)); + scroll.setViewportView(area); + JViewport viewport = scroll.getViewport(); + + panel_2.add(scroll); + + panel.add(panel_1); + panel.add(panel_2); + + return panel; + } + + /** + * + */ + public void close() + { + inputfile = null; + + Common.getGuiInterface().showActiveCollection(collection_number); + + dispose(); + } + + /** + * + */ + public void open(XInputFile xInputFile, int value_1, int value_2) + { + collection_number = value_1; + collection_index = value_2; + + inputfile = xInputFile; + + silent = true; + slider.setMaximum((int)(inputfile.length() / 32L)); + silent = false; + + tmp_value = (int)(inputfile.getStreamInfo().getScanPosition() / 32L); + + if (tmp_value != slider.getValue()) + slider.setValue(tmp_value); + + else + scanFile(); + + show(); + } + + /** + * + */ + private void setPanelTitle() + { + setTitle(title + ": ID " + inputfile.getFileID() + " - '" + inputfile.getName() + "'"); + } + + /** + * + */ + private void scanFile() + { + setPanelTitle(); + scanFile(inputfile.getStreamInfo().getScanPosition()); + } + + /** + * + */ + private void scanFile(long value) + { + setPosInfo(value); + + Common.getScanClass().getStreamInfo(inputfile, value); + + setFileInfo(); + + previewFile(value); + } + + /** + * + */ + private void scanSpecFileType(int type) + { + long value = inputfile.getStreamInfo().getScanPosition(); + + setPosInfo(value); + + Common.getScanClass().getStreamInfo(inputfile, value, type); + + setFileInfo(); + + previewFile(value); + } + + /** + * + */ + private void setPosInfo(long value) + { + inputfile.getStreamInfo().setScanPosition(value); + + length.setText("ScanPos: " + Common.formatNumber(value)); + } + + /** + * + */ + private void setFileInfo() + { + area.setText(inputfile.getStreamInfo().getFullInfo()); + } + + /** + * + */ + private void previewFile(long value) + { + switch (inputfile.getStreamInfo().getStreamType()) + { + case CommonParsing.PES_AV_TYPE: + case CommonParsing.MPEG1PS_TYPE: + case CommonParsing.MPEG2PS_TYPE: + case CommonParsing.PVA_TYPE: + case CommonParsing.TS_TYPE: + case CommonParsing.ES_MPV_TYPE: + long position = Preview.previewFile(inputfile, value, loadSizeForward, Common.getSettings().getBooleanProperty(Keys.KEY_Preview_AllGops), Common.getSettings().getBooleanProperty(Keys.KEY_Preview_fastDecode), Common.getSettings().getIntProperty(Keys.KEY_Preview_YGain)); + view.setImage(Common.getMpvDecoderClass().getScaledCutImage()); + break; + + case CommonParsing.PES_MPA_TYPE: + case CommonParsing.PES_PS1_TYPE: + view.setImage("PES Audio"); + break; + + case CommonParsing.ES_MPA_TYPE: + case CommonParsing.ES_AC3_TYPE: + case CommonParsing.ES_AC3_A_TYPE: + case CommonParsing.ES_DTS_TYPE: + case CommonParsing.ES_DTS_A_TYPE: + case CommonParsing.ES_RIFF_TYPE: + case CommonParsing.ES_cRIFF_TYPE: + view.setImage("RAW Audio"); + break; + + case CommonParsing.ES_SUP_TYPE: + view.setImage("RAW Subpicture"); + break; + + case CommonParsing.Unsupported: + default: + view.setImage("Unknown"); + break; + } + + } + + /** + * + */ + private ActionListener _MenuListener = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + + /** + * + */ + if (actName.equals("rename")) + { + try { + if (inputfile.rename()) + { + scanFile(); + + Common.getGuiInterface().showActiveCollection(collection_number); + } + + //if (((XInputFile) collection.getInputFile(index)).rename()) + // reloadInputDirectories(); + + toFront(); + + } catch (IOException ioe) {} + + //updateCollectionTable(collection.getCollectionAsTable()); + //updateCollectionPanel(collection_number); + } + + /** + * + */ + else if (actName.equals("changeTimestamp")) + { + if (CommonGui.getUserConfirmation("really update the timestamp of '" + inputfile.getName() + "' ?")) + { + inputfile.setLastModified(); + + scanFile(); + + Common.getGuiInterface().showActiveCollection(collection_number); + } + //updateCollectionTable(collection.getCollectionAsTable()); + //updateCollectionPanel(collection_number); + + toFront(); + } + + /** + * + */ + else if (actName.equals("viewAsHex")) + { + if (inputfile.exists()) + new HexViewer().view(inputfile.getNewInstance()); + } + + /** + * + */ + else if (actName.equals("editBasics")) + { + if (CommonGui.getPatchDialog().entry(inputfile)) + { + scanFile(); + + Common.getGuiInterface().showActiveCollection(collection_number); + // getScanInfo(xInputFile, xInputFile.getStreamInfo().getStreamType()); + } + + toFront(); + } + + /** + * + */ + else if (actName.equals("assignStreamtype")) + { + Object[] items = Keys.ITEMS_FileTypes; + String str = ((JMenuItem) e.getSource()).getText(); + + for (int i = 0; i < items.length; i++) + { + if (str.equals(items[i].toString())) + { + inputfile.getStreamInfo().setStreamType(i); + + scanSpecFileType(i); + + Common.getGuiInterface().showActiveCollection(collection_number); + + return; + } + } + + scanFile(); + + Common.getGuiInterface().showActiveCollection(collection_number); + } + + /** + * + */ + else if (actName.equals("stripRelook")) + { + stripRelook(0); + } + + /** + * + */ + else if (actName.equals("stripRelook1")) + { + stripRelook(1); + } + + /** + * + */ + else if (actName.equals("stripMedion")) + { + stripMedion(); + } + + /** + * + */ + else if (actName.equals("stripAudio")) + { + if (inputfile.exists() && inputfile.getStreamInfo().getStreamType() == CommonParsing.ES_RIFF_TYPE && CommonGui.getUserConfirmation("really process '" + inputfile.getName() + "' ?")) + { + StripAudio stripAudio = new StripAudio(); + + Common.setOSDMessage("strip audio data..."); + + XInputFile xInputFile = stripAudio.process(inputfile); + + JobCollection collection = Common.getCollection(collection_number); + + if (xInputFile != null) + { + collection.removeInputFile(collection_index); + collection.addInputFile(collection_index, xInputFile); + + Common.getGuiInterface().showActiveCollection(collection_number); + } + } + + toFront(); + } + } + + /** + * + */ + private void stripRelook(int type) + { + if (inputfile.exists() && inputfile.getStreamInfo().getStreamType() == CommonParsing.PES_AV_TYPE && CommonGui.getUserConfirmation("really process '" + inputfile.getName() + "' ?")) + { + StripRelook stripRelook = new StripRelook(type); + + Common.setOSDMessage("strip Relookョ data, type " + type + "..."); + + JobCollection collection = Common.getCollection(collection_number); + + XInputFile[] xif = stripRelook.process(inputfile.getNewInstance(), collection.getOutputDirectory()); + + if (xif != null) + { + collection.removeInputFile(collection_index); + + for (int i = 0, j = collection_index; i < xif.length; i++) + { + if (xif[i] != null) + collection.addInputFile(j++, xif[i]); + } + + Common.getGuiInterface().showActiveCollection(collection_number); + } + } + + toFront(); + } + + /** + * + */ + private void stripMedion() + { + if (inputfile.exists() && inputfile.getStreamInfo().getStreamType() == CommonParsing.PES_AV_TYPE && CommonGui.getUserConfirmation("really process '" + inputfile.getName() + "' ?")) + { + StripMedion stripMedion = new StripMedion(); + + Common.setOSDMessage("strip Medionョ data..."); + + JobCollection collection = Common.getCollection(collection_number); + + XInputFile[] xif = stripMedion.process(inputfile.getNewInstance(), collection.getOutputDirectory()); + + if (xif != null) + { + collection.removeInputFile(collection_index); + + for (int i = 0, j = collection_index; i < xif.length; i++) + { + if (xif[i] != null) + collection.addInputFile(j++, xif[i]); + } + + Common.getGuiInterface().showActiveCollection(collection_number); + } + } + + toFront(); + } + }; + + /** + * + */ + private class View extends JPanel { + + private int width = 160; + private int height = 90; + private Image image; + private MemoryImageSource source; + private int[] image_data; + private String alternative = ""; + + public View() + { + image_data = new int[width * height]; + source = new MemoryImageSource(width, height, image_data, 0, width); + source.setAnimated(true); + image = createImage(source); + + setPreferredSize(new Dimension(160, 90)); + setMaximumSize(new Dimension(160, 90)); + setMinimumSize(new Dimension(160, 90)); + + setBackground(Color.black); + + } + + public void setImage(int[] new_image_data) + { + alternative = ""; + System.arraycopy(new_image_data, 0, image_data, 0, new_image_data.length); + + inputfile.getStreamInfo().setThumbnail(image_data); + + source.newPixels(); + repaint(); + } + + public void setImage(String str) + { + alternative = str; + Arrays.fill(image_data, 0); + + source.newPixels(); + repaint(); + } + + public void paint(Graphics g) + { + g.setColor(bg_color); + g.fillRect(0, 0, 160, 90); + + g.drawImage(image, 0, 0, this); + + g.setColor(Color.white); + g.drawString(alternative, 10, 30); + } + + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/FilterPanel.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/FilterPanel.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/FilterPanel.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/FilterPanel.java 2008-09-07 09:49:34.000000000 +0000 @@ -0,0 +1,733 @@ +/* + * @(#)Filter.java + * + * Copyright (c) 2007 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.gui; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.KeyEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseAdapter; +import java.awt.Color; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.UIManager; +import javax.swing.SwingConstants; +import javax.swing.JMenuBar; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.KeyStroke; +import javax.swing.JList; +import javax.swing.JScrollPane; + +import net.sourceforge.dvb.projectx.gui.UISwitchListener; +import net.sourceforge.dvb.projectx.gui.CommonGui; +import net.sourceforge.dvb.projectx.gui.ColumnLayout; + + +import net.sourceforge.dvb.projectx.common.Keys; +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Resource; +import net.sourceforge.dvb.projectx.common.JobCollection; + +/** + * + */ +public class FilterPanel extends JPanel { + + private CPComboBoxIndexListener _ComboBoxIndexListener = new CPComboBoxIndexListener(); + private CPComboBoxItemListener _ComboBoxItemListener = new CPComboBoxItemListener(); + private CPCheckBoxListener _CheckBoxListener = new CPCheckBoxListener(); + private CPTextFieldListener _TextFieldListener = new CPTextFieldListener(); + private CPTextFieldKeyListener _TextFieldKeyListener = new CPTextFieldKeyListener(); + + private JobCollection collection; + + private JPanel container; + private JPanel tabPanel; + private JList includeList; + + private boolean actionDenied = false; + private boolean hasChanged = false; + + private String[][] objects = { + Keys.KEY_WriteOptions_writeVideo, + Keys.KEY_WriteOptions_writeAudio, + Keys.KEY_OptionHorizontalResolution, + Keys.KEY_OptionDAR, + Keys.KEY_Streamtype_MpgVideo, + Keys.KEY_Streamtype_MpgAudio, + Keys.KEY_Streamtype_Ac3Audio, + Keys.KEY_Streamtype_PcmAudio, + Keys.KEY_Streamtype_Teletext, + Keys.KEY_Streamtype_Subpicture, + Keys.KEY_Streamtype_Vbi, + Keys.KEY_useAutoPidFilter + }; + + private JComboBox combobox_34; + private JComboBox combobox_24; + + private JCheckBox[] box; + + + class Clock implements Runnable { + private Thread clockThread = null; + + private int last_collection = 0; + + public void start() + { + if (clockThread == null) + { + clockThread = new Thread(this, "Clock_6"); + clockThread.setPriority(Thread.MIN_PRIORITY); + clockThread.start(); + } + } + + public void run() + { + Thread myThread = Thread.currentThread(); + + while (clockThread == myThread) + { + update(); + + try { + + Thread.sleep(1000); + } catch (InterruptedException e) {} + } + } + + private void update() + { + if (Common.getCollection() == null) + return; + + if (Common.getCollection().hashCode() == last_collection) + if (hasChanged && collection.hasSettings()) + return; + else + hasChanged = false; + + last_collection = Common.getCollection().hashCode(); + + updatePidList(); + updateProperties(); + } + + private void updatePidList() + { + setPIDs(); + } + + private void updateProperties() + { + setCollectionProperties(); + } + + public void stop() + { + clockThread = null; + } + } + + + /** + * Constructor + */ + public FilterPanel() + { + box = new JCheckBox[objects.length]; + + for (int i = 0; i < objects.length; i++) + { + box[i] = new JCheckBox(Resource.getString(objects[i][0])); + box[i].setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); + box[i].setActionCommand(objects[i][0]); + box[i].addActionListener(_CheckBoxListener); + } + + combobox_34 = new JComboBox(Keys.ITEMS_ExportHorizontalResolution); + combobox_24 = new JComboBox(Keys.ITEMS_ExportDAR); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + + panel.add(buildPidPanel()); + panel.add(buildLimitPanel()); + panel.add(buildWritePanel()); + panel.add(buildStreamtypePanel()); + + new Clock().start(); + + add(panel); + + setVisible(true); + } + + /** + * + */ + private boolean getBooleanProperty(String[] str) + { + boolean b = false; + + if (collection == null) + return b; + + b = collection.getSettings().getBooleanProperty(str); + + return b; + } + + /** + * + */ + private int getIntProperty(String[] str) + { + int value = 0; + + if (collection == null) + return value; + + value = collection.getSettings().getIntProperty(str); + + return value; + } + + /** + * + */ + private String getProperty(String[] str) + { + String obj = ""; + + if (collection == null) + return obj; + + obj = collection.getSettings().getProperty(str); + + return obj; + } + + /** + * + */ + private void setBooleanProperty(String str, boolean b) + { + if (!performAction()) + return; + + collection.getSettings().setBooleanProperty(str, b); + } + + /** + * + */ + private void setProperty(String str1, String str2) + { + if (!performAction()) + return; + + collection.getSettings().setProperty(str1, str2); + } + + /** + * + */ + private void setProperty(String str, Object obj) + { + if (!performAction()) + return; + + collection.getSettings().setProperty(str, obj); + } + + /** + * + */ + private boolean performAction() + { + boolean b = true; + + if (actionDenied) + return !b; + + getCollectionAndSettings(); + + if (collection == null) + return !b; + + hasChanged = b; + + return b; + } + + /** + * + */ + private Object[] getPIDs() + { + getCollection(); + + if (collection == null) + return (new Object[0]); + + return collection.getPIDs(); + } + + /** + * + */ + private void setPIDs() + { + if (includeList != null) + includeList.setListData(getPIDs()); + } + + /** + * + */ + private void setCollectionProperties() + { + actionDenied = true; + + getCollection(); + + for (int i = 0; i < box.length; i++) + box[i].setSelected(getBooleanProperty(objects[i])); + + combobox_34.setSelectedItem(getProperty(Keys.KEY_ExportHorizontalResolution)); + combobox_24.setSelectedIndex(getIntProperty(Keys.KEY_ExportDAR)); + + actionDenied = false; + } + + /** + * + */ + private void getCollection() + { + collection = Common.getCollection(); + } + + /** + * + */ + private void getCollectionAndSettings() + { + getCollection(); + + if (collection != null && !collection.hasSettings()) + collection.setSettings(Common.getSettings()); + } + + /** + * + */ + protected JPanel buildPidPanel() + { + includeList = new JList(); + includeList.setToolTipText(Resource.getString("CollectionPanel.PidList.Tip2")); + includeList.setBackground(new Color(190, 225, 255)); + setPIDs(); + + final JTextField includeField = new JTextField(""); + includeField.setPreferredSize(new Dimension(80, 25)); + includeField.setMaximumSize(new Dimension(80, 25)); + includeField.setEditable(true); + includeField.setActionCommand("ID"); + includeField.setToolTipText(Resource.getString("CollectionPanel.PidList.Tip1")); + + includeField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + getCollection(); + + if (collection == null) + return; + + if (collection.isActive()) + return; + + String actName = e.getActionCommand(); + + try { + + String value = includeField.getText(); + + if (!value.equals("")) + { + if (!value.startsWith("0x")) + value = "0x" + Integer.toHexString(0x1FFF & Integer.parseInt(value)); + + value = value.toUpperCase().replace('X', 'x'); + + collection.addPID(value); + includeList.setListData(collection.getPIDs()); + includeList.ensureIndexIsVisible(collection.getPIDs().length - 1); + } + + } catch (NumberFormatException ne) { + + Common.setOSDErrorMessage(Resource.getString("cutlistener.wrongnumber")); + } + + includeField.setText(""); + + return; + } + }); + + + JScrollPane scrollList = new JScrollPane(); + scrollList.setPreferredSize(new Dimension(80, 96)); + scrollList.setMaximumSize(new Dimension(80, 96)); + scrollList.setViewportView(includeList); + + includeList.addMouseListener( new MouseAdapter() { + public void mouseClicked(MouseEvent e) + { + getCollection(); + + if (collection == null) + return; + + if (e.getClickCount() >= 2) + { + Object[] val = includeList.getSelectedValues(); + + collection.removePID(val); + setPIDs(); + } + } + }); + + + // JButton pids = new JButton(Resource.getString("CollectionPanel.transferPids1")); + JButton pids = new JButton(CommonGui.loadIcon("trans.gif")); + pids.setPreferredSize(new Dimension(80, 22)); + pids.setMaximumSize(new Dimension(80, 22)); + pids.setActionCommand("transferPIDs"); + pids.setToolTipText(Resource.getString("CollectionPanel.transferPids1.Tip")); + pids.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + getCollection(); + + if (collection == null) + return; + + if (collection.isActive()) + return; + + String actName = e.getActionCommand(); + + try { + + Object[] values = includeList.getSelectedValues(); + + if (values.length > 0) + { + JobCollection new_collection = Common.addCollection(collection.getNewInstance()); + + collection.removePID(values); + + new_collection.clearPIDs(); + new_collection.addPID(values); + + new_collection.determinePrimaryFileSegments(); + + setPIDs(); + } + + } catch (Exception e2) { + + Common.setExceptionMessage(e2); + } + + return; + } + }); + + /** + * + */ + JPanel CL4 = new JPanel(); + CL4.setLayout(new ColumnLayout()); + + CL4.add(includeField); + CL4.add(Box.createRigidArea(new Dimension(1, 40))); + CL4.add(pids); + + JPanel CL5 = new JPanel(); + CL5.setLayout(new BoxLayout(CL5, BoxLayout.X_AXIS)); + CL5.setBorder(BorderFactory.createTitledBorder(Resource.getString("CollectionPanel.PidList"))); +// CL5.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), Resource.getString("CollectionPanel.PidList"))); + CL5.add(CL4); + CL5.add(Box.createRigidArea(new Dimension(10, 1))); + CL5.add(scrollList); + + JPanel panel = new JPanel(); + panel.setLayout( new GridLayout(1, 1) ); + panel.add(CL5); + + return panel; + } + + /** + * + */ + protected JPanel buildLimitPanel() + { + JPanel panel_1 = new JPanel(); + panel_1.setLayout(new ColumnLayout()); + panel_1.setBorder( BorderFactory.createTitledBorder("Filter Options")); + + panel_1.add(box[11]); + + /** + * + */ + JPanel CL2 = new JPanel(); + CL2.setLayout(new BoxLayout(CL2, BoxLayout.X_AXIS)); + + box[2].setPreferredSize(new Dimension(110, 20)); + box[2].setMaximumSize(new Dimension(110, 20)); + CL2.add(box[2]); + + + combobox_34 = new JComboBox(Keys.ITEMS_ExportHorizontalResolution); + combobox_34.setMaximumRowCount(7); + combobox_34.setPreferredSize(new Dimension(90, 20)); + combobox_34.setMaximumSize(new Dimension(90, 20)); + combobox_34.setActionCommand(Keys.KEY_ExportHorizontalResolution[0]); + combobox_34.setEditable(true); + combobox_34.addActionListener(_ComboBoxItemListener); + CL2.add(combobox_34); + + panel_1.add(CL2); + + /** + * + */ + JPanel CL3 = new JPanel(); + CL3.setLayout(new BoxLayout(CL3, BoxLayout.X_AXIS)); + + box[3].setPreferredSize(new Dimension(80, 20)); + box[3].setMaximumSize(new Dimension(80, 20)); + CL3.add(box[3]); + + combobox_24 = new JComboBox(Keys.ITEMS_ExportDAR); + combobox_24.setMaximumRowCount(7); + combobox_24.setPreferredSize(new Dimension(120, 20)); + combobox_24.setMaximumSize(new Dimension(120, 20)); + combobox_24.setActionCommand(Keys.KEY_ExportDAR[0]); + combobox_24.addActionListener(_ComboBoxIndexListener); + CL3.add(combobox_24); + + panel_1.add(CL3); + + panel_1.add(Box.createRigidArea(new Dimension(1, 10))); + + JButton revert = new JButton(Resource.getString("FilterPanel.ResetAll")); + revert.setPreferredSize(new Dimension(180, 24)); + revert.setMaximumSize(new Dimension(180, 24)); + revert.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + if (collection != null) + collection.setSettings(null); + } + }); + + panel_1.add(revert); + + + JPanel panel = new JPanel(); + panel.setLayout( new GridLayout(1, 1) ); + panel.add(panel_1); + + return panel; + } + + /** + * + */ + protected JPanel buildWritePanel() + { + JPanel panel_1 = new JPanel(); + panel_1.setLayout(new ColumnLayout()); + panel_1.setBorder( BorderFactory.createTitledBorder(Resource.getString("ExportPanel.WriteOptions")) ); + panel_1.setToolTipText(Resource.getString("ExportPanel.WriteOptions.Tip")); + + panel_1.add(box[0]); + panel_1.add(box[1]); + + panel_1.add(Box.createRigidArea(new Dimension(1, 25))); + + JButton more = new JButton(Resource.getString("FilterPanel.MoreSettings")); + more.setPreferredSize(new Dimension(180, 24)); + more.setMaximumSize(new Dimension(180, 24)); + more.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + if (collection != null) + CommonGui.getCollectionProperties().open(Common.getCollection(), Common.getActiveCollection()); + } + }); + + panel_1.add(more); + + + JPanel panel = new JPanel(); + panel.setLayout( new GridLayout(1, 1) ); + panel.add(panel_1); + + return panel; + } + + /** + * + */ + protected JPanel buildStreamtypePanel() + { + JPanel idPanel = new JPanel(); + idPanel.setBorder(BorderFactory.createTitledBorder(Resource.getString("ExportPanel.StreamtypePanel"))); + idPanel.setLayout(new BoxLayout(idPanel, BoxLayout.X_AXIS)); + idPanel.setToolTipText(Resource.getString("ExportPanel.StreamtypePanel.Tip")); + + JPanel panel_1 = new JPanel(); + panel_1.setLayout(new ColumnLayout()); + + for (int i = 4; i < 8; i++) + panel_1.add(box[i]); + + JPanel panel_2 = new JPanel(); + panel_2.setLayout(new ColumnLayout()); + + for (int i = 8; i < 11; i++) + panel_2.add(box[i]); + + idPanel.add(panel_1); + idPanel.add(panel_2); + + + JPanel panel = new JPanel(); + panel.setLayout( new GridLayout(1, 1) ); + panel.add(idPanel); + + return panel; + } + + /** + * + */ + class CPCheckBoxListener implements ActionListener { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + + JCheckBox box = (JCheckBox) e.getSource(); + setBooleanProperty(actName, box.isSelected()); + } + } + + /** + * + */ + class CPComboBoxIndexListener implements ActionListener { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + JComboBox box = (JComboBox) e.getSource(); + + setProperty(actName, String.valueOf(box.getSelectedIndex())); + } + } + + /** + * + */ + class CPComboBoxItemListener implements ActionListener { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + + // refuse additional actioncommand "comboBoxEdit" from jre > 1.4 ? + if (actName.indexOf('.') < 0) + return; + + JComboBox box = (JComboBox) e.getSource(); + + setProperty(actName, box.getSelectedItem()); + } + } + + /** + * + */ + class CPTextFieldKeyListener extends KeyAdapter { + public void keyReleased(KeyEvent e) + { + JTextField textfield = (JTextField) e.getSource(); + + textfield.postActionEvent(); + } + } + + /** + * + */ + class CPTextFieldListener implements ActionListener { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + JTextField textfield = (JTextField) e.getSource(); + + setProperty(actName, textfield.getText()); + } + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/GOPEditor.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/GOPEditor.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/GOPEditor.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/GOPEditor.java 2008-09-28 09:57:24.000000000 +0000 @@ -0,0 +1,1229 @@ +/* + * @(#)GOPEditor + * + * Copyright (c) 2008 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + +package net.sourceforge.dvb.projectx.gui; + +import java.io.*; +import java.util.*; +import javax.swing.*; +import javax.swing.event.*; +import java.awt.*; +import java.awt.event.*; +import javax.swing.table.TableModel; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableCellRenderer; + +import net.sourceforge.dvb.projectx.common.Common; + +public class GOPEditor extends JDialog { + + private StreamObject streamobject; + private ArrayList sourcedata = new ArrayList(); + private ArrayList sinkdata = new ArrayList(); + private JList sourcelist = new JList(); + private JList sinklist = new JList(); + private JTable tableView; + private JTextField textField; + + private Thread thread; + + private byte[] data = null; + private long[][] pts_indices = null; + + private int s1 = 12, s2 = 9; + + private boolean stopCount = false; + private int cnt = 0; + + private final int FRAME = 0; + private final int SEQUENCE = 0xB3; + private final int SEQUENCE_END = 0xB7; + private final int GOP = 0xB8; + private final int USER_DATA = 0xB2; + private final int EXTENSION = 0xB5; + + private double lastFrameRate = -1; + + private Object[][] ObjectTable = new Object[s1][s2]; + + + /** + * + */ + public GOPEditor(JFrame frame) + { + super(frame, "GOP Editor", true); + + addWindowListener(new WindowAdapter() + { + public void windowClosing(WindowEvent e) + { + close(); + } + }); + + JPanel container = new JPanel(); + container.setLayout(new GridLayout(1,2)); + + setBounds(200, 100, 770, 500); + + container.add(buildPanel1()); + + getContentPane().add(container); + } + + /** + * + */ + protected JPanel buildPanel1() + { + JPanel panel1 = new JPanel(); + panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS)); + + JButton undoButton = new JButton("Reset All"); + undoButton.setMnemonic('o'); + undoButton.addActionListener( new ActionListener() { + public void actionPerformed(ActionEvent e) + { + reload(); + } + }); + + JButton moveButton = new JButton("copy chunk"); + moveButton.setMnemonic('c'); + moveButton.addActionListener( new ActionListener() { + public void actionPerformed(ActionEvent e) + { + copy(); + } + }); + + JButton removeButton = new JButton("remove chunk(s)"); + removeButton.setMnemonic('r'); + removeButton.addActionListener( new ActionListener() { + public void actionPerformed(ActionEvent e) + { + remove(); + } + }); + + JButton checkButton = new JButton("check changes"); + checkButton.setMnemonic('e'); + checkButton.addActionListener( new ActionListener() { + public void actionPerformed(ActionEvent e) + { + check(); + } + }); + + JButton saveButton = new JButton("save & close"); + saveButton.setMnemonic('a'); + saveButton.addActionListener( new ActionListener() { + public void actionPerformed(ActionEvent e) + { + save(); + } + }); + + JButton closeButton = new JButton("close unchanged"); + closeButton.setMnemonic('u'); + closeButton.addActionListener( new ActionListener() { + public void actionPerformed(ActionEvent e) + { + close(); + } + }); + + panel1.add(undoButton); + panel1.add(Box.createRigidArea(new Dimension(10, 1))); + panel1.add(moveButton); + panel1.add(Box.createRigidArea(new Dimension(10, 1))); + panel1.add(removeButton); + panel1.add(Box.createRigidArea(new Dimension(10, 1))); + panel1.add(checkButton); + panel1.add(Box.createRigidArea(new Dimension(10, 1))); + panel1.add(saveButton); + panel1.add(Box.createRigidArea(new Dimension(10, 1))); + panel1.add(closeButton); + + JScrollPane scroll = new JScrollPane(); + scroll.setViewportView(sourcelist); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + + panel.add(createTable(), BorderLayout.CENTER); + panel.add(textField = new JTextField()); + panel.add(panel1); + + return panel; + } + + /** + * + */ + protected JScrollPane createTable() + { + JScrollPane scrollpane; + + // final + final String[] names = { + "Chunk", "Start", "End", "t.Ref", "Delta(ms)", "ind.PTS", "Timecode", "Type", "ErrID" + }; + + DefaultTableCellRenderer renderer_1 = new DefaultTableCellRenderer(); + DefaultTableCellRenderer renderer_2 = new DefaultTableCellRenderer(); + + renderer_1.setHorizontalAlignment(JLabel.RIGHT); + renderer_2.setHorizontalAlignment(JLabel.CENTER); + + // Show colors by rendering them in their own color. + DefaultTableCellRenderer colorRenderer1 = new DefaultTableCellRenderer() { + Color redColor = new Color(255, 180, 180); + String str; + + public void setValue(Object value) + { + setBackground(Color.white); + + setText(""); + + if (value == null) + return; + + str = value.toString(); + + if (!str.equals("0")) //errID + { + setText(Integer.toHexString(Integer.parseInt(str))); + setBackground(redColor); + } + } + }; + + colorRenderer1.setHorizontalAlignment(JLabel.CENTER); + + // Show colors by rendering them in their own color. + DefaultTableCellRenderer colorRenderer2 = new DefaultTableCellRenderer() { + Color cyanColor = new Color(220, 255, 255); + Color greenColor = new Color(220, 255, 220); + Color blueColor = new Color(220, 220, 255); + Color yellowColor = new Color(255, 255, 220); + Color magentaColor = new Color(255, 220, 255); + Color redColor = new Color(255, 180, 180); + String str; + + public void setValue(Object value) + { + setBackground(Color.white); + + if (value == null) + { + setText(""); + return; + } + + str = value.toString(); + setText(str); + + if (str.indexOf("Frame I") >= 0) + setBackground(greenColor); + + else if (str.indexOf("Frame P") >= 0) + setBackground(blueColor); + + else if (str.indexOf("Frame B") >= 0) + setBackground(yellowColor); + + else if (str.indexOf("Sequence") >= 0) + setBackground(cyanColor); + + else if (str.indexOf("GOP") >= 0) + setBackground(magentaColor); + + if (str.indexOf("!") >= 0) //error + setBackground(redColor); + + // else if (str.indexOf("Frame D") >= 0) + // setBackground(whiteColor); + } + }; + + colorRenderer2.setHorizontalAlignment(JLabel.LEFT); + + // Show colors by rendering them in their own color. + DefaultTableCellRenderer colorRenderer3 = new DefaultTableCellRenderer() { + Color redColor = new Color(255, 180, 180); + String str; + double val; + + public void setValue(Object value) + { + setBackground(Color.white); + + if (value == null) + { + setText(""); + return; + } + + str = value.toString(); + setText(str); + + val = Double.parseDouble(str); + + if (Math.abs(val * 90.0) > getLastFrameRate() / 2.0) + setBackground(redColor); + } + }; + + colorRenderer3.setHorizontalAlignment(JLabel.CENTER); + + // Show colors by rendering them in their own color. + DefaultTableCellRenderer colorRenderer4 = new DefaultTableCellRenderer() { + Color redColor = new Color(255, 180, 180); + String str; + + public void setValue(Object value) + { + setBackground(Color.white); + + setText(""); + + if (value == null) + return; + + str = value.toString(); + setText(str); + + if (str.indexOf("e") >= 0) //tRef + setBackground(redColor); + } + }; + + colorRenderer4.setHorizontalAlignment(JLabel.CENTER); + + // Create a model of the data. + TableModel dataModel = new AbstractTableModel() { + String str; + + public int getColumnCount() + { + return names.length; + } + + public int getRowCount() + { + return ObjectTable.length; + } + + public Object getValueAt(int row, int col) + { + return ObjectTable[row][col]; + } + + public String getColumnName(int column) + { + return names[column]; + } + + public Class getColumnClass(int c) + { + Object obj = getValueAt(0, c); + + if (obj == null) + return String.class; + + return obj.getClass(); + } + + public boolean isCellEditable(int row, int col) + { + //return false; + return getColumnClass(col) == String.class; + } + + public void setValueAt(Object aValue, int row, int column) + { + ObjectTable[row][column] = aValue; + } + }; + + // Create the table + tableView = new JTable(dataModel); + + tableView.setRowHeight(20); + tableView.setGridColor(new Color(220, 220, 220)); + + tableView.setSelectionBackground(new Color(220, 220, 255)); + tableView.setSelectionForeground(Color.black); + + tableView.getColumn(names[0]).setCellRenderer(renderer_2); + tableView.getColumn(names[0]).setMaxWidth(45); + + tableView.getColumn(names[1]).setCellRenderer(renderer_1); + tableView.getColumn(names[1]).setMaxWidth(70); + + tableView.getColumn(names[2]).setCellRenderer(renderer_1); + tableView.getColumn(names[2]).setMaxWidth(70); + + tableView.getColumn(names[3]).setMaxWidth(50); + tableView.getColumn(names[3]).setCellRenderer(colorRenderer4); + + tableView.getColumn(names[4]).setCellRenderer(colorRenderer3); + tableView.getColumn(names[4]).setMaxWidth(70); + + tableView.getColumn(names[5]).setCellRenderer(renderer_2); + tableView.getColumn(names[5]).setMaxWidth(100); + + tableView.getColumn(names[6]).setCellRenderer(renderer_2); + tableView.getColumn(names[6]).setMaxWidth(100); + + tableView.getColumn(names[7]).setMaxWidth(280); + tableView.getColumn(names[7]).setCellRenderer(colorRenderer2); + + tableView.getColumn(names[8]).setMaxWidth(50); + tableView.getColumn(names[8]).setCellRenderer(colorRenderer1); + + tableView.sizeColumnsToFit(JTable.AUTO_RESIZE_LAST_COLUMN); + + tableView.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) + { + if (e.getClickCount() < 1) + return; + + int row = tableView.getSelectedRow(); + + // empty row + if (row >= 0 && tableView.getValueAt(row, 0) == null) + row = -1; + + } + }); + + scrollpane = new JScrollPane(tableView); + + return scrollpane; + } + + /** + * + */ + private void close() + { + dispose(); + } + + /** + * + */ + private void remove() + { + int[] rows = tableView.getSelectedRows(); + + for (int i = rows.length - 1; i >= 0; i--) + sourcedata.remove(rows[i]); + + setSourceTable(); + } + + /** + * + */ + private void copy() + { + int row = tableView.getSelectedRow(); + + if (row < 0) + return; + + streamobject = (StreamObject) sourcedata.get(row); + + if (streamobject instanceof Frame) + { + Frame frame1 = (Frame) streamobject; + Frame frame2 = new Frame(); + + frame2.copy(frame1.getType(), frame1.getDataType(), frame1.getOffset(), frame1.getLength(), frame1.getChunk() + 1000); + frame2.copy2(frame1.getFrameType(), frame1.getTempRef()); + + sourcedata.add(row + 1, frame2); + + setSourceTable(); + } + } + + /** + * + */ + private void reload() + { + editGOP(data, pts_indices); + } + + /** + * + */ + private void check() + { + + } + + /** + * + */ + private byte[] save() + { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + try { + + int pos, len; + + for (int i = 0, j = sinkdata.size(); i < j; i++) + { + streamobject = (StreamObject) sinkdata.get(i); + + pos = streamobject.getOffset(); + len = streamobject.getLength(); + + if (streamobject instanceof Frame) + { + Frame frame = (Frame) streamobject; + + int val = frame.getTempRef(); + + if (val >= 0) + setTempRef(data, pos, val); + } + + out.write(data, pos, len); + } + + out.flush(); + out.close(); + + JOptionPane.showMessageDialog(this, "export done.."); + + } catch (Exception e) { + System.out.println("error"); + } + + return out.toByteArray(); + } + + /** + * + */ + private void setTempRef(byte[] array, int offs, int val) + { + array[offs + 4] = (byte)(0xFF & val>>2); + array[offs + 5] = (byte)((0xC0 & val<<6) | (0x3F & array[offs + 5])); + } + + /** + * + */ + private void updateTable(Object[][] objects) + { + ObjectTable = objects == null ? new Object[s1][s2] : objects; + + tableView.clearSelection(); + tableView.revalidate(); + tableView.repaint(); + } + + /** + * + */ + private void setTextField(String str) + { + textField.setText(str); + } + + /** + * + */ + private String getTextField() + { + return textField.getText(); + } + + /** + * + */ + private void setSourceTable() + { + int size = sourcedata.size(); + + ObjectTable = new Object[size][s2]; + StreamObject obj; + + for (int i = 0; i < size; i++) + { + obj = (StreamObject) sourcedata.get(i); + + ObjectTable[i] = obj.getObjectTable(); + } + + tableView.clearSelection(); + tableView.revalidate(); + tableView.repaint(); + } + + /** + * entry point + */ + public byte[] editGOP(byte[] _data, long[][] _pts_indices) + { + int pos = 0; + int chunk = 0; + int last_id = -1; + int lastSelect = -1; + + int sliceCount = 0; + + data = _data; + pts_indices = _pts_indices; + + setTextField(""); + sourcedata.clear(); + sinkdata.clear(); + + for (int i = 0, j = 0, slice_id = -1, k = data.length - 3, id; i < k; i++) + { + if (data[i] != 0 || data[i + 1] != 0 || data[i + 2] != 1) + continue; + + id = 0xFF & data[i + 3]; + + if (id > FRAME && id < 0xB0) + { + if (id == slice_id) + sliceCount |= 0x10000; + + else if (id < slice_id) + sliceCount |= 0x20000; + + else if (id > slice_id + 1) + sliceCount |= 0x40000; + + sliceCount++; + } + + switch (id) //include extensions 0xB5 in main header length + { + case FRAME: + case SEQUENCE: + case SEQUENCE_END: + case GOP: + // case USER_DATA: + + setSliceInfo(sliceCount); + + if (id == FRAME) + { + sliceCount = 0; + slice_id = id; + } + + if (last_id < 0) + { + last_id = id; + j = i; + continue; + } + + streamobject = setObject(last_id, pos, data, j, i - j, chunk++); + + for (int p = pts_indices[0].length - 1; p >= 0; p--) + { + if (lastSelect != p && pts_indices[1][p] <= j && streamobject != null) + { + streamobject.setPTSValue(pts_indices[0][p]); + lastSelect = p; + break; + } + } + + last_id = id; + j = i; + break; + + default: + + if (id > FRAME && id < 0xB0) + slice_id = id; + + continue; + } + } + + setSliceInfo(sliceCount); //last frame update + updatePTSInfo(); + validatePTSInfo(); + validateSequence(); + getErrors(); + + setSourceTable(); + + setSourceList(); + setSinkList(); + +// edit here - modal dialog + this.show(); + + return data; + } + + /** + * + */ + private void setSliceInfo(int val) + { + if (streamobject != null && streamobject.getType() == 0) // is next frame + { + String str = streamobject.getDataType() + " - Slices: " + String.valueOf(0xFFFF & val); + + if ((0x10000 & val) != 0) + str += " dupl! "; + + if ((0x20000 & val) != 0) + str += " sequ! "; + + if ((0x40000 & val) != 0) + str += " miss! "; + + streamobject.setError(streamobject.getError() | val>>>16); + streamobject.setDataType(str); + } + } + + /** + * + */ + private void updatePTSInfo() + { + long pts = -1; + + // set PTS of first frame if it's empty + for (int i = 0, j = sourcedata.size(); i < j; i++) + { + streamobject = (StreamObject) sourcedata.get(i); + + if (streamobject.getPTSValue() != -1) + pts = streamobject.getPTSValue(); + + if (streamobject instanceof Frame) + { + if (streamobject.getPTSValue() == -1 && pts != -1) + streamobject.setPTSValue(pts); + + break; + } + } + } + + /** + * + */ + private void validatePTSInfo() + { + Frame frame; + double zero_pts = -1, pts; + int tRef; + double tmp1, tmp2, framerate = getLastFrameRate(); + + if (framerate < 0) + return; + + for (int i = 0, j = sourcedata.size(); i < j; i++) + { + streamobject = (StreamObject) sourcedata.get(i); + + if (streamobject instanceof Frame) + { + frame = (Frame) streamobject; + tRef = frame.getTempRef(); + pts = frame.getPTSValue(); + + tmp1 = pts - (tRef * framerate); + + if (zero_pts < 0) + zero_pts = tmp1; + + tmp2 = (pts - (tRef * framerate)) - zero_pts; + + if (Math.abs(tmp2) > framerate / 2.0) + frame.setError(frame.getError() | 0x10); + + frame.setDelta(tmp2); + + continue; + } + } + } + + /** + * + */ + private void validateSequence() + { + Frame frame; + double framerate = getLastFrameRate(); + int tRef, tmp; + int[] list = new int[sourcedata.size()]; + boolean b = false; + + Arrays.fill(list, -1); + + for (int i = 0, j = sourcedata.size(); i < j; i++) + { + streamobject = (StreamObject) sourcedata.get(i); + + if (streamobject instanceof Frame) + { + frame = (Frame) streamobject; + tRef = frame.getTempRef(); + + list[i] = tRef<<16 | i; + + continue; + } + } + + Arrays.sort(list); + + for (int i = 0, lastRef = -1, j = list.length; i < j; i++) + { + if (list[i] < 0) + continue; + + tmp = 0xFFFF & list[i]; + tRef = list[i]>>>16; + + if (lastRef < 0) + lastRef = tRef; + + else if (tRef != lastRef) + { + streamobject = (StreamObject) sourcedata.get(tmp); + streamobject.setError(streamobject.getError() | 0x20); + } + + lastRef++; + } + } + + /** + * + */ + public void getErrors() + { + int errors = 0; + + for (int i = 0, j = sourcedata.size(); i < j; i++) + { + streamobject = (StreamObject) sourcedata.get(i); + + errors |= streamobject.getError(); + } + + if ((0x7 & errors) != 0) + setTextField(getTextField() + "Error Frame; "); + + if ((0x10 & errors) != 0) + setTextField(getTextField() + "Error PTS Indication; "); + + if ((0x20 & errors) != 0) + setTextField(getTextField() + "Error tRef's; "); + } + + /** + * + */ + private void setLastFrameRate(double val) + { + lastFrameRate = val; + } + + /** + * + */ + private double getLastFrameRate() + { + return lastFrameRate; + } + + /** + * + */ + private void setSourceList() + { + sourcelist.setListData(sourcedata.toArray()); + } + + /** + * + */ + private void setSinkList() + { + sinklist.setListData(sinkdata.toArray()); + } + + /** + * + */ + private StreamObject setObject(int last_id, int pos, byte[] buf, int offs, int len, int chunk) + { + switch (last_id) + { + case FRAME: + streamobject = new Frame(); + streamobject.set(pos, buf, offs, len, chunk); + break; + + case SEQUENCE: + streamobject = new SequenceHeader(); + streamobject.set(pos, buf, offs, len, chunk); + break; + + case SEQUENCE_END: + streamobject = new SequenceEnd(); + streamobject.set(pos, buf, offs, len, chunk); + break; + + case GOP: + streamobject = new GOPHeader(); + streamobject.set(pos, buf, offs, len, chunk); + break; + + case USER_DATA: + streamobject = new UserData(); + streamobject.set(pos, buf, offs, len, chunk); + break; + + default: + return null; + } + + sourcedata.add(streamobject); + + return streamobject; + } + + + + + + + class Frame extends StreamObject { + + private int frametype = 0; + private int tempref = -1; + + private String[] types = { "-", "I", "P", "B", "D", "-", "-", "-" }; + + public Frame() + { + type = FRAME; + datatype = "Frame "; + + setDataType(datatype); + } + + public void copy2(int _frametype, int _tempref) + { + frametype = _frametype; + tempref = _tempref; + + objecttable[3] = String.valueOf(getTempRef()); + } + + public void set(int pos, byte[] array, int offs, int len, int _chunk) + { + frametype = 7 & array[offs + 5]>>3; + tempref = (0xFF & array[offs + 4])<<2 | (3 & array[offs + 5]>>6); + + setDataType(getDataType() + types[getFrameType()]); + + objecttable[3] = String.valueOf(getTempRef()); + + setOffsets(pos, offs, len, _chunk); + } + + public int getFrameType() + { + return frametype; + } + + public int getTempRef() + { + return tempref; + } + + public String toString() + { + return ("#" + chunk + " (" + getOffset() + "->" + (getOffset() + getLength()) + ")" + datatype + types[frametype] + " - tref: " + String.valueOf(tempref)); + } + } + + class SequenceHeader extends StreamObject { + + private String[] aspratio = {"res.","1.000 (1:1)","0.6735 (4:3)","0.7031 (16:9)","0.7615 (2.21:1)","0.8055","0.8437","0.9375","0.9815","1.0255","1.0695","1.1250","1.1575","1.2015","res." }; + private String[] fps_table_str = {"forbidden fps","23.976fps","24fps","25fps","29.97fps","30fps","50fps","59.94fps","60fps","n.def.","n.def.","n.def.","n.def.","n.def.","n.def.","n.def."}; + private double[] fps_table = { -1, 90000.0 / 23.976, 90000.0 / 24.0, 90000.0 / 25.0, 90000.0 / 29.97, 90000.0 / 30.0, 90000.0 / 50.0, 90000.0 / 59.94, 90000.0 / 60.0, -1, -1, -1, -1, -1, -1, -1 }; + + public SequenceHeader() + { + type = SEQUENCE; + datatype = "SequenceHeader"; + + setDataType(datatype); + } + + public void set(int pos, byte[] array, int offs, int len, int _chunk) + { + String str = " "; + str += String.valueOf((0xFF & array[offs + 4])<<4 | (0xF0 & array[offs + 5])>>>4); + str += "*"; + str += String.valueOf((0xF & array[offs + 5])<<8 | (0xFF & array[offs + 6])); + str += ", "; + str += fps_table_str[0xF & array[offs + 7]]; + str += ", "; + str += aspratio[0xF & array[offs + 7]>>>4]; + + datatype += str; + + setDataType(datatype); + + setOffsets(pos, offs, len, _chunk); + + setLastFrameRate(fps_table[0xF & array[offs + 7]]); + } + } + + class GOPHeader extends StreamObject { + + private String[] drop = { "--,", "drop," }; + private String[] closed = { "--,", "closed," }; + private String[] broken = { "--", "broken" }; + + public GOPHeader() + { + type = GOP; + datatype = "GOPHeader"; + + setDataType(datatype); + } + + public void set(int pos, byte[] array, int offs, int len, int _chunk) + { + String str = " "; + + str += drop[1 & array[offs + 4]>>7]; + str += closed[1 & array[offs + 7]>>6]; + str += broken[1 & array[offs + 7]>>5]; + str += " "; + + str += String.valueOf((0x7C & array[offs + 4])>>>2); + str += ":"; + str += String.valueOf((3 & array[offs + 4])<<4 | (0xF0 & array[offs + 5])>>>4); + str += ":"; + str += String.valueOf((7 & array[offs + 5])<<3 | (0xE0 & array[offs + 6])>>>5); + str += ":"; + str += String.valueOf((0x1F & array[offs + 6])<<1 | (0x80 & array[offs + 7])>>>7); + + datatype += str; + + setDataType(datatype); + + setOffsets(pos, offs, len, _chunk); + } + } + + class UserData extends StreamObject { + + public UserData() + { + type = USER_DATA; + datatype = "UserData"; + + setDataType(datatype); + } + + public void set(int pos, byte[] array, int offs, int len, int _chunk) + { + String str = new String(array, offs + 4, len - 4); + + datatype += " '" + str + "'"; + + setDataType(datatype); + + setOffsets(pos, offs, len, _chunk); + } + } + + class SequenceEnd extends StreamObject { + + public SequenceEnd() + { + type = SEQUENCE_END; + datatype = "SequenceEnd"; + + setDataType(datatype); + } + } + + class StreamObject { + + public int chunk = -1; + public int type = -1; + + public int offset = -1; + public int length = -1; + public int error = 0; + + public Object[] objecttable = new Object[s2]; + public long pts = -1; + public double delta = -1; + + public String datatype = "StreamObject"; + + public StreamObject() + {} + + public void copy(int _type, String _datatype, int _offset, int _length, int _chunk) + { + type = _type; + offset = _offset; + length = _length; + chunk = _chunk; + + setDataType(_datatype); + + objecttable[0] = String.valueOf(chunk); + objecttable[1] = String.valueOf(offset); + objecttable[2] = String.valueOf(offset + length); + } + + public void set(int pos, byte[] array, int offs, int len, int _chunk) + { + setOffsets(pos, offs, len, _chunk); + } + + public void setOffsets(int pos, int offs, int len, int _chunk) + { + offset = pos + offs; + length = len; + chunk = _chunk; + + objecttable[0] = String.valueOf(chunk); + objecttable[1] = String.valueOf(offset); + objecttable[2] = String.valueOf(offset + length); + } + + public void setPTSValue(long val) + { + pts = val; + objecttable[5] = String.valueOf(pts); + objecttable[6] = Common.formatTime_1(pts / 90L); + } + + public long getPTSValue() + { + return pts; + } + + public int getOffset() + { + return offset; + } + + public int getLength() + { + return length; + } + + public int getType() + { + return type; + } + + public void setDelta(double val) + { + delta = val; + + double tmp = (delta / 90.0) * 1000.0; + tmp = Math.round(tmp) / 1000.0; + + objecttable[4] = String.valueOf(tmp); // in millisec + } + + public int getError() + { + return error; + } + + public void setError(int val) + { + error = val; + objecttable[8] = String.valueOf(error); + + if ((val & 0x20) != 0) //tref error + objecttable[3] = objecttable[3].toString() + "e"; + } + + public void setDataType(String str) + { + datatype = str; + objecttable[7] = datatype; + } + + public String getDataType() + { + return datatype; + } + + public int getChunk() + { + return chunk; + } + + public String toString() + { + return ("#" + getChunk() + " (" + getOffset() + "->" + (getOffset() + getLength()) + ")" + datatype); + } + + public Object[] getObjectTable() + { + return objecttable; + } + + } +} \ No newline at end of file diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/GuiInterfaceImpl.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/GuiInterfaceImpl.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/GuiInterfaceImpl.java 2005-12-17 22:22:34.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/GuiInterfaceImpl.java 2009-01-10 15:58:04.000000000 +0000 @@ -31,7 +31,6 @@ import net.sourceforge.dvb.projectx.gui.ProcessWindow; import net.sourceforge.dvb.projectx.gui.MainFrame; import net.sourceforge.dvb.projectx.gui.CommonGui; -import net.sourceforge.dvb.projectx.gui.SubpictureFrame; import net.sourceforge.dvb.projectx.gui.StartUp; import net.sourceforge.dvb.projectx.common.GuiInterfaceIF; @@ -46,8 +45,6 @@ private ProcessWindow processwindow; - private SubpictureFrame subpictureframe; - private StartUp startup; /** @@ -347,19 +344,9 @@ /** * */ - private void initSubpictureFrame() - { - if (subpictureframe == null) - subpictureframe = new SubpictureFrame(); - } - - /** - * - */ public void setSubpictureTitle(String str) { - initSubpictureFrame(); - subpictureframe.setFrameTitle(str); + CommonGui.getSubpictureFrame().setFrameTitle(str); } /** @@ -367,16 +354,14 @@ */ public void showSubpicture() { - initSubpictureFrame(); - - if (subpictureframe.isVisible()) + if (CommonGui.getSubpictureFrame().isVisible()) { - subpictureframe.setState(0); - subpictureframe.toFront(); + CommonGui.getSubpictureFrame().setState(0); + CommonGui.getSubpictureFrame().toFront(); } else - subpictureframe.show(); + CommonGui.getSubpictureFrame().show(); } /** @@ -384,9 +369,7 @@ */ public void hideSubpicture() { - initSubpictureFrame(); - - subpictureframe.close(); + CommonGui.getSubpictureFrame().close(); } /** @@ -394,9 +377,12 @@ */ public boolean isSubpictureVisible() { - if (subpictureframe == null || !subpictureframe.isVisible()) + if (!CommonGui.getSubpictureFrame().isVisible()) return false; + // if (subpictureframe == null || !subpictureframe.isVisible()) + // return false; + return true; } @@ -405,9 +391,7 @@ */ public void repaintSubpicture() { - initSubpictureFrame(); - - subpictureframe.repaintSubpicture(); + CommonGui.getSubpictureFrame().repaintSubpicture(); } /** @@ -449,5 +433,13 @@ { CommonGui.getPicturePanel().repaint(); } + + /** + * + */ + public byte[] editGOP(byte[] data, long[][] pts_indices) + { + return MainFrame.editGOP(data, pts_indices); + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/HexViewer.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/HexViewer.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/HexViewer.java 2006-01-18 00:08:38.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/HexViewer.java 2006-12-31 19:04:12.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)HEXVIEWER.java - simple hexviewer * - * Copyright (c) 2002-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2002-2006 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -210,7 +210,7 @@ from.setMaximumSize(new Dimension(100,25)); from.setEditable(true); - fsize = new JTextField("1000"); + fsize = new JTextField("100000"); fsize.setPreferredSize(new Dimension(100,25)); fsize.setMaximumSize(new Dimension(100,25)); fsize.setEditable(true); @@ -289,7 +289,7 @@ JMenuItem close = new JMenuItem(); CommonGui.localize(close, "Common.Close"); - close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); + close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -442,33 +442,41 @@ private void print(byte[] data, long position) { String fill = "0000000000"; - String text = ""; + StringBuffer text = new StringBuffer(""); - text += " Offset : 0 1 2 3 4 5 6 7- 8 9 A B C D E F : Ascii \n"; - text += "-----------|--------------------------------------------------|-----------------\n"; + text.append(" Offset : 0 1 2 3 4 5 6 7- 8 9 A B C D E F : Ascii \n"); + text.append("-----------|--------------------------------------------------|-----------------\n"); + + StringBuffer ascii = new StringBuffer(""); + String stuff; + String pos; + String val; for (int a = 0; a < data.length; a += 16) { - String ascii = " : "; - String stuff = " "; - String pos = Long.toHexString(position + a).toUpperCase(); - text += fill.substring(0, 10 - pos.length()) + pos + " : "; - int b=0; + pos = Long.toHexString(position + a).toUpperCase(); + text.append(fill.substring(0, 10 - pos.length()) + pos + " : "); + int b = 0; + + ascii.setLength(0); + ascii.append(" : "); + + stuff = " "; for (; b < 16 && a + b < data.length; b++) { - String val = Integer.toHexString((0xFF & data[a + b])).toUpperCase(); - text += fill.substring(0, 2 - val.length()) + val + ((b == 7) ? "-" : " "); - ascii += ((0xFF & data[a + b]) > 0x1F && (0xFF & data[a + b]) < 0x7F) ? "" + ((char)data[a + b]) : "."; + val = Integer.toHexString((0xFF & data[a + b])).toUpperCase(); + text.append(fill.substring(0, 2 - val.length()) + val + ((b == 7) ? "-" : " ")); + ascii.append(((0xFF & data[a + b]) > 0x1F && (0xFF & data[a + b]) < 0x7F) ? "" + ((char)data[a + b]) : "."); } for (; b < 16; b++) - text += stuff; + text.append(stuff); - text += ascii + "\n"; + text.append(ascii.toString() + "\n"); } - HexArea.setText(text); + HexArea.setText(text.toString()); } /** @@ -498,6 +506,32 @@ show(); } +/** + private void searchString(String search_str, XInputFile xInputFile) + { + try { + //BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(xInputFile))); + + int line = 0; + + while ((str = file.readLine()) != null) + { + line++; + + if (str.indexOf(search_str) >= 0) + break; + } + + file.close(); + } + + catch (IOException e) + { + HexArea.setText(Resource.getString("hexviewer.error") + ": " + xinputFile); + } + + } +**/ /** * */ diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/Html.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/Html.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/Html.java 2005-12-17 22:22:52.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/Html.java 2006-10-03 08:13:02.000000000 +0000 @@ -108,22 +108,29 @@ html = new JEditorPane(url_str); else + { + url_str = "htmls/index.html"; html = new JEditorPane(Resource.getLocalizedResourceURL("htmls", "index.html")); - - html.setEditable(false); - html.addHyperlinkListener(this); - - JViewport vp = getViewport(); - vp.add(html); + } } catch (MalformedURLException e) { Common.setMessage("Malformed URL: " + e); + html = new JEditorPane(); + html.setText("wrong url ! :\n" + url_str); } catch (IOException e) { Common.setMessage("IOException: " + e); + html = new JEditorPane(); + html.setText("missing resource ! :\n" + url_str); } + + html.setEditable(false); + html.addHyperlinkListener(this); + + JViewport vp = getViewport(); + vp.add(html); } /** diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/MainFrame.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/MainFrame.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/MainFrame.java 2006-03-29 00:45:56.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/MainFrame.java 2009-08-23 20:01:28.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)MainFrame.java - holds main gui * - * Copyright (c) 2001-2005 by dvb.matt, All rights reserved. + * Copyright (c) 2001-2009 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -74,6 +74,7 @@ import java.util.Locale; import java.util.Calendar; +import java.util.Collections; import javax.swing.BorderFactory; import javax.swing.Box; @@ -96,7 +97,6 @@ import javax.swing.JRadioButtonMenuItem; import javax.swing.JCheckBoxMenuItem; import javax.swing.JScrollPane; -import javax.swing.JSlider; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.JTextArea; @@ -114,17 +114,23 @@ import javax.swing.table.DefaultTableCellRenderer; import java.net.URL; +import java.net.URLDecoder; + +import net.sourceforge.dvb.projectx.net.X_URLDecoder; import net.sourceforge.dvb.projectx.parser.CommonParsing; import net.sourceforge.dvb.projectx.parser.MainProcess; import net.sourceforge.dvb.projectx.parser.HpFix; import net.sourceforge.dvb.projectx.parser.StripAudio; import net.sourceforge.dvb.projectx.parser.StripRelook; +import net.sourceforge.dvb.projectx.parser.StripMedion; import net.sourceforge.dvb.projectx.xinput.DirType; import net.sourceforge.dvb.projectx.xinput.XInputDirectory; import net.sourceforge.dvb.projectx.xinput.XInputFile; +import net.sourceforge.dvb.projectx.video.Preview; + import net.sourceforge.dvb.projectx.gui.FtpChooser; import net.sourceforge.dvb.projectx.common.JobCollection; @@ -149,12 +155,15 @@ import net.sourceforge.dvb.projectx.gui.TextFieldListener; import net.sourceforge.dvb.projectx.gui.CommonGui; +import net.sourceforge.dvb.projectx.gui.GOPEditor; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.ClipboardOwner; +import java.io.FilenameFilter; +//import org.apache.oro.io.RegexFilenameFilter; /** * @@ -168,9 +177,7 @@ private static boolean SilentAction = true; //create empty table - private static Object[][] FileObjectTable = new Object[5][11]; - - private static CollectionPanel collection_panel; + private static Object[][] FileObjectTable = new Object[10][12]; private static JFrame frame = new JFrame(); @@ -186,25 +193,23 @@ */ private JRadioButtonMenuItem lf_item[] = null; - private JTable tableView; + private JList list1; private JViewport viewport; private JTextField outfield; - - private ComboBoxIndexListener _ComboBoxIndexListener = new ComboBoxIndexListener(); - private ComboBoxItemListener _ComboBoxItemListener = new ComboBoxItemListener(); - private CheckBoxListener _CheckBoxListener = new CheckBoxListener(); - private TextFieldListener _TextFieldListener = new TextFieldListener(); - private JPopupMenu popup; private JFrame autoload; - private Thread thread = null; - private PatchDialog patch_panel; + private int loadSizeForward = 1024000; + + private Preview Preview = new Preview(loadSizeForward); + + private static GOPEditor gop_editor; + /** * copy fileinfo to clipboard, see popup, menulistener */ @@ -215,6 +220,191 @@ {} } + private DropTargetListener dnd1Listener = new DropTargetListener() + { + public void drop(DropTargetDropEvent e) + { + try { + + int dropaction = e.getDropAction(); // 1=copy, 2=move + + if (dropaction == 0 || dropaction > 2) + { + e.rejectDrop(); + return; + } + + e.acceptDrop(dropaction); + + Transferable tr = e.getTransferable(); + DataFlavor[] df = tr.getTransferDataFlavors(); + + // Get list with one or more File objects + List list = new ArrayList(); + + Object obj = df.length == 0 ? new Object() : tr.getTransferData(df[0]); + + String eyetvCollectionName = null; + + if (obj instanceof java.util.List) + { + list = (java.util.List) obj; + + Collections.sort(list); + + // Replace dropped File objects by XInputFile objects + ArrayList tempList = new ArrayList(); + + for (int i = 0; i < list.size(); i++) + tempList.add(new XInputFile((File)list.get(i))); + + list = tempList; + } + + else if (obj instanceof URL) + { + // MacOsX tiger returns one Url instead of a file list, works only without host specification of the file + URL url = (URL) obj; + + String protocol = url.getProtocol(); + + if (protocol.equals("file")) + { + //File f = new File(URLDecoder.decode(url.getFile())); + File f = new File(X_URLDecoder.decode(url.getFile(), "UTF-8")); + + if (f.isDirectory() && f.getName().endsWith(".eyetv")) + { + // handle EyeTV recording directory + // output filename will be the directory name + // filename is to be found inside the directory as ".mpg" + String name = f.getName(); + name = name.substring(0, name.lastIndexOf(".eyetv")); + File[] theMPGFile = new File[1]; + + + theMPGFile = f.listFiles(new FilenameFilter() { + public boolean accept(File f, String s) { + return s.toUpperCase().endsWith(".MPG"); + } + }); + + if(theMPGFile.length != 0) + { + list.add( new XInputFile(theMPGFile[0].getAbsoluteFile())); + eyetvCollectionName = name + ".mpg"; + } + } + + else if (f.exists()) + { + list.add(new XInputFile(f)); + + eyetvCollectionName = null; + } + + else + Common.setOSDErrorMessage("dropped File Object(s) not accessible.. : " + url.toString()); + } + + else if (protocol.equals("ftp")) + { + XInputDirectory xid = new XInputDirectory(url); + XInputFile[] xif = xid.getFiles(); + + int i = 0; + for (; i < xif.length; i++) + if ( new URL(xif[i].toString()).getFile().equals(url.getFile()) ) + { + list.add(xif[i]); + break; + } + + if (i >= xif.length) + Common.setOSDErrorMessage("File Object not accessible: " + url.toString()); + } + } + + else + { + e.dropComplete(true); + tableView.setBackground(Color.white); + Common.setOSDErrorMessage("can't drop Object(s) to Collection.. : " + obj.getClass().getName()); + + return; + } + + + if (dropaction == 1) // copy = new coll each + { + Object[] val = list.toArray(); + + /** + * create new collection for each file + */ + for (int i = 0; i < val.length; i++) + { + JobCollection collection = Common.addCollection(); + collection.addInputFile(val[i]); + + if(eyetvCollectionName != null) + collection.setOutputName(eyetvCollectionName); + + updateCollectionTable(collection.getCollectionAsTable()); + updateOutputField(collection); + } + } + + else if (dropaction == 2) // move = one coll + { + Object[] val = list.toArray(); + + if (val.length > 0) + { + Common.addCollection(false); + + JobCollection collection = Common.getCollection(comboBox_0.getSelectedIndex()); + collection.addInputFile(val); + + if(eyetvCollectionName != null) + collection.setOutputName(eyetvCollectionName); + + updateCollectionTable(collection.getCollectionAsTable()); + updateOutputField(collection); + } + } + + e.dropComplete(true); + + if (list.size() > 0) + updateCollectionPanel(Common.getActiveCollection()); + + } catch (Exception eee) { + + e.dropComplete(false); + Common.setExceptionMessage(eee); + } + + tableView.setBackground(Color.white); + } + + public void dragEnter(DropTargetDragEvent e) + { + tableView.setBackground(Color.green); + } + + public void dragExit(DropTargetEvent e) + { + tableView.setBackground(Color.white); + } + + public void dragOver(DropTargetDragEvent e) + {} + + public void dropActionChanged(DropTargetDragEvent e) + {} + }; + /** * */ @@ -300,11 +490,39 @@ * from selection is NOT of java.io.File!! */ for (int i = 0; i < theFiles.length; i++) + { if (theFiles[i].isFile()) collection.addInputFile( new XInputFile(theFiles[i].getAbsoluteFile())); + else if (theFiles[i].isDirectory() && theFiles[i].getName().endsWith(".eyetv")) + { + // handle EyeTV recording directory + // output filename will be the directory name + // filename is to be found inside the directory as ".mpg" + String name = theFiles[i].getName(); + name = name.substring(0, name.lastIndexOf(".eyetv")); + File[] theMPGFile = new File[1]; + + + theMPGFile = theFiles[i].listFiles(new FilenameFilter() { + public boolean accept(File f, String s) { + return s.toUpperCase().endsWith(".MPG"); + } + }); + if(theMPGFile.length != 0) + { + collection.addInputFile( new XInputFile(theMPGFile[0].getAbsoluteFile())); + collection.setOutputName(name + ".mpg"); + } + } + + else + Common.setOSDErrorMessage("File Object not accessible.. : " + theFiles[i].toString()); + } + updateCollectionTable(collection.getCollectionAsTable()); updateCollectionPanel(Common.getActiveCollection()); + updateOutputField(collection); } return; @@ -427,6 +645,24 @@ /** * */ + else if (actName.equals("viewInSupViewer")) + { + int index = tableView.getSelectedRow(); + + if (index < 0 || tableView.getValueAt(index, 0) == null) + return; + + JobCollection collection = Common.getCollection(); + + XInputFile xInputFile = ((XInputFile) collection.getInputFile(index)).getNewInstance(); + + if (xInputFile != null && xInputFile.exists() && xInputFile.getStreamInfo().getStreamType() == CommonParsing.ES_SUP_TYPE) + CommonGui.getSubpictureFrame().loadPreview(xInputFile); + } + + /** + * + */ else if (actName.equals("fixHpAc3")) { int index = tableView.getSelectedRow(); @@ -495,6 +731,43 @@ /** * */ + else if (actName.equals("FileProperties")) + { + int index = tableView.getSelectedRow(); + + if (index < 0 || tableView.getValueAt(index, 0) == null) + return; + + JobCollection collection = Common.getCollection(); + + XInputFile xInputFile = (XInputFile) collection.getInputFile(index); + + if (xInputFile != null && xInputFile.exists()) + { + CommonGui.getFileProperties().open(xInputFile, Common.getActiveCollection(), index); + + updateCollectionTable(collection.getCollectionAsTable()); + updateCollectionPanel(Common.getActiveCollection()); + + tableView.clearSelection(); + } + + } + + /** + * + */ + else if (actName.equals("CollectionProperties")) + { + if (Common.isCollectionListEmpty()) + return; + + CommonGui.getCollectionProperties().open(Common.getCollection(), Common.getActiveCollection()); + } + + /** + * + */ else if (actName.equals("stripRelook")) { stripRelook(0); @@ -511,6 +784,14 @@ /** * */ + else if (actName.equals("stripMedion")) + { + stripMedion(); + } + + /** + * + */ else if (actName.equals("editBasics")) { int index = tableView.getSelectedRow(); @@ -526,7 +807,11 @@ patch_panel = new PatchDialog(frame); if (patch_panel.entry(xInputFile)) - ScanInfo(xInputFile); + { + getScanInfo(xInputFile, xInputFile.getStreamInfo().getStreamType()); + updateCollectionTable(collection.getCollectionAsTable()); + updateCollectionPanel(Common.getActiveCollection()); + } } /** @@ -602,21 +887,23 @@ if (str.equals(items[i].toString())) { if (xInputFile.getStreamInfo() == null) - ScanInfo(xInputFile); + getScanInfo(xInputFile); xInputFile.getStreamInfo().setStreamType(i); - ScanInfo(xInputFile, i); + getScanInfo(xInputFile, i); updateCollectionTable(collection.getCollectionAsTable()); + updateCollectionPanel(Common.getActiveCollection()); return; } } xInputFile.setStreamInfo(null); - ScanInfo(xInputFile); + getScanInfo(xInputFile); updateCollectionTable(collection.getCollectionAsTable()); + updateCollectionPanel(Common.getActiveCollection()); } /** @@ -668,7 +955,14 @@ else if (protocol.equals("file")) { - inputValue = new XInputFile(new File(url.getHost() + url.getFile())); + File f = new File(url.getHost() + url.getFile()); + + if (!f.exists()) + f = new File(url.getFile()); + + if (f.exists()) + inputValue = new XInputFile(f); + break; } @@ -739,6 +1033,46 @@ tableView.clearSelection(); } } + + /** + * + */ + private void stripMedion() + { + int index = tableView.getSelectedRow(); + + if (index < 0 || tableView.getValueAt(index, 0) == null) + return; + + JobCollection collection = Common.getCollection(); + + XInputFile xInputFile = ((XInputFile) collection.getInputFile(index)).getNewInstance(); + + if (xInputFile != null && xInputFile.exists() && xInputFile.getStreamInfo().getStreamType() == CommonParsing.PES_AV_TYPE && CommonGui.getUserConfirmation("really process '" + xInputFile.getName() + "' ?")) + { + StripMedion stripMedion = new StripMedion(); + + Common.setOSDMessage("strip Medionョ data..."); + + XInputFile[] xif = stripMedion.process(xInputFile, collection.getOutputDirectory()); + + collection.removeInputFile(index); + + if (xif != null) + { + for (int i = 0, j = index; i < xif.length; i++) + { + if (xif[i] != null) + collection.addInputFile(j++, xif[i]); + } + } + + updateCollectionTable(collection.getCollectionAsTable()); + updateCollectionPanel(Common.getActiveCollection()); + + tableView.clearSelection(); + } + } }; @@ -792,7 +1126,7 @@ */ private void updateCollectionTable(Object[][] objects) { - FileObjectTable = objects == null ? new Object[5][11] : objects; + FileObjectTable = objects == null ? new Object[10][12] : objects; tableView.clearSelection(); tableView.revalidate(); @@ -855,72 +1189,55 @@ JMenuItem menuitem_8 = popup.add(Resource.getString("popup.url")); menuitem_8.setActionCommand("url"); + menuitem_8.addActionListener(_MenuListener); - JMenuItem menuitem_4 = popup.add(Resource.getString("popup.rename")); - menuitem_4.setActionCommand("rename"); + JMenuItem menuitem_2 = new JMenuItem(); + CommonGui.localize(menuitem_2, "file.add"); + menuitem_2.setActionCommand("add"); + menuitem_2.addActionListener(_MenuListener); + popup.add(menuitem_2); + + JMenuItem menuitem_3 = new JMenuItem(); + CommonGui.localize(menuitem_3, "file.remove"); + menuitem_3.setActionCommand("remove"); + menuitem_3.addActionListener(_MenuListener); + popup.add(menuitem_3); + + popup.addSeparator(); JMenuItem menuitem_5 = popup.add(Resource.getString("popup.openhex")); menuitem_5.setActionCommand("viewAsHex"); + menuitem_5.addActionListener(_MenuListener); - JMenuItem menuitem_6 = popup.add(Resource.getString("popup.patchbasics")); - menuitem_6.setActionCommand("editBasics"); + JMenuItem menuitem_6 = popup.add(Resource.getString("popup.opensup")); + menuitem_6.setActionCommand("viewInSupViewer"); + menuitem_6.addActionListener(_MenuListener); JMenuItem menuitem_7 = popup.add(Resource.getString("popup.sendtocl3")); menuitem_7.setActionCommand("sendTo3"); - - popup.addSeparator(); - - JMenuItem menuitem_10 = popup.add(Resource.getString("popup.changeTimestamp")); - menuitem_10.setActionCommand("changeTimestamp"); - - JMenuItem menuitem_12 = popup.add(Resource.getString("popup.fixHpAc3")); - menuitem_12.setActionCommand("fixHpAc3"); - - JMenuItem menuitem_14 = popup.add(Resource.getString("popup.stripAudio")); - menuitem_14.setActionCommand("stripAudio"); - - JMenuItem menuitem_15 = popup.add("strip Relookョ type 0 to separate pes.."); - menuitem_15.setActionCommand("stripRelook"); - - JMenuItem menuitem_16 = popup.add("strip Relookョ type 1 to separate pes.."); - menuitem_16.setActionCommand("stripRelook1"); - - popup.addSeparator(); + menuitem_7.addActionListener(_MenuListener); JMenuItem menuitem_11 = popup.add(Resource.getString("popup.copyInfoToClipboard")); menuitem_11.setActionCommand("clipboard"); + menuitem_11.addActionListener(_MenuListener); - /** - * - */ - Object[] objects = Keys.ITEMS_FileTypes; - - JMenu streamtype = new JMenu(Resource.getString("popup.assignStreamType")); - - for (int i = 0; i <= objects.length; i++) - { - JMenuItem item = new JMenuItem(i == objects.length ? Resource.getString("popup.automatic") : objects[i].toString()); - item.setActionCommand("assignStreamtype"); - item.addActionListener(_MenuListener); - - if (i == objects.length) - streamtype.addSeparator(); - - streamtype.add(item); - } + popup.addSeparator(); - popup.add(streamtype); + JMenuItem menuitem_17 = popup.add(Resource.getString("General.FileProperties") + ".."); + menuitem_17.setActionCommand("FileProperties"); + menuitem_17.addActionListener(_MenuListener); popup.addSeparator(); JMenuItem menuitem_9 = popup.add(Resource.getString("popup.newOutName")); menuitem_9.setActionCommand("newOutName"); + menuitem_9.addActionListener(_MenuListener); /** * */ - objects = Keys.ITEMS_ConversionMode; + Object[] objects = Keys.ITEMS_ConversionMode; JMenu action = new JMenu(Resource.getString("popup.assignActionType")); @@ -938,22 +1255,17 @@ popup.add(action); + popup.addSeparator(); + + //coll properties + JMenuItem menuitem_18 = popup.add(Resource.getString("General.CollectionProperties") + ".."); + menuitem_18.setActionCommand("CollectionProperties"); + menuitem_18.addActionListener(_MenuListener); + + popup.pack(); UIManager.addPropertyChangeListener(new UISwitchListener(popup)); - - menuitem_4.addActionListener(_MenuListener); - menuitem_5.addActionListener(_MenuListener); - menuitem_6.addActionListener(_MenuListener); - menuitem_7.addActionListener(_MenuListener); - menuitem_8.addActionListener(_MenuListener); - menuitem_9.addActionListener(_MenuListener); - menuitem_10.addActionListener(_MenuListener); - menuitem_11.addActionListener(_MenuListener); - menuitem_12.addActionListener(_MenuListener); - menuitem_14.addActionListener(_MenuListener); - menuitem_15.addActionListener(_MenuListener); - menuitem_16.addActionListener(_MenuListener); } /** @@ -1366,8 +1678,9 @@ // final final String[] names = { - "#", + "ID", Resource.getString("CollectionTable.Source"), + "#", Resource.getString("CollectionTable.FileName"), Resource.getString("CollectionTable.FileLocation"), Resource.getString("CollectionTable.Size"), @@ -1421,8 +1734,7 @@ { FileObjectTable[row][column] = aValue; } - }; - + }; // Create the table tableView = new JTable(dataModel); @@ -1442,32 +1754,35 @@ tableView.setSelectionBackground(new Color(220, 220, 255)); tableView.setSelectionForeground(Color.black); - tableView.getColumn("#").setCellRenderer(renderer_2); - tableView.getColumn("#").setMaxWidth(20); + tableView.getColumn(names[2]).setCellRenderer(renderer_2); + tableView.getColumn(names[2]).setMaxWidth(25); + + tableView.getColumn(names[0]).setCellRenderer(renderer_2); + tableView.getColumn(names[0]).setMaxWidth(25); tableView.getColumn(names[1]).setCellRenderer(renderer_2); tableView.getColumn(names[1]).setMinWidth(32); tableView.getColumn(names[1]).setMaxWidth(32); - tableView.getColumn(names[2]).setPreferredWidth(200); - tableView.getColumn(names[3]).setPreferredWidth(200); + tableView.getColumn(names[3]).setMinWidth(165); //200 + tableView.getColumn(names[4]).setMinWidth(160); - tableView.getColumn(names[4]).setCellRenderer(renderer_1); - tableView.getColumn(names[4]).setMinWidth(62); - tableView.getColumn(names[4]).setMaxWidth(62); - - tableView.getColumn(names[5]).setCellRenderer(renderer_2); - tableView.getColumn(names[5]).setMinWidth(96); - tableView.getColumn(names[5]).setMaxWidth(96); + tableView.getColumn(names[5]).setCellRenderer(renderer_1); + tableView.getColumn(names[5]).setMinWidth(62); + tableView.getColumn(names[5]).setMaxWidth(62); + + tableView.getColumn(names[6]).setCellRenderer(renderer_2); + tableView.getColumn(names[6]).setMinWidth(100); + tableView.getColumn(names[6]).setMaxWidth(100); - for (int i = 6; i < 10; i++) + for (int i = 7; i < 11; i++) { tableView.getColumn(names[i]).setCellRenderer(renderer_2); tableView.getColumn(names[i]).setMinWidth(16); tableView.getColumn(names[i]).setMaxWidth(16); } - tableView.getColumn(names[10]).setMinWidth(90); + tableView.getColumn(names[11]).setMinWidth(90); tableView.sizeColumnsToFit(JTable.AUTO_RESIZE_LAST_COLUMN); @@ -1492,137 +1807,23 @@ if (elements == null) return; - for (int i = 1; i < 12; i++) + for (int i = 3; i < 8; i++) elements[i].getComponent().setEnabled(row >= 0); - for (int i = 12; i < elements.length; i++) + for (int i = 8; i < elements.length; i++) elements[i].getComponent().setEnabled(index >= 0); popup.show(tableView, e.getX(), e.getY() - popup.getHeight()); } else if (row >= 0) - ScanInfo((XInputFile) Common.getCollection(index).getInputFile(row)); + getScanInfo((XInputFile) Common.getCollection(index).getInputFile(row)); - if (e.getClickCount() >= 2 && e.getModifiers() == MouseEvent.BUTTON1_MASK) - Common.getGuiInterface().showPreSettings(); + if (e.getClickCount() >= 2 && e.getModifiers() == MouseEvent.BUTTON1_MASK && !Common.isCollectionListEmpty() && row >= 0) + CommonGui.getFileProperties().open((XInputFile) Common.getCollection(index).getInputFile(row), Common.getActiveCollection(), row); } }); - DropTargetListener dnd1Listener = new DropTargetListener() - { - public void drop(DropTargetDropEvent e) - { - try { - - int dropaction = e.getDropAction(); // 1=copy, 2=move - - if (dropaction == 0 || dropaction > 2) - { - e.rejectDrop(); - return; - } - - e.acceptDrop(dropaction); - - Transferable tr = e.getTransferable(); - DataFlavor[] df = tr.getTransferDataFlavors(); - - // Get list with one or more File objects - // List li = (java.util.List)tr.getTransferData(df[0]); - List list = null; - - Object obj = tr.getTransferData(df[0]); - - try { - list = (java.util.List) obj; - - } catch (Exception ce1) { - - // MacOsX tiger returns one Url instead of a file list, works only without host specification of the file - try { - URL url = (URL)obj; - File f = new File(url.getFile()); - list = new ArrayList(); - list.add(f); - - } catch (Exception ce2) { - - e.dropComplete(true); - return; - } - } - - // Replace dropped File objects by XInputFile objects - ArrayList tempList = new ArrayList(); - - for (int i = 0; i < list.size(); i++) - tempList.add(new XInputFile((File)list.get(i))); - - list = tempList; - - if (dropaction == 1) // copy = new coll each - { - Object[] val = list.toArray(); - - /** - * create new collection for each file - */ - for (int i = 0; i < val.length; i++) - { - JobCollection collection = Common.addCollection(); - collection.addInputFile(val[i]); - - updateCollectionTable(collection.getCollectionAsTable()); - } - } - - else if (dropaction == 2) // move = one coll - { - Common.addCollection(false); - - Object[] val = list.toArray(); - - if (val.length > 0) - { - JobCollection collection = Common.getCollection(comboBox_0.getSelectedIndex()); - collection.addInputFile(val); - - updateCollectionTable(collection.getCollectionAsTable()); - } - } - - e.dropComplete(true); - - if (list.size() > 0) - updateCollectionPanel(Common.getActiveCollection()); - - } catch (Exception eee) { - - e.dropComplete(false); - Common.setExceptionMessage(eee); - } - - tableView.setBackground(Color.white); - } - - public void dragEnter(DropTargetDragEvent e) - { - tableView.setBackground(Color.green); - } - - public void dragExit(DropTargetEvent e) - { - tableView.setBackground(Color.white); - } - - public void dragOver(DropTargetDragEvent e) - {} - - public void dropActionChanged(DropTargetDragEvent e) - {} - }; - DropTarget dropTarget_2 = new DropTarget(tableView, dnd1Listener); scrollpane = new JScrollPane(tableView); @@ -1641,7 +1842,7 @@ /** * autoload */ - JButton open_autoload = new JButton(CommonGui.loadIcon("fwd_10.gif")); + JButton open_autoload = new JButton(CommonGui.loadIcon("openmulti.gif")); open_autoload.setPreferredSize(new Dimension(30, 22)); open_autoload.setMaximumSize(new Dimension(30, 22)); open_autoload.setToolTipText(Resource.getString("FilePanel.openAutoloadPanel.Tip")); @@ -1657,7 +1858,7 @@ /** * add */ - JButton file_add = new JButton(CommonGui.loadIcon("add.gif")); + JButton file_add = new JButton(CommonGui.loadIcon("open.gif")); file_add.setPreferredSize(new Dimension(30, 22)); file_add.setMaximumSize(new Dimension(30, 22)); file_add.setToolTipText(Resource.getString("FilePanel.FileAdd.Tip")); @@ -1668,7 +1869,7 @@ /** * remove */ - JButton file_remove = new JButton(CommonGui.loadIcon("rem.gif")); + JButton file_remove = new JButton(CommonGui.loadIcon("remove.gif")); file_remove.setPreferredSize(new Dimension(30, 22)); file_remove.setMaximumSize(new Dimension(30, 22)); file_remove.setToolTipText(Resource.getString("FilePanel.FileRemove.Tip")); @@ -1679,7 +1880,8 @@ /** * up */ - JButton file_up = new JButton(CommonGui.loadIcon("up.gif")); + JButton file_up = new JButton(CommonGui.loadIcon("up2.gif")); + // JButton file_up = new JButton(CommonGui.loadIcon("up.gif")); file_up.setPreferredSize(new Dimension(30, 22)); file_up.setMaximumSize(new Dimension(30, 22)); file_up.setToolTipText(Resource.getString("FilePanel.FileUp.Tip")); @@ -1720,7 +1922,8 @@ /** * down */ - JButton file_down = new JButton(CommonGui.loadIcon("dn.gif")); + JButton file_down = new JButton(CommonGui.loadIcon("down.gif")); + // JButton file_down = new JButton(CommonGui.loadIcon("dn.gif")); file_down.setPreferredSize(new Dimension(30, 22)); file_down.setMaximumSize(new Dimension(30, 22)); file_down.setToolTipText(Resource.getString("FilePanel.FileDown.Tip")); @@ -1798,51 +2001,27 @@ public void actionPerformed(ActionEvent e) { if (comboBox_13.getItemCount() > 1) - { - if (comboBox_13.getSelectedIndex() == 0) - Common.getSettings().remove(Keys.KEY_OutputDirectory[0]); - - else - Common.getSettings().setProperty(Keys.KEY_OutputDirectory[0], comboBox_13.getSelectedItem()); - - if (comboBox_0.getItemCount() > 0) - { - Common.setActiveCollection(comboBox_0.getSelectedIndex()); - - JobCollection collection = Common.getCollection(); - - collection.setOutputDirectory(Common.getSettings().getProperty(Keys.KEY_OutputDirectory)); - - updateOutputField(collection); - - updateCollectionTable(collection.getCollectionAsTable()); - } - } + Common.getSettings().setProperty(Keys.KEY_OutputDirectory[0], comboBox_13.getSelectedItem()); - else - { - Common.getSettings().remove(Keys.KEY_OutputDirectory[0]); + if (comboBox_0.getItemCount() == 0) + return; - if (comboBox_0.getItemCount() > 0) - { - Common.setActiveCollection(comboBox_0.getSelectedIndex()); + Common.setActiveCollection(comboBox_0.getSelectedIndex()); - JobCollection collection = Common.getCollection(); + JobCollection collection = Common.getCollection(); - collection.setOutputDirectory(Common.getSettings().getProperty(Keys.KEY_OutputDirectory)); + collection.setOutputDirectory(Common.getSettings().getProperty(Keys.KEY_OutputDirectory)); - updateOutputField(collection); + updateOutputField(collection); - updateCollectionTable(collection.getCollectionAsTable()); - } - } + updateCollectionTable(collection.getCollectionAsTable()); } }); /** * */ - JButton add_output = new JButton(CommonGui.loadIcon("add.gif")); + JButton add_output = new JButton(CommonGui.loadIcon("open.gif")); add_output.setMinimumSize(new Dimension(24, 20)); add_output.setMaximumSize(new Dimension(24, 20)); add_output.setToolTipText(Resource.getString("FilePanel.addRecentOutputDirectory.Tip")); @@ -1886,7 +2065,7 @@ /** * */ - JButton remove_output = new JButton(CommonGui.loadIcon("rem.gif")); + JButton remove_output = new JButton(CommonGui.loadIcon("remove.gif")); remove_output.setMinimumSize(new Dimension(24, 20)); remove_output.setMaximumSize(new Dimension(24, 20)); remove_output.setToolTipText(Resource.getString("FilePanel.removeRecentOutputDirectory.Tip")); @@ -1945,9 +2124,9 @@ panel.add(control_2); - panel.setPreferredSize(new Dimension(900, 114)); - panel.setMaximumSize(new Dimension(900, 114)); - panel.setMinimumSize(new Dimension(900, 114)); + panel.setPreferredSize(new Dimension(860, 114)); + panel.setMaximumSize(new Dimension(860, 114)); + panel.setMinimumSize(new Dimension(860, 114)); return panel; } @@ -1995,7 +2174,7 @@ CommonGui.localize(editMenu, "Common.Edit"); JCheckBoxMenuItem subdir = new JCheckBoxMenuItem(Resource.getString(Keys.KEY_InputDirectoriesDepth[0])); - subdir.setToolTipText(Resource.getString(Keys.KEY_InputDirectoriesDepth[0]) + Keys.KEY_Tip); + subdir.setToolTipText(Resource.getString(Keys.KEY_InputDirectoriesDepth[0] + Keys.KEY_Tip)); subdir.setActionCommand(Keys.KEY_InputDirectoriesDepth[0]); subdir.setState(Common.getSettings().getBooleanProperty(Keys.KEY_InputDirectoriesDepth)); subdir.addActionListener(_BoxListener); @@ -2024,7 +2203,7 @@ /** * */ - JButton remove_input = new JButton(CommonGui.loadIcon("rem.gif")); + JButton remove_input = new JButton(CommonGui.loadIcon("remove.gif")); remove_input.setPreferredSize(new Dimension(50,28)); remove_input.setMaximumSize(new Dimension(50,28)); remove_input.setToolTipText(Resource.getString("autoload.dir.remove.tip")); @@ -2049,7 +2228,7 @@ /** * */ - JButton add_input = new JButton(CommonGui.loadIcon("add.gif")); + JButton add_input = new JButton(CommonGui.loadIcon("open.gif")); add_input.setPreferredSize(new Dimension(50,28)); add_input.setMaximumSize(new Dimension(50,24)); add_input.setToolTipText(Resource.getString("autoload.dir.add.tip")); @@ -2101,7 +2280,7 @@ // Button to add a ftp server directory to the autoload list - JButton add_inputftp = new JButton(CommonGui.loadIcon("ftp.gif")); + JButton add_inputftp = new JButton(CommonGui.loadIcon("openftp.gif")); add_inputftp.setPreferredSize(new Dimension(50,28)); add_inputftp.setMaximumSize(new Dimension(50,24)); add_inputftp.setToolTipText(Resource.getString("autoload.ftp.add.tip")); @@ -2140,7 +2319,7 @@ /** * */ - JButton refresh_list = new JButton(CommonGui.loadIcon("rf.gif")); + JButton refresh_list = new JButton(CommonGui.loadIcon("refresh.gif")); refresh_list.setPreferredSize(new Dimension(50,28)); refresh_list.setMaximumSize(new Dimension(50,28)); refresh_list.setToolTipText(Resource.getString("autoload.dir.refresh.tip")); @@ -2158,11 +2337,11 @@ /** * */ - JButton add_coll_and_files = new JButton(CommonGui.loadIcon("addleft.gif")); - add_coll_and_files.setPreferredSize(new Dimension(50,28)); - add_coll_and_files.setMaximumSize(new Dimension(50,28)); - add_coll_and_files.setToolTipText(Resource.getString("autoload.add.coll.tip")); - add_coll_and_files.addActionListener(new ActionListener() { + JButton add_coll_and_1file = new JButton(CommonGui.loadIcon("addcollfile.gif")); + add_coll_and_1file.setPreferredSize(new Dimension(50,28)); + add_coll_and_1file.setMaximumSize(new Dimension(50,28)); + add_coll_and_1file.setToolTipText(Resource.getString("autoload.add.coll.tip")); + add_coll_and_1file.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Object[] val = list1.getSelectedValues(); @@ -2185,13 +2364,42 @@ autoload.toFront(); } }); - bb.add(add_coll_and_files); + bb.add(add_coll_and_1file); + /** + * + */ + JButton add_coll_and_files = new JButton(CommonGui.loadIcon("addcollfiles.gif")); + add_coll_and_files.setPreferredSize(new Dimension(50,28)); + add_coll_and_files.setMaximumSize(new Dimension(50,28)); + add_coll_and_files.setToolTipText(Resource.getString("autoload.add.coll2.tip")); + add_coll_and_files.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + Object[] val = list1.getSelectedValues(); + + if (val.length == 0) + return; + + /** + * create new collection add all selected files + */ + JobCollection collection = Common.addCollection(); + + collection.addInputFile(val); + + updateCollectionTable(collection.getCollectionAsTable()); + updateCollectionPanel(Common.getActiveCollection()); + + autoload.toFront(); + } + }); + bb.add(add_coll_and_files); /** * */ - JButton add_files = new JButton(CommonGui.loadIcon("left.gif")); + JButton add_files = new JButton(CommonGui.loadIcon("addfile.gif")); add_files.setPreferredSize(new Dimension(50, 28)); add_files.setMaximumSize(new Dimension(50, 28)); add_files.setToolTipText(Resource.getString("autoload.add.file.tip")); @@ -2222,7 +2430,7 @@ /** * */ - JButton close = new JButton(CommonGui.loadIcon("x.gif")); + JButton close = new JButton(CommonGui.loadIcon("close.gif")); close.setPreferredSize(new Dimension(50,28)); close.setMaximumSize(new Dimension(50,28)); close.setToolTipText(Resource.getString("autoload.close")); @@ -2281,7 +2489,7 @@ else if (e.getClickCount() == 1) { if (list1.getSelectedValue() != null ) - ScanInfo( (XInputFile) list1.getSelectedValue()); + getScanInfo( (XInputFile) list1.getSelectedValue()); } } }); @@ -2342,7 +2550,8 @@ * */ JPanel panel_1 = new JPanel(); - panel_1.setLayout(new ColumnLayout()); + // panel_1.setLayout(new ColumnLayout()); + panel_1.setLayout(new BorderLayout()); MemoryMonitor memo = new MemoryMonitor(); @@ -2351,54 +2560,63 @@ panel_1.add(memo, BorderLayout.NORTH); - panel_1.add(Box.createRigidArea(new Dimension(1, 5))); - panel_1.add(Box.createRigidArea(new Dimension(1, 54))); - - panel_1.add(buildProcessControlPanel()); - panel_1.add(buildCollectionControlPanel()); - - panel_1.setPreferredSize(new Dimension(115, 468)); - panel_1.setMaximumSize(new Dimension(115, 468)); - panel_1.setMinimumSize(new Dimension(115, 468)); + JPanel panel_3 = new JPanel(); + panel_3.setLayout(new ColumnLayout()); + panel_3.add(buildProcessControlPanel()); + panel_3.add(buildCollectionControlPanel()); + + panel_1.add(panel_3, BorderLayout.SOUTH); + + //panel_1.setPreferredSize(new Dimension(115, 362)); + //panel_1.setMaximumSize(new Dimension(115, 362)); + //panel_1.setMinimumSize(new Dimension(115, 362)); /** * */ JPanel panel_2 = new JPanel(); - panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS)); + // panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS)); + panel_2.setLayout(new BorderLayout()); panel_2.add(panel_1, BorderLayout.WEST); - panel_2.add(collection_panel = new CollectionPanel(), BorderLayout.CENTER); + panel_2.add(new CollectionPanel(), BorderLayout.CENTER); - panel_2.setPreferredSize(new Dimension(900, 468)); - panel_2.setMaximumSize(new Dimension(900, 468)); - panel_2.setMinimumSize(new Dimension(900, 468)); + //panel_2.setPreferredSize(new Dimension(860, 362)); + //panel_2.setMaximumSize(new Dimension(860, 362)); + //panel_2.setMinimumSize(new Dimension(860, 362)); /** * */ JPanel panel = new JPanel(); - panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + // panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setLayout(new BorderLayout()); panel.add(panel_2, BorderLayout.CENTER); - panel.add(buildFilePanel(), BorderLayout.SOUTH); + panel.add(buildFilePanel1(), BorderLayout.SOUTH); return panel; } - /** * */ - protected javax.swing.JRootPane buildFilePanel1() + protected JPanel buildFilePanel1() { - javax.swing.JRootPane pane = new javax.swing.JRootPane(); + JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout()); - //javax.swing.JLayeredPane pane = new javax.swing.JLayeredPane(); + JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.setTabPlacement(SwingConstants.BOTTOM); - pane.getContentPane().add(buildFilePanel()); + tabbedPane.addTab(Resource.getString("General.FileTable"), buildFilePanel()); + tabbedPane.addTab(Resource.getString("General.CutControl"), CommonGui.getCutPanel()); + tabbedPane.addTab(Resource.getString("General.FilterControl"), new FilterPanel()); - return pane; + panel.add(CommonGui.getCutPanel().getSliderPanel(), BorderLayout.NORTH); + panel.add(tabbedPane); + + return panel; } /** @@ -2416,9 +2634,9 @@ JButton process = new JButton(Resource.getString("MainPanel.QuickStart")); process.setToolTipText(Resource.getString("MainPanel.QuickStart.Tip")); process.setMnemonic('q'); - process.setPreferredSize(new Dimension(100, 24)); - process.setMaximumSize(new Dimension(100, 24)); - process.setMinimumSize(new Dimension(100, 24)); + process.setPreferredSize(new Dimension(120, 24)); + process.setMaximumSize(new Dimension(120, 24)); + process.setMinimumSize(new Dimension(120, 24)); process.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -2435,9 +2653,9 @@ * process window open */ JButton processwindow = new JButton(Resource.getString("ProcessWindowPanel.Button")); - processwindow.setPreferredSize(new Dimension(100, 24)); - processwindow.setMaximumSize(new Dimension(100, 24)); - processwindow.setMinimumSize(new Dimension(100, 24)); + processwindow.setPreferredSize(new Dimension(120, 24)); + processwindow.setMaximumSize(new Dimension(120, 24)); + processwindow.setMinimumSize(new Dimension(120, 24)); processwindow.setToolTipText(Resource.getString("MainPanel.Process") + " " + Resource.getString("ProcessWindowPanel.Button")); processwindow.setMnemonic('p'); processwindow.addActionListener(new ActionListener() { @@ -2463,6 +2681,7 @@ final Color idle_color = new Color(230, 230, 230); final Color running_color = new Color(245, 215, 215); + final Color settings_color = new Color(245, 245, 215); /** * info field @@ -2473,12 +2692,14 @@ textarea.setFont(new Font("Tahoma", Font.PLAIN, 11)); textarea.setEditable(false); + DropTarget dropTarget_1 = new DropTarget(textarea, dnd1Listener); + JPanel panel_2 = new JPanel(); panel_2.setLayout(new GridLayout(1,1)); panel_2.setBorder(BorderFactory.createLoweredBevelBorder()); - panel_2.setPreferredSize(new Dimension(100, 138)); - panel_2.setMaximumSize(new Dimension(100, 138)); - panel_2.setMinimumSize(new Dimension(100, 138)); + panel_2.setPreferredSize(new Dimension(120, 138)); + panel_2.setMaximumSize(new Dimension(120, 138)); + panel_2.setMinimumSize(new Dimension(120, 138)); panel_2.add(textarea); panel.add(panel_2); @@ -2487,8 +2708,8 @@ * collection label */ JLabel coll_label = new JLabel(Resource.getString("FilePanel.CollectionNumber")); - coll_label.setPreferredSize(new Dimension(50, 24)); - coll_label.setMaximumSize(new Dimension(50, 24)); + coll_label.setPreferredSize(new Dimension(60, 24)); + coll_label.setMaximumSize(new Dimension(60, 24)); coll_label.setHorizontalAlignment(SwingConstants.CENTER); coll_label.setToolTipText(Resource.getString("FilePanel.CollectionNumber.Tip")); @@ -2496,9 +2717,9 @@ * number of act. coll. */ comboBox_0 = new JComboBox(); - comboBox_0.setPreferredSize(new Dimension(50, 24)); - comboBox_0.setMaximumSize(new Dimension(50, 24)); - comboBox_0.setMinimumSize(new Dimension(50, 24)); + comboBox_0.setPreferredSize(new Dimension(60, 24)); + comboBox_0.setMaximumSize(new Dimension(60, 24)); + comboBox_0.setMinimumSize(new Dimension(60, 24)); comboBox_0.setMaximumRowCount(6); comboBox_0.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -2531,9 +2752,9 @@ /** * remove collection */ - JButton remove_coll = new JButton(CommonGui.loadIcon("rem.gif")); - remove_coll.setPreferredSize(new Dimension(50, 24)); - remove_coll.setMaximumSize(new Dimension(50, 24)); + JButton remove_coll = new JButton(CommonGui.loadIcon("remcoll.gif")); + remove_coll.setPreferredSize(new Dimension(60, 24)); + remove_coll.setMaximumSize(new Dimension(60, 24)); remove_coll.setToolTipText(Resource.getString("FilePanel.removeCollection.Tip")); remove_coll.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -2565,9 +2786,9 @@ /** * add collection */ - JButton add_coll = new JButton(CommonGui.loadIcon("add.gif")); - add_coll.setPreferredSize(new Dimension(50, 24)); - add_coll.setMaximumSize(new Dimension(50, 24)); + JButton add_coll = new JButton(CommonGui.loadIcon("addcoll.gif")); + add_coll.setPreferredSize(new Dimension(60, 24)); + add_coll.setMaximumSize(new Dimension(60, 24)); add_coll.setToolTipText(Resource.getString("FilePanel.addCollection.Tip")); add_coll.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -2641,7 +2862,15 @@ text = str; textarea.setText(text); - textarea.setBackground(collection != null && collection.isActive() ? running_color : idle_color); + + if (collection != null && collection.isActive()) + textarea.setBackground(running_color); + + else if (collection != null && collection.hasSettings()) + textarea.setBackground(settings_color); + + else + textarea.setBackground(idle_color); } public void stop() @@ -2825,18 +3054,37 @@ /** * show ScanInfos */ - public void ScanInfo(XInputFile aXInputFile) + public void getScanInfo(XInputFile aXInputFile) { - ScanInfo(aXInputFile, -1); + getScanInfo(aXInputFile, -1); } /** * show ScanInfos, only directly called from manual stream assignment */ - public void ScanInfo(XInputFile aXInputFile, int streamtype) + public void getScanInfo(XInputFile aXInputFile, int streamtype) { if (aXInputFile.getStreamInfo() == null || streamtype > -1) - Common.getScanClass().getStreamInfo(aXInputFile, streamtype); + Common.getScanClass().getStreamInfo(aXInputFile, 0, streamtype); + + if (aXInputFile.getStreamInfo().getThumbnail() == null) + { + switch (aXInputFile.getStreamInfo().getStreamType()) + { + case CommonParsing.PES_AV_TYPE: + case CommonParsing.MPEG1PS_TYPE: + case CommonParsing.MPEG2PS_TYPE: + case CommonParsing.PVA_TYPE: + case CommonParsing.TS_TYPE: + case CommonParsing.ES_MPV_TYPE: + Preview.previewFile(aXInputFile, 0, loadSizeForward, Common.getSettings().getBooleanProperty(Keys.KEY_Preview_AllGops), Common.getSettings().getBooleanProperty(Keys.KEY_Preview_fastDecode), Common.getSettings().getIntProperty(Keys.KEY_Preview_YGain)); + aXInputFile.getStreamInfo().setThumbnail(Common.getMpvDecoderClass().getScaledCutImage()); + break; + + default: + aXInputFile.getStreamInfo().setThumbnail(new int[0]); + } + } CommonGui.getPicturePanel().setStreamInfo(aXInputFile.getStreamInfo()); } @@ -2889,7 +3137,6 @@ frame.addWindowListener (new WindowAdapter() { public void windowClosing(WindowEvent e) { - // X.closeProgram(true); Common.exitApplication(0); } }); @@ -2910,6 +3157,20 @@ double newHeight = (preferred.getHeight() > current.getHeight()) ? preferred.getHeight() : current.getHeight(); double newWidth = (preferred.getWidth() > current.getWidth()) ? preferred.getWidth() : current.getWidth(); + Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); + + if (newHeight > preferred.getHeight()) + newWidth = (newHeight - 344) * 16 / 9 + 340; + + if (newWidth > screen.getWidth()) + { + newWidth = screen.getWidth(); + newHeight = (newWidth - 340) * 9 / 16 + 344; + } + + else if (newWidth > preferred.getWidth()) + newHeight = (newWidth - 340) * 9 / 16 + 344; + c.setSize(new Dimension((int)newWidth, (int)newHeight)); } }); @@ -3074,6 +3335,17 @@ */ public static void updateCollectionPanel(int index) { - collection_panel.entry(index); + CommonGui.getCutPanel().entry(index); + } + + /** + * + */ + public static byte[] editGOP(byte[] data, long[][] pts_indices) + { + if (gop_editor == null) + gop_editor = new GOPEditor(frame); + + return gop_editor.editGOP(data, pts_indices); } -} \ No newline at end of file +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/MemoryMonitor.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/MemoryMonitor.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/MemoryMonitor.java 2005-09-05 23:37:50.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/MemoryMonitor.java 2008-09-02 07:40:22.000000000 +0000 @@ -67,17 +67,17 @@ Font font = new Font("serif", Font.PLAIN, 10); JLabel label; tf = new JTextField("1000"); - tf.setPreferredSize(new Dimension(40,20)); + tf.setPreferredSize(new Dimension(40,14)); controls.add(tf); controls.add(label = new JLabel("ms")); box = new JCheckBox("call gc()"); - box.setPreferredSize(new Dimension(80,20)); + box.setPreferredSize(new Dimension(80,14)); box.setSelected(true); controls.add(box); - controls.setPreferredSize(new Dimension(100, 80)); - controls.setMaximumSize(new Dimension(100, 80)); + controls.setPreferredSize(new Dimension(100, 36)); + controls.setMaximumSize(new Dimension(100, 36)); label.setFont(font); label.setForeground(Color.black); addMouseListener(new MouseAdapter() { @@ -151,7 +151,7 @@ } public Dimension getPreferredSize() { - return new Dimension(100, 80); + return new Dimension(100, 36); } @@ -170,111 +170,25 @@ // .. Draw allocated and used strings .. big.setColor(Color.green); big.drawString(String.valueOf((int) totalMemory/1024) + "K allocated", 4.0f, (float) ascent+0.5f); - usedStr = String.valueOf(((int) (totalMemory - freeMemory))/1024) - + "K used"; - big.drawString(usedStr, 4, h-descent); - - // Calculate remaining size - float ssH = ascent + descent; - float remainingHeight = (float) (h - (ssH*2) - 0.5f); - float blockHeight = remainingHeight/10; - float blockWidth = 20.0f; - float remainingWidth = (float) (w - blockWidth - 10); - - // .. Memory Free .. - big.setColor(mfColor); - int MemUsage = (int) ((freeMemory / totalMemory) * 10); - int i = 0; - for ( ; i < MemUsage ; i++) { - mfRect.setRect(5,(float) ssH+i*blockHeight, - blockWidth,(float) blockHeight-1); - big.fill(mfRect); - } - - // .. Memory Used .. - big.setColor(Color.green); - for ( ; i < 10; i++) { - muRect.setRect(5,(float) ssH+i*blockHeight, - blockWidth,(float) blockHeight-1); - big.fill(muRect); - } - - // .. Draw History Graph .. - big.setColor(graphColor); - int graphX = 30; - int graphY = (int) ssH; - int graphW = w - graphX - 5; - int graphH = (int) remainingHeight; - graphOutlineRect.setRect(graphX, graphY, graphW, graphH); - big.draw(graphOutlineRect); - - int graphRow = graphH/10; - - // .. Draw row .. - for (int j = graphY; j <= graphH+graphY; j += graphRow) { - graphLine.setLine(graphX,j,graphX+graphW,j); - big.draw(graphLine); - } - - // .. Draw animated column movement .. - int graphColumn = graphW/15; - if (columnInc == 0) { - columnInc = graphColumn; - } + usedStr = String.valueOf(((int) (totalMemory - freeMemory))/1024) + "K used"; + big.drawString(usedStr, 4, 0.5f + ascent * 2); - for (int j = graphX+columnInc; j < graphW+graphX; j+=graphColumn) { - graphLine.setLine(j,graphY,j,graphY+graphH); - big.draw(graphLine); - } + float maxmem = 82; + float usedmem = ((totalMemory - freeMemory) * maxmem) / totalMemory; - --columnInc; + // .. Memory Used .. + big.drawRect(4, h - 10, (int)maxmem, 6); - if (pts == null) { - pts = new int[graphW]; - ptNum = 0; - } else if (pts.length != graphW) { - int tmp[] = null; - if (ptNum < graphW) { - tmp = new int[ptNum]; - System.arraycopy(pts, 0, tmp, 0, tmp.length); - } else { - tmp = new int[graphW]; - System.arraycopy(pts, pts.length-tmp.length, tmp, 0, tmp.length); - ptNum = tmp.length - 2; - } - pts = new int[graphW]; - System.arraycopy(tmp, 0, pts, 0, tmp.length); - } else { - big.setColor(Color.yellow); - pts[ptNum] = (int)(graphY+graphH*(freeMemory/totalMemory)); - for (int j=graphX+graphW-ptNum, k=0;k < ptNum; k++, j++) { - if (k != 0) { - if (pts[k] != pts[k-1]) { - big.drawLine(j-1, pts[k-1], j, pts[k]); - } else { - big.fillRect(j, pts[k], 1, 1); - } - } - } - if (ptNum+2 == pts.length) { - // throw out oldest point - for (int j = 1;j < ptNum; j++) { - pts[j-1] = pts[j]; - } - --ptNum; - } else { - ptNum++; - } - } + big.setColor(new Color(0, 150, 0)); + big.fillRect(5, h - 9, (int)usedmem - 2, 5); if (gc_counter > 4) { - //if (!Common.isRunningProcess() && thread != null && box.isSelected() && freeMemory < 2048000L) if (thread != null && box.isSelected() && freeMemory < 2048000L) { big.setColor(Color.red); - big.fillRect(84, h - descent - 6, 4, 4); + big.fillRect(90, h - 9, 4, 4); System.gc(); } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/PatchDialog.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/PatchDialog.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/PatchDialog.java 2005-12-17 22:23:12.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/PatchDialog.java 2006-11-24 19:40:08.000000000 +0000 @@ -32,6 +32,7 @@ import java.awt.event.ActionListener; import java.io.IOException; +import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; @@ -39,10 +40,12 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; +import javax.swing.JComboBox; import javax.swing.UIManager; import net.sourceforge.dvb.projectx.common.Resource; import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Keys; import net.sourceforge.dvb.projectx.gui.UISwitchListener; import net.sourceforge.dvb.projectx.gui.CommonGui; @@ -57,6 +60,8 @@ /** patchfield */ private JTextField[] patchfield = new JTextField[3]; + private JComboBox aspectbox; + /** the file to be patched */ XInputFile xInputFile=null; @@ -103,23 +108,38 @@ JPanel grid = new JPanel(); grid.setLayout(new BoxLayout(grid, BoxLayout.X_AXIS)); - for (int a = 0; a < 3; a++) + for (int a = 0; a < patchfield.length; a++) { patchfield[a] = new JTextField(""); patchfield[a].setPreferredSize(new Dimension(65,22)); patchfield[a].setMaximumSize(new Dimension(65,22)); + + grid.add(Box.createRigidArea(new Dimension(5, 1))); + grid.add(new JLabel(notes[a])); grid.add(patchfield[a]); } grid.add(new JLabel(notes[3])); + grid.add(Box.createRigidArea(new Dimension(5, 1))); + + aspectbox = new JComboBox(Keys.ITEMS_ChangeAspectRatio); + aspectbox.setPreferredSize(new Dimension(120,22)); + aspectbox.setMaximumSize(new Dimension(120,22)); + aspectbox.addActionListener(patchAction); + grid.add(aspectbox); + + grid.add(Box.createRigidArea(new Dimension(5, 1))); + JButton changebutton = new JButton(); CommonGui.localize(changebutton, "PatchPanel.Change"); changebutton.setActionCommand("change"); changebutton.addActionListener(patchAction); grid.add(changebutton); + grid.add(Box.createRigidArea(new Dimension(5, 1))); + JButton cancelbutton = new JButton(); CommonGui.localize(cancelbutton, "PatchPanel.Cancel"); cancelbutton.setActionCommand("cancel"); @@ -131,7 +151,8 @@ container.add(grid); getContentPane().add(container); - pack(); + //pack(); + setSize(600, 150); centerDialog(); UIManager.addPropertyChangeListener(new UISwitchListener(container)); @@ -164,6 +185,8 @@ patchfield[1].setText("" + ((15 & ps[a + 5])<<8 | (255 & ps[a + 6]))); patchfield[2].setText("" + (((255 & ps[a + 8])<<10 | (255 & ps[a + 9])<<2 | (192 & ps[a + 10])>>>6) * 400)); + aspectbox.setSelectedIndex((0xFF & ps[a + 7])>>4); + return true; } @@ -226,6 +249,7 @@ int hsize=Integer.parseInt(patchfield[0].getText()); int vsize=Integer.parseInt(patchfield[1].getText()); int brate=Integer.parseInt(patchfield[2].getText()) / 400; + int aspectindex = aspectbox.getSelectedIndex(); os[4] = (byte)(0xFF & hsize>>>4); os[5] = (byte)((0xF0 & hsize<<4) | (0xF & vsize>>>8)); @@ -234,6 +258,9 @@ os[9] = (byte)(0xFF & brate>>>2); os[10]= (byte)((0x3F & os[10]) | (0xC0 & brate<<6)); + if (aspectindex >= 0) + os[7] = (byte)((0xF & os[7]) | (aspectindex<<4)); + dochange(); } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/PicturePanel.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/PicturePanel.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/PicturePanel.java 2006-03-05 02:34:08.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/PicturePanel.java 2009-12-25 13:25:20.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)PicturePanel * - * Copyright (c) 2003-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -24,50 +24,49 @@ * */ -package net.sourceforge.dvb.projectx.gui; +/** + * resizable preview window + * idea & introduced 12/2008 by Frank (The Dragon) + */ +package net.sourceforge.dvb.projectx.gui; +import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; +import java.awt.Font; import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.Image; -import java.awt.Font; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; +import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; - +import java.awt.event.InputEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; import java.awt.image.MemoryImageSource; - import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; +import java.text.NumberFormat; import java.util.Arrays; +import java.util.Hashtable; import java.util.List; import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JPanel; import javax.swing.JMenuItem; +import javax.swing.JPanel; import javax.swing.JPopupMenu; +import javax.swing.JSlider; +import javax.swing.SwingConstants; import javax.swing.UIManager; -import net.sourceforge.dvb.projectx.common.Resource; import net.sourceforge.dvb.projectx.common.Common; import net.sourceforge.dvb.projectx.common.Keys; - -import net.sourceforge.dvb.projectx.gui.X_JFileChooser; - +import net.sourceforge.dvb.projectx.common.Resource; import net.sourceforge.dvb.projectx.parser.CommonParsing; - import net.sourceforge.dvb.projectx.video.PreviewObject; -import net.sourceforge.dvb.projectx.video.Video; - import net.sourceforge.dvb.projectx.xinput.StreamInfo; public class PicturePanel extends JPanel { @@ -81,14 +80,59 @@ private Image PalPlusImage = Resource.loadImage("_ppl.gif"); private Image SubpictureImage; private Image image; + private Image mixed_image; + private Image thumb_image; + + private Image InfoBackground = Resource.loadImage("ibg.gif"); + private Image SlideBackground = Resource.loadImage("sbg.gif"); private MemoryImageSource source; + private MemoryImageSource mixed_source; + private MemoryImageSource thumb_source; private boolean showFileInfo = false; private boolean isSubpictureAvailable = false; + private boolean isThumbnailAvailable = false; private boolean isOSDInfoAvailable = false; private boolean isOSDErrorInfo = false; private boolean PLAY = true; + private boolean isMixedImageAvailable = false; + private boolean isMatrixImageAvailable = false; + private boolean isFilterActive = false; + + private boolean fullScaled = false; + + private boolean manualzoom = false; + private boolean definezoom = false; + private int[] zoomrect = new int[6]; + + private int[] mixed_image_array; + private int[] thumb_image_array; + + private String mixed_image_info = ""; + + private int matrix_index = -1; + private int matrix_new_width = 128; // 100 + private int matrix_new_height = 72; // 56 + + private Hashtable matrix_positions = new Hashtable(); + + // 4x4 matrix + private int[][] matrix_table = { + { 0, 0 }, { 128, 1 }, { 256, 1 }, { 384, 1 }, + { 0, 72 }, { 128, 72 }, { 256, 72 }, { 384, 72 }, + { 0, 144 }, { 128, 144 }, { 256, 144 }, { 384, 144 }, + { 0, 216 }, { 128, 216 }, { 256, 216 }, { 384, 216 }, + }; + + // 5x5 matrix + // private int[][] matrix_table_5x5 = { { 2, 1 }, { 104, 1 }, { 206, 1 }, { + // 308, 1 }, { 410, 1 }, { 2, 58 }, + // { 104, 58 }, { 206, 58 }, { 308, 58 }, { 410, 58 }, { 2, 117 }, { 104, + // 117 }, { 206, 117 }, { 308, 117 }, + // { 410, 117 }, { 2, 174 }, { 104, 174 }, { 206, 174 }, { 308, 174 }, { 410 + // , 174 }, { 2, 231 }, { 104, 231 }, + // { 206, 231 }, { 308, 231 }, { 410, 231 } }; private StreamInfo streamInfo = null; @@ -96,10 +140,14 @@ private Font font_2; private Font font_3; + private NumberFormat percentage; + private int ErrorFlag = 0; private int bmpCount = 0; private int collection_number = -1; + private int[] imageSizeMin = { 512, 288 }; + private final String tooltip1 = Resource.getString("mpvdecoder.tip1"); private long cutfiles_length = 0; @@ -110,9 +158,18 @@ private Object[] OSDInfo; private JPopupMenu popup; + private JPanel sliderPanel; private Clock clock; + private Dimension previewImageSize; + + private static final Color OUTLINE_COLOR_1 = Color.lightGray; + private static final Color OUTLINE_COLOR_2 = Color.white; + private static final Color OUTLINE_COLOR_3 = new Color(151, 151, 151); + + private Dimension infoParts = new Dimension(184, 44); + /** * class to control short OSD fadings */ @@ -122,15 +179,12 @@ private int sleepAmount = 3000; - public void start() - { + public void start() { start(3000); } - public void start(int value) - { - if (clockThread == null) - { + public void start(int value) { + if (clockThread == null) { clockThread = new Thread(this, "Clock_4"); clockThread.setPriority(Thread.MIN_PRIORITY); @@ -140,41 +194,38 @@ } } - public void run() - { + public void run() { Thread myThread = Thread.currentThread(); - while (clockThread == myThread) - { + while (clockThread == myThread) { try { Thread.sleep(sleepAmount); // time on screen - } catch (InterruptedException e) {} + } + catch (InterruptedException e) { + } - if (update()) + if (update()) { repaint(); + } stop(); } } - private boolean update() - { + private boolean update() { boolean b = false; - if (collection_number >= 0) - { + if (collection_number >= 0) { collection_number = -1; b = true; } - if (showFileInfo) - { + if (showFileInfo) { showFileInfo = false; b = true; } - if (isOSDInfoAvailable) - { + if (isOSDInfoAvailable) { isOSDInfoAvailable = false; b = true; } @@ -182,22 +233,32 @@ return b; } - public void stop() - { + public void stop() { clockThread = null; } } - /** * */ - public PicturePanel() - { - source = new MemoryImageSource(512, 288, Common.getMpvDecoderClass().getPreviewPixel(), 0, 512); + public PicturePanel() { + percentage = NumberFormat.getPercentInstance(); + percentage.setMaximumFractionDigits(2); + + source = new MemoryImageSource(imageSizeMin[0], imageSizeMin[1], Common.getMpvDecoderClass().getPreviewPixel(), 0, imageSizeMin[0]); source.setAnimated(true); image = createImage(source); + mixed_image_array = new int[imageSizeMin[0] * imageSizeMin[1]]; + mixed_source = new MemoryImageSource(imageSizeMin[0], imageSizeMin[1], mixed_image_array, 0, imageSizeMin[0]); + mixed_source.setAnimated(true); + mixed_image = createImage(mixed_source); + + thumb_image_array = new int[160 * 90]; + thumb_source = new MemoryImageSource(160, 90, thumb_image_array, 0, 160); + thumb_source.setAnimated(true); + thumb_image = createImage(thumb_source); + font_1 = new Font("Tahoma", Font.PLAIN, 12); font_2 = new Font("Tahoma", Font.BOLD, 12); font_3 = new Font("Tahoma", Font.BOLD, 24); @@ -205,26 +266,124 @@ setBackground(Color.black); setVisible(true); - setToolTipText(tooltip1); // <- VORSCHLAG 1 Tooltip! - setSize(512, 346); + setToolTipText(tooltip1); // <- VORSCHLAG 1 Tooltip! + // setSize(512, 346); buildPopupMenu(); + sliderPanel = buildSliderPanel(); + addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent e) - { - if (e.getClickCount() >= 1 && (showFileInfo || isOSDInfoAvailable)) - { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() >= 1 && (showFileInfo || isOSDInfoAvailable)) { showFileInfo = false; isOSDInfoAvailable = false; repaint(); } - // if (e.getClickCount() > 1) - // saveBMP(Common.getMpvDecoderClass().getPixels(), Common.getMpvDecoderClass().getWidth(), Common.getMpvDecoderClass().getHeight(), Common.getMpvDecoderClass().getAspectRatio()); + if (isMatrixImageAvailable) { + if (e.getClickCount() == 1 && e.getModifiers() == InputEvent.BUTTON1_MASK) { + if (matrix_positions.containsKey(String.valueOf(matrix_index))) { + long value = ((Long) matrix_positions.get(String.valueOf(matrix_index))).longValue(); + + CommonGui.getCutPanel().startMatrix(value); + } + else { + CommonGui.getCutPanel().stopMatrix(); + } + } + + if (e.getClickCount() >= 2 && e.getModifiers() == InputEvent.BUTTON3_MASK) { + if (matrix_positions.containsKey(String.valueOf(matrix_index))) { + long value = ((Long) matrix_positions.get(String.valueOf(matrix_index))).longValue(); + + disableMatrix(); + + CommonGui.getCutPanel().stopMatrix(); + CommonGui.getCutPanel().preview(value); + } + } + } - if (e.getClickCount() >= 1 && e.getModifiers() == MouseEvent.BUTTON3_MASK) + else if (e.getClickCount() >= 1 && e.getModifiers() == InputEvent.BUTTON3_MASK) { popup.show(getParent(), e.getX(), e.getY()); + } + + if (e.getClickCount() >= 2 && e.getModifiers() == InputEvent.BUTTON1_MASK) { + CommonGui.getPlayerFrame().repaintPicture(); + } + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + } + + public void mouseReleased(MouseEvent e) { + if (!definezoom) { + return; + } + + definezoom = false; + manualzoom = false; + + repaint(); + + Common.getMpvDecoderClass().setZoomMode(zoomrect); + } + }); + + addMouseMotionListener(new MouseMotionAdapter() { + public void mouseDragged(MouseEvent e) { + if (Common.getMpvDecoderClass().getZoomMode() == 2) { + zoomrect[0] = e.getX() < 0 ? 0 : e.getX(); + zoomrect[1] = e.getY() < 0 ? 0 : e.getY(); + + Common.getMpvDecoderClass().setZoomMode(zoomrect); + } + + if (!definezoom) { + return; + } + + if (!manualzoom) { + manualzoom = true; + zoomrect[0] = e.getX(); + zoomrect[1] = e.getY(); + } + + else { + zoomrect[2] = e.getX() - zoomrect[0]; + zoomrect[3] = (int) (9.0 * zoomrect[2] / 16.0); + } + + repaint(); + } + + public void mouseMoved(MouseEvent e) { + int tmp_val = 0; + + if (isMatrixImageAvailable) { + tmp_val = e.getX() / matrix_new_width + imageSizeMin[0] / matrix_new_width * (e.getY() / matrix_new_height); + + if (tmp_val < matrix_table.length) { + matrix_index = tmp_val; + repaint(); + } + } + + if (!definezoom || manualzoom) { + return; + } + + zoomrect[4] = e.getX(); + zoomrect[5] = e.getY(); + + repaint(); } }); @@ -234,29 +393,50 @@ /** * */ - protected void buildPopupMenu() - { - ActionListener al = new ActionListener() - { - public void actionPerformed(ActionEvent e) - { + protected void buildPopupMenu() { + final String[] popup_modes = { "normalzoom", "lbzoom", "zoomarea", "save_1", "save_2" }; + + ActionListener al = new ActionListener() { + public void actionPerformed(ActionEvent e) { String actName = e.getActionCommand(); - if (actName.equals("save_1")) + if (actName.equals(popup_modes[3])) { saveBMP(Common.getMpvDecoderClass().getPixels(), Common.getMpvDecoderClass().getWidth(), Common.getMpvDecoderClass().getHeight(), 0, false); - - else if (actName.equals("save_2")) + } + else if (actName.equals(popup_modes[4])) { saveBMP(Common.getMpvDecoderClass().getPixels(), Common.getMpvDecoderClass().getWidth(), Common.getMpvDecoderClass().getHeight(), Common.getMpvDecoderClass().getAspectRatio(), true); + } + else if (actName.equals(popup_modes[0])) { + Common.getMpvDecoderClass().setZoomMode(0); + } + else if (actName.equals(popup_modes[1])) { + Common.getMpvDecoderClass().setZoomMode(1); + } + else if (actName.equals(popup_modes[2])) { + definezoom = true; + Arrays.fill(zoomrect, 0); + } } }; popup = new JPopupMenu("save"); - JMenuItem menuitem_1 = popup.add(Resource.getString("PreviewPanel.saveCurrentPicture")); - menuitem_1.setActionCommand("save_1"); + JMenuItem menuitem_1 = popup.add("Normal Zoom"); + menuitem_1.setActionCommand(popup_modes[0]); + + JMenuItem menuitem_2 = popup.add("LB Zoom"); + menuitem_2.setActionCommand(popup_modes[1]); - JMenuItem menuitem_2 = popup.add(Resource.getString("PreviewPanel.saveCurrentPictureDAR")); - menuitem_2.setActionCommand("save_2"); + JMenuItem menuitem_3 = popup.add("Zoom Area.."); + menuitem_3.setActionCommand(popup_modes[2]); + + popup.addSeparator(); + + JMenuItem menuitem_4 = popup.add(Resource.getString("PreviewPanel.saveCurrentPicture")); + menuitem_4.setActionCommand(popup_modes[3]); + + JMenuItem menuitem_5 = popup.add(Resource.getString("PreviewPanel.saveCurrentPictureDAR")); + menuitem_5.setActionCommand(popup_modes[4]); popup.pack(); @@ -264,45 +444,77 @@ menuitem_1.addActionListener(al); menuitem_2.addActionListener(al); + menuitem_3.addActionListener(al); + menuitem_4.addActionListener(al); + menuitem_5.addActionListener(al); + } + + /** + * + */ + protected JPanel buildSliderPanel() { + JPanel panel = new JPanel(new BorderLayout()); + + JSlider scanSlider = new JSlider(); + scanSlider.setOrientation(SwingConstants.VERTICAL); + scanSlider.setInverted(true); + scanSlider.setMaximum(100); + scanSlider.setMajorTickSpacing(10); + scanSlider.setMinorTickSpacing(1); + scanSlider.setPaintTicks(true); + scanSlider.setValue(50); + scanSlider.setPreferredSize(new Dimension(30, 356)); + scanSlider.setMaximumSize(new Dimension(30, 356)); + scanSlider.setMinimumSize(new Dimension(30, 356)); + + panel.add(scanSlider); + + return panel; + } + + /** + * + */ + public JPanel getSliderPanel() { + return sliderPanel; } /** * holds special messages */ - public void startClock() - { + public void startClock() { clock.start(); } /** * holds special messages */ - public void startClock(int value) - { + public void startClock(int value) { clock.start(value); } /** * updates the preview graphic */ - public void paint(Graphics g) - { - g.setColor(Color.black); - g.fillRect(0, 0, 600, 600); + public void paint(Graphics g) { - g.setColor(new Color(0, 35, 110)); - g.fillRect(0, 290, 514, 340); + Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + + previewImageSize = new Dimension(this.getSize().width - infoParts.width, this.getSize().height - infoParts.height); + setPreviewSize(previewImageSize.width, previewImageSize.height); + paintInfoBackground(g); paintOutline(g); - g.drawImage(image, 2, 2, this); + paintPreviewPicture(g, g2); - g.setFont(font_1); - - g.setColor(Color.white); - g.drawString(Common.getMpvDecoderClass().getInfo_1(), 36, 303); - g.drawString(Common.getMpvDecoderClass().getInfo_2(), 36, 317); + paintMixedCutPreviewPicture(g, g2); + paintMatrixPreviewPicture(g); + paintZoomInfo(g); + paintSlideBackground(g); + paintVideoInfo(g); paintWSSInfo(g); paintErrorInfo(g); paintPlayInfo(g); @@ -310,64 +522,192 @@ g.setFont(font_2); paintCutInfo(g); + paintPositionInfo(g); paintChapterInfo(g); - paintSubpicture(g); + paintSubpicture(g, g2); paintOSDInfo(g); paintFileInfo(g); - paintCollectionNumber(g); + paintZoomRect(g); + } + + /** + * paint background + */ + private void paintInfoBackground(Graphics g) { + g.setColor(new Color(0, 35, 110)); + g.fillRect(0, 0, previewImageSize.width + 200, previewImageSize.height + 100); + + g.drawImage(InfoBackground, 0, previewImageSize.height + 2, previewImageSize.width, InfoBackground.getHeight(this), this); + } + + /** + * paint background + */ + private void paintSlideBackground(Graphics g) { + g.drawImage(SlideBackground, previewImageSize.width + 2, 0, infoParts.width, previewImageSize.height + infoParts.height, this); } /** - * paint + * paint preview */ - private void paintOutline(Graphics g) - { - Color line_1 = new Color(191, 191, 191); - Color line_2 = new Color(255, 255, 255); - Color line_3 = new Color(151, 151, 151); + private void paintPreviewPicture(Graphics g, Graphics2D g2) { - g.setColor(line_3); - g.drawLine(1, 1, 514, 1); - g.drawLine(1, 1, 1, 400); + //erste variante, only up-scale again the down-scaled prev.image - g.setColor(line_1); - g.drawLine(2, 290, 514, 290); - g.drawLine(514, 2, 514, 400); + // dont use, affects text negative: + // g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + // g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); - g.setColor(line_2); - g.drawLine(0, 0, 515, 0); - g.drawLine(0, 0, 0, 400); - g.drawLine(0, 291, 515, 291); - g.drawLine(515, 0, 515, 400); + if (!fullScaled) + g2.drawImage(image, 0, 0, previewImageSize.width, previewImageSize.height, this); + else + g.drawImage(image, 0, 0, this); } /** - * paint + * paint cut mixed preview */ - private void paintCollectionNumber(Graphics g) - { - if (collection_number < 0) + private void paintMixedCutPreviewPicture(Graphics g, Graphics2D g2) { + if (!isMixedImageAvailable) { return; + } + + if (!fullScaled) + g2.drawImage(mixed_image, 0, 0, previewImageSize.width, previewImageSize.height, this); + else + g.drawImage(mixed_image, 0, 0, this); + + // g.drawImage(mixed_image, 2, 2, this); g.setFont(font_2); g.setColor(Color.green); - g.drawString("Collection", 454, 16); + g.drawString(mixed_image_info, 340, 280); + } + + /** + * paint cut matrix preview + */ + private void paintMatrixPreviewPicture(Graphics g) { + if (!isMatrixImageAvailable) { + return; + } + + g.drawImage(mixed_image, 0, 0, this); + + if (matrix_index < 0 || matrix_index >= matrix_table.length) { + return; + } + + if (!matrix_positions.containsKey(String.valueOf(matrix_index))) { + return; + } + + g.setColor(Color.green); + g.drawRect(matrix_table[matrix_index][0], matrix_table[matrix_index][1], matrix_new_width + 1, matrix_new_height + 1); + // g.drawRect(matrix_table[matrix_index][0] + 1, matrix_table[matrix_index][1] + 1, matrix_new_width + 1, matrix_new_height + 1); + + g.setFont(font_2); + g.drawString(String.valueOf(matrix_index), matrix_table[matrix_index][0] + 5, matrix_table[matrix_index][1] + 14); + g.drawString(matrix_positions.get(String.valueOf(matrix_index)).toString(), matrix_table[matrix_index][0] + 5, matrix_table[matrix_index][1] + 54); + g.drawString(matrix_positions.get(String.valueOf(matrix_index) + "TC").toString(), matrix_table[matrix_index][0] + 5, matrix_table[matrix_index][1] + 68); + g.drawString(percentage.format(((Long) matrix_positions.get(String.valueOf(matrix_index))).doubleValue() / ((Long) matrix_positions.get("end")).doubleValue()), matrix_table[matrix_index][0] + 50, matrix_table[matrix_index][1] + 14); + } + + /** + * paint outline + */ + private void paintOutline(Graphics g) { + int infoBackgroundHeight = infoParts.height; + + g.setColor(OUTLINE_COLOR_3); + g.drawLine(1, 1, previewImageSize.width, 1); + g.drawLine(1, 1, 1, previewImageSize.height + infoBackgroundHeight); + + g.setColor(OUTLINE_COLOR_1); + g.drawLine(2, previewImageSize.height, previewImageSize.width, previewImageSize.height); + g.drawLine(previewImageSize.width, 2, previewImageSize.width, previewImageSize.height + infoBackgroundHeight); + + g.setColor(OUTLINE_COLOR_2); + g.drawLine(0, 0, previewImageSize.width + 1, 0); + g.drawLine(0, 0, 0, previewImageSize.height + infoBackgroundHeight); + g.drawLine(0, previewImageSize.height + 1, previewImageSize.width + 1, previewImageSize.height + 1); + g.drawLine(previewImageSize.width + 1, 0, previewImageSize.width + 1, previewImageSize.height + infoBackgroundHeight); + } + + /** + * paint videoinfo + */ + private void paintVideoInfo(Graphics g) { + g.setFont(font_1); + g.setColor(Color.white); + + String[] mpg_info = Common.getMpvDecoderClass().getMpgInfo(); + + for (int i = 0, x = previewImageSize.width + 8, y = 18; i < mpg_info.length - 1; i++, y += 14) { + if (mpg_info[i] != null) { + g.drawString(mpg_info[i], x, y); + } + } + } + + /** + * paint + */ + private void paintCollectionNumber(Graphics g) { + if (collection_number < 0) { + return; + } + + g.setFont(font_2); + g.setColor(Color.green); + g.drawString("Collection", previewImageSize.width - 60, 16); g.setFont(font_3); g.setColor(Color.green); - g.drawString(String.valueOf(collection_number), 474, 38); + g.drawString(String.valueOf(collection_number), previewImageSize.width - 50, 38); + } + + /** + * paint + */ + private void paintZoomInfo(Graphics g) { + g.setFont(font_2); + g.setColor(Color.green); + g.drawString(Common.getMpvDecoderClass().getZoomInfo(), 20, previewImageSize.height - 5); + } + + /** + * paint + */ + private void paintZoomRect(Graphics g) { + if (!definezoom) { + return; + } + + if (!manualzoom) { + g.setColor(new Color(255, 255, 255, 255)); + g.drawLine(zoomrect[4] - 10, zoomrect[5], zoomrect[4] + 10, zoomrect[5]); + g.drawLine(zoomrect[4], zoomrect[5] - 10, zoomrect[4], zoomrect[5] + 10); + } + + else { + g.setColor(new Color(100, 100, 255, 120)); + g.fillRect(zoomrect[0], zoomrect[1], zoomrect[2], zoomrect[3]); + + g.setColor(new Color(255, 255, 255, 255)); + g.drawRect(zoomrect[0], zoomrect[1], zoomrect[2], zoomrect[3]); + } } /** * paint wss info */ - private void paintWSSInfo(Graphics g) - { + private void paintWSSInfo(Graphics g) { String str; - if ((str = Common.getMpvDecoderClass().getWSSInfo()) == null) - { + if ((str = Common.getMpvDecoderClass().getWSSInfo()) == null) { setToolTipText(tooltip1); return; } @@ -377,8 +717,9 @@ g.drawString("WSS present", 10, 16); g.drawString(Common.getMpvDecoderClass().getWSSFormatInfo(), 10, 30); - if (Common.getMpvDecoderClass().getPalPlusInfo()) + if (Common.getMpvDecoderClass().getPalPlusInfo()) { g.drawImage(PalPlusImage, 8, 34, this); + } setToolTipText("" + tooltip1 + "

" + str + ""); } @@ -386,88 +727,123 @@ /** * paint play info */ - private void paintPlayInfo(Graphics g) - { - int x[] = { 10, 10, 30 }; - int y[] = { 294, 314, 304 }; + private void paintPlayInfo(Graphics g) { + int x[] = { previewImageSize.width + 8, previewImageSize.width + 8, previewImageSize.width + 28 }; + int y[] = { previewImageSize.height + 18, previewImageSize.height + 38, previewImageSize.height + 28 }; - if (PLAY) - { + if (isFilterActive && PLAY) { + g.setColor(Color.yellow); + g.drawString("Export Filter Mismatch !", previewImageSize.width + 32, previewImageSize.height + 32); + + g.fillRect(previewImageSize.width + 8, previewImageSize.height + 18, 8, 20); + g.fillRect(previewImageSize.width + 20, previewImageSize.height + 18, 8, 20); + + // yellow border around pic + g.drawRect(0, 0, previewImageSize.width - 1, previewImageSize.height - 1); + g.drawRect(1, 1, previewImageSize.width - 3, previewImageSize.height - 3); + } + + else if (PLAY) { g.setColor(Color.green); g.fillPolygon(x, y, 3); + g.drawString("Inside Export Range", previewImageSize.width + 32, previewImageSize.height + 32); } - else - { + else { g.setColor(Color.red); - g.fillRect(10, 294, 20, 20); + g.fillRect(previewImageSize.width + 8, previewImageSize.height + 18, 20, 20); + g.drawString("Outside Export Range", previewImageSize.width + 32, previewImageSize.height + 32); + + // red border around pic + g.drawRect(0, 0, previewImageSize.width - 1, previewImageSize.height - 1); + g.drawRect(1, 1, previewImageSize.width - 3, previewImageSize.height - 3); } } /** * paint error info */ - private void paintErrorInfo(Graphics g) - { + private void paintErrorInfo(Graphics g) { ErrorFlag = Common.getMpvDecoderClass().getErrors(); - if ((ErrorFlag & 1) != 0) - { + if ((ErrorFlag & 1) != 0) { g.setColor(Color.white); g.fill3DRect(150, 120, 200, 20, true); g.setColor(Color.red); - g.drawString("error while decoding frame", 160, 133); + g.drawString("picture decoding not possible", 160, 133); } - if ((ErrorFlag & 4) != 0) - { + // if ((ErrorFlag & 4) != 0) { + if ((ErrorFlag & 0xC) == 4) { g.setColor(Color.white); g.fill3DRect(150, 135, 200, 20, true); g.setColor(Color.red); g.drawString("not enough data in buffer", 160, 148); } - if ((ErrorFlag & 2) != 0) - { + if ((ErrorFlag & 2) != 0) { g.setColor(Color.white); g.fill3DRect(150, 150, 200, 20, true); g.setColor(Color.red); g.drawString("cannot find sequence header", 160, 163); } + + if ((ErrorFlag & 0x13) > 0x10) // 5 + 2 + 1 + { + g.setColor(Color.white); + g.fill3DRect(150, 150, 200, 20, true); + g.setColor(Color.red); + g.drawString("no Sequ. but GOP header found", 160, 163); + } + + if ((ErrorFlag & 8) != 0) { + g.setColor(Color.white); + // g.fill3DRect(150, 165, 200, 20, true); + g.fill3DRect(150, 135, 200, 20, true); + g.setColor(Color.red); + // g.drawString("data seems to be MPEG-4/H.264", 160, 178); + g.drawString("no preview for MPEG-4/H.264", 160, 148); + } + + if ((ErrorFlag & 0x20) != 0) { + g.setColor(Color.white); + g.fill3DRect(150, 165, 200, 20, true); + g.setColor(Color.red); + g.drawString("java instance out of memory", 160, 178); + } } /** * paint cut info */ - private void paintCutInfo(Graphics g) - { - if (cutfiles_length <= 0) + private void paintCutInfo(Graphics g) { + if (cutfiles_length <= 0) { return; + } - int x1 = 10, y1 = 327, w1 = 492, h1 = 6; + // int x1 = 10, y1 = 327, w1 = 492, h1 = 6; + int x1 = 10, y1 = previewImageSize.height + 12, w1 = previewImageSize.width - 22, h1 = 6; g.setColor(new Color(0, 200, 0)); g.fillRect(x1, y1, w1, h1); g.setColor(Color.white); - g.drawRect(x1 -2, y1 -2, w1 +3, h1 +3); + g.drawRect(x1 - 2, y1 - 2, w1 + 3, h1 + 3); /** * paint cut markers */ - if (cutfiles_points != null && cutfiles_points.length > 0) - { + if (cutfiles_points != null && cutfiles_points.length > 0) { int p0 = 0, p1 = 0; - for (int i = 0; i < cutfiles_points.length; i++) - { - if (cutfiles_points[i] > cutfiles_length) - break; + for (int i = 0; i < cutfiles_points.length; i++) { + if (cutfiles_points[i] > cutfiles_length) { + break; + } - p0 = i == 0 ? 0 : (int)(cutfiles_points[i - 1] * w1 / cutfiles_length); - p1 = (int)(cutfiles_points[i] * w1 / cutfiles_length); + p0 = i == 0 ? 0 : (int) (cutfiles_points[i - 1] * w1 / cutfiles_length); + p1 = (int) (cutfiles_points[i] * w1 / cutfiles_length); - if (i % 2 == 0) - { + if (i % 2 == 0) { g.setColor(new Color(150, 0, 0)); g.fillRect(x1 + p0, y1, p1 - p0, h1); } @@ -475,15 +851,22 @@ g.setColor(new Color(200, 100, 200)); g.fillRect(x1 + p1 - 1, y1 - 4, 2, h1 + 8); - int[] x = { x1 + p1 - 1, x1 + p1 - 5, x1 + p1 + 5 }; + // int[] x = { x1 + p1 - 1, x1 + p1 - 5, x1 + p1 + 5 }; int[] y = { y1 - 3, y1 - 3 - 5, y1 - 3 - 5 }; - g.fillPolygon(x, y, 3); + int[] x_1 = { x1 + p1 - 1, x1 + p1 - 1, x1 + p1 + 5 }; + int[] x_2 = { x1 + p1 + 1, x1 + p1 - 5, x1 + p1 + 1 }; + + if (i % 2 == 0) { + g.fillPolygon(x_1, y, 3); + } + else { + g.fillPolygon(x_2, y, 3); + } } - if ((cutfiles_points.length & 1) == 0) - { - p0 = (int)(cutfiles_points[cutfiles_points.length - 1] * w1 / cutfiles_length); + if ((cutfiles_points.length & 1) == 0) { + p0 = (int) (cutfiles_points[cutfiles_points.length - 1] * w1 / cutfiles_length); g.setColor(new Color(150, 0, 0)); g.fillRect(x1 + p0, y1, w1 - p0, h1); @@ -492,35 +875,111 @@ } /** + * paint position info + */ + private void paintPositionInfo(Graphics g) { + // int x1 = 10, y1 = 346, w1 = 492, h1 = 8; + int x1 = 10, y1 = previewImageSize.height + 30, w1 = previewImageSize.width - 22, h1 = 8; + + List positions = Common.getMpvDecoderClass().getPositions(); + + /** + * paint current position + */ + g.setColor(Color.white); + g.fillRect(x1, y1, 2, h1); // start + g.fillRect(x1 + w1, y1, 2, h1); // end + g.fillRect(x1, y1 + 3, w1, 2); // axis + + long pos; + long max = 1; + int mark; + + if (!positions.isEmpty()) { + max = ((Long) positions.get(positions.size() - 1)).longValue(); + + for (int i = 1, j = positions.size() - 1; i < j; i++) { + pos = ((Long) positions.get(i)).longValue(); + mark = (int) (pos * w1 / max); + g.fillRect(x1 + mark, y1, 2, h1); // mark + } + + pos = ((Long) positions.get(0)).longValue(); + mark = (int) (pos * w1 / max); + g.setColor(Color.red); + g.fillRect(x1 + mark, y1, 2, h1); // mark + } + + g.setFont(font_2); + g.setColor(Color.green); + + String str = Common.getMpvDecoderClass().getPidAndFileInfo(); + int sep1 = str.indexOf("-"); + int sep2 = sep1; + if (sep1 < 0) { + sep1 = sep2 = str.length(); + } + else { + sep1 -= 1; + sep2 += 2; + } + + g.drawString(str.substring(0, sep1), previewImageSize.width + 8, previewImageSize.height + 12); // pid + g.drawString(str.substring(sep2), previewImageSize.width + 8, previewImageSize.height - 2); // file + + // matrix + if (!isMatrixImageAvailable) { + return; + } + + for (int i = 0; i < matrix_table.length; i++) { + if (matrix_positions.containsKey(String.valueOf(i))) { + pos = ((Long) matrix_positions.get(String.valueOf(i))).longValue(); + mark = (int) (pos * w1 / max); + g.fillRect(x1 + mark, y1 + 4, 2, h1 - 4); // mark matrix + // position + } + } + + if (matrix_positions.containsKey(String.valueOf(matrix_index))) { + pos = ((Long) matrix_positions.get(String.valueOf(matrix_index))).longValue(); + mark = (int) (pos * w1 / max); + g.setColor(Color.magenta); + g.fillRect(x1 + mark, y1, 2, h1); // mark matrix position + } + } + + /** * paint chapter info */ - private void paintChapterInfo(Graphics g) - { - if (chapter_length <= 0) + private void paintChapterInfo(Graphics g) { + if (chapter_length <= 0) { return; + } - int x1 = 10, y1 = 327, w1 = 492, h1 = 6; + // int x1 = 10, y1 = 327, w1 = 492, h1 = 6; + int x1 = 10, y1 = previewImageSize.height + 22, w1 = previewImageSize.width - 22, h1 = 6; /** * paint chapter markers */ - if (chapter_points != null && chapter_points.length > 0) - { - int p0 = 0, p1 = 0; - - for (int i = 0; i < chapter_points.length; i++) - { - if (chapter_points[i] > chapter_length) - break; + if (chapter_points != null && chapter_points.length > 0) { + int p0 = 0; + int p1 = 0; + + for (int i = 0; i < chapter_points.length; i++) { + if (chapter_points[i] > chapter_length) { + break; + } - p0 = i == 0 ? 0 : (int)(chapter_points[i - 1] * w1 / chapter_length); - p1 = (int)(chapter_points[i] * w1 / chapter_length); + p0 = i == 0 ? 0 : (int) (chapter_points[i - 1] * w1 / chapter_length); + p1 = (int) (chapter_points[i] * w1 / chapter_length); g.setColor(new Color(195, 205, 255)); g.fillRect(x1 + p1 - 1, y1 - 4, 2, h1 + 8); int[] x = { x1 + p1 - 1, x1 + p1 - 5, x1 + p1 + 5 }; - int[] y = { y1 + h1 + 3, y1 + h1 + 3 + 5, y1 +h1 + 3 + 5 }; + int[] y = { y1 + h1 + 3, y1 + h1 + 3 + 5, y1 + h1 + 3 + 5 }; g.fillPolygon(x, y, 3); } @@ -528,17 +987,16 @@ } /** - * paint + * paint */ - private void paintOSDBg(Graphics g, int x3, int y3, int w3, int h3) - { + private void paintOSDBg(Graphics g, int x3, int y3, int w3, int h3) { Color blue_1 = new Color(150, 150, 255, 210); Color blue_2 = new Color(50, 20, 225, 210); Color red_1 = new Color(255, 150, 150, 210); Color red_2 = new Color(225, 20, 20, 210); g.setColor(isOSDErrorInfo ? red_1 : blue_1); - g.fillRect(x3, y3 + 20, w3, 220); + g.fillRect(x3, y3 + 20, w3, previewImageSize.height - 70); g.setColor(isOSDErrorInfo ? red_2 : blue_2); g.fillRect(x3, y3, w3, 20); @@ -546,21 +1004,21 @@ g.setColor(Color.white); g.drawLine(x3, y3 + 20, x3 + w3 - 1, y3 + 20); - g.drawLine(x3, y3 + 240, x3 + w3 - 1, y3 + 240); + g.drawLine(x3, y3 + previewImageSize.height - 50, x3 + w3 - 1, y3 + previewImageSize.height - 50); } /** * paint prescan file info */ - private void paintOSDInfo(Graphics g) - { - if (!isOSDInfoAvailable || OSDInfo == null || OSDInfo.length == 0) + private void paintOSDInfo(Graphics g) { + if (!isOSDInfoAvailable || OSDInfo == null || OSDInfo.length == 0) { return; + } - int x3 = 8; //15; + int x3 = 8; // 15; int y3 = 8; - int w3 = 496; //482; - int h3 = 240; + int w3 = previewImageSize.width - 18; // 482; + int h3 = previewImageSize.height - 50; int yOffset = 0; paintOSDBg(g, x3, y3, w3, h3); @@ -571,23 +1029,23 @@ yOffset = y3 + 24; - for (int i = 2; i < OSDInfo.length; i++) + for (int i = 2; i < OSDInfo.length; i++) { yOffset = paintSubInfo(g, OSDInfo[i].toString(), null, x3, yOffset); + } } - /** * paint prescan file info */ - private void paintFileInfo(Graphics g) - { - if (!showFileInfo) + private void paintFileInfo(Graphics g) { + if (!showFileInfo) { return; + } - int x3 = 8; //15; + int x3 = 8; // 15; int y3 = 8; - int w3 = 496; //482; - int h3 = 240; + int w3 = previewImageSize.width - 18; // 482; + int h3 = previewImageSize.height - 50; int yOffset = 0; Object[] obj; @@ -598,6 +1056,16 @@ g.drawString(streamInfo.getFileDate(), x3 + 6, y3 + h3 + 16); g.drawString(streamInfo.getFileSize(), x3 + 6, y3 + h3 + 30); + //thumbnail + if (isThumbnailAvailable) + { + g.setColor(Color.gray); + g.drawRect(x3 + w3 - 160 - 5, y3 + h3 - 90 - 5, 160 + 1, 90 + 1); + g.drawImage(thumb_image, x3 + w3 - 160 - 4, y3 + h3 - 90 - 4, this); + } + + g.setColor(Color.white); + yOffset = y3 + 24; yOffset = paintSubInfo(g, streamInfo.getFileType(), StreamTypeImage, x3, yOffset); @@ -620,12 +1088,9 @@ /** * line height = 16 */ - private int paintSubInfo(Graphics g, String str, Image icon, int x, int y) - { - if (str != null && str.length() > 0) - { - if (y > 230) - { + private int paintSubInfo(Graphics g, String str, Image icon, int x, int y) { + if (str != null && str.length() > 0) { + if (y > previewImageSize.height - 60) { g.fillPolygon(new int[] { x + 3, x + 17, x + 9 }, new int[] { y, y, y + 7 }, 3); g.drawString("...", x + 25, y + 6); return y; @@ -634,16 +1099,17 @@ int i = str.indexOf("\t"); int j = icon != null ? 25 : 10; - if (icon != null) + if (icon != null) { g.drawImage(icon, x + 2, y, this); + } - if (i >= 0) - { + if (i >= 0) { g.drawString(str.substring(i + 1), x + j + 120, y + 12); g.drawString(str.substring(0, i), x + j, y + 12); } - else + else { g.drawString(str, x + j, y + 12); + } y += 16; } @@ -654,47 +1120,83 @@ /** * */ - private int paintSubInfo(Graphics g, Object[] obj, Image icon, int x, int y) - { - if (obj != null && obj.length > 0) - { - for (int i = 0; i < obj.length; i++) + private int paintSubInfo(Graphics g, Object[] obj, Image icon, int x, int y) { + if (obj != null && obj.length > 0) { + for (int i = 0; i < obj.length; i++) { y = paintSubInfo(g, "" + (i + 1) + ". " + obj[i].toString(), icon, x, y); + } } return y; } - /** - * paint prescan file info + * paint prescan subpic info */ - private void paintSubpicture(Graphics g) - { - if (!isSubpictureAvailable) + private void paintSubpicture(Graphics g, Graphics2D g2) { + if (!isSubpictureAvailable) { return; + } - g.drawImage(SubpictureImage, 66, 2, this); + // if (!fullScaled) + g2.drawImage(SubpictureImage, 0, 0, previewImageSize.width, previewImageSize.height, this); + // else + // g.drawImage(SubpictureImage, 66, 0, this); } /** * */ - private void loadSubpicture() - { - SubpictureImage = !isSubpictureAvailable ? null : Common.getSubpictureClass().getScaledImage(); + private void loadSubpicture() { + SubpictureImage = !isSubpictureAvailable ? null : Common.getSubpictureClass().getScaledImage(previewImageSize.width, previewImageSize.height); + } + + /** + * + */ + public void setPreviewSize(int w, int h) { + + if (!Common.getSettings().getBooleanProperty(Keys.KEY_Preview_fullScaled)) + { + w = 512; + h = 288; + } + + if (w == imageSizeMin[0] && h == imageSizeMin[1]) + return; + + imageSizeMin[0] = w; + imageSizeMin[1] = h; + + Common.getMpvDecoderClass().setPreviewSize(w, h); + + source = new MemoryImageSource(imageSizeMin[0], imageSizeMin[1], Common.getMpvDecoderClass().getPreviewPixel(), 0, imageSizeMin[0]); + source.setAnimated(true); + image = createImage(source); + + source.newPixels(); + } /** * */ - public void setStreamInfo(StreamInfo _streamInfo) - { - streamInfo = _streamInfo.getNewInstance(); //betta to get a copy + public void setStreamInfo(StreamInfo _streamInfo) { + streamInfo = _streamInfo.getNewInstance(); // betta to get a copy showFileInfo = streamInfo != null; - if (showFileInfo && !Common.getSettings().getBooleanProperty(Keys.KEY_holdStreamInfoOnOSD)) + isThumbnailAvailable = showFileInfo && streamInfo.getThumbnail() != null && streamInfo.getThumbnail().length > 0; + + if (isThumbnailAvailable) + { + int[] thumb = streamInfo.getThumbnail(); + System.arraycopy(thumb, 0, thumb_image_array, 0, thumb.length); + thumb_source.newPixels(); + } + + if (showFileInfo && !Common.getSettings().getBooleanProperty(Keys.KEY_holdStreamInfoOnOSD)) { startClock(10000); + } isSubpictureAvailable = showFileInfo && streamInfo.getStreamType() == CommonParsing.ES_SUP_TYPE; loadSubpicture(); @@ -708,8 +1210,7 @@ /** * */ - public void setOSD(Object[] obj) - { + public void setOSD(Object[] obj) { isOSDErrorInfo = false; setOSDMessage(obj); } @@ -717,31 +1218,29 @@ /** * */ - public void setOSDMessage(String str, boolean b) - { + public void setOSDMessage(String str, boolean b) { isOSDErrorInfo = b; - setOSDMessage(new Object[]{ b ? "Fehler" : "Info", "", "", str }); + setOSDMessage(new Object[] { b ? "Fehler" : "Info", "", "", str }); } /** * */ - public void setOSDMessage(Object[] obj) - { + public void setOSDMessage(Object[] obj) { setOSDMessage(obj, false); } /** * */ - public void setOSDMessage(Object[] obj, boolean hold) - { + public void setOSDMessage(Object[] obj, boolean hold) { OSDInfo = obj; isOSDInfoAvailable = true; showFileInfo = false; - if (!hold) + if (!hold) { startClock(10000); + } repaint(); } @@ -749,8 +1248,7 @@ /** * */ - public void showCollectionNumber(int value) - { + public void showCollectionNumber(int value) { collection_number = value; startClock(); @@ -760,41 +1258,129 @@ /** * */ - public void updatePreviewPixel() - { + public Image getPreviewImage() { + return image; + } + + /** + * + */ + public void updatePreviewPixel() { source.newPixels(); } /** + * modify transparency + */ + public void setMixedPreviewPixel(int[] picture, int transparency) { + isMixedImageAvailable = picture != null && transparency > 0; + + mixed_image_info = isMixedImageAvailable ? "CutImage Mix Mode: " + transparency * 100 / 255 + "%" : ""; + + if (!isMixedImageAvailable) { + clearMixedImage(); + } + else { + for (int i = 0, j = mixed_image_array.length; i < j; i++) { + mixed_image_array[i] = 0xFFFFFF & picture[i] | transparency << 24; + } + } + + isMatrixImageAvailable = false; + + mixed_source.newPixels(); + } + + /** + * + */ + public void clearMixedImage() { + Arrays.fill(mixed_image_array, 0); + } + + /** + * modify matrix image + */ + public void setMatrixPreviewPixel(int index) { + isMatrixImageAvailable = true; + + Common.getMpvDecoderClass().getScaledCutMatrixImage(mixed_image_array, matrix_new_width, matrix_new_height, matrix_table[index][0], matrix_table[index][1]); + + mixed_source.newPixels(); + } + + /** + * get matrix + */ + public int[][] getMatrixTable() { + return matrix_table; + } + + /** + * set matrix pos + */ + public void setMatrixIndexPosition(int index, long value, String str) { + matrix_positions.put(String.valueOf(index), new Long(value)); // pos + matrix_positions.put(String.valueOf(index) + "TC", str); // TC + } + + /** + * set matrix pos + */ + public void setMatrixEndPosition(long value) { + matrix_positions.put("end", new Long(value)); + } + + /** + * set matrix pos + */ + public void resetMatrixPositions(long value) { + matrix_positions.clear(); + setMatrixEndPosition(value); + clearMixedImage(); + } + + /** + * set matrix + */ + public void disableMatrix() { + isMatrixImageAvailable = false; + } + + /** + * get filter mismatch + */ + public void setFilterStatus(boolean b) { + isFilterActive = b; + } + + /** * updates cut symbols in preview info field - * + * * @param1 - do_export bool * @param2 - cutpoints list array * @param3 - previewlist of files */ - public void showCutIcon(boolean play, Object[] obj, Object list) - { + public void showCutIcon(boolean play, Object[] obj, Object list) { PLAY = play; List previewList = (List) list; - if (!previewList.isEmpty()) - { + if (!previewList.isEmpty()) { cutfiles_length = ((PreviewObject) previewList.get(previewList.size() - 1)).getEnd(); - if (obj != null) - { + if (obj != null) { cutfiles_points = new long[obj.length]; - for (int i = 0; i < cutfiles_points.length; i++) + for (int i = 0; i < cutfiles_points.length; i++) { cutfiles_points[i] = CommonParsing.parseCutValue(obj[i].toString(), false); + } } - - else + else { cutfiles_points = null; + } } - else - { + else { cutfiles_length = 0; cutfiles_points = null; } @@ -804,33 +1390,30 @@ /** * updates chapter symbols in preview info field - * + * * @param1 - do_export bool * @param2 - chapterpoints list array * @param3 - previewlist of files */ - public void showChapterIcon(Object[] obj, Object list) - { + public void showChapterIcon(Object[] obj, Object list) { List previewList = (List) list; - if (!previewList.isEmpty()) - { + if (!previewList.isEmpty()) { chapter_length = ((PreviewObject) previewList.get(previewList.size() - 1)).getEnd(); - if (obj != null) - { + if (obj != null) { chapter_points = new long[obj.length]; - for (int i = 0; i < chapter_points.length; i++) + for (int i = 0; i < chapter_points.length; i++) { chapter_points[i] = CommonParsing.parseCutValue(obj[i].toString(), false); + } } - - else + else { chapter_points = null; + } } - else - { + else { chapter_length = 0; chapter_points = null; } @@ -841,111 +1424,106 @@ /** * performs YUV to RGB conversion */ - private int YUVtoRGB(int YUV) - { - int T = 0xFF; - int Y = 0xFF & YUV>>>16; - int Cb = 0xFF & YUV>>>8; + private int YUVtoRGB(int YUV) { + int T = 0xFF; + int Y = 0xFF & YUV >>> 16; + int Cb = 0xFF & YUV >>> 8; int Cr = 0xFF & YUV; - if (Y == 0) + if (Y == 0) { return 0; + } - int R = (int)((float)Y +1.402f * (Cr - 128)); - int G = (int)((float)Y -0.34414 * (Cb - 128) -0.71414 * (Cr - 128)); - int B = (int)((float)Y +1.722 * (Cb - 128)); - - R = R < 0 ? 0 : (R > 0xFF ? 0xFF : R); - G = G < 0 ? 0 : (G > 0xFF ? 0xFF : G); - B = B < 0 ? 0 : (B > 0xFF ? 0xFF : B); + int R = (int) (Y + 1.402f * (Cr - 128)); + int G = (int) (Y - 0.34414 * (Cb - 128) - 0.71414 * (Cr - 128)); + int B = (int) (Y + 1.722 * (Cb - 128)); + + R = R < 0 ? 0 : R > 0xFF ? 0xFF : R; + G = G < 0 ? 0 : G > 0xFF ? 0xFF : G; + B = B < 0 ? 0 : B > 0xFF ? 0xFF : B; - return (T<<24 | R<<16 | G<<8 | B); + return T << 24 | R << 16 | G << 8 | B; } /** * BMP 24-bit header */ - private byte bmpHead[] = { - 0x42, 0x4D, //'B','M' - 0, 0, 0, 0, // real filesize 32bit, little endian (real size*3 + header(0x36)) - 0, 0, 0, 0, - 0x36, 0, 0, 0, //bitmap info size - 0x28, 0, 0, 0, - 0, 0, 0, 0, //hsize - 0, 0, 0, 0, //vsize - 1, 0, //nplane - 0x18, 0, //bitcount 24b - 0, 0, 0, 0, //ncompr - 0, 0, 0, 0, //image bytesize - (byte)0x88, 0xB, 0, 0, //nxpm - (byte)0x88, 0xB, 0, 0, //nypm - 0, 0, 0, 0, //nclrused, - 0, 0, 0, 0 //nclrimp + private byte bmpHead[] = { 0x42, 0x4D, // 'B','M' + 0, 0, 0, 0, // real filesize 32bit, little endian (real size*3 + + // header(0x36)) + 0, 0, 0, 0, 0x36, 0, 0, 0, // bitmap info size + 0x28, 0, 0, 0, 0, 0, 0, 0, // hsize + 0, 0, 0, 0, // vsize + 1, 0, // nplane + 0x18, 0, // bitcount 24b + 0, 0, 0, 0, // ncompr + 0, 0, 0, 0, // image bytesize + (byte) 0x88, 0xB, 0, 0, // nxpm + (byte) 0x88, 0xB, 0, 0, // nypm + 0, 0, 0, 0, // nclrused, + 0, 0, 0, 0 // nclrimp }; /** * performs change of byte order - * + * * @param1 - source byte array * @param2 - array position * @param3 - source int value */ - private void littleEndian(byte[] array, int aPos, int value) - { - for (int a = 0; a < 4; a++) - array[aPos + a] = (byte)(value>>(a * 8) & 0xFF); + private void littleEndian(byte[] array, int aPos, int value) { + for (int i = 0; i < 4; i++) { + array[aPos + i] = (byte) (value >> (i << 3) & 0xFF); + } } /** * */ private double[] aspectratio_table = { - 1.3333, 1.3333, 1.3333, 1.7778, 2.2100, 1.3333, 1.3333, 1.3333, - 1.3333, 1.3333, 1.3333, 1.3333, 1.3333, 1.3333, 1.3333, 1.3333 + 1.3333, 1.3333, 1.3333, 1.7778, 2.2100, + 1.3333, 1.3333, 1.3333, 1.3333, 1.3333, + 1.3333, 1.3333, 1.3333, 1.3333, 1.3333, 1.3333 }; /** * saves cached preview source picture as BMP - * + * * @param1 - automatic saving (demux mode - panel option) * @param2 - if GUI is not visible, don't update */ - private void saveBMP(int[] pixels, int horizontal_size, int vertical_size, int aspectratio_index, boolean useAspectRatio) - { + private void saveBMP(int[] pixels, int horizontal_size, int vertical_size, int aspectratio_index, boolean useAspectRatio) { int[] sourcepixel = null; int source_mb_width = (0xF & horizontal_size) != 0 ? (horizontal_size & ~0xF) + 16 : horizontal_size; - if (useAspectRatio) - { + if (useAspectRatio) { sourcepixel = getScaledPixel(pixels, horizontal_size, vertical_size, aspectratio_table[aspectratio_index]); - if (sourcepixel == null) + if (sourcepixel == null) { sourcepixel = pixels; - - else - { + } + else { horizontal_size = (int) Math.round(aspectratio_table[aspectratio_index] * vertical_size); source_mb_width = horizontal_size; } } - - else + else { sourcepixel = pixels; - + } int size = horizontal_size * vertical_size; - if (size <= 0) + if (size <= 0) { return; + } X_JFileChooser chooser = CommonGui.getMainFileChooser(); - if (bmpCount == 0) - { - //suggest the current collection directory + if (bmpCount == 0) { + // suggest the current collection directory } - String newfile = chooser.getCurrentDirectory() + System.getProperty("file.separator") + "X_picture[" + bmpCount + "].bmp"; + String newfile = chooser.getCurrentDirectory() + System.getProperty("file.separator") + "X_picture(" + bmpCount + ").bmp"; chooser.setSelectedFile(new File(newfile)); chooser.rescanCurrentDirectory(); @@ -953,49 +1531,52 @@ int retval = chooser.showSaveDialog(this); - if(retval == JFileChooser.APPROVE_OPTION) - { + if (retval == JFileChooser.APPROVE_OPTION) { File theFile = chooser.getSelectedFile(); - if (theFile != null && !theFile.isDirectory()) + if (theFile != null && !theFile.isDirectory()) { newfile = theFile.getAbsolutePath(); + } } - - else + else { return; - + } byte[] bmp24 = new byte[3]; - //int source_mb_width = (0xF & horizontal_size) != 0 ? (horizontal_size & ~0xF) + 16 : horizontal_size; - int padding = (horizontal_size & 3) != 0 ? (horizontal_size & 3) : 0; - - size = (horizontal_size * vertical_size * 3) + (padding > 0 ? (padding * vertical_size) : 0); + // int source_mb_width = (0xF & horizontal_size) != 0 ? (horizontal_size + // & ~0xF) + 16 : horizontal_size; + int padding = (horizontal_size & 3) != 0 ? horizontal_size & 3 : 0; + + size = horizontal_size * vertical_size * 3 + (padding > 0 ? padding * vertical_size : 0); littleEndian(bmpHead, 2, (54 + size)); littleEndian(bmpHead, 18, horizontal_size); littleEndian(bmpHead, 22, vertical_size); littleEndian(bmpHead, 34, size); - try - { + try { BufferedOutputStream BMPfile = new BufferedOutputStream(new FileOutputStream(newfile), 2048000); BMPfile.write(bmpHead); - for (int a = vertical_size - 1; a >= 0; a--) - { - for (int b = 0, pixel = 0; b < horizontal_size; b++) - { - pixel = YUVtoRGB(sourcepixel[b + (a * source_mb_width)]); + byte[] padding_bytes = new byte[padding]; + + for (int a = vertical_size - 1, tmp1; a >= 0; a--) { + tmp1 = a * source_mb_width; + + for (int b = 0, pixel = 0; b < horizontal_size; b++) { + pixel = YUVtoRGB(sourcepixel[b + tmp1]); - for (int c = 0; c < 3; c++) - bmp24[c] = (byte)(pixel >>(c * 8) & 0xFF); + for (int c = 0; c < 3; c++) { + bmp24[c] = (byte) (pixel >> (c << 3) & 0xFF); + } BMPfile.write(bmp24); } - if (padding > 0) - BMPfile.write(new byte[padding]); + if (padding > 0) { + BMPfile.write(padding_bytes); + } } BMPfile.flush(); @@ -1004,43 +1585,43 @@ bmpCount++; } - catch (Exception e) - { + catch (Exception e) { Common.setExceptionMessage(e); } } /** - * create new cutimage pixel data - * jdk122 seems to have a problem when it does multiplication !! + * create new cutimage pixel data jdk122 seems to have a problem when it + * does multiplication !! */ - private int[] getScaledPixel(int[] pixels, int horizontal_size, int vertical_size, double aspectratio) - { + private int[] getScaledPixel(int[] pixels, int horizontal_size, int vertical_size, double aspectratio) { int source_height = vertical_size; int source_width = horizontal_size; int source_mb_width = (0xF & horizontal_size) != 0 ? (horizontal_size & ~0xF) + 16 : horizontal_size; int new_height = vertical_size; - int new_width = ((int) Math.round(vertical_size * aspectratio)); + int new_width = (int) Math.round(vertical_size * aspectratio); int new_size = new_width * new_height; // oversized or zero ? - if (new_size > 0x1000000 || new_size <= 0) + if (new_size > 0x1000000 || new_size <= 0) { return null; + } float Y = 0; float X = 0; - double decimate_height = (double)source_height / new_height; - double decimate_width = (double)source_width / new_width; + double decimate_height = (double) source_height / new_height; + double decimate_width = (double) source_width / new_width; int[] new_image = new int[new_size]; - for (int y = 0; Y < source_height && y < new_height; Y += decimate_height, y++, X = 0) - for (int x = 0; X < source_width && x < new_width; X += decimate_width, x++) - new_image[x + (y * new_width)] = pixels[(int)X + ((int)Y * source_mb_width)]; + for (int y = 0; Y < source_height && y < new_height; Y += decimate_height, y++, X = 0) { + for (int x = 0; X < source_width && x < new_width; X += decimate_width, x++) { + new_image[x + y * new_width] = pixels[(int) X + (int) Y * source_mb_width]; + } + } return new_image; } - } \ No newline at end of file diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/PlayerFrame.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/PlayerFrame.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/PlayerFrame.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/PlayerFrame.java 2008-09-06 17:06:38.000000000 +0000 @@ -0,0 +1,272 @@ +/* + * @(#)PlayerFrame + * + * Copyright (c) 2008 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + +package net.sourceforge.dvb.projectx.gui; + +import java.awt.Image; +import java.awt.image.MemoryImageSource; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.KeyEvent; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JMenuBar; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.KeyStroke; +import javax.swing.UIManager; + +import net.sourceforge.dvb.projectx.gui.CommonGui; + +import net.sourceforge.dvb.projectx.common.Resource; +import net.sourceforge.dvb.projectx.common.Common; + + + +public class PlayerFrame extends JFrame { + + String title = "Player"; + + private Picture picture; + private int width = 0; + private int height = 0; + private int x = 200; + private int y = 100; + + /** + * + */ + public PlayerFrame() + { + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) + { + close(); + } + }); + + buildMenu(); + + getContentPane().add("Center", picture = new Picture()); + + setTitle(title); + setLocation(x, y); + setBounds2(width, height); + setResizable(false); + + UIManager.addPropertyChangeListener(new UISwitchListener(getRootPane())); + } + + /** + * + */ + public void setFrameTitle(String newtitle) + { + setTitle(title + " " + newtitle); + } + + /** + * + */ + public void setBounds2(int w, int h) + { + setBounds(getX(), getY(), w + 6, h + 45); + setFrameTitle(" " + w + " * " + h); + } + + /** + * + */ + public void repaintPicture() + { + repaintPicture(0); + } + + /** + * + */ + public void repaintPicture(int hide) + { + if (!isVisible()) + { + if (hide == 1) + return; + + setVisible(true); + toFront(); + } + + int w = Common.getMpvDecoderClass().getWidth(); + int h = Common.getMpvDecoderClass().getHeight(); + + if (w != width || h != height) + { + width = w; + height = h; + setBounds2(width, height); + picture.setSize(); + } + + picture.updateImage(); + } + + /** + * + */ + public void close() + { + dispose(); + } + + /** + * + */ + protected void buildMenu() + { + JMenuBar menuBar = new JMenuBar(); + + menuBar.add(buildFileMenu()); + + setJMenuBar(menuBar); + } + + /** + * + */ + protected JMenu buildFileMenu() + { + JMenu fileMenu = new JMenu(); + CommonGui.localize(fileMenu, "Common.File"); + + JMenuItem close = new JMenuItem(); + CommonGui.localize(close, "Common.Close"); + close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); + close.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + close(); + } + }); + + fileMenu.add(close); + + return fileMenu; + } + + /** + * + */ + public class Picture extends JPanel { + + private MemoryImageSource source; + private Image image; + private int[] image_data; + + + /** + * + */ + public Picture() + { + setBackground(Color.gray); + + setSize(); + } + + /** + * performs YUV to RGB conversion + */ + private int YUVtoRGB(int YUV) + { + int T = 0xFF; + int Y = 0xFF & YUV>>>16; + int Cb = 0xFF & YUV>>>8; + int Cr = 0xFF & YUV; + + if (Y == 0) + return 0xFF000000; + + int R = (int)((float)Y +1.402f * (Cr-128)); + int G = (int)((float)Y -0.34414 * (Cb-128) -0.71414 * (Cr-128)); + int B = (int)((float)Y +1.722 * (Cb-128)); + + R = R < 0 ? 0 : (R > 0xFF ? 0xFF : R); + G = G < 0 ? 0 : (G > 0xFF ? 0xFF : G); + B = B < 0 ? 0 : (B > 0xFF ? 0xFF : B); + + return (T<<24 | R<<16 | G<<8 | B); + } + + /** + * + */ + public void setSize() + { + setPreferredSize(new Dimension(width, height)); + setMinimumSize(new Dimension(width, height)); + setMaximumSize(new Dimension(width, height)); + + image_data = new int[width * height]; + source = new MemoryImageSource(width, height, image_data, 0, width); + source.setAnimated(true); + image = createImage(source); + } + + /** + * + */ + public void updateImage() + { + int[] p = Common.getMpvDecoderClass().getPixels(); + + for (int i = 0, j = image_data.length; i < j; i++) + image_data[i] = YUVtoRGB(p[i]); + + source.newPixels(); + } + + /** + * + */ + public void paint(Graphics g) + { + if (image != null) + g.drawImage(image, 0, 0, this); + } + + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/PreSettings.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/PreSettings.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/PreSettings.java 2006-03-29 00:50:12.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/PreSettings.java 2011-03-13 08:52:02.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)PreSettings.java * - * Copyright (c) 2005-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -104,7 +104,7 @@ getContentPane().add(container); setTitle(title); - setBounds(200, 100, 720, 400); + setBounds(200, 100, 720, 480); setResizable(false); UIManager.addPropertyChangeListener(new UISwitchListener(getRootPane())); @@ -165,7 +165,7 @@ JMenuItem close = new JMenuItem(); CommonGui.localize(close, "Common.Close"); - close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); + close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -249,20 +249,23 @@ idPanel3.setBorder( BorderFactory.createTitledBorder(Resource.getString("SpecialPanel.Title1")) ); String[][] objects = { + Keys.KEY_VOB_resetPts, Keys.KEY_PVA_FileOverlap, Keys.KEY_PVA_Audio, - Keys.KEY_VOB_resetPts, Keys.KEY_TS_ignoreScrambled, Keys.KEY_TS_blindSearch, Keys.KEY_TS_joinPackets, Keys.KEY_TS_HumaxAdaption, Keys.KEY_TS_FinepassAdaption, + Keys.KEY_TS_JepssenAdaption, + Keys.KEY_TS_KoscomAdaption, + //Keys.KEY_TS_ArionAdaption, Keys.KEY_TS_generatePmt, Keys.KEY_TS_generateTtx, Keys.KEY_TS_setMainAudioAc3 }; - for (int i = 0; i < objects.length; i++) + for (int i = 0, padd_offs = 2; i < objects.length; i++) { JCheckBox box = new JCheckBox(Resource.getString(objects[i][0])); box.setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); @@ -272,8 +275,8 @@ box.setSelected(Common.getSettings().getBooleanProperty(objects[i])); box.addActionListener(_CheckBoxListener); - if (i == 2 || i == 3) - idPanel3.add(Box.createRigidArea(new Dimension(1, 10))); + // if (i == padd_offs) + // idPanel3.add(Box.createRigidArea(new Dimension(1, 8))); idPanel3.add(box); } @@ -317,10 +320,13 @@ String[][] objects_2 = { Keys.KEY_Input_getEnclosedPackets, Keys.KEY_Input_concatenateForeignRecords, + Keys.KEY_Input_useReadOverhead, Keys.KEY_Audio_ignoreErrors, Keys.KEY_Audio_limitPts, + Keys.KEY_Audio_allowFormatChanges, Keys.KEY_Video_ignoreErrors, - Keys.KEY_Video_trimPts + Keys.KEY_Video_trimPts, + Keys.KEY_Video_cutPts }; for (int i = 0; i < objects_2.length; i++) @@ -333,13 +339,13 @@ box.setSelected(Common.getSettings().getBooleanProperty(objects_2[i])); box.addActionListener(_CheckBoxListener); - if (i == 2 || i == 4) - idPanel2.add(Box.createRigidArea(new Dimension(1, 10))); + if (i == 3 || i == 6) + idPanel2.add(Box.createRigidArea(new Dimension(1, 2))); idPanel2.add(box); } - idPanel2.add(Box.createRigidArea(new Dimension(1, 10))); + //idPanel2.add(Box.createRigidArea(new Dimension(1, 4))); idPanel2.add(new JLabel(Resource.getString("SpecialPanel.Conversion"))); @@ -419,6 +425,8 @@ Keys.KEY_Streamtype_Vbi, Keys.KEY_WriteOptions_writeVideo, Keys.KEY_WriteOptions_writeAudio, + Keys.KEY_OptionHorizontalResolution, + Keys.KEY_OptionDAR, Keys.KEY_additionalOffset, Keys.KEY_ExportPanel_Export_Overlap }; @@ -459,7 +467,7 @@ JPanel sp2 = new JPanel(); sp2.setLayout(new BoxLayout(sp2, BoxLayout.X_AXIS)); - sp2.add(box[11]); + sp2.add(box[13]); sp2.add(overlap); op1.add(sp2); @@ -513,6 +521,51 @@ op4.add(box[8]); op4.add(box[9]); + op4.add(Box.createRigidArea(new Dimension(1, 5))); + + /** + * + */ + JPanel CL2 = new JPanel(); + CL2.setLayout(new BoxLayout(CL2, BoxLayout.X_AXIS)); + + box[10].setPreferredSize(new Dimension(110, 20)); + box[10].setMaximumSize(new Dimension(110, 20)); + CL2.add(box[10]); + + + JComboBox combobox_34 = new JComboBox(Keys.ITEMS_ExportHorizontalResolution); + combobox_34.setMaximumRowCount(7); + combobox_34.setPreferredSize(new Dimension(90, 20)); + combobox_34.setMaximumSize(new Dimension(90, 20)); + combobox_34.setActionCommand(Keys.KEY_ExportHorizontalResolution[0]); + combobox_34.setEditable(true); + combobox_34.setSelectedItem(Common.getSettings().getProperty(Keys.KEY_ExportHorizontalResolution)); + combobox_34.addActionListener(_ComboBoxItemListener); + CL2.add(combobox_34); + + op4.add(CL2); + + /** + * + */ + JPanel CL3 = new JPanel(); + CL3.setLayout(new BoxLayout(CL3, BoxLayout.X_AXIS)); + + box[11].setPreferredSize(new Dimension(80, 20)); + box[11].setMaximumSize(new Dimension(80, 20)); + CL3.add(box[11]); + + JComboBox combobox_24 = new JComboBox(Keys.ITEMS_ExportDAR); + combobox_24.setMaximumRowCount(7); + combobox_24.setPreferredSize(new Dimension(120, 20)); + combobox_24.setMaximumSize(new Dimension(120, 20)); + combobox_24.setActionCommand(Keys.KEY_ExportDAR[0]); + combobox_24.setSelectedIndex(Common.getSettings().getIntProperty(Keys.KEY_ExportDAR)); + combobox_24.addActionListener(_ComboBoxIndexListener); + CL3.add(combobox_24); + + op4.add(CL3); exportPanel.add(op4); @@ -523,7 +576,7 @@ JPanel op7 = new JPanel(); op7.setLayout(new BoxLayout(op7, BoxLayout.X_AXIS)); - op7.add(box[10]); + op7.add(box[12]); JTextField offset_value = new JTextField(Common.getSettings().getProperty(Keys.KEY_ExportPanel_additionalOffset_Value)); offset_value.setPreferredSize(new Dimension(80, 22)); @@ -770,6 +823,8 @@ Keys.KEY_ExternPanel_renameAudio, Keys.KEY_ExternPanel_renameVideo, Keys.KEY_ExternPanel_appendExtension, + Keys.KEY_ExternPanel_appendPidToFileName, + Keys.KEY_ExternPanel_appendLangToFileName, Keys.KEY_ExternPanel_createM2sIndex, Keys.KEY_ExternPanel_createInfoIndex, Keys.KEY_ExternPanel_createD2vIndex, @@ -779,7 +834,7 @@ JCheckBox[] box = new JCheckBox[objects.length]; - for (int i = 0; i < objects.length; i++) + for (int i = 0, j = 12; i < objects.length; i++) { box[i] = new JCheckBox(Resource.getString(objects[i][0])); box[i].setPreferredSize(new Dimension(270, 20)); @@ -789,12 +844,12 @@ box[i].setSelected(Common.getSettings().getBooleanProperty(objects[i])); box[i].addActionListener(_CheckBoxListener); - if (i == 10) + if (i == j) box[i].setEnabled(false); } // left grid - for (int i = 0; i < 7; i++) + for (int i = 0; i < 9; i++) video2Panel.add(box[i]); video2.add(video2Panel); @@ -809,20 +864,20 @@ video3Panel.add(new JLabel(Resource.getString("ExternPanel.createM2sIndex"))); // right grid - video3Panel.add(box[7]); + video3Panel.add(box[9]); video3Panel.add(Box.createRigidArea(new Dimension(1, 10))); video3Panel.add(new JLabel(Resource.getString("ExternPanel.createInfoLabel"))); - video3Panel.add(box[8]); + video3Panel.add(box[10]); video3Panel.add(Box.createRigidArea(new Dimension(1, 10))); video3Panel.add(new JLabel(Resource.getString("ExternPanel.createD2vIndex"))); // right grid - for (int i = 9; i < objects.length; i++) + for (int i = 11; i < objects.length; i++) video3Panel.add(box[i]); JTextField d2v_splitsize = new JTextField(Common.getSettings().getProperty(Keys.KEY_ExternPanel_ProjectFileSplitSize)); @@ -857,15 +912,15 @@ audio0.setLayout( new ColumnLayout() ); audio0.setBorder( BorderFactory.createTitledBorder(Resource.getString("AudioPanel.Title1")) ); - audio0.add(new JLabel(Resource.getString("AudioPanel.loslessMpaConversion.Tip1"))); - audio0.add(new JLabel(Resource.getString("AudioPanel.loslessMpaConversion.Tip2"))); - audio0.setToolTipText(Resource.getString("AudioPanel.loslessMpaConversion.Tip")); + audio0.add(new JLabel(Resource.getString("AudioPanel.losslessMpaConversion.Tip1"))); + audio0.add(new JLabel(Resource.getString("AudioPanel.losslessMpaConversion.Tip2"))); + audio0.setToolTipText(Resource.getString("AudioPanel.losslessMpaConversion.Tip")); - JComboBox conversion_selection = new JComboBox(Keys.ITEMS_loslessMpaConversionMode); + JComboBox conversion_selection = new JComboBox(Keys.ITEMS_losslessMpaConversionMode); conversion_selection.setPreferredSize(new Dimension(270, 20)); conversion_selection.setMaximumSize(new Dimension(270, 20)); - conversion_selection.setActionCommand(Keys.KEY_AudioPanel_loslessMpaConversionMode[0]); - conversion_selection.setSelectedIndex(Common.getSettings().getIntProperty(Keys.KEY_AudioPanel_loslessMpaConversionMode)); + conversion_selection.setActionCommand(Keys.KEY_AudioPanel_losslessMpaConversionMode[0]); + conversion_selection.setSelectedIndex(Common.getSettings().getIntProperty(Keys.KEY_AudioPanel_losslessMpaConversionMode)); conversion_selection.addActionListener(_ComboBoxIndexListener); audio0.add(conversion_selection); @@ -884,12 +939,13 @@ Keys.KEY_AudioPanel_clearCRC, Keys.KEY_AudioPanel_fillGapsWithLastFrame, Keys.KEY_AudioPanel_addFrames, - Keys.KEY_AudioPanel_patch1stAc3Header, - Keys.KEY_AudioPanel_replaceAc3withSilence, Keys.KEY_AudioPanel_allowSpaces, Keys.KEY_AudioPanel_addRiffToMpgAudio, Keys.KEY_AudioPanel_addRiffToMpgAudioL3, Keys.KEY_AudioPanel_addRiffToAc3, + Keys.KEY_AudioPanel_AC3_patch1stHeader, + Keys.KEY_AudioPanel_AC3_replaceWithSilence, + Keys.KEY_AudioPanel_AC3_BitrateAdaption, Keys.KEY_AudioPanel_createDDWave }; @@ -1006,7 +1062,7 @@ for (int i = 7; i < objects.length; i++) { - if (i == 14 || i == 17) + if (i == 12 || i == 15 || i == 18) audio1.add(Box.createRigidArea(new Dimension(1, 10))); audio1.add(box[i]); @@ -1020,22 +1076,22 @@ if (str.equals(Keys.KEY_AudioPanel_addRiffToMpgAudioL3[0]) && checkBox.isSelected()) { - box[15].setSelected(false); + box[12].setSelected(false); Common.getSettings().setBooleanProperty(Keys.KEY_AudioPanel_addRiffToMpgAudio[0], false); return; } else if (str.equals(Keys.KEY_AudioPanel_addRiffToMpgAudio[0]) && checkBox.isSelected()) { - box[16].setSelected(false); + box[13].setSelected(false); Common.getSettings().setBooleanProperty(Keys.KEY_AudioPanel_addRiffToMpgAudioL3[0], false); return; } } }; - box[15].addActionListener(al_2); - box[16].addActionListener(al_2); + box[12].addActionListener(al_2); + box[13].addActionListener(al_2); audio.add(audio0); audio.add(audio1); @@ -1056,14 +1112,18 @@ panel_0.setBorder( BorderFactory.createTitledBorder(Resource.getString("SubtitlePanel.Title.Teletext")) ); String[][] objects = { - Keys.KEY_SubtitlePanel_decodeMegaradio, + //Keys.KEY_SubtitlePanel_decodeMegaradio, Keys.KEY_SubtitlePanel_decodeHiddenRows, Keys.KEY_SubtitlePanel_rebuildPTS, + Keys.KEY_SubtitlePanel_rebuildPictPTS, Keys.KEY_SubtitlePanel_keepOriginalTimecode, + Keys.KEY_SubtitlePanel_TtxExportBoxedOnly, Keys.KEY_SubtitlePanel_exportTextAsUnicode, Keys.KEY_SubtitlePanel_exportTextAsUTF8, Keys.KEY_SubtitlePanel_useTextOutline, - Keys.KEY_SubtitlePanel_specialTermination + Keys.KEY_SubtitlePanel_useTextAlignment, + Keys.KEY_SubtitlePanel_keepColourTable, + Keys.KEY_SubtitlePanel_exportAsVobSub }; final JCheckBox[] box = new JCheckBox[objects.length]; @@ -1079,12 +1139,8 @@ box[i].addActionListener(_CheckBoxListener); } - panel_0.add(box[0]); - panel_0.add(box[1]); - panel_0.add(box[2]); - panel_0.add(box[3]); - panel_0.add(box[4]); - panel_0.add(box[5]); + for (int i = 0; i < 7; i++) + panel_0.add(box[i]); //toggle action ActionListener al = new ActionListener() { @@ -1095,25 +1151,25 @@ if (str.equals(Keys.KEY_SubtitlePanel_exportTextAsUnicode[0]) && checkBox.isSelected()) { - box[5].setSelected(false); + box[6].setSelected(false); Common.getSettings().setBooleanProperty(Keys.KEY_SubtitlePanel_exportTextAsUTF8[0], false); return; } else if (str.equals(Keys.KEY_SubtitlePanel_exportTextAsUTF8[0]) && checkBox.isSelected()) { - box[4].setSelected(false); + box[5].setSelected(false); Common.getSettings().setBooleanProperty(Keys.KEY_SubtitlePanel_exportTextAsUnicode[0], false); return; } } }; - box[4].addActionListener(al); box[5].addActionListener(al); + box[6].addActionListener(al); - panel_0.add(Box.createRigidArea(new Dimension(1, 10))); + // panel_0.add(Box.createRigidArea(new Dimension(1, 10))); JLabel page_decode = new JLabel(Resource.getString("SubtitlePanel.TtxPages")); page_decode.setToolTipText(Resource.getString("SubtitlePanel.TtxPages.Tip")); @@ -1213,11 +1269,13 @@ JPanel panel_1 = new JPanel(); panel_1.setLayout( new ColumnLayout() ); - panel_1.setBorder( BorderFactory.createTitledBorder(Resource.getString("SubtitlePanel.Title")) ); + // panel_1.setBorder( BorderFactory.createTitledBorder(Resource.getString("SubtitlePanel.Title")) ); + panel_1.setBorder( BorderFactory.createTitledBorder(Resource.getString("SubtitlePanel.Title.Teletext")) ); - panel_1.add(new JLabel(Resource.getString("SubtitlePanel.Title.Teletext"))); + // panel_1.add(new JLabel(Resource.getString("SubtitlePanel.Title.Teletext"))); - panel_1.add(box[6]); + panel_1.add(box[7]); + panel_1.add(box[8]); JPanel panel_1_2 = new JPanel(); panel_1_2.setLayout(new BoxLayout(panel_1_2, BoxLayout.X_AXIS)); @@ -1229,8 +1287,8 @@ panel_1_2.add(font); JComboBox font_list = new JComboBox(Common.getFonts()); - font_list.setPreferredSize(new Dimension(150, 22)); - font_list.setMaximumSize(new Dimension(150, 22)); + font_list.setPreferredSize(new Dimension(160, 22)); + font_list.setMaximumSize(new Dimension(160, 22)); font_list.setActionCommand(Keys.KEY_SubtitleFont[0]); font_list.setSelectedItem(Common.getSettings().getProperty(Keys.KEY_SubtitleFont)); font_list.addActionListener(_ComboBoxItemListener); @@ -1247,8 +1305,8 @@ panel_1_3.add(sup_label); JTextField subpicture_values = new JTextField(Common.getSettings().getProperty(Keys.KEY_SubtitlePanel_Format_SUP_Values)); - subpicture_values.setPreferredSize(new Dimension(190, 22)); - subpicture_values.setMaximumSize(new Dimension(190, 22)); + subpicture_values.setPreferredSize(new Dimension(200, 22)); + subpicture_values.setMaximumSize(new Dimension(200, 22)); subpicture_values.setToolTipText(Resource.getString(Keys.KEY_SubtitlePanel_Format_SUP_Values[0] + Keys.KEY_Tip)); subpicture_values.setEditable(true); subpicture_values.setActionCommand(Keys.KEY_SubtitlePanel_Format_SUP_Values[0]); @@ -1334,8 +1392,8 @@ panel_1.add(panel_2_3); panel_1.add(Box.createRigidArea(new Dimension(1, 10))); - panel_1.add(new JLabel("Test:")); - panel_1.add(box[7]); + panel_1.add(box[9]); + panel_1.add(box[10]); teletext.add(panel_1); @@ -1356,8 +1414,8 @@ String[][] objects = { Keys.KEY_dumpDroppedGop, - Keys.KEY_holdStreamInfoOnOSD, - Keys.KEY_additionalInputBuffer + Keys.KEY_additionalInputBuffer, + Keys.KEY_SubtitlePanel_enableHDSub }; JCheckBox[] box = new JCheckBox[objects.length]; @@ -1372,7 +1430,7 @@ box[i].setSelected(Common.getSettings().getBooleanProperty(objects[i])); box[i].addActionListener(_CheckBoxListener); - if (i < 2) + if (i < 1) op0.add(box[i]); } @@ -1389,24 +1447,54 @@ op0.add(new JLabel(Resource.getString("OptionPanel.StartPath"))); op0.add(start_path); + op0.add(Box.createRigidArea(new Dimension(1, 4))); + + JTextField keyset = new JTextField(); + keyset.setPreferredSize(new Dimension(250, 25)); + keyset.setToolTipText("type any key and its value, hit enter"); + keyset.setEditable(true); + keyset.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + String actName = e.getActionCommand(); + JTextField textfield = (JTextField) e.getSource(); + + String str = textfield.getText(); + int index = str.indexOf("="); + + if (index < 0) //show key and value + textfield.setText(str + "=" + Common.getSettings().getProperty(str)); + + else if (str.length() <= index + 1) // remove key + { + Common.getSettings().remove(str.substring(0, index)); + textfield.setText(""); + } + + else //set value of key + Common.getSettings().setProperty(str.substring(0, index), str.substring(index + 1)); + } + }); + + op0.add(new JLabel("settings key/value editor")); + op0.add(keyset); + option.add(op0); JPanel op2 = new JPanel(); op2.setLayout( new ColumnLayout() ); op2.setBorder( BorderFactory.createTitledBorder(Resource.getString("OptionPanel.Buffer.Title")) ); - op2.add(box[2]); + op2.add(box[1]); String[][] keys = { Keys.KEY_MainBuffer, - Keys.KEY_ScanBuffer, - Keys.KEY_PreviewBuffer + Keys.KEY_ScanBuffer }; Object[][] buffersizes = { { "10240000", "8192000", "7168000", "6144000", "5120000", "4096000", "3072000", "2048000", "1024000" }, { "384000", "512000", "1024000", "1536000", "2048000", "2560000", "3072000" }, - { "256000", "384000", "512000", "768000", "1024000", "1536000", "2048000", "2560000", "3072000" } }; for (int i = 0; i < keys.length; i++) @@ -1427,6 +1515,12 @@ op2.add(combobox); } + op2.add(Box.createRigidArea(new Dimension(1, 6))); + + op2.add(box[2]); + op2.add(new JLabel("takes more JavaVM memory!")); + op2.add(new JLabel("requires a restart of ProjectX")); + option.add(op2); return buildHeadPanel(option, Resource.getString("TabPanel.OptionPanel")); @@ -1684,6 +1778,15 @@ container.add(panel); } + JCheckBox box = new JCheckBox(Resource.getString(Keys.KEY_PostProcessCompletion[0])); + box.setToolTipText(Resource.getString(Keys.KEY_PostProcessCompletion[0] + Keys.KEY_Tip)); + box.setActionCommand(Keys.KEY_PostProcessCompletion[0]); + box.setSelected(Common.getSettings().getBooleanProperty(Keys.KEY_PostProcessCompletion)); + box.addActionListener(_CheckBoxListener); + + container.add(box); + + return buildHeadPanel(container, Resource.getString("TabPanel.PostCommandsPanel")); } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/ProcessWindow.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/ProcessWindow.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/ProcessWindow.java 2006-03-29 00:46:38.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/ProcessWindow.java 2009-01-22 18:43:36.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)ProcessWindow * - * Copyright (c) 2005-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -246,7 +246,7 @@ fileMenu.addSeparator(); JCheckBoxMenuItem closeOnEnd = new JCheckBoxMenuItem(Resource.getString(Keys.KEY_closeOnEnd[0])); - closeOnEnd.setToolTipText(Resource.getString(Keys.KEY_closeOnEnd[0]) + Keys.KEY_Tip); + closeOnEnd.setToolTipText(Resource.getString(Keys.KEY_closeOnEnd[0] + Keys.KEY_Tip)); closeOnEnd.setActionCommand(Keys.KEY_closeOnEnd[0]); closeOnEnd.setState(Common.getSettings().getBooleanProperty(Keys.KEY_closeOnEnd)); closeOnEnd.addActionListener(_BoxListener); @@ -254,8 +254,22 @@ fileMenu.add(closeOnEnd); fileMenu.addSeparator(); + JMenuItem kill = new JMenuItem(); + CommonGui.localize(kill, "Common.KillProcess"); + kill.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.ALT_MASK)); + kill.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + Common.killMainProcess(); + } + }); + + fileMenu.add(kill); + fileMenu.addSeparator(); + JMenuItem save = new JMenuItem(); CommonGui.localize(save, "Common.SaveAs"); + save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.ALT_MASK)); save.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -296,13 +310,14 @@ Keys.KEY_useAllCollections, Keys.KEY_ExportPanel_createSubDirNumber, Keys.KEY_ExportPanel_createSubDirName, + Keys.KEY_ExportPanel_createSubDirVdr, Keys.KEY_enablePostProcessing, Keys.KEY_simpleMPG, Keys.KEY_enhancedPES, - Keys.KEY_useAutoPidFilter + Keys.KEY_useGOPEditor }; - for (int i = 0; i < objects.length; i++) + for (int i = 0, sep_offs = 3; i < objects.length; i++) { JCheckBoxMenuItem box = new JCheckBoxMenuItem(Resource.getString(objects[i][0])); box.setToolTipText(Resource.getString(objects[i][0] + Keys.KEY_Tip)); @@ -310,32 +325,12 @@ box.setState(Common.getSettings().getBooleanProperty(objects[i])); box.addActionListener(_BoxListener); - if (i == 3 || i == 4 || i == 6 || i == 7) + if (i == sep_offs || i == sep_offs + 1 || i == sep_offs + 4 || i == sep_offs + 5 || i == sep_offs + 7) editMenu.addSeparator(); editMenu.add(box); } -/** - JMenu menu_2 = new JMenu(Resource.getString(Keys.KEY_OptionDAR[0])); - - Object[] objects_2 = Keys.ITEMS_ExportDAR; - ButtonGroup group = new ButtonGroup(); - - for (int i = 0; i < objects_2.length; i++) - { - JRadioButtonMenuItem box = new JRadioButtonMenuItem(objects_2[i].toString()); - box.setActionCommand(Keys.KEY_ExportDAR[0]); - box.setSelected(Common.getSettings().getIntProperty(Keys.KEY_ExportDAR) == i); - box.addActionListener(_BoxListener); - group.add(box); - - menu_2.add(box); - } - - editMenu.add(menu_2); -**/ - return editMenu; } @@ -395,6 +390,28 @@ preferencesMenu.add(preferences); + JMenuItem coll_preferences = new JMenuItem(); + coll_preferences.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)); + CommonGui.localize(coll_preferences, "General.CollectionProperties"); + coll_preferences.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + CommonGui.getCollectionProperties().open(Common.getCollection(), Common.getActiveCollection()); + } + }); + + preferencesMenu.add(coll_preferences); + + preferencesMenu.addSeparator(); + + JCheckBoxMenuItem priority = new JCheckBoxMenuItem(Resource.getString(Keys.KEY_ConversionModePriority[0])); + priority.setToolTipText(Resource.getString(Keys.KEY_ConversionModePriority[0] + Keys.KEY_Tip)); + priority.setActionCommand(Keys.KEY_ConversionModePriority[0]); + priority.setState(Common.getSettings().getBooleanProperty(Keys.KEY_ConversionModePriority)); + priority.addActionListener(_BoxListener); + + preferencesMenu.add(priority); + return preferencesMenu; } @@ -453,6 +470,8 @@ CommonParsing.setProcessPausing(!CommonParsing.isProcessPausing()); } + + focusToText(); } }); @@ -751,7 +770,7 @@ int val = Common.isRunningProcess() ? Common.getProcessedCollection() : Common.getActiveCollection(); if (last_coll != val) - collLabel.setText("Collection: " + (val < 0 ? "-" : String.valueOf(val))); + collLabel.setText("Collection: " + (val < 0 ? "-" : String.valueOf(val) + "/" + String.valueOf(Common.getCollectionListSize() - 1))); last_coll = val; } @@ -783,11 +802,11 @@ int index = Common.getSettings().getIntProperty(Keys.KEY_ConversionMode); - ActionListener _RadioListener = new ActionListener() { + ActionListener _BoxListener = new ActionListener() { public void actionPerformed(ActionEvent e) { - JRadioButton radio = (JRadioButton) e.getSource(); - String str = radio.getActionCommand(); + JCheckBox box = (JCheckBox) e.getSource(); + String str = box.getActionCommand(); for (int i = 0; i < objects.length; i++) { @@ -812,10 +831,10 @@ for (int i = 0; i < objects.length; i++) { - JRadioButton action = new JRadioButton(objects[i].toString()); + JCheckBox action = new JCheckBox(objects[i].toString()); action.setActionCommand(objects[i].toString()); action.setSelected(i == index); - action.addActionListener(_RadioListener); + action.addActionListener(_BoxListener); group.add(action); panel.add(action); @@ -823,14 +842,6 @@ panel.add(Box.createRigidArea(new Dimension(10, 1))); - JCheckBox priority = new JCheckBox(Resource.getString(Keys.KEY_ConversionModePriority[0])); - priority.setToolTipText(Resource.getString(Keys.KEY_ConversionModePriority[0] + Keys.KEY_Tip)); - priority.setActionCommand(Keys.KEY_ConversionModePriority[0]); - priority.setSelected(Common.getSettings().getBooleanProperty(Keys.KEY_ConversionModePriority)); - priority.addActionListener(_CheckBoxListener); - - panel.add(priority); - return panel; } @@ -976,7 +987,10 @@ TextArea.append(Common.getLineSeparator() + msg); - viewport.setViewPosition(new Point(0, TextArea.getHeight())); + // handle a crash + try { + viewport.setViewPosition(new Point(0, TextArea.getHeight())); + } catch (Exception e) {} } /** diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/ScanView.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/ScanView.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/ScanView.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/ScanView.java 2006-11-29 18:43:12.000000000 +0000 @@ -0,0 +1,243 @@ +/* + * @(#)CutView + * + * Copyright (c) 2005-2006 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.gui; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.image.MemoryImageSource; +import java.awt.Font; + +import java.util.Arrays; + +import javax.swing.JPanel; +import javax.swing.JSlider; + + +public class ScanView extends JPanel { + + private final int Top = 20; + private final int Bottom = 184; + + private int[] image_data; + + private int width = 160; + private int height = 90; + + private boolean matchingPoint = false; + + private boolean cut_top = true; + private boolean cut_bottom = false; + private boolean cut_match = false; + + private String string_bottom = "Next:"; + private String string_top = "Prev:"; + private String string_matchingpoint = ""; + + private String[] string_in_out = { " -IN- ", " -OUT- " }; + + private Image image_top; + private Image image_bottom; + + private MemoryImageSource source_top; + private MemoryImageSource source_bottom; + + private final Color BackgroundColor; + private final Color RedColor; + + private final Font font; + + /** + * + */ + public ScanView() + { + image_data = new int[width * height]; + + source_top = new MemoryImageSource(width, height, image_data, 0, width); + source_top.setAnimated(true); + image_top = createImage(source_top); + + source_bottom = new MemoryImageSource(width, height, image_data, 0, width); + source_bottom.setAnimated(true); + image_bottom = createImage(source_bottom); + + BackgroundColor = new Color(0, 35, 110); + RedColor = new Color(255, 100, 100); + + font = new Font("Tahoma", Font.PLAIN, 14); + + setLayout(new BorderLayout()); + add(buildScanViewPanel(), BorderLayout.SOUTH); + + setBackground(Color.black); + setVisible(true); + } + + + /** + * + */ + protected JPanel buildScanViewPanel() + { + JPanel panel = new JPanel(new BorderLayout()); + + JSlider scanSlider = new JSlider(); + scanSlider.setMaximum(100); + scanSlider.setMajorTickSpacing(10); + scanSlider.setMinorTickSpacing(1); + scanSlider.setPaintTicks(true); + scanSlider.setValue(50); + + panel.add(scanSlider, BorderLayout.SOUTH); + + return panel; + } + + /** + * + */ + public int getTop() + { + return Top; + } + + /** + * + */ + public int getBottom() + { + return Bottom; + } + + /** + * + */ + public void clearViews() + { + matchingPoint = false; + clearView(Top); + clearView(Bottom); + } + + /** + * + */ + public void clearView(int position) + { + Arrays.fill(image_data, 0xFF505050); + + updateView(position); + } + + /** + * + */ + public void updateView(int position) + { + updateView(position, null, -1); + } + + /** + * + */ + public void updateView(int position, Object[] object, int index) + { + if (position < 100) + { + source_top.newPixels(); + string_top = "Prev: " + (object != null ? "#" + index + " @ " + object[index] + string_in_out[index & 1] : "= Collection Begin"); + cut_top = object != null ? (index & 1) == 0 : (!matchingPoint ? !cut_bottom : false); + } + + else + { + source_bottom.newPixels(); + string_bottom = "Next: " + (object != null ? "#" + index + " @ " + object[index] + string_in_out[index & 1] : "= Collection End"); + cut_bottom = object != null ? (index & 1) == 0 : false; + } + + repaint(); + } + + /** + * + */ + public void setImage(int[] data, Object[] object, int index, int position) + { + if (data == null) + { + clearView(position); + return; + } + + System.arraycopy(data, 0, image_data, 0 , data.length); + + updateView(position, object, index); + } + + /** + * + */ + public void setMatchingPoint(boolean b, Object[] object, int index) + { + matchingPoint = b; + string_matchingpoint = matchingPoint ? "This: #" + index + " @ " + object[index] + string_in_out[index & 1] : ""; + cut_match = (index & 1) == 0; + } + + /** + * + */ + public void paint2(Graphics g) + { + g.setColor(BackgroundColor); + g.fillRect(0, 0, 900, 90); +/** + g.setFont(font); + + g.setColor(cut_top ? Color.green : RedColor); + g.drawRect(0, Top - 1, width - 1, height + 1); + g.drawString(string_top, 8, Top - 4); + + g.setColor(cut_bottom ? Color.green : RedColor); + g.drawRect(Bottom, Top - 1, width - 1, height + 1); + g.drawString(string_bottom, Bottom + 8, Top - 4); + + if (matchingPoint) + { + g.setColor(cut_match ? Color.green : RedColor); + g.drawString(string_matchingpoint, 8, Bottom - 21); + } + + g.drawImage(image_top, 0, Top, this); + g.drawImage(image_bottom, Bottom, Top, this); +**/ + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/SubpictureFrame.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/SubpictureFrame.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/SubpictureFrame.java 2005-12-17 22:23:50.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/SubpictureFrame.java 2009-09-12 18:14:32.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)SubpictureFrame * - * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -27,6 +27,7 @@ package net.sourceforge.dvb.projectx.gui; +import java.awt.Font; import java.awt.Image; import java.awt.Color; import java.awt.Graphics; @@ -38,6 +39,10 @@ import java.awt.event.WindowEvent; import java.awt.event.KeyEvent; +import java.io.File; +import java.util.ArrayList; + +import javax.swing.event.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.BorderFactory; @@ -48,19 +53,36 @@ import javax.swing.JMenuItem; import javax.swing.KeyStroke; import javax.swing.UIManager; +import javax.swing.JSlider; +import javax.swing.JLabel; +import javax.swing.JCheckBoxMenuItem; import net.sourceforge.dvb.projectx.gui.CommonGui; import net.sourceforge.dvb.projectx.common.Resource; import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.xinput.XInputFile; +import net.sourceforge.dvb.projectx.parser.CommonParsing; public class SubpictureFrame extends JFrame { String title = Resource.getString("subpicture.title"); + String info = ""; private Picture picture; + private JSlider slider; + + private ArrayList picture_indices = null; + private int picture_index = 0; + private byte[] picture_data = null; + private int[] color_table = null; + private int PreviewFlags = 0; + + private int horizontal_offset = 0; + private int vertical_offset = 0; + /** * */ @@ -75,10 +97,18 @@ buildMenu(); - getContentPane().add("Center", picture = new Picture()); + JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout()); + + panel.add(buildSizePanel(), BorderLayout.NORTH); + panel.add(picture = new Picture(), BorderLayout.CENTER); + panel.add(buildSliderPanel(), BorderLayout.SOUTH); + + getContentPane().add("Center", panel); setTitle(title); - setBounds(200, 100, 726, 621); + //setBounds(200, 0, 726, 726); + setBounds(200, 0, 726, 750); setResizable(false); UIManager.addPropertyChangeListener(new UISwitchListener(getRootPane())); @@ -87,24 +117,9 @@ /** * */ - public void setFrameTitle(String newtitle) - { - setTitle(title + " " + newtitle); - } - - /** - * - */ - public void repaintSubpicture() - { - picture.repaint(); - } - - /** - * - */ public void close() { + resetPreview(); dispose(); } @@ -128,9 +143,71 @@ JMenu fileMenu = new JMenu(); CommonGui.localize(fileMenu, "Common.File"); + final JCheckBoxMenuItem background = new JCheckBoxMenuItem("use Preview Picture as Background"); + background.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.CTRL_MASK)); + background.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + PreviewFlags = background.getState() ? PreviewFlags | 1 : PreviewFlags & ~1; + getPictureData(slider.getValue()); + } + }); + + fileMenu.add(background); + + final JCheckBoxMenuItem letterbox = new JCheckBoxMenuItem("use Letterbox"); + letterbox.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, ActionEvent.CTRL_MASK)); + letterbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + PreviewFlags = letterbox.getState() ? PreviewFlags | 2 : PreviewFlags & ~2; + getPictureData(slider.getValue()); + } + }); + + fileMenu.add(letterbox); + + final JCheckBoxMenuItem areabox = new JCheckBoxMenuItem("don't show Multiple Areas Boundaries"); + areabox.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK)); + areabox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + PreviewFlags = areabox.getState() ? PreviewFlags | 4 : PreviewFlags & ~4; + getPictureData(slider.getValue()); + } + }); + + fileMenu.add(areabox); + + final JCheckBoxMenuItem applyarea = new JCheckBoxMenuItem("don't apply Multiple Areas Replacements"); + applyarea.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK)); + applyarea.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + PreviewFlags = applyarea.getState() ? PreviewFlags | 8 : PreviewFlags & ~8; + getPictureData(slider.getValue()); + } + }); + + fileMenu.add(applyarea); + + final JCheckBoxMenuItem allopaque = new JCheckBoxMenuItem("paint all as Opaque"); + allopaque.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, ActionEvent.CTRL_MASK)); + allopaque.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + PreviewFlags = allopaque.getState() ? PreviewFlags | 0x10 : PreviewFlags & ~0x10; + getPictureData(slider.getValue()); + } + }); + + fileMenu.add(allopaque); + + fileMenu.addSeparator(); + JMenuItem close = new JMenuItem(); CommonGui.localize(close, "Common.Close"); - close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); + close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK)); close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -143,21 +220,291 @@ return fileMenu; } + /** + * + */ + protected JPanel buildSizePanel() + { + JPanel panel = new JPanel(); + //panel.setLayout(new BoxLayout()); + + final JSlider slider_h = new JSlider(); + slider_h.setMajorTickSpacing(32); + slider_h.setSnapToTicks(true); + slider_h.setMaximum(1920); + slider_h.setValue(0); + + slider_h.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) + { + horizontal_offset = slider_h.getValue(); + repaintSubpicture(); + } + }); + + panel.add(new JLabel("Preview X Offset: ")); + panel.add(slider_h); + + final JSlider slider_v = new JSlider(); + slider_v.setMajorTickSpacing(16); + slider_v.setSnapToTicks(true); + slider_v.setMaximum(1088); + slider_v.setValue(0); + + slider_v.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) + { + vertical_offset = slider_v.getValue(); + repaintSubpicture(); + } + }); + + panel.add(new JLabel("Preview Y Offset: ")); + panel.add(slider_v); + + return panel; + } + + /** + * + */ + protected JPanel buildSliderPanel() + { + JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout()); + + slider = new JSlider(); + slider.setMajorTickSpacing(1); + slider.setPaintTicks(true); + slider.setSnapToTicks(true); + slider.setMaximum(1); + slider.setValue(0); + + slider.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) + { + getPictureData(slider.getValue()); + } + }); + + panel.add(slider); + + return panel; + } + + /** + * + */ + public void setFrameTitle(String newtitle) + { + setTitle(title + " " + newtitle); + info = newtitle; + } + + /** + * + */ + public void loadPreview(XInputFile xif) + { + scanIFO(xif.toString()); + + if (scanData(xif)) + show(); + } + + /** + * + */ + public void resetPreview() + { + picture_indices = null; + picture_index = 0; + picture_data = null; + color_table = null; + info = ""; + slider.setMaximum(1); + slider.setValue(0); + } + + /** + * read colors from ifo (pjx auto generated) + */ + private void scanIFO(String ifoname) + { + try { + + String nifoname = ifoname + ".IFO"; + + File f = new File(nifoname); + + if (!f.exists()) + { + f = new File(ifoname.substring(0, ifoname.lastIndexOf(".")) + ".IFO"); + + if (!f.exists()) + { + color_table = null; + return; + } + } + + XInputFile xif = new XInputFile(f); + + byte[] data = new byte[64]; + color_table = new int[16]; + + xif.randomAccessSingleRead(data, 0x10B4); //read 16x 4bytes from pos 0x10B4 + + for (int i = 0, j = color_table.length; i < j; i++) + color_table[i] = YUVtoRGB(CommonParsing.getIntValue(data, i * 4, 4, !CommonParsing.BYTEREORDERING)); + + } catch (Exception e) { + + color_table = null; + + Common.setExceptionMessage(e); + } + } + + /** + * convert colors from ifo (pjx auto generated) + */ + private int YUVtoRGB(int values) + { + int Y = 0xFF & values>>16; + int Cr = 0xFF & values>>8; + int Cb = 0xFF & values; + + if (Y == 0) + return 0; + + int R = (int)((float)Y +1.402f * (Cr-128)); + int G = (int)((float)Y -0.34414 * (Cb-128) -0.71414 * (Cr-128)); + int B = (int)((float)Y +1.722 * (Cb-128)); + R = R < 0 ? 0 : (R > 0xFF ? 0xFF : R); + G = G < 0 ? 0 : (G > 0xFF ? 0xFF : G); + B = B < 0 ? 0 : (B > 0xFF ? 0xFF : B); + int T = 0xFF; + + return (T<<24 | R<<16 | G<<8 | B); + } + + /** + * + */ + private boolean scanData(XInputFile xif) + { + boolean b = false; + + picture_indices = new ArrayList(); + + try { + + if (!xif.exists()) + return b; + + picture_data = new byte[(int) xif.length()]; + info = xif.toString(); + + xif.randomAccessSingleRead(picture_data, 0); // read all + + long pts = 0; + for (int i = 0; i < picture_data.length; i++) + { + if (picture_data[i] != 0x53 || picture_data[i + 1] != 0x50) // header + continue; + + pts = CommonParsing.readPTS(picture_data, i + 2, 8, CommonParsing.BYTEREORDERING, false); + + picture_indices.add(new Long[] { new Long(i), new Long(CommonParsing.readPTS(picture_data, i + 2, 8, CommonParsing.BYTEREORDERING, false) / 90), null } ); + + i += 8; + } + + slider.setMaximum(picture_indices.size() - 1); + + } catch (Exception e) { + + slider.setMaximum(1); + + info = "file read error!"; + //Common.setExceptionMessage(e); + return b; + } + + slider.setValue(0); + + return !b; + } + + /** + * + */ + private void getPictureData(int index) + { + picture_index = index; + + if (picture_index < 0 || picture_indices == null || picture_index >= picture_indices.size()) + return; + + Long[] values = (Long[]) picture_indices.get(picture_index); + int pos = values[0].intValue(); //start pos + + + int length = picture_data.length - pos; + + if (picture_index + 1 < picture_indices.size()) + { + Long[] nvalues = (Long[]) picture_indices.get(picture_index + 1); + int npos = nvalues[0].intValue(); //start pos + + length = npos - pos; + } + + Common.getSubpictureClass().setColorTable(color_table); + + byte[] array = new byte[length]; + System.arraycopy(picture_data, pos, array, 0, length); + + PreviewFlags &= 0xFF; //remove subpic preview resolution + PreviewFlags |= (0xFFF & picture.getWidth()) << 20; //add horizontal resolution + PreviewFlags |= (0xFFF & picture.getHeight()) << 8; //add vertical resolution + + int duration = Common.getSubpictureClass().decode_picture(array, 10, true, new String[2], (PreviewFlags & 1) == 1 ? CommonGui.getPicturePanel().getPreviewImage() : null, PreviewFlags); + + values[2] = new Long(duration / 90); + + repaintSubpicture(); + } + + /** + * + */ + public void repaintSubpicture() + { + picture.repaint(); + } /** * */ public class Picture extends JPanel { + private Font font; + private int w = 720; + private int h = 576; + /** * */ public Picture() { + font = new Font("Tahoma", Font.PLAIN, 14); + setBackground(Color.gray); - setPreferredSize(new Dimension(720, 576)); - setMinimumSize(new Dimension(720, 576)); - setMaximumSize(new Dimension(720, 576)); + setPreferredSize(new Dimension(w, 704)); + setMinimumSize(new Dimension(w, 704)); + setMaximumSize(new Dimension(w, 704)); } /** @@ -165,11 +512,111 @@ */ public void paint(Graphics g) { - Image image = Common.getSubpictureClass().getImage(); + paintPicture(g); + paintInfoBackground(g); + paintInfoField(g); + paintPreviewInfo(g); + } + + /** + * + */ + private void paintPicture(Graphics g) + { + Image image = Common.getSubpictureClass().getImage(); // link to image, original size if (image != null) - g.drawImage(image, 0, 0, this); + g.drawImage(image, -horizontal_offset, -vertical_offset, this); //move to fit into preview + // g.drawImage(image, 0, 0, this); // original + } + + /** + * + */ + private void paintInfoBackground(Graphics g) + { + g.setColor(Color.black); + g.fillRect(0, h, w, 140); + + //divide + g.setColor(Color.white); + g.fillRect(0, h, w, 2); + } + + /** + * + */ + private void paintInfoField(Graphics g) + { + g.setColor(Color.white); + g.setFont(font); + g.drawString(info, 4, 608); } + /** + * + */ + private void paintPreviewInfo(Graphics g) + { + if (picture_indices == null) + return; + + if (picture_indices.size() == 0) + return; + + Long[] values = (Long[]) picture_indices.get(picture_index); + + String str1 = "Pos: " + values[0] + + " / Picture: " + (picture_index + 1) + " of " + picture_indices.size() + + " / " + Common.getSubpictureClass().isForced_Msg(1); + + g.setColor(Color.white); + g.setFont(font); + g.drawString(str1, 4, 626); + + String str2 = "PTS In " + Common.formatTime_1(values[1].longValue()) + + " Duration " + Common.formatTime_1(values[2].longValue()) + + " PTS Out " + Common.formatTime_1(values[1].longValue() + values[2].longValue()); + + if (picture_index + 1 < picture_indices.size()) + { + Long[] nvalues = (Long[]) picture_indices.get(picture_index + 1); + long diff = nvalues[1].longValue() - (values[1].longValue() + values[2].longValue()); + + str2 += " Next In " + Common.formatTime_1(nvalues[1].longValue()); + + if (diff < 0) + str2 += " Overlap " + Common.formatTime_1(Math.abs(diff)); + else + str2 += " Gap " + Common.formatTime_1(diff); + } + + else + str2 += " Next File End "; + + g.drawString(str2, 4, 644); + + paintColorIndex(g); + } + + /** + * + */ + private void paintColorIndex(Graphics g) + { + g.setFont(font); + + int[] colors = Common.getSubpictureClass().getColorTable(0); + + for (int i = 0, x = 4; i < 16; i++, x += 44) + { + g.setColor(new Color(colors[i])); + g.fillRect(x + 20, 580, 12, 12); + + g.setColor(Color.white); + g.drawString(Integer.toHexString(i).toUpperCase(), x, 592); + g.drawRect(x + 20, 580, 12, 12); + } + } } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/X_MouseWheelEvent.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/X_MouseWheelEvent.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/X_MouseWheelEvent.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/X_MouseWheelEvent.java 2007-10-04 20:32:06.000000000 +0000 @@ -0,0 +1,289 @@ +/* + * @(#)MouseWheelEvent.java 1.7 03/01/23 + * + * Copyright 2003 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +//package java.awt.event; +package net.sourceforge.dvb.projectx.gui; + +import java.awt.Component; +//import sun.awt.DebugHelper; + + +/** + * An event which indicates that the mouse wheel was rotated in a component. + *

+ * A wheel mouse is a mouse which has a wheel in place of the middle button. + * This wheel can be rotated towards or away from the user. Mouse wheels are + * most often used for scrolling, though other uses are possible. + *

+ * A MouseWheelEvent object is passed to every MouseWheelListener + * object which registered to receive the "interesting" mouse events using the + * component's addMouseWheelListener method. Each such listener + * object gets a MouseEvent containing the mouse event. + *

+ * Due to the mouse wheel's special relationship to scrolling Components, + * MouseWheelEvents are delivered somewhat differently than other MouseEvents. + * This is because while other MouseEvents usually affect a change on + * the Component directly under the mouse + * cursor (for instance, when clicking a button), MouseWheelEvents often have + * an effect away from the mouse cursor (moving the wheel while + * over a Component inside a ScrollPane should scroll one of the + * Scrollbars on the ScrollPane). + *

+ * MouseWheelEvents start delivery from the Component underneath the + * mouse cursor. If MouseWheelEvents are not enabled on the + * Component, the event is delivered to the first ancestor + * Container with MouseWheelEvents enabled. This will usually be + * a ScrollPane with wheel scrolling enabled. The source + * Component and x,y coordinates will be relative to the event's + * final destination (the ScrollPane). This allows a complex + * GUI to be installed without modification into a ScrollPane, and + * for all MouseWheelEvents to be delivered to the ScrollPane for + * scrolling. + *

+ * Some AWT Components are implemented using native widgets which + * display their own scrollbars and handle their own scrolling. + * The particular Components for which this is true will vary from + * platform to platform. When the mouse wheel is + * moved over one of these Components, the event is delivered straight to + * the native widget, and not propagated to ancestors. + *

+ * Platforms offer customization of the amount of scrolling that + * should take place when the mouse wheel is moved. The two most + * common settings are to scroll a certain number of "units" + * (commonly lines of text in a text-based component) or an entire "block" + * (similar to page-up/page-down). The MouseWheelEvent offers + * methods for conforming to the underlying platform settings. These + * platform settings can be changed at any time by the user. MouseWheelEvents + * reflect the most recent settings. + * + * @author Brent Christian + * @version 1.7 01/23/03 + * @see MouseWheelListener + * @see java.awt.ScrollPane + * @see java.awt.ScrollPane#setWheelScrollingEnabled(boolean) + * @see javax.swing.JScrollPane + * @see javax.swing.JScrollPane#setWheelScrollingEnabled(boolean) + * @since 1.4 + */ + +public class X_MouseWheelEvent extends java.awt.event.MouseEvent { + + //private static final DebugHelper dbg = DebugHelper.create(MouseWheelEvent.class); + + /** + * Constant representing scrolling by "units" (like scrolling with the + * arrow keys) + * + * @see #getScrollType + */ + public static final int WHEEL_UNIT_SCROLL = 0; + + /** + * Constant representing scrolling by a "block" (like scrolling + * with page-up, page-down keys) + * + * @see #getScrollType + */ + public static final int WHEEL_BLOCK_SCROLL = 1; + + /** + * Indicates what sort of scrolling should take place in response to this + * event, based on platform settings. Legal values are: + *

    + *
  • WHEEL_UNIT_SCROLL + *
  • WHEEL_BLOCK_SCROLL + *
+ * + * @see #getScrollType + */ + int scrollType; + + /** + * Only valid for scrollType WHEEL_UNIT_SCROLL. + * Indicates number of units that should be scrolled per + * click of mouse wheel rotation, based on platform settings. + * + * @see #getScrollAmount + * @see #getScrollType + */ + int scrollAmount; + + /** + * Indicates how far the mouse wheel was rotated. + * + * @see #getWheelRotation + */ + int wheelRotation; + + // serial version id? + + /** + * Constructs a MouseWheelEvent object with the + * specified source component, type, modifiers, coordinates, + * scroll type, scroll amount, and wheel rotation. + *

Note that passing in an invalid id results in + * unspecified behavior. + * + * @param source the Component that originated + * the event + * @param id the integer that identifies the event + * @param when a long that gives the time the event occurred + * @param modifiers the modifier keys down during event + * (shift, ctrl, alt, meta) + * @param x the horizontal x coordinate for the mouse location + * @param y the vertical y coordinate for the mouse location + * @param clickCount the number of mouse clicks associated with event + * @param popupTrigger a boolean, true if this event is a trigger for a + * popup-menu + * @param scrollType the type of scrolling which should take place in + * response to this event; valid values are + * WHEEL_UNIT_SCROLL and + * WHEEL_BLOCK_SCROLL + * @param scrollAmount for scrollType WHEEL_UNIT_SCROLL, + * the number of units to be scrolled + * @param wheelRotation the amount that the mouse wheel was rotated (the + * number of "clicks") + * + * @see MouseEvent#MouseEvent(java.awt.Component, int, long, int, int, int, int, boolean) + */ + public X_MouseWheelEvent (Component source, int id, long when, int modifiers, + int x, int y, int clickCount, boolean popupTrigger, + int scrollType, int scrollAmount, int wheelRotation) { + + super(source, id, when, modifiers, x, y, clickCount, popupTrigger); + + + this.scrollType = scrollType; + this.scrollAmount = scrollAmount; + this.wheelRotation = wheelRotation; + + //if (dbg.on) { + // dbg.println("MouseWheelEvent constructor"); + // Thread.dumpStack(); + //} + } + + /** + * Returns the type of scrolling that should take place in response to this + * event. This is determined by the native platform. Legal values are: + *

    + *
  • MouseWheelEvent.WHEEL_UNIT_SCROLL + *
  • MouseWheelEvent.WHEEL_BLOCK_SCROLL + *
+ * + * @return either MouseWheelEvent.WHEEL_UNIT_SCROLL or + * MouseWheelEvent.WHEEL_BLOCK_SCROLL, depending on the configuration of + * the native platform. + * @see java.awt.Adjustable#getUnitIncrement + * @see java.awt.Adjustable#getBlockIncrement + * @see javax.swing.Scrollable#getScrollableUnitIncrement + * @see javax.swing.Scrollable#getScrollableBlockIncrement + */ + public int getScrollType() { + return scrollType; + } + + /** + * Returns the number of units that should be scrolled in response to this + * event. Only valid if getScrollType returns + * MouseWheelEvent.WHEEL_UNIT_SCROLL + * + * @return number of units to scroll, or an undefined value if + * getScrollType returns + * MouseWheelEvent.WHEEL_BLOCK_SCROLL + * @see #getScrollType + */ + public int getScrollAmount() { + return scrollAmount; + } + + /** + * Returns the number of "clicks" the mouse wheel was rotated. + * + * @return negative values if the mouse wheel was rotated up/away from + * the user, and positive values if the mouse wheel was rotated down/ + * towards the user + */ + public int getWheelRotation() { + return wheelRotation; + } + + /** + * This is a convenience method to aid in the implementation of + * the common-case MouseWheelListener - to scroll a ScrollPane or + * JScrollPane by an amount which conforms to the platform settings. + * (Note, however, that ScrollPane and + * JScrollPane already have this functionality built in.) + *

+ * This method returns the number of units to scroll when scroll type is + * MouseWheelEvent.WHEEL_UNIT_SCROLL, and should only be called if + * getScrollType returns MouseWheelEvent.WHEEL_UNIT_SCROLL. + *

+ * Direction of scroll, amount of wheel movement, + * and platform settings for wheel scrolling are all accounted for. + * This method does not and cannot take into account value of the + * Adjustable/Scrollable unit increment, as this will vary among + * scrolling components. + *

+ * A simplified example of how this method might be used in a + * listener: + *

 
+     *  mouseWheelMoved(MouseWheelEvent event) {
+     *      ScrollPane sp = getScrollPaneFromSomewhere(); 
+     *      Adjustable adj = sp.getVAdjustable()
+     *      if (MouseWheelEvent.getScrollType() == WHEEL_UNIT_SCROLL) {
+     *          int totalScrollAmount =
+     *              event.getUnitsToScroll() *
+     *              adj.getUnitIncrement();
+     *          adj.setValue(adj.getValue() + totalScrollAmount);
+     *      }
+     *  }
+     * 
+ * + * @return the number of units to scroll based on the direction and amount + * of mouse wheel rotation, and on the wheel scrolling settings of the + * native platform + * @see #getScrollType + * @see #getScrollAmount + * @see MouseWheelListener + * @see java.awt.Adjustable + * @see java.awt.Adjustable#getUnitIncrement + * @see javax.swing.Scrollable + * @see javax.swing.Scrollable#getScrollableUnitIncrement + * @see java.awt.ScrollPane + * @see java.awt.ScrollPane#setWheelScrollingEnabled + * @see javax.swing.JScrollPane + * @see javax.swing.JScrollPane#setWheelScrollingEnabled + */ + public int getUnitsToScroll() { + return scrollAmount * wheelRotation; + } + + /** + * Returns a parameter string identifying this event. + * This method is useful for event-logging and for debugging. + * + * @return a string identifying the event and its attributes + */ + public String paramString() { + String scrollTypeStr = null; + + if (getScrollType() == WHEEL_UNIT_SCROLL) { + scrollTypeStr = "WHEEL_UNIT_SCROLL"; + } + else if (getScrollType() == WHEEL_BLOCK_SCROLL) { + scrollTypeStr = "WHEEL_BLOCK_SCROLL"; + } + else { + scrollTypeStr = "unknown scroll type"; + } + return super.paramString()+",scrollType="+scrollTypeStr+ + ",scrollAmount="+getScrollAmount()+",wheelRotation="+ + getWheelRotation(); + } +} + diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/X_MouseWheelListener.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/X_MouseWheelListener.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/gui/X_MouseWheelListener.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/gui/X_MouseWheelListener.java 2007-10-04 20:37:48.000000000 +0000 @@ -0,0 +1,40 @@ +/* + * @(#)MouseWheelListener.java 1.3 03/01/23 + * + * Copyright 2003 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +//package java.awt.event; +package net.sourceforge.dvb.projectx.gui; + +import java.util.EventListener; +import java.awt.event.MouseListener; + +/** + * The listener interface for receiving mouse wheel events on a component. + * (For clicks and other mouse events, use the MouseListener. For mouse + * movement and drags, use the MouseMotionListener.) + *

+ * The class that is interested in processing a mouse wheel event + * implements this interface (and all the methods it contains). + *

+ * The listener object created from that class is then registered with a + * component using the component's addMouseWheelListener + * method. A mouse wheel event is generated when the mouse wheel is rotated. + * When a mouse wheel event occurs, that object's mouseWheelMoved + * method is invoked. + * + * @author Brent Christian + * @version 1.3 01/23/03 + * @see MouseWheelEvent + * @since 1.4 + */ +public interface X_MouseWheelListener extends java.awt.event.MouseListener { + + /** + * Invoked when the mouse wheel is rotated. + * @see MouseWheelEvent + */ + public void mouseWheelMoved(X_MouseWheelEvent e); +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/io/IDDBufferedOutputStream.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/io/IDDBufferedOutputStream.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/io/IDDBufferedOutputStream.java 2006-03-25 22:40:42.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/io/IDDBufferedOutputStream.java 2008-04-20 08:22:00.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)IDDBufferedOutputStream.java - export * - * Copyright (c) 2003-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -354,13 +354,19 @@ /** * */ - public void InitIdd(String iddname, int iddtype) throws IOException + public void InitIdd(String iddname, int iddtype) { - name = iddname + ".id"; - type = iddtype; + try { + name = iddname + ".id"; + type = iddtype; - IddOut = new BufferedOutputStream(new FileOutputStream(name), 655350); - IddOut.write(IddHeader[type - 1]); + IddOut = new BufferedOutputStream(new FileOutputStream(name), 655350); + IddOut.write(IddHeader[type - 1]); + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } } /** diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/net/WebInterface.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/net/WebInterface.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/net/WebInterface.java 2006-01-05 01:36:38.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/net/WebInterface.java 2006-12-09 13:23:14.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)WebInterface.java - provides simple remote http access * - * Copyright (C) 2005 by dvb.matt, All Rights Reserved. + * Copyright (C) 2005-2006 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -82,14 +82,14 @@ public void start() { - if (thread == null) - { - thread = new Thread(this, "WebIF"); - thread.setPriority(Thread.MIN_PRIORITY); - thread.start(); + if (thread != null) + return; - Common.setMessage("-> re-/start WebIFServer on Port: " + Common.getSettings().getProperty(Keys.KEY_WebServerPort)); - } + thread = new Thread(this, "WebIF"); + thread.setPriority(Thread.MIN_PRIORITY); + thread.start(); + + Common.setMessage("-> re-/start WebIFServer on Port: " + Common.getSettings().getProperty(Keys.KEY_WebServerPort)); } /** diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/net/X_URLDecoder.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/net/X_URLDecoder.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/net/X_URLDecoder.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/net/X_URLDecoder.java 2008-01-31 08:30:52.000000000 +0000 @@ -0,0 +1,186 @@ +/* + * @(#)URLDecoder.java 1.23 03/01/23 + * + * Copyright 2003 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +//package java.net; +package net.sourceforge.dvb.projectx.net; + +import java.io.*; +import java.net.*; + +/** + * Utility class for HTML form decoding. This class contains static methods + * for decoding a String from the application/x-www-form-urlencoded + * MIME format. + *

+ * To conversion process is the reverse of that used by the URLEncoder class. It is assumed + * that all characters in the encoded string are one of the following: + * "a" through "z", + * "A" through "Z", + * "0" through "9", and + * "-", "_", + * ".", and "*". The + * character "%" is allowed but is interpreted + * as the start of a special escaped sequence. + *

+ * The following rules are applied in the conversion: + *

+ *

    + *
  • The alphanumeric characters "a" through + * "z", "A" through + * "Z" and "0" + * through "9" remain the same. + *
  • The special characters ".", + * "-", "*", and + * "_" remain the same. + *
  • The plus sign "+" is converted into a + * space character " " . + *
  • A sequence of the form "%xy" will be + * treated as representing a byte where xy is the two-digit + * hexadecimal representation of the 8 bits. Then, all substrings + * that contain one or more of these byte sequences consecutively + * will be replaced by the character(s) whose encoding would result + * in those consecutive bytes. + * The encoding scheme used to decode these characters may be specified, + * or if unspecified, the default encoding of the platform will be used. + *
+ *

+ * There are two possible ways in which this decoder could deal with + * illegal strings. It could either leave illegal characters alone or + * it could throw an {@link java.lang.IllegalArgumentException}. + * Which approach the decoder takes is left to the + * implementation. + * + * @author Mark Chamness + * @author Michael McCloskey + * @version 1.23, 01/23/03 + * @since 1.2 + */ + +public class X_URLDecoder { + + // The platform default encoding + //static String dfltEncName = "UTF-8"URLEncoder.dfltEncName; + static String dfltEncName = null; + + /** + * Decodes a x-www-form-urlencoded string. + * The platform's default encoding is used to determine what characters + * are represented by any consecutive sequences of the form + * "%xy". + * @param s the String to decode + * @deprecated The resulting string may vary depending on the platform's + * default encoding. Instead, use the decode(String,String) method + * to specify the encoding. + * @return the newly decoded String + */ + public static String decode(String s) { + + String str = null; + + try { + str = decode(s, dfltEncName); + } catch (UnsupportedEncodingException e) { + // The system should always have the platform default + } + + return str; + } + + /** + * Decodes a application/x-www-form-urlencoded string using a specific + * encoding scheme. + * The supplied encoding is used to determine + * what characters are represented by any consecutive sequences of the + * form "%xy". + *

+ * Note: The + * World Wide Web Consortium Recommendation states that + * UTF-8 should be used. Not doing so may introduce + * incompatibilites. + * + * @param s the String to decode + * @param enc The name of a supported + * character + * encoding. + * @return the newly decoded String + * @exception UnsupportedEncodingException + * If the named encoding is not supported + * @see URLEncoder#encode(java.lang.String, java.lang.String) + * @since 1.4 + */ + public static String decode(String s, String enc) + throws UnsupportedEncodingException{ + + boolean needToChange = false; + StringBuffer sb = new StringBuffer(); + int numChars = s.length(); + int i = 0; + + if (enc.length() == 0) { + throw new UnsupportedEncodingException ("URLDecoder: empty string enc parameter"); + } + + while (i < numChars) { + char c = s.charAt(i); + switch (c) { + case '+': + sb.append(' '); + i++; + needToChange = true; + break; + case '%': + /* + * Starting with this instance of %, process all + * consecutive substrings of the form %xy. Each + * substring %xy will yield a byte. Convert all + * consecutive bytes obtained this way to whatever + * character(s) they represent in the provided + * encoding. + */ + + try { + + // (numChars-i)/3 is an upper bound for the number + // of remaining bytes + byte[] bytes = new byte[(numChars-i)/3]; + int pos = 0; + + while ( ((i+2) < numChars) && + (c=='%')) { + bytes[pos++] = + (byte)Integer.parseInt(s.substring(i+1,i+3),16); + i+= 3; + if (i < numChars) + c = s.charAt(i); + } + + // A trailing, incomplete byte encoding such as + // "%x" will cause an exception to be thrown + + if ((i < numChars) && (c=='%')) + throw new IllegalArgumentException( + "URLDecoder: Incomplete trailing escape (%) pattern"); + + sb.append(new String(bytes, 0, pos, enc)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException( + "URLDecoder: Illegal hex characters in escape (%) pattern - " + + e.getMessage()); + } + needToChange = true; + break; + default: + sb.append(c); + i++; + break; + } + } + + return (needToChange? sb.toString() : s); + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/CommonParsing.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/CommonParsing.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/CommonParsing.java 2006-03-26 04:08:08.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/CommonParsing.java 2009-12-30 20:13:14.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)CommonParsing * - * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -64,6 +64,7 @@ public final static int ES_AUDIO_PARSER = 5; public final static int ES_SUBPICTURE_PARSER = 6; + //max 31, more defined by a subtype public final static int Unsupported = 0; // "unsupported" public final static int PES_AV_TYPE = 1; // "PES (Video/Audio/TTX)" public final static int MPEG1PS_TYPE = 2; // "MPEG-1 PS/SS (Video/Audio PES)" @@ -81,9 +82,18 @@ public final static int ES_RIFF_TYPE = 14; // "ES (RIFF Audio)" public final static int ES_cRIFF_TYPE = 15; // "ES (compressed RIFF Audio)" public final static int ES_SUP_TYPE = 16; // "ES (Subpicture 2-bit RLE)" + public final static int PJX_PTS_TYPE = 31; // "PjX PTS File" public final static int ES_TYPE = 1; // "ElementaryStream" + public final static int TS_TYPE_TF5X00 = TS_TYPE | 1<<8; // "DVB/MPEG2 TS TF5X00" + public final static int TS_TYPE_TF5X00C = TS_TYPE | 2<<8; // "DVB/MPEG2 TS TF5X00C" + public final static int TS_TYPE_TF4000 = TS_TYPE | 3<<8; // "DVB/MPEG2 TS TF4000" + public final static int TS_TYPE_HANDAN = TS_TYPE | 4<<8; // "DVB/MPEG2 TS HANDAN" + public final static int TS_TYPE_192BYTE = TS_TYPE | 5<<8; // "DVB/MPEG2 TS 192b" + public final static int TS_TYPE_COMAG = TS_TYPE | 6<<8; // "DVB/MPEG2 TS COMAG" + + // "ElementaryStream" public final static int UNKNOWN = -1; public final static int AC3_AUDIO = 0; @@ -94,13 +104,16 @@ public final static int SUBPICTURE = 5; public final static int DTS_AUDIO = 6; //handled with in AC3_AUDIO so far public final static int WAV_AUDIO = 7; + public final static int AAC_AUDIO = 8; + public final static int ACTION_UNDEFINED = -1; public final static int ACTION_DEMUX = 0; public final static int ACTION_TO_VDR = 1; public final static int ACTION_TO_M2P = 2; public final static int ACTION_TO_PVA = 3; public final static int ACTION_TO_TS = 4; public final static int ACTION_FILTER = 5; + public final static int ACTION_COPY = 6; public final static int CUTMODE_BYTE = 0; public final static int CUTMODE_GOP = 1; @@ -133,6 +146,9 @@ public final static int FRAME_D_TYPE = 4; public final static int MAX_BITRATE_VALUE = 262143; //3FFFF *400 = 104857200 bps + public final static int MAX_SD_BITRATE_VALUE = 37500; // *400 = 15000000 bps + + public static byte[] PTSVideoHeader = { 0x50, 0x4A, 0x58, 0x5F, 0x50, 0x54, 0x53, 0x56, 0x49, 0x44, 0x31, 0x30, 0x30, 0, 0, 0 }; //'PJX_PTSVID100' private static int Pva_PidToExtract = -1; @@ -374,11 +390,19 @@ { long value = 0; - for (int i = 0; bytereordering && i < length; i++) - value |= (0xFFL & array[i + offset])<<(i * 8); + try { - for (int i = 0, j = length - 1; !bytereordering && i < length; i++, j--) - value |= (0xFFL & array[i + offset])<<(j * 8); + for (int i = 0; bytereordering && i < length; i++) + value |= (0xFFL & array[i + offset])<<(i * 8); + + for (int i = 0, j = length - 1; !bytereordering && i < length; i++, j--) + value |= (0xFFL & array[i + offset])<<(j * 8); + + } catch (Exception e) { + + Common.setMessage("!> array index error (" + offset + "/" + length + "/" + array.length + ")"); + return 0; + } return value; } @@ -527,6 +551,37 @@ return -3; } + + /** + * check startcode + * return int of skip'able data (negative) + */ + public static int validateMp4Startcode(byte[] pes_packet, int offset) + { + if (pes_packet[3 + offset] == 1) + { + if (pes_packet[2 + offset] == 0) + if (pes_packet[1 + offset] == 0) + if (pes_packet[offset] == 0) + return 0; + } + + else if (pes_packet[3 + offset] == 0) + { + if (pes_packet[2 + offset] == 0) + { + if (pes_packet[1 + offset] == 0) + return -1; + else + return -2; + } + else + return -3; + } + + return -4; + } + /** * skip leading bytes before first valid startcodes and return fixed array */ @@ -868,7 +923,7 @@ public static void setVideoHeader(JobProcessing job_processing, String videofile, String logfile, int[] clv, int[] MPGVideotype) { long time = 0; - String videotype[] = { "(m1v)", "(m2v)" }; + String videotype[] = { "(m1v)", "(m2v)", "(h264)" }; String frames_used[] = { Resource.getString("video.msg.io.non"), @@ -891,6 +946,13 @@ job_processing.getSummaryInfo().add(Resource.getString("video.summary", videotype[MPGVideotype[0]], "" + job_processing.getExportedVideoFrameNumber(), "" + vt) + "'" + videofile + "'"); } + if (MPGVideotype[0] > 1) // h264 without modif. + { + Common.setMessage(Resource.getString("video.msg.bitrate.avg", "" + ((job_processing.getMinBitrate() + job_processing.getMaxBitrate()) / 2 * 400), "" + (job_processing.getMinBitrate() * 400) + "/" + (job_processing.getMaxBitrate() * 400))); + Common.setMessage(Resource.getString("msg.newfile") + " " + videofile); + return; + } + try { RandomAccessFile pv2 = new RandomAccessFile(videofile, "rw"); diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/Gop.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/Gop.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/Gop.java 2006-03-11 03:55:04.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/Gop.java 2011-03-27 12:59:56.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)Gop * - * Copyright (c) 2005-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2010 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -24,6 +24,10 @@ * */ +/* + * 2009-07 pulldown patch by vq + */ + package net.sourceforge.dvb.projectx.parser; import java.io.IOException; @@ -58,7 +62,11 @@ private byte[] headerrescue = new byte[1]; private long VbvBuffer_Value = 0; - + private boolean progressive_sequence = false; //vq static variable to remember current status + private long total_pulldownfields = 0; //vq Global counter for fields added by repeat_first_field. + //vq For esthetic reasons this may need to move into the + //vq job_processing object + private boolean Debug; private boolean CreateD2vIndex; private boolean SplitProjectFile; @@ -80,12 +88,15 @@ private boolean InsertEndcode; private boolean DumpDroppedGop; + private boolean UseGOPEditor; + private int ChangeBitrateInAllSequences; private int ChangeVbvDelay; private int CutMode; private int ExportDAR; private int ChangeAspectRatio; private int ChangeVbvBuffer; + private int Preview_YGain; private String ExportHorizontalResolution; private String SDE_Value; @@ -126,9 +137,12 @@ ExportDAR = collection.getSettings().getIntProperty(Keys.KEY_ExportDAR); ChangeAspectRatio = collection.getSettings().getIntProperty(Keys.KEY_ChangeAspectRatio); ChangeVbvBuffer = collection.getSettings().getIntProperty(Keys.KEY_ChangeVbvBuffer); + Preview_YGain = collection.getSettings().getIntProperty(Keys.KEY_Preview_YGain); ExportHorizontalResolution = collection.getSettings().getProperty(Keys.KEY_ExportHorizontalResolution); SDE_Value = collection.getSettings().getProperty(Keys.KEY_VideoPanel_SdeValue); + + UseGOPEditor = collection.getSettings().getBooleanProperty(Keys.KEY_useGOPEditor); } @@ -273,9 +287,18 @@ job_processing.setLastGopTimecode((long)thisTC); } - /* vpts[0] = pts, vpts[1] = for next frame following this byteposition in sequ_array */ - long[][] vpts = new long[2][pts.length/16]; - + //old /* vpts[0] = pts, vpts[1] = for next frame following this byteposition in sequ_array */ + //pd /*vq vpts[0] = pts, vpts[1] = frame starts at this byteposition in sequ_array */ + long[][] vpts = new long[2][pts.length / 16]; + + /*vq The frepeat array stores the number of fields to be repeated for + *vq the frame, indexed by temporal reference, when repeat_top_field is set. + *vq If I would speak decent Java I would make this a List object, + *vq but as it is I reserve room for the maximum tref number possible. + */ + int[] frepeat = new int[0x400]; + //Arrays.fill(frepeat, 0); //always 0 + for (int i = 0; i < (pts.length / 16); i++) { for (int j = 0; j < 8; j++) @@ -286,6 +309,8 @@ } //horrible nebula PTS stuff + //vq If more than one PTS is available (means probably there is one for each frame + //vq but the first and the last have the same PTS, than keep only the first vpts entry if (vpts[0].length > 1 && Math.abs(vpts[0][vpts[0].length-1] - vpts[0][0]) < 100) { long a1 = vpts[0][0]; @@ -310,11 +335,24 @@ String ct = Common.formatTime_1((long)(job_processing.getExportedVideoFrameNumber() * (double)(CommonParsing.getVideoFramerate() / 90.0f))); String nv = ""; + + String[] MPGVideoType_Str = { "MPEG-1", "MPEG-2", "MPEG-4/H.264" }; + String[] aspratio = {"res.","1.000 (1:1)","0.6735 (4:3)","0.7031 (16:9)","0.7615 (2.21:1)","0.8055","0.8437","0.9375","0.9815","1.0255","1.0695","1.1250","1.1575","1.2015","res." }; String[] fps_tabl1 = {"forbidden fps","23.976fps","24fps","25fps","29.97fps","30fps","50fps","59.94fps","60fps","n.def.","n.def.","n.def.","n.def.","n.def.","n.def.","n.def."}; double[] fps_tabl2 = { 0, 3753.7537, 3750, 3600, 3003.003, 3000, 1800, 1501.5015, 1500, 0,0,0,0,0,0,0}; + //vq + int starttref = -1; + int lasttref = -1; + int repeat_first_field = 0; + int top_field_first = 0; + int pulldownfields = 0; + int pulldownmult = 1; + int startpd = 0; + int lastpd = 0; + int tref = 0; int maxtref = 0; int frame = -1; @@ -342,6 +380,7 @@ boolean format_changed = false; boolean error = false; boolean broken_link = false; + boolean gop_closed = false; boolean sequenceheader_complete = false; boolean SDE_found = false; boolean doExport = false; @@ -463,7 +502,7 @@ if (job_processing.isNewVideoStream() || job_processing.getExportedVideoFrameNumber() == 0) { - nv = Resource.getString("video.msg.basics", "" + vbasics[0] + "*" + vbasics[1] + " @ " + vbasics[2] + " @ " + vbasics[3] + " @ " + ( ((255&gop[s+8])<<10 | (255&gop[s+9])<<2 | (192 & gop[s+10])>>>6)*400 )) + " " + ( (31&gop[s+10])<<5 | (248&gop[s+11])>>>3 ); + nv = Resource.getString("video.msg.basics") + " " + vbasics[0] + "*" + vbasics[1] + " @ " + vbasics[2] + " @ " + vbasics[3] + " @ " + ( ((255&gop[s+8])<<10 | (255&gop[s+9])<<2 | (192 & gop[s+10])>>>6)*400 ) + " bps - vbv " + ( (31&gop[s+10])<<5 | (248&gop[s+11])>>>3 ); infos.add(nv); @@ -484,9 +523,9 @@ if (!Arrays.equals(VBASIC, vbasics)) { - String str = Resource.getString("video.msg.basics", vbasics[0] + "*" + vbasics[1] + " @ " + vbasics[2] + " @ " + vbasics[3] + " @ " + ( ((255&gop[s+8])<<10 | (255&gop[s+9])<<2 | (192 & gop[s+10])>>>6)*400 )) + " " + ( (31&gop[s+10])<<5 | (248&gop[s+11])>>>3 ); + String str = Resource.getString("video.msg.basics") + " " + vbasics[0] + "*" + vbasics[1] + " @ " + vbasics[2] + " @ " + vbasics[3] + " @ " + ( ((255&gop[s+8])<<10 | (255&gop[s+9])<<2 | (192 & gop[s+10])>>>6)*400 ) + " bps - vbv " + ( (31&gop[s+10])<<5 | (248&gop[s+11])>>>3 ); - Common.setMessage(Resource.getString("video.msg.newformat", "" + clv[6]) + " (" + ct + ")"); + Common.setMessage("-> " + Resource.getString("video.msg.newformat", "" + clv[6]) + " (" + ct + ")"); Common.setMessage(str); job_processing.getChapters().addChapter(ct, str); @@ -598,6 +637,7 @@ MPGVideotype[0] = 1; mpeg2type = true; prog_seq = s + 5; + progressive_sequence = (8 & gop[prog_seq]) != 0; //vq SDE_marker = s + 10; s += 9; @@ -627,6 +667,8 @@ closedgop = s + 7; writeframe = true; + + gop_closed = (0x40 & gop[s + 7]) != 0; broken_link = (0x20 & gop[s + 7]) != 0; //gop TC @@ -708,12 +750,14 @@ if (!start && s >= vpts[1][0]) { startpts = vpts[0][0] - (long)(CommonParsing.getVideoFramerate() * tref); + starttref = tref; //vq start = true; } else if (!last && s >= vpts[1][vpts[1].length - 1]) { lastpts = vpts[0][vpts[0].length-1] - (long)(CommonParsing.getVideoFramerate() * tref); + lasttref = tref; //vq last = true; } @@ -734,29 +778,33 @@ /** * drop B-Frames, also if broken_link flag is set */ - if (tref > 0 && (Math.abs(startpts - job_processing.getEndPtsOfGop()) > CommonParsing.getVideoFramerate() || broken_link)) + if (tref > 0 && (broken_link || Math.abs(startpts - job_processing.getEndPtsOfGop()) > CommonParsing.getVideoFramerate())) { - gop[s + 4] = 0; - gop[s + 5] &= 0x3F; /* set first I-Frame's tref to 0 */ - gop[closedgop] |= 0x40; + if (!gop_closed || (gop_closed && broken_link)) + { + gop[s + 4] = 0; + gop[s + 5] &= 0x3F; /* set first I-Frame's tref to 0 */ + gop[closedgop] |= 0x40; - if (broken_link) - gop[closedgop] &= ~0x20; + if (broken_link) + gop[closedgop] &= ~0x20; - gopbuffer.write(gop, 0, s); + gopbuffer.write(gop, 0, s); - smark = s; + smark = s; - if (job_processing.getExportedVideoFrameNumber() > 0) - infos.add(Resource.getString("video.msg.pts.diff", String.valueOf(startpts - job_processing.getEndPtsOfGop()), Common.formatTime_1((startpts - job_processing.getEndPtsOfGop()) / 90)) + " " + (broken_link ? Resource.getString("video.msg.error.brokenlink") : "")); + if (job_processing.getExportedVideoFrameNumber() > 0) + infos.add(Resource.getString("video.msg.pts.diff", String.valueOf(startpts - job_processing.getEndPtsOfGop()), Common.formatTime_1((startpts - job_processing.getEndPtsOfGop()) / 90)) + " " + (broken_link ? Resource.getString("video.msg.error.brokenlink") : "")); - infos.add(Resource.getString("video.msg.frame.drop", "" + (clv[6] - 1)) + " " + Common.formatTime_1((long)(job_processing.getExportedVideoFrameNumber() * (double)(CommonParsing.getVideoFramerate() / 90.0f)))); + infos.add(Resource.getString("video.msg.frame.drop", "" + (clv[6] - 1)) + " " + Common.formatTime_1((long)(job_processing.getExportedVideoFrameNumber() * (double)(CommonParsing.getVideoFramerate() / 90.0f)))); - job_processing.countExportedVideoFrameNumber(-tref); - newframes -= tref; - trefcheck = tref; - changegop = true; - clv[0]++; //cut + //vq This should use writeframe instead + job_processing.countExportedVideoFrameNumber(-tref); + newframes -= tref; + trefcheck = tref; + changegop = true; + clv[0]++; //cut + } } } @@ -816,7 +864,10 @@ newframes++; progressive = 0x80; /* 0xb5 pic coding extension */ - for (int i = s + 6; i < s + 15 && i + 8 < gop.length; i++ ) + repeat_first_field = 0; //vq + top_field_first = 0; //vq + + for (int i = s + 6; i < s + 15 && i + 10 < gop.length; i++ ) //i + 8 doesn't reach { if ((returncode = CommonParsing.validateStartcode(gop, i)) < 0) { @@ -827,6 +878,8 @@ if (gop[i + 3] != (byte)0xb5 || (0xF0 & gop[i + 4]) != 0x80) continue; + repeat_first_field = (0x02 & gop[i + 7]); //vq + progressive = (0x80 & gop[i + 8]); if (PatchToProgressive) @@ -838,6 +891,8 @@ if (ToggleFieldorder) gop[i + 7] ^= (byte)0x80; // toggle top field first + top_field_first = gop[i + 7] | 0x80; //vq + /** * zero'es the comp.disp.flag infos */ @@ -856,6 +911,30 @@ break; } + //vq Calculate extra number of frames + if (repeat_first_field != 0 && writeframe) + { + pulldownmult = (progressive_sequence ? 2 : 1); + + int extrafields = pulldownmult; + + // top_field_first set when progressive implies another repeat + if (progressive_sequence && top_field_first != 0 ) + extrafields += pulldownmult; + + // tref is a 10bit positive integer + frepeat[tref] = extrafields; + pulldownfields += extrafields; + total_pulldownfields += extrafields; + + if (total_pulldownfields % 2 == 0 || progressive_sequence) + { + extrafields = (extrafields < 2 ? 1 : extrafields / 2); + job_processing.countSourceVideoFrameNumber(extrafields); + job_processing.countExportedVideoFrameNumber(extrafields); + } + } + if (is_I_Frame || !changegop || (changegop && writeframe)) frametypebuffer.write((byte)(frametype | progressive)); @@ -864,6 +943,26 @@ } } // end of gop search + //vq For pulldown: correct startpts and lastpts accordingly + if (pulldownfields > 0) + { + for (int i = 0; i < starttref; i++ ) + startpd += frepeat[i]; + + lastpd = startpd; + + for (int i = starttref; i < lasttref; i++ ) + lastpd += frepeat[i]; + + startpts -= (long)(CommonParsing.getVideoFramerate() * startpd / 2 ); + + if (vpts[0].length > 1) + lastpts -= (long)(CommonParsing.getVideoFramerate() * lastpd / 2 ); + else + lastpts = startpts; + } + + /** for (int dl = 0; dl < dropList.size(); dl++) { @@ -918,9 +1017,7 @@ int newTref[] = new int[Pics.length]; Arrays.fill(newTref, -1); - /** - * error, no Frames found - */ + // error, no Frames found if (Pics.length == 0) { Common.setMessage(Resource.getString("video.msg.error.frame.not", String.valueOf(clv[6] - 1))); @@ -928,9 +1025,7 @@ ErrorCode |= 2; } - /** - * error, no leading I-Frame - */ + // error, no leading I-Frame if (Pics.length > 0 && (Pics[0] & 0xF) != 1) Common.setMessage(Resource.getString("video.msg.error.frame.not.i", String.valueOf(clv[6] - 1))); @@ -939,6 +1034,7 @@ int Tref = Pics[i]>>>4; if (Tref < 0 || Tref > Pics.length - 1 || newTref[Tref] != -1) +//test if (Tref < 0 || newTref[Tref] != -1) { error = true; ErrorCode |= 4; @@ -962,12 +1058,12 @@ */ if (Save1stFrameOfGop) { - Common.getMpvDecoderClass().decodeArray(gop, false, Preview_AllGops, Preview_fastDecode); + Common.getMpvDecoderClass().decodeArray(gop, false, Preview_AllGops, Preview_fastDecode, Preview_YGain); //CommonGui.getPicturePanel().saveBMP(true, job_processing.isRunningFromCLI()); } /** - * error, start pts is to early as last + * error, start pts is too early as last */ if (startpts < job_processing.getLastGopPts() - CommonParsing.getVideoFramerate() / 2) { @@ -1019,7 +1115,22 @@ /** * return last orig pts for plain mpv */ - job_processing.setLastSimplifiedPts(startpts + (long)(trefcheck * CommonParsing.getVideoFramerate()) + (long)((maxtref - trefcheck + 1) * CommonParsing.getVideoFramerate())); + //old + //job_processing.setLastSimplifiedPts(startpts + (long)(trefcheck * CommonParsing.getVideoFramerate()) + (long)((maxtref - trefcheck + 1) * CommonParsing.getVideoFramerate())); + + //vq Force conversion to float by the 2.0 below, because the duration can be half a frame + //vq longer when odd numbers for pulldownfields occur. Same comment applies at various + //vq other places where pulldownfields occurs. + job_processing.setLastSimplifiedPts(startpts + (long)(trefcheck * CommonParsing.getVideoFramerate()) + (long)((maxtref + pulldownfields / 2.0 - trefcheck + 1) * CommonParsing.getVideoFramerate())); + + +// test - edit fehlerhafte gop + if (error) + { + if (UseGOPEditor) + gop = Common.getGuiInterface().editGOP(gop, vpts); + } +// /** * message error @@ -1043,8 +1154,13 @@ /** * read out gop timecode as long ,TC 081.5++ */ - job_processing.countLastGopTimecode((long)(CommonParsing.getVideoFramerate() * (maxtref + 1))); - job_processing.setLastGopPts(startpts + (long)(CommonParsing.getVideoFramerate() * (maxtref + 1))); + //old + //job_processing.countLastGopTimecode((long)(CommonParsing.getVideoFramerate() * (maxtref + 1))); + //job_processing.setLastGopPts(startpts + (long)(CommonParsing.getVideoFramerate() * (maxtref + 1))); + + //vq + job_processing.countLastGopTimecode((long)(CommonParsing.getVideoFramerate() * (maxtref + pulldownfields / 2.0 + 1))); + job_processing.setLastGopPts(startpts + (long)(CommonParsing.getVideoFramerate() * (maxtref + pulldownfields / 2.0 + 1))); /** * how to cut @@ -1099,7 +1215,11 @@ /** * videoframe-pts-counter */ - job_processing.setEndPtsOfGop(startpts + (long)((maxtref - trefcheck + 1) * CommonParsing.getVideoFramerate())); + //old + //job_processing.setEndPtsOfGop(startpts + (long)((maxtref - trefcheck + 1) * CommonParsing.getVideoFramerate())); + + //vq + job_processing.setEndPtsOfGop(startpts + (long)((maxtref + pulldownfields / 2.0 - trefcheck + 1) * CommonParsing.getVideoFramerate())); /** * write V-PTS Log for audio/data sync @@ -1111,7 +1231,10 @@ * write V-Time Log for audio/data sync */ log.writeLong(videotimes); - log.writeLong(job_processing.countVideoExportTime((long)((maxtref - trefcheck + 1) * CommonParsing.getVideoFramerate()))); + //old + //log.writeLong(job_processing.countVideoExportTime((long)((maxtref - trefcheck + 1) * CommonParsing.getVideoFramerate()))); + //vq + log.writeLong(job_processing.countVideoExportTime((long)((maxtref + pulldownfields/2.0 - trefcheck + 1) * CommonParsing.getVideoFramerate()))); /** * value for gop bitrate per second @@ -1329,4 +1452,1128 @@ } } + + /** + * gop h264 testing + */ + public void h264test(JobProcessing job_processing, IDDBufferedOutputStream video_sequence, byte[] gop, byte[] pts, DataOutputStream log, String dumpname, int[] MPGVideotype, List CutpointList, List ChapterpointList) + { + MPGVideotype[0] = 2; //h264 + + String[] MPGVideoType_Str = { "MPEG-1", "MPEG-2", "MPEG-4/H.264" }; + + ByteArrayOutputStream frametypebuffer = new ByteArrayOutputStream(); + ByteArrayOutputStream gopbuffer = new ByteArrayOutputStream(); + + boolean doExport = false; + int[] clv = job_processing.getStatusVariables(); + int ErrorCode = 0; + long lastpts = job_processing.getEndPtsOfGop() == -10000 ? -20000 : job_processing.getEndPtsOfGop(); + long startpts = lastpts; + long videotimes = job_processing.getVideoExportTime(); + int lastframes = job_processing.getExportedVideoFrameNumber(); + long cutposition = 0; + boolean format_changed = false; + boolean error = false; + + + List newcut = new ArrayList(); // unused + List infos = new ArrayList(); + + long[][] vpts = new long[2][pts.length / 16]; + long pts_value = -1; + + for (int i = 0; i < (pts.length / 16); i++) + { + for (int j = 0; j < 8; j++) + { + vpts[0][i] |= (0xFFL & pts[(i * 16) + j])<<((7 - j) * 8); //pts + vpts[1][i] |= (0xFFL & pts[(i * 16) + 8 + j])<<((7 - j) * 8); //valid for next pic. from pos. + } + } + + if (Debug) + { + System.out.println("\ngop" + clv[6] + "/tc_o53 " + job_processing.getLastGopTimecode() + "/lp_o54 " + job_processing.getLastGopPts() + "/lp_o8 " + job_processing.getEndPtsOfGop() + "/lp_o40 " + job_processing.getLastSimplifiedPts()); + + for (int i = 0; i < vpts[0].length; i++) + System.out.println("p" + i + " " + vpts[0][i] + "/ " + vpts[1][i]); + } + + int au_cnt = 0; + int frame = -1; + int field = 0; + int primary_pic_type = 0; + int[] preceding_fields = new int[2]; + + boolean accessunit = false; + boolean sequ_head = false; + int sequ_head_end = -1; + int accessunit_pos = 0; + int vpts_pos = 0; + + String[] VBASIC = job_processing.getStatusStrings(); + String[] vbasics = new String[5]; + int[] temp_values = new int[12]; + + double[] base_pts = new double[3]; + byte[] sequ_end = { 0, 0, 0, 1, 10 }; + + AccessUnit au = null; + ArrayList accessunit_list = new ArrayList(); + ArrayList reorder_list = new ArrayList(); + + try { + + // gop read + goploop: + for (int s = 0, returncode, unit_type, unit_ref; s < gop.length - 10; s++ ) + { + if ((returncode = CommonParsing.validateMp4Startcode(gop, s)) < 0) + { + s += (-returncode) - 1; + + continue goploop; + } + + if ((unit_type = gop[s + 4]) < 0) // is forb_zero set ? + continue goploop; + else + unit_type &= 0x1F; + + unit_ref = 3 & gop[s + 4]>>5; + + if (Debug) + System.out.println("Au " + accessunit + " /Ap " + accessunit_pos + " /U " + s + " /ppt " + (7 & gop[s+5]>>5) + " /ref " + unit_ref + " /typ " + unit_type); + + //save pos for SEI inserting + if (sequ_head && sequ_head_end < 0) + sequ_head_end = s; + + switch (unit_type) + { + case 1: //nonIDR + case 5: //IDR + if (accessunit) + { + pts_value = -1; //reset to pts-less state + + for (int i = vpts_pos; i < vpts[1].length; i++) + { + if (vpts[1][i] <= accessunit_pos) + { + pts_value = vpts[0][i]; + vpts_pos = i+1; + break; + } + } + + if (au != null) + au.setEnd(accessunit_pos); + + //slice header, get frame_num etc + slice_wo_partitioning(gop, s, unit_type, temp_values); + + au = new AccessUnit(au_cnt, primary_pic_type, (7 & gop[s + 5]>>5), temp_values, pts_value, unit_type, unit_ref, accessunit_pos); + accessunit_list.add(au); + + au_cnt++; + frametypebuffer.write((byte)(((1 - temp_values[6])<<7 | (primary_pic_type + 1)))); + accessunit = false; + } + + break; + + case 2: //slice p A + case 3: //slice p B + case 4: //slice p C + break; + + case 6: //SEI + readSEIMessage(gop, s); + break; + + case 7: //sequ set + sequ_head = true; + readH264SequenceParameterSet(gop, s, vbasics, temp_values); + + frametypebuffer.write((byte)0x88); + CommonParsing.setVideoFramerate(90000.0 / Double.parseDouble((vbasics[2].substring(0, vbasics[2].indexOf(" ", 2))).trim())); // framerateconstant + + if (job_processing.isNewVideoStream() || job_processing.getExportedVideoFrameNumber() == 0) + { + infos.add(Resource.getString("video.msg.basics") + " " + MPGVideoType_Str[MPGVideotype[0]] + " " + vbasics[4] + ", " + vbasics[0] + "*" + vbasics[1] + ", " + vbasics[2] + " @ " + vbasics[3]); + + // no frames written 'til now + if (job_processing.getExportedVideoFrameNumber() > 0) + format_changed = true; + + System.arraycopy(vbasics, 0, VBASIC, 0, VBASIC.length); + } + + if (!Arrays.equals(VBASIC, vbasics)) + { + String str = Resource.getString("video.msg.basics") + " MPEG-4/H.264, " + vbasics[4] + ", " + vbasics[0] + "*" + vbasics[1] + ", " + vbasics[2] + " @ " + vbasics[3]; + + Common.setMessage("-> " + Resource.getString("video.msg.newformat", "" + clv[6])); + Common.setMessage(str); + + format_changed = true; + + System.arraycopy(vbasics, 0, VBASIC, 0, VBASIC.length); + } + + break; + + case 8: //pict set + break; + + case 9: //access + accessunit = true; + accessunit_pos = s; + primary_pic_type = (7 & gop[s + 5]>>5); //XXX0-0000 0 to 7 prim pic type p.73 + break; + + case 10: //seq end + Common.setMessage("-> SequenceEndMarker detected at rel. pos " + s); + break; + + case 11: //stream end + Common.setMessage("-> StreamEndMarker detected at rel. pos " + s); + break; + + case 12: //fill + break; + } + + } + + if (au != null) + au.setEnd(gop.length); + + + //error checks + if (accessunit_list.size() > 0) + { + au = (AccessUnit) accessunit_list.get(0); + + if (au.getPPTAU() != 0) + { + // error, no leading I-Frame + Common.setMessage(Resource.getString("video.msg.error.frame.not.i", String.valueOf(clv[6] - 1))); + ErrorCode |= 1; + } + else + startpts = au.getPTS(); + } + else + { + // error, no Frames found + Common.setMessage(Resource.getString("video.msg.error.frame.not", String.valueOf(clv[6] - 1))); + ErrorCode |= 2; + } + + + if (ErrorCode != 0) + error = true; +//info + if (!error) + { + for (int i = 0, fr = 0, j = 0, k = 0; i < accessunit_list.size(); i++) + { + au = (AccessUnit) accessunit_list.get(i); + + // Common.setMessage(au.toString()); + + if (i == 0) // first frame, can have Picorder from last seq + { + base_pts[0] = au.getPTS() - au.getPicOrder() * (CommonParsing.getVideoFramerate() / 2.0); + fr = au.getFrameNum(); + reorder_list.add(au); + } + else + { + base_pts[1] = au.getPTS() - au.getPicOrder() * (CommonParsing.getVideoFramerate() / 2.0); + + //base pts, cannot detect missing frames + if (au.getPTS() != -1 && Math.abs(base_pts[0] - base_pts[1]) > 100) + { + //Common.setMessage("!> base pts validation failed: " + Math.abs(base_pts[0] - base_pts[1])); + ErrorCode |= 4; + } + } + + // field cnt + field += au.isFieldPic() ? 1 : 2; + + //determine 1st pts of Sequ + if (au.getPTS() < startpts && au.getPTS() != -1) + startpts = au.getPTS(); + + //determine framenum discontinuity, may not detect missing frames + if (au.getFrameNum() != fr && au.getFrameNum() != ((1 + fr) & (-1>>>(32 - temp_values[0])))) + { + ErrorCode |= 8; + Common.setMessage("!> discontinuity in framenum: exp/rec " + (fr + 1) + "/" + au.getFrameNum()); + } + + fr = au.getFrameNum(); + + //reorder to pts indicated order + for (k = j, j = 0; i > 0 && j < reorder_list.size(); j++) + { + if (au.getPTS() == -1) + { + reorder_list.add(k + 1, au); + break; + } + + if (au.getPTS() < ((AccessUnit) reorder_list.get(j)).getPTS()) + { + reorder_list.add(j, au); + break; + } + } + + if (j == reorder_list.size()) + reorder_list.add(au); + } + + //detect missing frames in reordered list + for (int i = 0, j = 0, k = 0; i < reorder_list.size(); i++) + { + au = (AccessUnit) reorder_list.get(i); + + if (i == 0) + base_pts[2] = au.getPTS(); + + j = au.isFieldPic() ? 2 : 1; //offs-length of last field/frame + + if (i > 0 && au.getPTS() != -1 && Math.abs(au.getPTS() - base_pts[2]) > 100) + ErrorCode |= 0x20; + + base_pts[2] += CommonParsing.getVideoFramerate() / j; + + //count preceding fields ref'd from last gop + if (au.getPPTAU() == 0) // || au.getUnitRef() != 0) + k = 1; + + else if (k == 0) + { + preceding_fields[0]++; //au cnt + preceding_fields[1] += au.isFieldPic() ? 1 : 2; //field cnt + } + } + + //no missing frame, reset pts base validation error + if ((0x24 & ErrorCode) == 4) + ErrorCode &= ~4; + + //frame count, maybe not suitable for pulldown + frame = field / 2; + + //cleaned pts for gop end + lastpts = startpts + Math.round(field * CommonParsing.getVideoFramerate() / 2.0); + + } + + clv[6]++; //GOP count + + // error, start pts is too early against last + if (startpts < job_processing.getLastGopPts() - CommonParsing.getVideoFramerate() / 2) + { + Common.setMessage(Resource.getString("video.msg.error.pts.early", String.valueOf(clv[6] - 1), String.valueOf(job_processing.getLastGopPts()))); + ErrorCode |= 0x10; + } + + if (ErrorCode != 0) + error = true; + + if (Debug) + { + for (int i = 0; i < accessunit_list.size(); i++) + System.out.println("E " + accessunit_list.get(i).toString()); + + for (int i = 0; i < reorder_list.size(); i++) + System.out.println("R " + reorder_list.get(i).toString()); + } + + // message error + if (error) + { + //Common.setMessage("<< error >>"); + //Common.setMessage("fld " + field + " /sp " + startpts + " /lp " + lastpts + " /E " + error); + + job_processing.setExportedVideoFrameNumber(lastframes); + clv[4]++; + + messageDropError(gop, pts, (int)((base_pts[2] - startpts) / CommonParsing.getVideoFramerate()), frame, clv[6], job_processing.getExportedVideoFrameNumber(), startpts, lastpts, dumpname, ErrorCode); + // messageDropError(gop, pts, au_cnt, frame, clv[6], job_processing.getExportedVideoFrameNumber(), startpts, lastpts, dumpname, ErrorCode); + } + + else + { + // how to cut + switch (CutMode) + { + case CommonParsing.CUTMODE_BYTE: + cutposition = job_processing.getCutByteposition(); + break; + + case CommonParsing.CUTMODE_GOP: + cutposition = clv[6]; + break; + + case CommonParsing.CUTMODE_FRAME: + cutposition = job_processing.getSourceVideoFrameNumber(); + break; + + case CommonParsing.CUTMODE_PTS: + cutposition = startpts + 1000; //exclude jitter + break; + + case CommonParsing.CUTMODE_TIME: + cutposition = startpts - job_processing.get1stVideoPTS(); + } + + // cut using bytepos, frame#, gop#, timecode or pts + if (!CommonParsing.makecut(job_processing, dumpname, startpts, cutposition, newcut, lastframes, CutpointList, clv[6] - 1, job_processing.getCellTimes())) + job_processing.setExportedVideoFrameNumber(lastframes); + + // DAR request for auto cut + else if (OptionDAR && ExportDAR != clv[7]) + job_processing.setExportedVideoFrameNumber(lastframes); + + // H Resolution request for auto cut + else if (OptionHorizontalResolution && !ExportHorizontalResolution.equals(VBASIC[0])) + job_processing.setExportedVideoFrameNumber(lastframes); + + //else if (!doWrite) + //{} + + else + { + if (job_processing.getExportedVideoFrameNumber() == 0) + infos.add(Resource.getString("video.msg.export.start") + " " + (clv[6] - 1)); + + // gap > 1/2 frame time to last gop, with possibly unref'd frames in gop + if (preceding_fields[1] > 0 && job_processing.getLastGopPts() < startpts - CommonParsing.getVideoFramerate() / 2) + { + for (int i = 0, j = 0; i < preceding_fields[0]; i++) + { + j = ((AccessUnit) reorder_list.get(i)).getCount(); + + //remove first unref'd frames + for (int k = 0; k < accessunit_list.size(); k++) + { + au = (AccessUnit) accessunit_list.get(k); + + if (j == au.getCount()) + { + field -= au.isFieldPic() ? 1 : 2; + startpts += CommonParsing.getVideoFramerate() / (au.isFieldPic() ? 2 : 1); + + accessunit_list.remove(k); + break; + } + } + } + + //rewrite new gop, adapt picorder ?? + for (int i = 0; i < accessunit_list.size(); i++) + { + au = (AccessUnit) accessunit_list.get(i); + /** + if (i == 0 && job_processing.getExportedVideoFrameNumber() > 0) + { + gopbuffer.write(gop, au.getStart(), sequ_head_end); + gopbuffer.write(setSEIMsg6(au.getFrameNum())); + gopbuffer.write(gop, sequ_head_end, au.getLength()); + } + else + **/ + gopbuffer.write(gop, au.getStart(), au.getLength()); + + if (Debug) + System.out.println("bu " + i + " /au " + au.getCount() + " /fn " + au.getFrameNum() + " /pptau " + au.getPPTAU() + " /ppt " + au.getPPT() + " /st " + au.getStart() + " /en " + au.getEnd()); + } + + gopbuffer.flush(); + gop = gopbuffer.toByteArray(); + + frame = field / 2; + infos.add("!> removing " + preceding_fields[1] + " preceding fields from GOP #" + (clv[6] - 1)); + } + + // print cached messages + for (int i = 0; i < infos.size(); i++) + { + Common.setMessage(infos.get(i).toString()); + job_processing.setNewVideoStream(false); + } + + // if write is enabled, write gop + if (WriteVideo) + { + // value for gop bitrate per second + double svbr = CommonParsing.getVideoFramerate() * frame; + + if (svbr <= 0) //20 frames sch舩zung + svbr = CommonParsing.getVideoFramerate() * 20; + + int vbr = (int)( ( (90000L * (gop.length * 8)) / svbr ) / 400); + + // determ. avg bitrates + if (vbr < job_processing.getMinBitrate()) + job_processing.setMinBitrate(vbr); + + if (vbr > job_processing.getMaxBitrate()) + job_processing.setMaxBitrate(vbr); + + // update data for the gop info picture + frametypebuffer.flush(); + + byte[] ftb = frametypebuffer.toByteArray(); + int min = 0x7FFF & clv[9]>>>15; + int max = 0x7FFF & clv[9]; + int prog_flag = clv[9]>>>30; + + for (int i = 1; i < ftb.length; i++) + prog_flag |= (0x80 & ftb[i]) != 0 ? 2 : 1; + + if (field < min || min == 0) + min = field; + + if (field > max || max == 0) + max = field; + + clv[9] = prog_flag<<30 | (0x7FFF & min)<<15 | (0x7FFF & max); + //<-- + + Common.getGuiInterface().updateBitrateMonitor(vbr, ftb, Common.formatTime_1((job_processing.getVideoExportTimeSummary() + job_processing.getVideoExportTime()) / 90).substring(0, 8)); + + /**gap what breaks sequence + if (job_processing.getExportedVideoFrameNumber() > 0 && job_processing.getLastGopPts() < startpts - CommonParsing.getVideoFramerate() / 2) + { + video_sequence.write(sequ_end); + Common.setMessage("-> sequence closed after GOP# " + (clv[6] - 1)); + + job_processing.countMediaFilesExportLength(sequ_end.length); + job_processing.countAllMediaFilesExportLength(sequ_end.length); + } + **/ + + video_sequence.write(gop); + + //clv[6]++; //GOP count + clv[3]++; //unchanged GOP count + + job_processing.countExportedVideoFrameNumber(frame); + + job_processing.setEndPtsOfGop(lastpts); + job_processing.setLastGopPts(lastpts); + + // write V-PTS Log for audio/data sync + log.writeLong(startpts); + log.writeLong(job_processing.getEndPtsOfGop()); + + // write V-Time Log for audio/data sync + log.writeLong(videotimes); + job_processing.countVideoExportTime(lastpts - startpts); + + log.writeLong(job_processing.getVideoExportTime()); + + job_processing.countMediaFilesExportLength(gop.length); + + job_processing.countAllMediaFilesExportLength(gop.length); + + doExport = true; // no cut ATM + + Common.getGuiInterface().showExportStatus(doExport ? Resource.getString("audio.status.write") : Resource.getString("audio.status.pause")); + } + } + } + + infos.clear(); + + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + } + + /** + * H264 SequenceParameterSet + */ + private boolean readH264SequenceParameterSet(byte[] array, int offset, String[] vbasics, int[] temp_values) + { + byte[] check = new byte[100]; + + int[] BitPosition = { 0 }; + BitPosition[0] = (4 + offset)<<3; + + int zero = getBits(array, BitPosition, 1); //forb_zero = 0x80 & check[4 + i]; + int nal_ref = getBits(array, BitPosition, 2); //nal_ref = (0xE0 & check[4 + i])>>>5; + int nal_unit = getBits(array, BitPosition, 5); //nal_unit = 0x1F & check[4 + i]; + + if (zero != 0 || nal_unit != 7) + return false; + + //emulation prevention + for (int m = 5 + offset, rbsp = 0; rbsp < 100 - 3; m++) + { + if (array[m] == 0 && array[m + 1] == 0 && array[m + 2] == 3) + { + rbsp += 2; //2 bytes value 0 + m += 2; //emulation_prevention_three_byte /* equal to 0x03 */ + } + else + check[rbsp++] = array[m]; + } + + //reset for check + BitPosition[0] = 0; + + //seq_param + int profile_idc = getBits(check, BitPosition, 8); //profile = 0xFF & check[5 + i]; + getBits(check, BitPosition, 4); //constraint 0,1,2,3 + zero = getBits(check, BitPosition, 4); //4 res_zero_bits + + if (zero != 0) + return false; + + int level_idc = getBits(check, BitPosition, 8); //0xFF & check[7 + i]; + int flag = getCodeNum(check, BitPosition); // seq_parameter_set_id 0 ue(v) + + int chroma_format_idc = 1; //dflt + + if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 44 || profile_idc == 244) + { + chroma_format_idc = getCodeNum(check, BitPosition); //chroma_format_idc 0 ue(v) + + if (chroma_format_idc == 3) + getBits(check, BitPosition, 1); //separate_colour_plane_flag 0 u(1) + + getCodeNum(check, BitPosition); //bit_depth_luma_minus8 0 ue(v) + getCodeNum(check, BitPosition); //bit_depth_chroma_minus8 0 ue(v) + + getBits(check, BitPosition, 1); //qpprime_y_zero_transform_bypass_flag 0 u(1) + flag = getBits(check, BitPosition, 1); //seq_scaling_matrix_present_flag 0 u(1) + + if (flag == 1) + { + for (int i = 0; i < ((chroma_format_idc != 3) ? 8 : 12); i++) + { + //seq_scaling_list_present_flag[ i ] 0 u(1) + + if (getBits(check, BitPosition, 1) == 1) + if (i < 6) + scaling_list(check, BitPosition, null, 16, null); //scaling_list( ScalingList4x4[ i ], 16, + //UseDefaultScalingMatrix4x4Flag[ i ]) + else + scaling_list(check, BitPosition, null, 64, null); //scaling_list( ScalingList8x8[ i 6 ], 64, + //UseDefaultScalingMatrix8x8Flag[ i 6 ] ) + } + } + } + + temp_values[0] = 4 + getCodeNum(check, BitPosition); // log2_max_frame_num_minus4 0 ue(v) + temp_values[2] = getCodeNum(check, BitPosition); // pic_order_cnt_type 0 ue(v) + + if (temp_values[2] == 0) + temp_values[3] = 4 + getCodeNum(check, BitPosition); // log2_max_pic_order_cnt_lsb_minus4 0 ue(v) + + else if (temp_values[2] == 1) + { + getBits(check, BitPosition, 1); //delta_pic_order_always_zero_flag 0 u(1) + getSignedCodeNum(check, BitPosition); //offset_for_non_ref_pic 0 se(v) + getSignedCodeNum(check, BitPosition); //offset_for_top_to_bottom_field 0 se(v) + flag = getCodeNum(check, BitPosition); // num_ref_frames_in_pic_order_cnt_cycle 0 ue(v) + + for (int k = 0; k < flag; k++) + getSignedCodeNum(check, BitPosition); //offset_for_ref_frame[ i ] 0 se(v) + } + + temp_values[8] = getCodeNum(check, BitPosition); //num_ref_frames 0 ue(v) + temp_values[9] = getBits(check, BitPosition, 1); //gaps_in_frame_num_value_allowed_flag 0 u(1) + + if (Debug) + System.out.println("num_ref_fr " + temp_values[8] + " /gapsallow " + temp_values[9]); + + int hori = 16 * (1 + getCodeNum(check, BitPosition)); //pic_width_in_mbs_minus1 0 ue(v) + int vert = 16 * (1 + getCodeNum(check, BitPosition)); //pic_height_in_map_units_minus1 0 ue(v) + + flag = getBits(check, BitPosition, 1); //frame_mbs_only_flag 0 u(1) + temp_values[5] = flag; + + vbasics[0] = String.valueOf(hori); + vbasics[1] = String.valueOf(flag == 0 ? vert<<1 : vert); + + if (profile_idc == 66) + vbasics[4] = "Base@"; + else if (profile_idc == 77) + vbasics[4] = "Main@"; + else if (profile_idc == 88) + vbasics[4] = "Ext@"; + else if (profile_idc == 100) + vbasics[4] = "High@"; + else if (profile_idc == 110) + vbasics[4] = "High10@"; + else if (profile_idc == 122) + vbasics[4] = "High422"; + else if (profile_idc == 144) + vbasics[4] = "High444@"; + else if (profile_idc == 44) + vbasics[4] = "High444a@"; + else if (profile_idc == 244) + vbasics[4] = "High444b@"; + //else if (profile_idc == 166) + // vbasics[2] = "High@"; + //else if (profile_idc == 188) + // vbasics[2] = "High@"; + else + vbasics[4] = String.valueOf(profile_idc) + "@"; + + vbasics[4] += String.valueOf(level_idc / 10.0); + + if (flag == 0) //if( !frame_mbs_only_flag ) + getBits(check, BitPosition, 1); //mb_adaptive_frame_field_flag 0 u(1) + + getBits(check, BitPosition, 1); //direct_8x8_inference_flag 0 u(1) + flag = getBits(check, BitPosition, 1); //frame_cropping_flag 0 u(1) + + if (flag == 1) //if( frame_cropping_flag ) { + { + getCodeNum(check, BitPosition); //frame_crop_left_offset 0 ue(v) + getCodeNum(check, BitPosition); //frame_crop_right_offset 0 ue(v) + getCodeNum(check, BitPosition); //frame_crop_top_offset 0 ue(v) + getCodeNum(check, BitPosition); //frame_crop_bottom_offset 0 ue(v) + } + + flag = getBits(check, BitPosition, 1); //vui_parameters_present_flag 0 u(1) + + if (flag == 1) //if( vui_parameters_present_flag ) + vui_parameters(check, BitPosition, vbasics); //vui_parameters( ) 0 + + //rbsp_trailing_bits( ) 0 + + return true; + } + + // h264 parse signed code num + private int getSignedCodeNum(byte[] array, int[] BitPosition) + { + int codeNum = getCodeNum(array, BitPosition); + + codeNum = (codeNum & 1) == 0 ? codeNum>>>1 : -(codeNum>>>1); + + return codeNum; + } + + // h264 parse unsigned code num + private int getCodeNum(byte[] array, int[] BitPosition) + { + int leadingZeroBits = -1; + int codeNum; + + for (int b = 0; b == 0; leadingZeroBits++) + b = getBits(array, BitPosition, 1); + + codeNum = (1<= 0; i--) + { + if ((nval & 1<>>= 3; + val |= (3 - j)<<24; //len + + j -= 1; + val |= 0x80<<(j<<3); + + // 00 00 00 01 06 06 0x aa bb + byte[] sei = new byte[10 - j]; + sei[3] = 1; + sei[4] = 6; + sei[5] = 6; + sei[6] = (byte)(val>>24); + sei[7] = (byte)(val>>16); + sei[8] = (byte)(val>>8); + + if (sei.length > 9) + sei[9] = (byte)val; + + if (Debug) + { + for (int m = 0; m < sei.length; m++) + System.out.println("m " + m + " / " + Integer.toHexString(0xFF & sei[m])); + } + + return sei; + } + } + + return (new byte[0]); // failure + } + + + // parse bits + private int getBits(byte[] array, int[] BitPosition, int N) + { + int Pos, Val; + Pos = BitPosition[0]>>>3; + + if (N == 0) + return 0; + + if (Pos >= array.length - 4) + { + BitPosition[0] += N; + return -1; + } + + Val = (0xFF & array[Pos])<<24 | + (0xFF & array[Pos + 1])<<16 | + (0xFF & array[Pos + 2])<<8 | + (0xFF & array[Pos + 3]); + + Val <<= BitPosition[0] & 7; + Val >>>= 32 - N; + + BitPosition[0] += N; + + return Val; + } + + + class AccessUnit { + + int cnt = -1; + int pptau = -1; + int ppt = -1; + int framenum = -1; + int picorder = -1; + long pts = -1; + int unittype = -1; + int unitref = -1; + int start = -1; + int end = -1; + int fieldpic = 0; + int btmfield = 0; + int marker = 0; + int slicetype = 0; + + public AccessUnit(int _cnt, int _pptau, int _ppt, int[] _tempval, long _pts, int _unittype, int _unitref, int _start) + { + cnt = _cnt; + pptau = _pptau; + ppt = _ppt; + framenum = _tempval[1]; + picorder = _tempval[4]; + fieldpic = _tempval[6]; + btmfield = _tempval[7]; + marker = _tempval[10]; + slicetype = _tempval[11]; + pts = _pts; + start = _start; + unittype = _unittype; + unitref = _unitref; + } + + private void setEnd(int _end) + { + end = _end; + } + + private int getCount() + { + return cnt; + } + + private int getPPTAU() + { + return pptau; + } + + private int getPPT() + { + return ppt; + } + + private int getPicOrder() + { + return picorder; + } + + private boolean isFieldPic() + { + return (fieldpic != 0); + } + + private boolean isBtmPic() + { + return (btmfield != 0); + } + + private int getFrameNum() + { + return framenum; + } + + private int getUnitType() + { + return unittype; + } + + private int getUnitRef() + { + return unitref; + } + + private int getStart() + { + return start; + } + + private int getEnd() + { + return end; + } + + private int getLength() + { + return end - start; + } + + private int getMarker() + { + return marker; + } + + private long getPTS() + { + return pts; + } + + public String toString() + { + return ("AU " + cnt + " /frnm " + framenum + " /picord " + picorder + " /pptau " + pptau + " /ppt " + ppt + " /slicetyp " + slicetype + " /fldpic " + fieldpic + " /btmfld " + btmfield + " /ut " + unittype + " /ur " + unitref + " /pts " + pts + " /st " + start + " /en " + end); + } + + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/MainProcess.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/MainProcess.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/MainProcess.java 2006-03-25 22:16:26.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/MainProcess.java 2009-02-21 12:51:58.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)MainProcess * - * Copyright (c) 2001-2006 by dvb.matt, All rights reserved. + * Copyright (c) 2001-2008 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -72,7 +72,6 @@ import java.util.Arrays; import java.util.Comparator; import java.util.Date; -import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; @@ -83,9 +82,6 @@ import java.net.URL; import net.sourceforge.dvb.projectx.audio.AudioFormat; -import net.sourceforge.dvb.projectx.audio.MpaConverter; -import net.sourceforge.dvb.projectx.audio.MpaDecoder; -import net.sourceforge.dvb.projectx.audio.RIFFHeader; import net.sourceforge.dvb.projectx.subtitle.BMP; import net.sourceforge.dvb.projectx.subtitle.Bitmap; @@ -132,9 +128,6 @@ */ public class MainProcess extends Thread { - private MpaConverter MPAConverter; - private MpaDecoder MPADecoder; - private int ERRORCODE = 0; private int MainBufferSize = 8192000; @@ -254,7 +247,7 @@ tf.setfirstID(); - messageSettings(); + messageSettings(collection); if ( (str = collection.checkOutputDirectory()) != null) { @@ -263,14 +256,11 @@ continue; } - if (Common.getSettings().getBooleanProperty(Keys.KEY_ExportPanel_createSubDirNumber)) { str = "[" + a + "]"; - collection.setOutputDirectory( collection.getOutputDirectory() + collection.getFileSeparator() + str); - - new File(collection.getOutputDirectory()).mkdirs(); + createOutputDirectory(collection, str); } @@ -283,22 +273,26 @@ str = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date(collection.getFirstFileDate())) + "_" + collection.getFirstFileName(); - collection.setOutputDirectory( collection.getOutputDirectory() + collection.getFileSeparator() + str); - - new File(collection.getOutputDirectory()).mkdirs(); + createOutputDirectory(collection, str); } /** + * gets collection priority of action type + */ + int action = collection.getActionType(); + + if (action <= CommonParsing.ACTION_UNDEFINED || !Common.getSettings().getBooleanProperty(Keys.KEY_ConversionModePriority)) + action = Common.getSettings().getIntProperty(Keys.KEY_ConversionMode); + + /** * create index.vdr + new path */ - if (Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createVdrIndex) && Common.getSettings().getIntProperty(Keys.KEY_ConversionMode) == 1) + if (Common.getSettings().getBooleanProperty(Keys.KEY_ExportPanel_createSubDirVdr) && action == CommonParsing.ACTION_TO_VDR) { str = "_" + new File(collection.getFirstFileBase()).getName() + System.getProperty("file.separator") + new SimpleDateFormat("yyyy-MM-dd.HH.mm.ss.SSS").format(new Date()) + ".rec"; - collection.setOutputDirectory( collection.getOutputDirectory() + collection.getFileSeparator() + str); - - new File(collection.getOutputDirectory()).mkdirs(); + createOutputDirectory(collection, str); } Common.setMessage(Resource.getString("run.write.output.to") + " '" + collection.getOutputDirectory() + "'"); @@ -311,19 +305,11 @@ collection.setLogFiles(); - /** - * gets collection priority of action type - */ - int action = collection.getActionType(); - - if (action < 0) - action = Common.getSettings().getIntProperty(Keys.KEY_ConversionMode); - /** * quick pre-run for TS autoPMT * depends also on collection priority of action type */ - if (!CommonParsing.isInfoScan() && action == CommonParsing.ACTION_TO_TS && Common.getSettings().getBooleanProperty(Keys.KEY_TS_generatePmt)) + if (!CommonParsing.isInfoScan() && action == CommonParsing.ACTION_TO_TS && collection.getSettings().getBooleanProperty(Keys.KEY_TS_generatePmt)) { Common.setMessage(""); Common.setMessage(Resource.getString("run.start.quick.info")); @@ -358,7 +344,7 @@ /** * M2S chapters per coll# */ - job_processing.getChapters().init(Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createChapters)); + job_processing.getChapters().init(collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createChapters)); /** * call the process @@ -487,122 +473,154 @@ Common.getGuiInterface().resetMainFrameTitle(); } + /** + * create output + */ + private void createOutputDirectory(JobCollection collection, String str) + { + String oldValue = collection.getOutputDirectory(); + + collection.setOutputDirectory( collection.getOutputDirectory() + collection.getFileSeparator() + str); + + File f = new File(collection.getOutputDirectory()); + + if (!f.exists() && !f.mkdirs()) + { + Common.setMessage("!> can't create output directory.."); + collection.setOutputDirectory(oldValue); + } + } /** * list settings on start */ - private void messageSettings() + private void messageSettings(JobCollection collection) { Common.setMessage(" "); //biglog - messageSetting(Keys.KEY_DebugLog); + messageSetting(collection, Keys.KEY_DebugLog); //normallog - messageSetting(Keys.KEY_NormalLog); + messageSetting(collection, Keys.KEY_NormalLog); //MPG->sPES - messageSetting(Keys.KEY_simpleMPG); + messageSetting(collection, Keys.KEY_simpleMPG); //sPES->MPG - messageSetting(Keys.KEY_enhancedPES); + messageSetting(collection, Keys.KEY_enhancedPES); + + messageSetting(collection, Keys.KEY_MessagePanel_Msg1); + messageSetting(collection, Keys.KEY_MessagePanel_Msg2); + messageSetting(collection, Keys.KEY_MessagePanel_Msg3); + messageSetting(collection, Keys.KEY_MessagePanel_Msg5); + messageSetting(collection, Keys.KEY_MessagePanel_Msg6); + messageSetting(collection, Keys.KEY_MessagePanel_Msg7); + messageSetting(collection, Keys.KEY_MessagePanel_Msg8); + //split - if (Common.getSettings().getBooleanProperty(Keys.KEY_SplitSize)) - Common.setMessage(Resource.getString("run.split.output") + " " + Common.getSettings().getProperty(Keys.KEY_ExportPanel_SplitSize_Value) + " MB"); + if (collection.getSettings().getBooleanProperty(Keys.KEY_SplitSize)) + Common.setMessage(Resource.getString("run.split.output") + " " + collection.getSettings().getProperty(Keys.KEY_ExportPanel_SplitSize_Value) + " MB"); //write video - messageSetting(Keys.KEY_WriteOptions_writeVideo); + messageSetting(collection, Keys.KEY_WriteOptions_writeVideo); //write others - messageSetting(Keys.KEY_WriteOptions_writeAudio); + messageSetting(collection, Keys.KEY_WriteOptions_writeAudio); //demux - if (Common.getSettings().getIntProperty(Keys.KEY_ConversionMode) == CommonParsing.ACTION_DEMUX) + if (collection.getSettings().getIntProperty(Keys.KEY_ConversionMode) == CommonParsing.ACTION_DEMUX) { //add offset - if (Common.getSettings().getBooleanProperty(Keys.KEY_additionalOffset)) - Common.setMessage(Resource.getString("run.add.time.offset", "" + Common.getSettings().getProperty(Keys.KEY_ExportPanel_additionalOffset_Value))); + if (collection.getSettings().getBooleanProperty(Keys.KEY_additionalOffset)) + Common.setMessage(Resource.getString("run.add.time.offset", "" + collection.getSettings().getProperty(Keys.KEY_ExportPanel_additionalOffset_Value))); //idd - if (Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createM2sIndex)) + if (collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createM2sIndex)) Common.setMessage("-> " + Resource.getString("ExternPanel.createM2sIndex.Tip") + " " + Resource.getString(Keys.KEY_ExternPanel_createM2sIndex[0])); // cminfo - if (Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createInfoIndex)) + if (collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createInfoIndex)) Common.setMessage("-> " + Resource.getString("ExternPanel.createInfoIndex.Tip") + " " + Resource.getString(Keys.KEY_ExternPanel_createInfoIndex[0])); //d2v_1 - messageSetting(Keys.KEY_ExternPanel_createD2vIndex); + messageSetting(collection, Keys.KEY_ExternPanel_createD2vIndex); //d2v_2 - if (Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile)) + if (collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile)) Common.setMessage("-> " + Resource.getString(Keys.KEY_ExternPanel_createD2vIndex[0]) + " " + Resource.getString(Keys.KEY_ExternPanel_splitProjectFile[0])); //dar export limit - if (Common.getSettings().getBooleanProperty(Keys.KEY_OptionDAR)) - Common.setMessage("-> " + Resource.getString("CollectionPanel.ExportLimits") + " " + Resource.getString(Keys.KEY_OptionDAR[0]) + " " + Keys.ITEMS_ExportDAR[Common.getSettings().getIntProperty(Keys.KEY_ExportDAR)]); + if (collection.getSettings().getBooleanProperty(Keys.KEY_OptionDAR)) + Common.setMessage("-> " + Resource.getString("CollectionPanel.ExportLimits") + " " + Resource.getString(Keys.KEY_OptionDAR[0]) + " " + Keys.ITEMS_ExportDAR[collection.getSettings().getIntProperty(Keys.KEY_ExportDAR)]); //h_resol export limit - if (Common.getSettings().getBooleanProperty(Keys.KEY_OptionHorizontalResolution)) - Common.setMessage("-> " + Resource.getString("CollectionPanel.ExportLimits") + " " + Resource.getString(Keys.KEY_OptionHorizontalResolution[0]) + " " + Common.getSettings().getProperty(Keys.KEY_ExportHorizontalResolution)); + if (collection.getSettings().getBooleanProperty(Keys.KEY_OptionHorizontalResolution)) + Common.setMessage("-> " + Resource.getString("CollectionPanel.ExportLimits") + " " + Resource.getString(Keys.KEY_OptionHorizontalResolution[0]) + " " + collection.getSettings().getProperty(Keys.KEY_ExportHorizontalResolution)); //C.D.Flag - messageSetting(Keys.KEY_VideoPanel_clearCDF); + messageSetting(collection, Keys.KEY_VideoPanel_clearCDF); //patch2interl - messageSetting(Keys.KEY_VideoPanel_patchToInterlaced); + messageSetting(collection, Keys.KEY_VideoPanel_patchToInterlaced); //patch2progr - messageSetting(Keys.KEY_VideoPanel_patchToProgressive); + messageSetting(collection, Keys.KEY_VideoPanel_patchToProgressive); //patchfield - messageSetting(Keys.KEY_VideoPanel_toggleFieldorder); + messageSetting(collection, Keys.KEY_VideoPanel_toggleFieldorder); //Sequ_endcode - messageSetting(Keys.KEY_VideoPanel_addEndcode); + messageSetting(collection, Keys.KEY_VideoPanel_addEndcode); //Sequ_endcode on changes - messageSetting(Keys.KEY_VideoPanel_insertEndcode); + messageSetting(collection, Keys.KEY_VideoPanel_insertEndcode); //SDE - if (Common.getSettings().getBooleanProperty(Keys.KEY_VideoPanel_addSde)) - Common.setMessage("-> " + Resource.getString(Keys.KEY_VideoPanel_addSde[0]) + " " + Common.getSettings().getProperty(Keys.KEY_VideoPanel_SdeValue)); + if (collection.getSettings().getBooleanProperty(Keys.KEY_VideoPanel_addSde)) + Common.setMessage("-> " + Resource.getString(Keys.KEY_VideoPanel_addSde[0]) + " " + collection.getSettings().getProperty(Keys.KEY_VideoPanel_SdeValue)); //add missing sequ_header - messageSetting(Keys.KEY_VideoPanel_addSequenceHeader); + messageSetting(collection, Keys.KEY_VideoPanel_addSequenceHeader); } boolean invers = true; //es types to demux_detect - messageSetting(Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_MpgVideo, invers); - messageSetting(Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_MpgAudio, invers); - messageSetting(Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_Ac3Audio, invers); - messageSetting(Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_PcmAudio, invers); - messageSetting(Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_Teletext, invers); - messageSetting(Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_Subpicture, invers); - messageSetting(Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_Vbi, invers); + messageSetting(collection, Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_MpgVideo, invers); + messageSetting(collection, Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_MpgAudio, invers); + messageSetting(collection, Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_Ac3Audio, invers); + messageSetting(collection, Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_PcmAudio, invers); + messageSetting(collection, Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_Teletext, invers); + messageSetting(collection, Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_Subpicture, invers); + messageSetting(collection, Resource.getString("run.stream.type.disabled"), Keys.KEY_Streamtype_Vbi, invers); /** * enhanced */ - messageSetting(Keys.KEY_PVA_FileOverlap); - messageSetting(Keys.KEY_PVA_Audio); - messageSetting(Keys.KEY_VOB_resetPts); - messageSetting(Keys.KEY_TS_ignoreScrambled); - messageSetting(Keys.KEY_TS_blindSearch); - messageSetting(Keys.KEY_TS_joinPackets); - messageSetting(Keys.KEY_TS_HumaxAdaption); - messageSetting(Keys.KEY_TS_FinepassAdaption); - messageSetting(Keys.KEY_TS_generatePmt); - messageSetting(Keys.KEY_TS_generateTtx); - messageSetting(Keys.KEY_Input_getEnclosedPackets); - messageSetting(Keys.KEY_Input_concatenateForeignRecords); - messageSetting(Keys.KEY_Video_ignoreErrors); - messageSetting(Keys.KEY_Video_trimPts); - messageSetting(Keys.KEY_Conversion_startWithVideo); - messageSetting(Keys.KEY_Conversion_addPcrToStream); + messageSetting(collection, Keys.KEY_PVA_FileOverlap); + messageSetting(collection, Keys.KEY_PVA_Audio); + messageSetting(collection, Keys.KEY_VOB_resetPts); + messageSetting(collection, Keys.KEY_TS_ignoreScrambled); + messageSetting(collection, Keys.KEY_TS_blindSearch); + messageSetting(collection, Keys.KEY_TS_joinPackets); + messageSetting(collection, Keys.KEY_TS_HumaxAdaption); + messageSetting(collection, Keys.KEY_TS_FinepassAdaption); + messageSetting(collection, Keys.KEY_TS_JepssenAdaption); + messageSetting(collection, Keys.KEY_TS_KoscomAdaption); + messageSetting(collection, Keys.KEY_TS_generatePmt); + messageSetting(collection, Keys.KEY_TS_generateTtx); + messageSetting(collection, Keys.KEY_Input_getEnclosedPackets); + messageSetting(collection, Keys.KEY_Input_concatenateForeignRecords); + messageSetting(collection, Keys.KEY_Video_ignoreErrors); + messageSetting(collection, Keys.KEY_Video_trimPts); + messageSetting(collection, Keys.KEY_Conversion_startWithVideo); + messageSetting(collection, Keys.KEY_Conversion_addPcrToStream); + + //new header addition + if (collection.getSettings().getIntProperty(Keys.KEY_TsHeaderMode) > 0) + Common.setMessage("-> " + Keys.ITEMS_TsHeaderMode[collection.getSettings().getIntProperty(Keys.KEY_TsHeaderMode)].toString()); Common.setMessage(" "); } @@ -610,27 +628,27 @@ /** * list settings on start */ - private void messageSetting(String[] key) + private void messageSetting(JobCollection collection, String[] key) { - if (Common.getSettings().getBooleanProperty(key)) + if (collection.getSettings().getBooleanProperty(key)) Common.setMessage("-> " + Resource.getString(key[0])); } /** * list settings on start */ - private void messageSetting(String str, String[] key) + private void messageSetting(JobCollection collection, String str, String[] key) { - if (Common.getSettings().getBooleanProperty(key)) + if (collection.getSettings().getBooleanProperty(key)) Common.setMessage(str + " " + Resource.getString(key[0])); } /** * list settings on start */ - private void messageSetting(String str, String[] key, boolean invers) + private void messageSetting(JobCollection collection, String str, String[] key, boolean invers) { - if (Common.getSettings().getBooleanProperty(key) != invers) + if (collection.getSettings().getBooleanProperty(key) != invers) Common.setMessage(str + " " + Resource.getString(key[0])); } @@ -665,13 +683,18 @@ String vptslog = "-1"; String oldvptslog = "-1"; + boolean PjxPtsFile = false; MainBufferSize = Integer.parseInt(Common.getSettings().getProperty(Keys.KEY_MainBuffer)); if (MainBufferSize <= 0) MainBufferSize = 4096000; - job_processing.setSplitSize(Common.getSettings().getBooleanProperty(Keys.KEY_SplitSize) ? 0x100000L * Integer.parseInt(Common.getSettings().getProperty(Keys.KEY_ExportPanel_SplitSize_Value)) : 0); + //buffer + Common.setMessage(""); + Common.setMessage("-> " + Resource.getString(Keys.KEY_MainBuffer[0]) + " " + MainBufferSize + " bytes"); + + job_processing.setSplitSize(collection.getSettings().getBooleanProperty(Keys.KEY_SplitSize) ? 0x100000L * Integer.parseInt(collection.getSettings().getProperty(Keys.KEY_ExportPanel_SplitSize_Value)) : 0); long splitsize = job_processing.getSplitSize(); @@ -690,8 +713,8 @@ CommonParsing.setVideoFramerate(3600.0); - if (Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile)) - job_processing.setProjectFileSplitSize(Long.parseLong(Common.getSettings().getProperty(Keys.KEY_ExternPanel_ProjectFileSplitSize)) * 1048576L); + if (collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile)) + job_processing.setProjectFileSplitSize(Long.parseLong(collection.getSettings().getProperty(Keys.KEY_ExternPanel_ProjectFileSplitSize)) * 1048576L); job_processing.setElementaryVideoStream(false); job_processing.set1stVideoPTS(-1); @@ -704,7 +727,8 @@ Resource.getString("working.convertType.makeMPG2"), Resource.getString("working.convertType.makePVA"), Resource.getString("working.convertType.makeTS"), - Resource.getString("working.convertType.packetFilter") + Resource.getString("working.convertType.packetFilter"), + Resource.getString("working.convertType.copy") }; /** @@ -712,7 +736,7 @@ */ int action = collection.getActionType(); - if (action < 0) + if (action <= CommonParsing.ACTION_UNDEFINED) action = Common.getSettings().getIntProperty(Keys.KEY_ConversionMode); /** @@ -728,6 +752,10 @@ StreamParserBase streamparser_basic = new StreamParserBase(); + /** + * determine primary file segments + * read next start pts if next segment is of same stream type + */ filesearch: for (int a = 0, b = -1, type = -1; a < inputfiles_size; a++) { @@ -790,9 +818,49 @@ collection.setPrimaryInputFileSegments(primaryInputFiles); + //message all files + Common.setMessage(""); + Common.setMessage(Resource.getString("JobCollection.PrimaryFileSegments")); + + for (int a = 0; a < collection.getPrimaryInputFileSegments(); a++) + Common.setMessage("* (" + a + ") " + ((XInputFile) input_files.get(a)).toString()); + + if (collection.getPrimaryInputFileSegments() == 0) + Common.setMessage("* ---"); + + Common.setMessage(Resource.getString("JobCollection.SecondaryFiles")); + + for (int a = collection.getPrimaryInputFileSegments(); a < inputfiles_size; a++) + Common.setMessage("* (" + a + ") " + ((XInputFile) input_files.get(a)).toString()); + + if (collection.getPrimaryInputFileSegments() == inputfiles_size) + Common.setMessage("* ---"); + Common.getGuiInterface().resetBitrateMonitor(); /** + * check whether remux action is applicable + * deactivate process + */ + if (action > CommonParsing.ACTION_DEMUX && collection.getSecondaryInputFileSegments() > 0) + { + Common.setMessage(""); + Common.setMessage("!> remux action allows no secondary files, processing cancelled!"); + Common.setMessage(""); + + job_processing.setSplitLoopActive(false); + } + + // remux secondary files to main-pes / test! + if (action == CommonParsing.ACTION_TO_VDR && collection.getSecondaryInputFileSegments() > 0 && Common.getSettings().getBooleanProperty("HiddenKey.VDRExport.MuxPES", false)) + { + Common.setMessage("!> remux action cancelling overidden.."); + inputfiles_size = collection.getPrimaryInputFileSegments(); + + job_processing.setSplitLoopActive(true); + } + + /** * loop for split output segments */ while (job_processing.isSplitLoopActive()) @@ -862,7 +930,16 @@ Common.setMessage(Resource.getString("working.filetype", Keys.ITEMS_FileTypes[filetype])); - + /** + * direct copy + */ + if (action == CommonParsing.ACTION_COPY) + { + Common.setMessage("-> direct file copy (from selection set)"); + directCopy(collection, job_processing, xInputFile); + break; + } + /** * the parsing */ @@ -877,10 +954,7 @@ if (!CommonParsing.getPvaPidExtraction()) Common.setMessage(convertType[action]); - if (Common.getSettings().getBooleanProperty(Keys.KEY_enhancedPES)) - vptslog = (new StreamParser(CommonParsing.PRIMARY_PES_PARSER)).parseStream(collection, xInputFile, CommonParsing.MPEG2PS_TYPE, action, vptslog); - else - vptslog = (new StreamParser(CommonParsing.PRIMARY_PES_PARSER)).parseStream(collection, xInputFile, filetype, action, vptslog); + vptslog = (new StreamParser(CommonParsing.PRIMARY_PES_PARSER)).parseStream(collection, xInputFile, Common.getSettings().getBooleanProperty(Keys.KEY_enhancedPES) ? CommonParsing.MPEG2PS_TYPE : filetype, action, vptslog); if (action == CommonParsing.ACTION_DEMUX) CommonParsing.resetSplitMode(job_processing, vptslog); @@ -914,10 +988,7 @@ if (!CommonParsing.getPvaPidExtraction()) Common.setMessage(convertType[action]); - if (Common.getSettings().getBooleanProperty(Keys.KEY_simpleMPG)) - vptslog = (new StreamParser(CommonParsing.PRIMARY_PES_PARSER)).parseStream(collection, xInputFile, CommonParsing.PES_AV_TYPE, action, vptslog); - else - vptslog = (new StreamParser(CommonParsing.PRIMARY_PES_PARSER)).parseStream(collection, xInputFile, filetype, action, vptslog); + vptslog = (new StreamParser(CommonParsing.PRIMARY_PES_PARSER)).parseStream(collection, xInputFile, Common.getSettings().getBooleanProperty(Keys.KEY_simpleMPG) ? CommonParsing.PES_AV_TYPE : filetype, action, vptslog); if (action == CommonParsing.ACTION_DEMUX) CommonParsing.resetSplitMode(job_processing, vptslog); @@ -973,10 +1044,7 @@ if (!CommonParsing.getPvaPidExtraction()) Common.setMessage(convertType[action]); - if (Common.getSettings().getBooleanProperty(Keys.KEY_enhancedPES)) - vptslog = (new StreamParser(CommonParsing.PRIMARY_PES_PARSER)).parseStream(collection, xInputFile, CommonParsing.MPEG2PS_TYPE, action, vptslog); - else - vptslog = (new StreamParser(CommonParsing.PRIMARY_PES_PARSER)).parseStream(collection, xInputFile, CommonParsing.PES_AV_TYPE, action, vptslog); + vptslog = (new StreamParser(CommonParsing.PRIMARY_PES_PARSER)).parseStream(collection, xInputFile, Common.getSettings().getBooleanProperty(Keys.KEY_enhancedPES) ? CommonParsing.MPEG2PS_TYPE : CommonParsing.PES_AV_TYPE, action, vptslog); if (action == CommonParsing.ACTION_DEMUX) CommonParsing.resetSplitMode(job_processing, vptslog); @@ -1010,6 +1078,23 @@ break; + case CommonParsing.PJX_PTS_TYPE: + if (i > 0) + CommonParsing.resetSplitMode(job_processing, vptslog); + + else + { + Common.setMessage("-> using primary PTS information from this file"); + vptslog = xInputFile.toString(); + //datei markieren, wird sonst gelscht! + PjxPtsFile = true; + + if (action == CommonParsing.ACTION_DEMUX) + CommonParsing.resetSplitMode(job_processing, vptslog); + } + + break; + case CommonParsing.Unsupported: default: Common.setMessage(Resource.getString("working.file.notsupported")); @@ -1047,19 +1132,17 @@ } Common.setMessage("=> " + Common.formatNumber(job_processing.getMediaFilesExportLength()) + " " + Resource.getString("working.bytes.written")); - Common.setMessage(Resource.getString("all.msg.error.summary", String.valueOf(Common.getErrorCount()))); File mpegvideolog = new File(vptslog); - if (mpegvideolog.exists()) + // if (mpegvideolog.exists()) + if (mpegvideolog.exists() && !PjxPtsFile) mpegvideolog.delete(); collection.closeDebugLogStream(); collection.closeNormalLogStream(Common.getMessageLog()); - //Common.clearMessageLog(); - /** * delete tempfiles which have been multi-used */ @@ -1067,16 +1150,139 @@ if (!tempfiles.isEmpty()) { +Common.setMessage("del " + tempfiles); +/** for (int i = 0; i < tempfiles.size(); i += 2) if ( new File(tempfiles.get(i).toString()).exists() ) new File(tempfiles.get(i).toString()).delete(); +**/ tempfiles.clear(); } job_processing.setSplitSize(splitsize); - Toolkit.getDefaultToolkit().beep(); + try { + Toolkit.getDefaultToolkit().beep(); + } catch (Exception e) {} + } + + /** + * + */ + private void directCopy(JobCollection collection, JobProcessing job_processing, XInputFile xinputFile) + { + boolean append = false; //later + + if (collection.getCutpointCount() > 0 && collection.getSettings().getIntProperty(Keys.KEY_CutMode) != CommonParsing.CUTMODE_BYTE) + { + Common.setMessage("!> direct copy only at byte pos cut mode; processing cancelled.."); + return; + } + + StreamParserBase parser = new StreamParserBase(); + + parser.setFileName(collection, job_processing, xinputFile); + + String newfile = parser.fparent + "[copy]" + parser.fchild.substring(parser.fchild.lastIndexOf(".")); + + List CutpointList = collection.getCutpointList(); + + long offset = 0; + + if (xinputFile.getStreamInfo().getStreamFullType() == CommonParsing.TS_TYPE_192BYTE) + offset = -4; + + long len = xinputFile.length(); + + //always multiple of 2 + long[] cuts = new long[(1 + CutpointList.size()) & ~1]; + + //cut positions, in = 0,2,... , out = 1,3,... + for (int i = 0; i < CutpointList.size(); i++) + cuts[i] = Long.parseLong(CutpointList.get(i).toString()) + offset; + + //whole file, start always 0 + if (CutpointList.size() == 0) + cuts = new long[2]; + + //file end, no offset + if (cuts[cuts.length - 1] == 0) + cuts[cuts.length - 1] = len; + + + try { + + int buf = Integer.parseInt(Common.getSettings().getProperty(Keys.KEY_MainBuffer)); + Common.setMessage("-> copy buffer size: " + String.valueOf(buf) + " bytes"); + + BufferedInputStream hex = new BufferedInputStream(xinputFile.getInputStream(), buf); + BufferedOutputStream hex1 = new BufferedOutputStream(new FileOutputStream(newfile, append), buf); + + byte[] data = new byte[0]; + int datalen; + + long startPos = 0; + long filePos = 0; + long endPos = 0; + + export: + for (int i = 0; i < cuts.length; i += 2) + { + startPos = cuts[i]; + endPos = cuts[i + 1]; + + if (startPos >= len || startPos >= endPos) + break; + + if (endPos > len) + endPos = len; + + Common.setMessage("-> copying range from " + String.valueOf(cuts[i]) + " to " + String.valueOf(cuts[i + 1])); + + while (filePos < startPos) + filePos += hex.skip(startPos - filePos); + + while (filePos < endPos) + { + while (parser.pause()) + {} + + if (CommonParsing.isProcessCancelled()) + { + CommonParsing.setProcessCancelled(false); + job_processing.setSplitSize(0); + + break export; + } + + datalen = (endPos - filePos) < (long) buf ? (int)(endPos - filePos) : buf; + + if (data.length != datalen) + data = new byte[datalen]; + + datalen = hex.read(data); + hex1.write(data, 0, datalen); + filePos += datalen; + + job_processing.countMediaFilesExportLength(datalen); + job_processing.countAllMediaFilesExportLength(datalen); + + Common.updateProgressBar(filePos, len); + } + } + + hex.close(); + hex1.flush(); + hex1.close(); + + job_processing.addSummaryInfo(Resource.getString("StreamConverter.Summary") + "\t'" + newfile + "'"); + + } catch (IOException e) { + Common.setExceptionMessage(e); + } + + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/Scan.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/Scan.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/Scan.java 2006-03-18 00:27:04.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/Scan.java 2009-12-26 13:16:46.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)SCAN.java - pre-scanning to check supported files * - * Copyright (c) 2002-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2002-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -28,6 +28,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.File; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; @@ -70,6 +71,7 @@ private ArrayList audio_streams; private ArrayList ttx_streams; private ArrayList pic_streams; + private ArrayList unknown_streams; private AudioFormat Audio = new AudioFormat(); @@ -82,24 +84,32 @@ audio_streams = new ArrayList(); ttx_streams = new ArrayList(); pic_streams = new ArrayList(); + unknown_streams = new ArrayList(); pidlist = new ArrayList(); } /** - * show ScanInfos + * performs a pre-scan of XInputFile and saves results in StreamInfo of XInputFile */ public void getStreamInfo(XInputFile aXInputFile) { - getStreamInfo(aXInputFile, -1); + getStreamInfo(aXInputFile, 0, -1); } /** - * show ScanInfos + * performs a pre-scan of XInputFile and saves results in StreamInfo of XInputFile */ - public void getStreamInfo(XInputFile aXInputFile, int assigned_streamtype) + public void getStreamInfo(XInputFile aXInputFile, long position) { - long length = aXInputFile.length(); + getStreamInfo(aXInputFile, position, -1); + } + /** + * performs a pre-scan of XInputFile and saves results in StreamInfo of XInputFile + * forces a streamtype assignment + */ + public void getStreamInfo(XInputFile aXInputFile, long position, int assigned_streamtype) + { String _name = getName(aXInputFile); String _location = getLocation(aXInputFile); String _date = getDate(aXInputFile); @@ -113,26 +123,57 @@ streamInfo = new StreamInfo(); // type must be first when scanning - streamInfo.setStreamInfo(aXInputFile.getFileType().getName(), getType(aXInputFile, assigned_streamtype), _name, _location, _date, _size, getPlaytime(), getVideo(), getAudio(), getText(), getPics()); + streamInfo.setStreamInfo(aXInputFile.getFileType().getName(), getType(aXInputFile, position, assigned_streamtype), _name, _location, _date, _size, getPlaytime(), getVideo(), getAudio(), getText(), getPics()); streamInfo.setStreamType(filetype, addInfo); streamInfo.setPIDs(getPIDs()); streamInfo.setVideoHeader(getVBasic()); } else - streamInfo = new StreamInfo("", Resource.getString("ScanInfo.NotFound"), _name, _location, "", "", ""); + streamInfo = new StreamInfo("none", Resource.getString("ScanInfo.NotFound"), _name, _location, "", "", ""); aXInputFile.setStreamInfo(streamInfo); } /** + * saves video basic info, for patch + */ + private byte[] getVBasic() + { + if (hasVideo) + return vbasic; + + return null; + } + + /** + * + */ + private String getType(XInputFile aXInputFile, long position, int assigned_streamtype) + { + if (position > 0) + filetype = testFile(aXInputFile, true, position, assigned_streamtype); + + else + filetype = testFile(aXInputFile, true, assigned_streamtype); + + return (Keys.ITEMS_FileTypes[getStreamType()].toString() + " [" + getStreamSubType() + "] " + addInfo); + } + + /** * */ - private String getType(XInputFile aXInputFile, int assigned_streamtype) + private int getStreamType() { - filetype = testFile(aXInputFile, true, assigned_streamtype); + return (0xFF & filetype); + } - return (Keys.ITEMS_FileTypes[filetype].toString() + addInfo); + /** + * + */ + private int getStreamSubType() + { + return (0xFF & filetype>>>8); } /** @@ -229,1490 +270,1715 @@ /** * */ - public byte[] getVBasic() - { - if (hasVideo) - return vbasic; + private int testFile(XInputFile aXInputFile, boolean more, int assigned_streamtype) + { + long len = aXInputFile.length(); - return null; + int ret = testFile(aXInputFile, more, 0, assigned_streamtype); + + if (ret != 0) + return ret; + + // if type is not yet detected, try it again on a later position (10% of length) + return testFile(aXInputFile, more, len / 10, assigned_streamtype); } /** * */ - private int AC3Audio(byte[] check) + private int testFile(XInputFile aXInputFile, boolean more, long position, int assigned_streamtype) { - Audio.setNewType(CommonParsing.AC3_AUDIO); + video_streams.clear(); + audio_streams.clear(); + ttx_streams.clear(); + pic_streams.clear(); + unknown_streams.clear(); + pidlist.clear(); - audiocheck: - for (int a=0; a<10000; a++) - { - if (Audio.parseHeader(check, a) < 0) - continue audiocheck; + addInfo = ""; + playtime = ""; + hasVideo = false; - for (int b = 0; b < 17; b++) + long size = 0; + int buffersize = Integer.parseInt(Common.getSettings().getProperty(Keys.KEY_ScanBuffer)); + + if (buffersize <= 0) + buffersize = 1024000; + + int bs0 = buffersize / 100; + int bs1 = buffersize / 50; + int bs2 = buffersize / 10; + int bs3 = buffersize / 4; + int bs4 = buffersize - 65536; + + byte[] check = new byte[buffersize]; + + ByteArrayOutputStream bytecheck = new ByteArrayOutputStream(); + + try { + + size = aXInputFile.length(); + + XInputFile aXif = aXInputFile.getNewInstance(); + + if (aXif == null) { - if (Audio.parseNextHeader(check, a + Audio.getSize() + b) == 1) + check = null; + return CommonParsing.Unsupported; + } + + aXif.randomAccessSingleRead(check, position); + + int returncode = -1; + // int[] mapping = { -1, -1, 5, 4, 4, 3, 2, 6, 6, 10, 9, 8, 8, 7, 7, 0, 0, 1 }; //1+16 + int[] mapping = { -1, -1, 5, 4, 4, 3, 2, 6, 6, 10, 9, 8, 8, 7, 7, 0, 0, 11 }; //1+16 + int streamtype = mapping[assigned_streamtype + 1]; + + scanloop: + for (int index = streamtype; returncode < CommonParsing.Unsupported; index++) + { + + returncode = scanPjxOwn(aXif, check, bs0); + + if (returncode != -1) + break; + + switch (index) { - if ( (0xFF & check[a + Audio.getSize()]) > 0x3f || (0xFF & check[a + Audio.getSize()]) == 0 ) //smpte - continue audiocheck; + case -1: + break; - audio_streams.add(Audio.saveAndDisplayHeader()); + case 0: + returncode = scanRiffAudio(check, bs0, more, size); + break; - return 1; - } - } - } + case 1: //empty + // returncode = scanSubpicture(check, bs0, more, aXif.toString()); + break; - return 0; - } + case 2: + returncode = scanTS(check, bs4, more); + break; - /* DTS stuff taken from the VideoLAN project. */ - /* Added by R One, 2003/12/18. */ - private void DTSAudio(byte[] check) - { - Audio.setNewType(CommonParsing.DTS_AUDIO); + case 3: + returncode = scanPVA(check, bs1, more); + break; - audiocheck: - for (int i = 0; i < 10000; i++) - { - if (Audio.parseHeader(check, i) < 0) - continue audiocheck; + case 4: + returncode = scanMpg12(check, bs2, bs1, more); + break; - for (int j = 0; j < 15; j++) - { - if (Audio.parseNextHeader(check, i + Audio.getSize() + j) == 1) - { - if ( (0xFF & check[i + Audio.getSize()]) > 0x7F || (0xFF & check[i + Audio.getSize()]) == 0 ) //smpte - continue audiocheck; + case 5: + returncode = scanPrimaryPES(check, bs4, bs3, more); + break; - audio_streams.add(Audio.saveAndDisplayHeader()); + case 6: + returncode = scanSecondaryPES(check, bs2, bs3, more); + break; - return; - } - } - } - } + case 7: + returncode = scanDtsAudio(check, bs1, more, size); + break; - /** - * - */ - private void MPEGAudio(byte[] check) - { - Audio.setNewType(CommonParsing.MPEG_AUDIO); + case 8: + returncode = scanAc3Audio(check, bs1, more, size); + break; - audiocheck: - for (int a = 0; a < 10000; a++) - { - if (Audio.parseHeader(check, a) < 0) - continue audiocheck; + case 9: + returncode = scanMpgAudio(check, bs1, more, size); + break; - if (Audio.parseNextHeader(check, a + Audio.getSize()) < 0) - continue audiocheck; + case 10: + returncode = scanMpgVideo(check, bs3, more); + break; - audio_streams.add(Audio.saveAndDisplayHeader()); + case 11: + returncode = scanSubpicture(check, bs0, more, aXif.toString()); + break; - return; + default: + break scanloop; + } + + if (assigned_streamtype != -1) + returncode = assigned_streamtype; + } + + check = null; + + if (returncode > 0) + return returncode; + + } catch (Exception e) { + + playtime = msg_8; + Common.setExceptionMessage(e); } + + check = null; + + return CommonParsing.Unsupported; } /** * */ - private byte[] loadPES(byte[] check, int a) - { - ByteArrayOutputStream bytecheck = new ByteArrayOutputStream(); - int jump, offs, len; - boolean mpg1; - - for (; a < check.length; ) + private int scanPjxOwn(XInputFile xInputFile, byte[] check, int buffersize) throws Exception + { + for (int i = 0; i < 16; i++) { - jump = (0xFF & check[a + 4])<<8 | (0xFF & check[a + 5]); - mpg1 = (0x80 & check[a + 6]) == 0 ? true : false; - offs = a + 6 + ( !mpg1 ? 3 + (0xFF & check[a+8]) : 0); - len = jump - ( !mpg1 ? 3 + (0xFF & check[a+8]) : 0); + if (check[i] != CommonParsing.PTSVideoHeader[i]) + return -1; + } - if (offs + len > check.length) - break; + int length = (int) xInputFile.length(); + byte[] data = new byte[length]; - bytecheck.write(check, offs, len); + xInputFile.randomAccessSingleRead(data, 0); - a += 6 + jump; - } + long pts1 = CommonParsing.readPTS(data, 16, 8, false, false); + long pts2 = CommonParsing.readPTS(data, length - 24, 8, false, false); + long pts3 = CommonParsing.readPTS(data, 32, 8, false, false); + long pts4 = CommonParsing.readPTS(data, length - 8, 8, false, false); - return bytecheck.toByteArray(); + playtime = "Src " + Common.formatTime_1(pts1 / 90L) + " -- " + Common.formatTime_1(pts2 / 90L); + playtime += " / Out " + Common.formatTime_1(pts3 / 90L) + " -- " + Common.formatTime_1(pts4 / 90L); + + return CommonParsing.PJX_PTS_TYPE; } /** * */ - private void loadMPG2(byte[] check, int b, boolean vdr, boolean mpg1, boolean nullpacket, int size) throws IOException - { - Hashtable table = new Hashtable(); - ScanObject scanobject; - - String str; - int jump = 1, id; - int end = check.length > 580000 ? 512000 : check.length - 65000; + private int scanRiffAudio(byte[] check, int buffersize, boolean more, long size) throws Exception + { + Audio.setNewType(CommonParsing.WAV_AUDIO); - mpg2check: - for (int a = b, returncode; a < end; a += jump) + riffcheck: + for (int i = 0, ERRORCODE; i < buffersize; i++) //compressed as AC3,MPEG is currently better detected as ES-not RIFF { - if ((returncode = CommonParsing.validateStartcode(check, a)) < 0) + ERRORCODE = Audio.parseHeader(check, i); + + if (ERRORCODE > -1) { - jump = -returncode; - continue mpg2check; - } + Audio.saveHeader(); - id = CommonParsing.getPES_IdField(check, a); - str = String.valueOf(id); + if (more) + { + audio_streams.add(Audio.displayHeader()); + playtime = getAudioTime(size); + } - if (id == CommonParsing.PACK_START_CODE) - { - if ((0xC0 & check[4 + a]) == 0) //mpg1 - jump = 12; + if (ERRORCODE > 0) + return CommonParsing.ES_RIFF_TYPE; - else if ((0xC0 & check[4 + a]) == 0x40) //mpg2 - jump = 14 + (7 & check[13 + a]); + else if (Audio.getLastModeExtension() > 1) + break riffcheck; else - jump = 4; + return CommonParsing.ES_cRIFF_TYPE; } + } - //video mpg e0..ef - else if ( (0xF0 & id) == 0xE0 ) - { - jump = nullpacket ? 2048 : (6 + CommonParsing.getPES_LengthField(check, a)); - - if (!table.containsKey(str)) - table.put(str, new ScanObject(id)); + return -1; + } - scanobject = (ScanObject)table.get(str); + /** + * + */ + private int scanSubpicture(byte[] check, int buffersize, boolean more, String supname) throws Exception + { + supcheck: + for (int i = 0, supframe_size, supframe_link, supframe_check, supframe_check2; i < buffersize; i++) + { + if (check[i] != 0x53 || check[i + 1] != 0x50) + continue supcheck; - scanobject.write(check, a + 6 + (!mpg1 ? 3 + CommonParsing.getPES_ExtensionLengthField(check, a) : 0), jump - (!mpg1 ? 6 - 3 - CommonParsing.getPES_ExtensionLengthField(check, a) : 0) ); - } + supframe_size = (0xFF & check[i + 10])<<8 | (0xFF & check[i + 11]); + supframe_link = (0xFF & check[i + 12])<<8 | (0xFF & check[i + 13]); + supframe_check = (0xFF & check[i + 12 + supframe_link])<<8 | (0xFF & check[i + 13 + supframe_link]); + // supframe_check2 = (0xFF & check[i + 36 + supframe_link])<<8 | (0xFF & check[i + 37 + supframe_link]); - //audio mpg c0..df - else if ( (0xE0 & id) == 0xC0 ) + // if (supframe_link == supframe_check - 24 && supframe_check == supframe_check2) // 24 is wrong + if ((0xFF & check[i + supframe_size + 9]) == 0xFF) // end stuffing, at least one { - jump = 6 + CommonParsing.getPES_LengthField(check, a); + if (more) + { + // int b = i + 14 + supframe_link, c = b + 24, d, xa, xe, ya, ye; // 24 is wrong + int b = i + 14 + supframe_link, c = b + 24, d, xa, xe, ya, ye; - if (!table.containsKey(str)) - table.put(str, new ScanObject(id)); + for (d = b; d < c; d++) + { + switch(0xFF & check[d]) + { + case 1: + d++; + continue; - scanobject = (ScanObject)table.get(str); + case 2: + d += 24; // is wrong + continue; - scanobject.write(check, a, jump ); - } + case 3: + case 4: + d += 2; + continue; - //private bd - else if (id == CommonParsing.PRIVATE_STREAM_1_CODE) - { - jump = 6 + CommonParsing.getPES_LengthField(check, a); + case 6: + d += 4; + continue; - int pes_extensionlength = CommonParsing.getPES_ExtensionLengthField(check, a); - boolean pes_alignment = (4 & check[a + 6]) != 0; + case 5: + xa= (0xFF & check[++d])<<4 | (0xF0 & check[++d])>>>4; + xe= (0xF & check[d])<<8 | (0xFF & check[++d]); + ya= (0xFF & check[++d])<<4 | (0xF0 & check[++d])>>>4; + ye= (0xF & check[d])<<8 | (0xFF & check[++d]); - if (pes_extensionlength == 0x24 && (0xF0 & check[a + 9 + pes_extensionlength])>>>4 == 1) - { - str = "SubID 0x" + Integer.toHexString((0xFF & check[a + 9 + pes_extensionlength])).toUpperCase(); + pic_streams.add("up.left x" + xa + ",y" + ya + " @ size " + (xe - xa + 1) + "*" + (ye - ya + 1)); + continue; + } + break; + } - if (ttx_streams.indexOf(str) < 0) - ttx_streams.add(str); - } + byte packet[] = new byte[10 + supframe_size]; - else if ( ((!mpg1 && !vdr) || (vdr && pes_alignment)) && ((0xF0 & check[a + 9 + pes_extensionlength])>>>4 == 2 || (0xF0 & check[a + 9 + pes_extensionlength])>>>4 == 3)) - { - str = "SubID 0x" + Integer.toHexString((0xFF & check[a + 9 + pes_extensionlength])).toUpperCase(); + System.arraycopy(check, i, packet, 0, 10 + supframe_size); - if (pic_streams.indexOf(str) < 0) - pic_streams.add(str); + // shows first found subpicture scaled on OSD + Common.getSubpictureClass().setColorTable(setIFOColorTable(supname)); + Common.getSubpictureClass().decode_picture(packet, 10, true, new String[2]); } - else - { - if (!vdr) - { - id = 0xFF & check[a + 9 + pes_extensionlength]; - str = String.valueOf(id); + return CommonParsing.ES_SUP_TYPE; + } + } - check[a + 8] = (byte)(4 + pes_extensionlength); - } + return -1; + } - if (!table.containsKey(str)) - table.put(str, new ScanObject(id)); + /** + * read colors from ifo (pjx auto generated) + */ + private int[] setIFOColorTable(String supname) + { + try { - scanobject = (ScanObject)table.get(str); + String nsupname = supname + ".IFO"; - scanobject.write(check, a, jump ); - } - } + File f = new File(nsupname); - else + if (!f.exists()) { - switch (id) - { - case 0xBB: - case 0xBC: - case 0xBE: - case 0xBF: - case 0xF0: - case 0xF1: - case 0xF2: - case 0xF3: - case 0xF4: - case 0xF5: - case 0xF6: - case 0xF7: - case 0xF8: - case 0xF9: - case 0xFA: - case 0xFB: - case 0xFC: - case 0xFD: - case 0xFE: - case 0xFF: - jump = 6 + CommonParsing.getPES_LengthField(check, a); - break; + f = new File(supname.substring(0, supname.lastIndexOf(".")) + ".IFO"); - default: - jump = 1; - } + if (!f.exists()) + return null; + //Common.setMessage("!> no existing .ifo file : '" + supname + "'"); } - } - - - for (Enumeration n = table.keys(); n.hasMoreElements() ; ) - { - str = n.nextElement().toString(); - id = Integer.parseInt(str); - scanobject = (ScanObject)table.get(str); + XInputFile xif = new XInputFile(f); - if ( (0xF0 & id) == 0xE0) - { - try { - checkVid(scanobject.getData()); + byte[] data = new byte[64]; + int[] values = new int[16]; - } catch (Exception e) { + xif.randomAccessSingleRead(data, 0x10B4); //read 16x 4bytes from pos 0x10B4 - video_streams.add(msg_8); - } - } + for (int i = 0, j = values.length; i < j; i++) + values[i] = YUVtoRGB(CommonParsing.getIntValue(data, i * 4, 4, !CommonParsing.BYTEREORDERING)); - else - { - try { - checkPES(scanobject.getData()); + return values; - } catch (Exception e) { + } catch (Exception e) { - audio_streams.add(msg_8); - } - } + Common.setExceptionMessage(e); } - table.clear(); - - return; + return null; } /** - * + * convert colors from ifo (pjx auto generated) */ - private void loadPVA(byte[] check, int a) throws IOException - { - Hashtable table = new Hashtable(); - ScanObject scanobject; - - String str; - int jump, id; - int end = check.length > 580000 ? 512000 : check.length - 65000; - - while ( a < end) - { - jump = (0xFF & check[a+6])<<8 | (0xFF & check[a+7]); + private int YUVtoRGB(int values) + { + int Y = 0xFF & values>>16; + int Cr = 0xFF & values>>8; + int Cb = 0xFF & values; - if (a + 8 + ((1 & check[a+5]>>>4) * 4) + jump > check.length) - break; + if (Y == 0) + return 0; - id = 0xFF & check[a+2]; - str = String.valueOf(id); + int R = (int)((float)Y +1.402f * (Cr-128)); + int G = (int)((float)Y -0.34414 * (Cb-128) -0.71414 * (Cr-128)); + int B = (int)((float)Y +1.722 * (Cb-128)); + R = R < 0 ? 0 : (R > 0xFF ? 0xFF : R); + G = G < 0 ? 0 : (G > 0xFF ? 0xFF : G); + B = B < 0 ? 0 : (B > 0xFF ? 0xFF : B); + int T = 0xFF; - if (!table.containsKey(str)) - table.put(str, new ScanObject(id)); + return (T<<24 | R<<16 | G<<8 | B); + } - scanobject = (ScanObject)table.get(str); + /** + * scan TS + */ + private int scanTS(byte[] check, int buffersize, boolean more) throws Exception + { + // 188bytes TS + for (int i = 0, j = 188; i < buffersize; i++) + { + if ( check[i] != 0x47 || check[i + j] != 0x47 || check[i + j * 2] != 0x47 || check[i + j * 3] != 0x47 || check[i + j * 4] != 0x47 || check[i + j * 5] != 0x47 || check[i + j * 6] != 0x47) + continue; - switch (id) - { - case 1: - scanobject.write(check, a + 8 + ((1 & check[a+5]>>>4) * 4), jump ); - break; + readPMT(check, i, 0); - default: - scanobject.write(check, a + 8, jump ); - } + if (pidlist.isEmpty()) + scanTSPids(check, i, buffersize, 0, more); - a += 8 + jump; + return scanTSSubtype(check, buffersize); } - for (Enumeration n = table.keys(); n.hasMoreElements() ; ) - { - str = n.nextElement().toString(); + // 192bytes TS + for (int i = 0, j = 192; i < buffersize; i++) + { + if ( check[i] != 0x47 || check[i + j] != 0x47 || check[i + j * 2] != 0x47 || check[i + j * 3] != 0x47 || check[i + j * 4] != 0x47 || check[i + j * 5] != 0x47 || check[i + j * 6] != 0x47) + continue; - scanobject = (ScanObject)table.get(str); + readPMT(check, i, 4); - if (str.equals("1")) - { - try { - checkVid(scanobject.getData()); + if (pidlist.isEmpty()) + scanTSPids(check, i, buffersize, 4, more); - } catch ( Exception e) { + return CommonParsing.TS_TYPE_192BYTE; + } - video_streams.add(msg_8); - } + return -1; + } + + /** + * scan TS sub type + */ + private int scanTSSubtype(byte[] check, int buffersize) + { + //TFrc TF5x00 + if (check[0] == 0x54 && check[1] == 0x46 && check[2] == 0x72 && check[3] == 0x63 && check[4] == 0x50 && check[5] == 0) + { + /** jkit 23012009 + * find header type (DVB-s,-t,-c), to know the + * start of the event info structure + * + * validate three typical values in the transponder info + * for each type and take the best matching + */ + int isDVBsVal = 0; + int isDVBtVal = 0; + int isDVBcVal = 0; + int offset = 0x34; + + // test as dvb-s transponder info + byte Polarity = check[offset + 1]; + long Frequency = (check[offset + 4] << 24) | (check[offset + 5] << 16) + | (check[offset + 6] << 8) | check[offset + 7]; + int Symbol_Rate = (check[offset + 8] << 8) | check[offset + 9]; + if ((Polarity & 0x6F) == 0) + isDVBsVal++; + else + isDVBsVal--; + if ((Symbol_Rate > 2000) && (Symbol_Rate < 30000)) + isDVBsVal++; + else + isDVBsVal--; + if ((Symbol_Rate > 10000) && (Symbol_Rate < 13000)) + isDVBsVal++; + else + isDVBsVal--; + + // test as dvb-t transponder info + byte Bandwidth = check[offset + 2]; + Frequency = (check[offset + 4] << 24) | (check[offset + 5] << 16) + | (check[offset + 6] << 8) | check[offset + 7]; + byte LP_HP_Stream = check[offset + 10]; + if ((Bandwidth >= 6) && (Bandwidth <= 8)) + isDVBtVal++; + if (((Frequency >= 174000) && (Frequency <= 230000)) + || ((Frequency >= 470000) && (Frequency <= 862000))) + isDVBtVal++; + if ((LP_HP_Stream & 0xFE) == 0) + isDVBtVal++; + + // test as dvb-c transponder info + Frequency = (check[offset + 0] << 24) | (check[offset + 1] << 16) + | (check[offset + 2] << 8) | check[offset + 3]; + Symbol_Rate = (check[offset + 4] << 8) | check[offset + 5]; + byte Modulation = check[offset + 10]; + if ((Frequency >= 47000) && (Frequency <= 862000)) + isDVBcVal++; + if ((Symbol_Rate > 2000) && (Symbol_Rate < 30000)) + isDVBcVal++; + if (Modulation <= 4) + isDVBcVal++; + + if ((isDVBsVal >= isDVBcVal) && (isDVBsVal >= isDVBtVal)) + { + // event_info_offset = 0x44; // default + //Common.setMessage("-> topfield header has DVB-s format"); + return CommonParsing.TS_TYPE_TF5X00; + } + else if (isDVBtVal > isDVBcVal) + { + //event_info_offset = 0x44; // default + //Common.setMessage("-> topfield header has DVB-t format"); + return CommonParsing.TS_TYPE_TF5X00; } else { - try { - checkPES(scanobject.getData()); + /** + * the transponder info structure of the TF5200 is shorter, + * so the following data starts at 0x40 + */ + //event_info_offset = 0x40; + //Common.setMessage("-> topfield header has DVB-c format"); + return CommonParsing.TS_TYPE_TF5X00C; + } + } - } catch ( Exception e) { + //TF4000 + else if (check[0] != 0x47 && check[188] != 0x47 && check[376] != 0x47 && check[564] == 0x47 && check[752] == 0x47 && check[940] == 0x47) + return CommonParsing.TS_TYPE_TF4000; - audio_streams.add(msg_8); - } - } + //Handan/Hojin + for (int i = 0, j = buffersize - 10; i < j; i++) + { + if (check[i] != 0x5B || check[i + 1] != 0x48 || check[i + 2] != 0x4F || check[i + 3] != 0x4A || check[i + 4] != 0x49 || check[i + 5] != 0x4E || check[i + 6] != 0x20 || check[i + 7] != 0x41) + continue; + + return CommonParsing.TS_TYPE_HANDAN; } - table.clear(); + //comag + if (check[0] == 0 && check[1] == 0 && check[2] == 1 && check[3] == (byte)0xBA && check[14] == 0 && check[15] == 0 && check[16] == 1 && check[17] == (byte)0xBF) + return CommonParsing.TS_TYPE_COMAG; - return; + + return CommonParsing.TS_TYPE; } /** * */ - private void checkPES(byte[] check) - { - checkPES(check, 0); + private void scanTSPids(byte[] check, int i, int buffersize, int lead, boolean more) throws Exception + { + String str; + + mpegtscheck: + for (int pid, scrambling, j = 188 + lead; i < buffersize; i++) + { + if ( check[i] != 0x47 || check[i + j] != 0x47 || check[i + j * 2] != 0x47) + continue mpegtscheck; + + pid = (0x1F & check[i + 1])<<8 | (0xFF & check[i + 2]); + scrambling = (0xC0 & check[i + 3])>>>6; // scrambling + + i += j - 1; + + str = "PID 0x" + Integer.toHexString(pid).toUpperCase(); + + if (scrambling > 0) + str += "-($)"; + + if (!video_streams.contains(str)) + video_streams.add(str); + } + + addInfo += " (no PMT found)"; } /** * */ - private void checkPES(byte[] check, int a) - { - int end = a + 8000; - - rawcheck: - for (int returncode; a < end; a++) - { - if ((returncode = CommonParsing.validateStartcode(check, a)) < 0) - { - a += (-returncode) - 1; - continue rawcheck; - } - - if ( (0xE0 & check[a+3]) == 0xC0 || CommonParsing.getPES_IdField(check, a) == CommonParsing.PRIVATE_STREAM_1_CODE) - { - int next = a + 6 + CommonParsing.getPES_LengthField(check, a); - - if (CommonParsing.validateStartcode(check, next) < 0) - continue rawcheck; - - if ( (0xE0 & check[a+3]) == 0xC0 && (0xE0 & check[a+3]) == (0xE0 & check[next+3]) ) - { - MPEGAudio(loadPES(check,a)); + private int scanPVA(byte[] check, int buffersize, boolean more) throws Exception + { + pvacheck: + for (int i = 0; i < buffersize; i++) + { + if ( check[i] != 0x41 || check[i + 1] != 0x56 || check[i + 4] != 0x55 ) + continue pvacheck; - return; - } + int next = i + 8 + ((0xFF & check[i + 6])<<8 | (0xFF & check[i + 7])); - else if (CommonParsing.getPES_IdField(check, a) == CommonParsing.PRIVATE_STREAM_1_CODE && CommonParsing.getPES_IdField(check, a) == CommonParsing.getPES_IdField(check, next)) - { - byte buffer[] = loadPES(check, a); + if ( check[next] != 0x41 || check[next + 1] != 0x56 || check[next + 4] != 0x55 ) + continue pvacheck; - if (AC3Audio(buffer) < 1) - DTSAudio(buffer); + else + { + if (more) + loadPVA(check, i); - return; - } + return CommonParsing.PVA_TYPE; } } - } - /** - * - */ - private void checkVid(byte[] check) - { - checkVid(check, check.length - 630); + return -1; } /** * */ - private boolean checkVid(byte[] check, int length) - { - ByteArrayOutputStream bytecheck = new ByteArrayOutputStream(); + private int scanMpg12(byte[] check, int buffersize_1, int buffersize_2, boolean more) throws Exception + { + boolean nullpacket = false; - for (int i = 0, returncode, pes_ID; i < length; i++) + mpgcheck: + for (int i = 0, j, flag, returncode; i < buffersize_1; i++) { - if ((returncode = CommonParsing.validateStartcode(check, i)) < 0 || CommonParsing.getPES_IdField(check, i) != CommonParsing.SEQUENCE_HEADER_CODE) + if ((returncode = CommonParsing.validateStartcode(check, i)) < 0 || CommonParsing.getPES_IdField(check, i) != CommonParsing.PACK_START_CODE) { i += (returncode < 0 ? -returncode : 4) - 1; - continue; + continue mpgcheck; } - for (int j = 7, mpgtype = 1; j < 600; j++) - { - if ((returncode = CommonParsing.validateStartcode(check, i + j)) < 0) - { - j += (-returncode) - 1; - continue; - } + flag = 0xC0 & check[i + 4]; - pes_ID = CommonParsing.getPES_IdField(check, i + j); + if (flag == 0) + { + j = i + 12; - if (pes_ID == CommonParsing.EXTENSION_START_CODE && (0xF0 & check[4 + i + j]) == 0x10) - mpgtype = 2; + if (CommonParsing.validateStartcode(check, j) < 0 || CommonParsing.getPES_IdField(check, j) < CommonParsing.SEQUENCE_HEADER_CODE) + continue mpgcheck; - else if (pes_ID == CommonParsing.GROUP_START_CODE || pes_ID == CommonParsing.PICTURE_START_CODE) - { - hasVideo = true; - System.arraycopy(check, i, vbasic, 0, 12); - bytecheck.write(check, i, 20); + if (more) + loadMPG2(check, i, false, true, nullpacket, buffersize_2); - video_streams.add("MPEG-" + mpgtype + ", " + Video.getVideoformatfromBytes(bytecheck.toByteArray())); + return CommonParsing.MPEG1PS_TYPE; + } - return true; - } - } - } + else if (flag == 0x40 ) + { + j = i + 14 + (7 & check[i + 13]); + + if (CommonParsing.validateStartcode(check, j) < 0 || CommonParsing.getPES_IdField(check, j) < CommonParsing.SEQUENCE_HEADER_CODE) + continue mpgcheck; + + if (more) + loadMPG2(check, i, Common.getSettings().getBooleanProperty(Keys.KEY_simpleMPG), false, nullpacket, buffersize_2); - return checkH264(check, length); + return CommonParsing.MPEG2PS_TYPE; + } + } - //return false; + return -1; } /** * */ - private boolean checkH264(byte[] check, int length) - { - ByteArrayOutputStream bytecheck = new ByteArrayOutputStream(); - int[] BitPosition = { 0 }; + private int scanPrimaryPES(byte[] check, int buffersize_1, int buffersize_2, boolean more) throws Exception + { + boolean nullpacket = false; - for (int i = 0, flag, nal_unit, nal_ref, profile, forb_zero, level_idc, hori, vert, j = length - 50; i < j; i++) + vdrcheck: + for (int i = 0, returncode; i < buffersize_1; i++) { - if (check[i] != 0 || check[1 + i] != 0 || check[2 + i] != 0 || check[3 + i] != 1) - continue; - - BitPosition[0] = (4 + i)<<3; - - forb_zero = getBits(check, BitPosition, 1); //forb_zero = 0x80 & check[4 + i]; - nal_ref = getBits(check, BitPosition, 2); //nal_ref = (0xE0 & check[4 + i])>>>5; - nal_unit = getBits(check, BitPosition, 5); //nal_unit = 0x1F & check[4 + i]; + if ((returncode = CommonParsing.validateStartcode(check, i)) < 0 || (0xF0 & CommonParsing.getPES_IdField(check, i)) != 0xE0) + { + i += (returncode < 0 ? -returncode : 4) - 1; + continue vdrcheck; + } - if (forb_zero != 0 || nal_unit != 7) - continue; + int next = i + 6 + CommonParsing.getPES_LengthField(check, i); - //seq_param - profile = getBits(check, BitPosition, 8); //profile = 0xFF & check[5 + i]; - getBits(check, BitPosition, 3); //constraint 0,1,2 - getBits(check, BitPosition, 5); //5 zero_bits - - level_idc = getBits(check, BitPosition, 8); //0xFF & check[7 + i]; - flag = getCodeNum(check, BitPosition); // seq_parameter_set_id 0 ue(v) - flag = getCodeNum(check, BitPosition); // log2_max_frame_num_minus4 0 ue(v) - flag = getCodeNum(check, BitPosition); // pic_order_cnt_type 0 ue(v) + if ( (next == i + 6) && (0xC0 & check[i + 6]) == 0x80 && (0xC0 & check[i + 8]) == 0) + { + addInfo = " !!(VPacketLengthField is 0)"; + next = i; + nullpacket = true; + } - if (flag == 0) - getCodeNum(check, BitPosition); // log2_max_pic_order_cnt_lsb_minus4 0 ue(v) + if (CommonParsing.validateStartcode(check, next) < 0) + continue vdrcheck; - else if (flag == 1) + else { - getBits(check, BitPosition, 1); //delta_pic_order_always_zero_flag 0 u(1) - getSignedCodeNum(check, BitPosition); //offset_for_non_ref_pic 0 se(v) - getSignedCodeNum(check, BitPosition); //offset_for_top_to_bottom_field 0 se(v) - flag = getCodeNum(check, BitPosition); // num_ref_frames_in_pic_order_cnt_cycle 0 ue(v) + if (more) + loadMPG2(check, i, !Common.getSettings().getBooleanProperty(Keys.KEY_enhancedPES), false, nullpacket, buffersize_2); - for (int k = 0; k < flag; k++) - getSignedCodeNum(check, BitPosition); //offset_for_ref_frame[ i ] 0 se(v) + return CommonParsing.PES_AV_TYPE; } + } - getCodeNum(check, BitPosition); //num_ref_frames 0 ue(v) - getBits(check, BitPosition, 1); //gaps_in_frame_num_value_allowed_flag 0 u(1) - hori = 16 * (1 + getCodeNum(check, BitPosition)); //pic_width_in_mbs_minus1 0 ue(v) - vert = 16 * (1 + getCodeNum(check, BitPosition)); //pic_height_in_map_units_minus1 0 ue(v) - flag = getBits(check, BitPosition, 1); //frame_mbs_only_flag 0 u(1) - - video_streams.add("MPEG-4/H.264, " + hori + "*" + (flag == 0 ? vert<<1 : vert)); - return true; - } - - return false; + return -1; } /** * */ - private int getSignedCodeNum(byte[] array, int[] BitPosition) + private int scanSecondaryPES(byte[] check, int buffersize_1, int buffersize_2, boolean more) throws Exception { - int codeNum = getCodeNum(array, BitPosition); + boolean nullpacket = false; + + rawcheck: + for (int i = 0, returncode; i < buffersize_1; i++) + { + if ((returncode = CommonParsing.validateStartcode(check, i)) < 0) + { + i += (-returncode) - 1; + continue rawcheck; + } - codeNum = (codeNum & 1) == 0 ? codeNum>>>1 : -(codeNum>>>1); + if ( (0xE0 & check[i + 3]) == 0xC0 || (0xFF & check[i + 3]) == 0xBD ) + { + int next = i + 6 + CommonParsing.getPES_LengthField(check, i); - return codeNum; - } + if (CommonParsing.validateStartcode(check, next) < 0) + continue rawcheck; - /** - * - */ - private int getCodeNum(byte[] array, int[] BitPosition) - { - int leadingZeroBits = -1; - int codeNum; + if ( (0xE0 & check[i + 3]) == 0xC0 && (0xE0 & check[i + 3]) == (0xE0 & check[next + 3]) ) + { + if (more) + loadMPG2(check, i, true, false, nullpacket, buffersize_2); + + return CommonParsing.PES_MPA_TYPE; + } + + else if ( (0xFF & check[i + 3]) == 0xBD && ((0xFF & check[next + 3]) == 0xBD || (0xFF & check[next + 3]) == 0xBE)) + { + if (more) + { + if (check[i + 8] == 0x24 && (0xF0 & check[i + 9 + 0x24])>>>4 == 1) + { + addInfo = " (TTX)"; + ttx_streams.add("SubID 0x" + Integer.toHexString((0xFF & check[i + 9 + 0x24])).toUpperCase()); + } - for (int b = 0; b == 0; leadingZeroBits++) - b = getBits(array, BitPosition, 1); + else + loadMPG2(check, i, true, false, nullpacket, buffersize_2); + } - codeNum = (1<>>3; - - if (N == 0) - return 0; + Audio.setNewType(CommonParsing.DTS_AUDIO); - if (Pos >= array.length - 4) + audiocheck: + for (int i = 0; i < buffersize; i++) { - BitPosition[0] += N; - return -1; - } + /* DTS stuff taken from the VideoLAN project. */ + /* Added by R One, 2003/12/18. */ + if (Audio.parseHeader(check, i) < 1) + continue; + + for (int b = 0; b < 15; b++) + { + if (Audio.parseNextHeader(check, i + Audio.getSize() + b) != 1) + continue; + + if ( (0xFF & check[i + Audio.getSize()]) > 0x7F || (0xFF & check[i + Audio.getSize()]) == 0 ) //smpte + continue audiocheck; + + if (more) + { + audio_streams.add(Audio.saveAndDisplayHeader()); + playtime = getAudioTime(size); + } + + if (b == 0) + return CommonParsing.ES_DTS_TYPE; + + else + return CommonParsing.ES_DTS_A_TYPE; + } - Val = (0xFF & array[Pos])<<24 | - (0xFF & array[Pos + 1])<<16 | - (0xFF & array[Pos + 2])<<8 | - (0xFF & array[Pos + 3]); + if (Common.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_allowSpaces)) + { + if (more) + audio_streams.add(Audio.saveAndDisplayHeader()); - Val <<= BitPosition[0] & 7; - Val >>>= 32 - N; + playtime = getAudioTime(size); - BitPosition[0] += N; + return CommonParsing.ES_DTS_TYPE; + } + } - return Val; + return -1; } /** * */ - private void readPMT(byte[] check, int a) - { - ByteArrayOutputStream bytecheck = new ByteArrayOutputStream(); - // pidlist.clear(); - - boolean ts_start = false; + private int scanAc3Audio(byte[] check, int buffersize, boolean more, long size) throws Exception + { + Audio.setNewType(CommonParsing.AC3_AUDIO); - tscheck: - for (int adaptfield, pmtpid, offset; a < check.length - 1000; a++) + audiocheck: + for (int i = 0, gg=0; i < buffersize; i++) { - if ( check[a] != 0x47 || check[a + 188] != 0x47 || check[a + 376] != 0x47 ) - continue tscheck; - - if ((0x40 & check[a + 1]) == 0) // start - continue tscheck; + if (Audio.parseHeader(check, i) < 1) + continue; - if ((0xC0 & check[a + 3]) != 0) // scrambling - continue tscheck; + for (int b = 0; b < 17; b++) + { + if (Audio.parseNextHeader(check, i + Audio.getSize() + b) != 1) + continue; - adaptfield = (0x30 & check[a + 3])>>>4; + if ( (0xFF & check[i + Audio.getSize()]) > 0x3F || (0xFF & check[i + Audio.getSize()]) == 0 ) //smpte + continue audiocheck; - if ((adaptfield & 1) == 0) // adapt - no payload - continue tscheck; + if (more) + { + audio_streams.add(Audio.saveAndDisplayHeader()); + playtime = getAudioTime(size); + } - offset = adaptfield == 3 ? 1 + (0xFF & check[a + 4]) : 0; //adaptlength + if (b == 0) + return CommonParsing.ES_AC3_TYPE; - if (check[a + offset + 4] != 0 || check[a + offset + 5] != 2 || (0xF0 & check[a + offset + 6]) != 0xB0) - { - a += 187; - continue tscheck; + else + return CommonParsing.ES_AC3_A_TYPE; } - bytecheck.write(check, a + 4 + offset, 184 - offset); + if (Common.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_allowSpaces)) + { + if (more) + audio_streams.add(Audio.saveAndDisplayHeader()); - pmtpid = (0x1F & check[a + 1])<<8 | (0xFF & check[a + 2]); + playtime = getAudioTime(size); - if ( bytecheck.size() < 188 ) - { - a += 188; + return CommonParsing.ES_AC3_TYPE; + } + } - addpack: - for ( ; a < check.length - 500; a++) - { - if ( check[a] != 0x47 || check[a + 188] != 0x47 || check[a + 376] != 0x47 ) - continue addpack; + return -1; + } - if ((0x40 & check[a + 1]) != 0) // start - continue addpack; + /** + * + */ + private int scanMpgAudio(byte[] check, int buffersize, boolean more, long size) throws Exception + { + Audio.setNewType(CommonParsing.MPEG_AUDIO); - if ((0xC0 & check[a + 3]) != 0) // scrambling - continue addpack; + audiocheck: + for (int i = 0; i < buffersize; i++) + { + if (Audio.parseHeader(check, i) < 1) + continue; - adaptfield = (0x30 & check[a + 3])>>>4; + if (!Common.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_allowSpaces) && Audio.parseNextHeader(check, i + Audio.getSize()) < 0) + continue audiocheck; +// + if (!Common.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_allowSpaces) && Audio.parseNextHeader(check, i + Audio.getSize() + Audio.getNextSize()) < 0) + continue audiocheck; +// + if (more) + { + audio_streams.add(Audio.saveAndDisplayHeader()); + playtime = getAudioTime(size); + } - if ((adaptfield & 1) == 0) // adapt - no payload - continue addpack; + return CommonParsing.ES_MPA_TYPE; + } - offset = adaptfield == 3 ? 1 + (0xFF & check[a + 4]) : 0; //adaptlength + return -1; + } - if ( ((0x1F & check[a + 1])<<8 | (0xFF & check[a + 2])) != pmtpid ) - { - a += 187; - continue addpack; - } + /** + * + */ + private int scanMpgVideo(byte[] check, int buffersize, boolean more) throws Exception + { + mpvcheck: + if (checkVid(check, buffersize)) + return CommonParsing.ES_MPV_TYPE; - bytecheck.write(check, a + 4 + offset, 184 - offset); + return -1; + } - if ( bytecheck.size() > 188 ) - break addpack; - } - } + /** + * + */ + private int AC3Audio(byte[] check) + { + Audio.setNewType(CommonParsing.AC3_AUDIO); - byte[] pmt = bytecheck.toByteArray(); + audiocheck: + for (int a=0; a<10000; a++) + { + if (Audio.parseHeader(check, a) < 0) + continue audiocheck; - if (pmt.length > 5) + for (int b = 0; b < 17; b++) { - int sid = (0xFF & pmt[4])<<8 | (0xFF & pmt[5]); - pidlist.add("" + sid); - pidlist.add("" + pmtpid); - addInfo = " (SID 0x" + Integer.toHexString(sid).toUpperCase() + " ,PMT 0x" + Integer.toHexString(pmtpid).toUpperCase() + ")"; + if (Audio.parseNextHeader(check, a + Audio.getSize() + b) == 1) + { + if ( (0xFF & check[a + Audio.getSize()]) > 0x3f || (0xFF & check[a + Audio.getSize()]) == 0 ) //smpte + continue audiocheck; + + audio_streams.add(Audio.saveAndDisplayHeader()); + + return 1; + } } + } - int pmt_len = (0xF&pmt[2])<<8 | (0xFF&pmt[3]); + return 0; + } - pidsearch: - for (int b=8, r=8; b < pmt_len-4 && b < pmt.length-6; b++) - { - r = b; + /* DTS stuff taken from the VideoLAN project. */ + /* Added by R One, 2003/12/18. */ + private int DTSAudio(byte[] check) + { + Audio.setNewType(CommonParsing.DTS_AUDIO); - if ( (0xe0 & pmt[b+1]) != 0xe0 ) - continue pidsearch; + audiocheck: + for (int i = 0; i < 10000; i++) + { + if (Audio.parseHeader(check, i) < 0) + continue audiocheck; - int pid = (0x1F & pmt[b+1])<<8 | (0xFF & pmt[b+2]); + for (int j = 0; j < 15; j++) + { + if (Audio.parseNextHeader(check, i + Audio.getSize() + j) == 1) + { + if ( (0xFF & check[i + Audio.getSize()]) > 0x7F || (0xFF & check[i + Audio.getSize()]) == 0 ) //smpte + continue audiocheck; - switch(0xFF & pmt[b]) - { - case 1: - case 2: - getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 2); - pidlist.add("" + pid); - break; + audio_streams.add(Audio.saveAndDisplayHeader()); - case 3: - case 4: - getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 4); - pidlist.add("" + pid); - break; + return 1; + } + } + } - case 0x1B: - getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 0x1B); - pidlist.add("" + pid); - break; + return 0; + } - case 0x80: - case 0x81: //private data of AC3 in ATSC - case 0x82: - case 0x83: - case 6: - getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 6); - pidlist.add("" + pid); - break; + /** + * + */ + private int MPEGAudio(byte[] check) + { + Audio.setNewType(CommonParsing.MPEG_AUDIO); - default: - b += 4+ (0xFF & pmt[b+4]); - } + audiocheck: + for (int a = 0; a < 10000; a++) + { + if (Audio.parseHeader(check, a) < 0) + continue audiocheck; - if (b < 0) - b = r; - } - return; - } - return; + if (Audio.parseNextHeader(check, a + Audio.getSize()) < 0) + continue audiocheck; + + audio_streams.add(Audio.saveAndDisplayHeader()); + + return 1; + } + + return 0; } /** * */ - private void getDescriptor(byte check[], int off, int end, int pid, int type) - { - String str = ""; - int chunk_end = 0; + private int LPCMAudio(byte[] check) + { + Audio.setNewType(CommonParsing.LPCM_AUDIO); - try + audiocheck: + for (int a = 0; a < 1000; a++) { - loop: - for (; off < end && off < check.length; off++) - { - switch(0xFF & check[off]) - { - case 0x59: //dvb subtitle descriptor - type = 0x59; - chunk_end = off + 2 + (0xFF & check[off+1]); - str += "("; + if (Audio.parseHeader(check, a) < 0) + continue audiocheck; - for (int a=off+2; a check.length) + break; - int page_type = (0xF8 & check[a+3])>>>3; - int page_number = 0xFF & check[a+4]; + bytecheck.write(check, offs, len); - str += "_"; + a += 6 + jump; + } - switch (page_type) - { - case 1: - str += "i"; - break; - case 2: - str += "s"; - break; - case 3: - str += "ai"; - break; - case 4: - str += "ps"; - break; - case 5: - str += "s.hip"; - break; - default: - str += "res"; - } + return bytecheck.toByteArray(); + } - str += Integer.toHexString((7 & check[a+3]) == 0 ? 8 : (7 & check[a+3])).toUpperCase(); - str += (page_number < 0x10 ? "0" : "") + Integer.toHexString(page_number).toUpperCase() + " "; - } + /** + * + */ + private void loadMPG2(byte[] check, int b, boolean vdr, boolean mpg1, boolean nullpacket, int size) throws IOException + { + Hashtable table = new Hashtable(); + ScanObject scanobject; - str += ")"; - //break loop; - off++; - off += (0xFF & check[off]); - break; + String str; + int jump = 1, id; + int end = check.length > 580000 ? 512000 : check.length - 65000; - case 0xA: //ISO 639 language descriptor - str += "("; + mpg2check: + for (int a = b, returncode, subid; a < end; a += jump) + { + if ((returncode = CommonParsing.validateStartcode(check, a)) < 0) + { + jump = -returncode; + continue mpg2check; + } - for (int a=off+2; a>>4 == 1) + { + str = "SubID 0x" + Integer.toHexString(pes_subid).toUpperCase(); - case 2: - case 0xC3: - video_streams.add(out + str); - break; + if (ttx_streams.indexOf(str) < 0) + ttx_streams.add(str); + } - case 4: - audio_streams.add(out + str); - break; + else if ( ((!mpg1 && !vdr) || (vdr && pes_alignment)) && (pes_subid>>>4 == 2 || pes_subid>>>4 == 3)) + { + str = "SubID 0x" + Integer.toHexString(pes_subid).toUpperCase(); - default: - audio_streams.add(out + str + "[PD]"); - } + if (pic_streams.indexOf(str) < 0) + pic_streams.add(str); + } - } - catch (ArrayIndexOutOfBoundsException ae) - { - playtime += msg_6; - } - } + else + { + if (!vdr) + { + id = 0xFF & check[a + 9 + pes_extensionlength]; + str = String.valueOf(id); - /** - * - */ - private int testFile(XInputFile aXInputFile, boolean more, int assigned_streamtype) - { - long len = aXInputFile.length(); + check[a + 8] = (byte)((pes_subid>>>4 == 0xA ? 1 : 4) + pes_extensionlength); + // check[a + 8] = (byte)(4 + pes_extensionlength); + } - int ret = testFile(aXInputFile, more, 0, assigned_streamtype); + if (!table.containsKey(str)) + table.put(str, new ScanObject(id)); - if (ret != 0) - return ret; + scanobject = (ScanObject)table.get(str); - // if type is not yet detected, try it again on a later position (10% of length) - return testFile(aXInputFile, more, len / 10, assigned_streamtype); - } + scanobject.write(check, a, jump ); + } + } - /** - * - */ - private int testFile(XInputFile aXInputFile, boolean more, long position, int assigned_streamtype) - { - video_streams.clear(); - audio_streams.clear(); - ttx_streams.clear(); - pic_streams.clear(); - pidlist.clear(); + else + { + switch (id) + { + case 0xBB: + case 0xBC: + case 0xBE: + case 0xBF: + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + jump = 6 + CommonParsing.getPES_LengthField(check, a); + break; - addInfo = ""; - playtime = ""; - hasVideo = false; + default: + jump = 1; + } + } + } - long size = 0; - int buffersize = Integer.parseInt(Common.getSettings().getProperty(Keys.KEY_ScanBuffer)); - if (buffersize <= 0) - buffersize = 1024000; + for (Enumeration n = table.keys(); n.hasMoreElements() ; ) + { + str = n.nextElement().toString(); + id = Integer.parseInt(str); - int bs0 = buffersize / 100; - int bs1 = buffersize / 50; - int bs2 = buffersize / 10; - int bs3 = buffersize / 4; - int bs4 = buffersize - 65536; + scanobject = (ScanObject)table.get(str); - byte[] check = new byte[buffersize]; + if ( (0xF0 & id) == 0xE0) + { + try { + checkVid(scanobject.getData()); - ByteArrayOutputStream bytecheck = new ByteArrayOutputStream(); + } catch (Exception e) { - try { + video_streams.add(msg_8); + } + } - size = aXInputFile.length(); + else + { + try { + checkPES(scanobject.getData()); - XInputFile aXif = aXInputFile.getNewInstance(); + } catch (Exception e) { - if (aXif == null) - { - check = null; - return CommonParsing.Unsupported; + audio_streams.add(msg_8); + } } + } - aXif.randomAccessSingleRead(check, position); - - int returncode = -1; - int[] mapping = { -1, -1, 5, 4, 4, 3, 2, 6, 6, 10, 9, 8, 8, 7, 7, 0, 0, 1 }; - int streamtype = mapping[assigned_streamtype + 1]; + table.clear(); - scanloop: - for (int index = streamtype; returncode < CommonParsing.Unsupported; index++) - { - switch (index) - { - case -1: - break; + return; + } - case 0: - returncode = scanRiffAudio(check, bs0, more, size); - break; + /** + * + */ + private void loadPVA(byte[] check, int a) throws IOException + { + Hashtable table = new Hashtable(); + ScanObject scanobject; - case 1: - returncode = scanSubpicture(check, bs0, more); - break; + String str; + int jump, id; + int end = check.length > 580000 ? 512000 : check.length - 65000; - case 2: - returncode = scanTS(check, bs4, more); - break; + while ( a < end) + { + jump = (0xFF & check[a+6])<<8 | (0xFF & check[a+7]); - case 3: - returncode = scanPVA(check, bs1, more); - break; + if (a + 8 + ((1 & check[a+5]>>>4) * 4) + jump > check.length) + break; - case 4: - returncode = scanMpg12(check, bs2, bs1, more); - break; + id = 0xFF & check[a+2]; + str = String.valueOf(id); - case 5: - returncode = scanPrimaryPES(check, bs4, bs3, more); - break; + if (!table.containsKey(str)) + table.put(str, new ScanObject(id)); - case 6: - returncode = scanSecondaryPES(check, bs2, bs3, more); - break; + scanobject = (ScanObject)table.get(str); - case 7: - returncode = scanDtsAudio(check, bs1, more, size); - break; + switch (id) + { + case 1: + scanobject.write(check, a + 8 + ((1 & check[a+5]>>>4) * 4), jump ); + break; - case 8: - returncode = scanAc3Audio(check, bs1, more, size); - break; + default: + scanobject.write(check, a + 8, jump ); + } - case 9: - returncode = scanMpgAudio(check, bs1, more, size); - break; + a += 8 + jump; + } - case 10: - returncode = scanMpgVideo(check, bs3, more); - break; + for (Enumeration n = table.keys(); n.hasMoreElements() ; ) + { + str = n.nextElement().toString(); - default: - break scanloop; - } + scanobject = (ScanObject)table.get(str); - if (assigned_streamtype != -1) - returncode = assigned_streamtype; - } + if (str.equals("1")) + { + try { + checkVid(scanobject.getData()); - check = null; + } catch ( Exception e) { - if (returncode > 0) - return returncode; + video_streams.add(msg_8); + } + } + else + { + try { + checkPES(scanobject.getData()); - } catch (Exception e) { + } catch ( Exception e) { - playtime = msg_8; - Common.setExceptionMessage(e); + audio_streams.add(msg_8); + } + } } - check = null; + table.clear(); - return CommonParsing.Unsupported; + return; } /** * */ - private int scanRiffAudio(byte[] check, int buffersize, boolean more, long size) throws Exception - { - Audio.setNewType(CommonParsing.WAV_AUDIO); + private void checkPES(byte[] check) + { + checkPES(check, 0); + } - riffcheck: - for (int i = 0, ERRORCODE; i < buffersize; i++) //compressed as AC3,MPEG is currently better detected as ES-not RIFF + /** + * + */ + private void checkPES(byte[] check, int a) + { + int end = a + 8000; + + rawcheck: + for (int returncode; a < end; a++) { - ERRORCODE = Audio.parseHeader(check, i); + if ((returncode = CommonParsing.validateStartcode(check, a)) < 0) + { + a += (-returncode) - 1; + continue rawcheck; + } - if (ERRORCODE > -1) + if ( (0xE0 & check[a+3]) == 0xC0 || CommonParsing.getPES_IdField(check, a) == CommonParsing.PRIVATE_STREAM_1_CODE) { - Audio.saveHeader(); + int next = a + 6 + CommonParsing.getPES_LengthField(check, a); - if (more) - { - audio_streams.add(Audio.displayHeader()); - playtime = getAudioTime(size); - } + if (CommonParsing.validateStartcode(check, next) < 0) + continue rawcheck; - if (ERRORCODE > 0) - return CommonParsing.ES_RIFF_TYPE; + if ( (0xE0 & check[a+3]) == 0xC0 && (0xE0 & check[a+3]) == (0xE0 & check[next+3]) ) + { + MPEGAudio(loadPES(check,a)); - else if (Audio.getLastModeExtension() > 1) - break riffcheck; + return; + } - else - return CommonParsing.ES_cRIFF_TYPE; + else if (CommonParsing.getPES_IdField(check, a) == CommonParsing.PRIVATE_STREAM_1_CODE && CommonParsing.getPES_IdField(check, a) == CommonParsing.getPES_IdField(check, next)) + { + byte buffer[] = loadPES(check, a); + + if (AC3Audio(buffer) != 0) + return; + + else if (DTSAudio(buffer) != 0) + return; + + LPCMAudio(buffer); + + return; + } } } + } - return -1; + /** + * + */ + private void checkVid(byte[] check) + { + checkVid(check, check.length - 630); } /** * */ - private int scanSubpicture(byte[] check, int buffersize, boolean more) throws Exception - { - supcheck: - for (int i = 0, supframe_size, supframe_link, supframe_check, supframe_check2; i < buffersize; i++) - { - if (check[i] != 0x53 || check[i + 1]!=0x50) - continue supcheck; + private boolean checkVid(byte[] check, int length) + { + ByteArrayOutputStream bytecheck = new ByteArrayOutputStream(); - supframe_size = (0xFF & check[i + 10])<<8 | (0xFF & check[i + 11]); - supframe_link = (0xFF & check[i + 12])<<8 | (0xFF & check[i + 13]); - supframe_check = (0xFF & check[i + 12 + supframe_link])<<8 | (0xFF & check[i + 13 + supframe_link]); - supframe_check2 = (0xFF & check[i + 36 + supframe_link])<<8 | (0xFF & check[i + 37 + supframe_link]); + for (int i = 0, returncode, pes_ID; i < length; i++) + { + if ((returncode = CommonParsing.validateStartcode(check, i)) < 0 || CommonParsing.getPES_IdField(check, i) != CommonParsing.SEQUENCE_HEADER_CODE) + { + i += (returncode < 0 ? -returncode : 4) - 1; + continue; + } - if (supframe_link == supframe_check - 24 && supframe_check == supframe_check2) + for (int j = 7, mpgtype = 1; j < 600; j++) { - if (more) + if ((returncode = CommonParsing.validateStartcode(check, i + j)) < 0) { - int b = i + 14 + supframe_link, c = b + 24, d, xa, xe, ya, ye; - - for (d = b; d < c; d++) - { - switch(0xFF & check[d]) - { - case 1: - d++; - continue; - - case 2: - d += 24; - continue; - - case 3: - case 4: - d += 2; - continue; - - case 6: - d += 4; - continue; - - case 5: - xa= (0xFF & check[++d])<<4 | (0xF0 & check[++d])>>>4; - xe= (0xF & check[d])<<8 | (0xFF & check[++d]); - ya= (0xFF & check[++d])<<4 | (0xF0 & check[++d])>>>4; - ye= (0xF & check[d])<<8 | (0xFF & check[++d]); + j += (-returncode) - 1; + continue; + } - pic_streams.add("up.left x" + xa + ",y" + ya + " @ size " + (xe - xa + 1) + "*" + (ye - ya + 1)); - } - break; - } + pes_ID = CommonParsing.getPES_IdField(check, i + j); - byte packet[] = new byte[10 + supframe_size]; + if (pes_ID == CommonParsing.EXTENSION_START_CODE && (0xF0 & check[4 + i + j]) == 0x10) + mpgtype = 2; - System.arraycopy(check, i, packet, 0, 10 + supframe_size); + else if (pes_ID == CommonParsing.GROUP_START_CODE || pes_ID == CommonParsing.PICTURE_START_CODE) + { + hasVideo = true; + System.arraycopy(check, i, vbasic, 0, 12); + bytecheck.write(check, i, 20); - // shows first found subpicture scaled on OSD - Common.getSubpictureClass().decode_picture(packet, 10, true, new String[2]); + video_streams.add("MPEG-" + mpgtype + ", " + Video.getVideoformatfromBytes(bytecheck.toByteArray())); + + return true; } + } + } - return CommonParsing.ES_SUP_TYPE; - } + String[] h264_info = new String[18]; + boolean isH264 = Common.getMpvDecoderClass().parseH264(check, length, h264_info); + + if (isH264) + { + video_streams.add(h264_info[0] + " " + h264_info[1] + " " + h264_info[2] + " " + h264_info[3]); + return true; } - return -1; + return false; } /** * */ - private int scanTS(byte[] check, int buffersize, boolean more) throws Exception - { - mpegtscheck: - for (int i = 0; i < buffersize; i++) - { - if ( check[i] != 0x47 || check[i + 188] != 0x47 || check[i + 376] != 0x47 || check[i + 564] != 0x47 || check[i + 752] != 0x47) - continue mpegtscheck; + private void readPMT(byte[] check, int a, int lead) + { + ByteArrayOutputStream bytecheck = new ByteArrayOutputStream(); + // pidlist.clear(); - readPMT(check, i); + boolean ts_start = false; + int packetlength = 188; - return CommonParsing.TS_TYPE; - } + tscheck: + for (int adaptfield, pmtpid, offset; a < check.length - 1000; a++) + { + if ( check[a] != 0x47 || check[a + packetlength + lead] != 0x47 || check[a + (packetlength + lead) * 2] != 0x47 ) + continue tscheck; - return -1; - } + if ((0x40 & check[a + 1]) == 0) // start + continue tscheck; - /** - * - */ - private int scanPVA(byte[] check, int buffersize, boolean more) throws Exception - { - pvacheck: - for (int i = 0; i < buffersize; i++) - { - if ( check[i] != 0x41 || check[i + 1] != 0x56 || check[i + 4] != 0x55 ) - continue pvacheck; + if ((0xC0 & check[a + 3]) != 0) // scrambling + continue tscheck; - int next = i + 8 + ((0xFF & check[i + 6])<<8 | (0xFF & check[i + 7])); + adaptfield = (0x30 & check[a + 3])>>>4; - if ( check[next] != 0x41 || check[next + 1] != 0x56 || check[next + 4] != 0x55 ) - continue pvacheck; + if ((adaptfield & 1) == 0) // adapt - no payload + continue tscheck; - else - { - if (more) - loadPVA(check, i); + offset = adaptfield == 3 ? 1 + (0xFF & check[a + 4]) : 0; //adaptlength - return CommonParsing.PVA_TYPE; + if (check[a + offset + 4] != 0 || check[a + offset + 5] != 2 || (0xF0 & check[a + offset + 6]) != 0xB0) + { + a += (packetlength + lead - 1); + continue tscheck; } - } - return -1; - } + bytecheck.write(check, a + 4 + offset, packetlength - 4 - offset); - /** - * - */ - private int scanMpg12(byte[] check, int buffersize_1, int buffersize_2, boolean more) throws Exception - { - boolean nullpacket = false; + pmtpid = (0x1F & check[a + 1])<<8 | (0xFF & check[a + 2]); - mpgcheck: - for (int i = 0, j, flag, returncode; i < buffersize_1; i++) - { - if ((returncode = CommonParsing.validateStartcode(check, i)) < 0 || CommonParsing.getPES_IdField(check, i) != CommonParsing.PACK_START_CODE) - { - i += (returncode < 0 ? -returncode : 4) - 1; - continue mpgcheck; - } + if ( bytecheck.size() < packetlength ) + { + a += packetlength + lead; - flag = 0xC0 & check[i + 4]; + addpack: + for ( ; a < check.length - 500; a++) + { + if ( check[a] != 0x47 || check[a + packetlength + lead] != 0x47 || check[a + (packetlength + lead) * 2] != 0x47 ) + continue addpack; - if (flag == 0) - { - j = i + 12; + if ((0x40 & check[a + 1]) != 0) // start + continue addpack; - if (CommonParsing.validateStartcode(check, j) < 0 || CommonParsing.getPES_IdField(check, j) < CommonParsing.SEQUENCE_HEADER_CODE) - continue mpgcheck; + if ((0xC0 & check[a + 3]) != 0) // scrambling + continue addpack; - if (more) - loadMPG2(check, i, false, true, nullpacket, buffersize_2); + adaptfield = (0x30 & check[a + 3])>>>4; - return CommonParsing.MPEG1PS_TYPE; - } + if ((adaptfield & 1) == 0) // adapt - no payload + continue addpack; - else if (flag == 0x40 ) - { - j = i + 14 + (7 & check[i + 13]); + offset = adaptfield == 3 ? 1 + (0xFF & check[a + 4]) : 0; //adaptlength - if (CommonParsing.validateStartcode(check, j) < 0 || CommonParsing.getPES_IdField(check, j) < CommonParsing.SEQUENCE_HEADER_CODE) - continue mpgcheck; + if ( ((0x1F & check[a + 1])<<8 | (0xFF & check[a + 2])) != pmtpid ) + { + a += (packetlength + lead - 1); + continue addpack; + } - if (more) - loadMPG2(check, i, Common.getSettings().getBooleanProperty(Keys.KEY_simpleMPG), false, nullpacket, buffersize_2); + bytecheck.write(check, a + 4 + offset, packetlength - 4 - offset); - return CommonParsing.MPEG2PS_TYPE; + if ( bytecheck.size() > packetlength ) + break addpack; + } } - } - - return -1; - } - /** - * - */ - private int scanPrimaryPES(byte[] check, int buffersize_1, int buffersize_2, boolean more) throws Exception - { - boolean nullpacket = false; + byte[] pmt = bytecheck.toByteArray(); - vdrcheck: - for (int i = 0, returncode; i < buffersize_1; i++) - { - if ((returncode = CommonParsing.validateStartcode(check, i)) < 0 || (0xF0 & CommonParsing.getPES_IdField(check, i)) != 0xE0) + if (pmt.length > 5) { - i += (returncode < 0 ? -returncode : 4) - 1; - continue vdrcheck; + int sid = (0xFF & pmt[4])<<8 | (0xFF & pmt[5]); + pidlist.add("" + sid); + pidlist.add("" + pmtpid); + addInfo = " (SID 0x" + Common.adaptString(Integer.toHexString(sid).toUpperCase(), 4) + ", PMT 0x" + Common.adaptString(Integer.toHexString(pmtpid).toUpperCase(), 4) + ")"; } - int next = i + 6 + CommonParsing.getPES_LengthField(check, i); + int pmt_len = (0xF&pmt[2])<<8 | (0xFF&pmt[3]); - if ( (next == i + 6) && (0xC0 & check[i + 6]) == 0x80 && (0xC0 & check[i + 8]) == 0) - { - addInfo = " !!(VPacketLengthField is 0)"; - next = i; - nullpacket = true; - } + pidsearch: + for (int b=8, r=8; b < pmt_len-4 && b < pmt.length-6; b++) + { + r = b; - if (CommonParsing.validateStartcode(check, next) < 0) - continue vdrcheck; + if ( (0xe0 & pmt[b+1]) != 0xe0 ) + continue pidsearch; - else - { - if (more) - loadMPG2(check, i, !Common.getSettings().getBooleanProperty(Keys.KEY_enhancedPES), false, nullpacket, buffersize_2); + int pid = (0x1F & pmt[b+1])<<8 | (0xFF & pmt[b+2]); - return CommonParsing.PES_AV_TYPE; - } - } + switch(0xFF & pmt[b]) + { + case 1: + getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 1); + pidlist.add("" + pid); + break; - return -1; + case 2: + getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 2); + pidlist.add("" + pid); + break; + + case 3: //mp1a + getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 3); + pidlist.add("" + pid); + break; + + case 4: //mp2a + getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 4); + pidlist.add("" + pid); + break; + + case 0x11: //mp4a + getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 0x11); + pidlist.add("" + pid); + break; + + case 0x1B: + getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 0x1B); + pidlist.add("" + pid); + break; + + case 0x80: + case 0x81: //private data of AC3 in ATSC + case 0x82: + case 0x83: + case 0xA0: //user private + case 6: + getDescriptor(pmt, b+5, (b += 4+ (0xFF & pmt[b+4])), pid, 6); + pidlist.add("" + pid); + break; + + default: + b += 4+ (0xFF & pmt[b+4]); + } + + if (b < 0) + b = r; + } + return; + } + return; } /** * */ - private int scanSecondaryPES(byte[] check, int buffersize_1, int buffersize_2, boolean more) throws Exception + private void getDescriptor(byte check[], int off, int end, int pid, int type) { - boolean nullpacket = false; + String str = ""; + int chunk_end = 0; - rawcheck: - for (int i = 0, returncode; i < buffersize_1; i++) + try { - if ((returncode = CommonParsing.validateStartcode(check, i)) < 0) + loop: + for (; off < end && off < check.length; off++) { - i += (-returncode) - 1; - continue rawcheck; - } - if ( (0xE0 & check[i + 3]) == 0xC0 || (0xFF & check[i + 3]) == 0xBD ) - { - int next = i + 6 + CommonParsing.getPES_LengthField(check, i); + switch(0xFF & check[off]) + { + case 0x59: //dvb subtitle descriptor + type = 0x59; + chunk_end = off + 2 + (0xFF & check[off+1]); + str += "("; + + for (int a=off+2; a>>3; + int page_number = 0xFF & check[a+4]; - return CommonParsing.PES_MPA_TYPE; - } + str += "_"; - else if ( (0xFF & check[i + 3]) == 0xBD && check[i + 3] == check[next + 3] ) - { - if (more) - { - if (check[i + 8] == 0x24 && (0xF0 & check[i + 9 + 0x24])>>>4 == 1) + switch (page_type) { - addInfo = " (TTX)"; - ttx_streams.add("SubID 0x" + Integer.toHexString((0xFF & check[i + 9 + 0x24])).toUpperCase()); + case 1: + str += "i"; + break; + case 2: + str += "s"; + break; + case 3: + str += "ai"; + break; + case 4: + str += "ps"; + break; + case 5: + str += "s.hip"; + break; + default: + str += "res"; } - else - loadMPG2(check, i, true, false, nullpacket, buffersize_2); + str += Integer.toHexString((7 & check[a+3]) == 0 ? 8 : (7 & check[a+3])).toUpperCase(); + str += (page_number < 0x10 ? "0" : "") + Integer.toHexString(page_number).toUpperCase() + " "; } - return CommonParsing.PES_PS1_TYPE; - } - } - } + str += ")"; + //break loop; + off++; + off += (0xFF & check[off]); + break; - return -1; - } + case 0xA: //ISO 639 language descriptor + str += "{"; - /** - * - */ - private int scanDtsAudio(byte[] check, int buffersize, boolean more, long size) throws Exception - { - Audio.setNewType(CommonParsing.DTS_AUDIO); + for (int a=off+2; a 0) + str += (char)(0xFF & check[a]); - audiocheck: - for (int i = 0; i < buffersize; i++) - { - /* DTS stuff taken from the VideoLAN project. */ - /* Added by R One, 2003/12/18. */ - if (Audio.parseHeader(check, i) < 1) - continue; + str += "}"; + off++; + off += (0xFF & check[off]); + break; - for (int b = 0; b < 15; b++) - { - if (Audio.parseNextHeader(check, i + Audio.getSize() + b) != 1) - continue; + case 0x6A: //ac3 descriptor + str += "(AC-3)"; + off++; + off += (0xFF & check[off]); + break; - if ( (0xFF & check[i + Audio.getSize()]) > 0x7F || (0xFF & check[i + Audio.getSize()]) == 0 ) //smpte - continue audiocheck; + case 0x7C: //aac descriptor + str += "(AAC)"; + off++; + off += (0xFF & check[off]); + break; - if (more) - { - audio_streams.add(Audio.saveAndDisplayHeader()); - playtime = getAudioTime(size); - } + case 0xA0: //user priv descriptor + str += "(FOURCC="; - if (b == 0) - return CommonParsing.ES_DTS_TYPE; + for (int a=off+2; a 0) + str += (char)(0xFF & check[a]); - else - return CommonParsing.ES_DTS_A_TYPE; - } + str += ")"; + off++; + off += (0xFF & check[off]); + break; - if (Common.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_allowSpaces)) - { - if (more) - audio_streams.add(Audio.saveAndDisplayHeader()); + case 0xC3: //VBI descriptor + off++; - playtime = getAudioTime(size); + switch (0xFF & check[off + 1]) + { + case 4: + str += "(VPS)"; + type = 0xC3; + break; + case 5: + str += "(WSS)"; + break; + case 6: + str += "(CC)"; + break; + case 1: + str += "(EBU-TTX)"; + break; + case 7: + str += "(VBI)"; + break; + } - return CommonParsing.ES_DTS_TYPE; - } - } + off += (0xFF & check[off]); + break; - return -1; - } + case 0x52: //ID of service + chunk_end = off + 2 + (0xFF & check[off+1]); + str += "(#" + (0xFF & check[off + 2]) + ")"; + off++; + off += (0xFF & check[off]); + break; - /** - * - */ - private int scanAc3Audio(byte[] check, int buffersize, boolean more, long size) throws Exception - { - Audio.setNewType(CommonParsing.AC3_AUDIO); + case 0x6B: //ancillary desc + chunk_end = off + 2 + (0xFF & check[off + 1]); + str += "(RDS)"; + off++; + off += (0xFF & check[off]); + break; - audiocheck: - for (int i = 0; i < buffersize; i++) - { - if (Audio.parseHeader(check, i) < 1) - continue; + case 0x5: //registration descriptor + chunk_end = off + 2 + (0xFF & check[off+1]); + str += "("; - for (int b = 0; b < 17; b++) - { - if (Audio.parseNextHeader(check, i + Audio.getSize() + b) != 1) - continue; + for (int a=off+2; a 0x3F || (0xFF & check[i + Audio.getSize()]) == 0 ) //smpte - continue audiocheck; + str += ")"; + // break;//?? - if (more) - { - audio_streams.add(Audio.saveAndDisplayHeader()); - playtime = getAudioTime(size); + default: + off++; + off += (0xFF & check[off]); } - - if (b == 0) - return CommonParsing.ES_AC3_TYPE; - - else - return CommonParsing.ES_AC3_A_TYPE; } - if (Common.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_allowSpaces)) - { - if (more) - audio_streams.add(Audio.saveAndDisplayHeader()); + String out = "PID: 0x" + Common.adaptString(Integer.toHexString(pid).toUpperCase(), 4); - playtime = getAudioTime(size); + switch (type) + { + case 0x59: + pic_streams.add(out + str); + break; - return CommonParsing.ES_AC3_TYPE; - } - } + case 0x56: + ttx_streams.add(out + str); + break; - return -1; - } + case 0x1B: + video_streams.add(out + str + "(H.264)"); + break; - /** - * - */ - private int scanMpgAudio(byte[] check, int buffersize, boolean more, long size) throws Exception - { - Audio.setNewType(CommonParsing.MPEG_AUDIO); + case 1: + video_streams.add(out + str + "(MPEG-1)"); + break; - audiocheck: - for (int i = 0; i < buffersize; i++) - { - if (Audio.parseHeader(check, i) < 1) - continue; + case 2: + video_streams.add(out + str + "(MPEG-2)"); + break; - if (!Common.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_allowSpaces) && Audio.parseNextHeader(check, i + Audio.getSize()) < 0) - continue audiocheck; + case 0xC3: + video_streams.add(out + str); + break; - if (more) - { - audio_streams.add(Audio.saveAndDisplayHeader()); - playtime = getAudioTime(size); - } + case 3: + audio_streams.add(out + str + "(Mpg1)"); + break; - return CommonParsing.ES_MPA_TYPE; - } + case 4: + audio_streams.add(out + str + "(Mpg2)"); + break; - return -1; - } + case 0x11: + audio_streams.add(out + str + "(Mpg4)"); + break; - /** - * - */ - private int scanMpgVideo(byte[] check, int buffersize, boolean more) throws Exception - { - mpvcheck: - if (checkVid(check, buffersize)) - return CommonParsing.ES_MPV_TYPE; + default: + audio_streams.add(out + str + "[PD]"); + } - return -1; + } + catch (ArrayIndexOutOfBoundsException ae) + { + playtime += msg_6; + } } - /** * */ diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamConverter.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamConverter.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamConverter.java 2006-01-22 22:59:24.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamConverter.java 2009-02-07 15:42:32.000000000 +0000 @@ -34,11 +34,13 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; +import java.io.PushbackInputStream; import net.sourceforge.dvb.projectx.common.Resource; import net.sourceforge.dvb.projectx.common.Common; import net.sourceforge.dvb.projectx.common.Keys; import net.sourceforge.dvb.projectx.common.JobProcessing; +import net.sourceforge.dvb.projectx.common.JobCollection; import net.sourceforge.dvb.projectx.io.IDDBufferedOutputStream; import net.sourceforge.dvb.projectx.thirdparty.TS; @@ -46,6 +48,8 @@ import net.sourceforge.dvb.projectx.parser.CommonParsing; import net.sourceforge.dvb.projectx.parser.StreamDemultiplexer; +import net.sourceforge.dvb.projectx.xinput.XInputFile; + /** * create streams @@ -68,6 +72,7 @@ private boolean GeneratePMT = false; private boolean PcrCounter = false; private boolean CreateVdrIndex = false; + private boolean MuxPES = false; private byte[] PackHeader = { 0, 0, 1, (byte)0xBA, 0x44, 0, 4, 0, 4, 1, 0, (byte)0xEA, 0x63, (byte)0xF8 }; // 8000kbps private byte[] LeadingPackHeader = { 0, 0, 1, (byte)0xBA, 0x44, 0, 4, 0, 4, 1, 0, (byte)0xEA, 0x63, (byte)0xF8 }; // 8000kbps @@ -111,6 +116,11 @@ private IDDBufferedOutputStream OutputStream; private ByteArrayOutputStream Buffer; +// + private ArrayList remuxList = new ArrayList(); + + +// public StreamConverter() { PaddingStreamPositions = new ArrayList(); @@ -121,27 +131,27 @@ /** * */ - private void getSettings() + private void getSettings(JobCollection collection) { - ExportVideo = Common.getSettings().getBooleanProperty(Keys.KEY_WriteOptions_writeVideo); - ExportNonVideo = Common.getSettings().getBooleanProperty(Keys.KEY_WriteOptions_writeAudio); - Debug = Common.getSettings().getBooleanProperty(Keys.KEY_DebugLog); - PCR_Delta = Long.parseLong(Common.getSettings().getProperty(Keys.KEY_PcrDelta_Value)); - CutMode = Common.getSettings().getIntProperty(Keys.KEY_CutMode); - AddPcrToStream = Common.getSettings().getBooleanProperty(Keys.KEY_Conversion_addPcrToStream); - MustStartWithVideo = Common.getSettings().getBooleanProperty(Keys.KEY_Conversion_startWithVideo); - SetMainAudioAc3 = Common.getSettings().getBooleanProperty(Keys.KEY_TS_setMainAudioAc3); - GenerateTTX = Common.getSettings().getBooleanProperty(Keys.KEY_TS_generateTtx); - GeneratePMT = Common.getSettings().getBooleanProperty(Keys.KEY_TS_generatePmt); - TsHeaderMode = Common.getSettings().getIntProperty(Keys.KEY_TsHeaderMode); - PcrCounter = Common.getSettings().getBooleanProperty(Keys.KEY_Conversion_PcrCounter); - CreateVdrIndex = Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createVdrIndex); + ExportVideo = collection.getSettings().getBooleanProperty(Keys.KEY_WriteOptions_writeVideo); + ExportNonVideo = collection.getSettings().getBooleanProperty(Keys.KEY_WriteOptions_writeAudio); + Debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog); + PCR_Delta = collection.getSettings().getIntProperty(Keys.KEY_PcrDelta_Value); + CutMode = collection.getSettings().getIntProperty(Keys.KEY_CutMode); + AddPcrToStream = collection.getSettings().getBooleanProperty(Keys.KEY_Conversion_addPcrToStream); + MustStartWithVideo = collection.getSettings().getBooleanProperty(Keys.KEY_Conversion_startWithVideo); + SetMainAudioAc3 = collection.getSettings().getBooleanProperty(Keys.KEY_TS_setMainAudioAc3); + GenerateTTX = collection.getSettings().getBooleanProperty(Keys.KEY_TS_generateTtx); + GeneratePMT = collection.getSettings().getBooleanProperty(Keys.KEY_TS_generatePmt); + TsHeaderMode = collection.getSettings().getIntProperty(Keys.KEY_TsHeaderMode); + PcrCounter = collection.getSettings().getBooleanProperty(Keys.KEY_Conversion_PcrCounter); + CreateVdrIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createVdrIndex); } /** * */ - public void init(String _name, int buffersize, int action, int filenumber) + public void init(JobCollection collection, String _name, int buffersize, int action, int filenumber) { FileName = _name; @@ -158,15 +168,30 @@ SCR_Value = 0; Packet = 0; - getSettings(); + getSettings(collection); Arrays.fill(StuffingData, (byte)0xFF); Buffer.reset(); - if (filenumber == 0) + if (filenumber == 0) + { IDs.clear(); + //prepare teletext insertion, at first file + if (action == CommonParsing.ACTION_TO_TS) + TS.buildTeletextStream(((XInputFile) collection.getInputFile(0)).toString()); + + + //prepare muxing of secondary pes at toVDR + remuxList.clear(); + + MuxPES = Common.getSettings().getBooleanProperty("HiddenKey.VDRExport.MuxPES", false); + + if (action == CommonParsing.ACTION_TO_VDR) + scanSecondaryStreams(collection); + } + try { OutputStream = new IDDBufferedOutputStream(new FileOutputStream(FileName), buffersize); @@ -183,11 +208,11 @@ /** * set broken link flag after a cut */ - private void setBrokenLink(byte[] pes_packet, int pes_offset) + private void setBrokenLink(JobProcessing job_processing, byte[] pes_packet, int pes_offset) { if (CommonParsing.validateStartcode(pes_packet, pes_offset) < 0) { - Common.setMessage("!> invalid start_code of packet"); + Common.setMessage("!> invalid start_code of packet (sbl), pos: " + job_processing.getLastHeaderBytePosition()); return; } @@ -359,7 +384,7 @@ repackMpg1(pes_packet, pes_offset, streamdemultiplexer); if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO && !BrokenLinkFlag) - setBrokenLink(pes_packet, pes_offset); + setBrokenLink(job_processing, pes_packet, pes_offset); if (Buffer.size() != 0) Buffer.reset(); @@ -427,7 +452,7 @@ if (CommonParsing.validateStartcode(pes_packet, pes_offset) < 0) { - Common.setMessage("!> invalid startcode " + Packet + " (" + Integer.toHexString(newID) + "/" + es_streamtype + ")"); + Common.setMessage("!> invalid startcode " + Packet + ", pos: " + job_processing.getLastHeaderBytePosition() + " (" + Integer.toHexString(newID) + "/" + es_streamtype + ")"); return; } @@ -441,7 +466,7 @@ int pes_extensionlength = CommonParsing.getPES_ExtensionLengthField(pes_packet, pes_offset); - CommonParsing.clearBit33ofPTS(pes_packet, pes_offset); + boolean containsPTS = CommonParsing.clearBit33ofPTS(pes_packet, pes_offset); CommonParsing.clearBit33ofDTS(pes_packet, pes_offset); switch (es_streamtype) @@ -489,6 +514,10 @@ CommonParsing.setPES_IdField(pes_packet, pes_offset, newID); + //pes remux + if (containsPTS) + remuxPES(job_processing, CommonParsing.getPTSfromBytes(pes_packet, pes_headerlength + pes_offset)); + break; case CommonParsing.LPCM_AUDIO: @@ -518,7 +547,7 @@ if (CommonParsing.validateStartcode(pes_packet, pes_offset) < 0) { - Common.setMessage("!> invalid startcode " + Packet + " (" + Integer.toHexString(newID) + "/" + es_streamtype + ")"); + Common.setMessage("!> invalid startcode " + Packet + ", pos: " + job_processing.getLastHeaderBytePosition() + " (" + Integer.toHexString(newID) + "/" + es_streamtype + ")"); return; } @@ -724,7 +753,7 @@ if (CommonParsing.validateStartcode(pes_packet, pes_offset) < 0) { - Common.setMessage("!> invalid startcode " + Packet + " (" + Integer.toHexString(newID) + "/" + es_streamtype + ")"); + Common.setMessage("!> invalid startcode " + Packet + ", pos: " + job_processing.getLastHeaderBytePosition() + " (" + Integer.toHexString(newID) + "/" + es_streamtype + ")"); return; } @@ -908,6 +937,8 @@ try { boolean pcr = false; + boolean ttx_pts_check = false; //search for frame pts for ttx insertion + long pcrbase = 0; long pts = 0; @@ -917,7 +948,7 @@ if (CommonParsing.validateStartcode(pes_packet, pes_offset) < 0) { - Common.setMessage("!> invalid startcode " + Packet + " (" + Integer.toHexString(newID) + "/" + es_streamtype + ")"); + Common.setMessage("!> invalid startcode " + Packet + ", pos: " + job_processing.getLastHeaderBytePosition() + " (" + Integer.toHexString(newID) + "/" + es_streamtype + ")"); return; } @@ -963,9 +994,14 @@ return; break; +// + case CommonParsing.SUBPICTURE: + if (!ExportNonVideo || !Common.getSettings().getBooleanProperty("HiddenKey.TSExport.Subpicture", false)) + return; + break; +// case CommonParsing.LPCM_AUDIO: - case CommonParsing.SUBPICTURE: default: return; } @@ -1018,9 +1054,10 @@ if (newID2 < 0xE0) //MPA newID2 |= 0x100; - if (!qinfo) + if (!qinfo) // align syncwords { - if (es_streamtype != CommonParsing.TELETEXT) + // if (es_streamtype != CommonParsing.TELETEXT) + if (es_streamtype != CommonParsing.TELETEXT && es_streamtype != CommonParsing.SUBPICTURE) { if (!CommonParsing.alignSyncword(pes_packet, pes_offset, es_streamtype)) return; @@ -1046,7 +1083,7 @@ */ if (FirstPacket) { - Buffer.write(TS.init( FileName, SetMainAudioAc3, GenerateTTX, TsHeaderMode)); + Buffer.write(TS.init( job_processing, FileName, SetMainAudioAc3, GenerateTTX, TsHeaderMode)); FirstPacket = false; } @@ -1115,6 +1152,9 @@ ContainsVideo = true; } + if (picture_type == CommonParsing.FRAME_I_TYPE || picture_type == CommonParsing.FRAME_P_TYPE) + ttx_pts_check = true; //work with I+P+B-frames for ttx pts check + break; } } @@ -1141,8 +1181,14 @@ /** * add own TTX */ - if (pcr && GeneratePMT && GenerateTTX) - Buffer.write( TS.getTTX(pes_packet, pes_offset, Common.formatTime_1((pcrbase + PCR_Delta) / 90)) ); + //if (pcr && GeneratePMT && GenerateTTX) + // Buffer.write( TS.getTTX(pes_packet, pes_offset, Common.formatTime_1((pcrbase + PCR_Delta) / 90)) ); + + //TTX sub insertion- from 0.90.4.00b28 + if (GenerateTTX && ttx_pts_check) + { + Buffer.write(TS.getTeletextStream(time[1])); + } /** * add Pcr @@ -1358,7 +1404,7 @@ if (qinfo && GeneratePMT) TS.setPmtPids(IDs); - FileName = TS.updateAdditionalHeader(FileName, time, TsHeaderMode); + FileName = TS.updateAdditionalHeader(FileName, time, TsHeaderMode, job_processing); break; @@ -1388,5 +1434,178 @@ Common.setExceptionMessage(e); } } + +//// + /** + * scan secondary streams for timestamps + */ + private void scanSecondaryStreams(JobCollection collection) + { + if (!MuxPES) + return; + + try { + + XInputFile xif; + + for (int i = collection.getPrimaryInputFileSegments(), j = collection.getInputFilesCount(); i < j; i++) + { + xif = (XInputFile) collection.getInputFile(i); + + //use PS1 type only ATM (ttx+sub) + if (xif.getStreamInfo().getStreamType() != CommonParsing.PES_PS1_TYPE) + continue; + + int packet_count = 0; + long[] time = { 0, 0 }; + long pts_value = 0; + ArrayList indexList = new ArrayList(); + byte[] pes_packet = new byte[0x10010]; + + int pes_payloadlength; + int pes_packetlength; + int pes_extensionlength; + int pes_headerlength = 9; + int pes_packetoffset = 6; + int returncode = 0; + int pesID = 0; + + long base = 0; + long count = 0; + long size = xif.length(); + + PushbackInputStream in = new PushbackInputStream(xif.getInputStream(base), pes_packet.length); + + Common.setMessage("-> scanning for remux: " + xif.getName()); + Common.updateProgressBar(" scanning for remux: " + xif.getName(), count, size); + + loop: + while (count < size) + { + Common.updateProgressBar(count, size); + + while (Common.waitingMainProcess()) + {} + + in.read(pes_packet, 0, pes_packetoffset); + + pesID = CommonParsing.getPES_IdField(pes_packet, 0); + + if ((returncode = CommonParsing.validateStartcode(pes_packet, 0)) < 0) + { + returncode = returncode < 0 ? -returncode : 4; + + in.read(pes_packet, pes_packetoffset, pes_packet.length - pes_packetoffset); + + int k = returncode; + + for (; k < pes_packet.length - 3; ) + { + returncode = CommonParsing.validateStartcode(pes_packet, k); + + if (returncode < 0) + { + k += -returncode; + continue; + } + + else + { + in.unread(pes_packet, k, pes_packet.length - k); + count += k; + continue loop; + } + } + + in.unread(pes_packet, k, pes_packet.length - k); + count += k; + continue loop; + } + + if (pesID != CommonParsing.PRIVATE_STREAM_1_CODE) + continue loop; + + pes_payloadlength = CommonParsing.getPES_LengthField(pes_packet, 0); + + in.read(pes_packet, pes_packetoffset, pes_payloadlength); + + pes_packetlength = pes_packetoffset + pes_payloadlength; + pes_extensionlength = CommonParsing.getPES_ExtensionLengthField(pes_packet, 0); + + if (CommonParsing.clearBit33ofPTS(pes_packet, 0)) + pts_value = CommonParsing.getPTSfromBytes(pes_packet, pes_headerlength); + +//Common.setMessage("A cnt " + count + " / ID " + pesID + " / payl " + pes_payloadlength + " / pckl " + pes_packetlength + " / extl " + pes_extensionlength + " / pts " + pts_value); + + packet_count++; + indexList.add(new long[] { pts_value, count, pes_packetlength }); + + count += pes_packetlength; + } + + in.close(); + + // Common.setMessage("B " + packet_count + " / " + indexList.size()); + + remuxList.add(new Object[] { indexList , xif.toString(), new int[1] } ); + } + + } catch (Exception e) { + + Common.setExceptionMessage(e); + } + } + + /** + * fill in secondary streams in pes + */ + private void remuxPES(JobProcessing job_processing, long video_pts) + { + if (!MuxPES) + return; + + Object[] obj; + String fn; + ArrayList indexList; + byte[] pes_packet; + long[] pes_values; + int[] pes_index; + + for (int i = 0, j = remuxList.size(); i < j; i++) + { + obj = (Object[]) remuxList.get(i); + indexList = (ArrayList) obj[0]; + fn = obj[1].toString(); + pes_index = (int[]) obj[2]; + + try { + RandomAccessFile pes = new RandomAccessFile(fn, "r"); + + for (int k = indexList.size(); pes_index[0] < k; pes_index[0]++) + { + pes_values = (long[]) indexList.get(pes_index[0]); + + if (video_pts < pes_values[0]) + break; + + if (video_pts > pes_values[0] + 43200) + continue; + + pes_packet = new byte[(int) pes_values[2]]; + pes.seek(pes_values[1]); + pes.read(pes_packet); + + writePacket(job_processing, pes_packet); + } + + pes.close(); + + } catch (Exception e) { + + Common.setExceptionMessage(e); + } + } + } + } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamDemultiplexer.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamDemultiplexer.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamDemultiplexer.java 2006-03-25 22:19:30.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamDemultiplexer.java 2010-02-06 21:08:30.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)StreamDemultiplexer * - * Copyright (c) 2005-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -44,6 +44,7 @@ import net.sourceforge.dvb.projectx.common.Keys; import net.sourceforge.dvb.projectx.common.Common; import net.sourceforge.dvb.projectx.common.JobProcessing; +import net.sourceforge.dvb.projectx.common.JobCollection; import net.sourceforge.dvb.projectx.parser.CommonParsing; import net.sourceforge.dvb.projectx.video.Video; @@ -59,12 +60,16 @@ private boolean overlap = false; private boolean seqhead = false; private boolean isPTSwritten = false; + private boolean isEnabled = true; +// + private boolean isH264 = false; private boolean WriteNonVideo; private boolean WriteVideo; private boolean Debug; private boolean DecodeVBI; private boolean RebuildPTS; + private boolean RebuildPictPTS; private boolean Streamtype_MpgVideo; private boolean Streamtype_MpgAudio; private boolean Streamtype_Ac3Audio; @@ -78,6 +83,9 @@ private boolean SplitProjectFile; private boolean CreateCellTimes; private boolean CreateInfoIndex; + private boolean AppendPidToFileName; + private boolean AppendLangToFileName; + private boolean EnableHDDemux; private long AddOffset = 0; private long target_position = 0; @@ -95,13 +103,16 @@ private int lfn = -1; private int buffersize = 1024; private int sourcetype = 0; - private int[] MPGVideotype = { 0 }; // 0 =m1v, 1 = m2v, changed at goptest + private int[] MPGVideotype = { -1 }; // 0 =m1v, 1 = m2v, 2 = h264 -- changed at goptest + + private int StreamNumber = -1; private String FileName = ""; private String parentname = ""; private String[] type = { "ac", "tt", "mp", "mv", "pc", "sp", "vp" }; private String[] source = { ".$spes$", ".$ppes$", ".$ts$", ".$pva$" }; - private String[] videoext = { ".mpv", ".mpv", ".m1v", ".m2v" }; +// private String[] videoext = { ".mpv", ".mpv", ".m1v", ".m2v" }; + private String[] videoext = { ".mpv", ".mpv", ".264", ".m1v", ".m2v", ".264" }; private IDDBufferedOutputStream out; private DataOutputStream pts_log; @@ -113,14 +124,20 @@ private byte[] subpicture_header = { 0x53, 0x50, 0, 0, 0, 0, 0, 0, 0, 0 }; private byte[] lpcm_header = { 0x50, 0x43, 0x4D, 0, 0, 0, 0, 0, 0, 0 }; //'PCM'+5b(pts)+2b(size) - public StreamDemultiplexer() + /** + * + */ + public StreamDemultiplexer(JobCollection collection) { - getSettings(); + getSettings(collection); } - public StreamDemultiplexer(long val) + /** + * + */ + public StreamDemultiplexer(JobCollection collection, long val) { - getSettings(); + getSettings(collection); ptsoffset = val; } @@ -270,6 +287,30 @@ } /** + * + */ + public void setStreamNumber(int val) + { + StreamNumber = val; + } + + /** + * + */ + public int getStreamNumber() + { + return StreamNumber; + } + + /** + * stream type preselector + */ + public void setStreamEnabled(boolean b) + { + isEnabled = b; + } + + /** * stream type preselector */ public boolean StreamEnabled() @@ -297,7 +338,7 @@ return Streamtype_Subpicture; default: - return true; + return isEnabled; } } @@ -305,39 +346,53 @@ /** * */ - private void getSettings() + private void getSettings(JobCollection collection) + { + Streamtype_MpgVideo = collection.getSettings().getBooleanProperty(Keys.KEY_Streamtype_MpgVideo); + Streamtype_MpgAudio = collection.getSettings().getBooleanProperty(Keys.KEY_Streamtype_MpgAudio); + Streamtype_Ac3Audio = collection.getSettings().getBooleanProperty(Keys.KEY_Streamtype_Ac3Audio); + Streamtype_PcmAudio = collection.getSettings().getBooleanProperty(Keys.KEY_Streamtype_PcmAudio); + Streamtype_Teletext = collection.getSettings().getBooleanProperty(Keys.KEY_Streamtype_Teletext); + Streamtype_Subpicture = collection.getSettings().getBooleanProperty(Keys.KEY_Streamtype_Subpicture); + AddOffset = collection.getSettings().getBooleanProperty(Keys.KEY_additionalOffset) ? 90L * collection.getSettings().getIntProperty(Keys.KEY_ExportPanel_additionalOffset_Value) : 0; // time offset for data + WriteNonVideo = collection.getSettings().getBooleanProperty(Keys.KEY_WriteOptions_writeAudio); + WriteVideo = collection.getSettings().getBooleanProperty(Keys.KEY_WriteOptions_writeVideo); + Debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog); + DecodeVBI = collection.getSettings().getBooleanProperty(Keys.KEY_Streamtype_Vbi); + RebuildPTS = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_rebuildPTS); + RebuildPictPTS = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_rebuildPictPTS); + AddSequenceEndcode = collection.getSettings().getBooleanProperty(Keys.KEY_VideoPanel_addEndcode); + RenameVideo = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_renameVideo); + CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); + CreateM2sIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createM2sIndex); + SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); + CreateCellTimes = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createCellTimes); + CreateInfoIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createInfoIndex); + AppendPidToFileName = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_appendPidToFileName); + AppendLangToFileName = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_appendLangToFileName); + EnableHDDemux = collection.getSettings().getBooleanProperty(Keys.KEY_enableHDDemux); + } + + /** + * + */ + private void setFileName() { - Streamtype_MpgVideo = Common.getSettings().getBooleanProperty(Keys.KEY_Streamtype_MpgVideo); - Streamtype_MpgAudio = Common.getSettings().getBooleanProperty(Keys.KEY_Streamtype_MpgAudio); - Streamtype_Ac3Audio = Common.getSettings().getBooleanProperty(Keys.KEY_Streamtype_Ac3Audio); - Streamtype_PcmAudio = Common.getSettings().getBooleanProperty(Keys.KEY_Streamtype_PcmAudio); - Streamtype_Teletext = Common.getSettings().getBooleanProperty(Keys.KEY_Streamtype_Teletext); - Streamtype_Subpicture = Common.getSettings().getBooleanProperty(Keys.KEY_Streamtype_Subpicture); - AddOffset = Common.getSettings().getBooleanProperty(Keys.KEY_additionalOffset) ? 90L * Common.getSettings().getIntProperty(Keys.KEY_ExportPanel_additionalOffset_Value) : 0; // time offset for data - WriteNonVideo = Common.getSettings().getBooleanProperty(Keys.KEY_WriteOptions_writeAudio); - WriteVideo = Common.getSettings().getBooleanProperty(Keys.KEY_WriteOptions_writeVideo); - Debug = Common.getSettings().getBooleanProperty(Keys.KEY_DebugLog); - DecodeVBI = Common.getSettings().getBooleanProperty(Keys.KEY_Streamtype_Vbi); - RebuildPTS = Common.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_rebuildPTS); - AddSequenceEndcode = Common.getSettings().getBooleanProperty(Keys.KEY_VideoPanel_addEndcode); - RenameVideo = Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_renameVideo); - CreateD2vIndex = Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); - CreateM2sIndex = Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createM2sIndex); - SplitProjectFile = Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); - CreateCellTimes = Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createCellTimes); - CreateInfoIndex = Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createInfoIndex); + FileName = parentname + source[sourcetype] + lfn + "-" + Long.toHexString(0xFFFFFFL & System.currentTimeMillis()).toUpperCase(); } /** * init nonVideo streams */ - private void initNonVideo(String _name) + private void initNonVideo(JobCollection collection, String _name) { parentname = _name; - FileName = parentname + source[sourcetype] + lfn; + + setFileName(); + target_position = 0; - getSettings(); + getSettings(collection); try { out = new IDDBufferedOutputStream(new FileOutputStream(FileName), buffersize); @@ -352,21 +407,21 @@ /** * main init nonVideo */ - public void init(String _name, int _buffersize, int _lfn, int _parsertype) + public void init(JobCollection collection, String _name, int _buffersize, int _lfn, int _parsertype) { lfn = _lfn; buffersize = _buffersize; sourcetype = _parsertype; - initNonVideo(_name); + initNonVideo(collection, _name); } /** * re-init nonVideo */ - public void init2(String _name) + public void init2(JobCollection collection, String _name) { - initNonVideo(_name); + initNonVideo(collection, _name); } /** @@ -456,6 +511,10 @@ if (pes_ID == CommonParsing.PRIVATE_STREAM_1_CODE && pes_extensionlength == 0x24 && (0xFF & pes_packet[9 + pes_extensionlength + offset])>>>4 == 1) _es_streamtype = CommonParsing.TELETEXT; + // workaround uk freesat teletext + else if (pes_ID == CommonParsing.PRIVATE_STREAM_1_CODE && pes_extensionlength == 0x24 && (0xFF & pes_packet[9 + pes_extensionlength + offset]) == 0x99) + _es_streamtype = CommonParsing.TELETEXT; + /** * no PTS in PES_extension */ @@ -471,6 +530,10 @@ es_streamtype = pes_ID == CommonParsing.PRIVATE_STREAM_1_CODE ? _es_streamtype : CommonParsing.MPEG_AUDIO; subid = ((es_streamtype == CommonParsing.AC3_AUDIO || es_streamtype == CommonParsing.DTS_AUDIO || es_streamtype == CommonParsing.TELETEXT) && ((pes_streamtype == CommonParsing.PES_AV_TYPE && (pes_isAligned || es_streamtype == CommonParsing.TELETEXT)) || pes_streamtype == CommonParsing.MPEG2PS_TYPE)) ? (0xFF & pes_packet[9 + (0xFF & pes_packet[8 + pes_packetoffset]) + pes_packetoffset]) : 0; + // workaround uk freesat teletext + if (isTTX()) + subid &= 0x1F; + switch (subid>>>4) { case 8: @@ -542,10 +605,8 @@ try { - /** - * re-build PTS - */ - if (es_streamtype == CommonParsing.TELETEXT && RebuildPTS) + // recreate PTS + if (RebuildPTS && es_streamtype == CommonParsing.TELETEXT) { if (job_processing.getBorrowedPts() != lastPTS) { @@ -559,22 +620,39 @@ } } + //recreate subpicture + else if (RebuildPictPTS && es_streamtype == CommonParsing.SUBPICTURE) + { + if (job_processing.getBorrowedPts() != lastPTS) + { + lastPTS = job_processing.getBorrowedPts(); + pts = lastPTS; //to rewrite into sp file + + pts_log.writeLong(lastPTS); + pts_log.writeLong(target_position); + + if (Debug) + System.out.println(" stolen subpic PTS: " + lastPTS + " /ao " + AddOffset + " /tp " + target_position); + } + } + /** * read out source PTS */ else if (pes_extensionlength > 0 && pes_payloadlength >= 0) { +//--> 舅dern pts = CommonParsing.getPTSfromBytes(pes_packet, offset); //returns 32bit pts -= job_processing.getNextFileStartPts(); - pts &= 0xFFFFFFFFL; + pts &= 0xFFFFFFFFL; //trim to 32bit if ( (pts & 0xFF000000L) == 0xFF000000L ) ptsover = true; // bit 33 was set if (ptsover && pts < 0xF0000000L) pts |= 0x100000000L; - +//<-- pts += ptsoffset; pts += AddOffset; @@ -616,6 +694,10 @@ break; case 1: //TTX + offset += 1; + pes_payloadlength -= 1; + break; + case 2: //subpic 0.31 case 3: //subpic 32.63 offset += 1; @@ -722,11 +804,23 @@ if (new File(FileName).length() < 10) { + Common.setMessage("-> temp. Filesize < 10 Bytes"); + new File(FileName).delete(); new File(pts_log_name).delete(); + parameters[0] = ""; } + else + { + if (AppendPidToFileName) + parameters[3] = parentname + formatIDString(getPID(), getID(), subID()); + + if (AppendLangToFileName) + parameters[3] += job_processing.getAudioStreamLanguage(getPID()); + } + } catch (IOException e) { Common.setExceptionMessage(e); @@ -736,20 +830,36 @@ } /** + * + */ + private String formatIDString(int pid, int id, int subid) + { + String str = ""; + + str += "{0x" + Common.adaptString(Integer.toHexString(pid).toUpperCase(), 4); + str += "-0x" + Common.adaptString(Integer.toHexString(id).toUpperCase(), 2); + str += "-0x" + Common.adaptString(Integer.toHexString(subid).toUpperCase(), 2); + str += "}"; + + return str; + } + + /** * */ - public void initVideo(String _name, int _buffersize, int _lfn, int _parsertype) + public void initVideo(JobCollection collection, String _name, int _buffersize, int _lfn, int _parsertype) { - getSettings(); + getSettings(collection); parentname = _name; lfn = _lfn; buffersize = _buffersize; sourcetype = _parsertype; - FileName = parentname + source[sourcetype] + lfn; + setFileName(); + es_streamtype = CommonParsing.MPEG_VIDEO; - MPGVideotype[0] = 0; + MPGVideotype[0] = -1; try { out = new IDDBufferedOutputStream(new FileOutputStream(FileName), buffersize); @@ -761,6 +871,8 @@ out.InitInfo(FileName); pts_log = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(FileName + ".pts"), 65535)); + pts_log.write(CommonParsing.PTSVideoHeader); + packet = new ByteArrayOutputStream(); vidbuf = new ByteArrayOutputStream(); vptsbytes = new ByteArrayOutputStream(); @@ -772,15 +884,15 @@ } } - public void initVideo2(String _name) + public void initVideo2(JobCollection collection, String _name) { - getSettings(); + getSettings(collection); parentname = _name; - FileName = parentname + source[sourcetype] + lfn; + setFileName(); first = true; - MPGVideotype[0] = 0; + MPGVideotype[0] = -1; try { out = new IDDBufferedOutputStream(new FileOutputStream(FileName), buffersize); @@ -792,6 +904,7 @@ out.InitInfo(FileName); pts_log = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(FileName + ".pts"), 65535)); + pts_log.write(CommonParsing.PTSVideoHeader); packet.reset(); vidbuf.reset(); @@ -833,10 +946,21 @@ if (AddSequenceEndcode && job_processing.getExportedVideoFrameNumber() > 0) { - out.write(Video.getSequenceEndCode()); + if (MPGVideotype[0] < 2) + { + out.write(Video.getSequenceEndCode()); - job_processing.countMediaFilesExportLength(+4); - job_processing.countAllMediaFilesExportLength(+4); + job_processing.countMediaFilesExportLength(+4); + job_processing.countAllMediaFilesExportLength(+4); + } + + else // h264 + { + out.write(new byte[]{0, 0, 0, 1, 0xA}); + + job_processing.countMediaFilesExportLength(+5); + job_processing.countAllMediaFilesExportLength(+5); + } } packet.close(); @@ -866,9 +990,15 @@ else { - int ot = (RenameVideo || CreateD2vIndex || SplitProjectFile) ? 0 : 2; + //int ot = (RenameVideo || CreateD2vIndex || SplitProjectFile) ? 0 : 2; + int ot = (RenameVideo || CreateD2vIndex || SplitProjectFile) ? 0 : 3; - videofile = parentname + videoext[MPGVideotype[0] + ot]; + videofile = parentname; + + if (AppendPidToFileName) + videofile += formatIDString(getPID(), getID(), subID()); + + videofile += videoext[MPGVideotype[0] + ot]; File newfile = new File(videofile); if (newfile.exists()) @@ -909,7 +1039,10 @@ if (CreateM2sIndex) { if (new File(videofile).exists()) - out.renameVideoIddTo(parentname); + { + String tmpFN = videofile.toString().substring(0, videofile.toString().lastIndexOf(".")); + out.renameVideoIddTo(tmpFN); + } else out.deleteIdd(); @@ -1054,10 +1187,12 @@ */ if (pes_extensionlength > 0 && pes_payloadlength >= 0) { +//--> 舅dern pts = !pes_hasHeader ? job_processing.getPvaVideoPts() : CommonParsing.getPTSfromBytes(pes_packet, offset); //returns 32bit pts -= job_processing.getNextFileStartPts(); - pts &= 0xFFFFFFFFL; + + pts &= 0xFFFFFFFFL; // trim to 32bit if ( (pts & 0xFF000000L) == 0xFF000000L ) ptsover = true; // bit 33 was set @@ -1065,7 +1200,7 @@ if (ptsover && pts < 0xF0000000L) pts |= 0x100000000L; - +//<-- pts += ptsoffset; if (Debug) @@ -1084,6 +1219,17 @@ packet.flush(); +/** simple demux + byte[] ddd = new byte[pes_payloadlength]; + System.arraycopy(pes_packet, offset + pes_extensionlength, ddd, 0, pes_payloadlength); + + job_processing.getGop().h264test(job_processing, out, ddd, vptsbytes.toByteArray(), pts_log, parentname, MPGVideotype, CutpointList, ChapterpointList); + + packet.reset(); + + if (1 == 1) + return; +**/ data = packet.toByteArray(); packet.reset(); @@ -1091,8 +1237,11 @@ boolean gop = false; boolean packetfirstframe = true; + int nal_unit = 0; + int nal_ref = 0; + packloop: - for (int i = 0, j = 0, id, returncode; i < data.length - 3; i++) + for (int i = 0, j = 0, k = 0, id, returncode; i < data.length - 3; i++) { if ((returncode = CommonParsing.validateStartcode(data, i)) < 0) { @@ -1102,11 +1251,96 @@ id = CommonParsing.getPES_IdField(data, i); +// mpeg4 part + //optional deactivator + if (!EnableHDDemux) + isH264 = false; + + if (isH264) + { + if (i == 0 || data[i - 1] != 0 || (0x80 & id) != 0) // not 00 00 00 01 0XXX-XXXX + continue packloop; + + i--; // return to startcode + nal_ref = 3 & id>>5; + nal_unit = 0x1F & id; + + if (Debug) + System.out.println("i " + i + " /NAL ref " + nal_ref + " /unit " + nal_unit); + + switch (nal_unit) + { + case 1: // non IDR pic data + case 5: // IDR pic data + + if (!isPTSwritten && pts != -1) + { + vpts.writeLong(pts); + vpts.writeLong((long) k); + vpts.flush(); + + isPTSwritten = true; + } + break; + + case 7: // sequence param set // 9-7-8-6-1 ; 9-7-6-8-6-1 + + vidbuf.write(data, 0, j); // save last data until run-in + + if (!first) + job_processing.getGop().h264test(job_processing, out, vidbuf.toByteArray(), vptsbytes.toByteArray(), pts_log, parentname, MPGVideotype, CutpointList, ChapterpointList); + + vptsbytes.reset(); + vidbuf.reset(); + + if (!isPTSwritten && pts != -1) + { + vpts.writeLong(pts); + vpts.writeLong((long) 0); + vpts.flush(); + + isPTSwritten = true; + } + + first = false; + gop = true; + + // save new data from run-in + // expects there's no next seq param set + vidbuf.write(data, j, data.length - j); + + break; + + case 9: // run-in + j = i; + k = vidbuf.size(); + break; + } + + i += 2; + continue packloop; + } +// + + // 00 00 00 01 + 0XX0-1001 lead-in, toggle with mpeg1-2, shall be set once + else if (MPGVideotype[0] < 0) + { + isH264 = i > 0 && data[i - 1] == 0 && (0x9F & id) == 9; + } + + if (isH264) // last return, never been called after that + continue packloop; + + + /** * new frame at first */ if (!isPTSwritten && packetfirstframe && id == CommonParsing.PICTURE_START_CODE) { + if (MPGVideotype[0] < 0) + MPGVideotype[0] = 0; + if (misshead && i < 3) { misshead = false; @@ -1127,6 +1361,9 @@ else if (id == CommonParsing.SEQUENCE_HEADER_CODE || id == CommonParsing.SEQUENCE_END_CODE || id == CommonParsing.GROUP_START_CODE) { + if (MPGVideotype[0] < 0) + MPGVideotype[0] = 0; + if (id == CommonParsing.SEQUENCE_HEADER_CODE) seqhead = true; diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserBase.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserBase.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserBase.java 2006-01-18 20:57:24.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserBase.java 2009-04-03 14:18:00.000000000 +0000 @@ -39,6 +39,13 @@ import net.sourceforge.dvb.projectx.xinput.XInputFile; import net.sourceforge.dvb.projectx.parser.CommonParsing; +// +import net.sourceforge.dvb.projectx.parser.StreamConverter; +import net.sourceforge.dvb.projectx.parser.StreamDemultiplexer; +import net.sourceforge.dvb.projectx.parser.StreamProcess; + +import java.util.List; +import java.util.Hashtable; /** * main thread @@ -48,6 +55,24 @@ public int ERRORCODE = 0; public int MainBufferSize = 8192000; +// + public static StreamDemultiplexer streamdemultiplexer; + public static StreamConverter streamconverter; + + public static List demuxList; + public static Hashtable streamobjects; + + public static boolean CreateD2vIndex; + public static boolean SplitProjectFile; + + public static String fchild; + public static String fparent; + + public static long OverheadSize; + + +// + /** * */ @@ -65,6 +90,20 @@ if (MainBufferSize <= 0) MainBufferSize = 4096000; + + + streamdemultiplexer = null; + streamconverter = null; + demuxList = null; + streamobjects = null; + + CreateD2vIndex = false; + SplitProjectFile = false; + + OverheadSize = 2048000; + + fchild = ""; + fparent = ""; } /** @@ -78,6 +117,38 @@ /** * */ + public void setFileName(JobCollection collection, JobProcessing job_processing, XInputFile aXInputFile) + { + setFileName(collection, job_processing, aXInputFile, ""); + } + + /** + * + */ + public void setFileName(JobCollection collection, JobProcessing job_processing, XInputFile aXInputFile, String extension) + { + String str = aXInputFile.getName(); + str = str.replace('?', '_'); + str = str.replace('*', '_'); + str = str.replace(':', '_'); + str = str.replace('/', '_'); + str = str.replace('"', '_'); + str = str.replace('<', '_'); + str = str.replace('>', '_'); + str = str.replace('|', '_'); + + fchild = collection.getOutputName(str); + +// fchild = collection.getOutputName(aXInputFile.getName()); + fparent = collection.getOutputNameParent(fchild); + + // split part + fparent += job_processing.getSplitSize() > 0 ? "(" + job_processing.getSplitPart() + ")" : extension; + } + + /** + * + */ public boolean pause() { return Common.waitingMainProcess(); @@ -93,7 +164,6 @@ return nextFilePTS(collection, parser_type, pes_streamtype, lastpts, file_number, 0L); } - /** * nextfile PTS check * @@ -101,6 +171,16 @@ */ public long nextFilePTS(JobCollection collection, int parser_type, int pes_streamtype, long lastpts, int file_number, long startPoint) { + return nextFilePTS(collection, parser_type, pes_streamtype, lastpts, 0L, file_number, 0L); + } + + /** + * nextfile PTS check + * + * returns new pts offset to append + */ + public long nextFilePTS(JobCollection collection, int parser_type, int pes_streamtype, long lastpts, long ptsoffset, int file_number, long startPoint) + { JobProcessing job_processing = collection.getJobProcessing(); byte[] data; @@ -108,7 +188,7 @@ long pts = 0; int position = 0; - int buffersize = Integer.parseInt(collection.getSettings().getProperty(Keys.KEY_ScanBuffer)); + int buffersize = collection.getSettings().getIntProperty(Keys.KEY_ScanBuffer); int pes_ID; boolean PVA_Audio = collection.getSettings().getBooleanProperty(Keys.KEY_PVA_Audio); @@ -301,6 +381,10 @@ } } + //Common.setMessage("AA " + pts + " / " + ptsoffset + " / " + (pts + ptsoffset) + " / " + lastpts); + //re-use given ptsoffset (chapterpoints of vob) + // pts += ptsoffset; + if (file_number == 0 && startPoint == 0) { // need global offset? pts &= 0xFFFFFFFFL; @@ -351,5 +435,235 @@ } } + /** + * + */ + public Hashtable getStreamObjects(JobProcessing job_processing) + { + return job_processing.getStreamObjects(); + } + + /** + * + */ + public String processElementaryStreams(String vptslog, int action, int[] clv, JobCollection collection, JobProcessing job_processing) + { + if (action != CommonParsing.ACTION_DEMUX) + { + streamconverter.close(job_processing, CommonParsing.isInfoScan()); + return vptslog; + } + + //finish video stream + for (int i = 0, NumberOfVideostreams = 0; i < demuxList.size(); i++) + { + streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); + + if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO) + { + // accept only first video + if (NumberOfVideostreams > 0) + { + Common.setMessage("!> further videostream found (PID 0x" + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + " / ID 0x" + Integer.toHexString(streamdemultiplexer.getID()).toUpperCase() + ") -> ignored"); + continue; + } + + // d2v project + if (CreateD2vIndex || SplitProjectFile) + job_processing.getProjectFileD2V().write(job_processing.getProjectFileExportLength(), job_processing.getExportedVideoFrameNumber()); + + Common.setMessage(""); + Common.setMessage(formatIDString(Resource.getString("ExportPanel.Streamtype.MpgVideo"), streamdemultiplexer.getPID(), streamdemultiplexer.getID(), streamdemultiplexer.subID())); + Common.setMessage(Resource.getString("video.msg.summary") + " " + job_processing.getExportedVideoFrameNumber() + "-" + clv[0] + "-" + clv[1] + "-" + clv[2] + "-" + clv[3] + "-" + clv[4]); + + vptslog = streamdemultiplexer.closeVideo(job_processing, collection.getOutputDirectory() + collection.getFileSeparator()); + + NumberOfVideostreams++; + } + } + processNonVideoElementaryStreams(vptslog, action, clv, collection, job_processing); + + return vptslog; + } + + /** + * + */ + public void processNonVideoElementaryStreams(String vptslog, int action, int[] clv, JobCollection collection, JobProcessing job_processing) + { + processNonVideoElementaryStreams(vptslog, action, clv, collection, job_processing, null, null); + } + + /** + * + */ + public void processNonVideoElementaryStreams(String vptslog, int action, int[] clv, JobCollection collection, JobProcessing job_processing, List tempfiles, XInputFile aXInputFile) + { + //finish other streams + int[] stream_number = job_processing.getStreamNumbers(); + + String[] key_values = { + Keys.KEY_Streamtype_Ac3Audio[0], + Keys.KEY_Streamtype_Teletext[0], + Keys.KEY_Streamtype_MpgAudio[0], + "", + Keys.KEY_Streamtype_PcmAudio[0], + Keys.KEY_Streamtype_Subpicture[0], + Keys.KEY_Streamtype_Ac3Audio[0], + Keys.KEY_Streamtype_PcmAudio[0] + }; + + for (int i = 0, es_streamtype; i < demuxList.size(); i++) + { + streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); + es_streamtype = streamdemultiplexer.getType(); + + if (es_streamtype == CommonParsing.MPEG_VIDEO) + continue; + + // from pva - test with others + if (streamdemultiplexer.getID() == 0) + continue; + + String[] values = streamdemultiplexer.close(job_processing, vptslog); + + if (values[0].equals("")) + { + Common.setMessage(formatIDString(Resource.getString("StreamParser.NoExport"), streamdemultiplexer.getPID(), 0xFF & streamdemultiplexer.getID(), streamdemultiplexer.subID())); + continue; + } + + if (streamdemultiplexer.getStreamNumber() < 0) + { + streamdemultiplexer.setStreamNumber(stream_number[es_streamtype]); + stream_number[es_streamtype]++; + } + + String newfile = values[3] + (streamdemultiplexer.getStreamNumber() > 0 ? ("-" + Common.adaptString(stream_number[es_streamtype], 2)) : "") + "." + values[2]; + + Common.renameTo(values[0], newfile); + + values[0] = newfile; + values[3] = vptslog; + + switch (es_streamtype) + { + case CommonParsing.AC3_AUDIO: + case CommonParsing.DTS_AUDIO: + if (streamdemultiplexer.subID() != 0 && (0xF0 & streamdemultiplexer.subID()) != 0x80) + { + Common.setMessage(formatIDString(Resource.getString("StreamParser.NoExport"), streamdemultiplexer.getPID(), 0xFF & streamdemultiplexer.getID(), streamdemultiplexer.subID())); + break; + } + + case CommonParsing.TELETEXT: + case CommonParsing.MPEG_AUDIO: + case CommonParsing.LPCM_AUDIO: + case CommonParsing.SUBPICTURE: + createStreamProcess(es_streamtype, collection, values, key_values[es_streamtype]); + break; + } + + // save infos for output segmentation + if (tempfiles != null) + { +/**/ tempfiles.add(values[0]); + tempfiles.add(aXInputFile); + tempfiles.add(values[1]); + tempfiles.add(values[2]); +/**/ +Common.setMessage("tmpfiles " + tempfiles.size()); + if (job_processing.getSplitSize() == 0) + { + new File(newfile).delete(); + new File(values[1]).delete(); + } + } + + else + { + new File(newfile).delete(); + new File(values[1]).delete(); + } + + } + } + + /** + * + */ + public String formatIDString(String str1, int pid, int id, int subid) + { + String str = "++> " + str1; + + str += ": PID 0x" + Common.adaptString(Integer.toHexString(pid).toUpperCase(), 4); + str += " / PesID 0x" + Common.adaptString(Integer.toHexString(id).toUpperCase(), 2); + str += " / SubID 0x" + Common.adaptString(Integer.toHexString(subid).toUpperCase(), 2); + str += " :"; + + return str; + } + + /** + * + */ + public void createStreamProcess(int es_streamtype, JobCollection collection, String[] values, String key_value) + { + Common.setMessage(""); + Common.setMessage(formatIDString(Resource.getString(key_value), streamdemultiplexer.getPID(), streamdemultiplexer.getID(), streamdemultiplexer.subID())); + + new StreamProcess(es_streamtype, collection, values); + } + + /** + * + */ + public void addCellTimeFromFileSegment(JobProcessing job_processing) + { + //addCellTime(job_processing); + } + + /** * + + */ + public void addCellTime(JobProcessing job_processing) + { + job_processing.addCellTime(job_processing.getExportedVideoFrameNumber()); + } + + /** + * init conversions + */ + public void initConversion(JobCollection collection, String parent, int action, int source, int splitpart) + { + if (action <= CommonParsing.ACTION_DEMUX) + return; + + String[] ext = { "", ".vdr", ".mpg", ".pva", ".ts" }; + + switch (action) + { + case CommonParsing.ACTION_TO_VDR: + case CommonParsing.ACTION_TO_M2P: + case CommonParsing.ACTION_TO_PVA: + case CommonParsing.ACTION_TO_TS: + streamconverter.init(collection, parent + "[remux]" + ext[action], MainBufferSize, action, splitpart); + break; + + case CommonParsing.ACTION_FILTER: + streamconverter.init(collection, parent + "[filter]" + ext[source], MainBufferSize, action, splitpart); + break; + + case CommonParsing.ACTION_COPY: + } + } + + /** + * getOverhead to collect more samples + */ + public void setOverheadSize(JobCollection collection) + { + OverheadSize = collection.getSettings().getBooleanProperty(Keys.KEY_Input_useReadOverhead) ? 2048000 : 0; + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserESVideo.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserESVideo.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserESVideo.java 2006-03-25 01:19:30.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserESVideo.java 2009-07-05 12:53:34.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)StreamParser * - * Copyright (c) 2005-2006 by dvb.matt, All rights reserved. + * Copyright (c) 2005-2009 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -80,20 +80,16 @@ */ public String parseStream(JobCollection collection, XInputFile aXInputFile, int pes_streamtype, int action, String vptslog) { - String fchild = collection.getOutputName(aXInputFile.getName()); - String fparent = collection.getOutputNameParent(fchild); - JobProcessing job_processing = collection.getJobProcessing(); - /** - * split part - */ - fparent += job_processing.getSplitSize() > 0 ? "(" + job_processing.getSplitPart() + ")" : ".new" ; + setFileName(collection, job_processing, aXInputFile, ".new"); boolean CreateInfoIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createInfoIndex); boolean CreateM2sIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createM2sIndex); - boolean CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); - boolean SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); + + CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); + SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); + boolean WriteVideo = collection.getSettings().getBooleanProperty(Keys.KEY_WriteOptions_writeVideo); boolean AddSequenceEndcode = collection.getSettings().getBooleanProperty(Keys.KEY_VideoPanel_addEndcode); boolean RenameVideo = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_renameVideo); @@ -137,7 +133,7 @@ Common.updateProgressBar(Resource.getString("video.progress") + " " + fchild, 0, 0); - StreamDemultiplexer streamdemultiplexer = new StreamDemultiplexer(); + streamdemultiplexer = new StreamDemultiplexer(collection); try { @@ -158,6 +154,8 @@ vstream.InitInfo(fparent); DataOutputStream vlog = new DataOutputStream( new FileOutputStream(fparent + ".s1.pts") ); + vlog.write(CommonParsing.PTSVideoHeader); + ByteArrayOutputStream es_packetbuffer = new ByteArrayOutputStream(); job_processing.setElementaryVideoStream(true); @@ -483,7 +481,7 @@ vlog.close(); Common.setMessage(""); - Common.setMessage(Resource.getString("video.msg.summary") + " " + job_processing.getExportedVideoFrameNumber() + "/ " + clv[0] + "/ " + clv[1] + "/ " + clv[2] + "/ " + clv[3] + "/ " + clv[4]); + Common.setMessage(Resource.getString("video.msg.summary") + " " + job_processing.getExportedVideoFrameNumber() + "-" + clv[0] + "-" + clv[1] + "-" + clv[2] + "-" + clv[3] + "-" + clv[4]); File newfile = new File(fparent + ".s1"); @@ -515,7 +513,10 @@ if (CreateM2sIndex) { if (new File(videofile).exists()) - vstream.renameVideoIddTo(fparent); + { + String tmpFN = videofile.toString(); + vstream.renameVideoIddTo(tmpFN); + } else vstream.deleteIdd(); diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserPESPrimary.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserPESPrimary.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserPESPrimary.java 2006-03-25 23:30:04.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserPESPrimary.java 2008-02-17 20:21:58.000000000 +0000 @@ -52,7 +52,6 @@ import net.sourceforge.dvb.projectx.parser.StreamConverter; import net.sourceforge.dvb.projectx.parser.StreamDemultiplexer; import net.sourceforge.dvb.projectx.parser.StreamParserBase; -import net.sourceforge.dvb.projectx.parser.StreamProcess; /** @@ -60,6 +59,15 @@ */ public class StreamParserPESPrimary extends StreamParserBase { + private boolean Message_2; + private boolean Debug; + private boolean SimpleMPG; + private boolean GetEnclosedPackets; + private boolean IgnoreScrambledPackets; + private boolean PreviewAllGops; + private boolean DumpDroppedGop; + private boolean Overlap; + /** * */ @@ -73,26 +81,22 @@ */ public String parseStream(JobCollection collection, XInputFile aXInputFile, int _pes_streamtype, int action, String vptslog) { - String fchild = collection.getOutputName(aXInputFile.getName()); - String fparent = collection.getOutputNameParent(fchild); - JobProcessing job_processing = collection.getJobProcessing(); - /** - * split part - */ - fparent += job_processing.getSplitSize() > 0 ? "(" + job_processing.getSplitPart() + ")" : "" ; + setFileName(collection, job_processing, aXInputFile); + + Debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog); + Message_2 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg2); + SimpleMPG = collection.getSettings().getBooleanProperty(Keys.KEY_simpleMPG); + GetEnclosedPackets = collection.getSettings().getBooleanProperty(Keys.KEY_Input_getEnclosedPackets); + IgnoreScrambledPackets = collection.getSettings().getBooleanProperty(Keys.KEY_TS_ignoreScrambled); + PreviewAllGops = collection.getSettings().getBooleanProperty(Keys.KEY_Preview_AllGops); + DumpDroppedGop = collection.getSettings().getBooleanProperty(Keys.KEY_dumpDroppedGop); + CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); + SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); + Overlap = collection.getSettings().getBooleanProperty(Keys.KEY_ExportPanel_Export_Overlap); - boolean Message_2 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg2); - boolean Debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog); - boolean SimpleMPG = collection.getSettings().getBooleanProperty(Keys.KEY_simpleMPG); - boolean GetEnclosedPackets = collection.getSettings().getBooleanProperty(Keys.KEY_Input_getEnclosedPackets); - boolean IgnoreScrambledPackets = collection.getSettings().getBooleanProperty(Keys.KEY_TS_ignoreScrambled); - boolean PreviewAllGops = collection.getSettings().getBooleanProperty(Keys.KEY_Preview_AllGops); - boolean DumpDroppedGop = collection.getSettings().getBooleanProperty(Keys.KEY_dumpDroppedGop); - boolean CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); - boolean SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); - boolean Overlap = collection.getSettings().getBooleanProperty(Keys.KEY_ExportPanel_Export_Overlap); + setOverheadSize(collection); boolean isTeletext = false; boolean missing_startcode = false; @@ -124,6 +128,8 @@ int cell_ID = 0; int ZeroPacketPayload = 0x17FA; + int tmp_value1 = 0; + int pesID0 = 0; //first video stream ID int dumped_packets = 0; @@ -147,13 +153,14 @@ vptslog = "-1"; //fix - StreamDemultiplexer streamdemultiplexer = null; - StreamConverter streamconverter = new StreamConverter(); + String file_id = aXInputFile.getFileID(); + + streamconverter = new StreamConverter(); Hashtable substreams = new Hashtable(); StandardBuffer sb; - List demuxList = job_processing.getPrimaryPESDemuxList(); + demuxList = job_processing.getPrimaryPESDemuxList(); /** * re-read old streams, for next split part @@ -175,40 +182,23 @@ if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO) { - streamdemultiplexer.initVideo2(fparent); + streamdemultiplexer.initVideo2(collection, fparent); if (pesID0 == 0) //? pesID0 = streamdemultiplexer.getID(); } else - streamdemultiplexer.init2(fparent); + streamdemultiplexer.init2(collection, fparent); } } + /** + * init conversions + */ String mpeg_type_str = (Keys.ITEMS_FileTypes[pes_streamtype]).toString().toLowerCase(); mpeg_type_str = "[" + mpeg_type_str.substring(0, mpeg_type_str.indexOf(' ')) + "]"; - switch (action) - { - case CommonParsing.ACTION_TO_VDR: - streamconverter.init(fparent + (job_processing.getSplitSize() == 0 ? mpeg_type_str : "") + ".vdr", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_TO_M2P: - streamconverter.init(fparent + (job_processing.getSplitSize() == 0 ? mpeg_type_str : "") + ".m2p", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_TO_PVA: - streamconverter.init(fparent + ".pva", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_TO_TS: - streamconverter.init(fparent + ".ts", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_FILTER: - streamconverter.init(fparent + "[filtered].pes", MainBufferSize, action, job_processing.getSplitPart()); - } + initConversion(collection, fparent + (job_processing.getSplitSize() == 0 ? mpeg_type_str : ""), action, CommonParsing.ACTION_TO_VDR, job_processing.getSplitPart()); /** * d2v projectfile @@ -289,7 +279,7 @@ * jump near to first cut-in point to collect more audio */ if (CutMode == CommonParsing.CUTMODE_BYTE && CutpointList.size() > 0 && CommonParsing.getCutCounter() == 0 && (!PreviewAllGops || action != CommonParsing.ACTION_DEMUX)) - startPoint = Long.parseLong(CutpointList.get(CommonParsing.getCutCounter()).toString()) - ((action == CommonParsing.ACTION_DEMUX) ? 2048000: 0); + startPoint = Long.parseLong(CutpointList.get(CommonParsing.getCutCounter()).toString()) - ((action == CommonParsing.ACTION_DEMUX) ? OverheadSize : 0); if (startPoint < 0) startPoint = count; // =0 @@ -369,7 +359,7 @@ if (CutMode == CommonParsing.CUTMODE_BYTE && CutpointList.size() > 0) { if (CommonParsing.getCutCounter() == CutpointList.size() && (CommonParsing.getCutCounter() & 1) == 0) - if (count > Long.parseLong(CutpointList.get(CommonParsing.getCutCounter() - 1).toString()) + (action == CommonParsing.ACTION_DEMUX ? 2048000 : 64000)) + if (count > Long.parseLong(CutpointList.get(CommonParsing.getCutCounter() - 1).toString()) + (action == CommonParsing.ACTION_DEMUX ? OverheadSize : 64000)) { ende = true; break bigloop; @@ -497,7 +487,8 @@ if (collection.getSettings().getBooleanProperty(Keys.KEY_VOB_resetPts)) { - ptsoffset = nextFilePTS(collection, CommonParsing.PRIMARY_PES_PARSER, pes_streamtype, lastpts, job_processing.getFileNumber(), (count - base)); + // ptsoffset = nextFilePTS(collection, CommonParsing.PRIMARY_PES_PARSER, pes_streamtype, lastpts, job_processing.getFileNumber(), (count - base)); + ptsoffset = nextFilePTS(collection, CommonParsing.PRIMARY_PES_PARSER, pes_streamtype, lastpts, ptsoffset, job_processing.getFileNumber(), (count - base)); if (ptsoffset == -1) ptsoffset = 0; @@ -582,6 +573,8 @@ pes_packetlength = pes_packetoffset + pes_payloadlength; + pes_isMpeg2 = (0xC0 & pes_packet[6]) == 0x80; + /** * determine next startcode in zero packets */ @@ -590,7 +583,8 @@ if (Debug) System.out.println("A " + Resource.getString("parsePrimaryPES.packet.length") + " " + count); - for (int i = pes_packetoffset; isZeroPacket && i <= pes_packetlength; ) + //start after pes header + for (int i = pes_packetoffset + (pes_isMpeg2 ? 3 : 1); isZeroPacket && i <= pes_packetlength; ) { if ((returncode = CommonParsing.validateStartcode(pes_packet, i)) < 0 || CommonParsing.getPES_IdField(pes_packet, i) < CommonParsing.SYSTEM_END_CODE) { @@ -639,7 +633,7 @@ clv[5]++; if (Debug) - System.out.print("\r"+Resource.getString("parsePrimaryPES.packs") + ": " + pesID + "/" + clv[5] + "/" + (pes_packetlength) + "/" + ((count * 100 / size)) + "% " + (count)); + System.out.println(Resource.getString("parsePrimaryPES.packs") + ": " + pesID + "/" + clv[5] + "/" + (pes_packetlength) + "/" + ((count * 100 / size)) + "% " + (count)); pes_extensionlength = CommonParsing.getPES_ExtensionLengthField(pes_packet, 0); @@ -664,7 +658,7 @@ if (isZeroSubPacket) { if (Debug) - System.out.println("B " + Resource.getString("parsePrimaryPES.packet.length") + " " + count); + System.out.println("B " + Resource.getString("parsePrimaryPES.packet.length") + " " + count + " / " + pes_isMpeg2); pes_payloadlength = ZeroPacketPayload; @@ -746,7 +740,31 @@ subID = 0xFF & pes_packet[offset]; isTeletext = pes_extensionlength == 0x24 && subID>>>4 == 1; - //subpic in vdr_pes + // vdr 1.5.x dvb-subs container + if (pes_payloadlength >= 4 && subID>>>4 == 2) + { + tmp_value1 = CommonParsing.getIntValue(pes_packet, offset, 4, !CommonParsing.BYTEREORDERING); + + //vdr 1.5.x start packet of dvb-sub || subsequent packet + if ((pes_alignment && (0xF0FFFFFF & tmp_value1) == 0x20010000) || (!pes_alignment && (0xF0FFFFFF & tmp_value1) == 0x20010001)) + { + for (int i = offset, j = offset + 4; i < j; i++) + pes_packet[i] = (byte) 0xFF; + + pes_extensionlength += 4; + pes_packet[8] = (byte)(pes_extensionlength); + pes_payloadlength -= 4; + + //pes_extension2_id = 1; + pes_extension2_id = subID = tmp_value1>>>24; + pes_streamtype = CommonParsing.MPEG2PS_TYPE; //will be resetted before next packet + + if (pes_alignment) + pes_packet[offset + 4] = (byte)(subID); + } + } + + //subpic in vdr_pes before 1.5.x if (pes_alignment && !isTeletext && (subID>>>4 == 2 || subID>>>4 == 3)) pes_streamtype = CommonParsing.MPEG2PS_TYPE; //will be resetted before next packet @@ -875,7 +893,7 @@ case 0xE0: IDtype = Resource.getString("idtype.mpeg.video"); - streamdemultiplexer = new StreamDemultiplexer(ptsoffset); + streamdemultiplexer = new StreamDemultiplexer(collection, ptsoffset); streamdemultiplexer.setID(pesID); streamdemultiplexer.setType(CommonParsing.MPEG_VIDEO); streamdemultiplexer.setnewID(newID[CommonParsing.MPEG_VIDEO]++); @@ -887,7 +905,7 @@ if (pesID0 == 0 || pesID0 == pesID) { if (action == CommonParsing.ACTION_DEMUX) - streamdemultiplexer.initVideo(fparent, MainBufferSize, demuxList.size(), CommonParsing.PRIMARY_PES_PARSER); + streamdemultiplexer.initVideo(collection, fparent, MainBufferSize, demuxList.size(), CommonParsing.PRIMARY_PES_PARSER); else IDtype += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(streamdemultiplexer.getnewID()).toUpperCase(); @@ -904,7 +922,7 @@ case 0xD0: IDtype = Resource.getString("idtype.mpeg.audio"); - streamdemultiplexer = new StreamDemultiplexer(ptsoffset); + streamdemultiplexer = new StreamDemultiplexer(collection, ptsoffset); streamdemultiplexer.setID(pesID); streamdemultiplexer.setType(CommonParsing.MPEG_AUDIO); streamdemultiplexer.setnewID(newID[CommonParsing.MPEG_AUDIO]++); @@ -914,7 +932,7 @@ demuxList.add(streamdemultiplexer); if (action == CommonParsing.ACTION_DEMUX) - streamdemultiplexer.init(fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.PRIMARY_PES_PARSER); + streamdemultiplexer.init(collection, fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.PRIMARY_PES_PARSER); else IDtype += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(streamdemultiplexer.getnewID()).toUpperCase(); @@ -928,7 +946,7 @@ IDtype = Resource.getString("idtype.private.stream"); IDtype += (isTeletext ? " TTX " : "") + (subID != 0 ? " (SubID 0x" + Integer.toHexString(subID).toUpperCase() + ")" : ""); - streamdemultiplexer = new StreamDemultiplexer(ptsoffset); + streamdemultiplexer = new StreamDemultiplexer(collection, ptsoffset); streamdemultiplexer.setID(pesID); streamdemultiplexer.setsubID(subID); streamdemultiplexer.setTTX(isTeletext); @@ -984,7 +1002,7 @@ case CommonParsing.TELETEXT: case CommonParsing.SUBPICTURE: case CommonParsing.LPCM_AUDIO: - streamdemultiplexer.init(fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.PRIMARY_PES_PARSER); + streamdemultiplexer.init(collection, fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.PRIMARY_PES_PARSER); break; default: @@ -1112,7 +1130,6 @@ } - /** * file end reached for split */ @@ -1121,117 +1138,7 @@ in.close(); - - if (action != CommonParsing.ACTION_DEMUX) - streamconverter.close(job_processing, CommonParsing.isInfoScan()); - - else - { - for (int i = 0, NumberOfVideostreams = 0; i < demuxList.size(); i++) - { - streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); - - if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO) - { - /** - * accept only first video - */ - if (NumberOfVideostreams > 0) - { - Common.setMessage("!> further videostream found (ID 0x" + Integer.toHexString(streamdemultiplexer.getID()).toUpperCase() + ") -> ignored"); - continue; - } - - /** - * d2v project - */ - if (CreateD2vIndex || SplitProjectFile) - job_processing.getProjectFileD2V().write(job_processing.getProjectFileExportLength(), job_processing.getExportedVideoFrameNumber()); - - Common.setMessage(""); - Common.setMessage(Resource.getString("video.msg.summary") + " " + job_processing.getExportedVideoFrameNumber() + "/ " + clv[0] + "/ " + clv[1] + "/ " + clv[2] + "/ " + clv[3] + "/ " + clv[4]); - - vptslog = streamdemultiplexer.closeVideo(job_processing, collection.getOutputDirectory() + collection.getFileSeparator()); - - NumberOfVideostreams++; - } - } - - //System.gc(); - - int[] stream_number = new int[10]; - - for (int i = 0, es_streamtype; i < demuxList.size(); i++) - { - streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); - es_streamtype = streamdemultiplexer.getType(); - - if (es_streamtype == CommonParsing.MPEG_VIDEO) - continue; - - String[] values = streamdemultiplexer.close(job_processing, vptslog); - - if (values[0].equals("")) - { - Common.setMessage(Resource.getString("parsePrimaryPES.msg.noexport") + Integer.toHexString(streamdemultiplexer.getID()).toUpperCase() + ")"); - continue; - } - - String newfile = values[3] + (stream_number[es_streamtype] > 0 ? ("[" + stream_number[es_streamtype] + "]") : "") + "." + values[2]; - - Common.renameTo(values[0], newfile); - - values[0] = newfile; - values[3] = vptslog; - - switch (es_streamtype) - { - case CommonParsing.AC3_AUDIO: - case CommonParsing.DTS_AUDIO: - if (streamdemultiplexer.subID() != 0 && (0xF0 & streamdemultiplexer.subID()) != 0x80) - break; - - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePrimaryPES.ac3") + " " + (streamdemultiplexer.subID() != 0 ? ("(SubID 0x" + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")") : "")); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.TELETEXT: - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePrimaryPES.teletext") + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.MPEG_AUDIO: - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePrimaryPES.mpeg.audio") + Integer.toHexString(streamdemultiplexer.getID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.LPCM_AUDIO: - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePrimaryPES.lpcm.audio") + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.SUBPICTURE: - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePrimaryPES.subpic") + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - } - - stream_number[es_streamtype]++; - - new File(newfile).delete(); - new File(values[1]).delete(); - } - } + vptslog = processElementaryStreams(vptslog, action, clv, collection, job_processing); } catch (IOException e2) { @@ -1240,5 +1147,4 @@ return vptslog; } - } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserPESSecondary.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserPESSecondary.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserPESSecondary.java 2006-03-25 23:33:02.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserPESSecondary.java 2008-02-17 20:26:38.000000000 +0000 @@ -52,7 +52,6 @@ import net.sourceforge.dvb.projectx.parser.StreamConverter; import net.sourceforge.dvb.projectx.parser.StreamDemultiplexer; import net.sourceforge.dvb.projectx.parser.StreamParserBase; -import net.sourceforge.dvb.projectx.parser.StreamProcess; /** @@ -81,6 +80,9 @@ JobProcessing job_processing = collection.getJobProcessing(); + job_processing.clearStatusVariables(); + int[] clv = job_processing.getStatusVariables(); + /** * split part */ @@ -88,6 +90,8 @@ String paname = fparent + ".ma1"; + String file_id = aXInputFile.getFileID(); + List tempfiles = job_processing.getTemporaryFileList(); if (!tempfiles.isEmpty()) @@ -149,6 +153,8 @@ int offset; int returncode = 0; + int tmp_value1 = 0; + byte[] pes_packet = new byte[0x10006]; byte[] buffered_data; @@ -156,8 +162,6 @@ long size; long qexit; - job_processing.clearStatusVariables(); - int[] clv = job_processing.getStatusVariables(); job_processing.setMinBitrate(CommonParsing.MAX_BITRATE_VALUE); job_processing.setMaxBitrate(0); @@ -170,11 +174,9 @@ Hashtable substreams = new Hashtable(); StandardBuffer sb; - List demuxList = job_processing.getSecondaryPESDemuxList(); - + demuxList = job_processing.getSecondaryPESDemuxList(); demuxList.clear(); - StreamDemultiplexer streamdemultiplexer = null; try { @@ -436,7 +438,31 @@ subID = 0xFF & pes_packet[offset]; isTeletext = pes_extensionlength == 0x24 && subID>>>4 == 1; - //subpic in vdr_pes + // vdr 1.5.x dvb-subs container + if (pes_payloadlength >= 4 && subID>>>4 == 2) + { + tmp_value1 = CommonParsing.getIntValue(pes_packet, offset, 4, !CommonParsing.BYTEREORDERING); + + //vdr 1.5.x start packet of dvb-sub || subsequent packet + //if ((pes_alignment && tmp_value1 == 0x20010000) || (!pes_alignment && tmp_value1 == 0x20010001)) + if ((pes_alignment && (0xF0FFFFFF & tmp_value1) == 0x20010000) || (!pes_alignment && (0xF0FFFFFF & tmp_value1) == 0x20010001)) + { + for (int i = offset, j = offset + 4; i < j; i++) + pes_packet[i] = (byte) 0xFF; + + pes_extensionlength += 4; + pes_packet[8] = (byte)(pes_extensionlength); + pes_payloadlength -= 4; + + //pes_extension2_id = 1; + pes_extension2_id = subID = tmp_value1>>>24; + pes_streamtype = CommonParsing.MPEG2PS_TYPE; //will be resetted before next packet + + if (pes_alignment) + pes_packet[offset + 4] = (byte)(subID); } + } + + //subpic in vdr_pes before 1.5.x if (pes_alignment && !isTeletext && (subID>>>4 == 2 || subID>>>4 == 3)) pes_streamtype = CommonParsing.MPEG2PS_TYPE; //will be resetted before next packet @@ -528,7 +554,7 @@ case 0xE0: IDtype = Resource.getString("idtype.mpeg.video.ignored"); - streamdemultiplexer = new StreamDemultiplexer(); + streamdemultiplexer = new StreamDemultiplexer(collection); streamdemultiplexer.setID(pesID); streamdemultiplexer.setsubID(0); streamdemultiplexer.setType(CommonParsing.MPEG_VIDEO); @@ -541,14 +567,14 @@ case 0xD0: IDtype = Resource.getString("idtype.mpeg.audio"); - streamdemultiplexer = new StreamDemultiplexer(); + streamdemultiplexer = new StreamDemultiplexer(collection); streamdemultiplexer.setID(pesID); streamdemultiplexer.setsubID(0); streamdemultiplexer.setType(CommonParsing.MPEG_AUDIO); streamdemultiplexer.setStreamType(pes_streamtype); demuxList.add(streamdemultiplexer); - streamdemultiplexer.init(fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.SECONDARY_PES_PARSER); + streamdemultiplexer.init(collection, fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.SECONDARY_PES_PARSER); break; } @@ -559,7 +585,7 @@ IDtype = Resource.getString("idtype.private.stream"); IDtype += (isTeletext ? " TTX ": "") + (subID != 0 ? " (SubID 0x" + Integer.toHexString(subID).toUpperCase() + ")" : ""); - streamdemultiplexer = new StreamDemultiplexer(); + streamdemultiplexer = new StreamDemultiplexer(collection); streamdemultiplexer.setID(pesID); streamdemultiplexer.setsubID(subID); @@ -586,7 +612,7 @@ streamdemultiplexer.setStreamType(pes_streamtype); demuxList.add(streamdemultiplexer); - streamdemultiplexer.init(fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.SECONDARY_PES_PARSER); + streamdemultiplexer.init(collection, fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.SECONDARY_PES_PARSER); break; } @@ -612,90 +638,9 @@ Common.setMessage(Resource.getString("parseSecondaryPES.packs", String.valueOf(clv[5]), String.valueOf(count * 100 / size), String.valueOf(count))); - in.close(); - int[] stream_number = new int[10]; - - for (int i = 0, es_streamtype; i < demuxList.size(); i++) - { - streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); - es_streamtype = streamdemultiplexer.getType(); - - if (es_streamtype == CommonParsing.MPEG_VIDEO) - continue; - - String[] values = streamdemultiplexer.close(job_processing, vptslog); - - if (values[0].equals("")) - { - Common.setMessage(Resource.getString("parseSecondaryPES.msg.noexport") + Integer.toHexString(streamdemultiplexer.getID()).toUpperCase() + ")"); - continue; - } - - String newfile = values[3] + (stream_number[es_streamtype] > 0 ? ("[" + stream_number[es_streamtype] + "]") : "") + "." + values[2]; - - Common.renameTo(values[0], newfile); - - values[0] = newfile; - values[3] = vptslog; - - switch (es_streamtype) - { - case CommonParsing.AC3_AUDIO: - case CommonParsing.DTS_AUDIO: - if ( streamdemultiplexer.subID() != 0 && (0xF0 & streamdemultiplexer.subID()) != 0x80 ) - break; - - Common.setMessage(""); - Common.setMessage(Resource.getString("parseSecondaryPES.ac3.audio") + ((streamdemultiplexer.subID() != 0) ? ("(SubID 0x" + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase()+")") : "")); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.TELETEXT: - Common.setMessage(""); - Common.setMessage(Resource.getString("parseSecondaryPES.teletext") + " (SubID 0x" + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.MPEG_AUDIO: - Common.setMessage(""); - Common.setMessage(Resource.getString("parseSecondaryPES.mpeg.audio") + " (0x" + Integer.toHexString(streamdemultiplexer.getID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.LPCM_AUDIO: - Common.setMessage(""); - Common.setMessage(Resource.getString("parseSecondaryPES.lpcm.audio") + " (SubID 0x" + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.SUBPICTURE: - Common.setMessage(""); - Common.setMessage(Resource.getString("parseSecondaryPES.subpic") + " (SubID 0x" + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - } - - stream_number[es_streamtype]++; - - // save infos for output segmentation - tempfiles.add(values[0]); - tempfiles.add(aXInputFile); - tempfiles.add(values[1]); - tempfiles.add(values[2]); - - if (job_processing.getSplitSize() == 0) - { - new File(newfile).delete(); - new File(values[1]).delete(); - } - } + processNonVideoElementaryStreams(vptslog, action, clv, collection, job_processing, tempfiles, aXInputFile); } catch (IOException e2) { diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserPVA.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserPVA.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserPVA.java 2006-01-23 19:40:22.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserPVA.java 2009-01-18 10:21:20.000000000 +0000 @@ -33,6 +33,7 @@ import java.util.Arrays; import java.util.List; +//import java.util.Hashtable; import net.sourceforge.dvb.projectx.common.Common; import net.sourceforge.dvb.projectx.common.Resource; @@ -48,7 +49,6 @@ import net.sourceforge.dvb.projectx.parser.StreamConverter; import net.sourceforge.dvb.projectx.parser.StreamDemultiplexer; import net.sourceforge.dvb.projectx.parser.StreamParserBase; -import net.sourceforge.dvb.projectx.parser.StreamProcess; /** @@ -90,17 +90,11 @@ /** * PVA/PSV/PSA Parser */ - public String parseStream(JobCollection collection, XInputFile aPvaXInputFile, int pes_streamtype, int action, String vptslog) + public String parseStream(JobCollection collection, XInputFile aXInputFile, int pes_streamtype, int action, String vptslog) { - String fchild = collection.getOutputName(aPvaXInputFile.getName()); - String fparent = collection.getOutputNameParent(fchild); - JobProcessing job_processing = collection.getJobProcessing(); - /** - * split part - */ - fparent += job_processing.getSplitSize() > 0 ? "(" + job_processing.getSplitPart() + ")" : "" ; + setFileName(collection, job_processing, aXInputFile); boolean Message_1 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg1); boolean Message_2 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg2); @@ -108,8 +102,12 @@ boolean Debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog); boolean OverlapCheck = collection.getSettings().getBooleanProperty(Keys.KEY_PVA_FileOverlap); boolean Concatenate = collection.getSettings().getBooleanProperty(Keys.KEY_Input_concatenateForeignRecords); - boolean CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); - boolean SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); + + CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); + SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); + + setOverheadSize(collection); + boolean Overlap = collection.getSettings().getBooleanProperty(Keys.KEY_ExportPanel_Export_Overlap); boolean containsPts = false; @@ -156,6 +154,7 @@ long Overlap_Value = 1048576L * (collection.getSettings().getIntProperty(Keys.KEY_ExportPanel_Overlap_Value) + 1); long qexit; + String file_id = aXInputFile.getFileID(); String[] streamtypes = { Resource.getString("parsePVA.streamtype.ac3"), @@ -166,11 +165,13 @@ RawFile rawfile = null; StreamBuffer streambuffer = null; - StreamDemultiplexer streamdemultiplexer = null; - StreamConverter streamconverter = new StreamConverter(); + streamconverter = new StreamConverter(); - List demuxList = job_processing.getPVADemuxList(); + demuxList = job_processing.getPVADemuxList(); List PVAPidlist = job_processing.getPVAPidList(); +// + streamobjects = getStreamObjects(job_processing); +// /** * re-read old streams, for next split part @@ -192,7 +193,8 @@ for (int i = 0; i < demuxList.size(); i++) { streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); - +Common.setMessage(">>3 " + streamdemultiplexer); +Common.setMessage(">>4 " + streamdemultiplexer.hashCode()); if (streamdemultiplexer.getnewID() != 0) newID[streamdemultiplexer.getType()]++; @@ -200,38 +202,17 @@ continue; if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO) - streamdemultiplexer.initVideo2(fparent); + streamdemultiplexer.initVideo2(collection, fparent); else - streamdemultiplexer.init2(fparent); + streamdemultiplexer.init2(collection, fparent); } } /** * init conversions */ - switch (action) - { - case CommonParsing.ACTION_TO_VDR: - streamconverter.init(fparent + ".vdr", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_TO_M2P: - streamconverter.init(fparent + ".m2p", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_TO_PVA: - streamconverter.init(fparent + ".new.pva", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_TO_TS: - streamconverter.init(fparent + ".ts", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_FILTER: - streamconverter.init(fparent + "[filtered].pva", MainBufferSize, action, job_processing.getSplitPart()); - } - + initConversion(collection, fparent, action, CommonParsing.ACTION_TO_PVA, job_processing.getSplitPart()); /** * d2v project @@ -280,18 +261,18 @@ */ for (int i = 0; i < starts.length; i++) { - aPvaXInputFile = (XInputFile) collection.getInputFile(i); + aXInputFile = (XInputFile) collection.getInputFile(i); starts[i] = size; - size += aPvaXInputFile.length(); + size += aXInputFile.length(); } - aPvaXInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber()); + aXInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber()); /** * set start & end byte pos. of first file segment */ count = starts[job_processing.getFileNumber()]; - size = count + aPvaXInputFile.length(); + size = count + aXInputFile.length(); if (CommonParsing.getPvaPidExtraction()) rawfile = new RawFile(fparent, CommonParsing.getPvaPidToExtract(), MainBufferSize); @@ -316,7 +297,7 @@ * jump near to first cut-in point to collect more audio */ if (CutMode == CommonParsing.CUTMODE_BYTE && CutpointList.size() > 0 && CommonParsing.getCutCounter() == 0) - startPoint = Long.parseLong(CutpointList.get(CommonParsing.getCutCounter()).toString()) - ((action == CommonParsing.ACTION_DEMUX) ? 2048000: 0); + startPoint = Long.parseLong(CutpointList.get(CommonParsing.getCutCounter()).toString()) - ((action == CommonParsing.ACTION_DEMUX) ? OverheadSize : 0); if (startPoint < 0) startPoint = count; @@ -339,22 +320,22 @@ } } - aPvaXInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber()); + aXInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber()); count = starts[job_processing.getFileNumber()]; if (job_processing.getFileNumber() > 0) - Common.setMessage(Resource.getString("parsePVA.continue") + " " + aPvaXInputFile); + Common.setMessage(Resource.getString("parsePVA.continue") + " " + aXInputFile); base = count; - size = count + aPvaXInputFile.length(); + size = count + aXInputFile.length(); - PushbackInputStream in = new PushbackInputStream(aPvaXInputFile.getInputStream(startPoint - base), pva_buffersize); + PushbackInputStream in = new PushbackInputStream(aXInputFile.getInputStream(startPoint - base), pva_buffersize); count += (startPoint - base); overlapPVA(collection, overlapnext); - Common.updateProgressBar((action == CommonParsing.ACTION_DEMUX ? Resource.getString("parsePVA.demuxing") : Resource.getString("parsePVA.converting")) + " " + Resource.getString("parsePVA.pvafile") + " " + aPvaXInputFile.getName(), (count - base), (size - base)); + Common.updateProgressBar((action == CommonParsing.ACTION_DEMUX ? Resource.getString("parsePVA.demuxing") : Resource.getString("parsePVA.converting")) + " " + Resource.getString("parsePVA.pvafile") + " " + aXInputFile.getName(), (count - base), (size - base)); qexit = count + (0x100000L * Infoscan_Value); @@ -392,7 +373,7 @@ { if (CommonParsing.getCutCounter() == CutpointList.size() && (CommonParsing.getCutCounter() & 1) == 0) { - if (count > Long.parseLong(CutpointList.get(CommonParsing.getCutCounter() - 1).toString()) + 2048000) + if (count > Long.parseLong(CutpointList.get(CommonParsing.getCutCounter() - 1).toString()) + OverheadSize) { ende = true; break bigloop; @@ -634,7 +615,7 @@ post_bytes = 0; if (streambuffer.isStarted()) - streamdemultiplexer = (StreamDemultiplexer)demuxList.get(streambuffer.getID()); + streamdemultiplexer = (StreamDemultiplexer) demuxList.get(streambuffer.getID()); else { // create new ID object @@ -644,7 +625,7 @@ { case 1: IDtype=Resource.getString("idtype.video"); - streamdemultiplexer = new StreamDemultiplexer(ptsoffset); + streamdemultiplexer = new StreamDemultiplexer(collection, ptsoffset); streambuffer.setStarted(true); @@ -655,22 +636,23 @@ streamdemultiplexer.setsubID(0); streamdemultiplexer.setStreamType(pes_streamtype); + // streambuffer.setID(streamdemultiplexer.hashCode()); streambuffer.setID(demuxList.size()); demuxList.add(streamdemultiplexer); if (action == CommonParsing.ACTION_DEMUX) - streamdemultiplexer.initVideo(fparent, MainBufferSize, demuxList.size(), CommonParsing.PVA_PARSER); + streamdemultiplexer.initVideo(collection, fparent, MainBufferSize, demuxList.size(), CommonParsing.PVA_PARSER); else - IDtype += " " + Resource.getString("idtype.mapped.to.e0") + streamtypes[3]; + IDtype += " " + Resource.getString("idtype.mapped.to.e0") + " " + streamtypes[3]; break; case 2: - IDtype=Resource.getString("idtype.main.audio"); + IDtype = Resource.getString("idtype.main.audio"); //do not break default: - IDtype=Resource.getString("idtype.additional"); + IDtype = Resource.getString("idtype.additional"); if (!containsPts) continue loop; @@ -683,7 +665,7 @@ break; } - streamdemultiplexer = new StreamDemultiplexer(ptsoffset); + streamdemultiplexer = new StreamDemultiplexer(collection, ptsoffset); streambuffer.setStarted(true); @@ -698,13 +680,14 @@ streamdemultiplexer.setTTX(isTeletext); streamdemultiplexer.setStreamType(pes_streamtype); + // streambuffer.setID(streamdemultiplexer.hashCode()); streambuffer.setID(demuxList.size()); demuxList.add(streamdemultiplexer); IDtype += " " + Resource.getString("idtype.has.pesid") + Integer.toHexString(streamID).toUpperCase() + " " + streamtypes[streamdemultiplexer.getType()]; if (action == CommonParsing.ACTION_DEMUX) - streamdemultiplexer.init(fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.PVA_PARSER); + streamdemultiplexer.init(collection, fparent, MainBufferSize / demuxList.size(), demuxList.size(), CommonParsing.PVA_PARSER); else IDtype += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(streamdemultiplexer.getnewID()).toUpperCase(); @@ -899,117 +882,7 @@ in.close(); - if (action != CommonParsing.ACTION_DEMUX) - streamconverter.close(job_processing, CommonParsing.isInfoScan()); - - else - { - for (int i = 0, NumberOfVideostreams = 0; i < demuxList.size(); i++) - { - streamdemultiplexer = (StreamDemultiplexer)demuxList.get(i); - - if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO) - { - /** - * accept only first video - */ - if (NumberOfVideostreams > 0) - { - Common.setMessage("!> further videostream found (ID 0x" + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + ") -> ignored"); - continue; - } - - /** - * d2v project - */ - if (CreateD2vIndex || SplitProjectFile) - job_processing.getProjectFileD2V().write(job_processing.getProjectFileExportLength(), job_processing.getExportedVideoFrameNumber()); - - Common.setMessage(""); - Common.setMessage(Resource.getString("video.msg.summary") + " " + job_processing.getExportedVideoFrameNumber() + "/ " + clv[0] + "/ " + clv[1] + "/ " + clv[2] + "/ " + clv[3] + "/ " + clv[4]); - - vptslog = streamdemultiplexer.closeVideo(job_processing, collection.getOutputDirectory() + collection.getFileSeparator()); - - NumberOfVideostreams++; - } - } - - int[] stream_number = new int[10]; - - for (int i = 0, es_streamtype; i < demuxList.size(); i++) - { - streamdemultiplexer = (StreamDemultiplexer)demuxList.get(i); - es_streamtype = streamdemultiplexer.getType(); - - if (es_streamtype == CommonParsing.MPEG_VIDEO) - continue; - - if (streamdemultiplexer.getID() == 0) - continue; - - String[] values = streamdemultiplexer.close(job_processing, vptslog); - - if (values[0].equals("")) - { - Common.setMessage(Resource.getString("parsePVA.msg.noexport") + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + " (0x" + Integer.toHexString(streamdemultiplexer.getID()).toUpperCase() + ")"); - continue; - } - - String newfile = values[3] + ( stream_number[es_streamtype] > 0 ? ("[" + stream_number[es_streamtype] + "]") : "") + "." + values[2]; - - Common.renameTo(values[0], newfile); - - values[0] = newfile; - values[3] = vptslog; - - switch (es_streamtype) - { - case CommonParsing.AC3_AUDIO: - case CommonParsing.DTS_AUDIO: - if (streamdemultiplexer.subID() != 0 && (0xF0 & streamdemultiplexer.subID()) != 0x80) - break; - - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePVA.ac3.onid") + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + " " + ((streamdemultiplexer.subID() != 0) ? ("(SubID 0x" + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")") : "")); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.TELETEXT: - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePVA.teletext.onid") + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + " (SubID 0x" + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.MPEG_AUDIO: - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePVA.mpeg.audio.onid") + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + " (0x" + Integer.toHexString(streamdemultiplexer.getID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.LPCM_AUDIO: - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePVA.lpcm.onid") + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + " (SubID 0x" + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.SUBPICTURE: - Common.setMessage(""); - Common.setMessage(Resource.getString("parsePVA.subpicture.onid") + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + " (SubID 0x" + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - } - - stream_number[es_streamtype]++; - - new File(newfile).delete(); - new File(values[1]).delete(); - } - } + vptslog = processElementaryStreams(vptslog, action, clv, collection, job_processing); if (job_processing.getSplitSize() == 0) { @@ -1030,3 +903,4 @@ } + diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserTS.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserTS.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamParserTS.java 2006-01-22 23:05:08.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamParserTS.java 2011-01-14 20:04:24.000000000 +0000 @@ -1,1338 +1,1688 @@ -/* - * @(#)StreamParser - * - * Copyright (c) 2005-2006 by dvb.matt, All rights reserved. - * - * This file is part of ProjectX, a free Java based demux utility. - * By the authors, ProjectX is intended for educational purposes only, - * as a non-commercial test project. - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -package net.sourceforge.dvb.projectx.parser; - -import java.io.File; -import java.io.InputStream; -import java.io.IOException; -import java.io.PushbackInputStream; - -import java.util.Arrays; -import java.util.List; -import java.util.ArrayList; - -import net.sourceforge.dvb.projectx.common.Common; -import net.sourceforge.dvb.projectx.common.Resource; -import net.sourceforge.dvb.projectx.common.Keys; -import net.sourceforge.dvb.projectx.common.JobCollection; -import net.sourceforge.dvb.projectx.common.JobProcessing; - -import net.sourceforge.dvb.projectx.io.RawFile; - -import net.sourceforge.dvb.projectx.xinput.XInputFile; -import net.sourceforge.dvb.projectx.xinput.StreamInfo; - -import net.sourceforge.dvb.projectx.parser.CommonParsing; -import net.sourceforge.dvb.projectx.parser.StreamConverter; -import net.sourceforge.dvb.projectx.parser.StreamDemultiplexer; -import net.sourceforge.dvb.projectx.parser.StreamParserBase; -import net.sourceforge.dvb.projectx.parser.StreamProcess; - - -/** - * main thread - */ -public class StreamParserTS extends StreamParserBase { - - StreamBuffer streambuffer; - StreamDemultiplexer streamdemultiplexer; - StreamConverter streamconverter; - - ArrayList usedPIDs; - List demuxList; - List TSPidlist; - - boolean CreateD2vIndex; - boolean SplitProjectFile; - - /** - * - */ - public StreamParserTS() - { - super(); - } - - /** - * ts Parser - */ - public String parseStream(JobCollection collection, XInputFile xInputFile, int pes_streamtype, int action, String vptslog) - { - String fchild = collection.getOutputName(xInputFile.getName()); - String fparent = collection.getOutputNameParent(fchild); - - JobProcessing job_processing = collection.getJobProcessing(); - - /** - * split part - */ - fparent += job_processing.getSplitSize() > 0 ? "(" + job_processing.getSplitPart() + ")" : "" ; - - vptslog = "-1"; //fix - - boolean Message_1 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg1); - boolean Message_2 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg2); - boolean Debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog); - boolean JoinPackets = collection.getSettings().getBooleanProperty(Keys.KEY_TS_joinPackets); - boolean HumaxAdaption = collection.getSettings().getBooleanProperty(Keys.KEY_TS_HumaxAdaption); - boolean FinepassAdaption = collection.getSettings().getBooleanProperty(Keys.KEY_TS_FinepassAdaption); - boolean GetEnclosedPackets = collection.getSettings().getBooleanProperty(Keys.KEY_Input_getEnclosedPackets); - boolean IgnoreScrambledPackets = collection.getSettings().getBooleanProperty(Keys.KEY_TS_ignoreScrambled); - boolean PcrCounter = collection.getSettings().getBooleanProperty(Keys.KEY_Conversion_PcrCounter); - boolean BlindSearch = collection.getSettings().getBooleanProperty(Keys.KEY_TS_blindSearch); - CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); - SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); - boolean UseAutoPidFilter = collection.getSettings().getBooleanProperty(Keys.KEY_useAutoPidFilter); - boolean Overlap = collection.getSettings().getBooleanProperty(Keys.KEY_ExportPanel_Export_Overlap); - - boolean ts_isIncomplete = false; - boolean ts_startunit = false; - boolean ts_hasErrors = false; - boolean containsPts = false; - boolean ende = false; - boolean missing_syncword = false; - boolean usePidfilter = false; - boolean isTeletext; - boolean foundObject; - - int ts_buffersize = 189; - int ts_packetlength = 188; - - byte[] ts_packet = new byte[ts_buffersize]; - byte[] pes_packet; - byte[] hav_chunk = { 0x5B, 0x48, 0x4F, 0x4A, 0x49, 0x4E, 0x20, 0x41 }; //'[HOJIN A' - - int Infoscan_Value = Integer.parseInt(collection.getSettings().getProperty(Keys.KEY_ExportPanel_Infoscan_Value)); - int CutMode = collection.getSettings().getIntProperty(Keys.KEY_CutMode); - int ts_pid; - int ts_scrambling = 0; - int ts_adaptionfield = 0; - int ts_counter = 0; - int ts_adaptionfieldlength = 0; - int payload_pesID = 0; - int payload_psiID = 0; - int pes_extensionlength = 0; - int pes_payloadlength = 0; - int pes_packetlength; - int pes_packetoffset = 6; - int pes_headerlength = 9; - int pes_offset = 0; - int pes_subID = 0; - int pes_ID; - int bytes_read = 0; - - int[] newID = { 0x80, 0x90, 0xC0, 0xE0, 0xA0, 0x20 }; - - job_processing.clearStatusVariables(); - int[] clv = job_processing.getStatusVariables(); - - long next_CUT_BYTEPOSITION = 0; - long lastpts = 0; - long ptsoffset = 0; - long packet = 0; - long count = 0; - long size = 0; - long base; - long startPoint = 0; - long starts[] = new long[collection.getPrimaryInputFileSegments()]; - long Overlap_Value = 1048576L * (collection.getSettings().getIntProperty(Keys.KEY_ExportPanel_Overlap_Value) + 1); - long qexit; - - - streamconverter = new StreamConverter(); - - usedPIDs = new ArrayList(); - - demuxList = job_processing.getTSDemuxList(); - TSPidlist = job_processing.getTSPidList(); - - /** - * re-read old streams, for next split part - */ - if (job_processing.getSplitPart() == 0) - { - TSPidlist.clear(); - demuxList.clear(); - } - - else - { - for (int i = 0; i < TSPidlist.size(); i++) - { - streambuffer = (StreamBuffer) TSPidlist.get(i); - streambuffer.reset(); - streambuffer.setStarted(false); - } - - for (int i = 0; i < demuxList.size(); i++) - { - streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); - - if (streamdemultiplexer.getnewID() != 0) - newID[streamdemultiplexer.getType()]++; - - if (streamdemultiplexer.getNum() == -1) - continue; - - if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO) - streamdemultiplexer.initVideo2(fparent); - - else - streamdemultiplexer.init2(fparent); - } - } - - /** - * first split part, or one file only - */ - if (job_processing.getSplitPart() == 0) - { - StreamInfo streamInfo = xInputFile.getStreamInfo(); - - int[] pids = streamInfo.getPIDs(); - - if (pids.length > 0) - { - Common.setMessage(Resource.getString("parseTS.sid") + Integer.toHexString(pids[0]).toUpperCase()); - Common.setMessage(Resource.getString("parseTS.pmt.refers", Integer.toHexString(pids[1]).toUpperCase())); - - Common.setMessage(Resource.getString("ScanInfo.Video")); - Common.setMessage(streamInfo.getVideo()); - - Common.setMessage(Resource.getString("ScanInfo.Audio")); - Common.setMessage(streamInfo.getAudio()); - - Common.setMessage(Resource.getString("ScanInfo.Teletext")); - Common.setMessage(streamInfo.getTeletext()); - - Common.setMessage(Resource.getString("ScanInfo.Subpicture")); - Common.setMessage(streamInfo.getSubpicture()); - - Common.setMessage(""); - - for (int i = 2; i < pids.length; i++) - { - TSPidlist.add(streambuffer = new StreamBuffer()); - streambuffer.setPID(pids[i]); - } - } - - else - Common.setMessage(Resource.getString("parseTS.no.pmt")); - } - - - - /** - * init conversions - */ - switch (action) - { - case CommonParsing.ACTION_TO_VDR: - streamconverter.init(fparent + ".vdr", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_TO_M2P: - streamconverter.init(fparent + ".m2p", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_TO_PVA: - streamconverter.init(fparent + ".pva", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_TO_TS: - streamconverter.init(fparent + ".new.ts", MainBufferSize, action, job_processing.getSplitPart()); - break; - - case CommonParsing.ACTION_FILTER: - streamconverter.init(fparent + "[filtered].ts", MainBufferSize, action, job_processing.getSplitPart()); - } - - /** - * d2v project - */ - if (CreateD2vIndex || SplitProjectFile) - job_processing.getProjectFileD2V().Init(fparent); - - - job_processing.setMinBitrate(CommonParsing.MAX_BITRATE_VALUE); - job_processing.setMaxBitrate(0); - job_processing.setExportedVideoFrameNumber(0); - job_processing.setEndPtsOfGop(-10000); - job_processing.setSequenceHeader(true); - job_processing.setAllMediaFilesExportLength(0); - job_processing.setProjectFileExportLength(0); - job_processing.setCutByteposition(0); - - /** - * pid inclusion - */ - int[] predefined_Pids = UseAutoPidFilter ? xInputFile.getStreamInfo().getMediaPIDs() : collection.getPIDsAsInteger(); - - int[] include = new int[predefined_Pids.length]; - - for (int i = 0; i < include.length; i++) - include[i] = 0x1FFF & predefined_Pids[i]; - - if (include.length > 0) - { - Arrays.sort(include); - - String str = " "; - - for (int i = 0; i < include.length; i++) - str += "0x" + Integer.toHexString(include[i]).toUpperCase() + " "; - - Common.setMessage(Resource.getString("parseTS.special.pids") + ": {" + str + "}"); - - usePidfilter = true; - } - - - try { - - /** - * determine start & end byte pos. of each file segment - */ - for (int i = 0; i < starts.length; i++) - { - xInputFile = (XInputFile) collection.getInputFile(i); - starts[i] = size; - size += xInputFile.length(); - } - - xInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber()); - - /** - * set start & end byte pos. of first file segment - */ - count = starts[job_processing.getFileNumber()]; - size = count + xInputFile.length(); - - /** - * split skipping first, for next split part - */ - if (job_processing.getSplitSize() > 0) - { - startPoint = job_processing.getLastHeaderBytePosition(); - startPoint -= !Overlap ? 0 : Overlap_Value; - - job_processing.setLastGopTimecode(0); - job_processing.setLastGopPts(0); - job_processing.setLastSimplifiedPts(0); - } - - List CutpointList = collection.getCutpointList(); - List ChapterpointList = collection.getChapterpointList(); - - /** - * jump near to first cut-in point to collect more audio - */ - if (CutMode == CommonParsing.CUTMODE_BYTE && CutpointList.size() > 0 && CommonParsing.getCutCounter() == 0) - startPoint = Long.parseLong(CutpointList.get(CommonParsing.getCutCounter()).toString()) - ((action == CommonParsing.ACTION_DEMUX) ? 2048000: 0); - - if (startPoint < 0) - startPoint = count; - - else if (startPoint < count) - { - for (int i = starts.length; i > 0; i--) - if (starts[i - 1] > startPoint) - job_processing.countFileNumber(-1); - } - - - else if (startPoint > count) - { - for (int i = job_processing.getFileNumber() + 1; i < starts.length; i++) - { - if (starts[i] > startPoint) - break; - else - job_processing.countFileNumber(+1); - } - } - - xInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber()); - count = starts[job_processing.getFileNumber()]; - - if (job_processing.getFileNumber() > 0) - Common.setMessage(Resource.getString("parseTS.continue") + " " + xInputFile); - - base = count; - size = count + xInputFile.length(); - - PushbackInputStream in = new PushbackInputStream(xInputFile.getInputStream(startPoint - base), 200); - - count += (startPoint - base); - - Common.updateProgressBar((action == CommonParsing.ACTION_DEMUX ? Resource.getString("parseTS.demuxing") : Resource.getString("parseTS.converting")) + " " + Resource.getString("parseTS.dvb.mpeg") + " " + xInputFile.getName(), (count - base), (size - base)); - - qexit = count + (0x100000L * Infoscan_Value); - - - bigloop: - while (true) - { - loop: - while (count < size) - { - while (pause()) - {} - - if (CommonParsing.isProcessCancelled() || (CommonParsing.isInfoScan() && count > qexit)) - { - CommonParsing.setProcessCancelled(false); - job_processing.setSplitSize(0); - - break bigloop; - } - - /** - * cut end reached - */ - if (job_processing.getCutComparePoint() + 20 < job_processing.getSourceVideoFrameNumber()) - { - ende = true; - break bigloop; - } - - /** - * cut end reached - */ - if (CutMode == CommonParsing.CUTMODE_BYTE && CutpointList.size() > 0) - { - if (CommonParsing.getCutCounter() == CutpointList.size() && (CommonParsing.getCutCounter() & 1) == 0) - if (count > Long.parseLong(CutpointList.get(CommonParsing.getCutCounter() - 1).toString()) + 2048000) - { - ende = true; - break bigloop; - } - } - - /** - * regular read - */ - if (!ts_isIncomplete || !JoinPackets) - { - bytes_read = in.read(ts_packet, 0, ts_buffersize); - - /** - * EOF is packet aligned - */ - if (bytes_read == ts_packetlength && size - count == bytes_read) - ts_packet[188] = 0x47; - - else if (bytes_read < ts_buffersize && JoinPackets) - { - Common.setMessage(Resource.getString("parseTS.incomplete") + " " + count); - count += bytes_read; - break loop; - } - } - - /** - * humax .vid workaround, skip special data chunk - */ - if (HumaxAdaption && ts_packet[0] == 0x7F && ts_packet[1] == 0x41 && ts_packet[2] == 4 && ts_packet[3] == (byte)0xFD) - { - in.skip(995); - count += 1184; - continue loop; - } - - /** - * finepass .hav workaround, chunks fileposition index (hdd sectors) unused, because a file can be hard-cut anywhere - */ - if (FinepassAdaption && ts_packet[0] == 0x47 && ts_packet[188] != 0x47) - { - int i = ts_packetlength; - int j; - int k = ts_buffersize; - int l = hav_chunk.length; - - while (i > 0) - { - j = 0; - - while (i > 0 && ts_packet[i] != hav_chunk[j]) - i--; - - for ( ; i > 0 && j < l && i + j < k; j++) - if (ts_packet[i + j] != hav_chunk[j]) - break; - - /** - * found at least one byte of chunk - */ - if (j > 0) - { - /** ident of chunk doesnt match completely */ - if (j < l && i + j < k) - { - i--; - continue; - } - - in.skip(0x200 - (k - i)); - in.read(ts_packet, i, k - i); - - count += 0x200; - - break; - } - } - } - - - if (HumaxAdaption && ts_packet[0] == 0x47 && ts_packet[188] == 0x7F) - {} // do nothing, take the packet - - else if (ts_packet[0] != 0x47 || (GetEnclosedPackets && ts_packet[188] != 0x47) ) - { - if (Message_2 && !missing_syncword) - Common.setMessage(Resource.getString("parseTS.missing.sync") + " " + count); - - if (ts_isIncomplete && JoinPackets) - { - Common.setMessage(Resource.getString("parseTS.comp.failed")); - - in.unread(ts_packet, 190 - bytes_read, bytes_read - 1); - - ts_isIncomplete = false; - - count++; - } - - else - { - int i = 1; - - while (i < ts_buffersize) - { - if (ts_packet[i] == 0x47) - break; - - i++; - } - - // in.unread(ts_packet, 1, ts_packetlength); - in.unread(ts_packet, i, ts_buffersize - i); - - count += i; - } - - missing_syncword = true; - - continue loop; - } - - else if (ts_isIncomplete && JoinPackets) - Common.setMessage(Resource.getString("parseTS.comp.ok")); - - - if (Message_2 && missing_syncword) - Common.setMessage(Resource.getString("parseTS.found.sync") + " " + count); - - missing_syncword = false; - - in.unread(ts_packet, ts_packetlength, 1); - - /** - * mark for split and cut - */ - job_processing.setLastHeaderBytePosition(count); - next_CUT_BYTEPOSITION = count; - - - if (ts_isIncomplete && JoinPackets) - { - count += (bytes_read - 1); - ts_isIncomplete = false; - } - - else - count += ts_packetlength; - - - packet++; - - ts_hasErrors = (0x80 & ts_packet[1]) != 0; // TS error indicator - ts_startunit = (0x40 & ts_packet[1]) != 0; // new PES packet start - ts_pid = (0x1F & ts_packet[1])<<8 | (0xFF & ts_packet[2]); // the PID - ts_scrambling = (0xC0 & ts_packet[3])>>>6; // packet is scrambled (>0) - ts_adaptionfield = (0x30 & ts_packet[3])>>>4; // has adaption field ? - ts_counter = (0x0F & ts_packet[3]); // packet counter 0..f - ts_adaptionfieldlength = ts_adaptionfield > 1 ? (0xFF & ts_packet[4]) + 1 : 0; // adaption field length - - Common.updateProgressBar((count - base), (size - base)); - - //yield(); - - /** - * pid inclusion - */ - if (usePidfilter && Arrays.binarySearch(include, ts_pid) < 0) - continue loop; - - /** - * raw pid filter extraction - */ - if (action == CommonParsing.ACTION_FILTER) - { - streamconverter.write(job_processing, ts_packet, 0, ts_packetlength, null, next_CUT_BYTEPOSITION, CommonParsing.isInfoScan(), CutpointList); - continue loop; - } - - /** - * 00 = reserved value - */ - if ((ts_adaptionfield & 1) == 0) - continue loop; - +/* + * @(#)StreamParserTS.java + * + * Copyright (c) 2005-2009 by dvb.matt, All rights reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.parser; + +import java.io.File; +import java.io.InputStream; +import java.io.IOException; +import java.io.PushbackInputStream; + +import java.util.Arrays; +import java.util.List; +import java.util.ArrayList; + +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Resource; +import net.sourceforge.dvb.projectx.common.Keys; +import net.sourceforge.dvb.projectx.common.JobCollection; +import net.sourceforge.dvb.projectx.common.JobProcessing; + +import net.sourceforge.dvb.projectx.io.RawFile; + +import net.sourceforge.dvb.projectx.xinput.XInputFile; +import net.sourceforge.dvb.projectx.xinput.StreamInfo; + +import net.sourceforge.dvb.projectx.parser.CommonParsing; +import net.sourceforge.dvb.projectx.parser.StreamConverter; +import net.sourceforge.dvb.projectx.parser.StreamDemultiplexer; +import net.sourceforge.dvb.projectx.parser.StreamParserBase; + +import net.sourceforge.dvb.projectx.parser.TS_PMTParser; + +import net.sourceforge.dvb.projectx.thirdparty.TS; + + +/** + * main thread + */ +public class StreamParserTS extends StreamParserBase { + + private StreamBuffer streambuffer; + + private ArrayList usedPIDs; + + private List TSPidlist; + + private PushbackInputStream inputstream; + + private TS_PMTParser pmt_parser; + + private boolean HumaxAdaption; + private boolean HandanAdaption; + private boolean JepssenAdaption; + private boolean KoscomAdaption; + + private boolean Debug; + + private long count; + + private byte TS_SyncByte = 0x47; + private byte[] hav_chunk = { 0x5B, 0x48, 0x4F, 0x4A, 0x49, 0x4E, 0x20, 0x41 }; //'[HOJIN A' + private byte[] tmp_chunk = new byte[36]; + + private int TS_BufferSize = 189; + private int TS_PacketLength = 188; + private int PidMask = 0x1FFF; + private int MaxBufferSize = 6000000; + private int PushbackBufferSize = 225; // 188 + chunksize (36) + + /** + * + */ + public StreamParserTS() + { + super(); + } + + /** + * ts Parser + */ + public String parseStream(JobCollection collection, XInputFile aXInputFile, int pes_streamtype, int action, String vptslog) + { + JobProcessing job_processing = collection.getJobProcessing(); + + setFileName(collection, job_processing, aXInputFile); + + vptslog = "-1"; //fix + + boolean Message_1 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg1); + boolean Message_2 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg2); + + Debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog); + + boolean JoinPackets = collection.getSettings().getBooleanProperty(Keys.KEY_TS_joinPackets); + boolean GetEnclosedPackets = collection.getSettings().getBooleanProperty(Keys.KEY_Input_getEnclosedPackets); + boolean IgnoreScrambledPackets = collection.getSettings().getBooleanProperty(Keys.KEY_TS_ignoreScrambled); + boolean PcrCounter = collection.getSettings().getBooleanProperty(Keys.KEY_Conversion_PcrCounter); + boolean BlindSearch = collection.getSettings().getBooleanProperty(Keys.KEY_TS_blindSearch); + + CreateD2vIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex); + SplitProjectFile = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); + + setOverheadSize(collection); + + boolean UseAutoPidFilter = collection.getSettings().getBooleanProperty(Keys.KEY_useAutoPidFilter); + boolean Overlap = collection.getSettings().getBooleanProperty(Keys.KEY_ExportPanel_Export_Overlap); + + HumaxAdaption = collection.getSettings().getBooleanProperty(Keys.KEY_TS_HumaxAdaption); + HandanAdaption = collection.getSettings().getBooleanProperty(Keys.KEY_TS_FinepassAdaption); + JepssenAdaption = collection.getSettings().getBooleanProperty(Keys.KEY_TS_JepssenAdaption); + KoscomAdaption = collection.getSettings().getBooleanProperty(Keys.KEY_TS_KoscomAdaption); + + + boolean ts_isIncomplete = false; + boolean ts_startunit = false; + boolean ts_hasErrors = false; + boolean containsPts = false; + boolean ende = false; + boolean missing_syncword = false; + boolean usePidfilter = false; + boolean isTeletext; + boolean foundObject; + boolean TSType192; + boolean TSType192Skip = false; + + byte[] ts_packet = new byte[TS_BufferSize]; + byte[] ts_192pre = new byte[4]; + byte[] pes_packet; + + int Infoscan_Value = Integer.parseInt(collection.getSettings().getProperty(Keys.KEY_ExportPanel_Infoscan_Value)); + int CutMode = collection.getSettings().getIntProperty(Keys.KEY_CutMode); + + int ts_pid; + int ts_scrambling = 0; + int ts_adaptionfield = 0; + int ts_counter = 0; + int ts_adaptionfieldlength = 0; + int ts_service_id = -1; + int ts_pmt_pid = -1; + + int payload_pesID = 0; + int payload_psiID = 0; + + int pes_extensionlength = 0; + int pes_payloadlength = 0; + int pes_packetlength; + int pes_packetoffset = 6; + int pes_headerlength = 9; + int pes_offset = 0; + int pes_subID = 0; + int pes_ID; + int bytes_read = 0; + + int[] newID = { 0x80, 0x90, 0xC0, 0xE0, 0xA0, 0x20 }; + + job_processing.clearStatusVariables(); + int[] clv = job_processing.getStatusVariables(); + + long next_CUT_BYTEPOSITION = 0; + long lastpts = 0; + long ptsoffset = 0; + long packet = 0; + + count = 0; + + long size = 0; + long base; + long startPoint = 0; + long starts[] = new long[collection.getPrimaryInputFileSegments()]; + long Overlap_Value = 1048576L * (collection.getSettings().getIntProperty(Keys.KEY_ExportPanel_Overlap_Value) + 1); + long qexit; + + + streamconverter = new StreamConverter(); + + usedPIDs = new ArrayList(); + + String file_id = aXInputFile.getFileID(); + + demuxList = job_processing.getTSDemuxList(); + TSPidlist = job_processing.getTSPidList(); + + /** + * re-read old streams, for next split part + */ + if (job_processing.getSplitPart() == 0) + { + TSPidlist.clear(); + demuxList.clear(); + } + + else + { + for (int i = 0; i < TSPidlist.size(); i++) + { + streambuffer = (StreamBuffer) TSPidlist.get(i); + streambuffer.reset(); + streambuffer.setStarted(false); + } + + for (int i = 0; i < demuxList.size(); i++) + { + streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); + + if (streamdemultiplexer.getnewID() != 0) + newID[streamdemultiplexer.getType()]++; + + if (streamdemultiplexer.getNum() == -1) + continue; + + if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO) + streamdemultiplexer.initVideo2(collection, fparent); + + else + streamdemultiplexer.init2(collection, fparent); + } + } + + /** + * first split part, or one file only + */ + if (job_processing.getSplitPart() == 0) + { + StreamInfo streamInfo = aXInputFile.getStreamInfo(); + + int[] pids = streamInfo.getPIDs(); + + if (pids.length > 0) + { + Common.setMessage(Resource.getString("parseTS.sid") + Common.adaptString(Integer.toHexString(pids[0]).toUpperCase(), 4)); + Common.setMessage(Resource.getString("parseTS.pmt.refers", Common.adaptString(Integer.toHexString(pids[1]).toUpperCase(), 4))); + + ts_pmt_pid = pids[1]; + pmt_parser = new TS_PMTParser(pids[0], pids[1]); + + Common.setMessage(Resource.getString("ScanInfo.Video")); + Common.setMessage(streamInfo.getVideo()); + + Common.setMessage(Resource.getString("ScanInfo.Audio")); + Common.setMessage(streamInfo.getAudio()); + + Common.setMessage(Resource.getString("ScanInfo.Teletext")); + Common.setMessage(streamInfo.getTeletext()); + + Common.setMessage(Resource.getString("ScanInfo.Subpicture")); + Common.setMessage(streamInfo.getSubpicture()); + + Common.setMessage(""); + + // for (int i = 2; i < pids.length; i++) + for (int i = 1; i < pids.length; i++) // includes pmtpid + { + TSPidlist.add(streambuffer = new StreamBuffer()); + streambuffer.setPID(pids[i]); + } + + job_processing.setAudioStreamInfo(streamInfo.getAudioStreams()); + } + + else + Common.setMessage(Resource.getString("parseTS.no.pmt")); + } + + + /** + * init conversions + */ + initConversion(collection, fparent, action, CommonParsing.ACTION_TO_TS, job_processing.getSplitPart()); + + /** + * d2v project + */ + if (CreateD2vIndex || SplitProjectFile) + job_processing.getProjectFileD2V().Init(fparent); + + + job_processing.setMinBitrate(CommonParsing.MAX_BITRATE_VALUE); + job_processing.setMaxBitrate(0); + job_processing.setExportedVideoFrameNumber(0); + job_processing.setEndPtsOfGop(-10000); + job_processing.setSequenceHeader(true); + job_processing.setAllMediaFilesExportLength(0); + job_processing.setProjectFileExportLength(0); + job_processing.setCutByteposition(0); + + /** + * pid inclusion + */ + int[] predefined_Pids = UseAutoPidFilter ? aXInputFile.getStreamInfo().getMediaPIDs() : collection.getPIDsAsInteger(); + + int[] include = new int[predefined_Pids.length]; + + for (int i = 0; i < include.length; i++) + include[i] = PidMask & predefined_Pids[i]; + + if (include.length > 0) + { + Arrays.sort(include); + + String str = " "; + + for (int i = 0; i < include.length; i++) + str += "0x" + Integer.toHexString(include[i]).toUpperCase() + " "; + + Common.setMessage(Resource.getString("parseTS.special.pids") + ": {" + str + "}"); + + usePidfilter = true; + } + + + try { + + // save event data from diff headers + getEventInfo((XInputFile) collection.getInputFile(0)); + + // determine start & end byte pos. of each file segment + for (int i = 0; i < starts.length; i++) + { + aXInputFile = (XInputFile) collection.getInputFile(i); + starts[i] = size; + size += aXInputFile.length(); + } + + aXInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber()); + + // set start & end byte pos. of first file segment + count = starts[job_processing.getFileNumber()]; + size = count + aXInputFile.length(); + + // split skipping first, for next split part + if (job_processing.getSplitSize() > 0) + { + startPoint = job_processing.getLastHeaderBytePosition(); + startPoint -= !Overlap ? 0 : Overlap_Value; + + job_processing.setLastGopTimecode(0); + job_processing.setLastGopPts(0); + job_processing.setLastSimplifiedPts(0); + } + + List CutpointList = collection.getCutpointList(); + List ChapterpointList = collection.getChapterpointList(); + + // jump near to first cut-in point to collect more audio + if (CutMode == CommonParsing.CUTMODE_BYTE && CutpointList.size() > 0 && CommonParsing.getCutCounter() == 0) + startPoint = Long.parseLong(CutpointList.get(CommonParsing.getCutCounter()).toString()) - ((action == CommonParsing.ACTION_DEMUX) ? OverheadSize : 0); + + if (startPoint < 0) + startPoint = count; + + else if (startPoint < count) + { + for (int i = starts.length; i > 0; i--) + if (starts[i - 1] > startPoint) + job_processing.countFileNumber(-1); + } + + + else if (startPoint > count) + { + for (int i = job_processing.getFileNumber() + 1; i < starts.length; i++) + { + if (starts[i] > startPoint) + break; + else + job_processing.countFileNumber(+1); + } + } + + aXInputFile = (XInputFile) collection.getInputFile(job_processing.getFileNumber()); + TSType192 = aXInputFile.getStreamInfo().getStreamSubType() == CommonParsing.TS_TYPE_192BYTE >>> 8; + + count = starts[job_processing.getFileNumber()]; + + if (job_processing.getFileNumber() > 0) + Common.setMessage(Resource.getString("parseTS.continue") + " " + aXInputFile); + + base = count; + size = count + aXInputFile.length(); + + inputstream = new PushbackInputStream(aXInputFile.getInputStream(startPoint - base), PushbackBufferSize); + + count += (startPoint - base); + + Common.updateProgressBar((action == CommonParsing.ACTION_DEMUX ? Resource.getString("parseTS.demuxing") : Resource.getString("parseTS.converting")) + " " + Resource.getString("parseTS.dvb.mpeg") + " " + aXInputFile.getName(), (count - base), (size - base)); + + qexit = count + (0x100000L * Infoscan_Value); + + + bigloop: + while (true) + { + loop: + while (count < size) + { + while (pause()) + {} + + if (CommonParsing.isProcessCancelled() || (CommonParsing.isInfoScan() && count > qexit)) + { + CommonParsing.setProcessCancelled(false); + job_processing.setSplitSize(0); + + break bigloop; + } + + /** + * cut end reached + */ + if (job_processing.getCutComparePoint() + 20 < job_processing.getSourceVideoFrameNumber()) + { + ende = true; + break bigloop; + } + + /** + * cut end reached + */ + if (CutMode == CommonParsing.CUTMODE_BYTE && CutpointList.size() > 0) + { + if (CommonParsing.getCutCounter() == CutpointList.size() && (CommonParsing.getCutCounter() & 1) == 0) + if (count > Long.parseLong(CutpointList.get(CommonParsing.getCutCounter() - 1).toString()) + OverheadSize) + { + ende = true; + break bigloop; + } + } + + //192er packets simple skipping + TSType192Skip = false; + + /** + * regular read + */ + if (!ts_isIncomplete || !JoinPackets) + { + bytes_read = inputstream.read(ts_packet, 0, TS_BufferSize); + + /** + * EOF is packet aligned + */ + if (bytes_read == TS_PacketLength && size - count == bytes_read) + ts_packet[TS_PacketLength] = TS_SyncByte; + + else if (bytes_read < TS_BufferSize && JoinPackets) + { + Common.setMessage(Resource.getString("parseTS.incomplete") + " " + count); + count += bytes_read; + break loop; + } + + //192er packets simple skipping + if (TSType192 && bytes_read == TS_BufferSize) + { + inputstream.read(ts_192pre, 0, 4); + + TSType192Skip = ts_192pre[3] == TS_SyncByte; + + if (TSType192Skip) + { + ts_packet[TS_PacketLength] = TS_SyncByte; + count += 4; + } + + else + inputstream.unread(ts_192pre, 0, 4); + } + } + + /** + * humax .vid workaround, skip special data chunk + */ + skipLeadingHumaxDataChunk(ts_packet); + + /** + * Jepssen .vid workaround, skip special data chunk + */ + skipLeadingJepssenDataChunk(ts_packet); + + /** + * Koscom .vid workaround, skip special data chunk + */ + skipLeadingKoscomDataChunk(ts_packet); + + /** + * handan+finepass .hav workaround, chunks fileposition index (hdd sectors) unused, because a file can be hard-cut anywhere + */ + skipLeadingHandanDataChunk(ts_packet); + + if (skipJepssenDataChunk(ts_packet)) + {} + + else if (skipKoscomDataChunk(ts_packet)) + {} + + else if (skipHumaxDataChunk(ts_packet)) + {} // do nothing, take the packet + + else if (ts_packet[0] != TS_SyncByte || (GetEnclosedPackets && ts_packet[TS_PacketLength] != TS_SyncByte) ) + { + //192 segmentation combine + if (TSType192 && ts_isIncomplete && JoinPackets) + { + inputstream.read(ts_192pre, 0, 4); + + TSType192Skip = ts_192pre[3] == TS_SyncByte; + + if (TSType192Skip) + { + ts_packet[TS_PacketLength] = TS_SyncByte; + count += 4; + Common.setMessage(Resource.getString("parseTS.comp.ok")); + } + + else + inputstream.unread(ts_192pre, 0, 4); + } + + //default or 192 segmentation combine failed + if (!TSType192Skip) + { + if (Message_2 && !missing_syncword) + Common.setMessage(Resource.getString("parseTS.missing.sync") + " " + count); + + if (ts_isIncomplete && JoinPackets) + { + Common.setMessage(Resource.getString("parseTS.comp.failed")); + + inputstream.unread(ts_packet, 190 - bytes_read, bytes_read - 1); + + ts_isIncomplete = false; + + count++; + } + + else + { + int i = 1; + + while (i < TS_BufferSize) + { + if (ts_packet[i] == TS_SyncByte) + break; + + i++; + } + + inputstream.unread(ts_packet, i, TS_BufferSize - i); + + count += i; + } + + missing_syncword = true; + + continue loop; + } + } + + else if (ts_isIncomplete && JoinPackets) + Common.setMessage(Resource.getString("parseTS.comp.ok")); + + //192er packets simple skipping + if (TSType192Skip) + count -= 4; + + if (Message_2 && missing_syncword) + Common.setMessage(Resource.getString("parseTS.found.sync") + " " + count); + + missing_syncword = false; + + inputstream.unread(ts_packet, TS_PacketLength, 1); + + /** + * mark for split and cut + */ + job_processing.setLastHeaderBytePosition(count); + next_CUT_BYTEPOSITION = count; + + + if (ts_isIncomplete && JoinPackets) + { + count += (bytes_read - 1); + ts_isIncomplete = false; + } + + else + count += TS_PacketLength; + + //192er packets simple skipping + if (TSType192Skip) + count += 4; + + packet++; + + ts_hasErrors = (0x80 & ts_packet[1]) != 0; // TS error indicator + ts_startunit = (0x40 & ts_packet[1]) != 0; // new PES packet start + ts_pid = (0x1F & ts_packet[1])<<8 | (0xFF & ts_packet[2]); // the PID + ts_scrambling = (0xC0 & ts_packet[3])>>>6; // packet is scrambled (>0) + ts_adaptionfield = (0x30 & ts_packet[3])>>>4; // has adaption field ? + ts_counter = (0x0F & ts_packet[3]); // packet counter 0..f + ts_adaptionfieldlength = ts_adaptionfield > 1 ? (0xFF & ts_packet[4]) + 1 : 0; // adaption field length + + Common.updateProgressBar((count - base), (size - base)); + + /** + * pid inclusion + */ + if (usePidfilter && Arrays.binarySearch(include, ts_pid) < 0) + continue loop; + + /** + * raw pid filter extraction + */ + if (action == CommonParsing.ACTION_FILTER) + { + streamconverter.write(job_processing, ts_packet, 0, TS_PacketLength, null, next_CUT_BYTEPOSITION, CommonParsing.isInfoScan(), CutpointList); + continue loop; + } + + /** + * 00 = reserved value, do not message it, it's used e.g. in padding stream 0x1FFF + */ + if ((ts_adaptionfield & 1) == 0) + continue loop; + + // errors + if (ts_hasErrors || ts_adaptionfieldlength > 183 || (ts_adaptionfieldlength > 180 && ts_startunit)) + { + if (Message_1) + Common.setMessage(Resource.getString("parseTS.bit.error", Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4), String.valueOf(packet), String.valueOf(count - TS_PacketLength)) + " (" + ts_adaptionfieldlength + " / " + ts_startunit + ")"); + + //if (!ts_hasErrors) // discard bad packets + continue loop; + } +/** errors alt 0.90.4.00 if (ts_adaptionfieldlength > 183 || (ts_adaptionfieldlength > 180 && ts_startunit)) ts_hasErrors = true; if (ts_hasErrors) { if (Message_1) - Common.setMessage(Resource.getString("parseTS.bit.error", Integer.toHexString(ts_pid).toUpperCase(), "" + packet, "" + (count-188))); + Common.setMessage(Resource.getString("parseTS.bit.error", Integer.toHexString(ts_pid).toUpperCase(), "" + packet, "" + (count-TS_PacketLength))); continue loop; } - - payload_pesID = ts_startunit ? CommonParsing.getIntValue(ts_packet, 4 + ts_adaptionfieldlength, 4, !CommonParsing.BYTEREORDERING) : 0; - payload_psiID = ts_startunit ? payload_pesID>>>16 : 0; - - foundObject = false; - - /** - * find PID object - */ - for (int i = 0; i < TSPidlist.size(); i++) - { - streambuffer = (StreamBuffer)TSPidlist.get(i); - - foundObject = ts_pid == streambuffer.getPID(); - - if (foundObject) - break; - } - - /** - * create new PID object - */ - if (!foundObject) - { - TSPidlist.add(streambuffer = new StreamBuffer()); - streambuffer.setPID(ts_pid); - - /** - * padding packet - */ - if (ts_pid == 0x1FFF) - { - Common.setMessage(Resource.getString("parseTS.stuffing")); - streambuffer.setneeded(false); - } - } - - if (Debug) - System.out.println("pk " + packet + " /pid " + Integer.toHexString(ts_pid) + " /pes " + Integer.toHexString(payload_pesID) + " /tn " + streambuffer.isneeded() + " /er " + ts_hasErrors + " /st " + ts_startunit + " /sc " + ts_scrambling + " /ad " + ts_adaptionfield + " /al " + ts_adaptionfieldlength); - - /** - * PID not of interest - */ - if (!streambuffer.isneeded()) - continue loop; - - - if (IgnoreScrambledPackets) - { - // cannot work with scrambled data - if (ts_scrambling > 0) - { - if (!streambuffer.getScram()) - { - streambuffer.setScram(true); - Common.setMessage(Resource.getString("parseTS.scrambled", Integer.toHexString(ts_pid).toUpperCase(), String.valueOf(packet), String.valueOf(count - 188))); - } - continue loop; - } - - else - { - if (streambuffer.getScram()) - { - streambuffer.setScram(false); - Common.setMessage(Resource.getString("parseTS.clear", Integer.toHexString(ts_pid).toUpperCase(), String.valueOf(packet), String.valueOf(count - 188))); - } - } - } - - /** - * out of sequence? - * no payload == no counter++ - */ - if (Message_1 && (PcrCounter || (!PcrCounter && (1 & ts_adaptionfield) != 0))) - { - if (streambuffer.getCounter() != -1) - { - if (streambuffer.isStarted() && ts_counter != streambuffer.getCounter()) - { - Common.setMessage(Resource.getString("parseTS.outof.sequence", Integer.toHexString(ts_pid).toUpperCase(), String.valueOf(packet), String.valueOf(count - 188), String.valueOf(ts_counter), String.valueOf(streambuffer.getCounter())) + " (~" + Common.formatTime_1( (long)((CommonParsing.getVideoFramerate() / 90.0f) * job_processing.getExportedVideoFrameNumber())) + ")"); - streambuffer.setCounter(ts_counter); - } - - streambuffer.count(); - } - - else - { - streambuffer.setCounter(ts_counter); - streambuffer.count(); - } - } - - /** - * buffering of subsequent packets - */ - if (!ts_startunit) - { - if (streambuffer.isneeded() && streambuffer.isStarted()) - streambuffer.writeData(ts_packet, 4 + ts_adaptionfieldlength, 184 - ts_adaptionfieldlength); - - if (streambuffer.getDataSize() > 6000000) - { - Common.setMessage("!> 0x" + Integer.toHexString(streambuffer.getPID()).toUpperCase() + ", buffered packet exceed maximum size, flushed..."); - streambuffer.reset(); - } - } - - else - { - isTeletext = false; - pes_subID = 0; - - if (streambuffer.getID() == -1 && payload_pesID == 0x1BD) - { - pes_extensionlength = 0; - pes_offset = 0; - - try { - pes_extensionlength = 0xFF & ts_packet[12 + ts_adaptionfieldlength]; - pes_offset = 13 + ts_adaptionfieldlength + pes_extensionlength; - isTeletext = (pes_extensionlength == 0x24 && (0xFF & ts_packet[pes_offset])>>>4 == 1); - - if (!isTeletext) - pes_subID = ((0xFF & ts_packet[pes_offset]) == 0x20 && (0xFF & ts_packet[pes_offset + 1]) == 0 && (0xFF & ts_packet[pes_offset + 2]) == 0xF) ? 0x20 : 0; - - } catch (ArrayIndexOutOfBoundsException e) { - - Common.setMessage(Resource.getString("parseTS.io.error") + " / " + pes_extensionlength + " / " + pes_offset); - Common.setExceptionMessage(e); - - streambuffer.reset(); - streambuffer.setStarted(false); - - continue loop; - } - } - - streambuffer.setStarted(true); - - /** - * create new streamdemultiplexer object - */ - if (streambuffer.getID() == -1) - { - streambuffer.setID(payload_pesID); - String type = ""; - - switch (0xFFFFFFF0 & payload_pesID) - { - case 0x1E0: - type = Resource.getString("idtype.mpeg.video"); - - streambuffer.setDemux(demuxList.size()); - - streamdemultiplexer = new StreamDemultiplexer(); - streamdemultiplexer.setPID(ts_pid); - streamdemultiplexer.setID(payload_pesID); - streamdemultiplexer.setnewID(newID[CommonParsing.MPEG_VIDEO]++); - streamdemultiplexer.setsubID(0); - streamdemultiplexer.setType(CommonParsing.MPEG_VIDEO); - streamdemultiplexer.setStreamType(pes_streamtype); - - demuxList.add(streamdemultiplexer); - - if (action == CommonParsing.ACTION_DEMUX) - { - if (newID[CommonParsing.MPEG_VIDEO] - 1 == 0xE0) - streamdemultiplexer.initVideo(fparent, MainBufferSize / demuxList.size(), demuxList.size(), 2); - - else - { - type += Resource.getString("idtype.ignored"); - streambuffer.setneeded(false); - } - } - - else - type += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(newID[CommonParsing.MPEG_VIDEO] - 1).toUpperCase(); - - break; - - case 0x1C0: - case 0x1D0: - type = Resource.getString("idtype.mpeg.audio"); - - streambuffer.setDemux(demuxList.size()); - - streamdemultiplexer = new StreamDemultiplexer(); - streamdemultiplexer.setPID(ts_pid); - streamdemultiplexer.setID(payload_pesID); - streamdemultiplexer.setnewID(newID[CommonParsing.MPEG_AUDIO]++); - streamdemultiplexer.setsubID(0); - streamdemultiplexer.setType(CommonParsing.MPEG_AUDIO); - streamdemultiplexer.setStreamType(pes_streamtype); - - demuxList.add(streamdemultiplexer); - - if (action == CommonParsing.ACTION_DEMUX) - streamdemultiplexer.init(fparent, MainBufferSize / demuxList.size(), demuxList.size(), 2); - - else - type += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(newID[CommonParsing.MPEG_AUDIO] - 1).toUpperCase(); - - break; - } - - switch (payload_pesID) - { - case 0x1BD: - type = Resource.getString("idtype.private.stream"); - type += (isTeletext ? " (TTX) ": "") + (pes_subID != 0 ? " (SubID 0x" + Integer.toHexString(pes_subID).toUpperCase() + ")" : ""); - - streambuffer.setDemux(demuxList.size()); - - streamdemultiplexer = new StreamDemultiplexer(); - streamdemultiplexer.setPID(ts_pid); - streamdemultiplexer.setID(payload_pesID); - streamdemultiplexer.setsubID(pes_subID); - streamdemultiplexer.setTTX(isTeletext); - - if (isTeletext) - { - streamdemultiplexer.setnewID(newID[CommonParsing.TELETEXT]++); - streamdemultiplexer.setType(CommonParsing.TELETEXT); - } - - else if (pes_subID == 0x20) - { - streamdemultiplexer.setnewID(newID[CommonParsing.SUBPICTURE]++); - streamdemultiplexer.setType(CommonParsing.SUBPICTURE); - } - - else - { - streamdemultiplexer.setnewID(newID[CommonParsing.AC3_AUDIO]++); - streamdemultiplexer.setType(CommonParsing.AC3_AUDIO); - } - - streamdemultiplexer.setStreamType(pes_subID == 0x20 ? CommonParsing.MPEG2PS_TYPE : CommonParsing.PES_AV_TYPE); - demuxList.add(streamdemultiplexer); - - if (action == CommonParsing.ACTION_DEMUX) - streamdemultiplexer.init(fparent, MainBufferSize/demuxList.size(), demuxList.size(), 2); - - if (action != CommonParsing.ACTION_DEMUX && pes_subID != 0) - { - type += Resource.getString("idtype.ignored"); - streambuffer.setneeded(false); - } - - if (action != CommonParsing.ACTION_DEMUX && !isTeletext) - type += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(newID[CommonParsing.AC3_AUDIO] - 1).toUpperCase(); - - if (action != CommonParsing.ACTION_DEMUX && isTeletext) - type += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(newID[CommonParsing.TELETEXT] - 1).toUpperCase(); - - break; - - case 0x1BF: - Common.setMessage(Resource.getString("parseTS.priv.stream2.ignored", Integer.toHexString(ts_pid).toUpperCase())); - //break; - - streambuffer.setneeded(false); // skip foll. packs - - continue loop; - } - - - if (type.equals("")) - { - if (ts_pid == 0 && payload_psiID == 0) - type = "(PAT)"; - - else if (ts_pid == 1 && payload_psiID == 1) - type = "(CAT)"; - - else if (ts_pid == 2 && payload_psiID == 3) - type = "(TSDT)"; - - else if (ts_pid == 0x10 && (payload_psiID == 6 || payload_psiID == 0x40 || payload_psiID == 0x41)) - type = "(NIT)"; - - else if (ts_pid == 0x11 && (payload_psiID == 0x42 || payload_psiID == 0x46)) - type = "(SDT)"; - - else if (ts_pid == 0x11 && payload_psiID == 0x4A) - type = "(BAT)"; - - else if (ts_pid == 0x12 && payload_psiID >= 0x4E && payload_psiID <= 0x6F) - type = "(EIT)"; - - else if (ts_pid == 0x13 && payload_psiID == 0x71) - type = "(RST)"; - - else if (ts_pid == 0x1F && payload_psiID == 0x7F) - type = "(SIT)"; - - else if (ts_pid == 0x1E && payload_psiID == 0x7E) - type = "(DIT)"; - - else if (ts_pid == 0x14 && payload_psiID == 0x70) - type = "(TDS)"; - - else if (ts_pid == 0x14 && payload_psiID == 0x73) - type = "(TOT)"; - - else if (payload_psiID == 0x72 && ts_pid >= 0x10 && ts_pid <= 0x14) - type = "(ST)"; - - else - { - switch (payload_psiID) - { - case 2: - type = "(PMT)"; - break; - - case 4: - type = "(PSI)"; - break; - - case 0x82: - type = "(EMM)"; - break; - - case 0x80: - case 0x81: - case 0x83: - case 0x84: - type = "(ECM)"; - break; - - case 0x43: - case 0x44: - case 0x45: - case 0x47: - case 0x48: - case 0x49: - case 0x4B: - case 0x4C: - case 0x4D: - case 0xFF: - type = "(res.)"; - break; - - default: - if ((payload_psiID >= 4 && payload_psiID <= 3F) || (payload_psiID >= 0x74 && payload_psiID <= 0x7D)) - { - type = "(res.)"; - break; - } - - if (payload_psiID >= 0x80 && payload_psiID < 0xFF) - { - type = "(user def. 0x" + Integer.toHexString(payload_psiID).toUpperCase() + ")"; - break; - } - - type += "(payload: "; - - for (int j = 0; j < 8; j++) - { - String val = Integer.toHexString((0xFF & ts_packet[4 + ts_adaptionfieldlength + j])).toUpperCase(); - type += " " + (val.length() < 2 ? ("0" + val) : val); - } - - type += " ..)"; - } - } - - if (ts_scrambling > 0 && !IgnoreScrambledPackets) - { - type += " (0x" + Long.toHexString(count - 188).toUpperCase() + " #" + packet + ") "; // pos + packno - - if (!streambuffer.getScram()) - Common.setMessage(Resource.getString("parseTS.scrambled.notignored", Integer.toHexString(ts_pid).toUpperCase(), type)); - - streambuffer.setScram(true); - streambuffer.setStarted(false); - streambuffer.setID(-1); - streambuffer.reset(); - - continue loop; - } - - type += " (" + (count - 188) + " #" + packet + ") "; // pos + packno - Common.setMessage("!> PID 0x" + Integer.toHexString(ts_pid).toUpperCase() + " " + type + Resource.getString("parseTS.ignored")); - - if (!BlindSearch || type.indexOf("pay") == -1) - streambuffer.setneeded(false); - - else - streambuffer.setID(-1); - - continue loop; - } - - else - { - type += " (" + (count - 188) + " #" + packet + ") "; // pos + packno - Common.setMessage(Resource.getString("parseTS.pid.has.pes", Integer.toHexString(ts_pid).toUpperCase(), Integer.toHexString(0xFF & payload_pesID).toUpperCase(), type)); - usedPIDs.add("0x" + Integer.toHexString(ts_pid)); - } - } - - if (streambuffer.getDemux() == -1 || !streambuffer.isneeded()) - continue loop; - - - streamdemultiplexer = (StreamDemultiplexer) demuxList.get(streambuffer.getDemux()); - - /** - * pes_packet completed - */ - if (streamdemultiplexer.StreamEnabled()) - { - pes_packet = streambuffer.getData().toByteArray(); - - if (pes_packet.length < 6) - { - if (streamdemultiplexer.getPackCount() != -1) - Common.setMessage(Resource.getString("parseTS.lackof.pes", Integer.toHexString(ts_pid).toUpperCase())); - } - - else if (CommonParsing.validateStartcode(pes_packet, 0) < 0) - Common.setMessage("!> PID 0x" + Integer.toHexString(ts_pid).toUpperCase() + " - invalid start_code of buffered packet.."); - - else - { - pes_payloadlength = CommonParsing.getPES_LengthField(pes_packet, 0); - pes_packetlength = pes_packetoffset + pes_payloadlength; - pes_ID = streamdemultiplexer.getID(); - - /** - * non video packet size usually < 0xFFFF - */ - if (streamdemultiplexer.getType() != CommonParsing.MPEG_VIDEO) - { - if (action == CommonParsing.ACTION_DEMUX) - streamdemultiplexer.write(job_processing, pes_packet, 0, pes_packetlength, true); - - else - streamconverter.write(job_processing, pes_packet, streamdemultiplexer, next_CUT_BYTEPOSITION, CommonParsing.isInfoScan(), CutpointList); - } - - /** - * special handling, video packet is possibly greater than 0xffff max. size - */ - else - { - pes_packetlength = action == CommonParsing.ACTION_DEMUX ? 0xFFFC : 0x1800; - - for (int i = 0, j, pes_remaininglength = pes_packetlength, flags = (0xF3 & pes_packet[6])<<16; i < pes_packet.length; i += pes_remaininglength) - { - if (pes_packet.length - i < pes_remaininglength) - pes_remaininglength = pes_packet.length - i; - - if (i == 0) - { - CommonParsing.setPES_LengthField(pes_packet, i, pes_remaininglength - pes_packetoffset); - - if (action == CommonParsing.ACTION_DEMUX) - { - streamdemultiplexer.writeVideo(job_processing, pes_packet, i, pes_remaininglength, true, CutpointList, ChapterpointList); - job_processing.setCutByteposition(next_CUT_BYTEPOSITION); - } - - else - streamconverter.write(job_processing, pes_packet, i, streamdemultiplexer, next_CUT_BYTEPOSITION, CommonParsing.isInfoScan(), CutpointList); - } - - else - { - j = i - pes_headerlength; - - CommonParsing.setValue(pes_packet, j, 4, !CommonParsing.BYTEREORDERING, 0x100 | pes_ID); - CommonParsing.setPES_LengthField(pes_packet, j, pes_remaininglength + 3); - CommonParsing.setValue(pes_packet, j + pes_packetoffset, 3, !CommonParsing.BYTEREORDERING, flags); - - if (action == CommonParsing.ACTION_DEMUX) - { - streamdemultiplexer.writeVideo(job_processing, pes_packet, j, pes_remaininglength + 3, true, CutpointList, ChapterpointList); - job_processing.setCutByteposition(next_CUT_BYTEPOSITION); - } - - else - streamconverter.write(job_processing, pes_packet, j, streamdemultiplexer, next_CUT_BYTEPOSITION, CommonParsing.isInfoScan(), CutpointList); - } - } - } - } - } - - pes_packet = null; - streambuffer.reset(); - - /** - * buffer actual packet data - */ - streambuffer.writeData(ts_packet, 4 + ts_adaptionfieldlength, 184 - ts_adaptionfieldlength); - } - - clv[5]++; - - if (action != CommonParsing.ACTION_DEMUX) - job_processing.setLastHeaderBytePosition(count); - - /** - * split size reached - */ - if (job_processing.getSplitSize() > 0 && job_processing.getSplitSize() < job_processing.getAllMediaFilesExportLength()) - break loop; - } - - /** - * split size reached - */ - if (job_processing.getSplitSize() > 0 && job_processing.getSplitSize() < job_processing.getAllMediaFilesExportLength()) - break bigloop; - - /** - * more files - */ - if (job_processing.getFileNumber() < collection.getPrimaryInputFileSegments() - 1) - { - in.close(); - //System.gc(); - - XInputFile nextXInputFile = (XInputFile) collection.getInputFile(job_processing.countFileNumber(+1)); - count = size; - - in = new PushbackInputStream(nextXInputFile.getInputStream(), 200); - - size += nextXInputFile.length(); - base = count; - - // job_processing.addCellTime(String.valueOf(job_processing.getExportedVideoFrameNumber())); - - Common.setMessage(Resource.getString("parseTS.actual.vframes") + " " + job_processing.getExportedVideoFrameNumber()); - Common.setMessage(Resource.getString("parseTS.switch.to") + " " + nextXInputFile + " (" + Common.formatNumber(nextXInputFile.length()) + " bytes) @ " + base); - - Common.updateProgressBar((action == CommonParsing.ACTION_DEMUX ? Resource.getString("parseTS.demuxing") : Resource.getString("parseTS.converting")) + " " + Resource.getString("parseTS.dvb.mpeg") + " " + nextXInputFile.getName()); - - if (JoinPackets && bytes_read < 188 && nextXInputFile.length() >= 189 - bytes_read) - { - ts_isIncomplete = true; - bytes_read = in.read(ts_packet, bytes_read, 189 - bytes_read); - - Common.setMessage(Resource.getString("parseTS.tryto.complete")); - } - } - - else - break bigloop; - } - - Common.setMessage(Resource.getString("parseTS.packs", String.valueOf(clv[5]), String.valueOf(count * 100 / size), String.valueOf(count))); - - /** - * file end reached for split - */ - if ( (count >= size || ende) && job_processing.getSplitSize() > 0 ) - job_processing.setSplitLoopActive(false); - - in.close(); - - - if (action != CommonParsing.ACTION_DEMUX) - streamconverter.close(job_processing, CommonParsing.isInfoScan()); - - else - vptslog = demultiplexStreams(collection, job_processing, vptslog); - - loadUsablePids(collection); - - } catch (IOException e2) { - - Common.setExceptionMessage(e2); - } - - return vptslog; - } - - /** - * - */ - private String demultiplexStreams(JobCollection collection, JobProcessing job_processing, String vptslog) - { - for (int i = 0, NumberOfVideostreams = 0; i < demuxList.size(); i++) - { - streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); - - if (streamdemultiplexer.getType() == CommonParsing.MPEG_VIDEO) - { - /** - * accept only first video - */ - if (NumberOfVideostreams > 0) - { - Common.setMessage("!> further videostream found (PID 0x" + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + ") -> ignored"); - continue; - } - - /** - * d2v project - */ - if (CreateD2vIndex || SplitProjectFile) - job_processing.getProjectFileD2V().write(job_processing.getProjectFileExportLength(), job_processing.getExportedVideoFrameNumber()); - - int[] clv = job_processing.getStatusVariables(); - - Common.setMessage(""); - Common.setMessage(Resource.getString("video.msg.summary") + " " + job_processing.getExportedVideoFrameNumber() + "/ " + clv[0] + "/ " + clv[1] + "/ " + clv[2] + "/ " + clv[3] + "/ " + clv[4]); - - vptslog = streamdemultiplexer.closeVideo(job_processing, collection.getOutputDirectory() + collection.getFileSeparator()); - - NumberOfVideostreams++; - } - } - - - int[] stream_number = new int[10]; - - for (int i = 0, es_streamtype; i < demuxList.size(); i++) - { - streamdemultiplexer = (StreamDemultiplexer) demuxList.get(i); - es_streamtype = streamdemultiplexer.getType(); - - if (es_streamtype == CommonParsing.MPEG_VIDEO) - continue; - - String[] values = streamdemultiplexer.close(job_processing, vptslog); - - if (values[0].equals("")) - { - Common.setMessage(Resource.getString("parseTS.msg.noexport", Integer.toHexString(0xFF & streamdemultiplexer.getID()).toUpperCase(), Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase())); - continue; - } - - String newfile = values[3] + (stream_number[es_streamtype] > 0 ? ("[" + stream_number[es_streamtype] + "]") : "") + "." + values[2]; - - Common.renameTo(values[0], newfile); - - values[0] = newfile; - values[3] = vptslog; - - switch (es_streamtype) - { - case CommonParsing.AC3_AUDIO: - case CommonParsing.DTS_AUDIO: - Common.setMessage(""); - Common.setMessage(Resource.getString("parseTS.ac3.audio") + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase()); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.TELETEXT: - Common.setMessage(""); - Common.setMessage(Resource.getString("parseTS.teletext.onpid") + Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase() + " (SubID 0x"+Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.MPEG_AUDIO: - Common.setMessage(""); - Common.setMessage(Resource.getString("parseTS.mpeg.audio", Integer.toHexString(0xFF & streamdemultiplexer.getID()).toUpperCase(), Integer.toHexString(streamdemultiplexer.getPID()).toUpperCase())); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.LPCM_AUDIO: - Common.setMessage(""); - Common.setMessage(Resource.getString("parseTS.lpcm.audio") + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - - case CommonParsing.SUBPICTURE: - Common.setMessage(""); - Common.setMessage(Resource.getString("parseTS.subpicture") + Integer.toHexString(streamdemultiplexer.subID()).toUpperCase() + ")"); - - new StreamProcess(es_streamtype, collection, values[0], values[1], values[2], values[3]); - break; - } - - stream_number[es_streamtype]++; - - new File(newfile).delete(); - new File(values[1]).delete(); - } - - return vptslog; - } - - /** - * on InfoScan load usable PIDs in pidlist, if list was empty - */ - private void loadUsablePids(JobCollection collection) - { - if (CommonParsing.isInfoScan() && collection.getPIDCount() == 0) - { - collection.addPID(usedPIDs.toArray()); - - Common.setActiveCollection(Common.getProcessedCollection()); - - /* update pid list of an opened panel */ - Common.getGuiInterface().updateCollectionPanel(Common.getActiveCollection()); - } - } -} +**/ + payload_pesID = ts_startunit ? CommonParsing.getIntValue(ts_packet, 4 + ts_adaptionfieldlength, 4, !CommonParsing.BYTEREORDERING) : 0; + payload_psiID = ts_startunit ? payload_pesID>>>16 : 0; + + foundObject = false; + + /** + * find PID object + */ + for (int i = 0; i < TSPidlist.size(); i++) + { + streambuffer = (StreamBuffer) TSPidlist.get(i); + + foundObject = ts_pid == streambuffer.getPID(); + + if (foundObject) + break; + } + + /** + * create new PID object + */ + if (!foundObject) + { + TSPidlist.add(streambuffer = new StreamBuffer()); + streambuffer.setPID(ts_pid); + + /** + * padding packet + */ + if (ts_pid == PidMask) + { + Common.setMessage(Resource.getString("parseTS.stuffing")); + streambuffer.setneeded(false); + } + } + + if (Debug) + System.out.println("pk " + packet + " /pid " + Integer.toHexString(ts_pid) + " /pes " + Integer.toHexString(payload_pesID) + " /tn " + streambuffer.isneeded() + " /er " + ts_hasErrors + " /st " + ts_startunit + " /sc " + ts_scrambling + " /ad " + ts_adaptionfield + " /al " + ts_adaptionfieldlength); + + // PID not of interest + if (!streambuffer.isneeded()) + continue loop; + + if (IgnoreScrambledPackets) + { + // cannot work with scrambled data + if (ts_scrambling > 0) + { + if (!streambuffer.getScram()) + { + streambuffer.setScram(true); + Common.setMessage(Resource.getString("parseTS.scrambled", Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4), String.valueOf(packet), String.valueOf(count - TS_PacketLength))); + } + continue loop; + } + + else + { + if (streambuffer.getScram()) + { + streambuffer.setScram(false); + Common.setMessage(Resource.getString("parseTS.clear", Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4), String.valueOf(packet), String.valueOf(count - TS_PacketLength))); + } + } + } + + /** + * out of sequence? + * no payload == no counter++ + */ + if (Message_1 && (PcrCounter || (!PcrCounter && (1 & ts_adaptionfield) != 0))) + { + if (streambuffer.getCounter() != -1) + { + if (streambuffer.isStarted() && ts_counter != streambuffer.getCounter()) + { + Common.setMessage(Resource.getString("parseTS.outof.sequence", Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4), String.valueOf(packet), String.valueOf(count - TS_PacketLength), String.valueOf(ts_counter), String.valueOf(streambuffer.getCounter())) + " (~" + Common.formatTime_1( (long)((CommonParsing.getVideoFramerate() / 90.0f) * job_processing.getExportedVideoFrameNumber())) + ")"); + streambuffer.setCounter(ts_counter); + } + + streambuffer.count(); + } + + else + { + streambuffer.setCounter(ts_counter); + streambuffer.count(); + } + } + + /** + * buffering of subsequent packets + */ + if (!ts_startunit) + { + if (streambuffer.isneeded() && streambuffer.isStarted()) + streambuffer.writeData(ts_packet, 4 + ts_adaptionfieldlength, 184 - ts_adaptionfieldlength); + + if (streambuffer.getDataSize() > MaxBufferSize) + { + Common.setMessage("!> 0x" + Integer.toHexString(streambuffer.getPID()).toUpperCase() + ", buffered packet exceeds maximum size, flushed..."); + streambuffer.reset(); + } + } + + else + { + isTeletext = false; + pes_subID = 0; + + if (streambuffer.getID() == -1 && payload_pesID == 0x1BD) + { + pes_extensionlength = 0; + pes_offset = 0; + + try { + pes_extensionlength = 0xFF & ts_packet[12 + ts_adaptionfieldlength]; + pes_offset = 13 + ts_adaptionfieldlength + pes_extensionlength; + isTeletext = (pes_extensionlength == 0x24 && (0xFF & ts_packet[pes_offset])>>>4 == 1); + + // workaround uk freesat teletext + if (!isTeletext) + isTeletext = (pes_extensionlength == 0x24 && (0xFF & ts_packet[pes_offset]) == 0x99); + + if (!isTeletext) + pes_subID = ((0xFF & ts_packet[pes_offset]) == 0x20 && (0xFF & ts_packet[pes_offset + 1]) == 0 && (0xFF & ts_packet[pes_offset + 2]) == 0xF) ? 0x20 : 0; + + } catch (ArrayIndexOutOfBoundsException e) { + + Common.setMessage(Resource.getString("parseTS.io.error") + " / " + pes_extensionlength + " / " + pes_offset); + Common.setExceptionMessage(e); + + streambuffer.reset(); + streambuffer.setStarted(false); + + continue loop; + } + } + + streambuffer.setStarted(true); + + /** + * create new streamdemultiplexer object + */ + if (streambuffer.getID() == -1) + { + streambuffer.setID(payload_pesID); + String type = ""; + + switch (0xFFFFFFF0 & payload_pesID) + { + case 0x1E0: + type = Resource.getString("idtype.mpeg.video"); + + streambuffer.setDemux(demuxList.size()); + + streamdemultiplexer = new StreamDemultiplexer(collection); + streamdemultiplexer.setPID(ts_pid); + streamdemultiplexer.setID(payload_pesID); + streamdemultiplexer.setnewID(newID[CommonParsing.MPEG_VIDEO]++); + streamdemultiplexer.setsubID(0); + streamdemultiplexer.setType(CommonParsing.MPEG_VIDEO); + streamdemultiplexer.setStreamType(pes_streamtype); + + demuxList.add(streamdemultiplexer); + + if (action == CommonParsing.ACTION_DEMUX) + { + if (newID[CommonParsing.MPEG_VIDEO] - 1 == 0xE0) + streamdemultiplexer.initVideo(collection, fparent, MainBufferSize / demuxList.size(), demuxList.size(), 2); + + else + { + type += Resource.getString("idtype.ignored"); + streambuffer.setneeded(false); + } + } + + else + type += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(newID[CommonParsing.MPEG_VIDEO] - 1).toUpperCase(); + + break; + + case 0x1C0: + case 0x1D0: + type = Resource.getString("idtype.mpeg.audio"); + + streambuffer.setDemux(demuxList.size()); + + streamdemultiplexer = new StreamDemultiplexer(collection); + streamdemultiplexer.setPID(ts_pid); + streamdemultiplexer.setID(payload_pesID); + streamdemultiplexer.setnewID(newID[CommonParsing.MPEG_AUDIO]++); + streamdemultiplexer.setsubID(0); + streamdemultiplexer.setType(CommonParsing.MPEG_AUDIO); + streamdemultiplexer.setStreamType(pes_streamtype); + + demuxList.add(streamdemultiplexer); + + if (action == CommonParsing.ACTION_DEMUX) + streamdemultiplexer.init(collection, fparent, MainBufferSize / demuxList.size(), demuxList.size(), 2); + + else + type += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(newID[CommonParsing.MPEG_AUDIO] - 1).toUpperCase(); + + break; + } + + switch (payload_pesID) + { + case 0x1BD: + type = Resource.getString("idtype.private.stream"); + type += (isTeletext ? " (TTX) ": "") + (pes_subID != 0 ? " (SubID 0x" + Integer.toHexString(pes_subID).toUpperCase() + ")" : ""); + + streambuffer.setDemux(demuxList.size()); + + streamdemultiplexer = new StreamDemultiplexer(collection); + streamdemultiplexer.setPID(ts_pid); + streamdemultiplexer.setID(payload_pesID); + streamdemultiplexer.setsubID(pes_subID); + streamdemultiplexer.setTTX(isTeletext); + + if (isTeletext) + { + streamdemultiplexer.setnewID(newID[CommonParsing.TELETEXT]++); + streamdemultiplexer.setType(CommonParsing.TELETEXT); + } + + else if (pes_subID == 0x20) + { + streamdemultiplexer.setnewID(newID[CommonParsing.SUBPICTURE]++); + streamdemultiplexer.setType(CommonParsing.SUBPICTURE); + } + + else + { + streamdemultiplexer.setnewID(newID[CommonParsing.AC3_AUDIO]++); + streamdemultiplexer.setType(CommonParsing.AC3_AUDIO); + } + + streamdemultiplexer.setStreamType(pes_subID == 0x20 ? CommonParsing.MPEG2PS_TYPE : CommonParsing.PES_AV_TYPE); + demuxList.add(streamdemultiplexer); + + if (action == CommonParsing.ACTION_DEMUX) + streamdemultiplexer.init(collection, fparent, MainBufferSize/demuxList.size(), demuxList.size(), 2); + + if (action != CommonParsing.ACTION_DEMUX && pes_subID != 0) + { + type += Resource.getString("idtype.ignored"); + streambuffer.setneeded(false); + } + + if (action != CommonParsing.ACTION_DEMUX && !isTeletext) + type += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(newID[CommonParsing.AC3_AUDIO] - 1).toUpperCase(); + + if (action != CommonParsing.ACTION_DEMUX && isTeletext) + type += " " + Resource.getString("idtype.mapped.to") + Integer.toHexString(newID[CommonParsing.TELETEXT] - 1).toUpperCase(); + + break; + + case 0x1BF: + Common.setMessage(Resource.getString("parseTS.priv.stream2.ignored", Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4))); + //break; + + streambuffer.setneeded(false); // skip foll. packs + + continue loop; + } + + // dynamic pmt + if (UseAutoPidFilter && ts_pid == ts_pmt_pid && payload_psiID == 2) + { + type = "(PMT) (" + (count - TS_PacketLength) + " #" + packet + ") "; // pos + packno + + Common.setMessage("ok> PID 0x" + Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4) + " " + type); + + usedPIDs.add("0x" + Integer.toHexString(ts_pid)); + } + + // accepted pids + else if (!type.equals("")) + { + type += " (" + (count - TS_PacketLength) + " #" + packet + ") "; // pos + packno + + Common.setMessage(Resource.getString("parseTS.pid.has.pes", Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4), Integer.toHexString(0xFF & payload_pesID).toUpperCase(), type)); + + usedPIDs.add("0x" + Integer.toHexString(ts_pid)); + } + + // declined pids + else + { + if (ts_pid == 0 && payload_psiID == 0) + type = "(PAT)"; + + else if (ts_pid == 1 && payload_psiID == 1) + type = "(CAT)"; + + else if (ts_pid == 2 && payload_psiID == 3) + type = "(TSDT)"; + + else if (ts_pid == 0x10 && (payload_psiID == 6 || payload_psiID == 0x40 || payload_psiID == 0x41)) + type = "(NIT)"; + + else if (ts_pid == 0x11 && (payload_psiID == 0x42 || payload_psiID == 0x46)) + type = "(SDT)"; + + else if (ts_pid == 0x11 && payload_psiID == 0x4A) + type = "(BAT)"; + + else if (ts_pid == 0x12 && payload_psiID >= 0x4E && payload_psiID <= 0x6F) + type = "(EIT)"; + + else if (ts_pid == 0x13 && payload_psiID == 0x71) + type = "(RST)"; + + else if (ts_pid == 0x1F && payload_psiID == 0x7F) + type = "(SIT)"; + + else if (ts_pid == 0x1E && payload_psiID == 0x7E) + type = "(DIT)"; + + else if (ts_pid == 0x14 && payload_psiID == 0x70) + type = "(TDS)"; + + else if (ts_pid == 0x14 && payload_psiID == 0x73) + type = "(TOT)"; + + else if (payload_psiID == 0x72 && ts_pid >= 0x10 && ts_pid <= 0x14) + type = "(ST)"; + + else + { + switch (payload_psiID) + { + case 2: + type = "(PMT)"; + break; + + case 4: + type = "(PSI)"; + break; + + case 0x82: + type = "(EMM)"; + break; + + case 0x80: + case 0x81: + case 0x83: + case 0x84: + type = "(ECM)"; + break; + + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x47: + case 0x48: + case 0x49: + case 0x4B: + case 0x4C: + case 0x4D: + case 0xFF: + type = "(res.)"; + break; + + default: + if ((payload_psiID >= 4 && payload_psiID <= 0x3F) || (payload_psiID >= 0x74 && payload_psiID <= 0x7D)) + { + type = "(res.)"; + break; + } + + if (payload_psiID >= 0x80 && payload_psiID < 0xFF) + { + type = "(user def. 0x" + Integer.toHexString(payload_psiID).toUpperCase() + ")"; + break; + } + + type += "(payload: "; + + for (int j = 0; j < 8; j++) + { + String val = Integer.toHexString((0xFF & ts_packet[4 + ts_adaptionfieldlength + j])).toUpperCase(); + type += " " + (val.length() < 2 ? ("0" + val) : val); + } + + type += " ..)"; + } + } + + if (ts_scrambling > 0 && !IgnoreScrambledPackets) + { + type += " (0x" + Long.toHexString(count - TS_PacketLength).toUpperCase() + " #" + packet + ") "; // pos + packno + + if (!streambuffer.getScram()) + Common.setMessage(Resource.getString("parseTS.scrambled.notignored", Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4), type)); + + streambuffer.setScram(true); + streambuffer.setStarted(false); + streambuffer.setID(-1); + streambuffer.reset(); + + continue loop; + } + + type += " (" + (count - TS_PacketLength) + " #" + packet + ") "; // pos + packno + Common.setMessage("!> PID 0x" + Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4) + " " + type + Resource.getString("parseTS.ignored")); + + if (!BlindSearch || type.indexOf("pay") == -1) + streambuffer.setneeded(false); + + else + streambuffer.setID(-1); + + continue loop; + } + } + + //check dynamic PMT here, filtered PMT-PID is not discarded + if (checkDynamicPMT(ts_pid)) + { + streambuffer.reset(); + // buffer actual packet data + streambuffer.writeData(ts_packet, 4 + ts_adaptionfieldlength, 184 - ts_adaptionfieldlength); + + continue loop; + } + // + + if (streambuffer.getDemux() == -1 || !streambuffer.isneeded()) + continue loop; + + streamdemultiplexer = (StreamDemultiplexer) demuxList.get(streambuffer.getDemux()); + + /** + * pes_packet completed + */ + if (streamdemultiplexer.StreamEnabled()) + { + pes_packet = streambuffer.getData().toByteArray(); + + if (pes_packet.length < 6) + { + if (streamdemultiplexer.getPackCount() != -1) + Common.setMessage(Resource.getString("parseTS.lackof.pes", Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4))); + } + + else if (CommonParsing.validateStartcode(pes_packet, 0) < 0) + Common.setMessage("!> PID 0x" + Common.adaptString(Integer.toHexString(ts_pid).toUpperCase(), 4) + " - invalid start_code of buffered packet.."); + + else + { + pes_payloadlength = CommonParsing.getPES_LengthField(pes_packet, 0); + pes_packetlength = pes_packetoffset + pes_payloadlength; + pes_ID = streamdemultiplexer.getID(); + + /** + * non video packet size usually < 0xFFFF + */ + if (streamdemultiplexer.getType() != CommonParsing.MPEG_VIDEO) + { + if (action == CommonParsing.ACTION_DEMUX) + streamdemultiplexer.write(job_processing, pes_packet, 0, pes_packetlength, true); + + else + streamconverter.write(job_processing, pes_packet, streamdemultiplexer, next_CUT_BYTEPOSITION, CommonParsing.isInfoScan(), CutpointList); + } + + /** + * special handling, video packet is possibly greater than 0xffff max. size + */ + else + { + pes_packetlength = action == CommonParsing.ACTION_DEMUX ? 0xFFFC : 0x1800; + + for (int i = 0, j, pes_remaininglength = pes_packetlength, flags = (0xF3 & pes_packet[6])<<16; i < pes_packet.length; i += pes_remaininglength) + { + if (pes_packet.length - i < pes_remaininglength) + pes_remaininglength = pes_packet.length - i; + + if (i == 0) + { + CommonParsing.setPES_LengthField(pes_packet, i, pes_remaininglength - pes_packetoffset); + + if (action == CommonParsing.ACTION_DEMUX) + { + streamdemultiplexer.writeVideo(job_processing, pes_packet, i, pes_remaininglength, true, CutpointList, ChapterpointList); + job_processing.setCutByteposition(next_CUT_BYTEPOSITION); + } + + else + streamconverter.write(job_processing, pes_packet, i, streamdemultiplexer, next_CUT_BYTEPOSITION, CommonParsing.isInfoScan(), CutpointList); + } + + else + { + j = i - pes_headerlength; + + CommonParsing.setValue(pes_packet, j, 4, !CommonParsing.BYTEREORDERING, 0x100 | pes_ID); + CommonParsing.setPES_LengthField(pes_packet, j, pes_remaininglength + 3); + CommonParsing.setValue(pes_packet, j + pes_packetoffset, 3, !CommonParsing.BYTEREORDERING, flags); + + if (action == CommonParsing.ACTION_DEMUX) + { + streamdemultiplexer.writeVideo(job_processing, pes_packet, j, pes_remaininglength + 3, true, CutpointList, ChapterpointList); + job_processing.setCutByteposition(next_CUT_BYTEPOSITION); + } + + else + streamconverter.write(job_processing, pes_packet, j, streamdemultiplexer, next_CUT_BYTEPOSITION, CommonParsing.isInfoScan(), CutpointList); + } + } + } + } + } + + pes_packet = null; + streambuffer.reset(); + + // buffer actual packet data + streambuffer.writeData(ts_packet, 4 + ts_adaptionfieldlength, 184 - ts_adaptionfieldlength); + } + + clv[5]++; + + if (action != CommonParsing.ACTION_DEMUX) + job_processing.setLastHeaderBytePosition(count); + + /** + * split size reached + */ + if (job_processing.getSplitSize() > 0 && job_processing.getSplitSize() < job_processing.getAllMediaFilesExportLength()) + break loop; + } + + /** + * split size reached + */ + if (job_processing.getSplitSize() > 0 && job_processing.getSplitSize() < job_processing.getAllMediaFilesExportLength()) + break bigloop; + + /** + * more files + */ + if (job_processing.getFileNumber() < collection.getPrimaryInputFileSegments() - 1) + { + inputstream.close(); + //System.gc(); + + //comag + long startoffset = checkNextComagSegment(collection, job_processing.getFileNumber()); + + if (startoffset == 0) + startoffset = checkNextJepssenKoscomSegment(collection, job_processing.getFileNumber(), bytes_read); + + XInputFile nextXInputFile = (XInputFile) collection.getInputFile(job_processing.countFileNumber(+1)); + TSType192 = nextXInputFile.getStreamInfo().getStreamSubType() == CommonParsing.TS_TYPE_192BYTE >>> 8; + + count = size + startoffset; + + inputstream = new PushbackInputStream(nextXInputFile.getInputStream(startoffset), PushbackBufferSize); + + size += nextXInputFile.length(); + base = count; + + addCellTimeFromFileSegment(job_processing); + + Common.setMessage(Resource.getString("parseTS.actual.vframes") + " " + job_processing.getExportedVideoFrameNumber()); + Common.setMessage(Resource.getString("parseTS.switch.to") + " " + nextXInputFile + " (" + Common.formatNumber(nextXInputFile.length()) + " bytes) @ " + base); + + Common.updateProgressBar((action == CommonParsing.ACTION_DEMUX ? Resource.getString("parseTS.demuxing") : Resource.getString("parseTS.converting")) + " " + Resource.getString("parseTS.dvb.mpeg") + " " + nextXInputFile.getName()); + + if (JoinPackets && bytes_read < TS_PacketLength && nextXInputFile.length() >= TS_BufferSize - bytes_read) + { + ts_isIncomplete = true; + bytes_read = inputstream.read(ts_packet, bytes_read, TS_BufferSize - bytes_read); + + Common.setMessage(Resource.getString("parseTS.tryto.complete")); + } + } + + else + break bigloop; + } + + Common.setMessage(Resource.getString("parseTS.packs", String.valueOf(clv[5]), String.valueOf(count * 100 / size), String.valueOf(count))); + + /** + * file end reached for split + */ + if ( (count >= size || ende) && job_processing.getSplitSize() > 0 ) + job_processing.setSplitLoopActive(false); + + inputstream.close(); + + vptslog = processElementaryStreams(vptslog, action, clv, collection, job_processing); + + loadUsablePids(collection); + + } catch (IOException e2) { + + Common.setExceptionMessage(e2); + } + + return vptslog; + } + + + /** + * on InfoScan load usable PIDs in pidlist, if list was empty + */ + private void loadUsablePids(JobCollection collection) + { + if (CommonParsing.isInfoScan() && collection.getPIDCount() == 0) + { + collection.addPID(usedPIDs.toArray()); + + Common.setActiveCollection(Common.getProcessedCollection()); + + /* update pid list of an opened panel */ + Common.getGuiInterface().updateCollectionPanel(Common.getActiveCollection()); + } + } + + /** + * humax .vid workaround, skip special data chunk + */ + private boolean skipLeadingHumaxDataChunk(byte[] ts_packet) + { + boolean b = false; + int chunk_size = 1184; + + if (!HumaxAdaption) + return b; + + if (ts_packet[0] != 0x7F || ts_packet[1] != 0x41 || ts_packet[2] != 4 || ts_packet[3] != (byte)0xFD) + return b; + + try { + inputstream.skip(chunk_size - TS_BufferSize); + inputstream.read(ts_packet, 0, TS_BufferSize); + count += chunk_size; + + return !b; + + } catch (IOException e) { + Common.setExceptionMessage(e); + } + + return b; + } + + /** + * Jepssen .vid workaround, skip special data chunk + */ + private boolean skipLeadingJepssenDataChunk(byte[] ts_packet) + { + boolean b = false; + int chunk_size = 36; + int value; + + if (!JepssenAdaption) + return b; + + if (ts_packet[2] != 0 || ts_packet[3] != 0 || ts_packet[4] != 0 || ts_packet[36] != TS_SyncByte) + return b; + + try { + if (Debug) + { + value = CommonParsing.getIntValue(ts_packet, 0, 3, !CommonParsing.BYTEREORDERING); + System.out.println("Jepssen hd chunk: " + value); + } + + inputstream.unread(ts_packet, chunk_size, TS_BufferSize - chunk_size); + inputstream.read(ts_packet, 0, TS_BufferSize); + count += chunk_size; + + return !b; + + } catch (IOException e) { + Common.setExceptionMessage(e); + } + + return b; + } + + /** + * Koscom .vid workaround, skip special data chunk + */ + private boolean skipLeadingKoscomDataChunk(byte[] ts_packet) + { + boolean b = false; + int chunk_size = 4; + + if (!KoscomAdaption) + return b; + + if (ts_packet[2] != 0 || ts_packet[3] != 0 || ts_packet[4] != TS_SyncByte) + return b; + + try { + + inputstream.unread(ts_packet, chunk_size, TS_BufferSize - chunk_size); + inputstream.read(ts_packet, 0, TS_BufferSize); + count += chunk_size; + + return !b; + + } catch (IOException e) { + Common.setExceptionMessage(e); + } + + return b; + } + + /** + * finepass+handan .hav workaround, chunks fileposition index (hdd sectors) unused, because a file can be hard-cut anywhere + */ + private boolean skipLeadingHandanDataChunk(byte[] ts_packet) + { + boolean b = false; + int chunk_size = 0x200; + int i = TS_PacketLength; + int j; + int k = TS_BufferSize; + int l = hav_chunk.length; + + if (!HandanAdaption) + return b; + + if (ts_packet[0] != TS_SyncByte || ts_packet[TS_PacketLength] == TS_SyncByte) + return b; + + while (i > 0) + { + j = 0; + + while (i > 0 && ts_packet[i] != hav_chunk[j]) + i--; + + for ( ; i > 0 && j < l && i + j < k; j++) + if (ts_packet[i + j] != hav_chunk[j]) + break; + + /** + * found at least one byte of chunk + */ + if (j > 0) + { + /** ident of chunk doesnt match completely */ + if (j < l && i + j < k) + { + i--; + continue; + } + + try { + inputstream.skip(chunk_size - (k - i)); + inputstream.read(ts_packet, i, k - i); + + count += chunk_size; + + return !b; + + } catch (IOException e) { + Common.setExceptionMessage(e); + } + + break; + } + } + + return b; + } + + /** + * humax .vid workaround, skip special data chunk + */ + private boolean skipHumaxDataChunk(byte[] ts_packet) + { + boolean b = false; + + if (!HumaxAdaption) + return b; + + if (ts_packet[0] != TS_SyncByte || ts_packet[TS_PacketLength] != 0x7F) + return b; + + return !b; + } + + /** + * Jepssen .vid workaround, skip special data chunk + */ + private boolean skipJepssenDataChunk(byte[] ts_packet) + { + boolean b = false; + int value; + int chunk_size = 36; + + if (!JepssenAdaption) + return b; + + if (ts_packet[TS_PacketLength] == TS_SyncByte) + return b; + + try { + inputstream.read(tmp_chunk, 0, chunk_size); + + // hdd padding chunk 36 bytes , 0 + 1 psb. chunk_no. + if (tmp_chunk[2] == 0 && tmp_chunk[3] == 0 && tmp_chunk[35] == TS_SyncByte) + { + if (Debug) + { + value = (0xFF & tmp_chunk[1])<<16 | (0xFF & tmp_chunk[0])<<8 | (0xFF & ts_packet[TS_PacketLength]); + System.out.println("Jepssen hd chunk: " + value); + } + + ts_packet[TS_PacketLength] = TS_SyncByte; + count += chunk_size; + + return !b; + } + + else + inputstream.unread(tmp_chunk, 0, chunk_size); + + } catch (IOException e) { + Common.setExceptionMessage(e); + } + + return b; + } + + /** + * Koscom .vid workaround, skip special data chunk + */ + private boolean skipKoscomDataChunk(byte[] ts_packet) + { + boolean b = false; + int chunk_size = 4; + + if (!KoscomAdaption) + return b; + + if (ts_packet[TS_PacketLength] == TS_SyncByte) + return b; + + try { + inputstream.read(tmp_chunk, 0, chunk_size); + + // hdd padding chunk 4 bytes , 0 + 1 psb. chunk_no. + if (tmp_chunk[1] == 0 && tmp_chunk[2] == 0 && tmp_chunk[3] == TS_SyncByte) + { + ts_packet[TS_PacketLength] = TS_SyncByte; + count += chunk_size; + + return !b; + } + + else + inputstream.unread(tmp_chunk, 0, chunk_size); + + } catch (IOException e) { + Common.setExceptionMessage(e); + } + + return b; + } + + /** + * + */ + private long checkNextJepssenKoscomSegment(JobCollection collection, int filenumber, int bytes_read) + { + if (!JepssenAdaption && !KoscomAdaption) + return 0; + + byte[] nextsegment = new byte[200]; + long startoffset = 0x3C2E0L; + int offset = JepssenAdaption ? 4 : 68; + + if (filenumber < collection.getPrimaryInputFileSegments() - 1) + { + try { + + ((XInputFile) collection.getInputFile(filenumber + 1)).randomAccessSingleRead(nextsegment, startoffset); + + for (int i = 0; i < offset; i++) + if (nextsegment[i] != 0) + return 0; + + if (nextsegment[offset + TS_PacketLength - bytes_read] == TS_SyncByte) + return (startoffset + offset); + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + } + + return 0; + } + + /** + * + */ + private long checkNextComagSegment(JobCollection collection, int filenumber) + { + XInputFile cXInputFile = (XInputFile) collection.getInputFile(filenumber); + + if (cXInputFile.getStreamInfo().getStreamSubType() != CommonParsing.TS_TYPE_COMAG >>> 8) + return 0; + + int segment_length = 0xBC00; + byte[] lastsegment = new byte[segment_length]; + byte[] nextsegment = new byte[segment_length]; + long startoffset = 0x10000L; + + if (filenumber < collection.getPrimaryInputFileSegments() - 1) + { + try { + + cXInputFile.randomAccessSingleRead(lastsegment, cXInputFile.length() - segment_length); + + XInputFile nXInputFile = (XInputFile) collection.getInputFile(filenumber + 1); + + if (nXInputFile.getStreamInfo().getStreamSubType() != CommonParsing.TS_TYPE_COMAG >>> 8) + return 0; + + nXInputFile.randomAccessSingleRead(nextsegment, startoffset); + + for (int i = 0; i < segment_length; i++) + if (nextsegment[i] != lastsegment[i]) + return (startoffset + i); + + return (startoffset + segment_length); + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + } + + return startoffset; + } + + /** + * check dynamic PMT for PID changes, at split output not yet handled + */ + private boolean checkDynamicPMT(int pid) + { + //if (pmt_parser == null || pid != pmt_parser.getPID()) + return false; + + //int ret = pmt_parser.parsePMT(streambuffer.getData().toByteArray()); + + //Common.setMessage("AA " + ret); + //TSPidList + + // edit pid values here, pts reset in demuxers required + + //return true; + } + + + /** + * + */ + private void getEventInfo(XInputFile xif) + { + int fulltype = xif.getStreamInfo().getStreamFullType(); + int offset = 0; + + if (fulltype == CommonParsing.TS_TYPE_TF5X00) + offset = 4; + + else if (fulltype == CommonParsing.TS_TYPE_TF5X00C) + offset = 0; + + else + { + TS.setEventInfo(null, null, null); + return; + } + + int length = 0xEB0; + byte[] data = new byte[length]; + + try { + + Common.setMessage("-> fetching event info "); + + xif.randomAccessSingleRead(data, 0); + + byte[] data1 = new byte[24]; + System.arraycopy(data, 0x1C, data1, 0, 24); + + byte[] data2 = new byte[131]; + System.arraycopy(data, offset + 0x51, data2, 0, 131); + + byte[] data3 = new byte[1164]; + System.arraycopy(data, offset + 0xE0, data3, 0, 1164); + + TS.setEventInfo(data1, data2, data3); + + Common.setMessage("-> event info cached from TF5X00 header " + (offset == 0 ? "DVB-C" : "DVB-S/T")); + + } catch (Exception e) { + Common.setMessage("!> error fetching event info from TF header"); + } + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessAudio.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessAudio.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessAudio.java 2006-03-29 01:45:26.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessAudio.java 2009-12-30 10:49:54.000000000 +0000 @@ -1,7 +1,7 @@ /* - * @(#)StreamParser + * @(#)StreamParserAudio * - * Copyright (c) 2005-2006 by dvb.matt, All rights reserved. + * Copyright (c) 2005-2009 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -54,9 +54,7 @@ import net.sourceforge.dvb.projectx.io.IDDBufferedOutputStream; import net.sourceforge.dvb.projectx.audio.MpaDecoder; -import net.sourceforge.dvb.projectx.audio.MpaConverter; import net.sourceforge.dvb.projectx.audio.AudioFormat; -import net.sourceforge.dvb.projectx.audio.RIFFHeader; import net.sourceforge.dvb.projectx.xinput.XInputFile; @@ -71,9 +69,102 @@ */ public class StreamProcessAudio extends StreamProcessBase { - private MpaConverter MPAConverter = null; + private final int AC3_AUDIOSTREAM = 0; + private final int MP3_AUDIOSTREAM = 1; + private final int MP2_AUDIOSTREAM = 2; + private final int MP1_AUDIOSTREAM = 3; + private final int DTS_AUDIOSTREAM = 4; + private final int WAV_AUDIOSTREAM = 5; + private final int AAC_AUDIOSTREAM = 6; + private final int NO_AUDIOSTREAM = 10; + private MpaDecoder MPADecoder = null; + private PushbackInputStream InputStream; + + private IDDBufferedOutputStream OutputStream_Ch1; + private IDDBufferedOutputStream OutputStream_Ch2; + + private String FileName_Ch1; + private String FileName_Ch2; + + private boolean HasNewFormat; + private boolean Debug; + private boolean CreateChapters; + private boolean WriteEnabled; + private boolean AddWaveHeaderACM; + private boolean AddWaveHeaderBWF; + private boolean AddWaveHeaderAC3; + private boolean DecodeMpgAudio; + private boolean AC3_ReplaceWithSilence; + private boolean AC3_Patch1stHeader; + private boolean AC3_BitrateAdaption; + private boolean ContainsVideoPTS; + private boolean ContainsAudioPTS; + private boolean CreateM2sIndex; + private boolean Message_2; + private boolean Message_7; + private boolean PitchAudio; + private boolean AllowSpaces; + private boolean ValidateCRC; + private boolean FillGapsWithLastFrame; + private boolean LimitPts; + private boolean AllowFormatChanges; + private boolean AddFrames; + private boolean DownMix; + private boolean ChangeByteorder; + private boolean AddRiffHeader; + private boolean AddAiffHeader; + private boolean ClearCRC; + private boolean IgnoreErrors; + private boolean CreateDDWave; + private boolean FadeInOut; + private boolean Normalize; + private boolean RenameAudio; + + private int FadeInOutMillis; + private int ResampleAudioMode; + private int PitchValue; + private int AudioType; + + private long ModeChangeCount; + private long ModeChangeCount_JSS; + private final long ModeChangeCount_Max = 100; + + private FrameExportInfo FrameExportInfo; + + private int MpaConversionMode; + private final int MpaConversion_None = 0; + private final int MpaConversion_Mode1 = 1; //single to 3D + private final int MpaConversion_Mode2 = 2; //single to jst + private final int MpaConversion_Mode3 = 3; //single to st + private final int MpaConversion_Mode4 = 4; //st-dual to 2 single + private final int MpaConversion_Mode5 = 5; //st-dual to 2 jst - doubled single + private final int MpaConversion_Mode6 = 6; //auto-dual to 2 jst - doubled single + + private long FileLength; + private final long FileLength_Min = 100; + + private double TimeCounter; + + private long FramePosition; + private long CurrentFramePosition; + private long TimePosition; + + private String str_wav = ".wav"; + private String str_ac3 = ".ac3"; + private String str_mpa = ".mpa"; + private String str_mp1 = ".mp1"; + private String str_mp2 = ".mp2"; + private String str_mp3 = ".mp3"; + private String str_mp4 = ".mp4"; + private String str_dts = ".dts"; + private String str_aif = ".aif"; + private String str_pcm = ".pcm"; + private String str_new = ".new"; + private String str_aac = ".aac"; + + /** * */ @@ -85,17 +176,14 @@ } /** - * start method for adjusting audio at timeline + * start method for adjusting audio at TimePosition */ private void processStream(JobCollection collection, XInputFile xInputFile, String filename_pts, String filename_type, String videofile_pts, int isElementaryStream) { Common.updateProgressBar(Resource.getString("audio.progress") + " " + xInputFile.getName(), 0, 0); - boolean Normalize = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_Normalize); - boolean DecodeMpgAudio = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_decodeMpgAudio); - - if (MPAConverter == null) - MPAConverter = new MpaConverter(); + Normalize = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_Normalize); + DecodeMpgAudio = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_decodeMpgAudio); if (MPADecoder == null) MPADecoder = new MpaDecoder(); @@ -106,7 +194,9 @@ MpaDecoder.MULTIPLY = Normalize ? 32767 : 1; MpaDecoder.NORMALIZE = Normalize; MpaDecoder.PRESCAN = MpaDecoder.NORMALIZE; - +// + MpaDecoder.LEVELSCAN = false; +// if (MpaDecoder.MAX_VALUE > 32767) { MpaDecoder.MAX_VALUE = 32767; @@ -116,10 +206,10 @@ /** * messages */ - int MpaConversionMode = collection.getSettings().getIntProperty(Keys.KEY_AudioPanel_loslessMpaConversionMode); + MpaConversionMode = collection.getSettings().getIntProperty(Keys.KEY_AudioPanel_losslessMpaConversionMode); - if (MpaConversionMode > 0) - Common.setMessage(Resource.getString("audio.convert") + " " + Keys.ITEMS_loslessMpaConversionMode[MpaConversionMode]); + if (MpaConversionMode > MpaConversion_None) + Common.setMessage(Resource.getString("audio.convert") + " " + Keys.ITEMS_losslessMpaConversionMode[MpaConversionMode]); if (DecodeMpgAudio) { @@ -148,7 +238,7 @@ /** * restart loop */ - while (processAudio(collection, xInputFile, filename_pts, filename_type, videofile_pts, isElementaryStream, MpaConversionMode)) + while (processAudio(collection, xInputFile, filename_pts, filename_type, videofile_pts, isElementaryStream)) { CommonParsing.setAudioProcessingFlags(CommonParsing.getAudioProcessingFlags() & ~0xCL); @@ -159,9 +249,7 @@ Common.setMessage("-> normalize: multiply factor: " + MpaDecoder.MULTIPLY); if ( (0x10000L & CommonParsing.getAudioProcessingFlags()) != 0) - MpaConversionMode = 0; - - MPAConverter.resetBuffer(); + MpaConversionMode = MpaConversion_None; } CommonParsing.setAudioProcessingFlags(CommonParsing.getAudioProcessingFlags() & 3L); @@ -171,7 +259,7 @@ /** * method for audio processing */ - private boolean processAudio(JobCollection collection, XInputFile xInputFile, String filename_pts, String filename_type, String videofile_pts, int isElementaryStream, int MpaConversionMode) + private boolean processAudio(JobCollection collection, XInputFile xInputFile, String filename_pts, String filename_type, String videofile_pts, int isElementaryStream) { String fchild = isElementaryStream == CommonParsing.ES_TYPE ? collection.getOutputName(xInputFile.getName()) : xInputFile.getName(); String fparent = collection.getOutputNameParent(fchild); @@ -184,86 +272,26 @@ if (isElementaryStream == CommonParsing.ES_TYPE && job_processing.getSplitSize() > 0) fparent += "(" + job_processing.getSplitPart() + ")"; - String newnameL = fparent + ".$mpL$"; - String newnameR = fparent + ".$mpR$"; - - boolean Debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog); - boolean CreateM2sIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createM2sIndex); - boolean AddRiffToMpgAudioL3 = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addRiffToMpgAudioL3); - boolean AddRiffToMpgAudio = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addRiffToMpgAudio); - boolean AddRiffToAc3 = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addRiffToAc3); - boolean Message_2 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg2); - boolean PitchAudio = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_pitchAudio); - boolean AllowSpaces = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_allowSpaces); - boolean ValidateCRC = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_validateCRC); - boolean ReplaceAc3withSilence = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_replaceAc3withSilence); - boolean Patch1stAc3Header = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_patch1stAc3Header); - boolean FillGapsWithLastFrame = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_fillGapsWithLastFrame); - boolean LimitPts = collection.getSettings().getBooleanProperty(Keys.KEY_Audio_limitPts); - boolean AddFrames = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addFrames); - boolean DownMix = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_Downmix); - boolean ChangeByteorder = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_changeByteorder); - boolean AddRiffHeader = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addRiffHeader); - boolean AddAiffHeader = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addAiffHeader); - boolean DecodeMpgAudio = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_decodeMpgAudio); - boolean ClearCRC = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_clearCRC); - boolean IgnoreErrors = collection.getSettings().getBooleanProperty(Keys.KEY_Audio_ignoreErrors); - boolean CreateDDWave = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_createDDWave); - boolean FadeInOut = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_fadeInOut); - - int FadeInOutMillis = collection.getSettings().getIntProperty(Keys.KEY_AudioPanel_fadeInOutMillis); - - /** - * messages - */ - if (IgnoreErrors) - Common.setMessage("-> " + Resource.getString(Keys.KEY_Audio_ignoreErrors[0])); - - if (AllowSpaces) - Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_allowSpaces[0])); - - if (LimitPts) - Common.setMessage("-> " + Resource.getString(Keys.KEY_Audio_limitPts[0])); - - if (ValidateCRC) - Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_validateCRC[0])); - - if (ClearCRC) - Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_clearCRC[0])); - - if (Patch1stAc3Header) - Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_patch1stAc3Header[0])); - - if (ReplaceAc3withSilence) - Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_replaceAc3withSilence[0])); - - if (FillGapsWithLastFrame) - Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_fillGapsWithLastFrame[0])); - - if (AddFrames) - Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_addFrames[0])); - - if (CreateDDWave) - Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_createDDWave[0])); + FileName_Ch1 = fparent + ".$mpL$"; + FileName_Ch2 = fparent + ".$mpR$"; + getSettings(collection); - int ResampleAudioMode = collection.getSettings().getIntProperty(Keys.KEY_AudioPanel_resampleAudioMode); - int PitchValue = Integer.parseInt(collection.getSettings().getProperty(Keys.KEY_AudioPanel_PitchValue)); - - boolean ptsdata = false; - boolean vptsdata = false; boolean insertSilenceLoop = false; - boolean awrite = false; boolean preloop = true; - boolean newformat = true; boolean missing_syncword = false; boolean is_DTS = false; boolean is_AC3 = false; + ContainsAudioPTS = false; + ContainsVideoPTS = false; + HasNewFormat = true; + WriteEnabled = false; + byte[] header_copy = new byte[4]; byte[][] newframes = new byte[2][1]; byte[][] copyframe= new byte[2][1]; - byte[][] silent_Frame=new byte[2][0]; + byte[] silent_Frame = new byte[0]; byte[] pushback = new byte[10]; byte[] frame = new byte[1]; byte[] pushmpa = new byte[4]; @@ -273,68 +301,54 @@ long[] ptspos = {0}; long[] vptsval = {0}; long[] vtime = {0}; - long n = 0; - long actframe = 0; - long timeline = 0; - long audiosize = 0; - long ModeChangeCount = 0; + + long[] insertion_counter = new long[2]; + + String audio_type[] = { "(ac3)", "(mp3)", "(mp2)", "(mp1)", "(dts)", "(pcm)" }; + String tmp_str = null; + + setFramePosition(0); + setCurrentFramePosition(0); + + setTimePosition(0); + setTimeCounter(0.0); + + ModeChangeCount = 0; + ModeChangeCount_JSS = 0; + + FileLength = 0; int pitch[] = { 1, PitchValue }; int minSync = 0; - int[] vw = new int[2]; - int cb = 0; - int cc = 0; - int cd = 0; - int ce = 0; - int i = 0; - int pos = 0; - int x = 0; - int layertype = -1; - int v = 0; - int w = 0; - int frame_counter = 0; - int layer = 0; - int samplerate = 0; - int lastheader = 0; - int padding = 0; - int jss = 0; - int returncode = 0; - int[] layermode2 = { 0,0,0,0 }; - - final int AC3_AUDIOSTREAM = 0; - final int MP3_AUDIOSTREAM = 1; - final int MP2_AUDIOSTREAM = 2; - final int MP1_AUDIOSTREAM = 3; - final int DTS_AUDIOSTREAM = 4; - final int WAV_AUDIOSTREAM = 5; - final int NO_AUDIOSTREAM = 10; - double time_counter = 0.0; + FrameExportInfo = new FrameExportInfo(); - int es_streamtype = CommonParsing.MPEG_AUDIO; //"mp" std + AudioType = -1; - /** - * mp, ac, wa - */ - if (filename_type.equals("ac")) //means dts, too - es_streamtype = CommonParsing.AC3_AUDIO; + int x = 0; + int smpte_offs = 0; - else if (filename_type.equals("dt")) //later, other handling - es_streamtype = CommonParsing.DTS_AUDIO; + int[] video_timeIndex = new int[4]; - else if (filename_type.equals("wa")) - es_streamtype = CommonParsing.LPCM_AUDIO; + int layer = 0; + int returncode = 0; - IDDBufferedOutputStream audiooutL; - IDDBufferedOutputStream audiooutR; + int es_streamtype = determineStreamType(filename_type); /** * pre-init audioparser */ AudioFormat audio = new AudioFormat(es_streamtype); - // pre-check for toggling ac3<->dts - AudioFormat test_audio = new AudioFormat(CommonParsing.DTS_AUDIO); + /** + * pre-check for toggling ac3<->dts, or mpa<->aac + */ + AudioFormat test_audio; + + if (es_streamtype != CommonParsing.MPEG_AUDIO) + test_audio = new AudioFormat(CommonParsing.DTS_AUDIO); + else + test_audio = new AudioFormat(CommonParsing.AAC_AUDIO); try { @@ -346,7 +360,7 @@ { ptsval = obj[0]; ptspos = obj[1]; - ptsdata = true; + ContainsAudioPTS = true; obj = null; } @@ -356,46 +370,37 @@ { vptsval = obj[0]; vtime = obj[1]; - vptsdata = true; + ContainsVideoPTS = true; obj = null; } //System.gc(); - PushbackInputStream audioin = new PushbackInputStream(xInputFile.getInputStream(), 1000000); - - audiosize = xInputFile.length(); + FileLength = xInputFile.length(); long[] addf = { 0, 0 }; - if (audiosize < 1000) + if (FileLength < 1000) Common.setMessage(" Filesize < 1000 byte"); - audiooutL = new IDDBufferedOutputStream(new FileOutputStream(newnameL), 2048000); - - if (MpaConversionMode >= 4) // half of mainbuffer - audiooutR = new IDDBufferedOutputStream(new FileOutputStream(newnameR), 2048000); + initInputStream(xInputFile); - else - audiooutR = new IDDBufferedOutputStream(new FileOutputStream(newnameR)); + initOutputStreams(); + initProjectFiles(); ByteArrayOutputStream silentFrameBuffer = new ByteArrayOutputStream(); - if (CreateM2sIndex) - { - audiooutL.InitIdd(newnameL, 2); - audiooutR.InitIdd(newnameR, 2); - } - if (vptsdata && ptsdata) + // check pts matching area + if (ContainsVideoPTS && ContainsAudioPTS) { int jump = checkPTSMatch(vptsval, ptsval); if (jump < 0) { Common.setMessage(Resource.getString("audio.msg.pts.mismatch")); - vptsdata = false; + ContainsVideoPTS = false; x = 0; } @@ -403,105 +408,95 @@ x = jump; } - if (vptsdata) + // processing with or without video-main-pts + if (ContainsVideoPTS) Common.setMessage(Resource.getString("audio.msg.adjust.at.videopts")); - if (ptsdata && !vptsdata && isElementaryStream != CommonParsing.ES_TYPE) + else if (ContainsAudioPTS && isElementaryStream != CommonParsing.ES_TYPE) Common.setMessage(Resource.getString("audio.msg.adjust.at.ownpts")); - - if (ptsdata) + // the index to start with processing + if (ContainsAudioPTS) { - timeline = ptsval[x]; - n = ptspos[x]; + setTimePosition(ptsval[x]); + setFramePosition(ptspos[x]); } - if (n > 0) - audioin.skip(n); + if (getFramePosition() > 0) + skipInputStream(getFramePosition()); - /** - * riff wave header - */ - RIFFHeader[] riffw = new RIFFHeader[2]; + //init extra wave header + audio.initExtraWaveHeader(AddWaveHeaderACM, AddWaveHeaderBWF, AddWaveHeaderAC3); - riffw[0] = new RIFFHeader(); // normal, left - riffw[1] = new RIFFHeader(); // right + // add preceding wave header + addWaveHeader(audio, es_streamtype); - if (es_streamtype == CommonParsing.MPEG_AUDIO) - { - if (AddRiffToMpgAudioL3) - { - audiooutL.write(riffw[0].ACMnull()); + // main loop + // while ((returncode = processData(audio, es_streamtype) < 0) + // {} - if (MpaConversionMode >= 4) - audiooutR.write(riffw[1].ACMnull()); + bigloop: + while (true) + { + // init FFT/window for mpa decoding for 1 file + initDecoder(audio, es_streamtype); - Common.setMessage(Resource.getString("audio.msg.addriff.acm")); - } + // init decoding of ancillary data + audio.setAncillaryDataDecoder(Message_7, Debug); - else if (AddRiffToMpgAudio) + /** + * PCM Audio + */ + if (es_streamtype == CommonParsing.LPCM_AUDIO) { - audiooutL.write(riffw[0].BWFnull()); - - if (MpaConversionMode >= 4) - audiooutR.write(riffw[1].BWFnull()); - - Common.setMessage(Resource.getString("audio.msg.addriff.bwf")); + processPCMData(job_processing, audio, vptsval, ptsval); + break bigloop; } - } - - else if (AddRiffToAc3 && es_streamtype == CommonParsing.AC3_AUDIO) - { - audiooutL.write(riffw[0].AC3null()); - Common.setMessage(Resource.getString("audio.msg.addriff.ac3")); - } - - else if (CreateDDWave && es_streamtype == CommonParsing.AC3_AUDIO) - audiooutL.write(audio.getRiffHeader()); - - else if (CreateDDWave && es_streamtype == CommonParsing.DTS_AUDIO) - audiooutL.write(audio.getRiffHeader()); - bigloop: - while (true) - { /** * AC-3/DTS Audio */ readloopdd: - while ((es_streamtype == CommonParsing.AC3_AUDIO || es_streamtype == CommonParsing.DTS_AUDIO) && n < audiosize - 10) + while ((es_streamtype == CommonParsing.AC3_AUDIO || es_streamtype == CommonParsing.DTS_AUDIO) && getFramePosition() < FileLength - 10) { - Common.updateProgressBar(n, audiosize); - - //yield(); + Common.updateProgressBar(getFramePosition(), FileLength); if (Debug) - System.out.println(" n" + n); + System.out.println("\n FramePosition " + getFramePosition()); while (pause()) {} - if (CommonParsing.isProcessCancelled()) - { - CommonParsing.setProcessCancelled(false); - job_processing.setSplitSize(0); - + if (isCancelled(job_processing)) break bigloop; + + /** + * updates global audio_error and framecounter variable + */ + CommonParsing.setAudioProcessingFlags((0x3FFFFL & CommonParsing.getAudioProcessingFlags()) | ((long)FrameExportInfo.getWrittenFrames())<<18); + + /** + * fix VBR & restart processing + */ + if ((0xCL & CommonParsing.getAudioProcessingFlags()) != 0) + { + closeInputStream(); + closeOutputStreams(); + return true; } - if (ptspos[x + 1] != -1 && n > ptspos[x + 1]) + if (ptspos[x + 1] != -1 && getFramePosition() > ptspos[x + 1]) { - Common.setMessage(Resource.getString("audio.msg.pts.wo_frame") + " (" + ptspos[x + 1] + "/" + n + ")"); + Common.setMessage(Resource.getString("audio.msg.pts.wo_frame") + " (" + ptspos[x + 1] + "/" + getFramePosition() + ")"); x++; } /** * read 10 bytes for headercheck */ - audioin.read(pushback, 0, 10); - n += 10; + countFramePosition(readInputStream(pushback, 0, 10)); /** * parse header @@ -515,13 +510,13 @@ if (ERRORCODE < 1) { - audioin.unread(pushback, 1, 9); + unreadInputStream(pushback, 1, 9); if (Message_2 && !missing_syncword) - Common.setMessage(Resource.getString("audio.msg.syncword.lost", " " + (n - 10)) + " " + Common.formatTime_1((long)(time_counter / 90.0f))); + Common.setMessage(Resource.getString("audio.msg.syncword.lost", " " + (getFramePosition() - 10)) + " " + formatFrameTime(getTimeCounter())); missing_syncword = true; - n -= 9; + countFramePosition(-9); continue readloopdd; } @@ -530,7 +525,9 @@ is_AC3 = false; //set special type - audio = new AudioFormat(CommonParsing.DTS_AUDIO); + es_streamtype = CommonParsing.DTS_AUDIO; + + audio = new AudioFormat(es_streamtype); audio.parseHeader(pushback, 0); } @@ -540,35 +537,36 @@ is_AC3 = true; } - audiooutL.setWave(CreateDDWave, is_AC3, is_DTS, audio.getBitrate()); + OutputStream_Ch1.setWave(CreateDDWave, is_AC3, is_DTS, audio.getBitrate()); /** * prepare fo read entire frame */ - audioin.unread(pushback); - n -= 10; + countFramePosition(-unreadInputStream(pushback, 0, 10)); /** * read entire frame */ - frame = new byte[audio.getSize()]; - audioin.read(frame, 0, audio.getSize()); + if (frame.length != audio.getSize()) + frame = new byte[audio.getSize()]; + + readInputStream(frame, 0, audio.getSize()); /** * startfileposition of current frame */ - actframe = n; + setCurrentFramePosition(getFramePosition()); /** * expected position for following frame */ - n += audio.getSize(); + countFramePosition(audio.getSize()); if (PitchAudio) { // skip a frame - if (pitch[1] * pitch[0] == frame_counter) + if (pitch[1] * pitch[0] == FrameExportInfo.getWrittenFrames()) { - Common.setMessage(Resource.getString("audio.msg.frame.discard") + " " + frame_counter + " (" + pitch[0] + ")"); + Common.setMessage(Resource.getString("audio.msg.frame.discard") + " " + FrameExportInfo.getWrittenFrames() + " (" + pitch[0] + ")"); pitch[0]++; continue readloopdd; @@ -578,102 +576,91 @@ /** * finish loop if last frame in file is shorter than nominal size */ - if ( n > audiosize ) + if ( getFramePosition() > FileLength ) break readloopdd; /** * read following frame header, not if it is the last frame * check following frameheader for valid , if not starting with next byte */ - if (n < audiosize - 10) + smpte_offs = 0; + + if (getFramePosition() < FileLength - 10) { - int d = 0; + //int d = 0; if (!AllowSpaces) { - audioin.read(push24, 0, 24); + readInputStream(push24, 0, 24); miniloop: - for (; d < (is_DTS ? 15 : 17); d++) + for (; smpte_offs < (is_DTS ? 15 : 17); smpte_offs++) { //smpte - ERRORCODE = audio.parseNextHeader(push24, d); + ERRORCODE = audio.parseNextHeader(push24, smpte_offs); if (ERRORCODE > 0) break miniloop; } - audioin.unread(push24); + unreadInputStream(push24, 0, 24); } if (ERRORCODE < 1) { - audioin.unread(frame, 1, frame.length - 1); - n = actframe + 1; + unreadInputStream(frame, 1, frame.length - 1); + + setFramePosition(getCurrentFramePosition() + 1); continue readloopdd; } else { - layertype = is_DTS ? DTS_AUDIOSTREAM : AC3_AUDIOSTREAM; - audioin.skip(d); - n += d; + AudioType = is_DTS ? DTS_AUDIOSTREAM : AC3_AUDIOSTREAM; + + // read for unread option when CRC fails + readInputStream(push24, 0, smpte_offs); + + countFramePosition(smpte_offs); } } if (ValidateCRC && (ERRORCODE = audio.validateCRC(frame, 2, audio.getSize())) != 0 ) { - Common.setMessage(Resource.getString("audio.msg.crc.error", "" + ERRORCODE) + " " + actframe); + Common.setMessage(Resource.getString("audio.msg.crc.error", "" + ERRORCODE) + " " + getCurrentFramePosition()); + + //dont apply smpte pre-read when an error occurs + if (smpte_offs > 0) + unreadInputStream(push24, 0, smpte_offs); + + unreadInputStream(frame, 2, frame.length - 2); - audioin.unread(frame, 2, frame.length - 2); - n = actframe + 2; + setFramePosition(getCurrentFramePosition() + 2); continue readloopdd; } if (Message_2 && missing_syncword) - Common.setMessage(Resource.getString("audio.msg.syncword.found") + " " + actframe); + Common.setMessage(Resource.getString("audio.msg.syncword.found") + " " + getCurrentFramePosition()); missing_syncword = false; /** * check for change in frametype */ - if (audio.compareHeader() > 0) - newformat = true; - - if (frame_counter == 0) - newformat = true; + determineFormatChange(audio, es_streamtype); audio.saveHeader(); - /** - * replace not 3/2 with silence ac3 3/2 061i++ - */ - if (!is_DTS && ReplaceAc3withSilence && audio.getMode() != 7 ) - { - for (int c = 0; c < Common.getAC3list().size(); c++) - { - byte[] ac3data = (byte[]) Common.getAC3list().get(c); - - if ( ((0xE0 & ac3data[6])>>>5) != 7 ) - continue; - - frame = new byte[ac3data.length]; - - System.arraycopy(ac3data, 0, frame, 0, frame.length); - - break; - } - } + frame = getReplacementFrame(audio, frame, es_streamtype); - // timeline ist hier aktuelle audiopts + // TimePosition ist hier aktuelle audiopts - Common.setFps(frame_counter); + Common.setFps(FrameExportInfo.getWrittenFrames()); /** * preloop if audio starts later than video, and i must insert */ - if ( (preloop && v>=vptsval.length) || !( preloop && vptsdata && vptsval[v] < timeline - (audio.getFrameTimeLength() / 2.0) ) ) + if ( (preloop && video_timeIndex[0] >= vptsval.length) || !( preloop && ContainsVideoPTS && vptsval[video_timeIndex[0]] < getTimePosition() - (audio.getFrameTimeLength() / 2.0) ) ) preloop=false; else @@ -681,12 +668,13 @@ /** * patch ac-3 to 3/2 */ - if (!is_DTS && Patch1stAc3Header && frame_counter == 0) - frame = audio.editFrame(frame, audio.getSize(), 1); - // frame[6] = (byte)((0xF & frame[6]) | 0xE0); + if (!is_DTS && AC3_Patch1stHeader && FrameExportInfo.getWrittenFrames() == 0) + frame = audio.editFrame(frame, 1); + + long precount = vptsval[video_timeIndex[0]]; - long precount = vptsval[v]; - long[] ins = { (long)time_counter, 0 }; + insertion_counter[0] = (long) getTimeCounter(); + insertion_counter[1] = 0; silentFrameBuffer.reset(); @@ -701,12 +689,14 @@ if ( (0xFE & ac3data[4]) != (0xFE & frame[4]) || ( (7 & ac3data[5]) != (7 & frame[5]) ) || (0xE0&ac3data[6])!=(0xE0&frame[6]) ) continue; - +// + ac3data = audio.editFrame(ac3data, 4); silentFrameBuffer.write(ac3data); break; } } + else silentFrameBuffer.write(frame); @@ -714,223 +704,173 @@ /** * pre inserting */ - while (precount < timeline - (audio.getFrameTimeLength() / 2.0)) + while (precount < getTimePosition() - (audio.getFrameTimeLength() / 2.0)) { /** * check if frame write should paused */ - if (vptsdata && w < vptsval.length) + if (ContainsVideoPTS && video_timeIndex[1] < vptsval.length) { - double ms1 = (double) (precount - vptsval[w + 1]); - double ms2 = (double) (time_counter - vtime[w + 1]); + sync_value_1 = (double) (precount - vptsval[video_timeIndex[1] + 1]); + sync_value_2 = (double) (getTimeCounter() - vtime[video_timeIndex[1] + 1]); - if ((double) Math.abs(ms2) <= audio.getFrameTimeLength() / 2.0 ) + if ((double) Math.abs(sync_value_2) <= audio.getFrameTimeLength() / 2.0 ) { - awrite = false; - w += 2; + WriteEnabled = false; + video_timeIndex[1] += 2; } - else if ((double) Math.abs(ms1) <= audio.getFrameTimeLength() / 2.0 ) + + else if ((double) Math.abs(sync_value_1) <= audio.getFrameTimeLength() / 2.0 ) { - awrite = false; - w += 2; + WriteEnabled = false; + video_timeIndex[1] += 2; } } /** * calculate A/V Offset for true */ - if (vptsdata && (v < vptsval.length)) + if (ContainsVideoPTS && (video_timeIndex[0] < vptsval.length)) { - double ms3 = precount - vptsval[v], ms4 = time_counter - vtime[v]; + sync_value_3 = precount - vptsval[video_timeIndex[0]]; + sync_value_4 = getTimeCounter() - vtime[video_timeIndex[0]]; if (Debug) - System.out.println(" " + ms3 + "/" + ms4 + "/" + (ms4 - ms3)); + System.out.println(" " + sync_value_3 + "/" + sync_value_4 + "/" + (sync_value_4 - sync_value_3)); - if (!awrite && (double) Math.abs((time_counter - vtime[v]) - (precount - vptsval[v])) <= (double) audio.getFrameTimeLength() / 2.0 ) + if (!WriteEnabled && (double) Math.abs((getTimeCounter() - vtime[video_timeIndex[0]]) - (precount - vptsval[video_timeIndex[0]])) <= (double) audio.getFrameTimeLength() / 2.0 ) { - awrite = true; - v += 2; - double ms1 = precount - vptsval[v - 2]; - double ms2 = time_counter - vtime[v - 2]; + WriteEnabled = true; + video_timeIndex[0] += 2; + + sync_value_1 = precount - vptsval[video_timeIndex[0] - 2]; + sync_value_2 = getTimeCounter() - vtime[video_timeIndex[0] - 2]; - Common.getGuiInterface().showAVOffset("" + (int)(ms1 / 90) + "/" + (int)(ms2 / 90) + "/" + (int)((ms2 - ms1) / 90)); + Common.getGuiInterface().showAVOffset("" + (int)(sync_value_1 / 90) + "/" + (int)(sync_value_2 / 90) + "/" + (int)((sync_value_2 - sync_value_1) / 90)); if (Debug) - System.out.println(" " + ms1 + "/" + ms2 + "/" + (ms2 - ms1)); + System.out.println(" " + sync_value_1 + "/" + sync_value_2 + "/" + (sync_value_2 - sync_value_1)); } } /** * calculate A/V Offset for true */ - if ((v < vptsval.length) ) + if ((video_timeIndex[0] < vptsval.length) ) { - if ((double) Math.abs(vptsval[v] - precount) <= ((double) audio.getFrameTimeLength() / 2.0) ) + if ((double) Math.abs(vptsval[video_timeIndex[0]] - precount) <= ((double) audio.getFrameTimeLength() / 2.0) ) { - awrite = true; - v += 2; - double ms1 = precount - vptsval[v - 2]; - double ms2 = time_counter - vtime[v - 2]; + WriteEnabled = true; + video_timeIndex[0] += 2; - Common.getGuiInterface().showAVOffset("" + (int)(ms1 / 90) + "/" + (int)(ms2 / 90) + "/" + (int)((ms2 - ms1) / 90)); + sync_value_1 = precount - vptsval[video_timeIndex[0] - 2]; + sync_value_2 = getTimeCounter() - vtime[video_timeIndex[0] - 2]; + + Common.getGuiInterface().showAVOffset("" + (int)(sync_value_1 / 90) + "/" + (int)(sync_value_2 / 90) + "/" + (int)((sync_value_2 - sync_value_1) / 90)); if (Debug) - System.out.println(" " + ms1 + "/" + ms2 + "/" + (ms2 - ms1)); + System.out.println(" " + sync_value_1 + "/" + sync_value_2 + "/" + (sync_value_2 - sync_value_1)); } /** * calculate A/V Offset for false */ - if (awrite && (double) Math.abs((time_counter - vtime[v - 2]) - (precount - vptsval[v-2])) > (double) audio.getFrameTimeLength() / 2.0 ) + if (WriteEnabled && (double) Math.abs((getTimeCounter() - vtime[video_timeIndex[0] - 2]) - (precount - vptsval[video_timeIndex[0]-2])) > (double) audio.getFrameTimeLength() / 2.0 ) { - awrite = false; - v -= 2; + WriteEnabled = false; + video_timeIndex[0] -= 2; } } /** * write message */ - if (awrite || !vptsdata) - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.pre-insert")); - - else - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.pause")); + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.pre-insert") : Resource.getString("audio.status.pause")); /** * stop if no more audio needed */ - if (precount > vptsval[vptsval.length - 1] + 10000) - { - Common.updateProgressBar(audiosize, audiosize); - + if (!checkLastAudioBound(ContainsVideoPTS, precount, vptsval, FileLength)) break readloopdd; - } - if (awrite) - { - silentFrameBuffer.writeTo(audiooutL); - /** - * RIFF - */ - if (!is_DTS && AddRiffToAc3) - riffw[0].AC3RiffData(audio.parseRiffData(frame)); + if (WriteEnabled) + { + writeFrame(audio, silentFrameBuffer.toByteArray(), newframes, ContainsVideoPTS, es_streamtype); - frame_counter++; - cb++; - ins[1]++; - time_counter += audio.getFrameTimeLength(); + FrameExportInfo.countPreInsertedFrames(1); + insertion_counter[1]++; } precount += audio.getFrameTimeLength(); if (Debug) - System.out.println("(6)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0) ) + " "); + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter()) + " "); } // end while - n = actframe; + setFramePosition(getCurrentFramePosition()); - audioin.unread(frame); + unreadInputStream(frame, 0, frame.length); - if (ins[1] > 0) - Common.setMessage(Resource.getString("audio.msg.summary.pre-insert", "" + ins[1], FramesToTime((int)ins[1], audio.getFrameTimeLength())) + " " + Common.formatTime_1(ins[0] / 90L)); + if (insertion_counter[1] > 0) + Common.setMessage(Resource.getString("audio.msg.summary.pre-insert", "" + insertion_counter[1], FramesToTime((int)insertion_counter[1], audio.getFrameTimeLength())) + " " + formatFrameTime(insertion_counter[0])); continue readloopdd; } // end if preloop - /****** check if frame write should paused *****/ - if (vptsdata) - { - vw[0] = v; - vw[1] = w; - - awrite = SyncCheck(vw, time_counter, audio.getFrameTimeLength(), timeline, frame_counter, vptsval, vtime, awrite, Debug); - - v = vw[0]; - w = vw[1]; - } - //System.out.println(""+awrite+"/"+v+"/"+w); - + /** + * check if frame write should pause + */ + if (ContainsVideoPTS) + WriteEnabled = SyncCheck(video_timeIndex, getTimeCounter(), audio.getFrameTimeLength(), getTimePosition(), FrameExportInfo.getWrittenFrames(), vptsval, vtime, WriteEnabled, Debug, "ac3-1"); /** * message */ - if (awrite || !vptsdata) - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.write")); + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.write") : Resource.getString("audio.status.pause")); - else - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.pause")); if (Debug) - System.out.println(" k)" + timeline + " l)" + (audio.getFrameTimeLength() / 2.0) + " u)" + audio.getSize() + " m)" + awrite + " n)"+w+" o)"+v+" p)"+n); + System.out.println(" k)" + getTimePosition() + " l)" + (audio.getFrameTimeLength() / 2.0) + " u)" + audio.getSize() + " m)" + WriteEnabled + " FramePosition)"+video_timeIndex[1]+" o)"+video_timeIndex[0]+" p)"+ getFramePosition()); /** * stop if no more audio needed */ - if (vptsdata && timeline > vptsval[vptsval.length - 1] + 10000) - { - Common.updateProgressBar(audiosize, audiosize); - + if (!checkLastAudioBound(ContainsVideoPTS, getTimePosition(), vptsval, FileLength)) break readloopdd; - } /** - * message + * message */ - if ((newformat && awrite) || (newformat && !vptsdata)) - { - String hdr = audio.displayHeader(); - - if (ModeChangeCount < 100) - { - String str = Common.formatTime_1((long)(time_counter / 90.0f)); - - Common.setMessage(Resource.getString("audio.msg.source", hdr) + " " + str); - - if (collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createChapters)) - job_processing.getChapters().addChapter(str, hdr); - } - - else if (ModeChangeCount == 100) - Common.setMessage(Resource.getString("audio.msg.source.max")); + messageSourceFormat(job_processing, audio, ContainsVideoPTS, getTimeCounter()); - else if (Debug) - System.out.println("=> src_audio: " + hdr + " @ " + Common.formatTime_1((long)(time_counter / 90.0f))); - - ModeChangeCount++; - newformat = false; - - //yield(); - } + /** + * remove CRC, unused + */ + audio.removeCRC(frame, ClearCRC); /** * patch ac-3 to 3/2 */ - if (!is_DTS && Patch1stAc3Header && frame_counter == 0) - frame = audio.editFrame(frame, audio.getSize(), 1); - // frame[6] = (byte)((0xF & frame[6]) | 0xE0); - - if (Debug) - System.out.println("(7)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0f) )); + if (!is_DTS && AC3_Patch1stHeader && FrameExportInfo.getWrittenFrames() == 0) + frame = audio.editFrame(frame, 1); - if (Debug) + if (Debug) + { + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); System.out.println(" x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); + } - /** - * pts for next frame!! - */ - timeline += audio.getFrameTimeLength(); + // end pts of this, start pts for next frame!! + countTimePosition(audio.getFrameTimeLength()); silentFrameBuffer.reset(); silentFrameBuffer.write(frame); - /** - * simple sync - */ - if (LimitPts && ptspos[x + 1] != -1 && ptspos[x + 1] < n) + //simple sync + if (LimitPts && ptspos[x + 1] != -1 && ptspos[x + 1] < getFramePosition()) { if (Debug) System.out.println(" minSync " + minSync + "/ " + x); @@ -941,84 +881,81 @@ minSync = 0; } - if ( (ptspos[x + 1] == -1) || (ptspos[x + 1] > n ) ) + // frame is in last pes packet or packet end not yet reached + // normal condition + if (writeSuccessiveFrame(audio, frame, newframes, ContainsVideoPTS, getFramePosition(), ptspos, x, es_streamtype)) + continue readloopdd; + + + minSync = 0; + + // frame is on pes packet corner + // less than a half of frame time to packet end, so write it and count to next index + if ((double) Math.abs(ptsval[x + 1] - getTimePosition()) < (audio.getFrameTimeLength() / 2.0)) { - if (!vptsdata || (vptsdata && awrite)) - { - audiooutL.write(frame); + setTimePosition(ptsval[++x]); - /** - * RIFF - */ - if (!is_DTS && AddRiffToAc3) - riffw[0].AC3RiffData(audio.parseRiffData(frame)); + writeFrame(audio, frame, newframes, ContainsVideoPTS, es_streamtype); - frame_counter++; - time_counter += audio.getFrameTimeLength(); - } + insertion_counter[0] = (long) getTimeCounter(); + insertion_counter[1] = 0; - continue readloopdd; - } + // check sync after resetting + if (Math.abs(video_timeIndex[2]) >= (audio.getFrameTimeLength() / 2.0) || Math.abs(video_timeIndex[3]) >= (audio.getFrameTimeLength() / 2.0)) + { + // 1 zus舩zl. frame einfgen + if (video_timeIndex[2] < 0 || video_timeIndex[3] < 0) + { + // gui message + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.insert") : Resource.getString("audio.status.pause")); - minSync = 0; + if (!ContainsVideoPTS || (ContainsVideoPTS && WriteEnabled)) + { + Common.setMessage("!> A/V sync discontinuity in next audio packet @ " + formatFrameTime(getTimeCounter())); - if ( (double) Math.abs(ptsval[x + 1] - timeline) < (double) audio.getFrameTimeLength() / 2.0 ) - { - timeline = ptsval[x + 1]; - x++; + writeFrame(audio, frame, newframes, ContainsVideoPTS, es_streamtype); - if (!vptsdata || (vptsdata && awrite)) { - audiooutL.write(frame); + FrameExportInfo.countInsertedFrames(1); + insertion_counter[1]++; - /** - * RIFF - */ - if (!is_DTS && AddRiffToAc3) - riffw[0].AC3RiffData(audio.parseRiffData(frame)); + Common.setMessage(Resource.getString("audio.msg.summary.insert", "" + insertion_counter[1], FramesToTime((int)insertion_counter[1], audio.getFrameTimeLength())) + " " + formatFrameTime(insertion_counter[0])); + } - frame_counter++; - time_counter += audio.getFrameTimeLength(); +/** else // a-v async in schnittpause + { + countTimeCounter(-audio.getFrameTimeLength()); + Common.setMessage("!> A/V sync discontinuity in next audio packet @ " + formatFrameTime(getTimeCounter())); + Common.setMessage(Resource.getString("audio.msg.summary.skip") + " " + formatFrameTime(getTimeCounter())); + } +**/ + if (Debug) + { + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); + System.out.println("tl: " + getTimePosition() + " x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); + } + } } continue readloopdd; } - if (ptsval[x + 1] > timeline) + if (ptsval[x + 1] > getTimePosition()) insertSilenceLoop = true; - if (ptsval[x + 1] < timeline) + if (ptsval[x + 1] < getTimePosition()) { - x++; - timeline = ptsval[x]; + setTimePosition(ptsval[++x]); - Common.setMessage(Resource.getString("audio.msg.summary.skip") + " " + Common.formatTime_1((long)time_counter / 90L)); + Common.setMessage(Resource.getString("audio.msg.summary.skip") + " " + formatFrameTime(getTimeCounter())); - ce++; + FrameExportInfo.countSkippedFrames(1); } if (insertSilenceLoop) { - /** - * test , write the actual frame and then loop to fill - */ - if (!vptsdata || (vptsdata && awrite)) - { - audiooutL.write(frame); - - /** - * RIFF - */ - if (!is_DTS && AddRiffToAc3) - riffw[0].AC3RiffData(audio.parseRiffData(frame)); - - frame_counter++; - time_counter += audio.getFrameTimeLength(); + writeFrame(audio, frame, newframes, ContainsVideoPTS, es_streamtype); - if (Debug) - System.out.println("(10)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0) ) + " "); - } - - timeline += audio.getFrameTimeLength(); + countTimePosition(audio.getFrameTimeLength()); /** * insert silence ac3 @@ -1033,136 +970,117 @@ continue; silentFrameBuffer.reset(); +// + ac3data = audio.editFrame(ac3data, 4); silentFrameBuffer.write(ac3data); - break; } } - long[] ins = { (long)time_counter, 0 }; + insertion_counter[0] = (long) getTimeCounter(); + insertion_counter[1] = 0; +// + // check a+v sync + if (ContainsVideoPTS) + WriteEnabled = SyncCheck(video_timeIndex, getTimeCounter(), audio.getFrameTimeLength(), getTimePosition(), FrameExportInfo.getWrittenFrames(), vptsval, vtime, WriteEnabled, Debug, "ac3-2sil"); +// - while (ptsval[x + 1] > (timeline - (audio.getFrameTimeLength() / 2.0)) ) + while (ptsval[x + 1] > (getTimePosition() - (audio.getFrameTimeLength() / 2.0)) ) { - if (vptsdata && w < vptsval.length) - { - double ms1 = (double) (timeline - audio.getFrameTimeLength() - vptsval[w + 1]); - double ms2 = (double) (time_counter - vtime[w + 1]); + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.insert") : Resource.getString("audio.status.pause")); - if ((double) Math.abs(ms2) <= audio.getFrameTimeLength() / 2.0 ) - { - awrite = false; - w += 2; - } + if (!ContainsVideoPTS || (ContainsVideoPTS && WriteEnabled)) + { + writeFrame(audio, silentFrameBuffer.toByteArray(), newframes, ContainsVideoPTS, es_streamtype); - else if ((double) Math.abs(ms1) <= audio.getFrameTimeLength() / 2.0 ) - { - awrite = false; - w += 2; - } + FrameExportInfo.countInsertedFrames(1); + insertion_counter[1]++; } - if (vptsdata && v < vptsval.length) + if (Debug) { - if (!awrite && (double) Math.abs((time_counter - vtime[v]) - - (timeline - audio.getFrameTimeLength() - vptsval[v]) ) <= (double) audio.getFrameTimeLength() / 2.0 ) - { - double ms1 = (double) (timeline - audio.getFrameTimeLength() - vptsval[v]); - double ms2 = (double) (time_counter - vtime[v]); + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter()) + " "); + System.out.println(" t)" + getTimePosition()); + System.out.println(" x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); + } - Common.getGuiInterface().showAVOffset("" + (int)(ms1 / 90) + "/" + (int)(ms2 / 90) + "/" + (int)((ms2 - ms1) / 90)); + // check a+v sync + if (ContainsVideoPTS) + WriteEnabled = SyncCheck(video_timeIndex, getTimeCounter(), audio.getFrameTimeLength(), getTimePosition(), FrameExportInfo.getWrittenFrames(), vptsval, vtime, WriteEnabled, Debug, "ac3-3sil"); - if (Debug) - System.out.println(" ァ" + ms1 + "/" + ms2 + "/" + (ms2 - ms1)); + countTimePosition(audio.getFrameTimeLength()); - awrite = true; - v += 2; - } - } + } // end while insert + + insertSilenceLoop = false; + + if (insertion_counter[1] > 0) + Common.setMessage(Resource.getString("audio.msg.summary.insert", "" + insertion_counter[1], FramesToTime((int)insertion_counter[1], audio.getFrameTimeLength())) + " " + formatFrameTime(insertion_counter[0])); - if (vptsdata && v < vptsval.length) + // reset PTS after inserting + setTimePosition(ptsval[++x]); +// + // check a+v sync + if (ContainsVideoPTS) + WriteEnabled = SyncCheck(video_timeIndex, getTimeCounter(), audio.getFrameTimeLength(), getTimePosition(), FrameExportInfo.getWrittenFrames(), vptsval, vtime, WriteEnabled, Debug, "ac3-4sil"); +// + insertion_counter[0] = (long) getTimeCounter(); + insertion_counter[1] = 0; + + // check sync after resetting + if (Math.abs(video_timeIndex[2]) >= audio.getFrameTimeLength() || Math.abs(video_timeIndex[3]) >= audio.getFrameTimeLength()) + { + // 1 zus舩zl. frame einfgen + if (video_timeIndex[2] < 0 || video_timeIndex[3] < 0) { - if ((double) Math.abs(vptsval[v] - (timeline - audio.getFrameTimeLength())) <= ((double) audio.getFrameTimeLength() / 2.0) ) + // gui message + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.insert") : Resource.getString("audio.status.pause")); + + if (!ContainsVideoPTS || (ContainsVideoPTS && WriteEnabled)) { - double ms1 = (double) (timeline - audio.getFrameTimeLength() - vptsval[v]); - double ms2 = (double) (time_counter - vtime[v]); + Common.setMessage("!> A/V sync discontinuity in next audio packet (insert) @ " + formatFrameTime(getTimeCounter())); - Common.getGuiInterface().showAVOffset("" + (int)(ms1 / 90) + "/" + (int)(ms2 / 90) + "/" + (int)((ms2 - ms1) / 90)); + writeFrame(audio, silentFrameBuffer.toByteArray(), newframes, ContainsVideoPTS, es_streamtype); - if (Debug) - System.out.println(" ゚" + ms1 + "/" + ms2 + "/" + (ms2 - ms1)); + FrameExportInfo.countInsertedFrames(1); + insertion_counter[1]++; + } - awrite = true; - v += 2; +/** else // a-v async in schnittpause + { + countTimeCounter(-audio.getFrameTimeLength()); + Common.setMessage("!> A/V sync discontinuity in next audio packet (insert) @ " + formatFrameTime(getTimeCounter())); + Common.setMessage(Resource.getString("audio.msg.summary.skip") + " " + formatFrameTime(getTimeCounter())); } +**/ - if (awrite && (double) Math.abs((time_counter - vtime[v - 2]) - - (timeline - audio.getFrameTimeLength() - vptsval[v - 2]) ) > (double) audio.getFrameTimeLength() / 2.0 ) + if (Debug) { - awrite = false; - v -= 2; + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); + System.out.println("tl: " + getTimePosition() + " x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); } } + } - if (awrite || !vptsdata) - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.insert")); - - else - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.pause")); - - if (!vptsdata || (vptsdata && awrite)) - { - silentFrameBuffer.writeTo(audiooutL); + if (insertion_counter[1] > 0) + Common.setMessage(Resource.getString("audio.msg.summary.insert", "" + insertion_counter[1], FramesToTime((int)insertion_counter[1], audio.getFrameTimeLength())) + " " + formatFrameTime(insertion_counter[0])); - /** - * RIFF - */ - if (!is_DTS && AddRiffToAc3) - riffw[0].AC3RiffData(audio.parseRiffData(silentFrameBuffer.toByteArray())); + continue readloopdd; + } // end if insertSilenceLoop - frame_counter++; - time_counter += audio.getFrameTimeLength(); - cc++; - ins[1]++; - } + if ( (getCurrentFramePosition() + audio.getSize()) >= FileLength ) + break readloopdd; - if (Debug) - { - System.out.println("(8)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0f) ) + " "); - System.out.println(" t)" + timeline); - System.out.println(" x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); - } + } // end while - timeline += audio.getFrameTimeLength(); - } // end while - - timeline -= audio.getFrameTimeLength(); - insertSilenceLoop = false; - x++; - - if (ins[1] > 0) - Common.setMessage(Resource.getString("audio.msg.summary.insert", "" + ins[1], FramesToTime((int)ins[1], audio.getFrameTimeLength())) + " " + Common.formatTime_1(ins[0] / 90L)); - - /** - * reset PTS after inserting - */ - timeline = ptsval[x]; - - continue readloopdd; - } // end if insertSilenceLoop - - if ( (actframe + audio.getSize()) >= audiosize ) - break readloopdd; - - } // end while - - /** - * add frames at the end - */ - if ((es_streamtype == CommonParsing.AC3_AUDIO || es_streamtype == CommonParsing.DTS_AUDIO) && AddFrames && vptsdata && awrite && (w < vptsval.length)) - { - timeline += audio.getFrameTimeLength(); - addf[0] = (long) time_counter; + /** + * add frames at the end + */ + if ((es_streamtype == CommonParsing.AC3_AUDIO || es_streamtype == CommonParsing.DTS_AUDIO) && AddFrames && ContainsVideoPTS && WriteEnabled && (video_timeIndex[1] < vptsval.length)) + { + countTimePosition(audio.getFrameTimeLength()); + addf[0] = (long) getTimeCounter(); /** * insert silence ac3 @@ -1177,612 +1095,394 @@ continue; silentFrameBuffer.reset(); +// + ac3data = audio.editFrame(ac3data, 4); silentFrameBuffer.write(ac3data); break; } } - while ( w < vptsval.length ) + while ( video_timeIndex[1] < vptsval.length ) { - while (vtime[w + 1] > time_counter && (double) Math.abs(vtime[w + 1] - time_counter) > (double) audio.getFrameTimeLength() / 2.0) + while (vtime[video_timeIndex[1] + 1] > getTimeCounter() && (double) Math.abs(vtime[video_timeIndex[1] + 1] - getTimeCounter()) > (double) audio.getFrameTimeLength() / 2.0) { - silentFrameBuffer.writeTo(audiooutL); - - /** - * RIFF - */ - if (!is_DTS && AddRiffToAc3) - riffw[0].AC3RiffData(audio.parseRiffData(silentFrameBuffer.toByteArray())); - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.add")); - frame_counter++; - time_counter += audio.getFrameTimeLength(); - timeline += audio.getFrameTimeLength(); - cd++; + writeFrame(audio, silentFrameBuffer.toByteArray(), newframes, ContainsVideoPTS, es_streamtype); + + FrameExportInfo.countAddedFrames(1); + countTimePosition(audio.getFrameTimeLength()); addf[1]++; if (Debug) { - System.out.println("(9)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0f) )); - System.out.print(" t)" + (long)(timeline - audio.getFrameTimeLength()) + " w)" + w); + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); + System.out.print(" t)" + (long)(getTimePosition() - audio.getFrameTimeLength()) + " w)" + video_timeIndex[1]); } } - w += 2; + video_timeIndex[1] += 2; } - w -= 2; - timeline -= audio.getFrameTimeLength(); + video_timeIndex[1] -= 2; + countTimePosition(-audio.getFrameTimeLength()); if (Debug) - System.out.println(" eot_video:" + (vptsval[w + 1] / 90) + "ms, eot_audio:" + (timeline / 90) + "ms "); + System.out.println(" eot_video:" + (vptsval[video_timeIndex[1] + 1] / 90) + "ms, eot_audio:" + (getTimePosition() / 90) + "ms "); } // mpa start - /** - * init FFT/window for mpa decoding for 1 file - */ - if (es_streamtype == CommonParsing.MPEG_AUDIO && DecodeMpgAudio) - { - MpaDecoder.init_work(ResampleAudioMode); - MpaDecoder.DOWNMIX = DownMix; - MpaDecoder.MONO = (DownMix || MpaConversionMode == 4); - MpaDecoder.MOTOROLA = ChangeByteorder; - MpaDecoder.WAVE = AddRiffHeader; - - if (AddRiffHeader) - { - audiooutL.write(MpaDecoder.RIFF); - - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.RIFF); - } - - else if (AddAiffHeader) - { - audiooutL.write(MpaDecoder.AIFF); - - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.AIFF); - } - } - - if (es_streamtype == CommonParsing.MPEG_AUDIO) // audio is global - audio.setAncillaryDataDecoder(collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg7), collection.DebugMode()); /** * MPEG1+2 Audio Layer 1,2,3 */ readloop: - while (es_streamtype == CommonParsing.MPEG_AUDIO && n < audiosize - 4) + while (es_streamtype == CommonParsing.MPEG_AUDIO && getFramePosition() < FileLength - 4) // = 4 mpa header bytes { - Common.updateProgressBar(n, audiosize); - - //yield(); + Common.updateProgressBar(getFramePosition(), FileLength); if (Debug) - System.out.println(" n" + n); + System.out.println("\n FramePosition " + getFramePosition()); while (pause()) {} - if (CommonParsing.isProcessCancelled()) - { - CommonParsing.setProcessCancelled(false); - job_processing.setSplitSize(0); - + if (isCancelled(job_processing)) break bigloop; - } /** * updates global audio_error and framecounter variable */ - CommonParsing.setAudioProcessingFlags((0x3FFFFL & CommonParsing.getAudioProcessingFlags()) | ((long)frame_counter)<<18); + CommonParsing.setAudioProcessingFlags((0x3FFFFL & CommonParsing.getAudioProcessingFlags()) | ((long)FrameExportInfo.getWrittenFrames())<<18); /** * fix VBR & restart processing */ if (MpaDecoder.RESET) + { + closeInputStream(); + closeOutputStreams(); return true; + } /** * fix VBR & restart processing */ if (!MpaDecoder.PRESCAN && (0xCL & CommonParsing.getAudioProcessingFlags()) != 0) + { + closeInputStream(); + closeOutputStreams(); return true; + } - if (ptspos[x + 1] != -1 && n > ptspos[x + 1]) + if (ptspos[x + 1] != -1 && getFramePosition() > ptspos[x + 1]) { - Common.setMessage(Resource.getString("audio.msg.pts.wo_frame") + " (" + ptspos[x + 1] + "/" + n + ")"); + Common.setMessage(Resource.getString("audio.msg.pts.wo_frame") + " (" + ptspos[x + 1] + "/" + getFramePosition() + ")"); x++; } /** - * read 4 bytes for headercheck + * read x bytes for headercheck */ - audioin.read(pushmpa, 0, 4); - n += 4; + countFramePosition(readInputStream(pushmpa, 0, pushmpa.length)); /** * parse header */ if ((ERRORCODE = audio.parseHeader(pushmpa, 0)) < 1) { - audioin.unread(pushmpa, 1, 3); + // test for AAC + //ERRORCODE = test_audio.parseHeader(pushmpa, 0); + //Common.setMessage("ec " + ERRORCODE + " /pos " + getFramePosition()); + + unreadInputStream(pushmpa, 1, pushmpa.length - 1); if (Message_2 && !missing_syncword) - Common.setMessage(Resource.getString("audio.msg.syncword.lost", " " + (n - 4)) + " " + Common.formatTime_1((long)(time_counter / 90.0f))); + Common.setMessage(Resource.getString("audio.msg.syncword.lost", " " + (getFramePosition() - 4)) + " " + formatFrameTime(getTimeCounter())); missing_syncword = true; - n -= 3; + countFramePosition(-(pushmpa.length - 1)); continue readloop; } - /** - * prepare fo read entire frame - */ - audioin.unread(pushmpa); - n -= 4; + // prepare to read entire frame, reset to start of frame + countFramePosition(-unreadInputStream(pushmpa, 0, pushmpa.length)); - /** - * read entire frame - */ - frame = new byte[audio.getSize()]; + // read entire frame + if (frame.length != audio.getSize()) + frame = new byte[audio.getSize()]; - audioin.read(frame, 0, frame.length); + readInputStream(frame, 0, audio.getSize()); - System.arraycopy(frame, 0, header_copy, 0, 4); - header_copy[3] &= 0xCF; - header_copy[2] &= ~2; + copyMpaFrameHeader(frame, header_copy); - /** - * startfileposition of current frame - */ - actframe = n; + // startfileposition of current frame + setCurrentFramePosition(getFramePosition()); - /** - * expected position for following frame - */ - n += audio.getSize(); + // expected position for following frame + countFramePosition(audio.getSize()); - /** - * pitch - */ + // pitch if (PitchAudio) { // skip a frame - if (pitch[1] * pitch[0] == frame_counter) + if (pitch[1] * pitch[0] == FrameExportInfo.getWrittenFrames()) { - Common.setMessage(Resource.getString("audio.msg.frame.discard") + " " + frame_counter + " (" + pitch[0] + ")"); + Common.setMessage(Resource.getString("audio.msg.frame.discard") + " " + FrameExportInfo.getWrittenFrames() + " (" + pitch[0] + ")"); pitch[0]++; continue readloop; } } - /** - * save current frame for copying, delete crc if nec. - */ + // save current frame for copying, delete crc if nec. if (FillGapsWithLastFrame) { - copyframe[0] = new byte[frame.length]; + if (copyframe[0].length != frame.length) + copyframe[0] = new byte[frame.length]; + System.arraycopy(frame, 0, copyframe[0], 0, frame.length); - if (ClearCRC) - audio.removeCRC(copyframe[0]); + audio.removeCRC(copyframe[0], ClearCRC); } - /** - * finish loop if last frame in file is shorter than nominal size - */ - if (n > audiosize) + // finish loop if last frame in file is shorter than nominal size + if (getFramePosition() > FileLength) break readloop; - /** - * read following frame header, not if it is the last frame - * check following frameheader for valid mpegaudio, if not starting with next byte - */ - if (n < audiosize - 4) + // read following frame header, not if it is the last frame + // check following frameheader for valid mpegaudio, if not starting with next byte + if (getFramePosition() < FileLength - 4) { if (!AllowSpaces) { - audioin.read(pushmpa, 0, 4); + readInputStream(pushmpa, 0, pushmpa.length); ERRORCODE = audio.parseNextHeader(pushmpa, 0); - audioin.unread(pushmpa); + unreadInputStream(pushmpa, 0, pushmpa.length); if (ERRORCODE < 1) { - audioin.unread(frame, 1, frame.length - 1); - n = actframe + 1; + unreadInputStream(frame, 1, frame.length - 1); + + setFramePosition(getCurrentFramePosition() + 1); continue readloop; } } - layertype = audio.getLayer(); + AudioType = audio.getLayer(); } + // check CRC if (ValidateCRC && (ERRORCODE = audio.validateCRC(frame, 0, audio.getSize())) != 0 ) { - Common.setMessage(Resource.getString("audio.msg.crc.error", "") + " " + actframe); + Common.setMessage(Resource.getString("audio.msg.crc.error", "") + " " + getCurrentFramePosition()); - audioin.unread(frame, 2, frame.length - 2); + unreadInputStream(frame, 2, frame.length - 2); - n = actframe + 2; + setFramePosition(getCurrentFramePosition() + 2); continue readloop; } - if (Message_2 && missing_syncword) - Common.setMessage(Resource.getString("audio.msg.syncword.found") + " " + actframe); - - missing_syncword = false; + // check for change in frametype, if not allowed, handle as unknown + if (!determineFormatChange(audio, es_streamtype)) + { + if (!missing_syncword) + Common.setMessage("!> change in frame type not accepted @ " + getCurrentFramePosition()); + unreadInputStream(frame, 2, frame.length - 2); - /** - * check for change in frametype - */ - if ((returncode = audio.compareHeader()) > 0) - { - newformat = true; + setFramePosition(getCurrentFramePosition() + 2); - if (returncode == 6) - { - jss++; - newformat = false; - } + continue readloop; } - if (frame_counter == 0) - newformat = true; + // all right till now + if (Message_2 && missing_syncword) + Common.setMessage(Resource.getString("audio.msg.syncword.found") + " " + getCurrentFramePosition()); + + missing_syncword = false; + // frame accepted audio.saveHeader(); - audio.decodeAncillaryData(frame); + // read & decode ancillary data like RDS + if ((tmp_str = audio.decodeAncillaryData(frame, getTimeCounter())) != null) + Common.setMessage(tmp_str); - // timeline ist hier aktuelle audiopts + // TimePosition ist hier aktuelle audiopts frame start - Common.setFps(frame_counter); + Common.setFps(FrameExportInfo.getWrittenFrames()); - /** - * message - */ + // message if (Debug) - System.out.println(" k)" +timeline +" l)" + (audio.getFrameTimeLength() / 2.0) + " m)" + awrite + " n)" + w + " o)" + v + " p)" + n); + System.out.println(" k)" + getTimePosition() +" l)" + (audio.getFrameTimeLength() / 2.0) + " m)" + WriteEnabled + " FramePosition)" + video_timeIndex[1] + " o)" + video_timeIndex[0] + " p)" + getFramePosition()); - /** - * preloop if audio starts later than video, and i must insert - */ - if ( (preloop && vptsdata && v >= vptsval.length) || !( preloop && vptsdata && vptsval[v] < timeline - (audio.getFrameTimeLength() / 2.0) ) ) + // preloop if audio starts later than video, and i must insert + if ( (preloop && ContainsVideoPTS && video_timeIndex[0] >= vptsval.length) || !( preloop && ContainsVideoPTS && vptsval[video_timeIndex[0]] < getTimePosition() - (audio.getFrameTimeLength() / 2.0) ) ) preloop = false; else { - silent_Frame[0] = new byte[audio.getSizeBase()]; //silence without padd, std - silent_Frame[1] = new byte[audio.getSize()]; //silence with padd for 22.05, 44.1 + if (silent_Frame.length != audio.getSizeBase()) + silent_Frame = new byte[audio.getSizeBase()]; //silence without padd, std - for (int a = 0; a < 2; a++) - { - System.arraycopy(header_copy, 0, silent_Frame[a], 0, 4); //copy last header data - silent_Frame[a][1] |= 1; //mark noCRC - silent_Frame[a][2] |= (a * 2); //set padding bit - } + else + Arrays.fill(silent_Frame, (byte) 0); - int padding_counter = 1; //count padding - long precount=vptsval[v]; - long[] ins = { (long)time_counter, 0 }; + System.arraycopy(header_copy, 0, silent_Frame, 0, 4); //copy last header data + silent_Frame[1] |= 1; //mark noCRC + silent_Frame[2] &= ~2; //remove padding bit - while ( precount < timeline- (audio.getFrameTimeLength() / 2.0) ) + long precount = vptsval[video_timeIndex[0]]; + + insertion_counter[0] = (long) getTimeCounter(); + insertion_counter[1] = 0; + + while ( precount < getTimePosition() - (audio.getFrameTimeLength() / 2.0) ) { //better for RTS - /** - * check if frame write should paused - */ - if (vptsdata && w < vptsval.length) + // check if frame write should pause + if (ContainsVideoPTS && video_timeIndex[1] < vptsval.length) { - double ms1 = (double) (precount - vptsval[w + 1]); - double ms2 = (double) (time_counter - vtime[w + 1]); + sync_value_1 = (double) (precount - vptsval[video_timeIndex[1] + 1]); + sync_value_2 = (double) (getTimeCounter() - vtime[video_timeIndex[1] + 1]); - if ( (double) Math.abs(ms2) <= audio.getFrameTimeLength() / 2.0 ) + if ( (double) Math.abs(sync_value_2) <= (audio.getFrameTimeLength() / 2.0) ) { - awrite = false; - w += 2; + WriteEnabled = false; + video_timeIndex[1] += 2; } - else if ((double) Math.abs(ms1) <= audio.getFrameTimeLength() / 2.0 ) + else if ((double) Math.abs(sync_value_1) <= (audio.getFrameTimeLength() / 2.0) ) { - awrite = false; - w += 2; + WriteEnabled = false; + video_timeIndex[1] += 2; } } - /** - * calculate A/V Offset for true - */ - if (vptsdata && v < vptsval.length) + // calculate A/V Offset for true + if (ContainsVideoPTS && video_timeIndex[0] < vptsval.length) { - double ms3 = precount - vptsval[v]; - double ms4 = time_counter - vtime[v]; + sync_value_3 = precount - vptsval[video_timeIndex[0]]; + sync_value_4 = getTimeCounter() - vtime[video_timeIndex[0]]; if (Debug) - System.out.println(" " + ms3 + "/" + ms4 + "/" + (ms4 - ms3)); + System.out.println(" " + sync_value_3 + "/" + sync_value_4 + "/" + (sync_value_4 - sync_value_3)); - if (!awrite && (double) Math.abs((time_counter - vtime[v]) - - (precount - vptsval[v]) ) <= (double)audio.getFrameTimeLength() / 2.0 ) + if (!WriteEnabled && (double) Math.abs((getTimeCounter() - vtime[video_timeIndex[0]]) - + (precount - vptsval[video_timeIndex[0]]) ) <= (double)audio.getFrameTimeLength() / 2.0 ) { - awrite = true; - v += 2; + WriteEnabled = true; + video_timeIndex[0] += 2; - double ms1 = precount - vptsval[v - 2]; - double ms2 = time_counter - vtime[v - 2]; + sync_value_1 = precount - vptsval[video_timeIndex[0] - 2]; + sync_value_2 = getTimeCounter() - vtime[video_timeIndex[0] - 2]; - Common.getGuiInterface().showAVOffset("" + (int)(ms1 / 90) + "/" + (int)(ms2 / 90) + "/" + (int)((ms2 - ms1) / 90)); + Common.getGuiInterface().showAVOffset("" + (int)(sync_value_1 / 90) + "/" + (int)(sync_value_2 / 90) + "/" + (int)((sync_value_2 - sync_value_1) / 90)); if (Debug) - System.out.println(" " + ms1 + "/" + ms2 + "/" + (ms2 - ms1)); + System.out.println(" " + sync_value_1 + "/" + sync_value_2 + "/" + (sync_value_2 - sync_value_1)); } } - /** - * calculate A/V Offset for true - */ - if (v < vptsval.length) + // calculate A/V Offset for true + if (video_timeIndex[0] < vptsval.length) { - if ((double) Math.abs(vptsval[v] - precount) <= (double) audio.getFrameTimeLength() / 2.0) + if ((double) Math.abs(vptsval[video_timeIndex[0]] - precount) <= (double) (audio.getFrameTimeLength() / 2.0)) { - awrite = true; - v += 2; + WriteEnabled = true; + video_timeIndex[0] += 2; - double ms1 = precount - vptsval[v - 2]; - double ms2 = time_counter - vtime[v - 2]; + sync_value_1 = precount - vptsval[video_timeIndex[0] - 2]; + sync_value_2 = getTimeCounter() - vtime[video_timeIndex[0] - 2]; - Common.getGuiInterface().showAVOffset("" + (int)(ms1 / 90) + "/" + (int)(ms2 / 90) + "/" + (int)((ms2 - ms1) / 90)); + Common.getGuiInterface().showAVOffset("" + (int)(sync_value_1 / 90) + "/" + (int)(sync_value_2 / 90) + "/" + (int)((sync_value_2 - sync_value_1) / 90)); if (Debug) - System.out.println(" " + ms1 + "/" + ms2 + "/" + (ms2 - ms1)); + System.out.println(" " + sync_value_1 + "/" + sync_value_2 + "/" + (sync_value_2 - sync_value_1)); } - /** - * calculate A/V Offset for false - */ - if (awrite && Math.abs((time_counter - vtime[v - 2]) - - (precount - vptsval[v - 2]) ) > audio.getFrameTimeLength() / 2.0 ) + // calculate A/V Offset for false + if (WriteEnabled && Math.abs((getTimeCounter() - vtime[video_timeIndex[0] - 2]) - + (precount - vptsval[video_timeIndex[0] - 2]) ) > audio.getFrameTimeLength() / 2.0 ) { - awrite = false; - v -= 2; + WriteEnabled = false; + video_timeIndex[0] -= 2; } } + // message + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.pre-insert") : Resource.getString("audio.status.pause")); - /** - * message - */ - if (awrite || !vptsdata) - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.pre-insert")); + // stop if no more audio needed + if (!checkLastAudioBound(ContainsVideoPTS, precount, vptsval, FileLength)) + break readloop; - else - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.pause")); - /** - * stop if no more audio needed - */ - if (precount > vptsval[vptsval.length - 1] + 10000) + if (WriteEnabled) { - Common.updateProgressBar(audiosize, audiosize); + writeFrame(audio, FillGapsWithLastFrame ? copyframe[0] : silent_Frame, newframes, ContainsVideoPTS, es_streamtype); - break readloop; - } - - if (awrite) - { - if (FillGapsWithLastFrame) - { // copy last frame - if (audio.getLayer() > 0 && DecodeMpgAudio) - { - audiooutL.write(MpaDecoder.decodeArray(copyframe[0])); - - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.get2ndArray()); - } - - else if (MpaConversionMode > 0) - { - newframes = MPAConverter.modifyframe(copyframe[0], MpaConversionMode); - audiooutL.write(newframes[0]); - - if (MpaConversionMode >= 4) - audiooutR.write(newframes[1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - { - riffw[0].RiffData(audio.parseRiffData(newframes[0])); - - if (MpaConversionMode >= 4) - riffw[1].RiffData(audio.parseRiffData(newframes[1])); - } - } - - else - { - audiooutL.write(copyframe[0]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - riffw[0].RiffData(audio.parseRiffData(copyframe[0])); - } - } - else - { - //if (padding_counter==padding) padding_counter=0; //reset padd count - //else if (samplerate==0) padding_counter++; //count padding - - if (audio.getLayer() > 0 && DecodeMpgAudio) - { - audiooutL.write(MpaDecoder.decodeArray(silent_Frame[(padding_counter > 0) ? 0 : 1])); - - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.get2ndArray()); - } - else if (MpaConversionMode > 0) - { - newframes = MPAConverter.modifyframe(silent_Frame[(padding_counter > 0) ? 0 : 1], MpaConversionMode); - audiooutL.write(newframes[0]); - - if (MpaConversionMode >= 4) - audiooutR.write(newframes[1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - { - riffw[0].RiffData(audio.parseRiffData(newframes[0])); - - if (MpaConversionMode >= 4) - riffw[1].RiffData(audio.parseRiffData(newframes[1])); - } - } - else - { - audiooutL.write(silent_Frame[(padding_counter > 0) ? 0 : 1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - riffw[0].RiffData(audio.parseRiffData(silent_Frame[(padding_counter > 0) ? 0 : 1])); - } - } - - frame_counter++; - time_counter += audio.getFrameTimeLength(); - cb++; - ins[1]++; + FrameExportInfo.countPreInsertedFrames(1); + insertion_counter[1]++; } precount += audio.getFrameTimeLength(); if (Debug) - System.out.println("(5)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0f) )); - } /** end while **/ + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); - n = actframe; - - audioin.unread(frame); - - if (ins[1] > 0) - Common.setMessage(Resource.getString("audio.msg.summary.pre-insert", "" + ins[1], FramesToTime((int)ins[1], audio.getFrameTimeLength())) + " " + Common.formatTime_1(ins[0] / 90L)); - - continue readloop; - } + } // end while + setFramePosition(getCurrentFramePosition()); - /** - * check if frame write should paused - */ - if (vptsdata) - { - vw[0] = v; - vw[1] = w; + unreadInputStream(frame, 0, frame.length); - awrite = SyncCheck(vw, time_counter, audio.getFrameTimeLength(), timeline, frame_counter, vptsval, vtime, awrite, Debug); + if (insertion_counter[1] > 0) + Common.setMessage(Resource.getString("audio.msg.summary.pre-insert", "" + insertion_counter[1], FramesToTime((int)insertion_counter[1], audio.getFrameTimeLength())) + " " + formatFrameTime(insertion_counter[0])); - v = vw[0]; - w = vw[1]; - } - // System.out.println(""+awrite+"/"+v+"/"+w); + continue readloop; + } // end of pre-loop - /** - * message - */ - if (awrite || !vptsdata) - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.write")); - else - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.pause")); + // check for A+V sync + if (ContainsVideoPTS) + WriteEnabled = SyncCheck(video_timeIndex, getTimeCounter(), audio.getFrameTimeLength(), getTimePosition(), FrameExportInfo.getWrittenFrames(), vptsval, vtime, WriteEnabled, Debug, "mpa-1"); - /** - * stop if no more audio needed - */ - if (vptsdata && timeline > vptsval[vptsval.length - 1] + 10000) - { - Common.updateProgressBar(audiosize, audiosize); + // gui message + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.write") : Resource.getString("audio.status.pause")); + // stop if no more audio needed + if (!checkLastAudioBound(ContainsVideoPTS, getTimePosition(), vptsval, FileLength)) break readloop; - } - - /** - * message - */ - if ((newformat && awrite) || (newformat && !vptsdata)) - { - if (ModeChangeCount < 100) - { - String str = Common.formatTime_1((long)(time_counter / 90.0f)); - Common.setMessage(Resource.getString("audio.msg.source", audio.displayHeader()) + " " + str); + // gui message + messageSourceFormat(job_processing, audio, ContainsVideoPTS, getTimeCounter()); - if (collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createChapters)) - job_processing.getChapters().addChapter(str, audio.displayHeader()); - } - - else if (ModeChangeCount == 100) - Common.setMessage(Resource.getString("audio.msg.source.max")); + // endpts of current frame, startpts of next frame + countTimePosition(audio.getFrameTimeLength()); - else if (Debug) - System.out.println("=> src_audio: "+audio.displayHeader() + " @ " + Common.formatTime_1((long)(time_counter / 90.0f))); + // TimePosition ist hier n臘hste audiopts frame start - ModeChangeCount++; - newformat = false; - - //yield(); + // message + if (Debug) + { + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); + System.out.println("ntl: " + getTimePosition() + " x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); } - /** - * message - */ - if (Debug) - System.out.println("(1)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0f) )); - - if (Debug) - System.out.println(" x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); - - /** - * pts for next frame!! - */ - timeline += audio.getFrameTimeLength(); - - /** - * remove CRC - */ - if (ClearCRC) - audio.removeCRC(frame); - - /** - * copy frame header - */ - System.arraycopy(frame, 0, header_copy, 0, 4); - header_copy[3] &= 0xCF; - header_copy[2] &= ~2; + // remove CRC + audio.removeCRC(frame, ClearCRC); - /** - * message - */ - //if (Debug) - // System.out.print(" tl"+timeline+" /px "+ptsval[x]+" /1_"+ptsval[x+1]+" /p1-tl "+(ptsval[x+1]-timeline)+" /pp1 "+ptspos[x+1]+" /n "+n); + // copy frame header , for gaps + copyMpaFrameHeader(frame, header_copy); - /** - * simple sync - */ - if (LimitPts && ptspos[x + 1] != -1 && ptspos[x + 1] < n) + // simple sync + if (LimitPts && ptspos[x + 1] != -1 && ptspos[x + 1] < getFramePosition()) { if (Debug) System.out.println(" minSync " + minSync + "/ " + x); @@ -1793,745 +1493,983 @@ minSync = 0; } - /** - * frame is in last pes packet or packet end not yet reached - */ - if ((ptspos[x + 1] == -1) || (ptspos[x + 1] > n )) - { - if (vptsdata && !awrite) - continue readloop; - - if (audio.getLayer() > 0 && DecodeMpgAudio) - { - audiooutL.write(MpaDecoder.decodeArray(frame)); - - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.get2ndArray()); - } - else if (MpaConversionMode > 0) - { - newframes = MPAConverter.modifyframe(frame, MpaConversionMode); - audiooutL.write(newframes[0]); - - if (MpaConversionMode >= 4) - audiooutR.write(newframes[1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - { - riffw[0].RiffData(audio.parseRiffData(newframes[0])); - - if (MpaConversionMode >= 4) - riffw[1].RiffData(audio.parseRiffData(newframes[1])); - } - } - else - { - audiooutL.write(frame); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - riffw[0].RiffData(audio.parseRiffData(frame)); - } - - frame_counter++; - time_counter += audio.getFrameTimeLength(); - + // frame is in last pes packet or packet end not yet reached + // normal condition + if (writeSuccessiveFrame(audio, frame, newframes, ContainsVideoPTS, getFramePosition(), ptspos, x, es_streamtype)) continue readloop; - } minSync = 0; - /** - * frame is on pes packet corner - */ - if ((double) Math.abs(ptsval[x + 1] - timeline) < (double) audio.getFrameTimeLength() / 2.0 ) + // message + if (Debug) + System.out.println("ZZ " + getTimePosition() + " /pvx " + ptsval[x] + " /pvx+1 " + ptsval[x + 1] + " /endFramePosition " + getFramePosition()); + + // frame is on pes packet corner + // less than a half of frame time to packet end, so write it and count to next index + if ((double) Math.abs(ptsval[x + 1] - getTimePosition()) < (audio.getFrameTimeLength() / 2.0)) { - timeline = ptsval[x + 1]; - x++; + setTimePosition(ptsval[++x]); - if (vptsdata && !awrite) - continue readloop; + writeFrame(audio, frame, newframes, ContainsVideoPTS, es_streamtype); - if (audio.getLayer() > 0 && DecodeMpgAudio) - { - audiooutL.write(MpaDecoder.decodeArray(frame)); + insertion_counter[0] = (long) getTimeCounter(); + insertion_counter[1] = 0; - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.get2ndArray()); - } - else if (MpaConversionMode > 0) + // check sync after resetting + if (Math.abs(video_timeIndex[2]) >= (audio.getFrameTimeLength() / 2.0) || Math.abs(video_timeIndex[3]) >= (audio.getFrameTimeLength() / 2.0)) { - newframes = MPAConverter.modifyframe(frame, MpaConversionMode); - audiooutL.write(newframes[0]); + // 1 zus舩zl. frame einfgen + if (video_timeIndex[2] < 0 || video_timeIndex[3] < 0) + { + // gui message + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.insert") : Resource.getString("audio.status.pause")); - if (MpaConversionMode >= 4) - audiooutR.write(newframes[1]); + if (!ContainsVideoPTS || (ContainsVideoPTS && WriteEnabled)) + { + Common.setMessage("!> A/V sync discontinuity in next audio packet @ " + formatFrameTime(getTimeCounter())); - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - { - riffw[0].RiffData(audio.parseRiffData(newframes[0])); + writeFrame(audio, frame, newframes, ContainsVideoPTS, es_streamtype); - if (MpaConversionMode >= 4) - riffw[1].RiffData(audio.parseRiffData(newframes[1])); - } - } - else - { - audiooutL.write(frame); + FrameExportInfo.countInsertedFrames(1); + insertion_counter[1]++; - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - riffw[0].RiffData(audio.parseRiffData(frame)); - } + Common.setMessage(Resource.getString("audio.msg.summary.insert", "" + insertion_counter[1], FramesToTime((int)insertion_counter[1], audio.getFrameTimeLength())) + " " + formatFrameTime(insertion_counter[0])); + } - frame_counter++; - time_counter += audio.getFrameTimeLength(); +/** else // a-v async in schnittpause + { + countTimeCounter(-audio.getFrameTimeLength()); + Common.setMessage("!> A/V sync discontinuity in next audio packet @ " + formatFrameTime(getTimeCounter())); + Common.setMessage(Resource.getString("audio.msg.summary.skip") + " " + formatFrameTime(getTimeCounter())); + } +**/ + if (Debug) + { + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); + System.out.println("tl: " + getTimePosition() + " x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); + } + } + } continue readloop; } - if (ptsval[x + 1] > timeline) + // more than or equal of a half of frame time is missing, so fill it + if (ptsval[x + 1] > getTimePosition()) insertSilenceLoop = true; - if (ptsval[x + 1] < timeline) + // frame time is later than next indexed frame, so skip it and count to next index + if (ptsval[x + 1] < getTimePosition()) { - x++; - timeline = ptsval[x]; + setTimePosition(ptsval[++x]); - Common.setMessage(Resource.getString("audio.msg.summary.skip") + " " + Common.formatTime_1((long)time_counter / 90L)); + Common.setMessage(Resource.getString("audio.msg.summary.skip") + " " + formatFrameTime(getTimeCounter())); - ce++; + FrameExportInfo.countSkippedFrames(1); } + // insert condition if (insertSilenceLoop) { - silent_Frame[0] = new byte[audio.getSizeBase()]; //silence without padd, std - silent_Frame[1] = new byte[audio.getSize()]; //silence with padd for 22.05, 44.1 + // silentframe auslagern zu audio.class !! + if (silent_Frame.length != audio.getSizeBase()) + silent_Frame = new byte[audio.getSizeBase()]; //silence without padd, std - for (int a = 0; a < 2; a++) - { - System.arraycopy(header_copy, 0, silent_Frame[a], 0, 4); //copy last header data - silent_Frame[a][1] |= 1; //mark noCRC - silent_Frame[a][2] |= (a * 2); //set padding bit - } + else + Arrays.fill(silent_Frame, (byte) 0); + + System.arraycopy(header_copy, 0, silent_Frame, 0, 4); //copy last header data + silent_Frame[1] |= 1; //mark noCRC + silent_Frame[2] &= ~2; //remove padding bit - int padding_counter = 1; //count padding - long[] ins = { (long)time_counter, 0 }; + insertion_counter[0] = (long) getTimeCounter(); + insertion_counter[1] = 0; // solange n臘hster ptsval minus n臘hster framebeginn ist gr゚er der halben framezeit, fge stille ein - while (ptsval[x + 1] > (timeline - (audio.getFrameTimeLength() / 2.0))) + while (ptsval[x + 1] > (getTimePosition() - (audio.getFrameTimeLength() / 2.0))) { - if (vptsdata && w < vptsval.length) - { - double ms1 = (double) (timeline - audio.getFrameTimeLength() - vptsval[w + 1]); - double ms2 = (double) (time_counter - vtime[w + 1]); + // gui message + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.insert") : Resource.getString("audio.status.pause")); - if ((double) Math.abs(ms2) <= audio.getFrameTimeLength() / 2.0) - { - awrite = false; - w += 2; - } - else if ((double) Math.abs(ms1) <= audio.getFrameTimeLength() / 2.0) - { - awrite = false; - w += 2; - } + if (!ContainsVideoPTS || (ContainsVideoPTS && WriteEnabled)) + { + writeFrame(audio, FillGapsWithLastFrame ? copyframe[0] : silent_Frame, newframes, ContainsVideoPTS, es_streamtype); + + FrameExportInfo.countInsertedFrames(1); + insertion_counter[1]++; } - if (vptsdata && v < vptsval.length) + if (Debug) { - if (!awrite && (double) Math.abs((time_counter - vtime[v]) - - (timeline - audio.getFrameTimeLength() - vptsval[v]) ) <= (double) audio.getFrameTimeLength() / 2.0 ) - { - double ms1 = (double) (timeline - audio.getFrameTimeLength() - vptsval[v]); - double ms2 = (double) (time_counter - vtime[v]); + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); + System.out.println("tl: " + getTimePosition() + " x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); + } - Common.getGuiInterface().showAVOffset("" + (int)(ms1 / 90) + "/" + (int)(ms2 / 90) + "/" + (int)((ms2 - ms1) / 90)); + // check a+v sync + if (ContainsVideoPTS) + WriteEnabled = SyncCheck(video_timeIndex, getTimeCounter(), audio.getFrameTimeLength(), getTimePosition(), FrameExportInfo.getWrittenFrames(), vptsval, vtime, WriteEnabled, Debug, "mpac-2sil"); - if (Debug) - System.out.println(" ァ" + ms1 + "/" + ms2 + "/" + (ms2 - ms1)); + countTimePosition(audio.getFrameTimeLength()); - awrite = true; - v += 2; - } - } + } // end while + + insertSilenceLoop = false; + + if (insertion_counter[1] > 0) + Common.setMessage(Resource.getString("audio.msg.summary.insert", "" + insertion_counter[1], FramesToTime((int)insertion_counter[1], audio.getFrameTimeLength())) + " " + formatFrameTime(insertion_counter[0])); + + // set PTS after inserting to new index + setTimePosition(ptsval[++x]); - if (vptsdata && v < vptsval.length) + insertion_counter[0] = (long) getTimeCounter(); + insertion_counter[1] = 0; + + // check sync after resetting + if (Math.abs(video_timeIndex[2]) >= audio.getFrameTimeLength() || Math.abs(video_timeIndex[3]) >= audio.getFrameTimeLength()) + { + // 1 zus舩zl. frame einfgen + if (video_timeIndex[2] < 0 || video_timeIndex[3] < 0) { - if ((double) Math.abs(vptsval[v] - (timeline - audio.getFrameTimeLength())) <= ((double) audio.getFrameTimeLength() / 2.0) ) - { - double ms1 = (double) (timeline - audio.getFrameTimeLength() - vptsval[v]); - double ms2 = (double) (time_counter - vtime[v]); + // gui message + Common.getGuiInterface().showExportStatus((WriteEnabled || !ContainsVideoPTS) ? Resource.getString("audio.status.insert") : Resource.getString("audio.status.pause")); - Common.getGuiInterface().showAVOffset("" + (int)(ms1 / 90) + "/" + (int)(ms2 / 90) + "/" + (int)((ms2 - ms1) / 90)); + if (!ContainsVideoPTS || (ContainsVideoPTS && WriteEnabled)) + { + Common.setMessage("!> A/V sync discontinuity in next audio packet (insert) @ " + formatFrameTime(getTimeCounter())); - if (Debug) - System.out.println(" ゚" + ms1 + "/" + ms2 + "/" + (ms2 - ms1)); + writeFrame(audio, FillGapsWithLastFrame ? copyframe[0] : silent_Frame, newframes, ContainsVideoPTS, es_streamtype); - awrite = true; - v += 2; + FrameExportInfo.countInsertedFrames(1); + insertion_counter[1]++; } - if (awrite && (double) Math.abs((time_counter - vtime[v - 2]) - - (timeline - audio.getFrameTimeLength() - vptsval[v - 2]) ) > (double) audio.getFrameTimeLength() / 2.0 ) +/** else // a-v async in schnittpause + { + countTimeCounter(-audio.getFrameTimeLength()); + Common.setMessage("!> A/V sync discontinuity in next audio packet (insert) @ " + formatFrameTime(getTimeCounter())); + Common.setMessage(Resource.getString("audio.msg.summary.skip") + " " + formatFrameTime(getTimeCounter())); + } +**/ + if (Debug) { - awrite = false; - v -= 2; + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); + System.out.println("tl: " + getTimePosition() + " x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); } } + } - /** - * message - */ - if (awrite || !vptsdata) - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.insert")); + if (insertion_counter[1] > 0) + Common.setMessage(Resource.getString("audio.msg.summary.insert", "" + insertion_counter[1], FramesToTime((int)insertion_counter[1], audio.getFrameTimeLength())) + " " + formatFrameTime(insertion_counter[0])); - else - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.pause")); - - if (!vptsdata || (vptsdata && awrite)) - { - if (FillGapsWithLastFrame) - { - if (audio.getLayer() > 0 && DecodeMpgAudio) - { - audiooutL.write(MpaDecoder.decodeArray(copyframe[0])); - - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.get2ndArray()); - } - else if (MpaConversionMode > 0) - { - newframes = MPAConverter.modifyframe(copyframe[0], MpaConversionMode); - audiooutL.write(newframes[0]); - - if (MpaConversionMode >= 4) - audiooutR.write(newframes[1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - { - riffw[0].RiffData(audio.parseRiffData(newframes[0])); - - if (MpaConversionMode >= 4) - riffw[1].RiffData(audio.parseRiffData(newframes[1])); - } - } - else - { - audiooutL.write(copyframe[0]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - riffw[0].RiffData(audio.parseRiffData(copyframe[0])); - } - } - else - { - //if (padding_counter==padding) padding_counter=0; //reset padd count - //else if (samplerate==0) padding_counter++; //count padding - - if (audio.getLayer() > 0 && DecodeMpgAudio) - { - audiooutL.write(MpaDecoder.decodeArray(silent_Frame[(padding_counter > 0) ? 0 : 1])); - - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.get2ndArray()); - } - else if (MpaConversionMode > 0) - { - newframes = MPAConverter.modifyframe(silent_Frame[(padding_counter > 0) ? 0 : 1], MpaConversionMode); - audiooutL.write(newframes[0]); - - if (MpaConversionMode >= 4) - audiooutR.write(newframes[1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - { - riffw[0].RiffData(audio.parseRiffData(newframes[0])); - - if (MpaConversionMode >= 4) - riffw[1].RiffData(audio.parseRiffData(newframes[1])); - } - } - else - { - audiooutL.write(silent_Frame[(padding_counter > 0) ? 0 : 1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - riffw[0].RiffData(audio.parseRiffData(silent_Frame[(padding_counter > 0) ? 0 : 1])); - } - } - - frame_counter++; - time_counter += audio.getFrameTimeLength(); - cc++; - ins[1]++; - } + continue readloop; + } // end insertion - if (Debug) - { - System.out.println("(2)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0f) )); - System.out.print(" t)" + timeline); - System.out.println(" x" + ((x < ptspos.length - 1) ? x + "/" + ptsval[x + 1] + "/" + ptspos[x + 1] : "-")); - } - - timeline += audio.getFrameTimeLength(); - } // end while - - timeline -= audio.getFrameTimeLength(); - insertSilenceLoop = false; - x++; - - if (ins[1] > 0) - Common.setMessage(Resource.getString("audio.msg.summary.insert", "" + ins[1], FramesToTime((int)ins[1], audio.getFrameTimeLength())) + " " + Common.formatTime_1(ins[0] / 90L)); - - /** - * reset PTS after inserting - */ - timeline = ptsval[x]; - - continue readloop; - } - - if ( (actframe + audio.getSize()) >= audiosize ) + // avail. frame size too short, so end here + if ( (getCurrentFramePosition() + audio.getSize()) >= FileLength ) break readloop; + } // end while + if (Debug) - System.out.println("(3)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0f) )); + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); + /** * add frames at the end */ - if (es_streamtype == CommonParsing.MPEG_AUDIO && AddFrames && vptsdata && awrite && (w < vptsval.length)) + if (es_streamtype == CommonParsing.MPEG_AUDIO && AddFrames && ContainsVideoPTS && WriteEnabled && (video_timeIndex[1] < vptsval.length)) { - timeline += audio.getFrameTimeLength(); - addf[0] = (long) time_counter; + countTimePosition(audio.getFrameTimeLength()); + addf[0] = (long) getTimeCounter(); - silent_Frame[0] = new byte[audio.getSizeBase()]; //silence without padd, std - silent_Frame[1] = new byte[audio.getSize()]; //silence with padd for 22.05, 44.1 + if (silent_Frame.length != audio.getSizeBase()) + silent_Frame = new byte[audio.getSizeBase()]; //silence without padd, std - for (int a = 0; a < 2; a++) - { - System.arraycopy(header_copy,0, silent_Frame[a], 0, 4); //copy last header data - silent_Frame[a][1] |= 1; //mark noCRC - silent_Frame[a][2] |= (a * 2); //set padding bit - } + else + Arrays.fill(silent_Frame, (byte) 0); - int padding_counter = 1; //count padding + System.arraycopy(header_copy, 0, silent_Frame, 0, 4); //copy last header data + silent_Frame[1] |= 1; //mark noCRC + silent_Frame[2] &= ~2; //remove padding bit - while (w < vptsval.length) + while (video_timeIndex[1] < vptsval.length) { - while ( vtime[w + 1] > time_counter && - (double) Math.abs(vtime[w + 1] - time_counter) > (double) audio.getFrameTimeLength() / 2.0 ) + while ( vtime[video_timeIndex[1] + 1] > getTimeCounter() && + (double) Math.abs(vtime[video_timeIndex[1] + 1] - getTimeCounter()) > (double) audio.getFrameTimeLength() / 2.0 ) { - if (FillGapsWithLastFrame) - { //add_copy prev. frame - if (audio.getLayer() > 0 && DecodeMpgAudio) - { - audiooutL.write(MpaDecoder.decodeArray(copyframe[0])); - - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.get2ndArray()); - } - else if (MpaConversionMode > 0) - { //modify frame - newframes = MPAConverter.modifyframe(copyframe[0], MpaConversionMode); - audiooutL.write(newframes[0]); - - if (MpaConversionMode >= 4) - audiooutR.write(newframes[1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - { - riffw[0].RiffData(audio.parseRiffData(newframes[0])); - - if (MpaConversionMode >= 4) - riffw[1].RiffData(audio.parseRiffData(newframes[1])); - } - } - else - { - audiooutL.write(copyframe[0]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - riffw[0].RiffData(audio.parseRiffData(copyframe[0])); - } - } - else - { //add silence - //if (padding_counter==padding) padding_counter=0; //reset padd count - //else if (samplerate==0) padding_counter++; //count padding - - if (audio.getLayer() > 0 && DecodeMpgAudio) - { - audiooutL.write(MpaDecoder.decodeArray(silent_Frame[(padding_counter > 0) ? 0 : 1])); - - if (MpaConversionMode >= 4) - audiooutR.write(MpaDecoder.get2ndArray()); - } - else if (MpaConversionMode > 0) - { //modify frame - newframes = MPAConverter.modifyframe(silent_Frame[(padding_counter > 0) ? 0 : 1], MpaConversionMode); - audiooutL.write(newframes[0]); - - if (MpaConversionMode >= 4) - audiooutR.write(newframes[1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - { - riffw[0].RiffData(audio.parseRiffData(newframes[0])); - - if (MpaConversionMode >= 4) - riffw[1].RiffData(audio.parseRiffData(newframes[1])); - } - } - else - { - audiooutL.write(silent_Frame[(padding_counter > 0) ? 0 : 1]); - - /** - * RIFF - */ - if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) - riffw[0].RiffData(audio.parseRiffData(silent_Frame[(padding_counter > 0) ? 0 : 1])); - } - } - timeline += audio.getFrameTimeLength(); - cd++; - frame_counter++; + writeFrame(audio, FillGapsWithLastFrame ? copyframe[0] : silent_Frame, newframes, ContainsVideoPTS, es_streamtype); + + FrameExportInfo.countAddedFrames(1); + countTimePosition(audio.getFrameTimeLength()); addf[1]++; - time_counter += audio.getFrameTimeLength(); Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.add")); if (Debug) { - System.out.println("(4)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0f) )); - System.out.print(" t)" + (long)(timeline - audio.getFrameTimeLength()) + " w)" + w); + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); + System.out.print(" t)" + (long)(getTimePosition() - audio.getFrameTimeLength()) + " w)" + video_timeIndex[1]); } } - w += 2; + video_timeIndex[1] += 2; } - w -= 2; - timeline -= audio.getFrameTimeLength(); + video_timeIndex[1] -= 2; + countTimePosition(-audio.getFrameTimeLength()); if (Debug) - System.out.println(" eot_video:" + (vptsval[w + 1] / 90) + "ms, eot_audio:" + ((timeline) / 90) + "ms "); + System.out.println(" eot_video:" + (vptsval[video_timeIndex[1] + 1] / 90) + "ms, eot_audio:" + ((getTimePosition()) / 90) + "ms "); } //end add mpa - /** - * PCM Audio + * restart decoding after a peak search */ - if (es_streamtype == CommonParsing.LPCM_AUDIO) + if (es_streamtype == CommonParsing.MPEG_AUDIO && DecodeMpgAudio && MpaDecoder.PRESCAN && !MpaDecoder.RESET) { - // parse header - frame = new byte[1000]; + MpaDecoder.PRESCAN = false; + MpaDecoder.NORMALIZE = false; - audioin.read(frame); + closeInputStream(); + closeOutputStreams(); + return true; + } - audio.parseHeader(frame, 0); + break; - audioin.unread(frame, audio.getEmphasis(), 1000 - audio.getEmphasis()); + } // end while bigloop - Common.setMessage(Resource.getString("audio.msg.source", audio.saveAndDisplayHeader()) + " " + Common.formatTime_1((long)(time_counter / 90.0f))); - layertype = WAV_AUDIOSTREAM; - n = audio.getEmphasis(); //start of pcm data - long pcm_end_pos = audio.getEmphasis() + audio.getSizeBase(); //whole sample data size + if (addf[1] > 0) + Common.setMessage(Resource.getString("audio.msg.summary.add", "" + addf[1], FramesToTime((int)addf[1], audio.getFrameTimeLength())) + " " + formatFrameTime(addf[0])); - timeline = ptsval[0]; + Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.finish")); - audiooutL.write(audio.getRiffHeader()); + String tc = formatFrameTime(getTimeCounter()); + Common.setMessage(Resource.getString("audio.msg.summary.frames", "" + FrameExportInfo.getWrittenFrames() + "-" + FrameExportInfo.getShortSummary(), "" + tc)); - long sample_bytes; - long skip_bytes; - long sample_pts; - long skip_pts; + if (ModeChangeCount_JSS > 0) + Common.setMessage(Resource.getString("audio.msg.summary.jstereo", String.valueOf(ModeChangeCount_JSS))); - int sample_size; - int read_size = 960000 / audio.getMode(); + closeInputStream(); - // Size/8 * Channel = bytes per sample - // 16bit/8 * 2 = 4 - // per sample: Audio.Time_length = 90000.0 / Samplefre - // 48000hz = 1.875 ticks (of 90khz) 1 frame = 192 samples = 360ticks - // 44100hz = 2.040816 + silentFrameBuffer.close(); - for (int f = 0; f < ptsval.length - 1; f++) - { - for (int a = 0; a < vptsval.length; a+=2) - { - while (pause()) - {} + closeOutputStreams(); - if (CommonParsing.isProcessCancelled()) - { - CommonParsing.setProcessCancelled(false); - job_processing.setSplitSize(0); + String[][] es_audio_str = { + { str_ac3, str_mp3, str_mp2, str_mp1, str_dts }, + { (str_new + str_ac3), (str_new + str_mp3), (str_new + str_mp2), (str_new + str_mp1), (str_new + str_dts) } + }; - break bigloop; - } + if (RenameAudio) + setExtension(es_audio_str, str_mpa, (str_new + str_mpa)); - if (vptsdata && vptsval[a] < timeline) //jump back (not yet) or insert silent samples - { - sample_pts = vptsval[a + 1] > timeline ? timeline - vptsval[a] : vptsval[a + 1] - vptsval[a]; - sample_bytes = (long)Math.round(1.0 * audio.getSamplingFrequency() * sample_pts / 90000.0) * audio.getMode(); + if (DecodeMpgAudio && audio.getLayer() > 1) + { + if (MpaDecoder.WAVE) + setExtension(es_audio_str, str_wav); - if (Debug) - System.out.println("a " + sample_pts + "/" + sample_bytes + "/" + n + "/" + timeline); + else if (AddAiffHeader) + setExtension(es_audio_str, str_aif); - for (long sample_pos = 0; sample_pos < sample_bytes; ) - { - sample_size = (sample_bytes - sample_pos) >= read_size ? read_size : (int)(sample_bytes - sample_pos); - frame = new byte[sample_size]; - sample_pos += sample_size; + else + setExtension(es_audio_str, str_pcm); + } - audiooutL.write(frame); - } + else if (AddWaveHeaderBWF || AddWaveHeaderACM) + { + setExtension(es_audio_str, str_wav); + } - time_counter += sample_pts; - frame_counter += (sample_bytes / audio.getMode()); + if (AddWaveHeaderAC3) + { + for (int j = 0; j < 2; j++) + es_audio_str[j][0] += str_wav; + } - Common.setFps(frame_counter); + else if (CreateDDWave) + { + es_audio_str[0][0] += str_wav; + es_audio_str[1][0] += str_wav; + es_audio_str[0][4] += str_wav; + es_audio_str[1][4] += str_wav; + } - if (vptsval[a + 1] > timeline) - { - sample_pts = vptsval[a + 1] - timeline; - sample_bytes = (long) Math.round(1.0 * audio.getSamplingFrequency() * sample_pts / 90000.0) * audio.getMode(); - if (Debug) - System.out.println("b " + sample_pts + "/" + sample_bytes + "/" + n + "/" + timeline); + //finish wave header + fillWaveHeader(audio, es_streamtype); - for (long sample_pos = 0; sample_pos < sample_bytes; ) - { - sample_size = (sample_bytes - sample_pos) >= read_size ? read_size : (int)(sample_bytes - sample_pos); - frame = new byte[sample_size]; + File audioout1 = new File(FileName_Ch1); + File audioout2 = new File(FileName_Ch2); - audioin.read(frame); + job_processing.countMediaFilesExportLength(audioout1.length()); + job_processing.countMediaFilesExportLength(audioout2.length()); - sample_pos += sample_size; + if (DecodeMpgAudio) + audio_type[1] = audio_type[2] = "(pcm)"; - audiooutL.write(frame); - } + String comparedata = ""; - n += sample_bytes; - timeline += sample_pts; - time_counter += sample_pts; - frame_counter += (sample_bytes / audio.getMode()); - } - } - else - { - skip_pts = vptsdata ? vptsval[a] - timeline : 0; - skip_bytes = (long)Math.round(1.0 * audio.getSamplingFrequency() * skip_pts / 90000.0) * audio.getMode(); + if (AudioType < 0) + AudioType = NO_AUDIOSTREAM; - sample_pts = vptsdata ? vptsval[a + 1] - vptsval[a] : (long)(1.0 * (audio.getSizeBase() / audio.getMode()) / audio.getSamplingFrequency() * 90000.0); - sample_bytes = (long) Math.round(1.0 * audio.getSamplingFrequency() * sample_pts / 90000.0) * audio.getMode(); + else + comparedata = Resource.getString("audio.msg.audio") + " " + Common.adaptString(job_processing.countAudioStream(), 2) + " " + audio_type[AudioType] + ":\t" + FrameExportInfo.getWrittenFrames() + " Frames\t" + tc + "\t" + infoPTSMatch(filename_pts, videofile_pts, ContainsVideoPTS, ContainsAudioPTS) + FrameExportInfo.getShortSummary(); - for (long skip_pos = 0; skip_pos < skip_bytes; ) - skip_pos += audioin.skip(skip_bytes - skip_pos); + /** + * + */ + switch (AudioType) + { + case AC3_AUDIOSTREAM: + case DTS_AUDIOSTREAM: + case MP1_AUDIOSTREAM: + case MP3_AUDIOSTREAM: - n += skip_bytes; + finishOutputFiles(job_processing, fparent, es_audio_str[isElementaryStream][AudioType], audioout1, audioout2, comparedata, OutputStream_Ch1, OutputStream_Ch2); + break; - if (Debug) - System.out.println("c " + skip_pts + "/" + skip_bytes + "/" + sample_pts + "/" + sample_bytes + "/" + n + "/" + timeline); + case MP2_AUDIOSTREAM: + if (MpaConversionMode >= MpaConversion_Mode4) + finishOutputFiles(job_processing, fparent, "[L]" + es_audio_str[0][AudioType], "[R]" + es_audio_str[0][AudioType], audioout1, audioout2, comparedata, OutputStream_Ch1, OutputStream_Ch2); - for (long sample_pos = 0; sample_pos < sample_bytes; ) - { - sample_size = (sample_bytes - sample_pos) >= read_size ? read_size : (int)(sample_bytes - sample_pos); - frame = new byte[sample_size]; + else + finishOutputFiles(job_processing, fparent, es_audio_str[isElementaryStream][AudioType], audioout1, audioout2, comparedata, OutputStream_Ch1, OutputStream_Ch2); - audioin.read(frame); + break; - sample_pos += sample_size; + case WAV_AUDIOSTREAM: - audiooutL.write(frame); - } + finishOutputFiles(job_processing, fparent, (str_new + str_wav), audioout1, audioout2, comparedata, OutputStream_Ch1, OutputStream_Ch2); + break; - n += sample_bytes; - timeline += (skip_pts + sample_pts); - time_counter += sample_pts; - frame_counter += (sample_bytes / audio.getMode()); - } + case NO_AUDIOSTREAM: + Common.setMessage(Resource.getString("audio.msg.noaudio")); - if (Debug) - System.out.println("(4w)audio frames: wri/pre/skip/ins/add " + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd + " @ " + Common.formatTime_1((long)(time_counter / 90.0f) )); + finishOutputFiles(job_processing, null, null, audioout1, audioout2, comparedata, OutputStream_Ch1, OutputStream_Ch2); + break; + } - Common.updateProgressBar(n, audiosize); + } catch (IOException e) { - //yield(); + Common.setExceptionMessage(e); + } - if (Debug) - System.out.println(" n" + n); - } + Common.updateProgressBar(FileLength, FileLength); - break; - } - } + return false; + } - /** - * restart decoding after a peak search - */ - if (es_streamtype == CommonParsing.MPEG_AUDIO && DecodeMpgAudio && MpaDecoder.PRESCAN && !MpaDecoder.RESET) - { - MpaDecoder.PRESCAN = false; - MpaDecoder.NORMALIZE = false; + /** + * new extension + */ + private void setExtension(String[][] str, String new_str) + { + for (int j = 0; j < 2; j++) + for (int i = 1; i < 4; i++) + str[j][i] += new_str; + } - return true; - } + /** + * new extension for mpa - replace + */ + private void setExtension(String[][] str, String new_str_1, String new_str_2) + { + for (int i = 1; i < 4; i++) + { + str[0][i] = new_str_1; + str[1][i] = new_str_2; + } + } - break; + /** + * message source format change + */ + private void messageSourceFormat(JobProcessing job_processing, AudioFormat audio, boolean ContainsVideoPTS, double _TimeCounter) + { + if (!HasNewFormat || (ContainsVideoPTS && !WriteEnabled)) + return; - } // end while bigloop + String header = audio.displayHeader(); + if (ModeChangeCount < ModeChangeCount_Max) + { + String str = formatFrameTime(_TimeCounter); - if (addf[1] > 0) - Common.setMessage(Resource.getString("audio.msg.summary.add", "" + addf[1], FramesToTime((int)addf[1], audio.getFrameTimeLength())) + " " + Common.formatTime_1(addf[0] / 90L)); + Common.setMessage(Resource.getString("audio.msg.source", header) + " " + str); - Common.getGuiInterface().showExportStatus(Resource.getString("audio.status.finish")); + if (CreateChapters) + job_processing.getChapters().addChapter(str, header); + } - String tc = Common.formatTime_1((long)(time_counter / 90.0f) ); - Common.setMessage(Resource.getString("audio.msg.summary.frames", "" + frame_counter + "/" + cb + "/" + ce + "/" + cc + "/" + cd, "" + tc)); + else if (Debug) + System.out.println("=> src_audio: " + header + " @ " + formatFrameTime(_TimeCounter)); - if (jss > 0) - Common.setMessage(Resource.getString("audio.msg.summary.jstereo", "" + jss)); + if (ModeChangeCount == ModeChangeCount_Max) + Common.setMessage(Resource.getString("audio.msg.source.max")); - audioin.close(); - silentFrameBuffer.close(); + ModeChangeCount++; + HasNewFormat = false; + } - audiooutL.flush(); - audiooutL.close(); + /** + * pts value to time value + */ + private String formatFrameTime(long time_value) + { + return Common.formatTime_1(time_value / 90L); + } - audiooutR.flush(); - audiooutR.close(); + /** + * getFramePosition + */ + private long getFramePosition() + { + return FramePosition; + } - String[][] pureaudio = { - { ".ac3",".mp1",".mp2",".mp3",".dts" }, - { ".new.ac3",".new.mp1",".new.mp2",".new.mp3",".new.dts" } - }; + /** + * setFramePosition + */ + private void setFramePosition(long value) + { + FramePosition = value; + } - if (collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_renameAudio)) + /** + * countFramePosition + */ + private void countFramePosition(long value) + { + FramePosition += value; + } + + /** + * getCurrentFramePosition + */ + private long getCurrentFramePosition() + { + return CurrentFramePosition; + } + + /** + * setCurrentFramePosition + */ + private void setCurrentFramePosition(long value) + { + CurrentFramePosition = value; + } + + /** + * countCurrentFramePosition + */ + private void countCurrentFramePosition(long value) + { + CurrentFramePosition += value; + } + + /** + * getTimePosition + */ + private long getTimePosition() + { + return TimePosition; + } + + /** + * setTimePosition + */ + private void setTimePosition(long value) + { + TimePosition = value; + } + + /** + * setTimePosition + */ + private void setTimePosition(double value) + { + TimePosition = (long) value; + } + + /** + * countTimePosition + */ + private void countTimePosition(long value) + { + TimePosition += value; + } + + /** + * countTimePosition + */ + private void countTimePosition(double value) + { + TimePosition += (long) value; + } + + /** + * getTimeCounter + */ + private double getTimeCounter() + { + return TimeCounter; + } + + /** + * setTimeCounter + */ + private void setTimeCounter(double value) + { + TimeCounter = value; + } + + /** + * countTimeCounter + */ + private void countTimeCounter(double value) + { + TimeCounter += value; + } + + /** + * copy frame header , for gaps + */ + private void copyMpaFrameHeader(byte[] frame, byte[] header_copy) + { + System.arraycopy(frame, 0, header_copy, 0, 4); + + header_copy[3] &= 0xCF; + header_copy[2] &= ~2; + } + + /** + * stop if no more audio needed + */ + private boolean checkLastAudioBound(boolean ContainsVideoPTS, long time_value, long[] vptsval, long FileLength) + { + if (!ContainsVideoPTS) + return true; + + if (time_value > vptsval[vptsval.length - 1] + 10000) + { + Common.updateProgressBar(FileLength, FileLength); + + return false; + } + + return true; + } + + /** + * + */ + private boolean writeSuccessiveFrame(AudioFormat audio, byte[] frame, byte[][] newframes, boolean ContainsVideoPTS, long _FramePosition, long[] ptspos, int x, int es_streamtype) + { + // frame is in last pes packet or packet end not yet reached + if (ptspos[x + 1] != -1 && ptspos[x + 1] <= _FramePosition) + return false; + + //always true + writeFrame(audio, frame, newframes, ContainsVideoPTS, es_streamtype); + + return true; + } + + /** + * + */ + private boolean writeFrame(AudioFormat audio, byte[] frame, byte[][] newframes, boolean ContainsVideoPTS, int es_streamtype) + { + if (ContainsVideoPTS && !WriteEnabled) + return false; + + switch (es_streamtype) + { + case CommonParsing.AC3_AUDIO: + // set bitrate + if (AC3_BitrateAdaption) + frame = audio.editFrame(frame, 2); + + if (AddWaveHeaderAC3) + audio.parseRiffData(frame, 1); + + writeChannel1(frame); + break; + + case CommonParsing.MPEG_AUDIO: + if (DecodeMpgAudio && audio.getLayer() > 0) { - for (int g = 1; g < 4; g++) - { - pureaudio[0][g] = ".mpa"; - pureaudio[1][g] = ".new.mpa"; - } + writeChannel1(MpaDecoder.decodeArray(frame)); + + if (MpaConversionMode >= MpaConversion_Mode4) + writeChannel2(MpaDecoder.get2ndArray()); } - if (DecodeMpgAudio && audio.getLayer() > 1) + else if (MpaConversionMode != MpaConversion_None) { - if (MpaDecoder.WAVE) - { - for (int g = 1; g < 4; g++) - { - pureaudio[0][g] += ".wav"; - pureaudio[1][g] += ".wav"; - } - } + newframes = audio.convertFrame(frame, MpaConversionMode); + + writeChannel1(newframes[0]); + + if (MpaConversionMode >= MpaConversion_Mode4) + writeChannel2(newframes[1]); + } + + else + { + writeChannel1(frame); + + audio.parseRiffData(frame, 1); + } + + break; + + case CommonParsing.DTS_AUDIO: + writeChannel1(frame); + break; + } + + FrameExportInfo.countWrittenFrames(1); + countTimeCounter(audio.getFrameTimeLength()); + + // if (Debug) + // System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(TimeCounter) + " "); +//if (FrameExportInfo.getWrittenFrames() > 77000) +// Common.setMessage(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter()) + " "); + + return true; + } + + /** + * + */ + private void initOutputStreams() + { + try { + OutputStream_Ch1 = new IDDBufferedOutputStream(new FileOutputStream(FileName_Ch1), 2048000); + OutputStream_Ch2 = new IDDBufferedOutputStream(new FileOutputStream(FileName_Ch2), MpaConversionMode >= 4 ? 2048000 : 65536); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } + + /** + * + */ + private void closeOutputStreams() + { + try { + OutputStream_Ch1.flush(); + OutputStream_Ch1.close(); + + OutputStream_Ch2.flush(); + OutputStream_Ch2.close(); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } + + /** + * + */ + private void writeChannel1(byte[] array) + { + writeChannel(array, 1); + } + + /** + * + */ + private void writeChannel2(byte[] array) + { + writeChannel(array, 2); + } + + /** + * + */ + private void writeChannels(byte[] array) + { + writeChannels(array, array); + } + + /** + * + */ + private void writeChannels(byte[][] arrays) + { + writeChannels(arrays[0], arrays[1]); + } + + /** + * + */ + private void writeChannels(byte[] array1, byte[] array2) + { + writeChannel(array1, 1); + + if (MpaConversionMode >= MpaConversion_Mode4) + writeChannel(array2, 2); + } + + /** + * + */ + private void writeChannel(byte[] array, int index) + { + try { + switch (index) + { + case 1: + OutputStream_Ch1.write(array); + return; + + case 2: + OutputStream_Ch2.write(array); + return; + } + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } + + /** + * + */ + private void initInputStream(XInputFile xInputFile) + { + try { + InputStream = new PushbackInputStream(xInputFile.getInputStream(), 1000000); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } + + /** + * + */ + private void closeInputStream() + { + try { + InputStream.close(); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } + + /** + * + */ + private int readInputStream(byte[] array) + { + return readInputStream(array, 0, array.length); + } + + /** + * + */ + private int readInputStream(byte[] array, int offset, int length) + { + int value = 0; + + try { + value = InputStream.read(array, offset, length); + + if (value < length) + Arrays.fill(array, offset + value, offset + length, (byte) 0); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + + return value; + } + + /** + * + */ + private int unreadInputStream(byte[] array, int offset, int length) + { + int value = 0; + + try { + InputStream.unread(array, offset, length); + value = length; + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + + return value; + } + + /** + * + */ + private long skipInputStream(long length) + { + long value = 0L; + + try { + value = InputStream.skip(length); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + + return value; + } + + /** + * + */ + private boolean isCancelled(JobProcessing job_processing) + { + if (!CommonParsing.isProcessCancelled()) + return false; + + CommonParsing.setProcessCancelled(false); + job_processing.setSplitSize(0); + + return true; + } + + /** + * ac3 3.2 replacement + */ + private byte[] getReplacementFrame(AudioFormat audio, byte[] array, int es_streamtype) + { + if (es_streamtype != CommonParsing.AC3_AUDIO || !AC3_ReplaceWithSilence) + return array; + + //is 3/2 + if (audio.getMode() == 7) + return array; + + AudioFormat ac3_test = new AudioFormat(CommonParsing.AC3_AUDIO); + byte[] ac3data; + + for (int i = 0, j = Common.getAC3list().size(); i < j; i++) + { + ac3data = (byte[]) Common.getAC3list().get(i); + + ac3_test.parseHeader(ac3data, 0); + + if (ac3_test.getMode() != 7 || ac3_test.getSamplingFrequency() != audio.getSamplingFrequency()) + continue; + + if (ac3_test.getBitrate() != audio.getBitrate()) + continue; + + array = new byte[ac3data.length]; + + System.arraycopy(ac3data, 0, array, 0, array.length); +// + ac3data = audio.editFrame(ac3data, 4); + + break; + } + + return array; + } + + /** + * check for change in frametype + */ + private boolean determineFormatChange(AudioFormat audio, int es_streamtype) + { + boolean accept = true; + int returncode = audio.compareHeader(); - else if (AddAiffHeader) - { - for (int g = 1; g < 4; g++) - { - pureaudio[0][g] += ".aif"; - pureaudio[1][g] += ".aif"; - } - } + if (returncode > 0) + { + if (!AllowFormatChanges && (returncode & 0x7) != 0 && FrameExportInfo.getWrittenFrames() > 0) + return !accept; - else - { - for (int g = 1; g < 4; g++) - { - pureaudio[0][g] += ".pcm"; - pureaudio[1][g] += ".pcm"; - } - } - } + HasNewFormat = true; - else if (AddRiffToMpgAudio || AddRiffToMpgAudioL3) + if (es_streamtype == CommonParsing.MPEG_AUDIO && returncode == 0x20) { - for (int g = 1; g < 4; g++) - { - pureaudio[0][g] += ".wav"; - pureaudio[1][g] += ".wav"; - } + ModeChangeCount_JSS++; + HasNewFormat = false; } + } - if (AddRiffToAc3) + if (FrameExportInfo.getWrittenFrames() == 0) + HasNewFormat = true; + + return accept; + } + + /** + * prepare wave header + */ + private void addWaveHeader(AudioFormat audio, int es_streamtype) + { + switch (es_streamtype) + { + case CommonParsing.AC3_AUDIO: + if (AddWaveHeaderAC3) { - pureaudio[0][0] += ".wav"; - pureaudio[1][0] += ".wav"; + writeChannel1(audio.getExtraWaveHeader(1, true)); + Common.setMessage(Resource.getString("audio.msg.addriff.ac3")); } else if (CreateDDWave) - { - pureaudio[0][0] += ".wav"; - pureaudio[1][0] += ".wav"; - pureaudio[0][4] += ".wav"; - pureaudio[1][4] += ".wav"; - } - - File ac3name = new File (fparent + pureaudio[isElementaryStream][0]); - File mp1name = new File (fparent + pureaudio[isElementaryStream][1]); - File mp2name = new File (fparent + pureaudio[isElementaryStream][2]); - File mp3name = new File (fparent + pureaudio[isElementaryStream][3]); - File mp2nameL = new File (fparent + "[L]" + pureaudio[0][2]); - File mp2nameR = new File (fparent + "[R]" + pureaudio[0][2]); - File dtsname = new File (fparent + pureaudio[isElementaryStream][4]); - File wavname = new File (fparent + ".new.wav"); + writeChannel1(audio.getRiffHeader()); + + return; + + case CommonParsing.MPEG_AUDIO: + + writeChannel1(audio.getExtraWaveHeader(1, true)); + + if (MpaConversionMode >= MpaConversion_Mode4) + writeChannel2(audio.getExtraWaveHeader(2, true)); + + return; + + case CommonParsing.DTS_AUDIO: + if (CreateDDWave) + writeChannel1(audio.getRiffHeader()); + + return; + } + } + + /** + * finish wave header + */ + private void fillWaveHeader(AudioFormat audio, int es_streamtype) + { + long tmp_value = (long) (getTimeCounter() / 90.0f); - /*** make riff ***/ + try { if (DecodeMpgAudio && es_streamtype == CommonParsing.MPEG_AUDIO && MpaDecoder.WAVE) { if (audio.getLayer() > 1) { - MpaDecoder.fillRIFF(newnameL, FadeInOut, FadeInOutMillis); + MpaDecoder.fillRIFF(FileName_Ch1, FadeInOut, FadeInOutMillis); - if (MpaConversionMode >= 4) - MpaDecoder.fillRIFF(newnameR, FadeInOut, FadeInOutMillis); + if (MpaConversionMode >= MpaConversion_Mode4) + MpaDecoder.fillRIFF(FileName_Ch2, FadeInOut, FadeInOutMillis); } + else { - MpaDecoder.deleteRIFF(newnameL); + MpaDecoder.deleteRIFF(FileName_Ch1); - if (MpaConversionMode >= 4) - MpaDecoder.deleteRIFF(newnameR); + if (MpaConversionMode >= MpaConversion_Mode4) + MpaDecoder.deleteRIFF(FileName_Ch2); } } @@ -2539,290 +2477,549 @@ { if (audio.getLayer() > 1) { - MpaDecoder.fillAiff(newnameL,(long)(time_counter / 90.0f), FadeInOut, FadeInOutMillis); + MpaDecoder.fillAiff(FileName_Ch1, tmp_value, FadeInOut, FadeInOutMillis); - if (MpaConversionMode >= 4) - MpaDecoder.fillAiff(newnameR,(long)(time_counter / 90.0f), FadeInOut, FadeInOutMillis); + if (MpaConversionMode >= MpaConversion_Mode4) + MpaDecoder.fillAiff(FileName_Ch2, tmp_value, FadeInOut, FadeInOutMillis); } + else { - MpaDecoder.deleteAiff(newnameL); + MpaDecoder.deleteAiff(FileName_Ch1); - if (MpaConversionMode >= 4) - MpaDecoder.deleteAiff(newnameR); + if (MpaConversionMode >= MpaConversion_Mode4) + MpaDecoder.deleteAiff(FileName_Ch2); } } - else if ((AddRiffToMpgAudio || AddRiffToMpgAudioL3) && es_streamtype == CommonParsing.MPEG_AUDIO) + else if (!DecodeMpgAudio && (AddWaveHeaderBWF || AddWaveHeaderACM) && es_streamtype == CommonParsing.MPEG_AUDIO) { - RandomAccessFile[] rifffile = { new RandomAccessFile(newnameL, "rw"), new RandomAccessFile(newnameR, "rw") }; + RandomAccessFile[] rifffile = { + new RandomAccessFile(FileName_Ch1, "rw"), + new RandomAccessFile(FileName_Ch2, "rw") + }; - riffw[0].Length( rifffile[0].length() , (long)(time_counter / 90.0f) ); - riffw[1].Length( rifffile[1].length() , (long)(time_counter / 90.0f) ); + audio.setExtraWaveLength(rifffile[0].length(), tmp_value, 1); + audio.setExtraWaveLength(rifffile[1].length(), tmp_value, 2); rifffile[0].seek(0); rifffile[1].seek(0); - if (AddRiffToMpgAudioL3) - { - rifffile[0].write(riffw[0].ACM()); - - if (MpaConversionMode >= 4) - rifffile[1].write(riffw[1].ACM()); - } - else - { - rifffile[0].write(riffw[0].BWF()); + rifffile[0].write(audio.getExtraWaveHeader(1, false)); - if (MpaConversionMode >= 4) - rifffile[1].write(riffw[1].BWF()); - } + if (MpaConversionMode >= MpaConversion_Mode4) + rifffile[1].write(audio.getExtraWaveHeader(2, false)); rifffile[0].close(); rifffile[1].close(); } - else if (AddRiffToAc3 && es_streamtype == CommonParsing.AC3_AUDIO) + else if (AddWaveHeaderAC3 && es_streamtype == CommonParsing.AC3_AUDIO) { - RandomAccessFile rifffile = new RandomAccessFile(newnameL, "rw"); + RandomAccessFile rifffile = new RandomAccessFile(FileName_Ch1, "rw"); - riffw[0].Length( rifffile.length() , (long)(time_counter / 90.0f) ); + audio.setExtraWaveLength(rifffile.length(), tmp_value, 1); rifffile.seek(0); - rifffile.write(riffw[0].AC3()); + rifffile.write(audio.getExtraWaveHeader(1, false)); rifffile.close(); } else if (es_streamtype == CommonParsing.LPCM_AUDIO) - audio.fillRiffHeader(newnameL); + audio.fillRiffHeader(FileName_Ch1); else if (CreateDDWave && es_streamtype == CommonParsing.AC3_AUDIO) - audio.fillStdRiffHeader(newnameL, (long)(time_counter / 90.0f)); + audio.fillStdRiffHeader(FileName_Ch1, tmp_value); else if (CreateDDWave && es_streamtype == CommonParsing.DTS_AUDIO) - audio.fillStdRiffHeader(newnameL, (long)(time_counter / 90.0f)); + audio.fillStdRiffHeader(FileName_Ch1, tmp_value); + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } - File audioout1 = new File(newnameL); - File audioout2 = new File(newnameR); + /** + * init project files + */ + private void initProjectFiles() + { + if (CreateM2sIndex) + { + OutputStream_Ch1.InitIdd(FileName_Ch1, 2); + OutputStream_Ch2.InitIdd(FileName_Ch2, 2); + } + } - job_processing.countMediaFilesExportLength(audioout1.length()); - job_processing.countMediaFilesExportLength(audioout2.length()); + /** + * determine given stream type + */ + private int determineStreamType(String str) + { + int value = CommonParsing.MPEG_AUDIO; //"mp" std - String audio_type[] = { "(ac3)", "(mp3)", "(mp2)", "(mp1)", "(dts)", "(pcm)" }; + if (str.equals("ac")) //means dts, too + value = CommonParsing.AC3_AUDIO; - if (DecodeMpgAudio) - audio_type[1] = audio_type[2] = "(pcm)"; + else if (str.equals("dt")) //later, other handling + value = CommonParsing.DTS_AUDIO; - String comparedata = ""; + else if (str.equals("wa")) + value = CommonParsing.LPCM_AUDIO; - if (layertype < 0) - layertype = NO_AUDIOSTREAM; + return value; + } - else - comparedata = Resource.getString("audio.msg.audio") + " " + job_processing.countAudioStream() + " " + audio_type[layertype] + ":\t" + frame_counter + " Frames\t" + tc + "\t" + infoPTSMatch(filename_pts, videofile_pts, vptsdata, ptsdata) + cb + "/" + ce + "/" + cc + "/" + cd; + /** + * + */ + private void finishOutputFiles(JobProcessing job_processing, String new_file_out_parent, String new_file_out_child, File tmp_file_out_1, File tmp_file_out_2, String info, IDDBufferedOutputStream output_stream_1, IDDBufferedOutputStream output_stream_2) + { + finishOutputFile(job_processing, null, null, tmp_file_out_2, info, output_stream_2); - /** - * - */ - switch (layertype) + finishOutputFile(job_processing, new_file_out_parent, new_file_out_child, tmp_file_out_1, info, output_stream_1); + } + + /** + * + */ + private void finishOutputFiles(JobProcessing job_processing, String new_file_out_parent, String new_file_out_child_1, String new_file_out_child_2, File tmp_file_out_1, File tmp_file_out_2, String info, IDDBufferedOutputStream output_stream_1, IDDBufferedOutputStream output_stream_2) + { + finishOutputFile(job_processing, new_file_out_parent, new_file_out_child_2, tmp_file_out_2, info, output_stream_2); + + finishOutputFile(job_processing, new_file_out_parent, new_file_out_child_1, tmp_file_out_1, info, output_stream_1); + } + + /** + * + */ + private void finishOutputFile(JobProcessing job_processing, String new_file_out_parent, String new_file_out_child, File tmp_file_out, String info, IDDBufferedOutputStream output_stream) + { + try { + if (new_file_out_parent == null) + { + tmp_file_out.delete(); + + output_stream.deleteIdd(); + + return; + } + + if (new_file_out_child == null) + { + if (tmp_file_out.length() < FileLength_Min) + tmp_file_out.delete(); + + output_stream.deleteIdd(); + + return; + } + + File new_file_out = new File(new_file_out_parent + new_file_out_child); + + if (new_file_out.exists()) + new_file_out.delete(); + + if (tmp_file_out.length() < FileLength_Min) + tmp_file_out.delete(); + + else { - case AC3_AUDIOSTREAM: - if (ac3name.exists()) - ac3name.delete(); + Common.renameTo(tmp_file_out, new_file_out); - if (audioout1.length() < 100) - audioout1.delete(); + Common.setMessage(Resource.getString("msg.newfile", "") + " '" + new_file_out.toString() + "'"); + job_processing.addSummaryInfo(info + "\t'" + new_file_out.toString() + "'"); + } - else - { - Common.renameTo(audioout1, ac3name); + output_stream.renameIddTo(new_file_out); - Common.setMessage(Resource.getString("msg.newfile", "") + " '" + ac3name + "'"); - job_processing.addSummaryInfo(comparedata + "\t'" + ac3name + "'"); - } + } catch (Exception e) { - if (audioout2.length() < 100) - audioout2.delete(); + Common.setExceptionMessage(e); + } + } - audiooutL.renameIddTo(ac3name); - audiooutR.deleteIdd(); - break; + /** + * messages + */ + private void messageSettings() + { + if (IgnoreErrors) + Common.setMessage("-> " + Resource.getString(Keys.KEY_Audio_ignoreErrors[0])); - case MP3_AUDIOSTREAM: - if ( mp3name.exists() ) - mp3name.delete(); + if (AllowSpaces) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_allowSpaces[0])); - if (audioout1.length() < 100) - audioout1.delete(); + if (LimitPts) + Common.setMessage("-> " + Resource.getString(Keys.KEY_Audio_limitPts[0])); - else - { - Common.renameTo(audioout1, mp3name); + if (AllowFormatChanges) + Common.setMessage("-> " + Resource.getString(Keys.KEY_Audio_allowFormatChanges[0])); - Common.setMessage(Resource.getString("msg.newfile", "") + " '" + mp3name + "'"); - job_processing.addSummaryInfo(comparedata + "\t'" + mp3name + "'"); - } + if (ValidateCRC) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_validateCRC[0])); - if (audioout2.length() < 100) - audioout2.delete(); + if (ClearCRC) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_clearCRC[0])); - audiooutL.renameIddTo(mp3name); - audiooutR.deleteIdd(); + if (AC3_Patch1stHeader) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_AC3_patch1stHeader[0])); - break; + if (AC3_ReplaceWithSilence) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_AC3_replaceWithSilence[0])); - case MP2_AUDIOSTREAM: - if (MpaConversionMode >= 4) + if (AC3_BitrateAdaption) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_AC3_BitrateAdaption[0])); + + if (FillGapsWithLastFrame) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_fillGapsWithLastFrame[0])); + + if (AddFrames) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_addFrames[0])); + + if (CreateDDWave) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_createDDWave[0])); + + if (AddWaveHeaderACM) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_addRiffToMpgAudioL3[0])); + + if (AddWaveHeaderBWF) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_addRiffToMpgAudio[0])); + + if (AddWaveHeaderAC3) + Common.setMessage("-> " + Resource.getString(Keys.KEY_AudioPanel_addRiffToAc3[0])); + } + + /** + * settings + */ + private void getSettings(JobCollection collection) + { + Debug = Common.getSettings().getBooleanProperty(Keys.KEY_DebugLog); + Message_2 = Common.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg2); + Message_7 = Common.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg7); + + CreateChapters = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createChapters); + RenameAudio = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_renameAudio); + AddWaveHeaderACM = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addRiffToMpgAudioL3); + AddWaveHeaderBWF = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addRiffToMpgAudio); + AddWaveHeaderAC3 = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addRiffToAc3); + AC3_ReplaceWithSilence = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_AC3_replaceWithSilence); + AC3_Patch1stHeader = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_AC3_patch1stHeader); + AC3_BitrateAdaption = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_AC3_BitrateAdaption); + CreateM2sIndex = collection.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createM2sIndex); + PitchAudio = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_pitchAudio); + AllowSpaces = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_allowSpaces); + ValidateCRC = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_validateCRC); + FillGapsWithLastFrame = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_fillGapsWithLastFrame); + LimitPts = collection.getSettings().getBooleanProperty(Keys.KEY_Audio_limitPts); + AllowFormatChanges = collection.getSettings().getBooleanProperty(Keys.KEY_Audio_allowFormatChanges); + AddFrames = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addFrames); + DownMix = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_Downmix); + ChangeByteorder = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_changeByteorder); + AddRiffHeader = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addRiffHeader); + AddAiffHeader = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_addAiffHeader); + ClearCRC = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_clearCRC); + IgnoreErrors = collection.getSettings().getBooleanProperty(Keys.KEY_Audio_ignoreErrors); + CreateDDWave = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_createDDWave); + FadeInOut = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_fadeInOut); + Normalize = collection.getSettings().getBooleanProperty(Keys.KEY_AudioPanel_Normalize); + + FadeInOutMillis = collection.getSettings().getIntProperty(Keys.KEY_AudioPanel_fadeInOutMillis); + ResampleAudioMode = collection.getSettings().getIntProperty(Keys.KEY_AudioPanel_resampleAudioMode); + PitchValue = collection.getSettings().getIntProperty(Keys.KEY_AudioPanel_PitchValue); + + messageSettings(); + } + + /** + * init FFT/window for mpa decoding for 1 file + */ + private void initDecoder(AudioFormat audio, int es_streamtype) + { + if (es_streamtype != CommonParsing.MPEG_AUDIO) + return; + + if (!DecodeMpgAudio) + return; + + MpaDecoder.init_work(ResampleAudioMode); + MpaDecoder.DOWNMIX = DownMix; + MpaDecoder.MONO = (DownMix || MpaConversionMode == MpaConversion_Mode4); + MpaDecoder.MOTOROLA = ChangeByteorder; + MpaDecoder.WAVE = AddRiffHeader; + + if (AddRiffHeader) + writeChannels(MpaDecoder.RIFF); + + if (AddAiffHeader) + writeChannels(MpaDecoder.AIFF); + } + + /** + * + */ + private int processData(AudioFormat audio, int es_streamtype) + { + int returncode = 0; + + // add preceding wave header + addWaveHeader(audio, es_streamtype); + + // init FFT/window for mpa decoding for 1 file + initDecoder(audio, es_streamtype); + + // init decoding of ancillary data + audio.setAncillaryDataDecoder(Message_7, Debug); + + return returncode; + } + + /** + * PCM Audio + */ + private void processPCMData(JobProcessing job_processing, AudioFormat audio, long[] vptsval, long[] ptsval) + { + // parse header + byte[] array = new byte[1000]; + + readInputStream(array); + + audio.parseHeader(array, 0); + + unreadInputStream(array, audio.getEmphasis(), 1000 - audio.getEmphasis()); + + Common.setMessage(Resource.getString("audio.msg.source", audio.saveAndDisplayHeader()) + " " + formatFrameTime(getTimeCounter())); + + AudioType = WAV_AUDIOSTREAM; + + setFramePosition(audio.getEmphasis()); //start of pcm data + + long pcm_end_pos = audio.getEmphasis() + audio.getSizeBase(); //whole sample data size + + setTimePosition(ptsval[0]); + + writeChannel1(audio.getRiffHeader()); + + long sample_bytes; + long skip_bytes; + long sample_pts; + long skip_pts; + + int sample_size; + int read_size = 960000 / audio.getMode(); + + // Size/8 * Channel = bytes per sample + // 16bit/8 * 2 = 4 + // per sample: Audio.Time_length = 90000.0 / Samplefre + // 48000hz = 1.875 ticks (of 90khz) 1 frame = 192 samples = 360ticks + // 44100hz = 2.040816 + + for (int j = 0; j < ptsval.length - 1; j++) + { + for (int i = 0, k = vptsval.length; i < k; i += 2) + { + while (pause()) + {} + + if (isCancelled(job_processing)) + return; + + //jump back (not yet) or insert silent samples + if (ContainsVideoPTS && vptsval[i] < getTimePosition()) { - if ( mp2nameL.exists() ) - mp2nameL.delete(); + sample_pts = vptsval[i + 1] > getTimePosition() ? getTimePosition() - vptsval[i] : vptsval[i + 1] - vptsval[i]; + sample_bytes = (long) Math.round(1.0 * audio.getSamplingFrequency() * sample_pts / 90000.0) * audio.getMode(); - if ( mp2nameR.exists() ) - mp2nameR.delete(); + if (Debug) + System.out.println("i " + sample_pts + "/" + sample_bytes + "/" + getFramePosition() + "/" + getTimePosition()); - if (audioout2.length() < 100) - audioout2.delete(); + for (long sample_pos = 0; sample_pos < sample_bytes; ) + { + sample_size = (sample_bytes - sample_pos) >= read_size ? read_size : (int)(sample_bytes - sample_pos); - else - { - Common.renameTo(audioout2, mp2nameR); + if (sample_size != array.length) + array = new byte[sample_size]; + + sample_pos += sample_size; - Common.setMessage(Resource.getString("msg.newfile", Resource.getString("audio.msg.newfile.right")) + " '" + mp2nameR + "'"); - job_processing.addSummaryInfo(comparedata + "\t'" + mp2nameR + "'"); + writeChannel1(array); } - if (audioout1.length() < 100) - audioout1.delete(); + countTimeCounter(sample_pts); + FrameExportInfo.countWrittenFrames(sample_bytes / audio.getMode()); - else + Common.setFps(FrameExportInfo.getWrittenFrames()); + + if (vptsval[i + 1] > getTimePosition()) { - Common.renameTo(audioout1, mp2nameL); + sample_pts = vptsval[i + 1] - getTimePosition(); + sample_bytes = (long) Math.round(1.0 * audio.getSamplingFrequency() * sample_pts / 90000.0) * audio.getMode(); - Common.setMessage(Resource.getString("msg.newfile", Resource.getString("audio.msg.newfile.left")) + " '" + mp2nameL + "'"); - job_processing.addSummaryInfo(comparedata + "\t'" + mp2nameL + "'"); - } + if (Debug) + System.out.println("b " + sample_pts + "/" + sample_bytes + "/" + getFramePosition() + "/" + getTimePosition()); - audiooutL.renameIddTo(mp2nameL); - audiooutR.renameIddTo(mp2nameR); + for (long sample_pos = 0; sample_pos < sample_bytes; ) + { + sample_size = (sample_bytes - sample_pos) >= read_size ? read_size : (int)(sample_bytes - sample_pos); + + if (sample_size != array.length) + array = new byte[sample_size]; + + readInputStream(array); + + sample_pos += sample_size; + + writeChannel1(array); + } + + countFramePosition(sample_bytes); + countTimePosition(sample_pts); + countTimeCounter(sample_pts); + FrameExportInfo.countWrittenFrames(sample_bytes / audio.getMode()); + } } else { - if ( mp2name.exists() ) - mp2name.delete(); + skip_pts = ContainsVideoPTS ? vptsval[i] - getTimePosition() : 0; + skip_bytes = (long) Math.round(1.0 * audio.getSamplingFrequency() * skip_pts / 90000.0) * audio.getMode(); - if (audioout1.length() < 100) - audioout1.delete(); + sample_pts = ContainsVideoPTS ? vptsval[i + 1] - vptsval[i] : (long)(1.0 * (audio.getSizeBase() / audio.getMode()) / audio.getSamplingFrequency() * 90000.0); + sample_bytes = (long) Math.round(1.0 * audio.getSamplingFrequency() * sample_pts / 90000.0) * audio.getMode(); - else - { - Common.renameTo(audioout1, mp2name); - - Common.setMessage(Resource.getString("msg.newfile", "") + " '" + mp2name + "'"); - job_processing.addSummaryInfo(comparedata + "\t'" + mp2name + "'"); - } + for (long skip_pos = 0; skip_pos < skip_bytes; ) + skip_pos += skipInputStream(skip_bytes - skip_pos); - if (audioout2.length() < 100) - audioout2.delete(); + countFramePosition(skip_bytes); - audiooutL.renameIddTo(mp2name); - audiooutR.deleteIdd(); - } + if (Debug) + System.out.println("c " + skip_pts + "/" + skip_bytes + "/" + sample_pts + "/" + sample_bytes + "/" + getFramePosition() + "/" + getTimePosition()); - break; + for (long sample_pos = 0; sample_pos < sample_bytes; ) + { + sample_size = (sample_bytes - sample_pos) >= read_size ? read_size : (int)(sample_bytes - sample_pos); - case MP1_AUDIOSTREAM: - if ( mp1name.exists() ) - mp1name.delete(); + if (sample_size != array.length) + array = new byte[sample_size]; - if (audioout1.length() < 100) - audioout1.delete(); + readInputStream(array); - else - { - Common.renameTo(audioout1, mp1name); + sample_pos += sample_size; - Common.setMessage(Resource.getString("msg.newfile", "") + " '" + mp1name + "'"); - job_processing.addSummaryInfo(comparedata + "\t'" + mp1name + "'"); - } + writeChannel1(array); + } - if (audioout2.length() < 100) - audioout2.delete(); + countTimePosition(skip_pts + sample_pts); + countTimeCounter(sample_pts); - audiooutL.renameIddTo(mp1name); - audiooutR.deleteIdd(); + countFramePosition(sample_bytes); + FrameExportInfo.countWrittenFrames(sample_bytes / audio.getMode()); + } - break; + if (Debug) + System.out.println(FrameExportInfo.getSummary() + " @ " + formatFrameTime(getTimeCounter())); - case DTS_AUDIOSTREAM: - if (dtsname.exists()) - dtsname.delete(); + Common.updateProgressBar(getFramePosition(), FileLength); - if (audioout1.length() < 100) - audioout1.delete(); + if (Debug) + System.out.println("FramePosition " + getFramePosition()); + } - else - { - Common.renameTo(audioout1, dtsname); + break; + } + } - Common.setMessage(Resource.getString("msg.newfile", "") + " '" + dtsname + "'"); - job_processing.addSummaryInfo(comparedata + "\t'" + dtsname + "'"); - } + /** + * wri + pre + skip + ins + add + */ + class FrameExportInfo { - if (audioout2.length() < 100) - audioout2.delete(); + private int writtenFrames; + private int preInsertedFrames; + private int skippedFrames; + private int insertedFrames; + private int addedFrames; - audiooutL.renameIddTo(dtsname); - audiooutR.deleteIdd(); + private String head = "Audio Frames: wri-pre-skip-ins-add: "; + private String delim = "-"; - break; + public FrameExportInfo() + { + reset(); + } - case WAV_AUDIOSTREAM: - if (wavname.exists()) - wavname.delete(); + public void reset() + { + writtenFrames = 0; + preInsertedFrames = 0; + skippedFrames = 0; + insertedFrames = 0; + addedFrames = 0; + } - if (audioout1.length() < 100) - audioout1.delete(); + public int getWrittenFrames() + { + return writtenFrames; + } - else - { - Common.renameTo(audioout1, wavname); + public String getSummary() + { + StringBuffer sb = new StringBuffer(head); - Common.setMessage(Resource.getString("msg.newfile", "") + " '" + wavname + "'"); - job_processing.addSummaryInfo(comparedata + "\t'" + wavname + "'"); - } + sb.append(writtenFrames); + sb.append(delim); + sb.append(getShortSummary()); - if (audioout2.length() < 100) - audioout2.delete(); + return sb.toString(); + } - audiooutL.renameIddTo(wavname); - audiooutR.deleteIdd(); + public String getShortSummary() + { + StringBuffer sb = new StringBuffer(); - break; + sb.append(preInsertedFrames); + sb.append(delim); + sb.append(skippedFrames); + sb.append(delim); + sb.append(insertedFrames); + sb.append(delim); + sb.append(addedFrames); - case NO_AUDIOSTREAM: - Common.setMessage(Resource.getString("audio.msg.noaudio")); + return sb.toString(); + } - audioout1.delete(); - audioout2.delete(); - audiooutL.deleteIdd(); - audiooutR.deleteIdd(); + public void countWrittenFrames(long value) + { + writtenFrames += ((int) value); + } - break; - } + public void countWrittenFrames(int value) + { + writtenFrames += value; + } - } catch (IOException e) { + public void countPreInsertedFrames(int value) + { + preInsertedFrames += value; + } - Common.setExceptionMessage(e); + public void countSkippedFrames(int value) + { + skippedFrames += value; } - Common.updateProgressBar(audiosize, audiosize); + public void countInsertedFrames(int value) + { + insertedFrames += value; + } - return false; + public void countAddedFrames(int value) + { + addedFrames += value; + } } - } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessBase.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessBase.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessBase.java 2005-12-27 19:20:10.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessBase.java 2009-07-05 11:26:06.000000000 +0000 @@ -1,8 +1,8 @@ /* - * @(#)StreamParser + * @(#)StreamProcessBase * - * Copyright (c) 2005 by dvb.matt, All rights reserved. + * Copyright (c) 2005-2009 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -49,6 +49,11 @@ public int ERRORCODE = 0; public int MainBufferSize = 8192000; + public static double sync_value_1; + public static double sync_value_2; + public static double sync_value_3; + public static double sync_value_4; + /** * */ @@ -85,6 +90,14 @@ } /** + * pts value to time value + */ + public String formatFrameTime(double time_value) + { + return Common.formatTime_1((long) (time_value / 90.0)); + } + + /** * loadTempVideoPts */ public long[][] loadTempVideoPts(String videofile_pts, boolean debug) @@ -97,30 +110,43 @@ XInputFile xInputFile = new XInputFile(new File(videofile_pts)); - int vlogsize = (int)xInputFile.length() / 16; + int vlogsize = ((int)xInputFile.length() / 16) - 1; long[][] vptsval = new long[2][vlogsize]; - byte[] data = new byte[(int)xInputFile.length()]; + byte[] data = new byte[(int)xInputFile.length() - 16]; int pos = 0; + int j = 0; + boolean reducedPts = Common.getCollection().getSettings().getBooleanProperty(Keys.KEY_Video_cutPts); + try { InputStream pts_file = xInputFile.getInputStream(); + pts_file.skip(16); //header pts_file.read(data, 0, data.length); for (int i = 0; i < vlogsize; i += 2 ) { - vptsval[0][i] = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); + vptsval[0][j] = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); pos += 8; - vptsval[0][i + 1] = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); + vptsval[0][j + 1] = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); pos += 8; - vptsval[1][i] = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); + vptsval[1][j] = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); pos += 8; - vptsval[1][i + 1] = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); + vptsval[1][j + 1] = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); pos += 8; if (debug) - System.out.println("#s " + i + " _" + vptsval[0][i] + " #e " + (i + 1) + " _" + vptsval[0][i + 1] + " /#s " + i + " _" + vptsval[1][i] + " #e " + (i + 1) + " _" + vptsval[1][i + 1]); + System.out.println("#s " + i + " _ " + j + " _ " + vptsval[0][j] + " #e " + (j + 1) + " _" + vptsval[0][j + 1] + " /#s " + i + " _" + vptsval[1][j] + " #e " + (j + 1) + " _" + vptsval[1][j + 1]); + + // ignore equal time boundary + if (reducedPts && j > 0 && Math.abs(vptsval[0][j] - vptsval[0][j - 1]) < 3 && Math.abs(vptsval[1][j] - vptsval[1][j - 1]) < 3) + { + vptsval[0][j - 1] = vptsval[0][j + 1]; + vptsval[1][j - 1] = vptsval[1][j + 1]; + } + else + j += 2; } pts_file.close(); @@ -132,7 +158,23 @@ return null; } - Common.setMessage(Resource.getString("video.msg.pts.start_end", Common.formatTime_1(vptsval[0][0] / 90)) + " " + Common.formatTime_1(vptsval[0][vptsval[0].length - 1] / 90)); + if (j > 0 && j < vlogsize) + { + long[][] vptsval2 = new long[2][j]; + + for (int i = 0; i < j; i++) + { + vptsval2[0][i] = vptsval[0][i]; + vptsval2[1][i] = vptsval[1][i]; + } + + Common.setMessage("-> " + Resource.getString("video.msg.pts.start_end", Common.formatTime_1(vptsval2[0][0] / 90)) + " " + Common.formatTime_1(vptsval2[0][vptsval2[0].length - 1] / 90)); + Common.setMessage("-> check sync at cut gaps only"); + + return vptsval2; + } + + Common.setMessage("-> " + Resource.getString("video.msg.pts.start_end", Common.formatTime_1(vptsval[0][0] / 90)) + " " + Common.formatTime_1(vptsval[0][vptsval[0].length - 1] / 90)); return vptsval; } @@ -157,14 +199,14 @@ ptsval[0][logsize] = -1; ptsval[1][logsize] = -1; - byte[] data = new byte[(int)xInputFile.length()]; + int readbuffer = 512000; // 32000 indices 2*8 + + byte[] data = new byte[readbuffer]; int pos = 0; try { InputStream pts_file = xInputFile.getInputStream(); - pts_file.read(data, 0, data.length); - int aa = 0; long ptsVal; @@ -172,8 +214,15 @@ for (int a = 0; a < logsize; a++) { + if (pos % readbuffer == 0) + { + pts_file.read(data, 0, readbuffer); + pos = 0; + } + ptsVal = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); pos += 8; + ptsPos = CommonParsing.getValue(data, pos, 8, !CommonParsing.BYTEREORDERING); pos += 8; @@ -256,7 +305,7 @@ return null; } - Common.setMessage(Resource.getString(message_3, Common.formatTime_1(ptsval[0][0] / 90)) + " " + Common.formatTime_1(ptsval[0][ptsval[0].length - 2] / 90)); + Common.setMessage("-> " + Resource.getString(message_3, Common.formatTime_1(ptsval[0][0] / 90)) + " " + Common.formatTime_1(ptsval[0][ptsval[0].length - 2] / 90)); return ptsval; } @@ -328,75 +377,108 @@ /** * synccheck A/V */ - public boolean SyncCheck(int[] vw, double timecount, double timelength, long timeline, int mpf, long[] vptsval, long[] vtime, boolean awrite, boolean debug) + public boolean SyncCheck(int[] vw, double timecount, double frametimelength, long timeline, int writtenframes, long[] vptsval, long[] vtime, boolean awrite, boolean debug) + { + return SyncCheck(vw, timecount, frametimelength, timeline, writtenframes, vptsval, vtime, awrite, debug, ""); + } + + /** + * synccheck A/V + */ + public boolean SyncCheck(int[] vw, double timecount, double frametimelength, long timeline, int writtenframes, long[] vptsval, long[] vtime, boolean awrite, boolean debug, String src) { int v = vw[0]; int w = vw[1]; + // w = gop end time index if (w < vptsval.length) { - double ms1 = (double)(timeline - vptsval[w + 1]); - double ms2 = (double)(timecount - vtime[w + 1]); + sync_value_1 = (double)(timeline - vptsval[w + 1]); + sync_value_2 = (double)(timecount - vtime[w + 1]); if (debug) - System.out.println("A " + awrite + "/" + v + "/" + w + "/ =1 " + mpf + "/" + vtime[w + 1] + "/" + timecount + " ~2 " + vptsval[w + 1] + "/" + timeline + " ~3 " + ms1 + "/" + ms2 + "/" + (ms2 - ms1)); + System.out.println("A " + src + " / " + awrite + "/" + v + "/" + w + "/ " + writtenframes + " #nve " + vtime[w + 1] + " /nae " + timecount + " #nvp " + vptsval[w + 1] + " /nap " + timeline + " /sy " + sync_value_2 + "/" + sync_value_1 + "/" + (sync_value_2 - sync_value_1)); - if ( (double)Math.abs(ms2) <= timelength / 2.0 ) + // GOP ende bereinstimmung <= halbe framel舅ge, mit Timecode Diff Auswertung + // schreibpause setzen, n臘hstes gop ende zur berechnung vormerken + if (Math.abs(sync_value_2) <= (frametimelength / 2.0)) { awrite = false; w += 2; } - else if ( (double)Math.abs(ms1) <= timelength / 2.0 ) + // GOP ende bereinstimmung <= halbe framel舅ge, mit PTS Diff Auswertung + // schreibpause setzen, n臘hstes gop ende zur berechnung vormerken + else if (Math.abs(sync_value_1) <= (frametimelength / 2.0)) { awrite = false; w += 2; } if (debug) - System.out.println("B " + awrite + "/" + v + "/" + w); + System.out.println("B " + src + " / " + awrite + "/" + v + "/" + w); } + // v = gop start time index if (v < vptsval.length) { boolean show = false; - double ms3 = (double)(timeline - vptsval[v]); - double ms4 = (double)(timecount - vtime[v]); - if (debug) - System.out.println("C " + awrite + "/" + v + "/" + w + "/ =4 " + mpf + "/" + vtime[v] + "/" + timecount + " ~5 " + vptsval[v] + "/" + timeline + " ~6 " + ms3 + "/" + ms4 + "/" + (ms4 - ms3)); - - if (!awrite && (double)Math.abs(ms3) <= timelength / 2.0 ) + for (; !awrite && v < vptsval.length; v += 2) { - awrite = true; - show = true; - v += 2; - } + sync_value_3 = (double)(timeline - vptsval[v]); // PTS Unterschied, frame start zu gop start + sync_value_4 = (double)(timecount - vtime[v]); // timecode Unterschied, frame start zu gop start + + if (debug) + System.out.println("C " + awrite + "/" + v + "/" + w + "/ " + writtenframes + " #cve " + vtime[v] + " /cae " + timecount + " #cvp " + vptsval[v] + " /cap " + timeline + " /sy " + sync_value_4 + "/" + sync_value_3 + "/" + (sync_value_4 - sync_value_3)); + + // schreibpause, GOP start bereinstimmung <= halbe framel舅ge, mit PTS Diff Auswertung + // schreibpause aufheben, n臘hsten gop start zur berechnung vormerken + if (!awrite && Math.abs(sync_value_3) <= (frametimelength / 2.0)) + { + awrite = true; + show = true; + w = v; + v += 2; + break; + } + + // schreibpause, GOP start bereinstimmung <= halbe framel舅ge, mit Timecode Diff + PTS Auswertung + // schreibpause aufheben, n臘hsten gop start zur berechnung vormerken + else if (!awrite && Math.abs(Math.abs(sync_value_4) - Math.abs(sync_value_3)) <= (frametimelength / 2.0)) + { + awrite = true; + show = true; + w = v; // eine Variable wuerde eigentlich auch reichen + v += 2; + break; + } - else if (!awrite && (double)Math.abs( (double)Math.abs(ms4) - (double)Math.abs(ms3) ) <= timelength / 2.0 ) - { - awrite = true; - show = true; - v += 2; + if (sync_value_3 < 0) + break; } - + if (debug) - System.out.println("D " + awrite + "/" + v + "/" + w); - - if (v < vptsval.length && awrite && (timecount + (timelength / 2.0)) > vtime[v] ) + System.out.println("D " + src + " / " + awrite + "/" + v + "/" + w); + + + // schreibmodus an, halbe framel舅ge + pts start ist gr゚er als n臘hster gop start + // schreibpause + if (v < vptsval.length && awrite && (timecount + (frametimelength / 2.0)) > vtime[v] ) awrite = false; - + if (debug) - System.out.println("E " + awrite + "/" + v + "/" + w); + System.out.println("E " + src + " / " + awrite + "/" + v + "/" + w); if (show && awrite) - Common.getGuiInterface().showAVOffset("" + (int)(ms3 / 90) + "/" + (int)(ms4 / 90) + "/" + (int)((ms4 - ms3) / 90)); + Common.getGuiInterface().showAVOffset("" + (int)(sync_value_3 / 90) + "/" + (int)(sync_value_4 / 90) + "/" + (int)((sync_value_4 - sync_value_3) / 90)); } vw[0] = v; vw[1] = w; + vw[2] = (int) (sync_value_2 - sync_value_1); + vw[3] = (int) (sync_value_4 - sync_value_3); return awrite; } - } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcess.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcess.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcess.java 2005-12-28 16:46:10.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcess.java 2006-07-21 15:04:18.000000000 +0000 @@ -56,6 +56,14 @@ /** * */ + public StreamProcess(int es_streamtype, JobCollection collection, String[] values) + { + process(es_streamtype, collection, new XInputFile(new File(values[0])), values[1], values[2], values[3], 0); + } + + /** + * + */ public StreamProcess(int es_streamtype, JobCollection collection, String filename, String filename_pts, String filename_type, String videofile_pts) { process(es_streamtype, collection, new XInputFile(new File(filename)), filename_pts, filename_type, videofile_pts, 0); diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessLPCMAudio.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessLPCMAudio.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessLPCMAudio.java 2006-01-18 20:59:14.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessLPCMAudio.java 2006-12-03 18:52:48.000000000 +0000 @@ -348,7 +348,7 @@ Common.setMessage(Resource.getString("msg.newfile") + " " + pcmfile); job_processing.countMediaFilesExportLength(pcmfile1.length()); - job_processing.addSummaryInfo(Resource.getString("lpcm.summary", "" + job_processing.countPictureStream(), "" + samples, Common.formatTime_1(playtime)) + infoPTSMatch(filename_pts, videofile_pts, vptsdata, ptsdata) + "\t'" + pcmfile1 + "'"); + job_processing.addSummaryInfo(Resource.getString("lpcm.summary", Common.adaptString(job_processing.countPictureStream(), 2), "" + samples, Common.formatTime_1(playtime)) + infoPTSMatch(filename_pts, videofile_pts, vptsdata, ptsdata) + "\t'" + pcmfile1 + "'"); } } catch (IOException e2) { diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessSubpicture.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessSubpicture.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessSubpicture.java 2006-03-12 01:27:32.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessSubpicture.java 2009-01-31 11:17:40.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)StreamParser * - * Copyright (c) 2005-2006 by dvb.matt, All rights reserved. + * Copyright (c) 2005-2009 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -24,6 +24,11 @@ * */ +/* + * multicolor subtitling patch by Duncan (Shannock9) UK + * 2008-12 + */ + package net.sourceforge.dvb.projectx.parser; import java.io.File; @@ -66,7 +71,8 @@ import net.sourceforge.dvb.projectx.subtitle.Subpicture; import net.sourceforge.dvb.projectx.subtitle.BMP; import net.sourceforge.dvb.projectx.subtitle.Bitmap; -import net.sourceforge.dvb.projectx.subtitle.Teletext; +import net.sourceforge.dvb.projectx.subtitle.Sup2VobSub; +import net.sourceforge.dvb.projectx.subtitle.ColorAreas; //S9 import net.sourceforge.dvb.projectx.thirdparty.Ifo; @@ -93,6 +99,7 @@ private boolean debug; private boolean KeepOriginalTimecode; + private boolean ExportAsVobSub; private boolean UseAdditionalOffset; private boolean ShowSubpictureWindow; private boolean Message_2; @@ -102,10 +109,14 @@ private int X_Offset = 0; private int Y_Offset = 0; private int DisplayMode = 0; + private int ExportType = 0; + private int Pictures = 0; + private int LastPGCSet = 0; private String SubpictureColorModel; private String PageId_Value; private String SubtitleExportFormat; + private String FileParent; /** * @@ -202,11 +213,11 @@ JobProcessing job_processing = collection.getJobProcessing(); String fchild = isElementaryStream == CommonParsing.ES_TYPE ? collection.getOutputName(xInputFile.getName()) : xInputFile.getName(); - String fparent = collection.getOutputNameParent(fchild); + FileParent = collection.getOutputNameParent(fchild); - fparent += isElementaryStream == CommonParsing.ES_TYPE ? Extension : ""; + FileParent += isElementaryStream == CommonParsing.ES_TYPE ? Extension : ""; - String subfile = fparent + ".sup"; + String subfile = FileParent + ".sup"; long size = xInputFile.length(); @@ -223,11 +234,11 @@ long last_pts = 0; int x = 0; - int pics = 0; int v = 0; int packetlength = 0; - int export_type = 0; - int last_pgc_set = 0; + ExportType = 0; + Pictures = 0; + LastPGCSet = 0; boolean vptsdata = false; boolean ptsdata = false; @@ -237,6 +248,7 @@ debug = collection.getSettings().getBooleanProperty(Keys.KEY_DebugLog); KeepOriginalTimecode = isElementaryStream == CommonParsing.ES_TYPE ? true : collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_keepOriginalTimecode); + ExportAsVobSub = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_exportAsVobSub); UseAdditionalOffset = collection.getSettings().getBooleanProperty(Keys.KEY_additionalOffset); ShowSubpictureWindow = collection.getSettings().getBooleanProperty(Keys.KEY_showSubpictureWindow); Message_2 = collection.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg2); @@ -255,7 +267,7 @@ ArrayList subpicture_colormodel = Common.getColorModelsList(); - if (subpicture_colormodel.indexOf(SubpictureColorModel) > 2) + if (subpicture_colormodel.indexOf(SubpictureColorModel) > 2) // 0,1,2 internal user_table = Common.getUserColourTable(SubpictureColorModel); subpicture.reset(); @@ -266,11 +278,11 @@ if (SubtitleExportFormat.equalsIgnoreCase(Keys.ITEMS_SubtitleExportFormat[6].toString())) { - subfile = fparent + ".son"; - export_type = 1; + subfile = FileParent + ".son"; + ExportType = 1; } - Common.setMessage(""); + // Common.setMessage(""); Common.setMessage(Resource.getString("subpicture.msg.output") + " " + subfile.substring(subfile.length() - 3)); PushbackInputStream in = new PushbackInputStream(xInputFile.getInputStream(), 65536); @@ -282,7 +294,7 @@ Common.setMessage(Resource.getString("subpicture.msg.tmpfile", xInputFile.getName(), "" + size)); // SUP with changed settings - if (export_type == 0) + if (ExportType == 0) { subpicture.set_XY_Offset(X_Offset, Y_Offset); subpicture.setDisplayMode(DisplayMode); @@ -490,81 +502,7 @@ DVBpicture = true; if (display_time == -1) // -1 full data, -2 forced end_time - { - String num = "00000" + pics; - String outfile_base = fparent + "_st" + num.substring(num.length() - 5); - - String key, object_id_str, outfile; - int object_id; - - for (Enumeration e = BMP.getKeys(); e.hasMoreElements() ; ) - { - key = e.nextElement().toString(); - object_id = Integer.parseInt(key); - object_id_str = Integer.toHexString(object_id).toUpperCase(); - outfile = outfile_base + "p" + object_id_str; - - Bitmap bitmap = BMP.getBitmap(object_id); - - if (export_type == 0) //.sup - out.write( subpicture.writeRLE(bitmap)); - - else //.son + .bmp - { - if (pics == 0) - { - String[] SONhead = Teletext.getSONHead(new File(subfile).getParent(), (long)CommonParsing.getVideoFramerate()); - - for (int a=0; a < SONhead.length; a++) - print_out.println(SONhead[a]); - } - - subpicture.updateUserColorTable(bitmap); - outfile = BMP.buildBMP_palettized(outfile, bitmap, subpicture.getUserColorTable(), 256); - - job_processing.countMediaFilesExportLength(new File(outfile).length()); - - int pgc_values = subpicture.setPGClinks(); - - // a change in color_links - if ((0xFFFF & pgc_values) != (0xFFFF & last_pgc_set)) - { - String pgc_colors = ""; - - for (int a = 0; a < 4; a++) - pgc_colors += "" + (0xF & pgc_values>>>(a * 4)) + " "; - - print_out.println("Color\t\t(" + pgc_colors.trim() + ")"); - } - - // a change in alpha_links - if ((0xFFFF0000 & pgc_values) != (0xFFFF0000 & last_pgc_set)) - { - String pgc_alphas = ""; - - for (int a = 0; a < 4; a++) - pgc_alphas += "" + (0xF & pgc_values>>>((4 + a) * 4)) + " "; - - print_out.println("Contrast\t(" + pgc_alphas.trim() + ")"); - } - - last_pgc_set = pgc_values; - - print_out.println("Display_Area\t(" + Common.adaptString(bitmap.getX(), 3) + " " + Common.adaptString(bitmap.getY(), 3) + " " + Common.adaptString(bitmap.getMaxX(), 3) + " " + Common.adaptString(bitmap.getMaxY(), 3) + ")"); - print_out.println(outfile_base.substring(outfile_base.length() - 4) + "\t\t" + Common.formatTime_2(bitmap.getInTime() / 90, (long)CommonParsing.getVideoFramerate()) + "\t" + Common.formatTime_2((bitmap.getInTime() / 90) + (bitmap.getPlayTime() * 10), (long)CommonParsing.getVideoFramerate()) + "\t" + new File(outfile).getName()); - } - - //Common.setMessage(subpicture.getArea()); - //BMP.buildBMP_24bit(outfile, key); - - Common.getGuiInterface().setSubpictureTitle(" " + Resource.getString("subpicture.preview.title.dvbexport", "" + bitmap.getPageId(), "" + pics, Common.formatTime_1(new_pts / 90)) + " " + Common.formatTime_1(bitmap.getPlayTime() * 10)); - } - - if (!BMP.isEmpty()) - Common.getGuiInterface().showExportStatus(Resource.getString("subpicture.status"), ++pics); - - BMP.clear(); - } + process_dvbsubpicture(job_processing, print_out, out, subpicture, subfile, new_pts); } else if (write) //dvd_subpic @@ -578,20 +516,37 @@ out.write(packet); - Common.getGuiInterface().showExportStatus(Resource.getString("subpicture.status"), ++pics); - Common.getGuiInterface().setSubpictureTitle(" " + Resource.getString("subpicture.preview.title.dvdexport", "" + pics, Common.formatTime_1(new_pts / 90)) + " " + Common.formatTime_1(display_time / 90)); + Common.getGuiInterface().showExportStatus(Resource.getString("subpicture.status"), ++Pictures); + Common.getGuiInterface().setSubpictureTitle(" " + Resource.getString("subpicture.preview.title.dvdexport", "" + Pictures, Common.formatTime_1(new_pts / 90)) + " " + Common.formatTime_1(display_time / 90)); String str = subpicture.isForced_Msg(); if (str != null) - Common.setMessage(str + " " + Resource.getString("subpicture.msg.forced") + " " + pics); + Common.setMessage(str + " " + Resource.getString("subpicture.msg.forced") + " " + Pictures); } else Common.getGuiInterface().setSubpictureTitle(" " + Resource.getString("subpicture.preview.title.noexport")); if (debug) - System.out.println(" -> " + write + "/ " + v + "/ " + new_pts + "/ " + time_difference + "/ " + pics + "/ " + display_time); + { + System.out.println("-> wr " + write + " /v " + v + " /npts " + new_pts + " /tdif " + time_difference + " /pic " + Pictures + " /dtim " + display_time); + System.out.println(""); + } + } + + // check whether there is still a pic waiting from dvb subpic , assume max 10sec display time + if (display_time == -2) + { + // if ((display_time = subpicture.decode_picture(packet, 10, Common.getGuiInterface().isSubpictureVisible(), job_processing.getStatusStrings(), new_pts + 1024000, write, Common.getGuiInterface().isSubpictureVisible())) < -2) + if ((display_time = subpicture.decode_picture(packet, 10, Common.getGuiInterface().isSubpictureVisible(), job_processing.getStatusStrings(), -1, write, Common.getGuiInterface().isSubpictureVisible())) < -2) + Common.setMessage(Resource.getString("subpicture.msg.error", subdecode_errors[Math.abs((int)display_time)], String.valueOf(count - packetlength))); + + if (debug) + System.out.println("last picture in memory PTS: source " + Common.formatTime_1(source_pts / 90) + "(" + source_pts + ")" + " /new " + Common.formatTime_1((new_pts) / 90) + "(" + new_pts + ")" + " / write: " + write + " / dec.state: " + display_time); + + if (display_time == -1) + process_dvbsubpicture(job_processing, print_out, out, subpicture, subfile, new_pts); } in.close(); @@ -605,9 +560,9 @@ if (filename_pts.equals("-1")) Common.setMessage(Resource.getString("subpicture.msg.pts.start_end", Common.formatTime_1(first_pts / 90)) + " " + Common.formatTime_1(source_pts / 90)); - Common.setMessage(Resource.getString("subpicture.msg.summary", "" + pics)); + Common.setMessage(Resource.getString("subpicture.msg.summary", "" + Pictures)); - if (!DVBpicture && export_type == 1) + if (!DVBpicture && ExportType == 1) { String renamed_file = subfile.substring(0, subfile.length() - 3) + "sup"; Common.renameTo(subfile, renamed_file); @@ -616,20 +571,28 @@ File subfile1 = new File(subfile); - if (pics == 0) + if (Pictures == 0) subfile1.delete(); else { - if (DVBpicture && export_type == 0) - job_processing.countMediaFilesExportLength(Ifo.createIfo(subfile, subpicture.getUserColorTableArray())); - - else if (DVBpicture && export_type == 1) - job_processing.countMediaFilesExportLength(new File( BMP.write_ColorTable(fparent, subpicture.getUserColorTable(), 256)).length()); + if (DVBpicture && ExportType == 0) + { + if (ColorAreas.active) //multicolor DVB to SUP active //S9 + job_processing.countMediaFilesExportLength(Ifo.createIfo(subfile, ColorAreas.clut_pgc)); //S9 + else + job_processing.countMediaFilesExportLength(Ifo.createIfo(subfile, subpicture.getUserColorTableArray())); //S9 + } + else if (DVBpicture && ExportType == 1) + job_processing.countMediaFilesExportLength(new File( BMP.write_ColorTable(FileParent, subpicture.getUserColorTable(), 256)).length()); Common.setMessage(Resource.getString("msg.newfile") + " " + subfile); job_processing.countMediaFilesExportLength(subfile1.length()); - job_processing.addSummaryInfo(Resource.getString("subpicture.summary", "" + job_processing.countPictureStream(), "" + pics, infoPTSMatch(filename_pts, videofile_pts, vptsdata, ptsdata)) + "'" + subfile1 + "'"); + job_processing.addSummaryInfo(Resource.getString("subpicture.summary", Common.adaptString(job_processing.countPictureStream(), 2), "" + Pictures, infoPTSMatch(filename_pts, videofile_pts, vptsdata, ptsdata)) + "'" + subfile1 + "'"); + + //vobsub + if (ExportType == 0 && ExportAsVobSub) + new Sup2VobSub(subfile, subpicture.getUserColorTableArray()); } Common.updateProgressBar(size, size); @@ -641,7 +604,92 @@ if (ShowSubpictureWindow) Common.getGuiInterface().hideSubpicture(); + + ColorAreas.active = false; //S9 } + private void process_dvbsubpicture(JobProcessing job_processing, PrintStream print_out, IDDBufferedOutputStream out, Subpicture subpicture, String subfile, long new_pts) + { + try { + String num = "00000" + Pictures; + String outfile_base = FileParent + "_st" + num.substring(num.length() - 5); + + String key, object_id_str, outfile; + int object_id; + + for (Enumeration e = BMP.getKeys(); e.hasMoreElements() ; ) + { + key = e.nextElement().toString(); + + object_id = Integer.parseInt(key); + object_id_str = Integer.toHexString(object_id).toUpperCase(); + outfile = outfile_base + "p" + object_id_str; + + Bitmap bitmap = BMP.getBitmap(object_id); + + if (ExportType == 0) //.sup + out.write( subpicture.writeRLE(bitmap)); + + else //.son + .bmp + { + if (Pictures == 0) + { + String[] SONhead = Common.getTeletextClass().getSONHead(new File(subfile).getParent(), (long)CommonParsing.getVideoFramerate()); + + for (int a=0; a < SONhead.length; a++) + print_out.println(SONhead[a]); + } + + subpicture.updateUserColorTable(bitmap); + outfile = BMP.buildBMP_palettized(outfile, bitmap, subpicture.getUserColorTable(), 256); + + job_processing.countMediaFilesExportLength(new File(outfile).length()); + + int pgc_values = subpicture.setPGClinks(); + + // a change in color_links + if ((0xFFFF & pgc_values) != (0xFFFF & LastPGCSet)) + { + String pgc_colors = ""; + + for (int a = 0; a < 4; a++) + pgc_colors += "" + (0xF & pgc_values>>>(a * 4)) + " "; + + print_out.println("Color\t\t(" + pgc_colors.trim() + ")"); + } + + // a change in alpha_links + if ((0xFFFF0000 & pgc_values) != (0xFFFF0000 & LastPGCSet)) + { + String pgc_alphas = ""; + + for (int a = 0; a < 4; a++) + pgc_alphas += "" + (0xF & pgc_values>>>((4 + a) * 4)) + " "; + + print_out.println("Contrast\t(" + pgc_alphas.trim() + ")"); + } + + LastPGCSet = pgc_values; + + print_out.println("Display_Area\t(" + Common.adaptString(bitmap.getX(), 3) + " " + Common.adaptString(bitmap.getY(), 3) + " " + Common.adaptString(bitmap.getMaxX(), 3) + " " + Common.adaptString(bitmap.getMaxY(), 3) + ")"); + print_out.println(outfile_base.substring(outfile_base.length() - 4) + "\t\t" + Common.formatTime_2(bitmap.getInTime() / 90, (long)CommonParsing.getVideoFramerate()) + "\t" + Common.formatTime_2((bitmap.getInTime() / 90) + (bitmap.getPlayTime() * 10), (long)CommonParsing.getVideoFramerate()) + "\t" + new File(outfile).getName()); + + if (debug) + System.out.println("-> " + outfile); + } + + Common.getGuiInterface().setSubpictureTitle(" " + Resource.getString("subpicture.preview.title.dvbexport", "" + bitmap.getPageId(), "" + Pictures, Common.formatTime_1(new_pts / 90)) + " " + Common.formatTime_1(bitmap.getPlayTime() * 10)); + } + + if (!BMP.isEmpty()) + Common.getGuiInterface().showExportStatus(Resource.getString("subpicture.status"), ++Pictures); + + BMP.clear(); + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessTeletext.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessTeletext.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StreamProcessTeletext.java 2006-03-25 20:12:42.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StreamProcessTeletext.java 2009-07-25 18:20:58.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)StreamParser * - * Copyright (c) 2005-2006 by dvb.matt, All rights reserved. + * Copyright (c) 2005-2009 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -41,6 +41,7 @@ import java.util.Hashtable; import java.util.Date; import java.util.TimeZone; +import java.util.StringTokenizer; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -65,6 +66,7 @@ import net.sourceforge.dvb.projectx.subtitle.Teletext; import net.sourceforge.dvb.projectx.subtitle.UnicodeWriter; import net.sourceforge.dvb.projectx.subtitle.Subpicture; +import net.sourceforge.dvb.projectx.subtitle.Sup2VobSub; import net.sourceforge.dvb.projectx.thirdparty.Ifo; @@ -121,10 +123,14 @@ boolean ExportTextAsUTF8 = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_exportTextAsUTF8); boolean DecodeHiddenRows = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_decodeHiddenRows); boolean KeepOriginalTimecode = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_keepOriginalTimecode); -//test - boolean SpecialTermination = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_specialTermination); + boolean ExportAsVobSub = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_exportAsVobSub); + boolean BoxedMode = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_TtxExportBoxedOnly); + boolean TextAlignment = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_useTextAlignment); - //String SubtitleExportFormat = collection.getSettings().getProperty(Keys.KEY_SubtitleExportFormat); +// boolean SpecialTermination = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_specialTermination); + boolean SpecialTermination = true; + + boolean KeepColourTable = collection.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_keepColourTable); String SubtitleFont = collection.getSettings().getProperty(Keys.KEY_SubtitleFont); String Format_SUP_Values = collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_Format_SUP_Values); @@ -132,37 +138,85 @@ JobProcessing job_processing = collection.getJobProcessing(); Subpicture subpicture = Common.getSubpictureClass(); + Teletext teletext = Common.getTeletextClass(); if (ShowSubpictureWindow && (SubtitleExportFormat.equalsIgnoreCase(Keys.ITEMS_SubtitleExportFormat[6].toString()) || SubtitleExportFormat.equalsIgnoreCase(Keys.ITEMS_SubtitleExportFormat[7].toString()))) Common.getGuiInterface().showSubpicture(); if (SubtitleExportFormat.equalsIgnoreCase(Keys.ITEMS_SubtitleExportFormat[7].toString()) || SubtitleExportFormat.equalsIgnoreCase(Keys.ITEMS_SubtitleExportFormat[6].toString())) // SUP + SON, set variables - SUP_Offset = subpicture.set(SubtitleFont, Format_SUP_Values); + SUP_Offset = subpicture.set(SubtitleFont, Format_SUP_Values, KeepColourTable); + + ArrayList userdefined_pages = new ArrayList(); + + userdefined_pages.add(collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage1)); + userdefined_pages.add(collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage2)); + userdefined_pages.add(collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage3)); + userdefined_pages.add(collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage4)); + userdefined_pages.add(collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage5)); + userdefined_pages.add(collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage6)); + userdefined_pages.add(collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage7)); + userdefined_pages.add(collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage8)); + + String page_list = ""; + + // read "777,888-890,150" etc + // read all pages and expand sparated pages 888,889,890 etc, if exists + for (int i = 0, ix = 0; i < userdefined_pages.size(); i++) + { + page_list = userdefined_pages.get(i).toString(); + + ix = page_list.indexOf(","); - String[] userdefined_pages = { - collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage1), - collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage2), - collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage3), - collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage4), - collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage5), - collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage6), - collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage7), - collection.getSettings().getProperty(Keys.KEY_SubtitlePanel_TtxPage8) - }; + if (ix > 0) // separated values + { + StringTokenizer st = new StringTokenizer(page_list, ","); + + userdefined_pages.remove(i); - for (int pn = 0; pn < userdefined_pages.length; pn++) + while (st.hasMoreTokens()) + userdefined_pages.add(i, st.nextToken()); + } + } + + // read all pages and expand 888-890 etc, if exists + for (int i = 0, ix = 0, firstvalue = 0, lastvalue = 0; i < userdefined_pages.size(); i++) + { + page_list = userdefined_pages.get(i).toString(); + + ix = page_list.indexOf("-"); + + if (ix > 0) // values are in Hex + { + try { + + firstvalue = Integer.parseInt(page_list.substring(0, ix), 16); + lastvalue = Integer.parseInt(page_list.substring(ix + 1), 16); + + userdefined_pages.remove(i); + + for (int j = lastvalue; j >= firstvalue; j--) + userdefined_pages.add(i, Integer.toHexString(j).toUpperCase()); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } + } + + + for (int pn = 0; pn < userdefined_pages.size(); pn++) { String page = "0"; if (!DecodeMegaradio) { - page = userdefined_pages[pn]; + page = userdefined_pages.get(pn).toString(); if (page.equalsIgnoreCase("null")) continue; } else - pn = userdefined_pages.length; + pn = userdefined_pages.size(); String fchild = xInputFile.getName(); String fparent = collection.getOutputNameParent(fchild); @@ -171,7 +225,7 @@ Common.getGuiInterface().initTtxPageMatrix(fchild); - Teletext.clearEnhancements(); + teletext.clearEnhancements(); if (!DecodeMegaradio) fparent += "[" + page + "]"; @@ -250,11 +304,16 @@ if (DecodeHiddenRows) Common.setMessage("-> " + Resource.getString(Keys.KEY_SubtitlePanel_decodeHiddenRows[0])); + if (BoxedMode) + Common.setMessage("-> " + Resource.getString(Keys.KEY_SubtitlePanel_TtxExportBoxedOnly[0])); + if (KeepOriginalTimecode) Common.setMessage("-> " + Resource.getString(Keys.KEY_SubtitlePanel_keepOriginalTimecode[0])); - if (SpecialTermination) - Common.setMessage("-> " + Resource.getString(Keys.KEY_SubtitlePanel_specialTermination[0])); + // if (SpecialTermination) + // Common.setMessage("-> " + Resource.getString(Keys.KEY_SubtitlePanel_specialTermination[0])); + if (KeepColourTable) + Common.setMessage("-> " + Resource.getString(Keys.KEY_SubtitlePanel_keepColourTable[0])); DateFormat timeformat_1 = new SimpleDateFormat("HH:mm:ss.SSS"); @@ -336,7 +395,7 @@ break; case EXPORT_SSA: - String[] SSAhead = Teletext.getSSAHead(); + String[] SSAhead = teletext.getSSAHead(); for (int a = 0; a < SSAhead.length; a++) print_buffer.println(SSAhead[a]); @@ -347,7 +406,7 @@ break; case EXPORT_STL: - String[] STLhead = Teletext.getSTLHead(Common.getVersionName() + " on " + DateFormat.getDateInstance(DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()))); + String[] STLhead = teletext.getSTLHead(Common.getVersionName() + " on " + DateFormat.getDateInstance(DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()))); for (int a = 0; a < STLhead.length; a++) print_buffer.println(STLhead[a]); @@ -358,7 +417,7 @@ break; case EXPORT_SON: //DM14052004 081.7 int02 add, still unused! - String[] SONhead = Teletext.getSONHead(new File(ttxfile).getParent(), (long)CommonParsing.getVideoFramerate()); + String[] SONhead = teletext.getSONHead(new File(ttxfile).getParent(), (long)CommonParsing.getVideoFramerate()); for (int a = 0; a < SONhead.length; a++) print_buffer.println(SONhead[a]); @@ -409,6 +468,7 @@ boolean missing_syncword = false; boolean vps = false; + boolean wss = false; boolean page_match = false; boolean lastpage_match = false; @@ -430,6 +490,7 @@ String provider = ""; String program_title = ""; String vps_str = ""; + String wss_str = ""; readloop: while ( count < size ) @@ -505,6 +566,7 @@ count += 46; vps = false; + wss = false; valid = false; data_unit_id = 0xFF & packet[0]; @@ -520,6 +582,11 @@ vps = true; break; + case 0xC4: // WSS + valid = true; + wss = true; + break; + case 0xFF: // hidden if (DecodeHiddenRows) valid = true; @@ -527,7 +594,7 @@ default: // others, unknown if (debug) - System.out.println(" unkn_"+Integer.toHexString(0xFF & packet[0])+"/"+(count-46)); + System.out.println(" unkn_" + Integer.toHexString(0xFF & packet[0]) + "/" + (count - 46)); //continue readloop; } @@ -535,6 +602,7 @@ if (debug) { System.out.println(); + System.out.println("pos: " + (count - 46)); for (int a = 0; a < 46; a++) System.out.print(" " + ((0xFF & packet[a])<0x10 ? "0" : "") + Integer.toHexString(0xFF & packet[a]).toUpperCase()); @@ -547,61 +615,91 @@ vbi = ((0x20 & packet[2]) != 0 ? 0 : 313) + (0x1F & packet[2]); - if (!vps) + if (vps) { - tmp_int_value = (Teletext.hamming_8_4(packet[4]))<<4 | Teletext.hamming_8_4(packet[5]); + if ((0x3F & packet[2]) != 0x30) + continue readloop; - if (tmp_int_value < 0) // decode error - { - row = -1; - magazine = -1; - } + /** + * show vps status of VBI 16 in GUI + */ + String str = VBI.decodeVPS(packet, 2); - else + if (str != null && !str.equals(vps_str)) { - // row = 0xFF & Teletext.bytereverse((byte)((0xF & Teletext.hamming_8_4(packet[4]))<<4 | (0xF & Teletext.hamming_8_4(packet[5])))); + vps_str = str; - row = 0xFF & Teletext.bytereverse((byte) tmp_int_value); - magazine = (7 & row) == 0 ? 8 : (7 & row); - row >>>= 3; + if (Common.getSettings().getBooleanProperty(Keys.KEY_showTtxHeader)) //interactive checkbox + Common.getGuiInterface().updateVpsLabel(vps_str); + + Common.setMessage(Resource.getString("teletext.msg.vps", str) + " " + Common.formatTime_1(source_pts / 90)); } + + continue readloop; } - else + else if (wss) { - if ((0x3F & packet[2]) != 0x30) + if ((0x3F & packet[2]) != 0x37) + continue readloop; + + if (!Common.getSettings().getBooleanProperty(Keys.KEY_MessagePanel_Msg5)) //interactive checkbox continue readloop; /** - * show vps status of VBI 16 in GUI + * show wss status of VBI 23 in GUI */ - String str = VBI.decodeVPS(packet, 2); + String str = VBI.decodeWSS(packet, 2); - if (str != null && !str.equals(vps_str)) + if (str != null && !str.equals(wss_str)) { - vps_str = str; + wss_str = str; - if (collection.getSettings().getBooleanProperty(Keys.KEY_showTtxHeader)) //interactive checkbox - Common.getGuiInterface().updateVpsLabel(vps_str); + if (wss_str.length() == 0) + Common.setMessage("-> WSS Status - no change @ PTS " + Common.formatTime_1(source_pts / 90)); - Common.setMessage(Resource.getString("teletext.msg.vps", str) + " " + Common.formatTime_1(source_pts / 90)); + else + { + Common.setMessage("-> WSS Status - changed @ PTS " + Common.formatTime_1(source_pts / 90)); + Common.setMessage(wss_str); + } } continue readloop; } + else + { + tmp_int_value = (teletext.hamming_8_4(packet[4]))<<4 | teletext.hamming_8_4(packet[5]); + + if (tmp_int_value < 0) // decode error + { + row = -1; + magazine = -1; + } + + else + { + // row = 0xFF & teletext.bytereverse((byte)((0xF & teletext.hamming_8_4(packet[4]))<<4 | (0xF & teletext.hamming_8_4(packet[5])))); + + row = 0xFF & teletext.bytereverse((byte) tmp_int_value); + magazine = (7 & row) == 0 ? 8 : (7 & row); + row >>>= 3; + } + } + // X3/31.1 ttx provider if (magazine == 3 && row == 31 && packet[7] == 0x40 && packet[8] == 0x57 && provider.equals("")) { - provider = Teletext.makestring(packet, 10, 34, 31, 0, 0, false).trim(); + provider = teletext.buildString(packet, 10, 34, 31, 0, 0, false).trim(); Common.setMessage(Resource.getString("teletext.msg.provider") + " " + provider); } // X8/30.0 program title else if (magazine == 8 && row == 30 && packet[7] == (byte)0xA8) { - String str = Teletext.makestring(packet, 26, 20, 30, 0, 0, true).trim() + " "; + String str = teletext.buildString(packet, 26, 20, 30, 0, 0, true).trim() + " "; if (!str.equals(program_title)) { @@ -616,10 +714,10 @@ int flag = 0; for (int a = 0; a < 6; a++) - flag |= (0xF & Teletext.bytereverse((byte) Teletext.hamming_8_4(packet[8+a]) )>>>4 ) <<(a*4); + flag |= (0xF & teletext.bytereverse((byte) teletext.hamming_8_4(packet[8+a]) )>>>4 ) <<(a*4); - page_number = Integer.toHexString(0xF & Teletext.bytereverse((byte) Teletext.hamming_8_4(packet[7]) )>>>4 ).toUpperCase() + - Integer.toHexString(0xF & Teletext.bytereverse((byte) Teletext.hamming_8_4(packet[6]) )>>>4 ).toUpperCase(); + page_number = Integer.toHexString(0xF & teletext.bytereverse((byte) teletext.hamming_8_4(packet[7]) )>>>4 ).toUpperCase() + + Integer.toHexString(0xF & teletext.bytereverse((byte) teletext.hamming_8_4(packet[6]) )>>>4 ).toUpperCase(); int o[] = { 0xF, 7, 0xF, 3 }; subpage_number = ""; @@ -654,11 +752,11 @@ Common.getGuiInterface().updateTtxPageMatrix("" + magazine + page_number); // show header_line in GUI - if (collection.getSettings().getBooleanProperty(Keys.KEY_showTtxHeader) || debug) + if (Common.getSettings().getBooleanProperty(Keys.KEY_showTtxHeader) || debug) { - String str = magazine + page_number + " " + subpage_number + " " + Teletext.makestring(packet, 14, 32, 0, (7 & flag>>>21), 0, true) + " " + program_title; + String str = magazine + page_number + " " + subpage_number + " " + teletext.buildString(packet, 14, 32, 0, (7 & flag>>>21), 0, true) + " " + program_title; - if (collection.getSettings().getBooleanProperty(Keys.KEY_showTtxHeader)) //interactive checkbox + if (Common.getSettings().getBooleanProperty(Keys.KEY_showTtxHeader)) //interactive checkbox Common.getGuiInterface().updateTtxHeader(str); if (debug) @@ -802,8 +900,8 @@ break; case EXPORT_SC: // SC - print_buffer.print( Teletext.SMPTE( timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + "&"); - print_buffer.print( Teletext.SMPTE( timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + "#"); + print_buffer.print( teletext.SMPTE( timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + "&"); + print_buffer.print( teletext.SMPTE( timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + "#"); break; case EXPORT_SUB: // SUB @@ -818,13 +916,13 @@ break; case EXPORT_SSA: // SSA - print_buffer.print( Teletext.getSSALine()[0] + timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ).substring(1, 11) + ","); - print_buffer.print( timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ).substring(1, 11) + Teletext.getSSALine()[1]); + print_buffer.print( teletext.getSSALine()[0] + timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ).substring(1, 11) + ","); + print_buffer.print( timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ).substring(1, 11) + teletext.getSSALine()[1]); break; case EXPORT_STL: // STL - print_buffer.print( Teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + ","); - print_buffer.print( Teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + ","); + print_buffer.print( teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + ","); + print_buffer.print( teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + ","); break; case EXPORT_SUP: // SUP @@ -950,7 +1048,7 @@ else write_buffer.put("active", "1"); - Teletext.clearEnhancements(); + teletext.clearEnhancements(); load_buffer.clear(); } @@ -986,7 +1084,7 @@ if (row > 23 && subtitle_type != 0) { if (row == 29 || loadpage) - Teletext.setEnhancements(packet, row, character_set); + teletext.setEnhancements(packet, row, character_set); continue readloop; } @@ -997,7 +1095,7 @@ if (subtitle_type == MEGARADIO) // megaradio, simple decode the bytes of row 1..23 { for (int b = (row == 1) ? 17: 0; row < 24 && b < 39; b++) // framebytes to MSB - out.write(Teletext.bytereverse(packet[7+b])); + out.write(teletext.bytereverse(packet[7+b])); continue readloop; } @@ -1010,22 +1108,22 @@ switch (subtitle_type) { case EXPORT_TEXT: - str = Teletext.makestring(packet, 6, 40, row, character_set, 0, true); + str = teletext.buildString(packet, 6, 40, row, character_set, 0, true, BoxedMode); break; case EXPORT_SC: case EXPORT_STL: case EXPORT_SUB: case EXPORT_SRT: - str = Teletext.makestring(packet, 6, 40, row, character_set, 0, true).trim(); + str = teletext.buildString(packet, 6, 40, row, character_set, 0, true, BoxedMode).trim(); break; case EXPORT_SSA: - str = Teletext.makestring(packet, 6, 40, row, character_set, 1, true).trim(); + str = teletext.buildString(packet, 6, 40, row, character_set, 1, true, BoxedMode).trim(); break; case EXPORT_SUP: - picture_data = Teletext.makepic(packet, 6, 40, row, character_set, true); + picture_data = teletext.buildCharArray(packet, 6, 40, row, character_set, true, BoxedMode, TextAlignment); } if (str != null && !str.equals("")) @@ -1064,8 +1162,8 @@ break; case EXPORT_SC: // SC - print_buffer.print( Teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + "&"); - print_buffer.print( Teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + "#"); + print_buffer.print( teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + "&"); + print_buffer.print( teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + "#"); break; case EXPORT_SUB: // SUB @@ -1080,13 +1178,13 @@ break; case EXPORT_SSA: // SSA - print_buffer.print( Teletext.getSSALine()[0] + timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ).substring(1, 11) + ","); - print_buffer.print( timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ).substring(1, 11) + Teletext.getSSALine()[1]); + print_buffer.print( teletext.getSSALine()[0] + timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ).substring(1, 11) + ","); + print_buffer.print( timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ).substring(1, 11) + teletext.getSSALine()[1]); break; case EXPORT_STL: // STL - print_buffer.print( Teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + ","); - print_buffer.print( Teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + ","); + print_buffer.print( teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("in_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + ","); + print_buffer.print( teletext.SMPTE(timeformat_1.format( new Date( Long.parseLong( write_buffer.get("out_time").toString()) / 90) ), (long)CommonParsing.getVideoFramerate()) + ","); break; case EXPORT_SUP: // SUP @@ -1206,7 +1304,11 @@ Ifo.createIfo(ttxfile, subpicture.getUserColorTableArray()); job_processing.countMediaFilesExportLength(ttxfile1.length()); - job_processing.addSummaryInfo(Resource.getString("teletext.summary", "" + job_processing.countPictureStream(), "" + seiten, "" + page, infoPTSMatch(filename_pts, videofile_pts, vptsdata, ptsdata)) + "'" + ttxfile1 + "'"); + job_processing.addSummaryInfo(Resource.getString("teletext.summary", Common.adaptString(job_processing.countPictureStream(), 2), "" + seiten, "" + page, infoPTSMatch(filename_pts, videofile_pts, vptsdata, ptsdata)) + "'" + ttxfile1 + "'"); + + //vobsub + if (subtitle_type == EXPORT_SUP && ExportAsVobSub) + new Sup2VobSub(ttxfile, subpicture.getUserColorTableArray()); } } catch (IOException e2) { diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StripMedion.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StripMedion.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StripMedion.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StripMedion.java 2007-07-02 15:41:04.000000000 +0000 @@ -0,0 +1,282 @@ +/* + * @(#)StripMedion + * + * Copyright (c) 2007 by dvb.matt, All rights reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.parser; + +import java.io.PushbackInputStream; +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.File; + +import java.util.Hashtable; +import java.util.ArrayList; +import java.util.Enumeration; + +import net.sourceforge.dvb.projectx.xinput.XInputFile; + +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Keys; + +import net.sourceforge.dvb.projectx.parser.CommonParsing; + +public class StripMedion extends Object { + + private boolean debug = false; + private int aux_number = 1; + private String stripped = "[stripped]"; + private String parent = ""; + + private Hashtable out_streams; + private BufferedOutputStream out; + private MedionStreamObject mso; + + /** + * + */ + public StripMedion() + { + debug = Common.getSettings().getBooleanProperty(Keys.KEY_DebugLog); + out_streams = new Hashtable(); + } + + /** + * + */ + public XInputFile[] process(XInputFile xInputFile, String output) + { + if (output.startsWith("[res]")) + output = xInputFile.getParent(); + + parent = output + System.getProperty("file.separator") + xInputFile.getName(); + + try { + + PushbackInputStream in = new PushbackInputStream(xInputFile.getInputStream()); + + int count = 0; + int buffersize = 0x10000; + int chunksize = 0x2000; + int chunknum = 7; //buffersize / chunksize; + + + long pos = 0; + long len = xInputFile.length(); + + byte[] array = new byte[buffersize]; + + int ret; + + while (pos < len) + { + ret = in.read(array); + + if (ret < array.length) + in.read(array, ret, array.length - ret); + + for (int i = 0, j = chunksize; i < chunknum; i++, j += chunksize) + { + if (debug) + System.out.println("med pos + " + pos + " /i " + i + " /v " + array[i]); + + mso = getOutput(0xFF & array[i]); + mso.write(array, j, chunksize); + } + + count++; + pos += buffersize; + } + + closeOutput(); + + in.close(); + + } catch (Exception e) { + + Common.setExceptionMessage(e); + return null; + } + + int num = 0; + + for (Enumeration n = out_streams.keys(); n.hasMoreElements() ; ) + { + mso = getOutput(n.nextElement().toString()); + + if (!mso.isEmpty()) + num++; + } + + XInputFile[] xif = new XInputFile[num]; + String str; + + for (int i = 0, j = 0; i < 256; i++) + { + str = String.valueOf(i); + + if (out_streams.containsKey(str)) + { + mso = (MedionStreamObject) out_streams.get(str); + xif[j++] = new XInputFile(mso.getFile()); + } + } + + return xif; + } + + /** + * + */ + private void closeOutput() + { + for (Enumeration n = out_streams.keys(); n.hasMoreElements() ; ) + { + mso = getOutput(n.nextElement().toString()); + mso.closeStream(); + } + } + + /** + * + */ + private MedionStreamObject getOutput(int index) + { + return getOutput(String.valueOf(index)); + } + + /** + * + */ + private MedionStreamObject getOutput(String str) + { + if (!out_streams.containsKey(str)) + addNewOutput(str); + + return ((MedionStreamObject) out_streams.get(str)); + } + + /** + * + */ + private void addNewOutput(int index) + { + addNewOutput(String.valueOf(index)); + } + + /** + * + */ + private void addNewOutput(String str) + { + if (out_streams.containsKey(str)) + return; + + String newname = parent; + + if (str.equals("0")) + newname = parent + stripped + ".vpes"; + + else if (str.equals("1")) + newname = parent + stripped + ".apes"; + + else + newname = parent + stripped + ".aux" + String.valueOf(aux_number++); + + out_streams.put(str, new MedionStreamObject(newname)); + } + + + /** + * + */ + private class MedionStreamObject extends Object { + + private boolean isEmpty = true; + private String name = ""; + private BufferedOutputStream stream; + private File file; + + public MedionStreamObject(String str) + { + name = str; + setStream(); + } + + private void setStream() + { + try { + stream = new BufferedOutputStream( new FileOutputStream(name), 2048000); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } + + public String getName() + { + return name; + } + + public void write(byte[] array, int index, int length) + { + try { + stream.write(array, index, length); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } + + public void closeStream() + { + try { + stream.flush(); + stream.close(); + + file = new File(name); + + if (debug) + System.out.println("rl file '" + name + "' /l " + file.length()); + + if (isEmpty = file.length() < 100) + file.delete(); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } + + public File getFile() + { + return file; + } + + public boolean isEmpty() + { + return isEmpty; + } + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StripRelook.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StripRelook.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/StripRelook.java 2006-01-14 01:17:08.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/StripRelook.java 2007-07-02 15:44:24.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)StripRelook * - * Copyright (c) 2005 by dvb.matt, All rights reserved. + * Copyright (c) 2005-2007 by dvb.matt, All rights reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -58,6 +58,9 @@ */ public XInputFile[] process(XInputFile xInputFile, String output) { + if (output.startsWith("[res]")) + output = xInputFile.getParent(); + String parent = output + System.getProperty("file.separator") + xInputFile.getName(); String strippedfile_video = parent + "[stripped].vpes"; @@ -122,7 +125,7 @@ in.close(); - } catch (IOException e) { + } catch (Exception e) { Common.setExceptionMessage(e); return null; diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/TS_PMTParser.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/TS_PMTParser.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/parser/TS_PMTParser.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/parser/TS_PMTParser.java 2007-09-18 18:41:32.000000000 +0000 @@ -0,0 +1,408 @@ +/* + * @(#) + * + * Copyright (c) 2002-2005 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.parser; + +import java.io.IOException; +import java.util.ArrayList; + +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.parser.CommonParsing; + +public class TS_PMTParser extends Object { + + private int last_version_number = -1; + + private int service_id = -1; + private int pmt_pid = -1; + private int pcr_pid = -1; + + private int pid_mask = 0x1FFF; + private int pid_mask_inv = 0xE000; + private int length_mask = 0xFFF; + private int length_mask_inv = 0xF000; + + private ArrayList video_streams = null; // more than one + private ArrayList audio_streams = null; // more than one + private ArrayList teletext_streams = null; // more than one + private ArrayList subtitle_streams = null; // more than one + + /** + * + */ + public TS_PMTParser(int _service_id, int _pmt_pid) + { + pmt_pid = _pmt_pid; + service_id = _service_id; + +//Common.setMessage("XX " + pmt_pid + " / " + service_id); + } + + /** + * + */ + public int getPID() + { + return pmt_pid; + } + + /** + * + */ + public int getServiceID() + { + return service_id; + } + + /** + * + */ + public int parsePMT(byte[] packet) + { + if (packet.length < 6) + return -1; + +//String str = ""; +//for (int i = 0; i < packet.length; i++) +// str += " " + Common.adaptString(Integer.toHexString(0xFF & packet[i]), 2); +//Common.setMessage("FF " + str); + + int table_id = getValue(packet, 0, 2); + int tmp_value = getValue(packet, 2, 1); + + //id + marker + if (table_id != 2 || (0xF0 & tmp_value) != 0xB0) + return -2; + + int section_length = length_mask & getValue(packet, 2, 2); + + if (section_length > packet.length - 4) + section_length = packet.length - 4; + + int program_number = getValue(packet, 4, 2); + + if (service_id != program_number) + return -3; + + tmp_value = getValue(packet, 6, 1); + + //marker + if ((0xC0 & tmp_value) != 0xC0) + return -4; + + int version_number = 0x1F & tmp_value>>1; + + if (last_version_number >= 0 && last_version_number == version_number) // 0 .. 31, +1 whenever a change occur + return -5; + + int current_next_indicator = tmp_value & 1; + + if (current_next_indicator == 0) // 1 = current applicable table, 0 announces next + return -6; + + int section_number = getValue(packet, 7, 1); // shall be 0 + int last_section_number = getValue(packet, 8, 1); // shall be 0 + + tmp_value = getValue(packet, 9, 2); + + //marker + if ((tmp_value & pid_mask_inv) != pid_mask_inv) + return -7; + + pcr_pid = tmp_value & pid_mask; + + tmp_value = getValue(packet, 11, 2); + + //marker + if ((tmp_value & length_mask_inv) != length_mask_inv) + return -8; + + int program_info_length = length_mask & tmp_value; + int packet_offset = 13 + program_info_length; + + for (int streamtype, pid; packet_offset < section_length + 4 && packet_offset < packet.length; ) + { + streamtype = getValue(packet, packet_offset++, 1); + tmp_value = getValue(packet, (packet_offset += 2), 2); + + //marker + if ((tmp_value & pid_mask_inv) != pid_mask_inv) + continue; + + pid = pid_mask & tmp_value; + + tmp_value = getValue(packet, (packet_offset += 2), 2); + + //marker + if ((tmp_value & length_mask_inv) != length_mask_inv) + continue; + + program_info_length = length_mask & tmp_value; + + switch(streamtype) + { + case 0x01: //mpv1 + case 0x02: //mpv2 + getDescriptor(packet, packet_offset, program_info_length, pid, 2); + break; + + case 0x03: //mpa1 + case 0x04: //mpa2 + getDescriptor(packet, packet_offset, program_info_length, pid, 4); + break; + + case 0x1B: //h264 + getDescriptor(packet, packet_offset, program_info_length, pid, 0x1B); + break; + + case 0x80: + case 0x81: //private data of AC3 in ATSC + case 0x82: + case 0x83: + case 0x06: //private data in DVB + getDescriptor(packet, packet_offset, program_info_length, pid, 6); + break; + } + + packet_offset += program_info_length; + } + + last_version_number = version_number; + + return 0; + } + + /** + * + */ + private void getDescriptor(byte check[], int off, int len, int pid, int type) + { + String str = ""; + int chunk_end = 0; + int end = off + len; + + try + { + loop: + for (; off < end && off < check.length; off++) + { + switch(0xFF & check[off]) + { + case 0x59: //dvb subtitle descriptor + type = 0x59; + chunk_end = off + 2 + (0xFF & check[off+1]); + str += "("; + + for (int a=off+2; a>>3; + int page_number = 0xFF & check[a+4]; + + str += "_"; + + switch (page_type) + { + case 1: + str += "i"; + break; + case 2: + str += "s"; + break; + case 3: + str += "ai"; + break; + case 4: + str += "ps"; + break; + case 5: + str += "s.hip"; + break; + default: + str += "res"; + } + + str += Integer.toHexString((7 & check[a+3]) == 0 ? 8 : (7 & check[a+3])).toUpperCase(); + str += (page_number < 0x10 ? "0" : "") + Integer.toHexString(page_number).toUpperCase() + " "; + } + + str += ")"; + //break loop; + off++; + off += (0xFF & check[off]); + break; + + case 0xA: //ISO 639 language descriptor + str += "("; + + for (int a=off+2; aquants< derived from TCT + 20090116b "S9 40" converts existing code to use >>grads<< derived from TCT + 20090116b quant manager to recognise new/old hues and allocate quant #s + 20090116c tested for quant sparse >in TCT< - may fail if sparse >in UCT< + 20090116d purged a lot of (more than usually) temporary code and retested + + 20090116a -------prepare to get tables by analysing target clut------- + 20090116a eliminate all hardcoded constants for special quants & ranges + 20090116a remove dbgRvLum (old 'sort on inverted lum' method for blu/red) + 20090116a rev video (lite grnd) on any color using double size grad table + + 20090114 -----successfully analyse clstrs etc from imported clut----- + 20090114 generate hue+lum lists, allocate to clstrs, generate grads + 20090114 ...including dark/lite fill when < 4 TCT entries available + + 20090113 ---get DE samples working again after transp grnd changes--- + 20090113 general cleanup of interfaces to other ProjectX modules + 20090110 corrected conversion of red shades in ARGBtoQLHI() + 20090110 fewer cases for 'pixel not allowed' now dark grnd ok with any clr + 20090110 corrected sweep for lite pixels: only white can be be lite + + 20090108c ---get UK samples working again after transp grnd changes--- + 20090108a Collection with transp grnd corrected; tested with ZDF and UK + 20090108a Count textblks & textgaps separately to decide if variable rh + 20090108a >>Add bitmap x offset into PX_CTLI column offsets (544x576)<< + 20090108a Replace cyan with grey in clut_eepb[blue] (was D980 now DC80) + 20090108b Add dbgTransp "S9 80" to force trnsp bg (except reverse video) + 20090108c Rev video by adjust color indexes; any clr can be dark/lite grnd + + 20090106 ---attempt to handle ZDF samples with transp grnd to text--- + 20090106 Scan for textblks <= ZDF doesn't follow geometrical rh cells + 20090106 1st try for 'smearing' of transp grnd columns to reduce # areas + + +*/ +package net.sourceforge.dvb.projectx.subtitle; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.TreeSet; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Hashtable; + +import net.sourceforge.dvb.projectx.common.Common; + + +public class ColorAreas extends Object { //S9 + + /*===================================== switches and debug =====================================*/ + + //To activate this code: IRD colormodel = "256 colors" AND 1st two chars of fix to pageID = "S9" + + public static boolean active = false; //MAIN SWITCH multicolor DVB to SUP //S9 + + private static int switches = 0; //OPTIONS multicolor DVB to SUP //S9 + public static int getSwitches() { return switches; } //S9 + public static void setSwitches(String s) { switches=Integer.parseInt(s,16);} // HEX!! //S9 + + public static boolean dbgSub(int i) { return i<=(0xF & (switches ));} //input hex!! //S9 + + private static boolean dbgSpare1() { return 0!=(0x1 & (switches>>> 4));} //unassigned //S9 20090122 + private static boolean dbgOldClr() { return 0!=(0x1 & (switches>>> 5));} //red/blu qDef //S9 20090202 + private static boolean dbgInShad() { return 0!=(0x1 & (switches>>> 6));} //shdg iff outln //S9 20090122 + private static boolean dbgSolid() { return 0!=(0x1 & (switches>>> 7));} //transp+outline //S9 20090122 + + private static boolean dbgnoCHG() { return 0!=(0x1 & (switches>>> 8));} //for SupViewer //S9 + private static boolean dbgnofix() { return 0!=(0x1 & (switches>>> 9));} //off->fixup OK //S9 + private static boolean dbg1pic() { return 0!=(0x1 & (switches>>>10));} //on->chk pic# //S9 + private static boolean dbg1line() { return 0!=(0x1 & (switches>>>11));} //on->check L# //S9 + //db1line() and dbgline() are not being used and could be removed //S9 20090122 + + public static int dbgpic() //turning off the control bit forces return of -1 //S9 + { return (0!=(0x1 & (switches>>>10))) ? (0xFFF & (switches>>>12)) : -1;} //interlaced!! //S9 + public static int dbgline() //turning off the control bit forces return of -1 //S9 + { return (0!=(0x1 & (switches>>>11))) ? (0xFFF & (switches>>>12)) : -1;} //interlaced!! //S9 + + public static boolean biglog = false; //exposed because the original should have been //S9 + + public static void initialise(int IRD, boolean log, Hashtable table) //S9 20090113 + { //from DVBSubpicture.setIRD() //S9 20090113 + active = false; //reset main switch //S9 20090102 + biglog = log; //tru iff debug log requested by GUI //S9 + + switches = (log? 0x00000000: 0x00000000); //presets when biglog on, or off //S9 20090117 + + //get hidden debug key from ini entry //dm 20090113 + String dbg = Common.getSettings().getProperty("Subpicture.S9Debug", "").trim(); //dm 20090113 + + //following gets current switches from gui iff there's some debug value in the ini //S9 20090122 + //...it's needed because restarting PjX just to change the switches is a PITA... //S9 20090122 + //...and leads to unrealistic test conditions like only one run per instantiation //S9 20090122 + String dbgX = Common.getSettings().getProperty("Subpicture.S9Debug", "").trim(); //dm 20101123 + if (dbg.length()>0 && dbgX.length()>0) { dbg = dbgX; } //only if some value in ini //S9 20090122 + + if ((IRD & 1) == 1) //MC identifier //dm 20090113 + { //S9 + active = true; //activate multicolor mapping DVB to SUP //S9 + if (dbg.length()>0) { setSwitches(dbg); } //capture any options following the "S9 " //S9 + setClut(table); // always refreshed, requires full set of 16 colors //dm 20090113 + } //S9 + +Common.setMessage("Multicolor "+((active)?"ACTIVE":"OFF")+" / switches "+X(8, switches) //S9 + +((dbgX.length()>0)?" >>FROM GUI<<":"")); //S9 20090122 +if (active) Common.setMessage("Multicolor:" //S9 20090109 + +" shw1Line="+dbgline()+" shw1Pic="+dbgpic()+" noRepairs="+dbgnofix() //#, #, Booleans //S9 + +" NoCOLCON="+dbgnoCHG()+" SolidBgrd="+dbgSolid()+" Shading="+dbgInShad() //S9 20090202 + +" OldClrs="+dbgOldClr() //S9 20090202 + ); + } //S9 + + //following rigmarole is because string.format/printf is theologically unacceptable here //S9 + public static String d(int width, int val) //printf("%0 width d",val) //S9 + { String s = "0000000000" + val; if (val<0) s = " " + val; //S9 20090114 + return s.substring(s.length()-width); } //S9 20090114 + public static String s(int width, String val) //printf("% width s",val) //S9 + { String s = " " + val; return s.substring(s.length()-width); } //S9 + public static String X(int width, int val) //printf("%0 width X",val) //S9 + { String s = "0000000000" + Integer.toHexString(val).toUpperCase(); //S9 + return s.substring(s.length()-width); } //S9 + + + /*======================== load TARGET CLUT (TCT) and elicit structure ========================*/ + + //We will be using PGC CLUT(s) optimised for national DVB subtitles. We //S9 + //won't be directly using the stream colors but will map them - using very //S9 + //simple feature detection >in color space< - to the loaded target table (TCT). //S9 + + + public static Integer[] clut_pgc = new Integer[16]; //will be filled by user //dm 20090113 + private static int tables_rdy = 0; //has main init been done? //S9i20090114 + + private static void setClut(Hashtable table) //basic static init from setIRD //dm 20090113 + { //rest from 1st call to analyse //S9i20090114 + for (int i = 0; i < 16; i++) //dm 20090113 + if (table.containsKey("" + i)) //dm 20090113 + { //S9 20090203 + String s = table.get("" + i).toString(); //S9 20090203 + int j = s.indexOf('/'); //S9 20090203 + + if (j < 0) + clut_pgc[i] = new Integer(Integer.parseInt(s.trim(), 16)); //S9 20090203 + else + clut_pgc[i] = new Integer(Integer.parseInt(s.substring(0, j).trim(), 16)); //S9 20090203 + } //S9 20090203 + else //S9i20090114 + Common.setMessage("Multicolor color table missing entry # "+d(2, i)); //S9i20090114 + + tables_rdy = 0; //rest of init in dynamic context //S9i20090114 + } //dm 20090113 + + //Here we analyse the TCT to find the clusters in color space ('quants'). //S9i20090116 + //These are recognised, and the quant #s managed, by code in ARGBtoQLHI(). //S9i20090116 + + //Each color area will encompass one gradient between one clstr color and one pure //S9i20090116 + //neutral ('grnd') either black or white. These grnds have special (low) quant #s. //S9i20090116 + //THE GRND IS THE GRADIENT NEUTRAL; IT MIGHT NOT BE VISUAL BACKGROUND OF THE AREA //S9i20090116 + + //The 4 TCT indices which define the gradient to 21pb for the DVD subpic are here //S9i20090116 + //called a 'grad'. We now prepare suitable grads, indexed by quant, for both grnds. //S9i20090116 + + /*-----------hue cluster analysis tables, field layouts, and constants-----------*/ //S9i20090114 + private static int[] TCTQ_grads; //by clstr: TCT indices (both dk & lt grnd) //S9i20090114 + private static int[] TCTQ_steps; //by clstr: holds corresponding lum values //S9i20090114 + private static int[] TCTQ_count; //by clstr: # shades alloc to clstr //S9i20090116 + + //constants for clstr # (also known as quant, from 'quantised hue') + /*******************************************************************************************///S9i20090116 + /* ANY OF THESE Q-CONSTANTS MAY BE USED FOR RANGE CHECKS WHICH ASSUME CORRECT ORDERING *///S9i20090116 + /* (the values can be changed but not the sequence) *///S9i20090116 + /*******************************************************************************************///S9i20090116 + private static final int QX = 0; //null (should not occur and will show red) //S9i20090116 =+= + private static final int QT = 1; //transparent (only pixels are trnsp; areas) //S9i20090114 =+= + private static final int QD = 2; //dark (....are dark with trnsp grnd) //S9i20090114 =+= + private static final int QL = 3; //lite (hi white, as grnd for a color) //S9i20090114 =+= + private static final int QN = 4; //neutral (white->grey as a color) //S9i20090114 =+= + private static final int Q1 = 5; //1st color (dynamic alloc from here upwards) //S9i20090114 =+= + + private void analyseTCT() //S9i20090114 + { //S9i20090114 + if (tables_rdy!=0) return; //only exec once per TCT (re)load //S9i20090116 + + /*------------initialise Quant Manager and our own TCT analysis tables-----------*/ //S9i20090122 + picCount = 0; //reset static call counter //S9 + supCount = 0; //reset static sup file byte index //S9 + TCTQ_grads = new int[32]; //by clstr: TCT indices (both dk & lt grnd) //S9i20090114 + TCTQ_steps = new int[16]; //by clstr: holds corresponding lum values //S9i20090114 + TCTQ_count = new int[16]; //by clstr: # shades alloc to clstr //S9i20090116 + + initialiseQM(); //he will manage all the clstr #s //S9i20090122 + + QLHI[] TCT_quants = new QLHI[16]; //local - not retained after init //S9i20090116 + + /*-------------analyse TCT entries by hue & lum and allocate clstr #-------------*/ //S9i20090114 + for (int i = 0; i < 16; i++) //ask manager for quants for every TCT entry //S9i20090116 + TCT_quants[i] = ARGBtoQLHI(clut_pgc[i].intValue(),i,1); //...so Q#s are allocated //S9i20090116 + Arrays.sort(TCT_quants, QLHI_ORDER); //sort by clstr # + luminance + TCT index //S9i20090116 + + /*----------------collect TCT indices into grads for each clustr #---------------*/ //S9i20090114 + //-------------------also collect lum values (not used as yet)-------------------*/ //S9i20090114 + int topWhiteNdx = -1; //TCT_quants index of lite grnd (index dark grnd always 0) //S9i20090116 + for (int i=15, q=0, t=0; i>=0; i--) //down analysed cluts collecting for clusters //S9i20090114 + { //S9i20090114 +if (dbgSub(5)) System.out.println("init collect1" //S9i20090114 + +" / TCT_quants[i="+d(2,i)+"]="+X(8,TCT_quants[i].N)); //S9i20090114 + + q = TCT_quants[i].quant(); //assigned quant //S9i20090116 + t = TCT_quants[i].inUCT(); //original index //S9i20090116 + TCTQ_grads[q] = TCTQ_grads[q]<<4 | t; //collect indices //S9i20090116 + TCTQ_steps[q] = TCTQ_steps[q]<<8 | TCT_quants[i].lum(); //collect lum vals //S9i20090116 + TCTQ_count[q]++; //count clstr members //S9i20090116 + + if (q == QN && topWhiteNdx < 0) { topWhiteNdx = i; } //keep index of top neutral //S9i20090116 + +if (dbgSub(4)) System.out.println("init collect2" //S9i20090114 + +" / TCT_quants[i="+d(2,i)+"]="+X(8,TCT_quants[i].N) //S9i20090114 + +" / TCTQ_count[q="+d(2,q)+"]="+X(1,TCTQ_count[q]) //S9i20090116 + +" / TCTQ_grads[q]="+X(8,TCTQ_grads[q]) //S9i20090116 + +" / TCTQ_steps[q]="+X(8,TCTQ_steps[q]) //S9i20090116 + +" TCT_CLUT[t="+d(2,t)+"]="+X(8,clut_pgc[t].intValue()) //S9i20090116 + ); //S9i20090114 + } //end for sorted analysed clut entries //S9i20090114 + + + /*----------fill missing TCT indices making grads for dark & lite grnds----------*/ //S9i20090114 + //whitefill is temp version until the neutral grad has been built (before any colors) //S9i20090114 + //notice only two bits ever needed (any clstr with only 1 color we will use it twice) //S9i20090114 + int whitefill = TCT_quants[topWhiteNdx].inUCT()<<8; whitefill |= whitefill<<4; //ee00 //S9i20090116 + int blackfill = TCT_quants[ 0].inUCT() ; blackfill |= blackfill<<4; //00pb //S9i20090116 + + for (int i=0, q =0; q < 16; q++) //thru clusters filling grads with lite/dark indices //S9i20090114 + //This doesn't maintain TCTQ_steps[] - do that later when we decide what it's for :) //S9i20090114 + //This also MAY need tweaking for black outline style (or we might override the grad) //S9i20090114 + //For the fill logic, note we'll be doing dark then lite then neutral before any colors //S9i20090114 + { //S9i20090114 + switch (i = TCTQ_count[q]) //how many indices in clstr? //S9i20090116 + { //S9i20090114 + case 0: //empty table entries leave them alone //S9i20090114 + break; //S9i20090114 + case 1: //duplicate the one we have, then fill //S9i20090114 + TCTQ_grads[q ] = TCTQ_grads[q]<<4 | TCTQ_grads[q]&0x0F; //duplicate b->p //S9i20090114 + TCTQ_grads[q+16] = TCTQ_grads[q] | whitefill &0xFF00; //fill 2 white ee //S9i20090114 + TCTQ_grads[q ] = TCTQ_grads[q]<<8 | blackfill &0x00FF; //fill 2 black pb //S9i20090114 + break; //S9i20090114 + case 2: //lite: duplicate the upper lum color //S9i20090114 + TCTQ_grads[q+16] = TCTQ_grads[q]<<4 &0xF00 | TCTQ_grads[q]; //duplicate p->e1 //S9i20090114 + TCTQ_grads[q+16] = TCTQ_grads[q+16] | whitefill &0xF000; //fill 1 white e2 //S9i20090114 + if (TCT_quants[q].lum() > 0x60) //dark: darker clr poor blend->dup upper //S9i20090114 + TCTQ_grads[q] = TCTQ_grads[q]>>4 | TCTQ_grads[q] &0xF0; //duplicate p->b //S9i20090114 + TCTQ_grads[q ] = TCTQ_grads[q]<<8 | blackfill &0x00FF; //fill 2 black pb //S9i20090114 + break; //S9i20090114 + case 3: //just fill with appropriate grnd //S9i20090114 + TCTQ_grads[q+16] = TCTQ_grads[q] | whitefill &0xF000; //fill 1 white e2 //S9i20090114 + TCTQ_grads[q ] = TCTQ_grads[q]<<4 | blackfill &0x000F; //fill 1 black b //S9i20090114 + break; //S9i20090114 + default: //more than 3 means table or logic error //S9i20090114 +Common.setMessage("Multicolor CLUT has "+d(2,i)+" entries" //S9i20090122 + +"(incl # "+d(2,TCTQ_grads[q]&0x0F)+") with same hue"); //S9i20090122 + } //end switch //S9i20090114 + if (q == QN) { whitefill = TCTQ_grads[q]; } //better version to fill the colors //S9i20090114 + +if (dbgSub(3)) System.out.println("init grads /" //S9i20090114 + +" TCT_CLUT[t="+d(2,q)+"]="+X(8,clut_pgc[q].intValue()) //S9i20090114 + +" | TCT_quants[i="+d(2,q)+"]="+X(8,TCT_quants[q].N)+" |" //S9i20090116 + +" Q_count[q="+d(2,q)+"]="+X(5,TCTQ_count[q]) //S9i20090116 + +" grads[q]="+X(5,TCTQ_grads[q ]) //S9i20090114 + +" grads[q]="+X(5,TCTQ_grads[q+16]) //S9i20090114 + +" whitefill="+X(5,whitefill) //S9i20090116 + +" steps[q]="+X(8,TCTQ_steps[q]) //S9i20090114 + ); //S9i20090114 + } //end for clusters //S9i20090114 + + /*---------------finalise tables for use by analyse() & commands()---------------*/ //S9i20090116 + tables_rdy = 1; //tell analyse() not to call again //S9i20090114 + } //S9i20090114 + + /*========================== fixed target PGC_CLUT and mapping tables ==========================*/ + + //The ColorAreas module was originally written for UK DVB (Freeview). It's been //S9 20090122 + //extended for other regimes, but still places great emphasis on the background //S9 20090122 + //color which for Freeview is not transparent but by its color carries meaning. //S9 20090122 + + //We expect to load a target CLUT (TCT) optimised for your national DVB subtitle //S9 20090122 + //colors. We won't directly output the stream colors but will map them - using //S9 + //very simple feature detection >in color space< - onto the palette of the TCT. //S9 + + //To implement multicolor subtitles on DVD we'll divide the subpic into XY areas //S9 + //such that each area has one main hue with a few intensities. We'll quantise the //S9 + //stream hues into clusters (defined by the TCT), including neutrals (white/grey) //S9 20090122 + //and light, dark & transparent backgrounds. Each area encompasses a luminance //S9 20090122 + //gradient ('grad') from one cluster ('quant') to one neutral ('grnd'). The grad //S9 20090122 + //is encoded by the four CLUT indices that interpret (an area of) the RLE bitmap. //S9 20090122 + + //So for each hue cluster found within a UCT (from the stream), the number and //S9 20090122 + //range of luminances must be mapped to those in the matching TCT cluster. Then //S9 20090122 + //within the bitmap, the areas with a single quant and grnd (and hence a single //S9 20090122 + //grad) must be located. Finally, for each area the RLE bits ('bp12') for each //S9 20090122 + //pixel must set to match the grad, modified by stylistic choices like outlining. //S9 20090122 + + //For each subpic there are four key method calls - all in Subpicture.buildRLE() //S9 20090122 + + //0. initialise(IRDmodel, colortable) - quantise LOADED colortable and build grads //S9 20090122 + + //1. analyse(bitmap, colortable) - quantise STREAM colortable, find monochrome areas //S9 + + //2. pgc_color = ColorAreas.bp12[a + b] - position in bitmap -> 2bit e2e1pb //S9 + + //3. commands(int, int, bitmap) - create the command buffer including a CHG_COLCON //S9 + + //The term "quant" literally refers to a quantised color value. It's also used //S9 + //for the object QHLI which encapsulates the quant and other info about a color //S9 + //table entry, and therefore about the pixels that refer to that entry. Thus //S9 + //each pixel has a quant, and various areas of the bitmap whose pixels refer to //S9 + //a single quant can be identified. Most importantly in a well formed subtitle //S9 + //subpic (or at least in one text row) each column of pixels refers to a single //S9 + //quant, and we speak of the quant of the area or say the column 'has' a quant. //S9 + + //All the above usages of "quant" refer to an attribute (of pixel, area, column). //S9 + //But we also talk of quants as locations in color space - these are values which //S9 + //the quant attributes may take. Thus we "move some pixels to the dark quant" by //S9 + //changing the quant attribute of the UCT entries to which they refer. Similarly //S9 + //we may need to move a light color in the UCT between the lite and white quants. //S9 + //The purpose of the dark and lite quants will now be explained. //S9 + + //The clusters appearing frequently on UK DVB (white, yellow, green, cyan) have //S9 + //a dark background ("dark grnd") but the infrequent blue and red clusters have //S9 + //a color background with white text. [Magenta has never been seen here, but is //S9 + //coded like blue & red.] In all cases we see a luminance gradient of a single //S9 + //hue, contrasted with either black or white. For clusters with a white contrast //S9 + //it proves easiest to say they have a white background ("lite grnd"): the text //S9 + //uses the lite "background" on a hue clustered "foreground". This allows each //S9 + //area to need just one color cluster (quant) plus one contrast cluster (grnd). //S9 + //So "grnd" is a reference neutral (conceptually akin to electrical ground) and //S9 + //NOT ALWAYS THE VISUAL BACKGROUND. The abstraction is justified by its utility. //S9 + + //A dark or lite grnd is part of every cluster, so >compatible< grnd pixels can //S9 + //be included in any area. Dark areas contain only dark pixels, and can be //S9 + //merged into a neighbor with a dark grnd. There cannot logically be a lite area //S9 + //since the first pixel will be the visual background, immediately defining the //S9 + //area's hue cluster. Pixels of any cluster with dark grnd can be added to dark //S9 + //areas - thus defining that area's hue ("moving the area to that quant"). //S9 + //Depending on context, white can be a hue cluster color (white on black) or a //S9 + //lite grnd (white on red or blue), which makes for some interesting logic. //S9 + + + private final int[] clut_maps = { //S9 + + //There are often more or fewer than four shades in the UCT cluster. Here //S9 + //are the translation maps to e2e1pb on DVD [by # colors to compress from]. //S9 + //0x1234 means top color to e2, next 2 to e1, next 3 to p, 4 to b, but dark //S9 + //or transparent grnd is always outside this count. //S9 + +/*** ---------------------------under review/redesign--------------------------- //S9 20090110 + //Using a fixed (or precalculated) mapping is only valid against a known //S9 20090122 + //population of transmitted UCTs, which was true for UK Freeview. More //S9 20090122 + //generally we must compare the UCT top luminance with the TCT luminances //S9 20090122 + //then group UCT luminances according to the 1/2/3 shades avail in the TCT. //S9 20090122 +**** -------------------------------------------------------------------------*/ //S9 20090110 + // + //Entry[0] maps all shades to b and is available for special situations //S9 + + 0x000F,0x1000,0x1100,0x1110,0x1111,0x1112,0x2112,0x2113, //nice slim glyphs //S9 + // 0x000F,0x1000,0x1100,0x1110,0x1220,0x1220,0x1221,0x1231, //nasty fat glyphs //S9 + + 0x3113,0x3114,0x4114,0x4115,0x5115,0x5116,0x6116,0x6117 //nice slim glyphs //S9 + // 0x2231,0x2331,0x2332,0x2333,0x2334,0x2335,0x2336,0x2337 //nasty fat glyphs //S9 + }; //S9 + + //The 'artistic' strategy is to keep the displayed text light and slim //S9 + //so if a lot of dither colors are present, many are mapped to grnd. //S9 + //Doing otherwise produces very heavy text with poor legibility. //S9 + + /*=============== List of Color Areas (cleared and built afresh for each subpic) ===============*/ + + private class Area { //S9 + public int I; //S9 + + //public int trow() { return (I & 0x0FF00000) >>>20; } // text row max 255 //S9 20080102 + //public int start() { return (I & 0x000FFC00) >>>10; } // 1st x max 1023 //S9 20080102 + //public int bgrnd() { return (I & 0x00000300) >>> 8; } // 'b'alfa max 3 //S9 20080102 + //public int clstr() { return (I & 0x000000FF) ; } // clstr # max 255 //S9 20080102 + //public int trow(int t) { I = I & 0xF00FFFFF | (t & 0xFF) <<20; return trow(); } //S9 20080102 + //public int start(int s) { I = I & 0xFFF003FF | (s & 0x7FF)<<10; return start(); } //S9 20080102 + //public int bgrnd(int b) { I = I & 0xFFFFFCFF | (b & 0x3) << 8; return bgrnd(); } //S9 20080102 + //public int clstr(int c) { I = I & 0xFFFFFF00 | (c & 0xFF) ; return clstr(); } //S9 20080102 +//new for HD + public int trow() { return (I & 0x1FE00000) >>>21; } // text row max 255 //S9 20080102 + public int start() { return (I & 0x001FFC00) >>>10; } // 1st x max 1023 //S9 20080102 + public int bgrnd() { return (I & 0x00000300) >>> 8; } // 'b'alfa max 3 //S9 20080102 + public int clstr() { return (I & 0x000000FF) ; } // clstr # max 255 //S9 20080102 + public int trow(int t) { I = I & 0xE01FFFFF | (t & 0xFF) <<21; return trow(); } //S9 20080102 + public int start(int s) { I = I & 0xFFE003FF | (s & 0x7FF)<<10; return start(); } //S9 20080102 + public int bgrnd(int b) { I = I & 0xFFFFFCFF | (b & 0x3) << 8; return bgrnd(); } //S9 20080102 + public int clstr(int c) { I = I & 0xFFFFFF00 | (c & 0xFF) ; return clstr(); } //S9 20080102 +// + public int tfirst() { return start(); } //index - alist[tfirst] starts trow entries //S9 20080106 + public int tlimit() { return clstr(); } //index - alist[tlimit] limits trow entries //S9 20080106 + public int tfirst(int s) { return start(s); } //index - set start of trow entries //S9 20080106 + public int tlimit(int c) { return clstr(c); } //index - set limit of trow entries //S9 20080106 + + public int ytop() { return trow(); } //yinfo entry - y for trow top line //S9 20080106 + public int ybtm() { return start(); } //yinfo entry - y for trow bottom line //S9 20080106 + public int yfxd() { return bgrnd(); } //yinfo entry - 1 iff yref valid else 0 //S9 20080106 + public int yref() { return clstr(); } //yinfo entry - y for reference line //S9 20080106 + + public Area() { I = 0; } //S9 + public Area(int t, int s, int c) { I=0;trow(t);start(s);clstr(c); } //S9 + public Area(int t, int s, int c, int b) { I=0;trow(t);start(s);clstr(c);bgrnd(b); } //S9 20080101 + } //S9 + + private ArrayList alist = new ArrayList(); //S9 + + private void dumpAreas(String why) { dumpAreas(why, new Area(), ""); } //S9 20080102 + + private void dumpAreas(String why, Area r) { dumpAreas(why, r, ""); } //S9 20080102 + + private void dumpAreas(String why, Area r, String s) //S9 + { Area a; int trows=((Area)alist.get(0)).trow(); for (int i=0; i>>29; } // subpic index e2/e1/p/b //S9 + //besides the 4 RLE values, bp12 has to hold special signals e.g. lite pixels=7 //S9 20090116 + public int quant() { return (N & 0x1F000000) >>>24; } // quantised hue max 31 //S9 + //besides <=14 quants for colors, quant takes special (low) values for dark, lite, etc //S9 20090116 + public int lum() { return (N & 0x00FF0000) >>>16; } // luminance max 240 //S9 + public int misc() { return (N & 0x0000FF00) >>> 8; } // opacity max 255 //S9 20090101 + public int inUCT() { return (N & 0x000000FF) ; } // userColorTableIndex //S9 + public int bp12(int a) { N = N & 0x1FFFFFFF | (a & 0x07)<<29; return bp12(); } //S9 + public int quant(int a) { N = N & 0xE0FFFFFF | (a & 0x1F)<<24; return quant(); } //S9 + public int lum(int a) { N = N & 0xFF00FFFF | (a & 0xFF)<<16; return lum(); } //S9 + public int misc(int a) { N = N & 0xFFFF00FF | (a & 0xFF)<< 8; return misc(); } //S9 20090101 + public int inUCT(int a) { N = N & 0xFFFFFF00 | (a & 0xFF) ; return inUCT(); } //S9 + + public QLHI() { N = 0; } //S9 + + public QLHI(int q, int b, int f, int i) //forces bp12 to zero!! //S9 + { N = 0; quant(q); lum(b); misc(f); inUCT(i); } //S9 20090101 + } //S9 + + private Comparator QLHI_ORDER = new Comparator() { //all flds but bp12 //S9 + public int compare(Object e1, Object e2) //S9 + {return (((QLHI)e1).xbp12()>((QLHI)e2).xbp12()) ? +1 : //S9 + (((QLHI)e1).xbp12()<((QLHI)e2).xbp12()) ? -1 : 0;} //S9 + }; //S9 + + private Comparator UCT_ORDER = new Comparator() { //align to UCT //S9 + public int compare(Object e1, Object e2) //S9 + {return (((QLHI)e1).inUCT()>((QLHI)e2).inUCT()) ? +1 : //S9 + (((QLHI)e1).inUCT()<((QLHI)e2).inUCT()) ? -1 : 0;} //S9 + }; //S9 + + private QLHI[] quants; //init in analyse() //S9 + + public int getQuant(int i) {return quants[i].N; } //for dbg from other classes //S9 + + private void dumpquants(String why) { QLHI q; //S9 + for (int i=0; i>>24; //TCT calls assumed opaque //S9q20090202 + int R = 0xFF & ARGB>>>16; //S9q20090202 + int G = 0xFF & ARGB>>>8; //S9q + int B = 0xFF & ARGB; //S9q20090202 + if (qDef == 0 && dbgOldClr()) //stream blue <-> red to match VLC 0.8.5 //S9q20090202 + { R = 0xFF & ARGB; B = 0xFF & ARGB>>>16; } //S9q20090114 + + int max = (R>G)?R:G; max = (max>B)?max:B; //S9q20090114 + int min = (R=32 //S9t20090102 + // if (h>= 91 && (h/6)*6==h) textrows = 3; else //only give 3 if rh >=32 (etc.) //S9t20090102 + // if (h>=121 && (h/8)*8==h) textrows = 4; else //smallest rows ever seen were 32 //S9t20090102 + // if (h>= 61 && (h/4)*4==h) textrows = 2; else //...this code fails for rh<=30, //S9t20090102 + // textrows = 1; //...and note 144->3x48 not 4x36 //S9t20090102 +// new for HD + boolean hd = w > 720; // check bmp width (not valid for small subs in HD), row height in HD is about 48 px + + if (h>= (hd ? 139 : 91) && (h/6)*6==h) textrows = 3; else //only give 3 if rh >=32 (etc.) //S9t20090102 + if (h>= (hd ? 185 : 121) && (h/8)*8==h) textrows = 4; else //smallest rows ever seen were 32 //S9t20090102 + if (h>= (hd ? 93 : 61) && (h/4)*4==h) textrows = 2; else //...this code fails for rh<=30, //S9t20090102 + textrows = 1; //...and note 144->3x48 not 4x36 //S9t20090102 +// + + int rh = h/textrows; //geometric height of a text row //S9t20090102 + + /*----------look for text by counting edges along lines---------*/ //S9t20090102 + /*----------find textblocks separated by >1 margin line---------*/ //S9t20090102 + int[] txtTop = new int[h]; int[] txtBtm = new int[h]; //S9t20090102 + int textblks = -1; int textgaps = -1; int stat = -1; //wtg to collapse wave function //S9t20090102 + for (int r=0, a=0, rEdges=-1; r 0) // this line seems to be text //S9t20090106 + { //S9t20090102 + if (stat>=4) {stat=4; }//additional text line //S9t20090102 + if (stat==1) {stat=4; textblks++; txtTop[textblks]=r-1;}//(delayed) 1st txt line //S9t20090102 + if (stat<=0) {stat=1; }//wait for 2nd text line //S9t20090102 + } //S9t20090102 + else //this line seems to be margin //S9t20090102 + { //S9t20090102 + if (stat <0) {stat=0; textgaps++; }//initial margin line //S9t20090102 + if (stat<=3) {stat=0; }//additional margin line //S9t20090102 + if (stat==5) {stat=0; textgaps++; txtBtm[textblks]=r-2;}//(delayed) 1st margn ln //S9t20090102 + if (stat==4) {stat=5; }//wait for 2nd margin ln //S9t20090102 + } //S9t20090102 +if (dbgSub(4)) System.out.println("line /pic "+d(5,picCount)+" / edges["+d(3,r)+"]="+d(3,rEdges) //S9t20090102 + +" / state "+d(1,stat)+" / textblks "+d(3,textblks)+" / textgaps "+d(3,textgaps)); //S9t20090106 + } //S9t20090102 + if (stat==5) {stat=0;textgaps++;txtBtm[textblks]=h-2;} // finish any final margn //S9t20090106 + textgaps++; //count of margins found; if zero must use geometry with no adjustments //S9t20090106 //S9t20090102 + textblks++; //count of valid txtTop/Btm; but if textgaps=0 then all txtTop/Btm are zero //S9t20090106 //S9t20090102 + +if (dbgSub(2)) System.out.println("Find textrows /pic "+d(5,picCount)+"/w "+d(3,w)+"/h "+d(3,h) //S9t20090102 + +"/textrows "+d(3,textrows)+"/geom. rowheight "+d(3,rh) //S9t20090106 + +"/textblks "+d(3,textblks)+"/textgaps "+d(3,textgaps) ); //S9t20090106 + + /*---------generate text rows based on fixed row heights--------*/ //S9t20090102 + /*---------if text blocks detected then adjust the rows---------*/ //S9t20090102 + int[] rowTop = new int[textrows]; int[] rowBtm = new int[textrows]; //S9t20090102 + + //textgaps==0 means no lines with single background (probably transp...other...transp) //S9t20090106 + //If this happens txtBtm[0]==0 (i.e. txtblks >initially< exhausted) so no adjustments. //S9t20090106 + //In other words unless entire background is transp we rely entirely on the geometry. //S9t20090106 + + //if 0 < textblks < textrows then we will simply not generate the extra textrows //S9t20090102 + //but if textblks > textrows we are in deep trouble and will have to tell the user :) //S9t20090102 + + if (textblks > textrows) //S9t20090102 +Common.setMessage("subpic "+d(5,picCount) //S9t20090102 + +" has too many text rows for the pixel height - please check"); //S9t20090102 + + for (int t=0, a=0; t no background row can be chosen //S9t20090102 + alist.add(new Area(rowTop[t], rowBtm[t], //S9t20090102 + ((rowTop[t]transp/{wild->color} //S9a + int[] colgrnd; //grnd: (dark)transp / dark(opaque) /lite //S9a20090104 + + //constants for column grnd (opposite end of grad from column quant) + /***************************************************************************************///S9i20090202 + /* ANY G-CONSTANTS MAY BE USED FOR RANGE CHECKS WHICH ASSUME CORRECT ORDERING *///S9i20090202 + /* (the values can be changed but not the sequence) *///S9i20090202 + /***************************************************************************************///S9i20090202 + final int GT = 0; //transparent (col grnd can be trnsp; areas) //S9i20090202 =+! + final int GD = 1; //dark (....are dark with trnsp grnd) //S9i20090202 =+! + final int GL = 2; //lite (col with known non-dark grnd) //S9i20090202 =+! + final int GU = 3; //undecided (not yet seen any grnd pixels) //S9i20090202 =+! + + + bp12 = new int[w * h]; //speed up - build bp12 on same pass //S9a + int defPixel; int defBP12; //default pxl & result - used for repairs //S9a20090105 + QLHI myQLHI; //S9a + + //things that don't persist long enough to be worth naming... + int t1=0; int t2=0; int t3=0; int t4=0; int t5=0; //S9a + //powerful spell needed because java generics theologically unacceptable in this realm //S9a + Area[] aindx = (Area[])(alist.toArray(new Area[alist.size()])); //cast entire index //S9a + + int textrows = aindx[0].trow(); //it was put there by findTextRows() //S9a20090105 + for (int t=0; t col clstr & grnd -> pixel quant & bp12--------*///S9a + /*---------bp12 assignment has to support that we may not yet know the grnd--------*///S9a + /*--------(if don't know grnd by end of col, copy grnd from neighbor later)--------*///S9a + t3 = t5; t4 = t5; //fake 'history' for corrections //S9a + for (int i=a; i < b; i+=w) //FOR EACH PIXEL in this column //S9a + { //i is the y coordinate (times width) //S9a + t1 = pixels[j+i]; //S9a + myQLHI = quants[user_color_table.indexOf("" + t1)]; //S9a + t2 = myQLHI.quant(); //hue cluster # ("color") for pixel //S9a + bp12[j+i] = myQLHI.bp12(); //assigned 2bit e2e1pb for pixel //S9a + + //------------------try to resolve undecided col grnd----------------- //S9a20090109 + if (colgrnd[j] == GU) //only a grnd pixel can tell us //S9a20090109 =!! + colgrnd[j] = (t2<=QT)?GT: (t2==QD)?GD: (t2==QL)?GL: GU; //S9a20090202 =!! + + //----------interpret lite pixels as white or grnd of column---------- //S9a + //pixel lite and column has dark grnd -> treat pixel as specifically white //S9a20090116 =!= + if (t2==QL && colgrnd[j] < GL) { t2 = QN; } //bp12 same either way //S9a20090202 =!! + + + //-------------correct pixels that mismatch column opacity------------ //S9a + if (colgrnd[j] != GT && t2 == QT) //opaque grnd & completely transp pxl //S9a20090202 =!! + { //...fix this ahead of singleton test //S9a +if (dbgSub(4)) System.out.println("alpha err "+"/pic "+d(5,picCount) //S9a20090105 + +"/t "+d(2,t)+"/x "+d(3,j)+"/y "+d(3,(i-a)/w)+"/colgrnd "+d(1,colgrnd[j]) //S9a20090105 + +"/colclstr "+d(2,colclstr[j])+"/t2,t3,t4 "+X(1,t2)+"* "+X(1,t3)+" "+X(1,t4) //S9a + +" /pixel "+X(8,pixels[j+i ])+" <- "+X(8,defPixel) //S9a + +"/fixit="+((dbgnofix()?"no":"yes"))); //S9a + + if (!dbgnofix()) //in case someone wants to keep noise //S9a + { //S9a + if (i >= a+w) //line above is available //S9a + { + pixels[j+i] = pixels[j+i-w];//copy from line above //S9a + bp12[j+i] = bp12[j+i-w]; //...and fix up results //S9a + t2 = t3; //prepare the history //S9a + } + else //we are on the first line //S9a + { + pixels[j+i] = defPixel; //replace with "best of 3" for col //S9a + bp12[j+i] = defBP12; //...and fix up results //S9a + t2 = colclstr[j]; //prepare the history //S9a + } + } //endif replace with "best of 3" //S9a + } //endif background opacity mismatch //S9a + + //------------correct any singleton pixels using line above----------- //S9a + if (t2!=t3 && t3!=t4 //singleton >>quant<< NB not single pixel //S9a + && i>=a+w //..&& line above avail && not grnd pixel //S9a + && (colgrnd[j]>GD && t3!=QD) //not (col grnd dark/transp & pixel dark) //S9a20090202 =!! + && (colgrnd[j]>GT && t3!=QT) ) //not (col grnd transp only & pxl transp) //S9a20090202 =!! + { //....assume noise and repair it //S9a + //-----------------------------------------------------------------------//S9a + //Following code is to repair transmission errors/noise appearing as a //S9a + //line of pixels of 'wrong' quant. We are scanning vertically and can //S9a + //easily detect this. By this strategy we'll also 'fix' some singleton //S9a + //dithering pixels - though only those on the boundary between clstr //S9a + //and grnd, where the visual effect is insignificant. But we won't fix //S9a + //any (non lite) grnd singletons to avoid bulking up of text glyphs //S9a + //(genuine dark errors look ok, like neg video modulation on analog TV) //S9a + //-----------------------------------------------------------------------//S9a +if (dbgSub(3)) System.out.println("singleton "+"/pic "+d(5,picCount) //S9a20090105 + +"/t "+d(2,t)+"/x "+d(3,j)+"/y "+d(3,(i-a)/w)+"/colgrnd "+d(1,colgrnd[j]) //S9a20090105 + +"/colclstr "+d(2,colclstr[j])+"/t2,t3,t4 "+X(1,t2)+" "+X(1,t3)+"* "+X(1,t4) //S9a + +" /pixel "+X(8,pixels[j+i-w])+" <- "+X(8,pixels[j+i-2*w]) //S9a + +"/fixit="+((dbgnofix()?"no":"yes"))); //S9a + + if (!dbgnofix()) //in case user wants to keep noise //S9a + { //S9a + pixels[j+i-w] = pixels[j+i-2*w]; //copy from line above //S9a + bp12[j+i-w] = bp12[j+i-2*w]; //...and the result //S9a + t3 = t4; //rewrite the history of singleton //S9a + } //endif copy from row above //S9a + } //endif singleton clstr //S9a + +if (dbgpic()==picCount) System.out.println("dbgpic "+"/pic "+d(5,picCount) //S9a20090105 + +"/t "+d(2,t)+"/x "+d(3,j)+"/y "+d(3,(i-a)/w)+"/colgrnd "+d(1,colgrnd[j]) //S9a20090105 + +"/colclstr "+d(2,colclstr[j])+"/pq-2 "+d(2,t3)+"/pq-1 "+d(2,t2) //S9a + +"/Q "+X(8,myQLHI.N)+" pixel "+X(8,t1)); //S9a20090106 + + //------------on new quant, delay any action for one pixel------------ //S9a + //first with new quant is potential noise..only vertical runs > 2 credible //S9a + t4 = t3; t3 = t2; //update stack of recent history //S9a + if (t3 != t4) //pixel quant diff from one above //S9a + if (i < b-w) //not last line->no further action //S9a + continue; //..note history already stacked //S9a //S9a + + //------------if pixel now acceptable add it to the column------------ //S9a + if (colclstr[j] == t2) continue; //col clstr already matches pixel //S9a + if (colgrnd[j]==GL && t2==QL) continue; //col has lite grnd and pixel lite //S9a20090202 =!! + if (colgrnd[j]<=GD && t2==QD) continue; //col grnd dark/transp & pxl dark //S9a20090202 =!! + if (colgrnd[j]==GT && t2==QT) continue; //col grnd transp only & pxl transp //S9a20090202 =!! + + if ((colclstr[j]==QD || colclstr[j]==QL) //col only has grnd pixels and... //S9a20090202 =!= + && t2 >= QN) //...this pixel has nongrnd color //S9a20090116 =!= + { colclstr[j] = t2; continue; } //column now gets specific color //S9a + + //--------pixel doesn't fit hue cluster or grnd for this column------- //S9a +if (dbgSub(3)) System.out.println("alien pixel"+"/pic "+d(5,picCount) //S9a20090105 + +"/t "+d(2,t)+"/x "+d(3,j)+"/y "+d(3,(i-a)/w)+"/colgrnd "+d(1,colgrnd[j]) //S9a20090105 + +"/colclstr "+d(2,colclstr[j])+"/t2,t3,t4 "+X(1,t2)+" "+X(1,t3)+"* "+X(1,t4) //S9a + +" /pixel "+X(8,pixels[j+i ])+" <- "+X(8,defPixel) //S9a + +"/fixit="+((dbgnofix()?"no":"yes"))); //S9a + e += 1; //count alien pixels for main log //S9a + if (!dbgnofix()) //fixups not inhibited //S9a + { //S9a + pixels[j+i] = defPixel; //replace with "best of 3" for col //S9a + bp12[j+i] = defBP12; //...and fix up results //S9a + t3 = colclstr[j]; //rewrite the stacked history //S9a + continue; //S9a + } //S9a + } //end for each pixel in column //S9a + } //end for each column in textrow //S9a + + if (e > 0) //S9a +Common.setMessage(e+" alien pixels "+(dbgnofix()?"not ":"")+"masked in pic "+d(5,picCount) //S9a + +" at PTS: "+Common.formatTime_1(bitmap.getInTime() / 90)+"/textrow "+d(1,t)); //S9a + + /*------------join uncolored cols with colored neighbors of same grnd--------------*///S9a + /*----------join ungrounded cols with same color neighbors of known grnd-----------*///S9a + /*----------(must know col grnd & quant to set area info -> select grad)-----------*///S9a + for (int g=0, q=0, j=0; j < w; j++) //smear col definitions from LEFT //S9a20090109 + { //S9a20090106 + t1 = colgrnd[j]; t2 = colclstr[j]; t3 = g; t4 = q; //for debug //S9a20090109 + + if (colgrnd[j]==GU && colclstr[j]==q) //S9a20090202 ==! + colgrnd[j] = g; //same clstr, grnd undecided -> fix undecided grnd //S9a20090109 + else + g = colgrnd[j]; //update running grnd for next col //S9a20090109 + + if (colgrnd[j]==g && colclstr[j]==QD && q>QD) //S9a20090116 =!= + colclstr[j] = q; //same gd, col dk/tr, prv not dk/tr -> fix dk/tr col //S9a20090109 + else + q = colclstr[j]; //update running clstr for next col //S9a20090109 + +if (dbgpic()==picCount || dbgSub(4)) System.out.println("smear from left " //S9a20090116 + +"/pic "+d(5,picCount)+"/t "+d(2,t)+"/x "+d(3,j)+"/colgrnd "+X(1,t1)+"->" //S9a20090109 + +X(1,colgrnd[j])+" /colclstr "+X(1,t2)+"->"+X(1,colclstr[j])+" / g "+X(1,t3)+"->"//S9a20090109 + +X(1,g)+" / q "+X(1,t4)+"->"+X(1,q)+((colgrnd[j]!=t1||colclstr[j]!=t2)?"*":" "));//S9a20090109 + } //S9a20090106 + for (int g=0, q=0, j=w-1; j >= 0; j--) //smear col definitions from RIGHT //S9a20090109 + { //S9a20090106 + t1 = colgrnd[j]; t2 = colclstr[j]; t3 = g; t4 = q; //for debug //S9a20090109 + + if (colgrnd[j]==GU && colclstr[j]==q) //S9a20090202 ==! + colgrnd[j] = g; //same clstr, grnd undecided -> fix undecided grnd //S9a20090109 + else + g = colgrnd[j]; //update running grnd for next col //S9a20090109 + + if (colgrnd[j]==g && colclstr[j]==QD && q>QD) //S9a20090116 =!= + colclstr[j] = q; //same gd, col dk/tr, prv not dk/tr -> fix dk/tr col //S9a20090109 + else + q = colclstr[j]; //update running clstr for next col //S9a20090109 + +if (dbgpic()==picCount || dbgSub(4)) System.out.println("smear from right " //S9a20090106 + +"/pic "+d(5,picCount)+"/t "+d(2,t)+"/x "+d(3,j)+"/colgrnd "+X(1,t1)+"->" //S9a20090109 + +X(1,colgrnd[j])+" /colclstr "+X(1,t2)+"->"+X(1,colclstr[j])+" / g "+X(1,t3)+"->"//S9a20090109 + +X(1,g)+" / q "+X(1,t4)+"->"+X(1,q)+((colgrnd[j]!=t1||colclstr[j]!=t2)?"*":" "));//S9a20090109 + } //S9a20090106 + + //If we find a lite grnd area with a clstr having < 4 shades >>in the UCT<< then //S9a20090116 + //the color background won't be 'b' (to match the lite grnd grad) and we will fail. //S9a20090116 + //Also lite pxls have been mixed up with top color (both 'e2') over the whole area! //S9a20090116 + //This cannot be fixed earlier - only now do we know the grnd for every col. One //S9a20090116 + //day we will fix this, but UK (only known lite grnd) doesn't have sparse >>UCTs<< //S9a20090116 + // //S9a20090116 + //Tentative solution: when lite pxl enters nondark column set bp12 to 7. Then //S9a20090116 + //(here) for any lite area, search and fix the bp12s (need to know # shades in UCT) //S9a20090116 + + + /*--------use col grnd & quant to set area info (-> select grad in commands)-------*///S9a + /*-------any remaining undefined grnd (would be a logic err) set to rev video------*///S9a + for (int q=-1, g=-1, j=0; j < w; j++) //create list of areas for PX_CTLI //S9a + if (colclstr[j]!=q || colgrnd[j]!=g) //clustr/grnd different->new area //S9a20090105 + alist.add(new Area(t,((colgrnd[j]==g && j>0)? j-1 : j),(q = colclstr[j]), //S9a20090122 + //2nd param: same grnd->take prev col into this area (room for outline) //S9a20090122 + //4th param=grnd flags: 2**0->lite; 2**1->transp+outline; ok to set both //S9a20090117 + ( (((g = colgrnd[j])>=GL)?1:0) | ((dbgSolid()&&colgrnd[j]!=GT)?0:2) ) )); //S9a20090202 =!! + + aindx[t+1].tlimit(alist.size()); //update alist index at end of row //S9a + } //end for each textrow //S9a + +if (dbgSub(2)) dumpAreas("areas2"); //S9t20090122 + +if (!dbgSolid()) allOutline(bitmap); //if transparent requested do outlining //S9a20090117 + + } //S9a20090105 + + private void allOutline(Bitmap bitmap) //apply a one pxl 'p' outer border, also... //S9b20090117 + { //...an inner 'e1' border if grnd is lite //S9b20090117 + Area[] areas = (Area[])(alist.toArray(new Area[alist.size()])); //cast entire list //S9a20090117 + int textrows = areas[0].trow(); //how many rows of text //S9a20090117 + int bitmapY = bitmap.getY(); //top line of 1st row //S9a20090117 + int bitmapX = bitmap.getX(); //left edge on screen //S9a20090117 + int bitmapW = bitmap.getWidth(); //as multiplier for y //S9a20090117 + for (int t = 0; t < textrows; t++) //for each text row in subpic //S9a20090117 + { //S9a20090117 + int topY = areas[t+1+textrows].trow(); //y for trow top line //S9a20090117 + int btmY = areas[t+1+textrows].start(); //y trow bottom line //S9a20090117 + int bgnrow = areas[t+1].tfirst(); //index of first area this row //S9a20090117 + int nxtrow = areas[t+1].tlimit(); //index of last area to process //S9a20090117 + for (int p=bgnrow; p"+X(1,bp12[j])+((e!=bp12[j])?"*":" ")); //S9b20090122 + } //S9b20090122 + + //pass two - change all 'b' within one pixel of an 'e2' to 'p' (to fix outside of edge) //S9b20090117 + // - and if grnd lite also change those 'e2' to 'e1' (also fix inside of edge) //S9b20090117 + for (int h=xL+1, i=xR-1; h0) { p2++;} //collect pass two stats //S9b20090122 + if (p>0 && (aG&1)>0) { bp12[j]=2; p3++;} //p>0 <- we're at inside edge //S9b20090117 + +if (dbgpic()==picCount||dbgSub(7)) System.out.println("outline2: x="+d(4,h)+" y="+d(4,(j-h)/bW) //S9b20090122 + +" bp12[j="+d(5,j)+"] "+X(1,e)+"->"+X(1,bp12[j])+((e!=bp12[j])?"*":" ") //S9b20090122 + +" p="+X(3,p)); //S9b20090122 + } //S9b20090117 + +if (dbgSub(3)) System.out.println("outline3: "+" xL="+d(3,xL)+" xR="+d(3,xR) //S9b20090117 + +" yT="+d(3,yT)+" yB="+d(3,yB)+" p1="+d(5,p1)+" p2="+d(5,p2)+" p3="+d(5,p3)); //S9b20090122 + } //S9b20090117 + + /*============== Bitmap of 2bit e2e1pb (cleared and built afresh for each subpic) ==============*/ + + public int[] bp12; //public so Subpicture.buildRLE can use it //S9 + + /*=============================== methods for Subpicture to call ===============================*/ + + private static int picCount = 0; //accumulate number of calls to analyse() //S9 + + public void analyse(Bitmap bitmap, ArrayList user_color_table) //S9 + { //called at start of Subpicture.buildRLE() //S9 + //quantises USER clr table & allocs e2e1pb //S9 + //creates list of XY areas for CH_COLCON //S9 + picCount++; //will update pixels to clear noise bursts!! //S9 + if (!active) return; //must call initialise() correctly first //S9 + + if (tables_rdy==0) analyseTCT(); //new TCT - finish init in dynamic context //S9i20090116 + +if (dbgSub(1)) System.out.println("Analysing pic "+d(5,picCount) //S9 20090105 + +" from PTS:"+Common.formatTime_1(bitmap.getInTime() / 90) //S9 20090105 + +" until"+Common.formatTime_1(bitmap.getInTime() / 90)); //S9 20090105 + + int pixels[] = bitmap.getPixel(); //S9 + + int w = bitmap.getWidth(); //S9 + int h = bitmap.getHeight(); //S9 + + /*-----USER clut to quantised hue + luminance + freq + index----*/ //S9 + int t1=0; int t2=0; int t3=0; int t4=0; int t5=0; //S9 + + + + int[] qCounts = new int[qNames.length]; //UCT index of most freq shade [by clstr #] //S9 + for (int a=0, x=qCounts.length; a QD) ? 1 : 0; //...only if not dark and not transparent //S9 20090116 =!= + qCounts[t2] += t1; //if enabled count shades in cluster //S9 + } //S9 + + t2 = 0; t3 = 0; t4 = 0; //pass three - map to static PGC CLUT //S9 + for (int i=0; i= clut_maps.length ? clut_maps[clut_maps.length-1] : clut_maps[t3]; //BP12 map for that # of shades //S9 + + t2 = -1; //prepare the BP12 generator Igor! //S9 + t4 = t5; //same map till next cluster //S9 + } //S9 + //these are the various overides to the basic map tables... + if (t5 <= QD) t2 = 0x3C; //all transp and dark are forced to 'b' //S9 20090116 =!= + if (t3 == 0) t2 |= 0x3C; //by design: map exhausted->repeat last BP12 //S9 + //each nibble of the map specifies how many shades map to one subpic value //S9 + //t2 & 0x3C is count down; next nibble done with 'while' as any map nibble //S9 + //...can be zero; t2 & 0x03 is current subpic value (b/p/e1/e2 aka BP12) //S9 + while (t2 < 4) {t2++; t2 |= (0x0F & t3)<<2; t3>>=4;} //next BP12 & counter //S9 + t2 -= 4; //countdown on one map nibble //S9 + myQLHI.bp12(0x03 & t2); //assign color to e2/e1/p/b //S9 + if (t5 == QN && myQLHI.lum() > 0xB8) //sweep light white (only) to lite quant //S9 20090116 =!= + { myQLHI.quant(QL); } //...AFTER they are given BP12 values //S9 20090116 =!= + + t1 = quants[i].inUCT(); // for dbg //S9 20090101 +if (dbgSub(2)) System.out.println("BP12 mapping: QLAI["+d(3,i)+"]="+X(8,quants[i].N) //S9 20090101 + +s(8,qNames[quants[i].quant()])+" count="+d(5,freq[t1]) //S9 20090103 + +" {qCounts "+d(2,qCounts[t5])+" / maps left "+X(4,t3)+"/t2 "+d(2,t2) //S9 20090101 + +"} UCT["+d(3,t1)+"]="+X(8,Integer.parseInt(user_color_table.get(t1).toString()))); //S9 20090101 + } //S9 + + Arrays.sort(quants, UCT_ORDER); // <----- order by contributing UCT index //S9 +if (dbgSub(4)) dumpquants("QHLI by UCTidx ",user_color_table); //S9 + + /*--------find how many rows of text in this subpicture---------*/ //S9 + alist.clear(); //we deliver new area list & bp12[] //S9 + findTextRows(bitmap); //alist <- header + 2 entries per textrow //S9 20090102 + + /*-----------within each text row analyse the columns-----------*/ //S9 + collectAreas(bitmap, user_color_table); //alist <- 1 entry per color area //S9 20090105 + + + bitmap.setPixel(pixels); //send back updates (to clear noise)!! //S9 + //pass back fixed up bitmap so other formats (e.g. SON) can benefit but it doesn't work //S9 + } //S9 + + /*==============================================================================================*/ + public byte[] commands(int command_start_pos, int bottom_field_start_pos, Bitmap bitmap) //S9= + //called near end of Subpicture.buildRLE() //S9= + //has complete control of command buffer //S9= + { //includes CHG_COLCON with list of XY areas //S9= + if (!active) return new byte[0]; //main switch for multicolor DVB to DVD //S9= + + ByteArrayOutputStream b = new ByteArrayOutputStream(); //S9= + int DCSQ1_link = 0; //position of link to fix //S9= + int DCSQ2_link = 0; //position of link to fix //S9= + int DCSQ1_pos = 0; //offset of the DCSQ //S9= + int DCSQ2_pos = 0; //offset of the DCSQ //S9= + + try + { + b.reset(); //S9= + + //-------------------------------first SP_DCSQ------------------------------- + DCSQ1_pos = command_start_pos + b.size(); //offset of this DCSQ //S9= + b.write(0); b.write(0); //delay //S9= + DCSQ1_link = b.size(); //where to fix link //S9= + b.write(0); b.write(0); //link to be fixed //S9= + + b.write(3); //command - static colors //S9= + b.write((byte)((dbgSolid())?0xDC:0xDD)); //force color index e2e1 //S9=20090202 + b.write((byte)((dbgSolid())?0xB1:0x11)); //force color index p b //S9=20090202 + + b.write(4); //command - static alpha //S9= + b.write((byte)((dbgSolid())?0xFF:0xFF)); //force alpha index e2e1 //S9=20090202 + b.write((byte)((dbgSolid())?0xFF:0xF0)); //force alpha index p b //S9=20090202 + + b.write(5); //command - screen position //S9= + int minX = bitmap.getX(); int maxX = bitmap.getMaxX() - 1; //S9= + int minY = bitmap.getY(); int maxY = bitmap.getMaxY() - 1; //S9= + b.write((byte)(minX>>>4)); b.write((byte)(minX<<4 | maxX>>>8)); b.write((byte)maxX); //S9= + b.write((byte)(minY>>>4)); b.write((byte)(minY<<4 | maxY>>>8)); b.write((byte)maxY); //S9= + + b.write(6); //command - pixel data pointers //S9= + b.write(0); b.write(4); // top_field follows header //S9= + b.write((byte)(bottom_field_start_pos>>>8)); // bottom_field MSB //S9= + b.write((byte)(bottom_field_start_pos)); // bottom_field LSB //S9= + + b.write(1); //command - start display //S9= + +if (!dbgnoCHG()) //suppress CHG_COLCON (and use weird BP12) to allow examination with supviewer //S9= +{ + //powerful spell needed because generics are theologically unacceptable in this realm //S9= + Area[] areas = (Area[])(alist.toArray(new Area[alist.size()])); //cast entire list //S9= + + b.write(7); //command - CHG_COLCON //S9= + int textrows = areas[0].trow(); //how many rows of text //S9= + int bitmapY = bitmap.getY(); //top line of 1st row //S9=20090109 + int bitmapX = bitmap.getX(); //left edge on screen //S9=20091006 + int paramsize = 6; //minimum param size (size + final LN_CTLI) //S9=20090101 + for (int t = 0; t < textrows; t++) //for each trow emit LN_CTLI (+ n * PX_CTLI) //S9=20081231 + { //S9=20081231 + int bgnrow = areas[t+1].tfirst(); //index of first area this row //S9=20081231 + int nxtrow = areas[t+1].tlimit(); //index of first area beyond row //S9=20081231 + int PX = nxtrow - bgnrow; //number of areas in this row //S9=20081231 + if (PX > 15) //cannot define > 15 areas //S9=20081231 + { //S9=20081231 +Common.setMessage(PX+" areas found for pic "+d(5,picCount) //S9=20081231 + +" at PTS: "+Common.formatTime_1(bitmap.getInTime() / 90)+"/textrow "+d(1,t)); //S9=20081231 + PX = 15; //restrict count of areas in row //S9=20081231 + areas[t+1].tlimit(bgnrow + PX); //restrict limit of areas in row //S9=20081231 + } //S9=20081231 + paramsize += PX * 6 + 4; //extra param size required for this row //S9=20090101 + } //S9=20081231 +if (dbgSub(2)) System.out.println("CHG_COLCON alist.size "+d(2,alist.size()) //S9= + +"/textrows "+d(2,textrows)+"/paramsize "+d(3,paramsize)); //S9= + b.write((byte)(paramsize>>>8)); //MSB CHG_COLCON param size //S9= + b.write((byte)(paramsize )); //LSB CHG_COLCON param size //S9= + for (int t = 0; t < textrows; t++) //for each trow emit LN_CTLI (+ n * PX_CTLI) //S9= + { //S9= + int topY = bitmapY + areas[t+1+textrows].trow(); //absolute y for trow top line //S9=20090103 + int btmY = bitmapY + areas[t+1+textrows].start(); //absolute y trow bottom line //S9=20090103 + int bgnrow = areas[t+1].tfirst(); //index of first area this row //S9= + int nxtrow = areas[t+1].tlimit(); //index of last area to process //S9= + int PX = nxtrow - bgnrow; //number of areas in this row //S9= + // LN_CTLI defines a horizontal band on screen - used to implement one row of text //S9= + // LN_CTLI = 0t tt nb bb : t = top line, b = bottom line, n = # of PX_CTLI following //S9= + byte[] xxLN = new byte[4]; //local array to ease debug //S9= + xxLN[0] = (byte)( 0x0F & topY>>>8); //MS 4 bits 1st screen line //S9= + xxLN[1] = (byte)( topY ); //LS 8 bits 1st screen line //S9= + xxLN[2] = (byte)(0xF0 & PX<<4 | 0x0F & btmY>>>8); //PX count & MS 4 bits last //S9= + xxLN[3] = (byte)( btmY ); //LS 8 bits last screen line //S9= + b.write(xxLN); //S9= +if (dbgSub(2)) System.out.println("LN_CTLI " //S9= + +X(2,xxLN[0])+" "+X(2,xxLN[1])+" "+X(2,xxLN[2])+" "+X(2,xxLN[3])); //S9= + + for (int p=bgnrow; plite grnd; 2**1->trnsp+outline //S9=20090117 + int cluster = areas[p].clstr() + (bgflags&1)*16; //extra offset if lite grnd //S9=20090117 +// cluster = (cluster+2-Q1)%(QM_q_free-Q1)+Q1; //cheap trick to test more grads //S9=20090117 =+= + + int color_e2e1bp = color_e2e1bp = TCTQ_grads[cluster]; //default dynamic grads //S9=20090117 +// if (dbgFxdQnt()) color_e2e1bp = clut_eepb[cluster]; //switch to static grads //S9=20090117 + int alpha_e2e1bp = 0xFFFF; //start with all opaque //S9=20090117 + + if ((bgflags&2)==2) //trnsp bkgrd plus text outline of bg color (on 'p' pxls) //S9=20090117 + { //copy 'b' index to 'p' in grad (bp12[] already updated) //S9=20090117 + if ((bgflags&1)==1) //lite grnd: use 'p' color for 'e1' pixels //S9=20090122 + color_e2e1bp = color_e2e1bp & 0xF0FF | color_e2e1bp<<4 & 0x0F00; //S9=20090122 + else //dark grnd: use 'e2' color for 'e1' pixels //S9=20090122 //S9=20090122 + if (!dbgInShad()) //...retain the shading for evaluation //S9=20090122 + color_e2e1bp = color_e2e1bp & 0xF0FF | color_e2e1bp>>>4 & 0x0F00; //S9=20090122 + //finished using 'p' index so replace it with 'b'index as promised //S9=20090202 + color_e2e1bp = color_e2e1bp & 0xFF0F | color_e2e1bp<<4 & 0x00F0; //S9=20090202 + alpha_e2e1bp = 0xFFF0; //trnsp the non-outline bkgrd (on 'b' pxls) //S9=20090202 + } //copy 'b' index to 'p' in grad (bp12[] already updated) //S9=20090117 +// color_e2e1bp = color_e2e1bp & 0xF000 | 0x0EF1; //UK diagnostic outline //S9=20090116 +// color_e2e1bp = 0xDEF1; //test - all areas as red //S9=20090116 + + // PX_CTLI redefines color & alpha from a given column onward within the LN_CTLI //S9= + // PX_CTLI = ss ss cc cc aa aa /s=start col, c=color index e2e1pb, a=alpha e2e1pb //S9= + byte[] xxPX = new byte[6]; //local array to ease debug //S9= + xxPX[0] = (byte)(firstCol >>>8); //MSB 1st column new colour //S9= + xxPX[1] = (byte)(firstCol ); //LSB 1st column new colour //S9= + xxPX[2] = (byte)(color_e2e1bp>>>8); //new color indices e2+e1 //S9= + xxPX[3] = (byte)(color_e2e1bp ); //new color indices p + b //S9= + xxPX[4] = (byte)(alpha_e2e1bp>>>8); //new alpha values e2+e1 //S9= + xxPX[5] = (byte)(alpha_e2e1bp ); //new alpha values p + b //S9= + b.write(xxPX); //S9= +if (dbgSub(2)) System.out.println("PX_CTLI "+X(2,xxPX[0])+" "+X(2,xxPX[1])+" " //S9= + +X(2,xxPX[2])+" "+X(2,xxPX[3])+" "+X(2,xxPX[4])+" "+X(2,xxPX[5])); //S9= + } //S9= + } //S9= + byte[] xxZZ = { 15, -1, -1, -1}; //final LN_CTLI (always 0F FF FF FF) //S9= + b.write(xxZZ); //S9= +if (dbgSub(2)) System.out.println("LN_CTLI " //S9= + +X(2,xxZZ[0])+" "+X(2,xxZZ[1])+" "+X(2,xxZZ[2])+" "+X(2,xxZZ[3])); //S9= + +} //end debug without CHG_COLCON //S9= + + b.write(-1); //command - end of DCSQ //S9= + + //-------------------------------second SP_DCSQ------------------------------ + DCSQ2_pos = command_start_pos + b.size(); //offset of this DCSQ //S9= + b.write((byte)(bitmap.getPlayTime() >>>8)); //delay for end display //S9= + b.write((byte)(bitmap.getPlayTime() )); //delay for end display //S9= + DCSQ2_link = b.size(); //where to fix link //S9= + b.write(0); b.write(0); //link to be fixed //S9= + b.write( 2); //command - stop display //S9= + b.write(-1); //command - end of DCQS //S9= + + b.flush(); //S9= + } catch (IOException e) { //S9= + + Common.setExceptionMessage(e); //S9= + } //S9= + byte[] ret = b.toByteArray(); //S9= + ret[DCSQ1_link ] = (byte) (DCSQ2_pos >>>8); //link up the DCSQ chain //S9= + ret[DCSQ1_link+1] = (byte) (DCSQ2_pos ); //DCSQ1 points to DCSQ2 //S9= + ret[DCSQ2_link ] = (byte) (DCSQ2_pos >>>8); //link up the DCSQ chain //S9= + ret[DCSQ2_link+1] = (byte) (DCSQ2_pos ); //DCSQ2 points to itself //S9= + //anything more complicated and (e.g.) PowerDVD will ignore the delays! //S9= + + return ret; //caller must do word alignment //S9= + } //S9= + + /*==============================================================================================*/ + + private static long supCount = 0; //accumulate byte position in sup file //S9 + + public void dumpHdrAndCmd(byte b[]) { //S9 + + //this is >application< debug code - it relies on the subpic being correctly formed //S9 + //therefore it should also work for the original Project X (before multicolor commands) //S9 + //it will almost certainly break if the RLE header pointers are wrong //S9 + + + System.out.println("SUPADR= "+X(8,(int)supCount)+" pic "+d(5,picCount)); //addr in supfile //S9 + + System.out.println(">header "+X(2,b[0])+" "+X(2,b[1])+" start "+X(2,b[2])+" "+X(2,b[3])+" "+X(2,b[4])); //S9 + System.out.println(" length "+X(2,b[10])+" "+X(2,b[11])+" cmds "+X(2,b[12])+" "+X(2,b[13])); //S9 + + int c = 10 + ((b[12] & 0xFF)<<8 | b[13] & 0xFF); //offset to commands //S9 + int e = 10 + ((b[10] & 0xFF)<<8 | b[11] & 0xFF); //offset to end of buffer //S9 +// assert (c <= e); //defensive for malformed RLE header //S9 + while (c < e) //do entire command buffer //S9 + { + System.out.println("SUPADR= "+X(8,(int)supCount+c)+" offset "+X(4,c-10)); //addr in supfile //S9 + System.out.println(">delay "+X(2,b[c++])+" "+X(2,b[c++])+" next "+X(2,b[c++])+" "+X(2,b[c++])); //S9 + cmd: while (c < e) //commands in one SP_DCSQ //S9 + { + // System.out.println("c "+X(4,c)+"/e "+X(4,e)); //S9dbg + switch (b[c]) { //S9 + case 1: System.out.println(" start "+X(2,b[c++])); break; //S9 + case 2: System.out.println(" stop "+X(2,b[c++])); break; //S9 + case 3: System.out.println(" color "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])); break; //S9 + case 4: System.out.println(" alpha "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])); break; //S9 + case 5: System.out.println(" screen "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++]) //S9 + +" "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])); break; //S9 + case 6: System.out.println(" fields "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++]) //S9 + +" "+X(2,b[c++])+" "+X(2,b[c++])); break; //S9 + case 7: System.out.println(" change "+X(2,b[c++])+" paramsz "+X(2,b[c++])+" "+X(2,b[c++])); //S9 + System.out.println(" line1 "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])); //S9 + for(int pm=((0xFF&b[c-6])<<8|0xFF&b[c-5])-6, n=1; pm > 0; pm-=4, n++) { //pm=param bytes left //S9 + for(int px=(0xFF&b[c-2])>>4; px > 0; px--, pm-=6) { //px=PX_CTLI (areas) left //S9 20081231 + // System.out.println("pm "+d(3,pm)+"/px "+d(3,px)+"/c "+X(4,c)); //S9dbg + System.out.println(" area"+n+" "+X(2,b[c++])+" "+X(2,b[c++]) //S9 + +" "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])); //S9 + } //S9 + // System.out.println("pm "+d(3,pm)+"/ /c "+X(4,c)); //S9dbg + System.out.println(" line"+(n+1) //S9 + +" "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])+" "+X(2,b[c++])); //S9 + } break; //S9 + case -1:System.out.println(" quit "+X(2,b[c++])); break cmd; //exit inner loop //S9 + default:System.out.println(" other "+X(2,b[c++])); break; //S9 + } //end switch //S9 + } //end while one SP_DCSQ //S9 + while (c < e && b[c] == -1) //0xFF unlikely as delay //S9 + { //S9 + System.out.println(" filler "+X(2,b[c++])); //S9 + } //end while padding //S9 + } //end while command buffer //S9 + supCount += c; //S9 + System.out.println("SUPADR= "+X(8,(int)supCount+c)+" size "+X(4,e-10)); //addr in supfile //S9 + } //S9 +} //S9 diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/DVBSubpicture.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/DVBSubpicture.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/DVBSubpicture.java 2006-03-12 17:36:08.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/DVBSubpicture.java 2010-11-27 13:01:02.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)DVBSubpicture.java - decodes DVB subtitles * - * Copyright (c) 2004-2005 by dvb.matt, All rights reserved + * Copyright (c) 2004-2009 by dvb.matt, All rights reserved * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -30,6 +30,10 @@ * it does not yet implement export (only log it) of encoded string characters, only bitmapped pictures * */ +/* + * stenographic subtitling patch (BBC) by Duncan (Shannock9) UK + * 2008-12 + */ package net.sourceforge.dvb.projectx.subtitle; @@ -40,14 +44,24 @@ import java.awt.image.BufferedImage; import java.util.Hashtable; import java.util.Enumeration; +import java.util.Arrays; import net.sourceforge.dvb.projectx.common.Resource; import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Keys; + +import net.sourceforge.dvb.projectx.subtitle.ColorAreas; //S9 public class DVBSubpicture extends Object { private byte data[]; - private int BytePosition, BitPosition; + + private int width = Common.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_enableHDSub) ? 1920 : 720; + private int height = Common.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_enableHDSub) ? 1088 : 576; + + private int BytePosition; + private int BitPosition; + private Graphics2D big; private BufferedImage bimg; private Epoch epoch; @@ -56,14 +70,16 @@ private CLUT clut; private OBJECT object; private Hashtable epoches = new Hashtable(); + private int table_CLUT_8bit[]; private int IRD; private int epoch_id = 0; private boolean biglog; - private int pixel_data[], preview_pixel_data[]; + private int[] pixel_data; + private int[] preview_pixel_data; private long pts; - private int width = 720, height = 576; - private int from_index, to_index; + private int from_index; + private int to_index; private boolean picture_saved; private boolean save; private boolean preview_visible = false; @@ -86,13 +102,25 @@ { IRD = val; //2,4,8 = 4,16,256-color support - //DM13062004 081.7 int04 add++ - user_table = table; - user_table_enabled = !user_table.isEmpty(); //DM23062004 081.7 int05 changed + if (!table.isEmpty()) + IRD = Integer.parseInt(table.get("model").toString().trim()); - if (user_table_enabled) - IRD = Integer.parseInt(user_table.get("model").toString().trim()); - //DM13062004 081.7 int04 add-- + //goes inactive if bit0 is not set through model ID + ColorAreas.initialise(IRD, log, table); //stream startup event //S9 20090113 + + //sets full 8 bit decode and disable colortable if CA is active + if ((IRD & 1) == 1) + { + IRD = 8; + user_table = null; + user_table_enabled = false; + } + + else + { + user_table = table; + user_table_enabled = !user_table.isEmpty(); + } biglog = log; resetEpoch(); @@ -325,8 +353,25 @@ //long new_time_out = (long)Math.round((pts - page.getTimeIn()) / 900.0); 1000 long new_time_out = 1L + ((pts - page.getTimeIn()) / 1024); - if (page.getTimeOut() > 0 && new_time_out > page.getTimeOut()) + if (page.getTimeOut() > 0 && new_time_out > page.getTimeOut()) // maybe wrong new_time_out = page.getTimeOut(); + // if (page.getTimeOut() > 0 && new_time_out > (page.getTimeOut() / 10)) + // new_time_out = page.getTimeOut() / 10; + if (page.getTimeOut() > 0 && pts == -1) // -1 means take proposed play time + new_time_out = page.getTimeOut() / 10; + +// + if (page.getTimeOut() > 0 && Common.getCollection().getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_rebuildPictPTS)) // -1 means take proposed play time + new_time_out = page.getTimeOut() / 10; +// + +//Common.setMessage("!> debug Info : px " + page.getX() + " / py " + page.getY() + " / pw " + page.getWidth() + " / ph " + page.getHeight() + " (VN): " + page.getVersionNumber()); + + if (page.getWidth() <= 0 || page.getHeight() <= 0 || page.getWidth() > width || page.getHeight() > height) + { + Common.setMessage("!> Page ignored (VN): " + page.getVersionNumber() + "; (size error) " + page.getWidth() + " * " + page.getHeight()); + return; + } int page_pixel_data[] = new int[page.getWidth() * page.getHeight()]; @@ -343,7 +388,8 @@ picture_saved = true; - addBigMessage("time: in " + page.getTimeIn() + " /len " + new_time_out + " /save " + save + " /prev " + preview_visible); + addBigMessage("time: in " + page.getTimeIn() + " /len " + new_time_out + " /save " + save + " /prev " + preview_visible //S9dbg + + " <>"); //S9dbg } private int page_composition() @@ -362,7 +408,8 @@ flushBits(2); - addBigMessage("pagecomp: state " + page.getState() + " /page " + page.getId() + " /pv " + page.getVersionNumber() + " /to " + time_out); + addBigMessage("pagecomp: state " + page.getState() + " /page " + page.getId() + " /pv " + page.getVersionNumber() + " /to " + time_out //S9dbg + + " " + ((page.getState()<1) ? "" : (page.getState()<2) ? "<>" : "<>")); //S9dbg if (page.getState() > 0) { @@ -378,14 +425,19 @@ if (region.getErrors() > 0) { Common.setMessage(Resource.getString("subpicture.msg.error.dvbdecoding", "" + region.getErrors(), "" + region.getId(), "" + page.getTimeIn())); - //region.setActive(false); + + if ((region.getErrors() & 4) != 0) + { + Common.setMessage("!> Region ignored (VN): " + region.getVersionNumber()); + region.setActive(false); + } } addBigMessage("enum: region " + region.getId() + " /err " + region.getErrors() + " /acti " + region.isActive() + " /chng " + region.isChanged() + " /ti_o " + time_out); -// + if ( page.getState() == 0 && time_out > 6000 ) continue; -// + region.setError(0); //DM23062004 081.7 int05 add @@ -397,8 +449,16 @@ page.addArea(region.getXBound(), region.getYBound(), region.getWidth(), region.getHeight()); - for (int a = 0; a < region.getHeight(); a++) - System.arraycopy(pixel_data, a * region.getWidth(), preview_pixel_data, region.getXBound() + ((region.getYBound() + a) * width), region.getWidth()); + try { + + for (int a = 0; a < region.getHeight(); a++) + System.arraycopy(pixel_data, a * region.getWidth(), preview_pixel_data, region.getXBound() + ((region.getYBound() + a) * width), region.getWidth()); + + } catch (Exception ex) { + + region.setError(8); + Common.setMessage(Resource.getString("subpicture.msg.error.dvbdecoding", "" + region.getErrors(), "" + region.getId(), "" + page.getTimeIn())); + } segment_type = 0x80; @@ -418,8 +478,11 @@ epoch.clearObjects(); } + page.setTimeIn(pts); // for stenographic subtitling //S9 + page.setTimeOut(time_out); //page_time_out, seconds to stand + //empty pages may define CLUTs without regions while (BytePosition < segment_end) { region = epoch.setRegion(getBits(8)); //region_ids of this epoch @@ -447,6 +510,9 @@ flushBits(3); + int old_w = region.getWidth(); + int old_h = region.getHeight(); + region.setWidth(getBits(16)); region.setHeight(getBits(16)); region.setLevelOfCompatibility(getBits(3)); @@ -458,17 +524,33 @@ clut = epoch.setCLUT(CLUT_id); //CLUT_id region.setCLUT_id(CLUT_id); + + //background pixel code region.setPixelCode_8bit(getBits(8)); region.setPixelCode_4bit(getBits(4)); region.setPixelCode_2bit(getBits(2)); - pixel_data = region.initPixel(); + if (!region.isActive() || !region.getFillFlag()) //retain prev obj data //S9 + { + if (old_w == region.getWidth() && old_h == region.getHeight()) + pixel_data = region.getPixel(); //...for stenographic //S9 + else //S9 + pixel_data = region.initPixel(); + } + else //S9 + pixel_data = region.initPixel(); + + if (pixel_data == null) //but during acquisition //S9 + pixel_data = region.initPixel(); //...need dummy previous //S9 flushBits(2); paintRegionBackground(); - addBigMessage("regcomp: page " + page.getId() + " /reg " + region.getId() + " /rv " + region.getVersionNumber() + " /lv " + region.getCompatibility() + " /clut " + clut.getId() + " /activ " + region.isActive()); + addBigMessage("regcomp: page " + page.getId() + " /reg " + region.getId() + " /rv " + region.getVersionNumber() + + " /rw " + region.getWidth() + " /rh " + region.getHeight() + " /pxl " + pixel_data.length + + " /lv " + region.getCompatibility() + " /clut " + clut.getId() + + " /activ " + region.isActive() + " /fill " + region.getFillFlag()); //S9 while (BytePosition < segment_end) { @@ -548,7 +630,7 @@ addBigMessage("addclut: " + CLUT_entry_id + " /flag " + Integer.toHexString(flag).toUpperCase() + " /ARGB " + Integer.toHexString(ARGB).toUpperCase() + " /range " + full_range_flag); for (int i=0; i<3; i++) - clut.setClutEntry(mapColorIndex(CLUT_entry_id, region.getDepth(), 2< pixel_data.length || to_index < 0 || to_index > pixel_data.length) + { + region.setError(1); + return; + } + + Arrays.fill(pixel_data, from_index, to_index, color); } // not yet exported, only info for existence @@ -1071,14 +1163,20 @@ return color_index; } + //in case of undefined regions take regular 8 bit (256col) depth = flag 4 + private int getRegionDepth() + { + return (region != null ? region.getDepth() : 4); + } + //DM13062004 081.7 int04 add private void setUserClut() { int model = Integer.parseInt(user_table.get("model").toString().trim()); int max_indices = model > 2 ? (model > 4 ? 256 : 16) : 4; - if (region.getDepth() < model) - max_indices = region.getDepth(); + if (getRegionDepth() < model) + max_indices = getRegionDepth(); for (int i = 0; i < max_indices; i++) { @@ -1086,7 +1184,7 @@ { addBigMessage("addUserClut: " + i + " /ARGB " + user_table.get("" + i)); - clut.setClutEntry(mapColorIndex(i, region.getDepth(), model), model, (int)Long.parseLong(user_table.get("" + i).toString().trim(), 16)); + clut.setClutEntry(mapColorIndex(i, getRegionDepth(), model), model, (int)Long.parseLong(user_table.get("" + i).toString().trim(), 16)); } } } @@ -1204,7 +1302,10 @@ private long time_in = 0; private int time_out = 0; private int state; - private int minX = 720, minY = 576, maxX = 0, maxY = 0; + private int minX = width; + private int minY = height; + private int maxX = 0; + private int maxY = 0; private int pixel[]; private boolean write = false; @@ -1268,7 +1369,7 @@ private int[] initPixel() { - return (pixel = new int[720 * 576]); + return (pixel = new int[width * height]); } private int[] getPixel() @@ -1288,8 +1389,8 @@ private void clearArea() { - minX = 720; - minY = 576; + minX = width; + minY = height; maxX = maxY = 0; } @@ -1298,10 +1399,21 @@ int x2 = x + w; int y2 = y + h; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x2 > maxX ? x2 : maxX; - maxY = y2 > maxY ? y2 : maxY; + int _minX = x < minX ? x : minX; + int _minY = y < minY ? y : minY; + int _maxX = x2 > maxX ? x2 : maxX; + int _maxY = y2 > maxY ? y2 : maxY; + + if (_minX < 0 || _minY < 0 || _maxX < 0 || _maxY < 0 || (_maxX - _minX) < 0 || (_maxY - _minY) < 0) + { + Common.setMessage("!> decoding error: page area, page_id " + getId() + "[" + _minX + "," + _minY + "," + _maxX + "," + _maxY + "] (pts " + getTimeIn() + ")"); + return; + } + + minX = _minX; + minY = _minY; + maxX = _maxX; + maxY = _maxY; } private int getX() @@ -1334,8 +1446,8 @@ private boolean fill_flag; private boolean active = false; private boolean changed = false; - private int width; - private int height; + private int r_width; + private int r_height; private int x; private int y; private int level_of_compatibility; @@ -1391,7 +1503,7 @@ private int[] initPixel() { - return (pixel = new int[width * height]); + return (pixel = new int[r_width * r_height]); } private int[] getPixel() @@ -1422,22 +1534,22 @@ private void setWidth(int val) //max 720, if h_address =1 { - width = val; + r_width = val; } private int getWidth() { - return width; + return r_width; } private void setHeight(int val) //max 576, if v_address =1 { - height = val; + r_height = val; } private int getHeight() { - return height; + return r_height; } private void setLevelOfCompatibility(int val) //1,2,3 = 2,4,8bit supported colors by IRD, X can use all :) @@ -1465,6 +1577,11 @@ CLUT_id = val; } + private int getCLUT_id() + { + return CLUT_id; + } + private void setPixelCode_8bit(int val) //see fillflag, backgr CLUT entry { pixel_code_8bit = val; diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/Subpicture.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/Subpicture.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/Subpicture.java 2006-01-30 19:33:42.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/Subpicture.java 2009-10-25 22:24:40.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)SUBPICTURE.java - creates SUP file to use as DVD subtitles * - * Copyright (c) 2003-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -26,8 +26,13 @@ /* * thanx to Samuel Hocevar for his very helpful annotations of DVD subtitle RLE stuff - * http://www.via.ecp.fr/~sam/doc/dvd/ + * http://sam.zoy.org/writings/dvd/subtitles/ */ +/* + * multicolor subtitling patch (UK Freeview) by Duncan (Shannock9) UK + * 2008-12 + */ + package net.sourceforge.dvb.projectx.subtitle; @@ -59,8 +64,8 @@ public class Subpicture extends Object { - private int w = 720; - private int h = 576; + private int w = Common.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_enableHDSub) ? 1920 : 720; + private int h = Common.getSettings().getBooleanProperty(Keys.KEY_SubtitlePanel_enableHDSub) ? 1088 : 576; private int x = 20; private int nibble = 0; private int val = 0; @@ -177,6 +182,8 @@ 0 // full transparency black bg }; + private int[] alternative_sup_colors = new int[17]; + private Object[] str = new Object[0]; private byte[] RLEheader = { 0x53,0x50,0,0,0,0,0,0,0,0,0,0,0,0 }; // startcode + later reverse 5PTS, DTS=0 @@ -203,6 +210,7 @@ private int option[] = new int[11]; private int standard_values[] = { 26, 10, 32, 80, 560, 720, 576, -1, 4, 3, 1 }; private int isforced_status = 0; + private int ismulticolor_status = 0; private int line_offset = 28; private ArrayList user_color_table = new ArrayList(); @@ -218,6 +226,8 @@ public DVBSubpicture dvb = new DVBSubpicture(); + public ColorAreas s9CA = new ColorAreas(); //S9 + /** * */ @@ -254,9 +264,9 @@ /** * */ - public Image getScaledImage() + public Image getScaledImage(int scaled_w, int scaled_h) { - return bimg.getScaledInstance(384, 288, Image.SCALE_FAST); + return bimg.getScaledInstance(scaled_w, scaled_h, Image.SCALE_FAST); } /** @@ -265,7 +275,7 @@ public void paintPicture(byte[] array, int _width, int _height, int _scansize, int _x, int _y) { big.setColor(Color.gray); - big.fillRect(0, 0, 720, 576); + big.fillRect(0, 0, w, h); // bimg.setRGB(_x, _y, _width, _height, array, 0, _scansize); repaint(); @@ -514,92 +524,157 @@ { byte picture_packet[] = null; - try - { + try { - int pixels[] = bitmap.getPixel(); + if (ColorAreas.active) //multicolor DVB to SUP active //S9 + resetUserColorTable(); //so retention counterproductive //S9 - updateUserColorTable(pixels); + updateUserColorTable(bitmap.getPixel()); //base code re-ordered //S9 - out.reset(); - out.write(RLEheader); //start picture in .sup form + if (ColorAreas.active) //multicolor DVB to SUP active //S9 + s9CA.analyse(bitmap, getUserColorTable()); //which can correct noisy pixels!! //S9 - int bottom_field_start_pos = 0; + int pixels[] = bitmap.getPixel(); //base code re-ordered //S9 - // read out interlaced RGB - for (int i=0, l=0, a=0, b=0, color_index=0; i < 2; i++) - { - // top_field first - for (l=0, color_index=0, a = i * bitmap.getWidth(); a < pixels.length; a += (2 * bitmap.getWidth())) + out.reset(); + out.write(RLEheader); //start picture in .sup form + + int bottom_field_start_pos = 0; + int pgc_color = 0; //holds bp12 for a run of pixels //S9 + + // read out interlaced RGB + for (int i = 0, l = 0, a = 0, b = 0, color_index = 0; i < 2; i++) { - for (l=0, color_index=0, b=0; b < bitmap.getWidth(); b++, l++) + // top_field first + for (l = 0, color_index = 0, a = i * bitmap.getWidth(); a < pixels.length; a += (2 * bitmap.getWidth())) { - if (pixels[a + b] != color_index) + for (l = 0, color_index = 0, b = 0; b < bitmap.getWidth(); b++, l++) { - // write last RLE nibbles, while color change - updateRLE(l, color_index); - color_index = pixels[a + b]; - l=0; + if (ColorAreas.active) //multicolor DVB to SUP active //S9 + pgc_color = s9CA.bp12[a + b]; //bp12 was filled during analyse() //S9 + else //pre-existing approach but fewer runs//S9 + { + pgc_color = pixels[a + b]; + // pgc_color = bitmap.getColorIndex(getUserColorTableIndex(color_index)); //S9 + // pgc_color = bitmap.getColorIndex(pgc_color); + } + + if (s9CA.active && s9CA.dbgline() == a / bitmap.getWidth()) //see every pixel on specific dbgline //S9dbg + { + int q = s9CA.getQuant(getUserColorTableIndex(pixels[a + b])); //quant as Integer //S9dbg + + System.out.println("dbg line " + s9CA.d(3, a / bitmap.getWidth()) + "/x " + s9CA.d(3, b) //S9dbg + + "/pixel " + s9CA.X(8, pixels[a + b]) + "/clr_ndx " + s9CA.X(2, color_index) //S9dbg + + "/pgc_clr " + s9CA.X(2, pgc_color) + "/Q " + s9CA.X(8, q) + "/run " + s9CA.d(3, l)); + } //S9dbg + + if (pgc_color != color_index) //S9 + { + // write last RLE nibbles, while color change + updateRLE(l, color_index); + color_index = pgc_color; //S9 + l = 0; + } + else if ( l > 254 ) + { + // write last RLE nibbles, cannot incl. more than 255 pixels + updateRLE(l, color_index); + l = 0; + } + // std: adds l-bit to active color } - else if ( l > 254 ) - { - // write last RLE nibbles, cannot incl. more than 255 pixels - updateRLE(l, color_index); - l=0; + + // when last pixel is length = 1 then it will be 0 and missing ? + // see CR + //l -= 1; + + while ( l > 255 ) // never used ?! + { + updateRLE(255, color_index); + l -= 255; } - // std: adds l-bit to active color - } - l -= 1; + updateRLE(l, color_index); // write last RLE nibbles, line end + alignRLE(); - while ( l > 255 ) // never used ?! - { - updateRLE(255, color_index); - l -= 255; + if (b < bitmap.getWidth()) //fix, add CR only when less pixel have been painted + out.write(newline); // new line CR, byte aligned } - updateRLE(l, color_index); // write last RLE nibbles, line end alignRLE(); - out.write(newline); // new line CR, byte aligned + + if (bottom_field_start_pos == 0) + bottom_field_start_pos = out.size() - 10; // save startpos of bottom_field (size-14) } - alignRLE(); + if (ColorAreas.active) //++multicolor DVB to SUP active++ //S9 + { //S9 + //commands() must encapsulate command buffer design - do not patch command buffer from //S9 + //here. All delay timing fields will be set by commands() from information in bitmap //S9 - if (bottom_field_start_pos == 0) - bottom_field_start_pos = out.size() - 10; // save startpos of bottom_field (size-14) - } + int command_start_pos = out.size() - 10; //offset in subpic >including 1st delay< //S9 + + out.write(s9CA.commands(command_start_pos, bottom_field_start_pos, bitmap));//cmd buffer //S9 + + if ((out.size() & 1) == 1) + out.write((byte)255); + + out.flush(); + + //Fixups to integrate command buffer into subpic are legitimate part of this method //S9 + //Note "0xFF &" is redundant - the (byte) cast does that anyway. Mask only needed //S9 + //for moving byte to int (implicitly or explicitly) to overcome any sign extension. //S9 + + picture_packet = out.toByteArray(); + + int size = picture_packet.length - 10; - out.write(newline); //DM26052004 081.7 int03 add , not the best solution, but need the "0,0" here + picture_packet[10] = (byte)(0xFF & size>>>8); + picture_packet[11] = (byte)(0xFF & size); + picture_packet[12] = (byte)(0xFF & command_start_pos>>>8); //S9 + picture_packet[13] = (byte)(0xFF & command_start_pos); //S9 - int pack = out.size() - 12; - int control_block_pos = pack + 24; - int onscreen_time_pos = out.size() + 22; + for (int a = 0; a < 4; a++) + picture_packet[a + 2] = (byte)(0xFF & bitmap.getInTime()>>>(a * 8)); + } //S9 + else //++original code pre multicolor DVB++ //S9 + { //S9 - setScreenPosition(bitmap.getX(), bitmap.getY(), bitmap.getMaxX() - 1, bitmap.getMaxY() - 1); - setControlBlockPosition(control_block_pos, bottom_field_start_pos); - setPGCsection(); + out.write(newline); //DM26052004 081.7 int03 add , not the best solution, but need the "0,0" here - out.write(sections); //write control_block + int pack = out.size() - 12; + int control_block_pos = pack + 24; + int onscreen_time_pos = out.size() + 22; - if ((out.size() & 1) == 1) - out.write((byte)255); + setScreenPosition(bitmap.getX(), bitmap.getY(), bitmap.getMaxX() - 1, bitmap.getMaxY() - 1); + setControlBlockPosition(control_block_pos, bottom_field_start_pos); + setPGCsection(); - out.flush(); + out.write(sections); //write control_block - picture_packet = out.toByteArray(); + if ((out.size() & 1) == 1) + out.write((byte)255); - int size = picture_packet.length - 10; + out.flush(); - picture_packet[10] = (byte)(0xFF & size>>>8); - picture_packet[11] = (byte)(0xFF & size); - picture_packet[12] = (byte)(0xFF & pack>>>8); - picture_packet[13] = (byte)(0xFF & pack); + picture_packet = out.toByteArray(); - for (int a=0; a < 4; a++) - picture_packet[a + 2] = (byte)(0xFF & bitmap.getInTime()>>>(a*8)); + int size = picture_packet.length - 10; - picture_packet[onscreen_time_pos] = (byte)(0xFF & bitmap.getPlayTime()>>>8); - picture_packet[onscreen_time_pos + 1] = (byte)(0xFF & bitmap.getPlayTime()); + picture_packet[10] = (byte)(0xFF & size>>>8); + picture_packet[11] = (byte)(0xFF & size); + picture_packet[12] = (byte)(0xFF & pack>>>8); + picture_packet[13] = (byte)(0xFF & pack); + + for (int a = 0; a < 4; a++) + picture_packet[a + 2] = (byte)(0xFF & bitmap.getInTime()>>>(a * 8)); + + picture_packet[onscreen_time_pos] = (byte)(0xFF & bitmap.getPlayTime()>>>8); + picture_packet[onscreen_time_pos + 1] = (byte)(0xFF & bitmap.getPlayTime()); + } //++endif original code pre multicolor DVB++ //S9 + + if (s9CA.dbgSub(1)) + s9CA.dumpHdrAndCmd(picture_packet); //so what was generated? //S9dbg } catch (IOException e) { @@ -624,15 +699,20 @@ } } - private void updateRLE(int l, int color_index) +// private void updateRLE(int l, int pgc_color) //S9 + private void updateRLE(int l, int color_index) //S9 { if (l < 1) return; - // color_index shall not exceed value 3! + //pgc_color shall not exceed value 3! //S9 int pgc_color = getUserColorTableIndex(color_index); - pgc_color = bitmap.getColorIndex(pgc_color); + //look-up of pgc_color refactored to caller <= it's the RESOLVED 2 bits we want runs of //S9 + if (ColorAreas.active) + pgc_color = color_index; + else + pgc_color = bitmap.getColorIndex(pgc_color); l = l<<2 | pgc_color; // combine bits + color_index @@ -765,7 +845,14 @@ /*** set user packet ("Font pointsize; Backgr. Alpha value; Yoffset; Xoffset; Screenwidth"); **/ public int[] set(String nm, String values) { - resetUserColorTable(); + return set(nm, values, false); + } + + /*** set user packet ("Font pointsize; Backgr. Alpha value; Yoffset; Xoffset; Screenwidth"); **/ + public int[] set(String nm, String values, boolean keepColourTable) + { + if (!keepColourTable) + resetUserColorTable(); System.arraycopy(standard_values, 0, option, 0, standard_values.length); @@ -792,11 +879,17 @@ /** * */ - private int[] getColorTable(int flag) + public int[] getColorTable(int flag) { //define alternative color_table here if (flag == 0) - return default_sup_colors; + { + if (alternative_sup_colors[0] == 0) + return default_sup_colors; + + else + return alternative_sup_colors; + } else return default_teletext_colors; @@ -805,6 +898,19 @@ /** * */ + public void setColorTable(int[] values) + { + //define alternative color_table here + if (values == null) + Arrays.fill(alternative_sup_colors, 0); + + else + System.arraycopy(values, 0, alternative_sup_colors, 0, values.length); + } + + /** + * + */ private void setArea() { Rect[0] = bitmap.getX(); @@ -843,14 +949,14 @@ private int paintVideoSize(Object obj) { String[] str = (String[]) obj; - int video_horizontal = 720; - int video_vertical = 576; + int video_horizontal = w; + int video_vertical = h; // H - video_horizontal = str[0] == null ? 720 : Integer.parseInt(str[0]); + video_horizontal = str[0] == null ? video_horizontal : Integer.parseInt(str[0]); // V - video_vertical = str[1] == null ? 576 : Integer.parseInt(str[1]); + video_vertical = str[1] == null ? video_vertical : Integer.parseInt(str[1]); //deep red background to verify picture rectangle with given video resolution big.setColor(new Color(0xFF550000)); @@ -989,10 +1095,18 @@ */ public String isForced_Msg() { + return isForced_Msg(0); + } + + /** + * + */ + public String isForced_Msg(int val) + { String str = null; //change of status occured - if ((isforced_status & 1) == 0) + if ((isforced_status & 1) == 0 || val == 1) { if ((isforced_status & 2) > 0) str = Resource.getString("subpicture.msg.forced.no"); @@ -1012,6 +1126,7 @@ public void reset() { isforced_status = 0; + ismulticolor_status = 0; set_XY_Offset(0, 0); setDisplayMode(0); } @@ -1044,18 +1159,36 @@ /** * */ + public int decode_picture(byte[] packet, int off, boolean decode, Object obj, Image previewImage, int previewflags) + { + return decode_picture(packet, off, decode, obj, 0, false, true, previewImage, previewflags); + } + + /** + * + */ public int decode_picture(byte[] packet, int off, boolean decode, Object obj, long pts, boolean save, boolean visible) { + return decode_picture(packet, off, decode, obj, pts, save, visible, null, 0); + } + + /** + * + */ + public int decode_picture(byte[] packet, int off, boolean decode, Object obj, long pts, boolean save, boolean visible, Image previewImage, int previewflags) + { read_from_Image = false; global_error = false; boolean simple_picture = false; int picture_length = packet.length; - int BPos[] = { off, off<<3 }; //BytePos, BitPos - int position[] = new int[4]; - int start_pos[] = new int[3]; - int print_colors[] = new int[4]; + int[] BPos = { off, off<<3 }; //BytePos, BitPos + int[] position = new int[4]; + int[] start_pos = new int[3]; + int default_indices = 0; + + ArrayList colcon = new ArrayList(); if (BPos[0] > picture_length) return -4; @@ -1083,7 +1216,9 @@ start_pos[2] = Get_Bits(packet, BPos, 16) - 2; Flush_Bits(BPos, start_pos[2]<<3); // jump to sections chunk - int playtime_pos = Get_Bits(packet, BPos, 16); //fixed pos, so it must follow the 1st ctrl sequ, + //fixed pos, so it must follow the 1st ctrl sequ, + //delay of 2nd ctrl sequ execution - usually stop displaying + int playtime_pos = Get_Bits(packet, BPos, 16); if (playtime_pos == start_pos[2] + 2) { @@ -1094,7 +1229,7 @@ else start_pos[2] += off + 2; - int color_table[] = getColorTable(0); + int[] color_table = getColorTable(0); while (BPos[0] < off + playtime_pos) // read sections chunk { @@ -1125,24 +1260,17 @@ break; case 2: // stop display flag - case 0xFF: // end of ctrl sequ. Flush_Bits(BPos, 8); break; case 3: // 4 color links Flush_Bits(BPos, 8); - - for (int b = 0; b < 4; b++) - print_colors[3 - b] |= (color_table[Get_Bits(packet, BPos, 4)] & 0xFFFFFF); - + default_indices |= 0xFFFF & Get_Bits(packet, BPos, 16); break; case 4: // alpha blending Flush_Bits(BPos, 8); - - for (int b = 0; b < 4; b++) - print_colors[3 - b] |= (0x11 * (0xF ^ Get_Bits(packet, BPos, 4)))<<24; - + default_indices |= (0xFFFF & Get_Bits(packet, BPos, 16))<<16; break; case 5: // x,y pos. @@ -1188,11 +1316,66 @@ case 7: // extra alpha + color area definition Flush_Bits(BPos, 8); - Flush_Bits(BPos, 16); + int blen = Get_Bits(packet, BPos, 16); // get length + + if (ismulticolor_status == 0) + { + ismulticolor_status |= 1; + Common.setMessage("-> contains extra area definitions!"); + } + + int area_size = 0; + int endofcmd = BPos[0] + blen; + + while (BPos[0] < endofcmd) + { + area_size = Show_Bits(packet, BPos, 32); // read 4 bytes linenumbers & def. index + + if (area_size == 0x0FFFFFFF) //end marker + { + Flush_Bits(BPos, 32); + break; + } + + if (Y_Offset != 0) //move Y-pos + { + area_size = (0xF000 & area_size) | ((0xFFF & area_size>>16) + Y_Offset)<<16 | ((0xFFF & area_size) + Y_Offset); //Y + Set_Bits(packet, BPos, 32, area_size); + } + else + Flush_Bits(BPos, 32); + + for (int i = 0, j = 0xF & area_size>>12; i < j; i++) //parameter count + { + int[] area_defs = new int[5]; // 5 parameters + + area_defs[0] = 0xFFF & area_size>>16; //from top line number + area_defs[1] = 0xFFF & area_size; //to bottom line number + + if (X_Offset != 0) //move X-pos + { + area_defs[2] = Show_Bits(packet, BPos, 16) + X_Offset; // read 2 bytes column, start of def. + Set_Bits(packet, BPos, 16, area_defs[2]); //set new + } + else + area_defs[2] = Get_Bits(packet, BPos, 16); // read 2 bytes column, start of def. + + area_defs[3] = Get_Bits(packet, BPos, 16); // read 2 bytes 4x new index of color + area_defs[4] = Get_Bits(packet, BPos, 16); // read 2 bytes 4x new index of contrast + + colcon.add(area_defs); + } + } + + break; + + case 0xFF: // end of ctrl sequ. + Flush_Bits(BPos, 8); break; default: Common.setMessage(Resource.getString("subpicture.msg3") + ": " + cmd_switch); + Flush_Bits(BPos, 8); } } @@ -1228,62 +1411,125 @@ paintVideoSize(obj); + //paint picture at background, fixed size + if (previewImage != null) + { + int aro = Common.getMpvDecoderClass().getMpg2AspectRatioOffset(); + + big.setColor(new Color(0xFF505050)); + big.fillRect(0, 0, w, h); + + int pic_preview_width = 0xFFF & previewflags >> 20; + int pic_preview_height = 0xFFF & previewflags >> 8; + + if (aro != 0) //4:3 portion of widescreen preview + big.drawImage(previewImage, 0, 0, pic_preview_width, pic_preview_height, 64, 0, 448, 288, null); + + else if ((previewflags & 2) != 0) // letterbox of widescreen + { + int blackborder = (pic_preview_height - ((pic_preview_height * 3) / 4)) / 2; + big.drawImage(previewImage, 0, blackborder, pic_preview_width, (pic_preview_height * 3) / 4, null); + } + + else // anamorph widescreen + big.drawImage(previewImage, 0, 0, pic_preview_width, pic_preview_height, null); + + } + + int x0 = position[0]; int y0 = position[2]; int width = position[1] - position[0] + 1; int height = position[3] - position[2] + 1; big.setColor(Color.white); - big.drawRect(position[0] - 1, y0 - 1, width + 1, height + 1); + big.drawRect(x0 - 1, y0 - 1, width + 1, height + 1); big.setFont(font_std); - big.drawString("x" + position[0] + ", y" + position[2] + " / " + width + "*" + height, position[0] - 1, y0 - 5); + big.drawString("x" + x0 + ", y" + y0 + " / " + width + "*" + height + + " , C-" + Common.adaptString(Integer.toHexString(0xFFFF & default_indices).toUpperCase(), 4) + + ", T-" + Common.adaptString(Integer.toHexString(0xFFFF & default_indices>>16).toUpperCase(), 4) + , x0 + 1, y0 - 5); - for (int b=0; b<2; b++) +// + // subarray - color index for each pixel 0xFFFFFFFF = Contrast/Color 32103210 + int[] colcon_indices = new int[width * height]; + + // default filling, keeps default when no other def's exist + Arrays.fill(colcon_indices, default_indices); + + // fill with new def's + for (int b = 0; (previewflags & 8) == 0 && b < colcon.size(); b++) { - int Val=0, x1 = position[0], y1 = y0 + b; + int[] area_defs = (int[]) colcon.get(b); // one def block + + // replace indices per line from column to end + for (int i = (area_defs[0] - y0) * width, j = (area_defs[1] - y0) * width; i < j; i += width) + Arrays.fill(colcon_indices, i + area_defs[2] - x0, i + width, area_defs[3] | area_defs[4]<<16); + + // area_defs[2] 2 bytes column, start of def. + // area_defs[3] 2 bytes 4x new index of color + // area_defs[4] 2 bytes 4x new index of contrast + } +// + + for (int b = 0; b < 2; b++) // 2 fields painting + { + int Val = 0, x1 = x0, y1 = y0 + b; BPos[1] = (BPos[0] = start_pos[b])<<3; // top_field at first - while (BPos[0] < start_pos[b+1]) // stop at pos_marker + while (BPos[0] < start_pos[b + 1]) // stop at pos_marker { if ((Val = Get_Bits(packet, BPos, 4)) > 3) //4..F (0..3 never encodable) - { - big.setColor(new Color(print_colors[Val & 3])); - big.drawLine(x1, y1, (x1 += Val>>>2), y1); - } + x1 = paintPixel(Val, x1, y1, colcon_indices, color_table, x0, y0, width, previewflags); + else if ((Val = Val<<4 | Get_Bits(packet, BPos, 4)) > 0xF) //10..3F - { - big.setColor(new Color(print_colors[Val & 3])); - big.drawLine(x1, y1, (x1 += Val>>>2), y1); - } + x1 = paintPixel(Val, x1, y1, colcon_indices, color_table, x0, y0, width, previewflags); + else if ((Val = Val<<4 | Get_Bits(packet, BPos, 4)) > 0x3F) //40..FF - { - big.setColor(new Color(print_colors[Val & 3])); - big.drawLine(x1, y1, (x1 += Val>>>2), y1); - } - else if ((Val = Val<<4 | Get_Bits(packet, BPos, 4)) > 0) //100..3FF - { - big.setColor(new Color(print_colors[Val & 3])); - big.drawLine(x1, y1, (x1 += Val>>>2), y1); - } + x1 = paintPixel(Val, x1, y1, colcon_indices, color_table, x0, y0, width, previewflags); + + else if ((Val = Val<<4 | Get_Bits(packet, BPos, 4)) > 3) //100..3FF + x1 = paintPixel(Val, x1, y1, colcon_indices, color_table, x0, y0, width, previewflags); + else // 0 forced carriage return { - x1 = position[0]; + if ((Val & 3) != 0) + { + Val |= (width - x1)<<2; + x1 = paintPixel(Val, x1, y1, colcon_indices, color_table, x0, y0, width, previewflags); + } + + x1 = x0; y1 += 2; align_Bits(BPos); continue; } - /** - if (x1 >= position[1]) // line end, carriage return + // line end, carriage return + if (x1 > position[1]) { - x1=position[0]; - y1+=2; + x1 = position[0]; + y1 += 2; align_Bits(BPos); } - **/ } } + // paint rectangles of extra col-con definitions + for (int i = colcon.size() - 1; (previewflags & 4) == 0 && i >= 0; i--) + { + int[] area_defs = (int[]) colcon.get(i); + + big.setColor(Color.magenta); + big.drawRect(area_defs[2] - 1, area_defs[0] - 1, width - area_defs[2] + x0 + 1, area_defs[1] - area_defs[0]); + + big.setColor(Color.yellow); + big.drawString("area: " + i + " - " + area_defs[0] + ", " + area_defs[1] + ", " + area_defs[2] + + ", C-" + Common.adaptString(Integer.toHexString(area_defs[3]).toUpperCase(), 4) + + ", T-" + Common.adaptString(Integer.toHexString(area_defs[4]).toUpperCase(), 4) + , position[0], y0 - 22 - (i * 16)); + } + repaint(); if (global_error) @@ -1291,4 +1537,46 @@ return (playtime * 1024); //DM26052004 081.7 int03 changed, 900, 1000 } + + /** + * paint preview pixel from .sup + */ + private int paintPixel(int Val, int x1, int y1, int[] colcon_indices, int[] color_table, int x0, int y0, int width, int previewflags) + { + int table_index = Val & 3; + int line_length = Val>>>2; + int array_index; + int contrast_index = 0; + int color_index = 0; + boolean opaque = (previewflags & 0x10) != 0; + + big.setColor(new Color(0)); + + for (int j = x1 + line_length, color, lastcolor = 0; x1 < j; x1++) + { + array_index = (y1 - y0) * width + x1 - x0; + + //error condition + if (array_index >= colcon_indices.length) + break; + + contrast_index = 0xF & colcon_indices[array_index]>>(16 + table_index * 4); + color_index = 0xF & colcon_indices[array_index]>>(table_index * 4); + + // set ARGB color + color = (0x11 * (0xF ^ contrast_index))<<24 | (color_table[color_index] & 0xFFFFFF); + + // check for a change + if (color != lastcolor) + big.setColor(new Color(color)); // needs (color, true) for alpha - but with less performance + + lastcolor = color; + + if (opaque || contrast_index > 0) // dont paint full transp. pixel + big.drawLine(x1, y1, x1, y1); + // big.drawLine(x1, y1, x1 + 1, y1); + } + + return x1; + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/Sup2VobSub.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/Sup2VobSub.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/Sup2VobSub.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/Sup2VobSub.java 2006-07-02 18:52:46.000000000 +0000 @@ -0,0 +1,483 @@ +/* + * @(#)Sup2VobSub.java + * + * Copyright (c) 2006 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.subtitle; + +import java.io.PrintWriter; +import java.io.IOException; +import java.io.PushbackInputStream; +import java.io.FileOutputStream; +import java.io.BufferedOutputStream; +import java.io.File; + +import java.util.Arrays; + +import net.sourceforge.dvb.projectx.xinput.XInputFile; + +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.parser.CommonParsing; + +/** + * + */ +public class Sup2VobSub extends Object { + + private PushbackInputStream inputstream; + private BufferedOutputStream outputstream; + private PrintWriter printstream; + + private XInputFile xInputFile; + private String outputfile_sub; + private String outputfile_idx; + + private long file_length; + private long read_position; + private long write_position; + private long pts_value; + + private int buffersize = 12; + private int packetsize = 0xFFFF; + private int packsize = 2048; + + private int packetlength; + private int startoffset; + + private byte[] sup_packet; + private byte[] export_pack; + + private byte[] pack_header = { + 0, 0, 1, (byte)0xBA, 0x44, 2, (byte)0xC4, (byte)0x82, + 4, (byte)0xA9, 1, (byte)0x89, (byte)0xC3, (byte)0xF8 + }; + private byte[] pes_header = { 0, 0, 1, (byte)0xBD, 0, 0 }; + private byte[] padding_header = { 0, 0, 1, (byte)0xBE, 0, 0 }; + private byte[] pes_extension1 = { (byte)0x81, (byte)0x80, 5, 0, 0, 0, 0, 0 }; + private byte[] pes_extension2 = { (byte)0x80, 0, 0 }; + + private byte stream_id = 0x20; + + /** + * + */ + private Sup2VobSub() + {} + + /** + * + */ + public Sup2VobSub(String file) + { + if (init(file)) + parseStream(); + } + + /** + * + */ + public Sup2VobSub(String file, Object[] colour_table) + { + if (init(file, colour_table)) + parseStream(); + } + + /** + * + */ + private boolean init(String file) + { + return init(file, null); + } + + /** + * + */ + private boolean init(String file, Object[] colour_table) + { + boolean b = false; + + xInputFile = new XInputFile(new File(file)); + + file_length = xInputFile.length(); + read_position = 0; + write_position = 0; + + if (!initStreams()) + return b; + + initIndex(colour_table); + + sup_packet = new byte[packetsize]; + export_pack = new byte[packsize]; + + System.arraycopy(pack_header, 0, export_pack, 0, pack_header.length); + System.arraycopy(pes_header, 0, export_pack, pack_header.length, pes_header.length); + + return !b; + } + + /** + * + */ + private void parseStream() + { + while (read_position < file_length) + { + while (!nextStartCode()) + {} + + if (!readPicture()) + continue; + + writePicture(); + } + + closeStreams(); + } + + /** + * + */ + private boolean nextStartCode() + { + boolean b = false; + + startoffset = 0; + + readData(startoffset, buffersize); + + if (sup_packet[startoffset] != 0x53 || sup_packet[startoffset + 1] != 0x50) + { + unreadData(1, buffersize - 1); + + return b; + } + + startoffset += 2; + + return !b; + } + + /** + * + */ + private boolean readPicture() + { + boolean b = false; + int read = 0; + int pts_field = 8; + int length_field = 2; + + pts_value = CommonParsing.readPTS(sup_packet, startoffset, pts_field, CommonParsing.BYTEREORDERING, false); + + startoffset += pts_field; + + packetlength = CommonParsing.getIntValue(sup_packet, startoffset, length_field, !CommonParsing.BYTEREORDERING); + + read = readData(buffersize, packetlength - length_field); + + if (read < packetlength - length_field) + { + Common.setMessage("!> packet too short"); + return b; + } + + return !b; + } + + /** + * + */ + private void writePicture() + { + int offset = 0; + + writePictureIndex(); + + offset = writeFirstPack(offset); + + while (offset > 0) + offset = writeSubPack(offset); + } + + /** + * many nice confusing additions :) + */ + private int writeFirstPack(int offset) + { + if (offset >= packetlength) + return -1; + + int max_size = packsize - pack_header.length - pes_header.length - pes_extension1.length - 1; + int length = packetlength - offset >= max_size ? max_size : packetlength - offset; + int padding = max_size - length; + int headerlength = pes_extension1.length + 1; + + System.arraycopy(pes_extension1, 0, export_pack, pack_header.length + pes_header.length, pes_extension1.length); + + if (padding <= padding_header.length) + { + headerlength += padding; + Arrays.fill(export_pack, pack_header.length + pes_header.length + pes_extension1.length, pack_header.length + pes_header.length + pes_extension1.length + padding, (byte) 0xFF); + CommonParsing.setPES_LengthField(export_pack, pack_header.length, headerlength + length); + CommonParsing.setValue(export_pack, pack_header.length + pes_header.length + 2, 1, !CommonParsing.BYTEREORDERING, 5 + padding); + CommonParsing.setPES_PTSField(export_pack, pack_header.length, pts_value); + CommonParsing.setPES_SubIdField(export_pack, pack_header.length, pes_header.length, pes_extension1.length + padding, stream_id); + } + + else + { + System.arraycopy(padding_header, 0, export_pack, pack_header.length + pes_header.length + headerlength + length, padding_header.length); + CommonParsing.setPES_LengthField(export_pack, pack_header.length + pes_header.length + headerlength + length, padding - padding_header.length); + Arrays.fill(export_pack, pack_header.length + pes_header.length + headerlength + length + padding_header.length, packsize, (byte) 0xFF); + CommonParsing.setPES_LengthField(export_pack, pack_header.length, headerlength + length); + CommonParsing.setPES_PTSField(export_pack, pack_header.length, pts_value); + CommonParsing.setPES_SubIdField(export_pack, pack_header.length, pes_header.length, pes_extension1.length, stream_id); + } + + System.arraycopy(sup_packet, startoffset + offset, export_pack, pack_header.length + pes_header.length + headerlength, length); + + writeData(); + + offset += length; + + return offset; + } + + /** + * + */ + private int writeSubPack(int offset) + { + if (offset >= packetlength) + return -1; + + int max_size = packsize - pack_header.length - pes_header.length - pes_extension2.length - 1; + int length = packetlength - offset >= max_size ? max_size : packetlength - offset; + int padding = max_size - length; + int headerlength = pes_extension2.length + 1; + + System.arraycopy(pes_extension2, 0, export_pack, pack_header.length + pes_header.length, pes_extension2.length); + + if (padding <= padding_header.length) + { + headerlength += padding; + Arrays.fill(export_pack, pack_header.length + pes_header.length + pes_extension2.length, pack_header.length + pes_header.length + pes_extension2.length + padding, (byte) 0xFF); + CommonParsing.setPES_LengthField(export_pack, pack_header.length, headerlength + length); + CommonParsing.setValue(export_pack, pack_header.length + pes_header.length + 2, 1, !CommonParsing.BYTEREORDERING, padding); + CommonParsing.setPES_SubIdField(export_pack, pack_header.length, pes_header.length, pes_extension2.length + padding, stream_id); + } + + else + { + System.arraycopy(padding_header, 0, export_pack, pack_header.length + pes_header.length + headerlength + length, padding_header.length); + CommonParsing.setPES_LengthField(export_pack, pack_header.length + pes_header.length + headerlength + length, padding - padding_header.length); + Arrays.fill(export_pack, pack_header.length + pes_header.length + headerlength + length + padding_header.length, packsize, (byte) 0xFF); + CommonParsing.setPES_LengthField(export_pack, pack_header.length, length + headerlength); + CommonParsing.setPES_SubIdField(export_pack, pack_header.length, pes_header.length, pes_extension2.length, stream_id); + } + + System.arraycopy(sup_packet, startoffset + offset, export_pack, pack_header.length + pes_header.length + headerlength, length); + + writeData(); + + offset += length; + + return offset; + } + + /** + * + */ + private boolean initStreams() + { + boolean b = false; + + try { + outputfile_sub = xInputFile + ".sub"; + outputfile_idx = xInputFile + ".idx"; + + inputstream = new PushbackInputStream(xInputFile.getInputStream(), buffersize); + outputstream = new BufferedOutputStream(new FileOutputStream(outputfile_sub), 1024000); + printstream = new PrintWriter(new FileOutputStream(outputfile_idx)); + + Common.setMessage(""); + Common.setMessage("-> create VobSub Files (idx + sub) : " + outputfile_sub); + + return !b; + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + + return b; + } + + /** + * + */ + private void closeStreams() + { + try { + inputstream.close(); + + outputstream.flush(); + outputstream.close(); + printstream.flush(); + printstream.close(); + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + } + + /** + * + */ + private int readData(int offset, int length) + { + int read = 0; + + try { + read = inputstream.read(sup_packet, offset, length); + + read_position += read; + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + + return read; + } + + /** + * + */ + private int unreadData(int offset, int length) + { + try { + inputstream.unread(sup_packet, offset, length); + read_position -= length; + + return length; + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + + return 0; + } + + /** + * + */ + private void writeData() + { + try { + outputstream.write(export_pack); + write_position += packsize; + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + } + + /** + * + */ + private void writePictureIndex() + { + printstream.print("timestamp: " + Common.formatTime_2a(pts_value / 90) + ", "); + printstream.println("filepos: " + Common.adaptString(Long.toHexString(write_position), 9)); + } + + /** + * + */ + private void initIndex(Object[] colour_table) + { + printstream.println("# VobSub index file, v7 (do not modify this line!)"); + printstream.println("size: 720x576"); + printstream.println("org: 0, 0"); + printstream.println("scale: 100%, 100%"); + printstream.println("alpha: 100%"); + printstream.println("smooth: OFF"); + printstream.println("fadein/out: 0, 0"); + printstream.println("align: OFF at LEFT TOP"); + printstream.println("time offset: 0"); + printstream.println("forced subs: OFF"); + + printColourTable(colour_table); + + printstream.println("custom colors: OFF, tridx: 1000, colors: 600000, 101010, ffffff, a9a9a9"); + printstream.println("langidx: 0"); + printstream.println("id: --, index: 0"); + printstream.println(""); + } + + /** + * + */ + private void printColourTable(Object[] colour_table) + { + int max_indices = 16; + + printstream.print("palette: "); + + String[] std_colour_table = { + "600000", "101010" , "ffffff", "a9a9a9", "4d4d4d", "d7d7d7", "d7d7d7", "d7d7d7", + "d7d7d7", "d7d7d7", "d7d7d7", "d7d7d7", "d7d7d7", "d7d7d7", "d7d7d7", "d7d7d7" + }; + + if (colour_table == null) + colour_table = new Object[0]; + + else + { + for (int i = 0, j = colour_table.length; i < j && i < max_indices; i++) + { + printstream.print(String.valueOf(Common.adaptString(Integer.toHexString(0xFFFFFF & Integer.parseInt(colour_table[i].toString())), 6))); + + if (i < max_indices - 1) + printstream.print(", "); + } + + for (int i = colour_table.length, j = std_colour_table.length; i < j && i < max_indices; i++) + { + printstream.print(String.valueOf(Common.adaptString(std_colour_table[i], 6))); + + if (i < max_indices - 1) + printstream.print(", "); + } + } + + printstream.println(); + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/Teletext.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/Teletext.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/Teletext.java 2006-03-26 18:03:26.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/Teletext.java 2009-07-05 12:18:06.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)Teletext.java - constants/decode of teletext System B * - * Copyright (c) 2001-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2001-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -27,16 +27,26 @@ package net.sourceforge.dvb.projectx.subtitle; import java.util.Hashtable; +import java.util.ArrayList; +import java.util.Arrays; import net.sourceforge.dvb.projectx.common.Common; import net.sourceforge.dvb.projectx.common.Keys; -public final class Teletext extends Object { +public class Teletext extends Object { - private Teletext() + //DM30072004 081.7 int07 add + private Hashtable page_modifications = new Hashtable(); + private boolean use = false; + private int display_row = 0; + private int display_column = 0; + private short[] active_set; + private short[] active_national_set; + + public Teletext() {} - private final static String[] ssaHeader = { + private final String[] ssaHeader = { "[Script Info]", "; This is a Sub Station Alpha v4 script.", "; For Sub Station Alpha info and downloads,", @@ -61,13 +71,13 @@ "Comment: Marked=0,0:00:00.00,0:00:00.01,MainB,,0000,0000,0000,!Effect,This script was created by decoding a tv teletext stream to build coloured subtitles" }; - private final static String[] ssaLine = { + private final String[] ssaLine = { "Dialogue: Marked=0,", ",MainT,,0000,0000,0000,!Effect,{\\q2\\a2}" }; //DM26052004 081.7 int03 changed - private final static String[] stlHeader = { + private final String[] stlHeader = { "", "//Font select and font size", "$FontName = Arial", @@ -101,7 +111,7 @@ }; //DM14052004 081.7 int02 add - private final static String[] sonHeader = { + private final String[] sonHeader = { "st_format\t2", "Display_Start\tnon_forced", "TV_Type\t\tPAL", @@ -112,7 +122,7 @@ "SP_NUMBER\tSTART\t\tEND\t\tFILE_NAME" }; - private final static String[] colors = { + private final String[] colors = { "{\\c&HC0C0C0&}", // black /gray "{\\c&H4040FF&}", // red "{\\c&H00FF00&}", // green @@ -125,7 +135,7 @@ //DM14052004 081.7 int02 add - public static String[] getSONHead(String path, long frame_rate) + public String[] getSONHead(String path, long frame_rate) { if (frame_rate != 3600) { @@ -146,7 +156,7 @@ /***************** * return STL header * *****************/ - public static String[] getSTLHead(String version) + public String[] getSTLHead(String version) { stlHeader[0] = "//Generated by " + version; @@ -156,7 +166,7 @@ /***************** * return SSA header * *****************/ - public static String[] getSSAHead() + public String[] getSSAHead() { return ssaHeader; } @@ -164,7 +174,7 @@ /***************** * return SSA line * *****************/ - public static String[] getSSALine() + public String[] getSSALine() { return ssaLine; } @@ -172,7 +182,7 @@ /***************** * return SMPTE * *****************/ - public static String SMPTE(String time, long videoframetime) + public String SMPTE(String time, long videoframetime) { StringBuffer a = new StringBuffer(); a.append(time.substring(0, 8) + ":00"); @@ -185,7 +195,7 @@ /***************** * change endian * *****************/ - public static byte bytereverse(byte n) + public byte bytereverse(byte n) { n = (byte) (((n >> 1) & 0x55) | ((n << 1) & 0xaa)); n = (byte) (((n >> 2) & 0x33) | ((n << 2) & 0xcc)); @@ -193,10 +203,15 @@ return n; } + public byte bytereverse(int n) + { + return bytereverse((byte) n); + } + /************** * set parity * **************/ - public static byte parity(byte n) + public byte parity(byte n) { boolean par=true; @@ -217,7 +232,7 @@ /**************** * check parity * ****************/ - public static boolean cparity(byte n) + public boolean cparity(byte n) { boolean par=true; @@ -240,7 +255,7 @@ //DM24052004 081.7 int03 introduced //no error correction ATM - public static int hamming_24_18(byte b[], int off) + public int hamming_24_18(byte b[], int off) { int val = 0; @@ -255,67 +270,97 @@ /****************** * hamming decode 8/4 * ******************/ - public static int hamming_8_4(byte a) + public int hamming_8_4(byte a) { switch (0xFF & a) { - case 0xA8: - return 0; case 0x0B: return 1; + + case 0x1C: + return 6; + case 0x26: return 2; - case 0x85: - return 3; - case 0x92: - return 4; + case 0x31: return 5; - case 0x1C: - return 6; - case 0xBF: - return 7; + case 0x40: return 8; - case 0xE3: - return 9; - case 0xCE: - return 10; + + case 0x57: + return 15; + case 0x6D: return 11; + case 0x7A: return 12; + + case 0x85: + return 3; + + case 0x92: + return 4; + + case 0xA8: + return 0; + + case 0xBF: + return 7; + + case 0xCE: + return 10; + case 0xD9: return 13; + + case 0xE3: + return 9; + case 0xF4: return 14; - case 0x57: - return 15; + default: return -1; // decoding error , not yet corrected } } + /** + * hamming encode 8/4 + */ + private byte[] hamming_8_4_values = { + (byte) 0xA8, 0x0B, 0x26, (byte) 0x85, (byte) 0x92, 0x31, 0x1C, (byte) 0xBF, 0x40, + (byte) 0xE3, (byte) 0xCE, 0x6D, 0x7A, (byte) 0xD9, (byte) 0xF4, 0x57 + }; - /****************************** + /** * make suppic from teletext * - ******************************/ - public static int[] makepic(byte[] packet, int offset, int len, int row, int character_set, boolean checkParity) + */ + public int[] buildCharArray(byte[] packet, int offset, int len, int row, int character_set, boolean checkParity, boolean boxed_mode, boolean alignment) { // return int char<<8 | 0xF0 & active_color backgrnd | 0xF & active_color foregrnd - boolean ascii = true, toggle = false; + boolean ascii = true; + boolean mosaic = false; + boolean toggle = false; + int chars[] = new int[len]; int active_color = 7; // init with white ascii color per line + black background int parity_error = 0; + int[] boxed_area = { -1, -1 }; int language_code = Common.getSettings().getIntProperty(Keys.KEY_TtxLanguagePair) - 1; int primary_set_mapping = language_code < 0 ? 0 : language_code; int primary_national_set_mapping = character_set; - int secondary_set_mapping = primary_set_mapping; - int secondary_national_set_mapping = primary_national_set_mapping; + // int secondary_set_mapping = primary_set_mapping; + // int secondary_national_set_mapping = primary_national_set_mapping; + + int secondary_set_mapping = 0; //latin + int secondary_national_set_mapping = 0; //latin if (page_modifications.containsKey("primary_set")) secondary_set_mapping = primary_set_mapping = Integer.parseInt(page_modifications.get("primary_set").toString()); @@ -352,29 +397,44 @@ int char_value = 0x7F & bytereverse(packet[c]); + //0x80..FF are outside + if (char_value>>>3 == 0) //0x0..7 { - ascii=true; + ascii = true; + mosaic = false; chars[i] = (active_set[32]<<8 | active_color); active_color = (0xF0 & active_color) | char_value; continue; } + else if (char_value>>>4 == 0) //0x8..F { + if (char_value == 0xB) //start box + boxed_area[0] = i; + + else if (char_value == 0xA) //end box + if (boxed_area[1] <= boxed_area[0]) + boxed_area[1] = i; + chars[i] = active_set[32]<<8 | active_color; continue; } - else if (char_value>>>7 == 1) //0x80..FF + + else if (char_value < 24) //0x10..17 { + ascii = false; + mosaic = true; chars[i] = active_set[32]<<8 | active_color; continue; } - else if (char_value < 27) //0x10..1A + + else if (char_value < 27) //0x18..1A { - ascii = false; chars[i] = active_set[32]<<8 | active_color; continue; } + else if (char_value < 32) //0x1B..1F { switch (char_value) //1d=new bg with last color, 1c=black bg, 1b ESC @@ -393,17 +453,25 @@ toggle = !toggle; break; - case 0x1C: + case 0x1C: // set black background active_color &= 0xF; + + if (!ascii && !mosaic) // switch ascii on + ascii = true; + break; + //new background same as foreground color + //any following is invisible until a diff. foreground is set case 0x1D: - active_color |= (0xF & active_color)<<4; + ascii = false; + active_color = active_color & 0xF | (0xF & active_color)<<4; //HHM } chars[i] = active_set[32]<<8 | active_color; continue; } + else if (char_value == 0x7F) //0x7F { chars[i] = active_set[32]<<8 | active_color; @@ -424,39 +492,51 @@ case 0x23: chars[i] = active_color | active_national_set[0]<<8; continue; + case 0x24: chars[i] = active_color | active_national_set[1]<<8; continue; + case 0x40: chars[i] = active_color | active_national_set[2]<<8; continue; + case 0x5b: chars[i] = active_color | active_national_set[3]<<8; continue; + case 0x5c: chars[i] = active_color | active_national_set[4]<<8; continue; + case 0x5d: chars[i] = active_color | active_national_set[5]<<8; continue; + case 0x5e: chars[i] = active_color | active_national_set[6]<<8; continue; + case 0x5f: chars[i] = active_color | active_national_set[7]<<8; continue; + case 0x60: chars[i] = active_color | active_national_set[8]<<8; continue; + case 0x7b: chars[i] = active_color | active_national_set[9]<<8; continue; + case 0x7c: chars[i] = active_color | active_national_set[10]<<8; continue; + case 0x7d: chars[i] = active_color | active_national_set[11]<<8; continue; + case 0x7e: chars[i] = active_color | active_national_set[12]<<8; continue; @@ -467,6 +547,21 @@ continue; } + if (boxed_mode) + { + if (boxed_area[0] >= 0) + { + for (int i = 0; i < boxed_area[0] && i < chars.length; i++) + chars[i] = active_set[32]<<8 | 7; + + for (int i = boxed_area[1]; i > boxed_area[0] && i < chars.length; i++) + chars[i] = active_set[32]<<8 | 7; + } + + else + Arrays.fill(chars, (active_set[32]<<8 | 7)); + } + String test = ""; for (int s = 0; s < chars.length; s++) @@ -476,9 +571,8 @@ if (checkParity && parity_error > 0) { String msg = "!> line " + row + ", parity check failed at " + parity_error + " of " + len + " characters: '" + test + "'"; - int max_errors = Common.getSettings().getIntProperty(Keys.KEY_SubtitlePanel_MaxParityErrors); - if (parity_error > max_errors) + if (parity_error > Common.getSettings().getIntProperty(Keys.KEY_SubtitlePanel_MaxParityErrors)) { test = ""; msg += ", line dropped.."; @@ -487,29 +581,64 @@ Common.setMessage(msg); } - if (test.trim().length() == 0) + int trimlen = test.trim().length(); + + if (trimlen == 0) return null; + else if (trimlen < 40 && alignment) + { + int offs = 0; + int noffs = 0; + + while (test.startsWith(" ", offs)) + offs++; + + noffs = (chars.length - trimlen) / 2; + + System.arraycopy(chars, offs, chars, noffs, trimlen); + Arrays.fill(chars, 0, noffs, (active_set[32]<<8 | 7)); + Arrays.fill(chars, noffs + trimlen, chars.length, (active_set[32]<<8 | 7)); + } + return chars; } + /** + * make strings from teletext + */ + public String buildString(byte[] packet, int offset, int len, int row, int character_set, int color, boolean checkParity) + { + return buildString(packet, offset, len, row, character_set, color, checkParity, false); + } - /****************************** - * make strings from teletext * - ******************************/ - public static String makestring(byte[] packet, int offset, int len, int row, int character_set, int color, boolean checkParity) + /** + * make strings from teletext + * color 1 = save color strings for ssa + */ + public String buildString(byte[] packet, int offset, int len, int row, int character_set, int color, boolean checkParity, boolean boxed_mode) { - boolean ascii = true, toggle = false; - String text = ""; + boolean ascii = true; + boolean mosaic = false; + boolean toggle = false; + + StringBuffer line_buffer = new StringBuffer(); + ColorIndex color_index; + ArrayList color_list = new ArrayList(); + int parity_error = 0; + int[] boxed_area = { -1, -1 }; int language_code = Common.getSettings().getIntProperty(Keys.KEY_TtxLanguagePair) - 1; int primary_set_mapping = language_code < 0 ? 0 : language_code; int primary_national_set_mapping = character_set; - int secondary_set_mapping = primary_set_mapping; - int secondary_national_set_mapping = primary_national_set_mapping; + // int secondary_set_mapping = primary_set_mapping; + // int secondary_national_set_mapping = primary_national_set_mapping; + + int secondary_set_mapping = 0; //latin + int secondary_national_set_mapping = 0; //latin if (page_modifications.containsKey("primary_set")) secondary_set_mapping = primary_set_mapping = Integer.parseInt(page_modifications.get("primary_set").toString()); @@ -531,9 +660,9 @@ { val = row<<16 | i; - if (page_modifications.containsKey("" + val)) + if (page_modifications.containsKey(String.valueOf(val))) { - text += page_modifications.get("" + val).toString(); + line_buffer.append(page_modifications.get(String.valueOf(val))); continue; } @@ -546,29 +675,51 @@ int char_value = 0x7F & bytereverse(packet[c]); - if (char_value>>>3 == 0) //0x0..7 + //0x80..FF are outside + + if (char_value>>>3 == 0) //0x0..7, set ascii foreground color { ascii = true; - text += ((color==1) ? colors[char_value] : "") + (char)active_set[32]; + mosaic = false; + + //line_buffer.append(color == 1 ? colors[char_value] : ""); + + if (color == 1) + color_list.add(new ColorIndex(i, char_value)); + + line_buffer.append((char)active_set[32]); continue; } - else if (char_value>>>4 == 0) //0x8..F + + else if (char_value>>>4 == 0) //0x8..F, flash/steady/box/size { - text += (char)active_set[32]; + if (char_value == 0xB) //start box + boxed_area[0] = i; + + else if (char_value == 0xA) //end box + if (boxed_area[1] <= boxed_area[0]) + boxed_area[1] = i; + + line_buffer.append((char)active_set[32]); continue; } - else if (char_value>>>7 == 1) //0x80..FF + + + else if (char_value < 24) //0x10..17, mosaic color codes { - text += (char)active_set[32]; + ascii = false; + mosaic = true; + line_buffer.append((char)active_set[32]); continue; } - else if (char_value < 27) //0x10..1A + + else if (char_value < 27) //0x18..1A, mosaic modes { - ascii = false; - text += (char)active_set[32]; + line_buffer.append((char)active_set[32]); continue; } - else if (char_value < 32) //0x1B..1F + + else if (char_value < 32) //0x1B..1F, background + mosaic modes { if (char_value == 0x1B) //ESC { @@ -577,26 +728,43 @@ active_set = CharSet.getActive_G0_Set(primary_set_mapping, primary_national_set_mapping, row); active_national_set = CharSet.getActiveNationalSubset(primary_set_mapping, primary_national_set_mapping, row); } + else { active_set = CharSet.getActive_G0_Set(secondary_set_mapping, secondary_national_set_mapping, row); active_national_set = CharSet.getActiveNationalSubset(secondary_set_mapping, secondary_national_set_mapping, row); } + toggle = !toggle; } - text += (char)active_set[32]; + //new background is black + //check whether it is not in mosaic mode + //check whether foreground is black too, is ignored - assumed to be readably string + if (char_value == 0x1C) + { + if (!ascii && !mosaic) // switch ascii on + ascii = true; + } + + //new background same as foreground color + //any following is invisible until a diff. foreground is set, hide the char's, keep mosaic mode + if (char_value == 0x1D) + ascii = false; + + line_buffer.append((char)active_set[32]); continue; } + else if (char_value == 0x7F) //0x7F { - text += (char)active_set[32]; + line_buffer.append((char)active_set[32]); continue; } if (!ascii) { - text += (char)active_set[32]; + line_buffer.append((char)active_set[32]); continue; } @@ -607,60 +775,72 @@ switch (char_value) // special national characters { case 0x23: - text += (char)active_national_set[0]; + line_buffer.append((char)active_national_set[0]); continue loopi; + case 0x24: - text += (char)active_national_set[1]; + line_buffer.append((char)active_national_set[1]); continue loopi; + case 0x40: - text += (char)active_national_set[2]; + line_buffer.append((char)active_national_set[2]); continue loopi; + case 0x5b: - text += (char)active_national_set[3]; + line_buffer.append((char)active_national_set[3]); continue loopi; + case 0x5c: - text += (char)active_national_set[4]; + line_buffer.append((char)active_national_set[4]); continue loopi; + case 0x5d: - text += (char)active_national_set[5]; + line_buffer.append((char)active_national_set[5]); continue loopi; + case 0x5e: - text += (char)active_national_set[6]; + line_buffer.append((char)active_national_set[6]); continue loopi; + case 0x5f: - text += (char)active_national_set[7]; + line_buffer.append((char)active_national_set[7]); continue loopi; + case 0x60: - text += (char)active_national_set[8]; + line_buffer.append((char)active_national_set[8]); continue loopi; + case 0x7b: - text += (char)active_national_set[9]; + line_buffer.append((char)active_national_set[9]); continue loopi; + case 0x7c: - text += (char)active_national_set[10]; + line_buffer.append((char)active_national_set[10]); continue loopi; + case 0x7d: - text += (char)active_national_set[11]; + line_buffer.append((char)active_national_set[11]); continue loopi; + case 0x7e: - text += (char)active_national_set[12]; + line_buffer.append((char)active_national_set[12]); continue loopi; } } - text += (char)active_set[char_value]; + line_buffer.append((char)active_set[char_value]); + continue loopi; } // ab 3 parit舩sfehlern zeile droppen if (checkParity && parity_error > 0) { - String msg = "!> line " + row + ", parity check failed at " + parity_error + " of " + len + " characters: '" + text + "'"; - int max_errors = Common.getSettings().getIntProperty(Keys.KEY_SubtitlePanel_MaxParityErrors); + String msg = "!> line " + row + ", parity check failed at " + parity_error + " of " + len + " characters: '" + line_buffer.toString() + "'"; - if (parity_error > max_errors) + if (parity_error > Common.getSettings().getIntProperty(Keys.KEY_SubtitlePanel_MaxParityErrors)) { - text = ""; + line_buffer.setLength(0); color = 0; msg += ", line dropped.."; } @@ -668,23 +848,48 @@ Common.setMessage(msg); } - if (color == 1) - return colors[7] + text.trim(); + if (boxed_mode) + { + if (boxed_area[0] >= 0 && line_buffer.length() > 0) + { + for (int i = 0; i < boxed_area[0]; i++) + line_buffer.setCharAt(i, (char)active_set[32]); - else - return text; - } + for (int i = boxed_area[1]; i > boxed_area[0] && i < line_buffer.length(); i++) + line_buffer.setCharAt(i, (char)active_set[32]); + } - //DM30072004 081.7 int07 add - private static Hashtable page_modifications = new Hashtable(); - private static boolean use = false; - private static int display_row = 0, display_column = 0; - private static short active_set[]; - private static short active_national_set[]; + else + line_buffer.setLength(0); + } + + //insert color strings heading + if (color == 1 && line_buffer.length() > 0) + { + ColorIndex ci; + + for (int i = color_list.size() - 1; i >= 0; i--) + { + ci = (ColorIndex) color_list.get(i); + line_buffer.insert(ci.getIndex(), colors[ci.getColor()]); + } + } + String line = line_buffer.toString(); + + if (color == 1) + { + line = line.trim(); + + if (line.length() > 0) + line = colors[7] + line; + } + + return line; + } //DM30072004 081.7 int07 add - public static void clearEnhancements() + public void clearEnhancements() { page_modifications.clear(); use = false; @@ -696,7 +901,7 @@ //analyze triplets etc. //DM30072004 081.7 int07 add - public static void setEnhancements(byte packet[], int row, int character_set) + public void setEnhancements(byte packet[], int row, int character_set) { int val, mapping, position = 0, code; byte address, mode, data, designation; @@ -789,9 +994,332 @@ position = display_row<<16 | display_column; page_modifications.put("" + position, str); - - //Common.setMessage("replaced char " + str + " /m " + mode); + /** + Common.setMessage("replaced char " + str + " /m " + mode + " /row " + display_row + " /col " + display_column); + **/ } } } + + /** + * + */ + private class ColorIndex { + + private int index; + private int color; + + public ColorIndex(int val_1, int val_2) + { + index = val_1; + color = val_2; + } + + public int getIndex() + { + return index; + } + + public int getColor() + { + return color; + } + } + + /////////////////////// + + /** + * + */ + private byte[] TTX_TS_Packet = { + 0x47, 0x40, (byte)0x9F, 0x10, // TS header - PID 0x9F - count 0 + 0x00, 0x00, 0x01, (byte)0xBD, // pes id + 0x00, (byte)0xB2, // pes length, fixed - matching 3 rows (0 + 2 variable) + (byte)0x84, (byte)0x80, // flags + 0x24, // pes extension length (36 bytes) + (byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF, //psb with PTS + (byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF, + (byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF, + (byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF, + (byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF, + 0x10, // TTX identifier + + // 3x header 100 + //update=0, erase=1, interrupt=0, magazine=1, page_number=00, suppressed_head=0, subpage_number=0000, news=0, inhibit=0, character_set=0, subtitle=0, magazine_serial=1 + // 022C E7E4 40A8 A8A8 A80B A8A8 A840 - VBI 7 - Header row 0 - mag 1 page 00 + 0x02, 0x2C, (byte)0xE7, (byte)0xE4, 0x40, (byte)0xA8, (byte)0xA8, + (byte)0xA8, (byte)0xA8, 0x0B, (byte)0xA8, (byte)0xA8, (byte)0xA8, 0x40, // 1-00-00 14 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 16 String row 0 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 17- 31 String row 0 + // 022C E8E4 40A8 A8A8 A80B A8A8 A840 - VBI 8 - Header row 0 - mag 1 page 00 + 0x02, 0x2C, (byte)0xE8, (byte)0xE4, 0x40, (byte)0xA8, (byte)0xA8, + (byte)0xA8, (byte)0xA8, 0x0B, (byte)0xA8, (byte)0xA8, (byte)0xA8, 0x40, // 1-00-00 14 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 16 String row 0 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 17- 31 String row 0 + // 022C E9E4 40A8 A8A8 A80B A8A8 A840 - VBI 9 - Header row 0 - mag 1 page 00 + 0x02, 0x2C, (byte)0xE9, (byte)0xE4, 0x40, (byte)0xA8, (byte)0xA8, + (byte)0xA8, (byte)0xA8, 0x0B, (byte)0xA8, (byte)0xA8, (byte)0xA8, 0x40, // 1-00-00 14 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 16 String row 0 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 17- 31 String row 0 + }; + + /** + * + */ + private byte[][][] TTX_Row = { + { + { + // 032C E8E4 4031 - VBI 8 - run in - row 20 + 0x03, 0x2C, (byte)0xE8, (byte)0xE4, (byte)0x40, (byte)0x31, // 1-20-50 6 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 19 String row 22 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 20- 39 String row 22 + },{ + // 032C E9E4 E331 - VBI 9 - run in - row 21 + 0x03, 0x2C, (byte)0xE9, (byte)0xE4, (byte)0xE3, (byte)0x31, // 1-21-50 6 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 19 String row 22 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 20- 39 String row 22 + },{ + // 032C EAE4 40D9 - VBI 10 - run in - row 22 + 0x03, 0x2C, (byte)0xEA, (byte)0xE4, (byte)0x40, (byte)0xD9, // 1-22-50 6 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 19 String row 22 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 20- 39 String row 22 + },{ + // 032C EBE4 E3D9 - VBI 11 - run in - row 23 + 0x03, 0x2C, (byte)0xEB, (byte)0xE4, (byte)0xE3, (byte)0xD9, // 1-23-50 6 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 19 String row 23 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 20- 39 String row 23 + } + },{ + { + // 032C E8E4 400B - VBI 8 - run in - row 16 + 0x03, 0x2C, (byte)0xE8, (byte)0xE4, (byte)0x40, (byte)0x0B, // 1-16-50 6 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 19 String row 16 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 20- 39 String row 16 + },{ + // 032C E9E4 40E3 - VBI 9 - run in - row 18 + 0x03, 0x2C, (byte)0xE9, (byte)0xE4, (byte)0x40, (byte)0xE3, // 1-18-50 6 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 19 String row 18 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 20- 39 String row 18 + },{ + // 032C EAE4 4031 - VBI 10 - run in - row 20 + 0x03, 0x2C, (byte)0xEA, (byte)0xE4, (byte)0x40, (byte)0x31, // 1-20-50 6 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 19 String row 20 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 20- 39 String row 20 + },{ + // 032C EBE4 40D9 - VBI 11 - run in - row 22 + 0x03, 0x2C, (byte)0xEB, (byte)0xE4, (byte)0x40, (byte)0xD9, // 1-22-50 6 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 19 String row 22 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 20- 39 String row 22 + } + } + }; + + /** + * + */ + private byte[] TTX_Heading150Row = { + //update=1, erase=1, interrupt=0, magazine=1, page_number=50, suppressed_head=1, subpage_number=0000, news=0, inhibit=0, character_set=0, subtitle=1, magazine_serial=1 + // 032C E7E4 40A8 A8CE A80B A80B 7A40 - VBI 7 - Header row 0 - mag 1 page 50 + 0x03, 0x2C, (byte)0xE7, (byte)0xE4, 0x40, (byte)0xA8, (byte)0xA8, (byte)0xCE, (byte)0xA8, 0x0B, (byte)0xA8, 0x0B, 0x7A, 0x40, // 1-00-50 14 bytes + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 16 String row 0 + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 // 17- 31 String row 0 + }; + + /** + * + */ + private byte[] TTX_PaddingRow = { + // FF 2C FF... + (byte)0xFF, 0x2C, + (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, + (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, + (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, + (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, + (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, + (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, + (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, + (byte)0xFF, (byte)0xFF + }; + + /** + * + */ + public byte[] getTTXPadding_TSPacket(int ts_count, byte[] pts_value) + { + byte[] ttx1 = new byte[TTX_TS_Packet.length * 2]; + + //default page = 100, use as is + System.arraycopy(TTX_TS_Packet, 0, ttx1, 0, TTX_TS_Packet.length); + System.arraycopy(TTX_TS_Packet, 0, ttx1, TTX_TS_Packet.length, TTX_TS_Packet.length); + + //ts packet count + ttx1[3] = (byte) (0x10 | 0xF & ts_count); + ttx1[0xBF] = (byte) (0x10 | 0xF & (ts_count + 1)); + + //pts value + System.arraycopy(pts_value, 0, ttx1, 13, 5); + System.arraycopy(pts_value, 0, ttx1, 0xC9, 5); + + int[] row_pos = { 0x32, 0x60, 0x8E, 0xEE, 0x11C, 0x14A }; //pos start for 6 rows + + //insert padding + for (int i = 1; i < 6; i++) + System.arraycopy(TTX_PaddingRow, 0, ttx1, row_pos[i], TTX_PaddingRow.length); + + return ttx1; + } + + /** + * + */ + public byte[] getTTX_TSPacket(ArrayList rowList, int ts_count, byte[] pts_value) + { + byte[] ttx1 = new byte[TTX_TS_Packet.length * 2]; + + //default page = 100, works also as termination of 150 + System.arraycopy(TTX_TS_Packet, 0, ttx1, 0, TTX_TS_Packet.length); + System.arraycopy(TTX_TS_Packet, 0, ttx1, TTX_TS_Packet.length, TTX_TS_Packet.length); + + //ts packet count + ttx1[3] = (byte) (0x10 | 0xF & ts_count); + ttx1[0xBF] = (byte) (0x10 | 0xF & (ts_count + 1)); + + //pts value + System.arraycopy(pts_value, 0, ttx1, 13, 5); + System.arraycopy(pts_value, 0, ttx1, 0xC9, 5); + + byte[] row; + int[] row_pos = { 0x32, 0x60, 0x8E, 0xEE, 0x11C, 0x14A }; //pos start for 6 rows + int doubleheight = 1; + + //replace row 0 with header page 150 + System.arraycopy(TTX_Heading150Row, 0, ttx1, row_pos[0], TTX_Heading150Row.length); + + //character_set mapping + int control_bits = ((Integer) mapping_table.get("subset")).intValue()<<1; + //magazine serial + control_bits |= 1; + + ttx1[row_pos[0] + 13] = hamming_8_4_values[(0xFF & bytereverse(control_bits))>>4]; + + //insert 1 string per row + for (int i = 0, j = rowList.size(); i < j; i++) + { + row = setCharacterMapping(rowList.get(i).toString()); + row = centerString(row, doubleheight); + + //row = centerString(rowList.get(i).toString().getBytes(), doubleheight); + + for (int k = 0; k < row.length; k++) + row[k] = bytereverse(parity(row[k])); //make them TTX compatible + + System.arraycopy(TTX_Row[doubleheight][TTX_Row[doubleheight].length - j + i], 0, ttx1, row_pos[i + 1], TTX_Row[doubleheight][TTX_Row[doubleheight].length - j + i].length); //insert row + System.arraycopy(row, 0, ttx1, row_pos[i + 1] + 6, row.length); // insert string + } + + //prevent duplicate vbi line number + for (int i = 0, vbi = 0xE7; i < row_pos.length; i++, vbi++) + ttx1[row_pos[i] + 2] = (byte) vbi; + + //insert padding + // for (int i = rowList.size() + 1; i < 4; i++) + // System.arraycopy(TTX_PaddingRow, 0, ttx1, row_pos[i + 2], TTX_PaddingRow.length); + + return ttx1; + } + + /** + * + */ + private byte[] setCharacterMapping(String str) + { + char[] ch = str.toCharArray(); + byte[] row = new byte[ch.length]; + String tmp; + + for (int i = 0, j = ch.length; i < j; i++) + { + tmp = String.valueOf((short) ch[i]); + + if (mapping_table.containsKey(tmp)) + row[i] = ((Integer) mapping_table.get(tmp)).byteValue(); + + else + row[i] = (byte) ch[i]; + } + + return row; + } + + /** + * + */ + private byte[] centerString(byte[] row, int doubleheight) + { + int max_length = 40; + byte[] new_row = new byte[max_length]; + int row_length = row.length; + + if (row_length > max_length - doubleheight) + row_length = max_length - doubleheight; + + int leadg_space = doubleheight + ((new_row.length - row_length) / 2); + int trail_space = max_length - row_length - leadg_space; + + Arrays.fill(new_row, (byte) 0x20); //set all spaces + + if (doubleheight == 1) + new_row[0] = 0x0D; // double height + + //string length must not exceed 38,39 chars for boxing + while (leadg_space - doubleheight < 2) + { + leadg_space++; + trail_space--; + + if (leadg_space + row_length > 40) + row_length--; + } + + System.arraycopy(row, 0, new_row, leadg_space, row_length); //copy string + + new_row[leadg_space - 2] = 0x0B; // start box + new_row[leadg_space - 1] = 0x0B; // start box rpt + + for (int i = leadg_space + row_length, j = 0; i < max_length && j < 2; i++, j++) + new_row[leadg_space + row_length] = 0x0A; // end box + + return new_row; + } + + // + private Hashtable mapping_table = new Hashtable(); + + /** + * + */ + public void setMappingTable() + { + mapping_table.clear(); + + //mapping requires x/28 or M/29 rows - cant be handled automatically + int mapping = Common.getSettings().getIntProperty(Keys.KEY_TtxLanguagePair) - 1; + mapping = mapping < 0 ? 0 : mapping; + + int subset = mapping == 0 ? 4 : 0; //DE + + mapping_table.put("mapping", new Integer(mapping)); + mapping_table.put("subset", new Integer(subset)); + + active_set = CharSet.getActive_G0_Set(mapping, subset, 0); + active_national_set = CharSet.getActiveNationalSubset(mapping, subset, 0); + + for (int i = 0x20, j = active_set.length - 1; i < j; i++) //0x20 to 0x7E (0x7F is full sign) + mapping_table.put(String.valueOf(active_set[i]), new Integer(i)); + + int[] map = { 0x23, 0x24, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x7B, 0x7C, 0x7D, 0x7E }; + + for (int i = 0, j = active_national_set.length; subset >= 0 && i < j; i++) + mapping_table.put(String.valueOf(active_national_set[i]), new Integer(map[i])); + } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/UnicodeWriter.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/UnicodeWriter.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/subtitle/UnicodeWriter.java 2006-02-01 03:19:42.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/subtitle/UnicodeWriter.java 2008-11-02 17:32:02.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)UnicodeWriter.java * - * Copyright (c) 2005-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -106,6 +106,10 @@ // UTF8 if (useUTF8) { + // mark file as UTF-8, from akin + if (out1.size() == 0) + out1.write( new byte[] { (byte)0xEF, (byte)0xBB, (byte)0xBF}, 0, 3); + char[] chars = str.toCharArray(); for (int i = 0, j = chars.length; i < j; i++) diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileD2A.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileD2A.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileD2A.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileD2A.java 2005-12-17 22:47:40.000000000 +0000 @@ -0,0 +1,195 @@ +/* + * @(#)ProjectFileD2A + * + * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.thirdparty; + + +import java.io.IOException; +import java.io.BufferedWriter; +import java.io.FileWriter; + +import java.util.ArrayList; + +import net.sourceforge.dvb.projectx.common.Resource; +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.video.Video; +import net.sourceforge.dvb.projectx.parser.Gop; + +public class ProjectFileD2A implements ProjectFileIF +{ + /** + * basic GOP line: + * 7 file position/2048 flags flags ... + */ + + private ArrayList fields = new ArrayList(); + + private final String version = "DVD2AVIProjectFile"; + private final String number_of_files = "_NumberOfFiles"; // placeholder + private final String file_name_x = "_FileNameX"; // placeholder + private final String frame_rate = "Frame_Rate="; // eg. 25000 + private final String location = "Location="; // eg. 0,0,0,14AA00 + private final String finish = "FINISHED"; + + private int file_index = 0; + + private final String[] frame_type = { " 0", " 1", " 2", " 3" }; + private final String end_of_stream = " 9"; + + private String d2v_file = ""; + + private ProjectFileD2A() + {} + + public ProjectFileD2A(String str) + { + init(str); + } + + private void init(String str) + { + d2v_file = str + ".d2v"; + + reset(); + addBasicFields(); + } + + private void reset() + { + file_index = 0; + fields.clear(); + } + + private void addBasicFields() + { + fields.add(version); + fields.add(number_of_files); + fields.add(file_name_x); + fields.add(""); + fields.add("Stream_Type=0,0,0"); + fields.add("iDCT_Algorithm=2"); + fields.add("YUVRGB_Scale=1"); + fields.add("Luminance=128,0"); + fields.add("Picture_Size=0,0,0,0,0,0"); + fields.add("Field_Operation=0"); + fields.add(frame_rate); + fields.add(location); + fields.add(""); + } + + public int getPart() + { + return file_index; + } + + /** + * set new file segment before placeholder + */ + public void addFileSegment(String str) + { + fields.add( fields.indexOf(file_name_x), "" + str.length() + " " + str); + file_index++; + } + + /** + * sets video_data + */ + public void setVideoFormat(int val1, int val2, int val3, int val4) + { + // empty + } + + /** + * long _position is of picture header start code of first I-frame! + */ + public void addGop(long _position, Gop gop) + { + String str = "7 " + file_index + " " + (_position / 2048L) + " "; + + fields.add(str); + } + + public void addAudio(long startposition, byte[] frame) + { + // empty + } + + + public void finish(long _filesize) + { + /** + * no GOP line was written + */ + if (fields.size() < 14) + { + reset(); + return; + } + + /** + * remove placeholder + */ + fields.remove( fields.indexOf(file_name_x)); + + /** + * remove placeholder and set number of files + */ + fields.set( fields.indexOf(number_of_files), String.valueOf(file_index + 1)); + + /** + * get placeholder and add file_index + size + * "0,0," means: start at file = 0, position = 0 + */ + fields.set( fields.indexOf(location), location + "0,0," + file_index + "," + Long.toHexString(_filesize / 2048L).toUpperCase()); + + /** + * finish last gop_line + */ + fields.set( fields.size() - 1, fields.get(fields.size() - 1).toString() + frame_type[2] + frame_type[2] + end_of_stream); + + fields.add(""); + fields.add(finish); + + try { + BufferedWriter output = new BufferedWriter(new FileWriter(d2v_file)); + + for (int i = 0; i < fields.size(); i++) + { + output.write(fields.get(i).toString()); + output.newLine(); + } + + output.flush(); + output.close(); + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + + reset(); + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileDGI.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileDGI.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileDGI.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileDGI.java 2005-12-17 22:47:40.000000000 +0000 @@ -0,0 +1,230 @@ +/* + * @(#)ProjectFileDGI + * + * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.thirdparty; + + +import java.io.IOException; +import java.io.BufferedWriter; +import java.io.FileWriter; + +import java.util.ArrayList; + +import net.sourceforge.dvb.projectx.common.Resource; +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.video.Video; +import net.sourceforge.dvb.projectx.parser.Gop; + +public class ProjectFileDGI implements ProjectFileIF +{ + /** + * basic GOP line: + * 7 file position vob cell flags flags ... + */ + + private ArrayList fields = new ArrayList(); + + private final String version = "DGIndexProjectFile06"; + private final String number_of_files = "_NumberOfFiles"; // placeholder + private final String file_name_x = "_FileNameX"; // placeholder + private final String aspect_ratio = "Aspect_Ratio="; // eg. 4:3 + private final String picture_size = "Picture_Size="; // eg. 720x576 + private final String frame_rate = "Frame_Rate="; // eg. 25000 + private final String location = "Location="; // eg. 0,0,0,14AA00 + private final String finish = "FINISHED 0.00% FILM"; + + private int framerate_index = -1; + private int aspectratio_index = -1; + private int horizontal_size = -1; + private int vertical_size = -1; + + private int file_index = 0; + + private final String[] frame_type = { " 0", " 1", " 2", " 3" }; + private final String end_of_stream = " 9"; + + private String dgi_file = ""; + + private ProjectFileDGI() + {} + + public ProjectFileDGI(String str) + { + init(str); + } + + private void init(String str) + { + dgi_file = str + ".dgi.d2v"; + + reset(); + addBasicFields(); + } + + private void reset() + { + file_index = 0; + fields.clear(); + } + + private void addBasicFields() + { + fields.add(version); + fields.add(number_of_files); + fields.add(file_name_x); + fields.add(""); + fields.add("Stream_Type=0"); + fields.add("iDCT_Algorithm=2 (1:MMX 2:SSEMMX 3:FPU 4:REF 5:SSE2MMX)"); + fields.add("YUVRGB_Scale=1 (0:TVScale 1:PCScale)"); + fields.add("Luminance_Filter=0,0 (Gamma, Offset)"); + fields.add("Clipping=0,0,0,0 (ClipLeft, ClipRight, ClipTop, ClipBottom)"); + fields.add(aspect_ratio); + fields.add(picture_size); + fields.add("Field_Operation=0 (0:None 1:ForcedFILM 2:RawFrames)"); + fields.add(frame_rate); + fields.add(location); + fields.add(""); + } + + public int getPart() + { + return file_index; + } + + /** + * set new file segment before placeholder + */ + public void addFileSegment(String str) + { + fields.add( fields.indexOf(file_name_x), "" + str.length() + " " + str); + file_index++; + } + + /** + * sets video_data + */ + public void setVideoFormat(int val1, int val2, int val3, int val4) + { + if (framerate_index != -1) + framerate_index = val1; + + if (aspectratio_index != -1) + aspectratio_index = val2; + + if (horizontal_size != -1) + horizontal_size = val3; + + if (vertical_size != -1) + vertical_size = val4; + } + + /** + * frames decodable w/ a reference to a previous gop must be known here + * frames w/ backward encoding to this gop first I-frame write w/ a leading "1" + * long _position is of picture header start code of first I-frame! + */ + public void addGop(long _position, Gop gop) + { + String str = "7 " + file_index + " " + _position + " 0 0 "; + + fields.add(str); + } + + public void addAudio(long startposition, byte[] frame) + { + // empty + } + + public void finish(long _filesize) + { + /** + * no GOP line was written + */ + if (fields.size() < 16) + { + reset(); + return; + } + + /** + * remove placeholder + */ + fields.remove( fields.indexOf(file_name_x)); + + /** + * remove placeholder and set number of files + */ + fields.set( fields.indexOf(number_of_files), String.valueOf(file_index + 1)); + + /** + * set frame_rate + */ + fields.set( fields.indexOf(frame_rate), frame_rate + Video.getFrameRate(framerate_index)); + + /** + * set aspectratio + */ + fields.set( fields.indexOf(aspect_ratio), aspect_ratio + Video.getAspectRatio(aspectratio_index)); + + /** + * set picture size + */ + fields.set( fields.indexOf(picture_size), picture_size + horizontal_size + "x" + vertical_size); + + /** + * get placeholder and add file_index + size + * "0,0," means: start at file = 0, position = 0 + */ + fields.set( fields.indexOf(location), location + "0,0," + file_index + "," + Long.toHexString(_filesize / 2048L).toUpperCase()); + + /** + * finish last gop_line + */ + fields.set( fields.size() - 1, fields.get(fields.size() - 1).toString() + end_of_stream); + + fields.add(""); + fields.add(finish); + + try { + BufferedWriter output = new BufferedWriter(new FileWriter(dgi_file)); + + for (int i = 0; i < fields.size(); i++) + { + output.write(fields.get(i).toString()); + output.newLine(); + } + + output.flush(); + output.close(); + + } catch (IOException e) { + + Common.setExceptionMessage(e); + } + + reset(); + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileIF.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileIF.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileIF.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFileIF.java 2005-12-17 22:47:40.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * @(#)ProjectFileIF + * + * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.thirdparty; + +import net.sourceforge.dvb.projectx.parser.Gop; + +public interface ProjectFileIF { + + public void addFileSegment(String segment_filename); + + public void setVideoFormat(int framerate_index, int aspectratio_index, int horizontal_size, int vertical_size); + + public void addGop(long startposition, Gop gop); + + public void addAudio(long startposition, byte[] frame); + + public void finish(long filesize); +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFile.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFile.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFile.java 1970-01-01 00:00:00.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/ProjectFile.java 2005-12-17 22:47:40.000000000 +0000 @@ -0,0 +1,134 @@ +/* + * @(#)ProjectFile + * + * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * + * This file is part of ProjectX, a free Java based demux utility. + * By the authors, ProjectX is intended for educational purposes only, + * as a non-commercial test project. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +package net.sourceforge.dvb.projectx.thirdparty; + +import net.sourceforge.dvb.projectx.thirdparty.ProjectFileIF; + +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Resource; +import net.sourceforge.dvb.projectx.common.Keys; +import net.sourceforge.dvb.projectx.parser.Gop; + +import java.util.ArrayList; + + +public class ProjectFile implements ProjectFileIF +{ + private ArrayList impl_list = null; + + private ProjectFileIF impl = null; + + private int file_index = 0; + + private ProjectFile() + {} + + public ProjectFile(String str) + { + retrieveType(str); + } + + private void retrieveType(String str) + { + impl_list = new ArrayList(); + + if (Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createD2vIndex)) + impl_list.add(new ProjectFileD2A(str)); + + if (Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_createDgiIndex)) + impl_list.add(new ProjectFileDGI(str)); + + file_index = 0; + } + + public int getPart() + { + return file_index; + } + + public boolean splitVideo() + { + return Common.getSettings().getBooleanProperty(Keys.KEY_ExternPanel_splitProjectFile); + } + + public void addFileSegment(String segment_filename) + { + for (int i = 0; i < impl_list.size(); i++) + { + impl = (ProjectFileIF)impl_list.get(i); + + if (impl != null) + impl.addFileSegment(segment_filename); + } + + file_index++; + } + + public void setVideoFormat(int framerate_index, int aspectratio_index, int horizontal_size, int vertical_size) + { + for (int i = 0; i < impl_list.size(); i++) + { + impl = (ProjectFileIF)impl_list.get(i); + + if (impl != null) + impl.setVideoFormat(framerate_index, aspectratio_index, horizontal_size, vertical_size); + } + } + + public void addGop(long startposition, Gop gop) + { + for (int i = 0; i < impl_list.size(); i++) + { + impl = (ProjectFileIF)impl_list.get(i); + + if (impl != null) + impl.addGop(startposition, gop); + } + } + + public void addAudio(long startposition, byte[] frame) + { + for (int i = 0; i < impl_list.size(); i++) + { + impl = (ProjectFileIF)impl_list.get(i); + + if (impl != null) + impl.addAudio(startposition, frame); + } + } + + public void finish(long filesize) + { + for (int i = 0; i < impl_list.size(); i++) + { + impl = (ProjectFileIF)impl_list.get(i); + + if (impl != null) + impl.finish(filesize); + } + } +} diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/TS.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/TS.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/thirdparty/TS.java 2006-01-24 03:39:08.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/thirdparty/TS.java 2009-02-13 18:00:38.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)TS.java - constants to create TS packets * - * Copyright (c) 2002-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2002-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -24,6 +24,12 @@ * */ +/* + * Arion export introduced by Cameron D (AU) + * from 0.90.4.00b27 + */ + + package net.sourceforge.dvb.projectx.thirdparty; import java.util.List; @@ -36,13 +42,26 @@ import java.io.IOException; import java.io.RandomAccessFile; -//import net.sourceforge.dvb.projectx.audio.CRC; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; +import java.util.ArrayList; +import net.sourceforge.dvb.projectx.parser.CommonParsing; + + import net.sourceforge.dvb.projectx.common.Common; import net.sourceforge.dvb.projectx.common.Resource; -import net.sourceforge.dvb.projectx.subtitle.Teletext; +import net.sourceforge.dvb.projectx.common.JobProcessing; public class TS { + private static byte[] service_name = null; + private static byte[] event_name = null; + private static byte[] event_text = null; + + public TS() {} @@ -110,8 +129,8 @@ // TP_INFO 16 bytes starts at 52 0, // Satelite Index 8, 7, 0, // Polarity and Reserved (Does not matter in playback) - 0x6b, 0x6c, 0, 1, // Frequency (Does not matter in playback) - 0x40, 0x1f, // Symbol Rate (Does not matter in playback) + 0, 0, 0x2F, (byte)0x9B, // Frequency (Does not matter in playback) + 0x6B, 0x6C, // Symbol Rate (Does not matter in playback) 1, 1, // Transport Stream Id (Does not matter in playback) 0, 0, 0, 0, // Reserved * @@ -138,6 +157,205 @@ }; + //introduced by 'jkit' 23012009 + private static byte[] TF5200header = { + // HEADER 14 bytes, start at 0 + 0x54, 0x46, 0x72, 0x63, // Id "TFrc" * + 0x50, 0, // Version * + 0, 0, // Reserved * + 0, 0, // Duration in Minutes + 0, 0xa, // Service number in channel list (Does not matter in playback) + 0, 0, // Service type 0:TV 1:Radio + + // SERVICE_INFO 38 bytes starts at 14 + 0, 0, 1, 0x30, // Reserved and Tuner (Does not matter in playback) (Tuner 1+2 flagged) + 1, 2, // Service ID of TS stream + 1, 0, // PID number of PMT TS packet + 0, (byte)0xe0, // PID number of PCR TS packet + 0, (byte)0xe0, // PID number of Video TS packet + 0, (byte)0xc0, // PID number of Audio TS packet, MPA as std + + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x69, 0x6E, 0x67, 0, 0, 0, 0, 0, 0, 0, // Service Name + + // TP_INFO 12 bytes starts at 52 + 0, 6, 0x41, (byte)0x90, // Frequency (e.g. 410000 KHz) + 0x1A, (byte)0xF4, // Symbol_Rate (e.g. 6900 kS/s) + 1, 1, // Transport_Stream_Id (e.g. 0x044D) + 0, 1, // Network_Id + 2, // Modulation 0=16QAM, 1=32QAM, 2=64QAM, 3=128QAM, 4=256QAM + 0, // Reserved1 + + // EVT_INFO 160 bytes starts at 64 + (byte)0x80, 0x02, // Reserved * + 0, 0, // Duration in Minutes + 0, 0x3c, 4, 4, // Event Id + 84, 69, // Modified Julian date start time + 83, // Hour of start time + 84, // Minute os start time + 0, 0, // Modified Julian date end time + 0, // Hour of end time + 0, // Minute os end time + 4, // Reserved + 0, // Length of name in Event text + 0, // Parental rate + + // the rest is 0 so it's not defined explicitly + + // Event text + + // EXT_EVT_INFO + // Extended Event text + + }; + + /* + * header code for Arion TS file (.AVR file) + * There are two file formats, .AVR (the AV stream), and .AVF, the real header file. + */ + // The AVF filename must be retained for inclusion into each AVR header file. + // the filename format is: + // _#00n_.AVx + // Where n is the part number (starting from 1) + // date-time is in the format yyyymmddhhmm + // full pathname on PVR disc, + private static StringBuffer ArionAVFPathname_onPVR = new StringBuffer( 128 ); + // local filename - as finally named on this system; may or may not include directories. + private static StringBuffer ArionAVRLocalFilename = new StringBuffer( 1024 ); + private static File ArionAVFLocalPathname ; + // the initial date+time used must be remembered so we can rebuild the + // matching name for second and later file parts. + private static StringBuffer ArionAVFTime = new StringBuffer( 128 ); + // same the initial filename prefix for building other names later + private static StringBuffer ArionFilenameRoot = new StringBuffer( 128 ); + + // we need to keep track of total file sizes and playback length. + private static long ArionCumulativeTime = 0L; // seconds + // bytes (excluding header) - note Java long is 64 bits, so + // it has no problems with large files. + private static long ArionCumulativeStreamSize = 0L; + + private static final int ArionAVR_HEADERSIZE = 0x8000; + private static byte[] ArionAVR_Header = { + // HEADER 32k bytes, start at 0 + 0x41, 0x52, 0x41, 0x56, // Id "ARAV" * + 0x10, 0, // unknown * + 0, (byte)0x86, // unknown * + (byte)0x80, 0, // possibly length of header + 0x43, 0x3a, 0x5c, 0x50, 0x56, 0x52, 0x5c, 0x41, 0x56, 0x5c, // pathname of AVF file. + + // the rest is 0 so it's not defined explicitly + + + }; + + private static final int ArionAVF_HEADERSIZE = 15160; // File is 15k bytes + private static byte[] ArionAVF_Header = { + + 0x41, 0x52, 0x4e, 0x46, // Id "ARNF" * + 0x11, 0, 0, 0x04, // unknown + 0x3f, 0x04, 0, 0x0a, // unknown + + // Channel-related info + 0, // unknown + 0, 0, 0, // varies with broadcast channel + 0, 0x01, // 0x10: channel number + 0x07, 0, // constant + 0, 0x48, // constant + 0x01, 0, // 1 = TV, 2 = radio + + // SID/PID details + 1, 2, // SID + 0, 1, // number of audio streams + 0, (byte)0xc0, // audio PID 1 + 0x7f, (byte)0xff, // audio PID 2 + 0x11, 0x10, // 0x20: unknown + 0, (byte)0xe0, // PID for video + 0, 0, // unknown + 0, (byte)0x90, // PID for text/subtitles + 1, 0, // varies with channel + 0, // 0x2a: unknown... + 0x50, 0x72, 0x6f, 0x6a, 0x65, // Program stream name + 0x63, 0x74, 0x2d, 0x58, 0x20, 0x63, 0x6f, 0x6e, // 0x30: + 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x0a, 0x00, + 0, 0, 0, 0, // 0x40: + 1, 0x11, // unknown, sometimes zero. + 0, 0, // unknown + 0, 1, // unknown - zero or 1 + 0, 0, // 0x4a: unknown - quite variable + // block of zeroes - unknown + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // EPG start - this is EPG "now" when recording started. + 2, (byte)0xca, // size of EPG block + 7, (byte)0xd6, // year of scheduled start of tv program + 9, // 0x60: month of scheduled start of tv program + 8, // day of scheduled start of tv program + 7, // hour of scheduled start of tv program + 6, // minute of scheduled start of tv program + 3, // scheduled duration (hours) + 30, // scheduled duration (minutes) + // the program title - filled in with file name + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // total 64 bytes, null padded + + // the program subtitle or description + 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x58, 0x0a, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + + // the rest is 0 so it's not defined explicitly - actually - filled at run-time. + + + }; + + /* + * data structure defining the layout of EPG data stored in file in two places + */ + + private static final int ArionEPG_BLOCKSIZE = 714; + private static byte[] Arion_EPG_Block = { + // EPG - this is EPG "now" during recording or when started. + 2, (byte)0xca, // size of EPG block + 7, (byte)0xd6, // year of scheduled start of tv program + 9, // 0x60: month of scheduled start of tv program + 8, // day of scheduled start of tv program + 7, // hour of scheduled start of tv program + 6, // minute of scheduled start of tv program + 5, // scheduled duration (hours) + 30, // scheduled duration (minutes) + // the program title + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // total 64 bytes, null padded + + // the program subtitle or description + 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x58, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // total 128 bytes + + // program description (apparently not used) + + // the rest is 0 so it's not defined explicitly - actually - filled at run-time. + }; + + private static byte[] pmt1 = { 0x47,0x41,0,0x10, @@ -151,9 +369,8 @@ 6, (byte)0xE0, (byte)0x80, (byte)0xF0, 0xC, 0x52, 1, 0x11, 0x6A, 1, 0, 0xA, 4, 0x64, 0x65, 0x75, 0, 6, (byte)0xE0, (byte)0x81, (byte)0xF0, 0xC, 0x52, 1, 0x12, 0x6A, 1, 0, 0xA, 4, 0x64, 0x65, 0x75, 0, 6, (byte)0xE0, (byte)0x82, (byte)0xF0, 0xC, 0x52, 1, 0x13, 0x6A, 1, 0, 0xA, 4, 0x64, 0x65, 0x75, 0, - 6, (byte)0xE0, (byte)0x90, (byte)0xF0, 0x10,0x52, 1, (byte)0xC2, 0x56, 5, 0x65, (byte)0x6E, 0x67, 0x9, 0, 0xA, 4, 0x64, 0x65, 0x75, 0, - (byte)0x85, (byte)0x33, (byte)0x49, (byte)0x7e + (byte)0x85, (byte)0x33, (byte)0x49, (byte)0x7e // CRC32 }; private static int count1=0, count2=0, count3=0; @@ -168,8 +385,12 @@ private static byte[] pmtMPA = { 3, (byte)0xE0, (byte)0xC0, (byte)0xF0, 0x9, 0x52, 1, 3, 0xA, 4, 0x64, 0x65, 0x75, 1 }; private static byte[] pmtAC3 = { 6, (byte)0xE0, (byte)0x80, (byte)0xF0, 0xC, 0x52, 1, 4, 0x6A, 1, 0, 0xA, 4, 0x64, 0x65, 0x75, 0 }; private static byte[] pmtAC3_atsc = { (byte)0x81, (byte)0xE0, (byte)0x80, (byte)0xF0, 0xF, 0x52, 1, 4, 0xA, 4, 0x65, 0x6E, 0x67, 0, 5, 4, 0x41, 0x43, 0x2D, 0x33 }; +// private static byte[] pmtTTX = { 6, (byte)0xE0, (byte)0x90, (byte)0xF0, 0x1F, 0x52, 1, 5, 0x56, 20, 0x65, 0x6E, 0x67, 0x9, 0, 0x64, 0x65, 0x75, 0x11, 0x50, 0x67, 0x65, 0x72, 0x17, 0x77, 0x65, 0x6E, 0x67, 0x10, (byte)0x88, 0xA, 4, 0x64, 0x65, 0x75, 0 }; + private static byte[] pmtTTX = { 6, (byte)0xE0, (byte)0x90, (byte)0xF0, 0x2C, 0x52, 1, 5, 0x56, 20, 0x65, 0x6E, 0x67, 0x9, 0, 0x64, 0x65, 0x75, 0x11, 0x50, 0x67, 0x65, 0x72, 0x17, 0x77, 0x65, 0x6E, 0x67, 0x10, (byte)0x88, 0xA, 4, 0x64, 0x65, 0x75, 0, + 0x45, 0x0B, 0x01, 0x06, (byte)0xE7, (byte)0xE8, (byte)0xE9, (byte)0xEA, (byte)0xEB, (byte)0xEC, 0x04, 0x01, (byte)0xF0 + }; - private static byte[] pmtTTX = { 6, (byte)0xE0, (byte)0x90, (byte)0xF0, 0x1F, 0x52, 1, 5, 0x56, 20, 0x65, 0x6E, 0x67, 0x9, 0, 0x64, 0x65, 0x75, 0x11, 0x50, 0x67, 0x65, 0x72, 0x17, 0x77, 0x65, 0x6E, 0x67, 0x10, (byte)0x88, 0xA, 4, 0x64, 0x65, 0x75, 0 }; + private static byte[] pmtSUP = { 6, (byte)0xE0, (byte)0x20, (byte)0xF0, 0x0D, 0x52, 1, 6, 0x59, 8, 0x64, 0x65, 0x75, 0x10, 0, 1, 0, 1 }; private static byte[] autopmt = new byte[0]; private static int firstID = 0xE0; @@ -211,31 +432,40 @@ switch (0xF & (Pid>>>8)) { case 0: // vid - pmtMPV[2] = (byte)(0xFF&Pid); + pmtMPV[2] = (byte)(0xFF & Pid); pmtMPV[7] = (byte)lfn++; pmtout.write(pmtMPV); break; case 1: // mpeg-1 (-2) audio - pmtMPA[2] = (byte)(0xFF&Pid); + pmtMPA[2] = (byte)(0xFF & Pid); pmtMPA[7] = (byte)lfn++; pmtout.write(pmtMPA); break; - case 2: // ac3 audio - pmtAC3[2] = (byte)(0xFF&Pid); - pmtAC3[7] = (byte)lfn++; - pmtout.write(pmtAC3); - - // ac3_atsc addition, same values - pmtAC3_atsc[2] = (byte)(0xFF & Pid); - pmtAC3_atsc[7] = (byte)(lfn - 1); - pmtout.write(pmtAC3_atsc); + case 2: + if ((0xFF & Pid) < 0x40) // sup + { + pmtSUP[2] = (byte)(0xFF & Pid); + pmtSUP[7] = (byte)lfn++; + pmtout.write(pmtSUP); + } + else // ac3, dts audio + { + pmtAC3[2] = (byte)(0xFF & Pid); + pmtAC3[7] = (byte)lfn++; + pmtout.write(pmtAC3); + + // ac3_atsc addition, same values + pmtAC3_atsc[2] = (byte)(0xFF & Pid); + pmtAC3_atsc[7] = (byte)(lfn - 1); + pmtout.write(pmtAC3_atsc); + } break; case 3: // ttx - pmtTTX[2] = (byte)(0xFF&Pid); + pmtTTX[2] = (byte)(0xFF & Pid); pmtTTX[7] = (byte)lfn++; pmtout.write(pmtTTX); break; @@ -314,7 +544,7 @@ 0x47,0,(byte)0xe0,0x20, (byte)0xB7,0x10,0,0,0,0,0,0 }; - +/** private static byte ttx[] = { 0x47,0x40,(byte)0x9F,0x10, 0,0,1,(byte)0xBD,0,(byte)0xB2,(byte)0x84,(byte)0x80,0x24, @@ -343,7 +573,7 @@ byte[] tPTS = pts.getBytes(); for (int a = 0; a < tPTS.length; a++) - tPTS[a] = Teletext.bytereverse(Teletext.parity(tPTS[a])); + tPTS[a] = Common.getTeletextClass().bytereverse(Common.getTeletextClass().parity(tPTS[a])); System.arraycopy(tPTS, 0, ttx, 169, tPTS.length); System.arraycopy(data, 9 + offset, ttx, 13, 5); @@ -353,7 +583,145 @@ return ttx; } +**/ + +////////// + private static byte[] ttx_stream = null; + private static long[] ttx_pts_index = null; + private static int ttx_index = 0; + + /** + * read .sub text file and create complete TS TTX stream + * from 0.90.4.00b28 + */ + public static byte[] getTeletextStream(long video_pts) + { + if (ttx_pts_index == null) + return (new byte[0]); + + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + + for (int j = ttx_pts_index.length; ttx_index < j; ttx_index++) + { + if (video_pts < ttx_pts_index[ttx_index]) + break; + + //pts_delta, ttx_pts shall match video_pts at 40ms (3600ticks) boundary + video_pts -= ((video_pts - ttx_pts_index[ttx_index]) / 3600L) * 3600L; + + CommonParsing.setPES_PTSField(ttx_stream, 4 + ttx_index * 376, video_pts); + CommonParsing.setPES_PTSField(ttx_stream, 4 + 188 + ttx_index * 376, video_pts); + + bo.write(ttx_stream, ttx_index * 376, 376); + } + + return bo.toByteArray(); + } + /** + * read .sub text file and create complete TS TTX stream + * from 0.90.4.00b28 + */ + public static void buildTeletextStream(String filename) + { + filename = filename.substring(0, filename.lastIndexOf(".")) + ".sub"; + File f = new File(filename); + ttx_index = 0; + + if (!f.exists()) + return; + + try { + + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filename))); + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + + String line = "", tmp = ""; + ArrayList rowList = new ArrayList(); + int pos1 = 0, pos2 = 0; + long[] time = { 0, 0, 0 }; + byte[] pts_value = new byte[5]; + byte[] pts_value1 = new byte[8]; + StringTokenizer st; + ArrayList indexList = new ArrayList(); + long delay = 90L * Common.getSettings().getIntProperty("TTXInsertion.Delay", 0); + long[] framenumber = { 0, 0, 0 }; + + Common.setMessage("-> build teletext stream from file: '" + filename + "' / delay = " + (delay / 90) + " ms" ); + + Common.getTeletextClass().setMappingTable(); + + while ((line = br.readLine()) != null) + { + //if (!line.startsWith("{")) //problems with file signature reading utf files - omits a line + // continue; + + framenumber[0] = Long.parseLong(line.substring(pos1 = (line.indexOf("{") + 1), pos2 = line.indexOf("}"))); + framenumber[1] = Long.parseLong(line.substring(line.indexOf("{", ++pos1) + 1, pos2 = line.indexOf("}", ++pos2))); + + time[0] = delay + 90L * (1000/25) * framenumber[0]; + time[1] = delay + 90L * (1000/25) * framenumber[1]; + + st = new StringTokenizer(line.substring(pos2 + 1), "|"); + + rowList.clear(); + + while (st.hasMoreTokens()) + rowList.add(st.nextToken()); + + // every page consists of 376 (2x188) byte + for (int i = 0; i < 2; i++, framenumber[2]++) + { +/** + // insert padding packets for every frame + for (; framenumber[2] < framenumber[i]; framenumber[2]++) + { + Arrays.fill(pts_value, (byte) 0); // clear old value + + time[2] = delay + 90L * (1000/25) * framenumber[2]; + CommonParsing.setPES_PTSField(pts_value, -9, time[2]); + + bo.write(Common.getTeletextClass().getTTXPadding_TSPacket(count3, pts_value)); + + indexList.add(new Long(time[2])); + + count3 += 2; + } +**/ + Arrays.fill(pts_value, (byte) 0); // clear old value + CommonParsing.setPES_PTSField(pts_value, -9, time[i]); + + bo.write(Common.getTeletextClass().getTTX_TSPacket(rowList, count3, pts_value)); + + indexList.add(new Long(time[i])); + + count3 += 2; + rowList.clear(); //2nd call for time out (placing an empty page) + } + } + + br.close(); +/** + FileOutputStream fos = new FileOutputStream(filename + ".ttx"); + fos.write(bo.toByteArray()); + fos.flush(); + fos.close(); +**/ + ttx_stream = bo.toByteArray(); + + ttx_pts_index = new long[indexList.size()]; + for (int i = 0, j = ttx_pts_index.length; i < j; i++) + ttx_pts_index[i] = ((Long) indexList.get(i)).longValue(); + + } catch (Exception e) { + Common.setExceptionMessage(e); + } + } +///////////// + + /* + * + */ public static byte[] getPMT() { pmt[3] = (byte)(0x10 | (0xf & (count1++))); @@ -383,8 +751,11 @@ return pcr; } - - public static byte[] init(String name, boolean ac3, boolean _myTTX, int mode) + /** + * init additional header + * copy pmt entries + */ + public static byte[] init( JobProcessing job_processing, String name, boolean ac3, boolean _myTTX, int mode) { count1 = count2 = count3 = 0; myTTX = _myTTX; @@ -400,29 +771,60 @@ switch (mode) { case 1: - return initTF4000header(name, ac3); + return initTFHeader(TF4000header, 564, name, ac3, mode); case 2: - return initTF5000header(name, ac3, 1692); //fmly 1316 + return initTFHeader(TF5000header, 1692, name, ac3, mode); //fmly 1316 case 3: - return initTF5000header(name, ac3, 3760); + return initTFHeader(TF5000header, 3760, name, ac3, mode); + + case 4: + return initTFHeader(TF5200header, 3760, name, ac3, mode); + + case 5: + return initArionHeader(name, ac3, ArionAVR_HEADERSIZE , job_processing); } return (new byte[0]); } + /** + * init topfield header + * set main audio + */ + private static byte[] initTFHeader(byte[] header, int headerlength, String name, boolean ac3, int mode) + { + byte newheader[] = new byte[headerlength]; + System.arraycopy(header, 0, newheader, 0, header.length); +/** + byte file_name[] = new File(name).getName().getBytes(); + header[75] = (byte)(file_name.length - 3); + System.arraycopy(file_name, 0, newheader, 76, file_name.length - 3); +**/ + // primary_audio_pid = !ac3 ? 0xC0 : 0x80; + + newheader[26] = 0; + newheader[27] = !ac3 ? (byte)0xC0 : (byte)0x80; //MPA // set 1. AC3 PID as main TFaudio + return newheader; + } + + /** + * sets PID values + */ private static void updateHeader(int pos, int val) { //only last 8 bits used TF4000header[pos] = (byte) val; TF5000header[pos] = (byte) val; + TF5200header[pos] = (byte) val; } - public static String updateAdditionalHeader(String old_name, long time[], int mode) throws IOException + public static String updateAdditionalHeader(String old_name, long time[], int mode, JobProcessing job_processing) throws IOException { String new_name = ""; + String[] new_ext = { "", ".raw", ".rec", ".rec", ".rec", ""}; switch (mode) { @@ -430,33 +832,62 @@ return old_name; case 1: - new_name = old_name.substring(0, old_name.length() - 3) + ".raw"; - - if (new File(new_name).exists()) - new File(new_name).delete(); - - Common.renameTo(old_name, new_name); //DM13042004 081.7 int01 changed - - finishTF4000header(new_name, time); - break; - case 2: case 3: - new_name = old_name.substring(0, old_name.length() - 3) + ".rec"; + case 4: + new_name = old_name.substring(0, old_name.length() - 3) + new_ext[mode]; if (new File(new_name).exists()) new File(new_name).delete(); Common.renameTo(old_name, new_name); - finishTF5000header(new_name, time); + finishTFHeader(new_name, time, mode); break; + + case 5: + new_name = finishArionheaders(old_name, time, job_processing); + + break; } return new_name; } - private static void finishTF4000header(String name, long time[]) throws IOException + /** + * save event info + */ + public static void setEventInfo(byte[] data1, byte[] data2, byte[] data3) + { + if (data1 == null) + service_name = null; + else + { + service_name = new byte[data1.length]; + System.arraycopy(data1, 0, service_name, 0, data1.length); + } + + if (data2 == null) + event_name = null; + else + { + event_name = new byte[data2.length]; + System.arraycopy(data2, 0, event_name, 0, data2.length); + } + + if (data3 == null) + event_text = null; + else + { + event_text = new byte[data3.length]; + System.arraycopy(data3, 0, event_text, 0, data3.length); + } + } + + /** + * completes Topfield header + */ + private static void finishTFHeader(String name, long time[], int mode) { long event[] = new long[4]; long millis = (time[1] - time[0]) / 90L; @@ -464,137 +895,338 @@ event[0] = System.currentTimeMillis(); event[1] = event[0] - millis; - event[2] = (event[0] / 86400000L) + 40587; - event[3] = (event[1] / 86400000L) + 40587; + + //JD 2440588 1.1.1970 = 0 + //24*60*60*1000 + event[2] = (event[0] / 86400000L) + 2440588 - 2400001; + event[3] = (event[1] / 86400000L) + 2440588 - 2400001; Calendar datum = Calendar.getInstance(); datum.setTime(new Date(event[0])); - RandomAccessFile ts = new RandomAccessFile(name, "rw"); - - ts.seek(0); - ts.writeShort((short)event[2]); - ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); - ts.writeByte((byte)datum.get(Calendar.MINUTE)); - ts.writeShort((short)event[2]); - ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); - ts.writeByte((byte)datum.get(Calendar.MINUTE)); - ts.writeShort(minutes); - - ts.seek(0x44); - ts.writeShort((short)event[2]); - ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); - ts.writeByte((byte)datum.get(Calendar.MINUTE)); - ts.writeShort(minutes); - - datum.setTime(new Date(event[1])); - - ts.seek(0x40); - ts.writeShort((short)event[3]); - ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); - ts.writeByte((byte)datum.get(Calendar.MINUTE)); + switch (mode) + { + case 1: + finishTF4000header(name, time, minutes, event, datum); + break; + case 2: + case 3: + finishTF5X00header(name, time, minutes, event, datum, 4); + break; + case 4: + finishTF5X00header(name, time, minutes, event, datum, 0); + } - ts.close(); } - //introduced by 'catapult' 09082004 - private static void finishTF5000header(String name, long time[]) throws IOException + /** + * completes Topfield 4000 header + */ + private static void finishTF4000header(String name, long time[], short minutes, long[] event, Calendar datum) { - long event[] = new long[4]; - long millis = (time[1] - time[0]) / 90L; - short minutes = (short)(0xFFFF & (Math.round(millis / 60000f))); + try { - event[0] = System.currentTimeMillis(); - event[1] = event[0] - millis; - event[2] = (event[0] / 86400000L) + 40587; - event[3] = (event[1] / 86400000L) + 40587; + RandomAccessFile ts = new RandomAccessFile(name, "rw"); - Calendar datum = Calendar.getInstance(); - datum.setTime(new Date(event[0])); + ts.seek(0); + ts.writeShort((short)event[2]); + ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); + ts.writeByte((byte)datum.get(Calendar.MINUTE)); + ts.writeShort((short)event[2]); + ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); + ts.writeByte((byte)datum.get(Calendar.MINUTE)); + ts.writeShort(minutes); - RandomAccessFile ts = new RandomAccessFile(name, "rw"); + ts.seek(0x44); + ts.writeShort((short)event[2]); + ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); + ts.writeByte((byte)datum.get(Calendar.MINUTE)); + ts.writeShort(minutes); - ts.seek(0x08); - ts.writeShort(minutes); + datum.setTime(new Date(event[1])); - ts.seek(0x46); - ts.writeShort(minutes); + ts.seek(0x40); + ts.writeShort((short)event[3]); + ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); + ts.writeByte((byte)datum.get(Calendar.MINUTE)); - ts.seek(0x50); - ts.writeShort((short)event[2]); - ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); - ts.writeByte((byte)datum.get(Calendar.MINUTE)); + ts.close(); - datum.setTime(new Date(event[1])); + } catch (Exception e) { - ts.seek(0x4C); - ts.writeShort((short)event[3]); - ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); - ts.writeByte((byte)datum.get(Calendar.MINUTE)); + Common.setExceptionMessage(e); + } + } - String eventname = new File(name).getName(); + /** + * completes Topfield 5X00 header + */ + //introduced by 'catapult' 09082004 + //dvb-c mod's jkit 23012009 + private static void finishTF5X00header(String name, long time[], short minutes, long[] event, Calendar datum, int event_info_offset) + { + try { + RandomAccessFile ts = new RandomAccessFile(name, "rw"); - if (eventname.length() > 128) - eventname = eventname.substring(0, 128); + ts.seek(0x08); + ts.writeShort(minutes); - ts.seek(0x55); - ts.writeUTF(eventname); + if (service_name != null) + { + ts.seek(0x1C); + ts.write(service_name); + } - ts.seek(0x56); - int val = ts.read(); + ts.seek(0x42 + event_info_offset); + ts.writeShort(minutes); - ts.seek(0x55); - ts.writeShort(val<<8); + ts.seek(0x4C + event_info_offset); + ts.writeShort((short)event[2]); + ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); + ts.writeByte((byte)datum.get(Calendar.MINUTE)); + + datum.setTime(new Date(event[1])); + ts.seek(0x48 + event_info_offset); + ts.writeShort((short)event[3]); // datum + ts.writeByte((byte)datum.get(Calendar.HOUR_OF_DAY)); + ts.writeByte((byte)datum.get(Calendar.MINUTE)); - ts.close(); - } + if (event_name != null) + { + ts.seek(0x51 + event_info_offset); + ts.write(event_name); + } - private static byte[] initTF4000header(String name, boolean ac3) - { - byte header[] = new byte[564]; //TF4000 - System.arraycopy(TF4000header, 0, header, 0, TF4000header.length); + else + { + String eventname = new File(name).getName(); - byte file_name[] = new File(name).getName().getBytes(); - header[75] = (byte)(file_name.length - 3); - System.arraycopy(file_name, 0, header, 76, file_name.length - 3); + if (eventname.length() > 128) + eventname = eventname.substring(0, 128); - if (ac3) - { - header[26] = 0; - header[27] = (byte)0x80; // set 1. AC3 PID as main TFaudio - } - else - { - header[26] = 0; - header[27] = (byte)0xC0; - } + ts.seek(0x51 + event_info_offset); + ts.writeUTF(eventname); //filename - return header; - } + ts.seek(0x52 + event_info_offset); + int val = ts.read(); - private static byte[] initTF5000header(String name, boolean ac3, int headerlength) - { - byte header[] = new byte[headerlength]; - System.arraycopy(TF5000header, 0, header, 0, TF5000header.length); + ts.seek(0x51 + event_info_offset); + ts.writeShort(val<<8); + } - byte file_name[] = new File(name).getName().getBytes(); - header[75] = (byte)(file_name.length - 3); - System.arraycopy(file_name, 0, header, 76, file_name.length - 3); + if (event_text != null) + { + ts.seek(0xE0 + event_info_offset); + ts.write(event_text); + } - if (ac3) - { - header[26] = 0; - header[27] = (byte)0x80; // set 1. AC3 PID as main TFaudio - } - else - { - header[26] = 0; - header[27] = (byte)0xC0; //MPA + ts.close(); + + } catch (Exception e) { + + Common.setExceptionMessage(e); } - return header; + setEventInfo(null, null, null); //reset } + private static byte[] initArionHeader(String name, boolean ac3, int headerlength, JobProcessing job_processing) + { + + int splitPart = job_processing.getSplitPart(); + + if ( splitPart == 0 ) + { + /* + * this is the first part, so build the AVF info file as well as the AVR header + */ + long now = System.currentTimeMillis(); // time now + + Calendar datum = Calendar.getInstance(); + datum.setTime( new Date(now) ); + + ArionAVFPathname_onPVR.setLength( 0 ); + ArionAVFTime.setLength( 0 ); + ArionFilenameRoot.setLength( 0 ); + ArionCumulativeTime = 0L; + ArionCumulativeStreamSize = 0L; + + // ArionAVFTime.append( String.format( "%1$tY%1$tm%1$td%1$tH%1$tM", now ) ); + ArionAVFTime.append(Common.formatTime_5(now)); + + // ProjectX automatically appends ().ts to the filename. + // we want to remove those bits and any leading path component. + // The file will be renamed at the end (in the finishArionHeader routine), + // we just save the details for now. + ArionFilenameRoot.append( new File(name).getName() ); // start with leading path removed + int parenIndex = ArionFilenameRoot.toString().lastIndexOf( "(" ); + if ( parenIndex > 0 ) + ArionFilenameRoot.delete( parenIndex, ArionFilenameRoot.length() ); + + /* + * now check for total length of file name: + * "C:\PVR\AV\" = 10 + * "_#001_" = 6 + * "yyyymmddhhmm" = 12 + * ".AVR" = 4 + * total 32. Max allowed is 125 plus null terminator. + */ + if ( ArionFilenameRoot.length() > 93 ) + ArionFilenameRoot.setLength( 93 ); + + String avf_name = new String( ArionFilenameRoot.toString( ) + + "_#001_" + + ArionAVFTime.toString( ) + + ".avf" ); + + ArionAVFPathname_onPVR.append( "C:\\PVR\\AV\\" + avf_name.toUpperCase() ); + StringBuffer arionAVRPathname_onPVR = new StringBuffer( ArionAVFPathname_onPVR.toString() ); + // full DOS-style pathname is only used in AVF header. + arionAVRPathname_onPVR.setCharAt( arionAVRPathname_onPVR.length()-1, 'R' ); + // now create AVF file in same place as new avr file. + + ArionAVFLocalPathname = new File( new File(name).getParentFile(), avf_name ); + + try { + Common.setMessage("Arion: Creating initial AVF file"); + RandomAccessFile avf_fd = new RandomAccessFile(ArionAVFLocalPathname, "rw"); + byte avf_header[] = new byte[ ArionAVF_HEADERSIZE ]; + System.arraycopy(ArionAVF_Header , 0, avf_header, 0, ArionAVF_Header.length); + System.arraycopy(arionAVRPathname_onPVR.toString().getBytes() , 0, + avf_header, 0x326, arionAVRPathname_onPVR.length()); + + avf_header[0x1B] = 0x02; + avf_header[0x1C] = (byte) 0x80; + avf_header[0x1D] = !ac3 ? (byte)0xC0 : (byte)0x80; //MPA // set 1. AC3 PID as main audio + avf_header[0x1E] = 0x00; + avf_header[0x1F] = ac3 ? (byte)0xC0 : (byte)0x80; //MPA // set 1. AC3 PID as main audio + + // now do the time/date for EPG and recording info. + // since we have no meaningful information we will just use current time + // for both sets of data. + short year = (short) datum.get( datum.YEAR ); + byte month = (byte) datum.get( datum.MONTH ); + byte day = (byte) datum.get( datum.DAY_OF_MONTH ); + byte hour = (byte) datum.get( datum.HOUR_OF_DAY ); + byte minute = (byte) datum.get( datum.MINUTE ); + avf_header[0x1f48] = 0x1b; + avf_header[0x1f49] = (byte)0xee; + avf_header[0x1f4a] = (byte)(year >>> 8 ); + avf_header[0x1f4b] = (byte)(year & 0xff); + avf_header[0x1f4c] = month; + avf_header[0x1f4d] = day; + avf_header[0x1f4e] = hour; + avf_header[0x1f4f] = minute; + avf_header[0x1f50] = 1; // one EPG entry. + + byte epg_entry[] = new byte[ ArionEPG_BLOCKSIZE ]; + System.arraycopy(Arion_EPG_Block , 0, epg_entry, 0, Arion_EPG_Block.length); + epg_entry[2] = (byte)(year >>> 8 ); + epg_entry[3] = (byte)(year & 0xff); + epg_entry[4] = month; + epg_entry[5] = day; + epg_entry[6] = hour; + epg_entry[7] = minute; + // assume the filename is useful as a program name. + System.arraycopy(ArionFilenameRoot.toString().getBytes() , 0, + epg_entry, 10, ArionFilenameRoot.length() ); + + // first copy into the "epg at start" area + System.arraycopy(epg_entry , 0, avf_header, 0x5c, epg_entry.length); + // then create the EPG table - with a single entry. + System.arraycopy(epg_entry , 0, avf_header, 0x1f52, epg_entry.length); + + avf_fd.write( avf_header); + avf_fd.close( ); + + } catch ( IOException e ) { + Common.setExceptionMessage(e); + } + } + /* create the local AVR filename for use in the finish. + */ + ArionAVRLocalFilename.setLength( 0 ); +// ArionAVRLocalFilename.append(ArionFilenameRoot.toString() + String.format( "_#%03d_", splitPart+1) + ArionAVFTime.toString( ) + ".avr"); + ArionAVRLocalFilename.append(ArionFilenameRoot.toString() + "_#" + Common.adaptString(splitPart + 1, 3) + "_" + ArionAVFTime.toString() + ".avr"); + + // Now create the AVR header, populate, and return it to caller. + byte header[] = new byte[headerlength]; + System.arraycopy(ArionAVR_Header , 0, header, 0, ArionAVR_Header.length); + + // copy the AVF filename into the AVR file header. + System.arraycopy( ArionAVFPathname_onPVR.toString().getBytes(), 0, header, 10, ArionAVFPathname_onPVR.length() ); + + + return header; + } + + /* + * called each time a file part has been written and been closed. + * Need to: + * rename AVR file to Arion style. + * add entries to AVF header for: + * size of this file, number of file parts, bitrate, + * total playback time (minutes), total size of stream (redundant, but...) + */ + // todo--- PIDs, file sizes, and total size.; bitrate. + private static String finishArionheaders(String old_name, long time[], JobProcessing job_processing ) throws IOException + { + // duration of recording - convert from 90kHz clock to ms. + long millis = (time[1] - time[0]) / 90L; + long duration_seconds = Math.round( millis / 1000.0f ); //total duration in seconds + ArionCumulativeTime += duration_seconds; + + long duration_minutes = Math.round( ArionCumulativeTime / 60.0f ); //total duration in minutes + + int splitPart = job_processing.getSplitPart(); + + File avrFile = new File( new File(old_name).getParentFile(), ArionAVRLocalFilename.toString() ); + if ( avrFile.exists() ) + avrFile.delete(); + + Common.renameTo( new File(old_name), avrFile); + + // now get the AVR file length + //RandomAccessFile ts = new RandomAccessFile(avrFile, "rw"); + long currentStreamSize = avrFile.length() - ArionAVR_HEADERSIZE; + ArionCumulativeStreamSize += currentStreamSize; + //ts.close(); + + if ( currentStreamSize > 0x7f9a0000 ) { + // not sure how to abort this cleanly. + Common.setMessage("!> Arion: File is too large " + String.valueOf(avrFile.length()) + " bytes)"); + return (new String( "noFileCreated" ) ); + } + + // now reopen the AVF file and update the timing info... + RandomAccessFile ts = new RandomAccessFile( ArionAVFLocalPathname, "rw"); + + Common.setMessage("Arion: renamed '" + old_name + "'"); + Common.setMessage(" to '" + avrFile.getPath() + "'"); + Common.setMessage(" size 0x" + Long.toHexString(currentStreamSize).toUpperCase() + ", duration " + String.valueOf(duration_seconds) + " sec (cumulative: " + String.valueOf(duration_minutes) + " min)"); + + int byterate = (int) (ArionCumulativeStreamSize / ArionCumulativeTime); + Common.setMessage("Arion: bitrate = " + String.valueOf(byterate) + " bytes/s"); + + // write the nth stream size ... + ts.seek(0x3a4 + 4 * splitPart ); + ts.writeInt( (int)currentStreamSize ); + + + ts.seek(0x6c4); + ts.writeInt( byterate ); + ts.writeInt( (int)duration_minutes ); + ts.writeShort( splitPart+1 ); + ts.seek(0x6d0); + ts.writeLong( ArionCumulativeStreamSize ); + Common.setMessage("Arion: Written " + String.valueOf(ArionCumulativeStreamSize) + " bytes"); + + ts.close(); + + return old_name; + } + + private static byte[] generateCRC32(byte[] data, int offset) { // x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/video/MpvDecoder.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/video/MpvDecoder.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/video/MpvDecoder.java 2006-03-04 02:35:06.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/video/MpvDecoder.java 2011-03-27 13:01:38.000000000 +0000 @@ -29,7 +29,7 @@ /* * @(#)MpvDecoder.java - still Picture Decoder * - * Copyright (c) 2003-2006 by dvb.matt, All Rights Reserved. + * Copyright (c) 2003-2010 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -65,6 +65,7 @@ import net.sourceforge.dvb.projectx.common.Resource; import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Keys; import net.sourceforge.dvb.projectx.parser.CommonParsing; @@ -74,7 +75,15 @@ private IDCTRefNative idct; private IDCTSseNative idctsse; - private int[] pixels2 = new int[512 * 288]; + private int preview_horizontal_size = 512; + private int preview_vertical_size = 288; + private final int cutview_horizontal_size = 160; + private final int cutview_vertical_size = 90; + + private int zoomMode = 0; + private int[] zoomArea = new int[4]; + + private int[] pixels2 = new int[preview_horizontal_size * preview_vertical_size]; private int[] pixels = new int[250]; //full pixel data private int Fault_Flag = 0; @@ -82,6 +91,8 @@ private int BufferPos = 0; private int SequenceHeader = 0; + private int YGain = 0; + private long StartPos = 0; private boolean acceleration = false; @@ -91,6 +102,9 @@ private boolean ERROR1 = false; private boolean ERROR2 = false; private boolean ERROR3 = false; + private boolean ERROR4 = false; + private boolean ERROR5 = false; + private boolean ERROR6 = false; private boolean viewGOP = true; private String info_4 = ""; @@ -98,8 +112,21 @@ private String info_2 = ""; private String info_1 = ""; + private String[] mpg_info = new String[18]; + + private String processedPidAndFile = Resource.getString("CollectionPanel.Preview.offline"); + private ArrayList PositionList = new ArrayList(); + private byte[] buf = new byte[0]; + private int[] LastPosVal = new int[2]; + + /** + * integer matrix by dukios + */ +// + static int ref_dct_matrix_i[] = new int[64]; +// /** * */ @@ -125,6 +152,14 @@ return acceleration; } + /** + * + */ + public void setAcceleration(boolean b) + { + acceleration = b; + } + final int PICTURE_START_CODE=0x100; final int SLICE_START_CODE_MIN=0x101; @@ -198,6 +233,8 @@ private String video_format_S[] = { "comp","PAL","NTSC","SECAM","MAC","unspec","res","res" }; private String prof[] = { "res","HP","SS","SNR","MP","SP","res","res" }; private String lev[] = { "res","res","res","res","HL","res","HL1440","res","ML","res","LL","res","res","res","res" }; +private String cf[] = { "res./monochrom","4:2:0","4:2:2","4:4:4" }; +private String SH[] = { "GOP","Sequence" }; /* ISO/IEC 13818-2 section 6.2.3: picture_header() */ private int picture_coding_type=0; @@ -235,11 +272,12 @@ }; final String aspect_ratio_string[] = { - "bad","(1:1)","(4:3)","(16:9)","(2.21:1)","(0.8055)","(0.8437)","(0.9375)","(0.9815)","(1.0255)","(1.0695)","(1.1250)","(1.1575)","(1.2015)" + "bad","1:1","4:3","16:9","2.21:1","0.8055","0.8437","0.9375","0.9815","1.0255","1.0695","1.1250","1.1575","1.2015" }; /* cosine transform matrix for 8x1 IDCT */ -final float ref_dct_matrix[][] = { +//final float ref_dct_matrix[][] = { +final static float ref_dct_matrix[][] = { { // [0][0-7] 3.5355339059327379e-001f, 3.5355339059327379e-001f, 3.5355339059327379e-001f, 3.5355339059327379e-001f, @@ -283,6 +321,18 @@ }, }; +/**/ +//dukios + static { + for(int i = 0; i < 8; i++) + { + for(int j = 0; j < 8; j++) + { + ref_dct_matrix_i[i * 8 + j] = Math.round(ref_dct_matrix[i][j] * 65536.0f); + } + } + } +/**/ final short idct_clip_table[] = { -256,-256,-256,-256,-256,-256,-256,-256, @@ -839,22 +889,32 @@ */ private int Get_Bits(int N) { - int Pos, Val; + int Pos, Val, a; Pos = BitPos>>>3; + a = Pos; - if (Pos >= buf.length) + if (a >= buf.length) ERROR3 = true; - Val = (0xFF & buf[Pos++])<<24; + if (a == LastPosVal[0]) + Val = LastPosVal[1]; + + else + { + Val = (0xFF & buf[a++])<<24; + + if (a < buf.length) + Val |= (0xFF & buf[a++])<<16; - if (Pos < buf.length) - Val |= (0xFF & buf[Pos++])<<16; + if (a < buf.length) + Val |= (0xFF & buf[a++])<<8; - if (Pos < buf.length) - Val |= (0xFF & buf[Pos++])<<8; + if (a < buf.length) + Val |= (0xFF & buf[a]); + } - if (Pos < buf.length) - Val |= (0xFF & buf[Pos]); + LastPosVal[0] = Pos; + LastPosVal[1] = Val; Val <<= BitPos & 7; Val >>>= 32-N; @@ -870,22 +930,32 @@ */ private int Show_Bits(int N) { - int Pos, Val; + int Pos, Val, a; Pos = BitPos>>>3; + a = Pos; - if (Pos >= buf.length) + if (a >= buf.length) ERROR3 = true; - Val = (0xFF & buf[Pos++])<<24; + if (a == LastPosVal[0]) + Val = LastPosVal[1]; - if (Pos < buf.length) - Val |= (0xFF & buf[Pos++])<<16; + else + { + Val = (0xFF & buf[a++])<<24; + + if (a < buf.length) + Val |= (0xFF & buf[a++])<<16; + + if (a < buf.length) + Val |= (0xFF & buf[a++])<<8; - if (Pos < buf.length) - Val |= (0xFF & buf[Pos++])<<8; + if (a < buf.length) + Val |= (0xFF & buf[a]); + } - if (Pos < buf.length) - Val |= (0xFF & buf[Pos]); + LastPosVal[0] = Pos; + LastPosVal[1] = Val; Val <<= BitPos & 7; Val >>>= 32 - N; @@ -931,7 +1001,15 @@ return 1; } } - } else if (viewGOP && start_code==GROUP_START_CODE){ + else if (start_code==PICTURE_START_CODE) //decode pic even without gopheader + { + reset_group_of_pictures_header(); + picture_header(); + return 1; + } + + } + else if (viewGOP && start_code==GROUP_START_CODE){ StartPos=BufferPos-4; group_of_pictures_header(); next_start_code(); @@ -940,8 +1018,16 @@ return 1; } } + + else if (!viewGOP && start_code==GROUP_START_CODE){ + if (DIRECTION) + Flush_Bits(-40); + + ERROR5 = true; + } //else if (start_code==SEQUENCE_END_CODE) // return 2; + else if (DIRECTION) Flush_Bits(-40); } @@ -1010,16 +1096,14 @@ vbv_buffer_size = Get_Bits(10); constrained_parameters_flag = Get_Bits(1); - //DM05072004 081.7 int06 changed - info_4 = " "; + mpg_info[6] = "QMatrix:"; if ((load_intra_quantizer_matrix = Get_Bits(1))>0) { for (i=0; i<64; i++) intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); - //DM05072004 081.7 int06 add - info_4 += ",iqm"; + mpg_info[6] += " iqm"; } else { @@ -1031,26 +1115,40 @@ for (i=0; i<64; i++) non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); - //DM05072004 081.7 int06 add - info_4 += ",niqm"; + mpg_info[6] += " niqm"; } else { Arrays.fill(non_intra_quantizer_matrix,16); } + if (mpg_info[6].equals("Matrix:")) + mpg_info[6] = "Matrix: default"; + + /* copy luminance to chrominance matrices */ System.arraycopy(intra_quantizer_matrix,0,chroma_intra_quantizer_matrix,0,64); System.arraycopy(non_intra_quantizer_matrix,0,chroma_non_intra_quantizer_matrix,0,64); frame_rate = (float)frame_rate_Table[frame_rate_code]; //DM06022004 081.6 int15 add - extension_and_user_data(); - //DM06052004 081.7 int02 add - //DM29082004 081.7 int10 changed - info_3 = ", " + (bit_rate_value * 400) + "bps, vbv " + vbv_buffer_size + (constrained_parameters_flag > 0 ? ", cpf" : ""); + mpg_info[2] = String.valueOf(bit_rate_value * 400) + " bps"; + mpg_info[2] += " - vbv " + vbv_buffer_size + (constrained_parameters_flag > 0 ? ", cpf" : ""); + + Common.setLastPreviewBitrate(bit_rate_value * 400); +} + +/* missing group of pictures header */ +private void reset_group_of_pictures_header(){ + drop_flag = 0; + gop_hour = -1; + gop_minute = -1; + gop_sec = -1; + gop_frame = -1; + closed_gop = 0; + broken_link = 0; } /* decode group of pictures header */ @@ -1102,7 +1200,8 @@ } next_start_code(); }else{ - info_4 += ", user_data"; //DM06052004 081.7 int02 add + mpg_info[17] = "user_data"; + Flush_Bits(32); // ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 next_start_code(); // skip user data } @@ -1138,244 +1237,274 @@ extension_and_user_data(); } -/* decode sequence extension */ -/* ISO/IEC 13818-2 section 6.2.2.3 */ -private void sequence_extension(){ - int low_delay; - int frame_rate_extension_n; - int frame_rate_extension_d; - - int horizontal_size_extension; - int vertical_size_extension; - int bit_rate_extension; - int vbv_buffer_size_extension; - - profile_and_level_indication = Get_Bits(8); - progressive_sequence = Get_Bits(1); - chroma_format = Get_Bits(2); - horizontal_size_extension = Get_Bits(2); - vertical_size_extension = Get_Bits(2); - bit_rate_extension = Get_Bits(12); - Flush_Bits(1); // marker bit - vbv_buffer_size_extension = Get_Bits(8); - low_delay = Get_Bits(1); + /* decode sequence extension */ + /* ISO/IEC 13818-2 section 6.2.2.3 */ + private void sequence_extension() + { + int low_delay; + int frame_rate_extension_n; + int frame_rate_extension_d; + + int horizontal_size_extension; + int vertical_size_extension; + int bit_rate_extension; + int vbv_buffer_size_extension; + + profile_and_level_indication = Get_Bits(8); + progressive_sequence = Get_Bits(1); + chroma_format = Get_Bits(2); + horizontal_size_extension = Get_Bits(2); + vertical_size_extension = Get_Bits(2); + bit_rate_extension = Get_Bits(12); + Flush_Bits(1); // marker bit + vbv_buffer_size_extension = Get_Bits(8); + low_delay = Get_Bits(1); - frame_rate_extension_n = Get_Bits(2); - frame_rate_extension_d = Get_Bits(5); - frame_rate = frame_rate * (frame_rate_extension_n+1) / (frame_rate_extension_d+1); //DM06022004 081.6 int15 changed + frame_rate_extension_n = Get_Bits(2); + frame_rate_extension_d = Get_Bits(5); + frame_rate = frame_rate * (frame_rate_extension_n+1) / (frame_rate_extension_d+1); //DM06022004 081.6 int15 changed - horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0xfff); - vertical_size = (vertical_size_extension<<12) | (vertical_size&0xfff); + horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0xfff); + vertical_size = (vertical_size_extension<<12) | (vertical_size&0xfff); - info_4 += ", ld=" + low_delay; //DM26052004 081.7 int03 add -} - -/* decode sequence display extension */ -private void sequence_display_extension(){ - int color_description; - int color_primaries; - int transfer_characteristics; - int matrix_coefficients; - int display_horizontal_size; - int display_vertical_size; - - video_format = Get_Bits(3); - color_description = Get_Bits(1); - - if (color_description>0){ - color_primaries = Get_Bits(8); - transfer_characteristics = Get_Bits(8); - matrix_coefficients = Get_Bits(8); + info_4 = " ld=" + low_delay; //DM26052004 081.7 int03 add } - display_horizontal_size = Get_Bits(14); - Flush_Bits(1); // marker bit - display_vertical_size = Get_Bits(14); + /* decode sequence display extension */ + private void sequence_display_extension() + { + int color_description; + int color_primaries; + int transfer_characteristics; + int matrix_coefficients; + int display_horizontal_size; + int display_vertical_size; - //DM06052004 081.7 int02 add - //DM26052004 081.7 int03 changed - info_4 += ", SDE: " + display_horizontal_size + "*" + display_vertical_size; -} + video_format = Get_Bits(3); + color_description = Get_Bits(1); -/* decode quant matrix entension */ -/* ISO/IEC 13818-2 section 6.2.3.2 */ -private void quant_matrix_extension(){ - int i; + if (color_description>0) + { + color_primaries = Get_Bits(8); + transfer_characteristics = Get_Bits(8); + matrix_coefficients = Get_Bits(8); + } - if ((load_intra_quantizer_matrix = Get_Bits(1))>0) - for (i=0; i<64; i++) - chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] - = intra_quantizer_matrix[scan[ZIG_ZAG][i]] - = Get_Bits(8); + display_horizontal_size = Get_Bits(14); + Flush_Bits(1); // marker bit + display_vertical_size = Get_Bits(14); - if ((load_non_intra_quantizer_matrix = Get_Bits(1))>0) - for (i=0; i<64; i++) - chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] - = non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] - = Get_Bits(8); + info_3 = " / " + display_horizontal_size + " * " + display_vertical_size; + } - if ((load_chroma_intra_quantizer_matrix = Get_Bits(1))>0) - for (i=0; i<64; i++) - chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); + /* decode quant matrix entension */ + /* ISO/IEC 13818-2 section 6.2.3.2 */ + private void quant_matrix_extension() + { + int i; - if ((load_chroma_non_intra_quantizer_matrix = Get_Bits(1))>0) - for (i=0; i<64; i++) - chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); -} + if ((load_intra_quantizer_matrix = Get_Bits(1))>0) + for (i=0; i<64; i++) + chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] + = intra_quantizer_matrix[scan[ZIG_ZAG][i]] + = Get_Bits(8); -/* decode picture display extension */ -/* ISO/IEC 13818-2 section 6.2.3.3. */ -private void picture_display_extension(){ - int frame_center_horizontal_offset[] = new int[3]; - int frame_center_vertical_offset[] = new int[3]; + if ((load_non_intra_quantizer_matrix = Get_Bits(1))>0) + for (i=0; i<64; i++) + chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] + = non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] + = Get_Bits(8); - int i; - int number_of_frame_center_offsets; + if ((load_chroma_intra_quantizer_matrix = Get_Bits(1))>0) + for (i=0; i<64; i++) + chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); - /* based on ISO/IEC 13818-2 section 6.3.12 - (November 1994) Picture display extensions */ + if ((load_chroma_non_intra_quantizer_matrix = Get_Bits(1))>0) + for (i=0; i<64; i++) + chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8); + } - /* derive number_of_frame_center_offsets */ - if (progressive_sequence>0){ - if (repeat_first_field>0) { - if (top_field_first>0) - number_of_frame_center_offsets = 3; - else - number_of_frame_center_offsets = 2; - }else - number_of_frame_center_offsets = 1; - }else{ - if (picture_structure!=FRAME_PICTURE) - number_of_frame_center_offsets = 1; - else{ + /* decode picture display extension */ + /* ISO/IEC 13818-2 section 6.2.3.3. */ + private void picture_display_extension() + { + int frame_center_horizontal_offset[] = new int[3]; + int frame_center_vertical_offset[] = new int[3]; + + int i; + int number_of_frame_center_offsets; + + /* based on ISO/IEC 13818-2 section 6.3.12 + (November 1994) Picture display extensions */ + + /* derive number_of_frame_center_offsets */ + if (progressive_sequence>0) + { if (repeat_first_field>0) - number_of_frame_center_offsets = 3; + { + if (top_field_first>0) + number_of_frame_center_offsets = 3; + else + number_of_frame_center_offsets = 2; + } else - number_of_frame_center_offsets = 2; + number_of_frame_center_offsets = 1; + } + else + { + if (picture_structure!=FRAME_PICTURE) + number_of_frame_center_offsets = 1; + else + { + if (repeat_first_field>0) + number_of_frame_center_offsets = 3; + else + number_of_frame_center_offsets = 2; + } } - } - /* now parse */ - for (i=0; i0){ - v_axis = Get_Bits(1); - field_sequence = Get_Bits(3); - sub_carrier = Get_Bits(1); - burst_amplitude = Get_Bits(7); - sub_carrier_phase = Get_Bits(8); + /* decode picture coding extension */ + private void picture_coding_extension() + { + int chroma_420_type; + int composite_display_flag; + int v_axis; + int field_sequence; + int sub_carrier; + int burst_amplitude; + int sub_carrier_phase; + + f_code[0][0] = Get_Bits(4); + f_code[0][1] = Get_Bits(4); + f_code[1][0] = Get_Bits(4); + f_code[1][1] = Get_Bits(4); + + intra_dc_precision = Get_Bits(2); + picture_structure = Get_Bits(2); + top_field_first = Get_Bits(1); + frame_pred_frame_dct = Get_Bits(1); + concealment_motion_vectors = Get_Bits(1); + q_scale_type = Get_Bits(1); + intra_vlc_format = Get_Bits(1); + alternate_scan = Get_Bits(1); + repeat_first_field = Get_Bits(1); + chroma_420_type = Get_Bits(1); + progressive_frame = Get_Bits(1); + composite_display_flag = Get_Bits(1); + + mpg_info[13] = "iDC-Prec: " + (intra_dc_precision + 8); + + if (composite_display_flag>0) + { + v_axis = Get_Bits(1); + field_sequence = Get_Bits(3); + sub_carrier = Get_Bits(1); + burst_amplitude = Get_Bits(7); + sub_carrier_phase = Get_Bits(8); - //DM29082004 081.7 int10 add - info_3 += ", cdf"; + mpg_info[13] += " / cdf"; + } } -} -/* Copyright extension */ -/* ISO/IEC 13818-2 section 6.2.3.6. */ -/* (header added in November, 1994 to the IS document) */ -public void copyright_extension(){ - int copyright_flag; - int copyright_identifier; - int original_or_copy; - int copyright_number_1; - int copyright_number_2; - int copyright_number_3; - - int reserved_data; - - copyright_flag = Get_Bits(1); - copyright_identifier = Get_Bits(8); - original_or_copy = Get_Bits(1); + /* Copyright extension */ + /* ISO/IEC 13818-2 section 6.2.3.6. */ + /* (header added in November, 1994 to the IS document) */ + private void copyright_extension() + { + int copyright_flag; + int copyright_identifier; + int original_or_copy; + int copyright_number_1; + int copyright_number_2; + int copyright_number_3; + + int reserved_data; + + copyright_flag = Get_Bits(1); + copyright_identifier = Get_Bits(8); + original_or_copy = Get_Bits(1); - /* reserved */ - reserved_data = Get_Bits(7); + /* reserved */ + reserved_data = Get_Bits(7); - Flush_Bits(1); // marker bit - copyright_number_1 = Get_Bits(20); - Flush_Bits(1); // marker bit - copyright_number_2 = Get_Bits(22); - Flush_Bits(1); // marker bit - copyright_number_3 = Get_Bits(22); -} + Flush_Bits(1); // marker bit + copyright_number_1 = Get_Bits(20); + Flush_Bits(1); // marker bit + copyright_number_2 = Get_Bits(22); + Flush_Bits(1); // marker bit + copyright_number_3 = Get_Bits(22); + } -/* set std for lower profiles as mpeg1 */ -public void resetDecoder(){ - Fault_Flag=0; //DM14052004 081.7 int02 add,fix - picture_coding_type=0; //DM14052004 081.7 int02 add,fix - SequenceHeader=1; - video_format=5; - progressive_sequence=1; - chroma_format=1; - profile_and_level_indication=0; - Second_Field=0; - intra_dc_precision=0; - picture_structure=FRAME_PICTURE; - top_field_first=0; - frame_pred_frame_dct=1; - concealment_motion_vectors=0; - intra_vlc_format=0; - repeat_first_field=0; - progressive_frame=1; - q_scale_type=0; - quantizer_scale=0; - alternate_scan=0; -} + /* set std for lower profiles as mpeg1 */ + private void resetDecoder() + { + Fault_Flag=0; //DM14052004 081.7 int02 add,fix + picture_coding_type=0; //DM14052004 081.7 int02 add,fix + SequenceHeader=1; + video_format=5; + progressive_sequence=1; + chroma_format=1; + profile_and_level_indication=0; + Second_Field=0; + intra_dc_precision=0; + picture_structure=FRAME_PICTURE; + top_field_first=0; + frame_pred_frame_dct=1; + concealment_motion_vectors=0; + intra_vlc_format=0; + repeat_first_field=0; + progressive_frame=1; + q_scale_type=0; + quantizer_scale=0; + alternate_scan=0; + } + + private void InitialDecoder() + { -public void InitialDecoder(){ + mb_width = (horizontal_size + 15)>>>4; + mb_height = (progressive_sequence>0) ? (vertical_size+15)>>>4 : ((vertical_size + 31)>>>5)<<1; - mb_width = (horizontal_size+15)/16; - mb_height = (progressive_sequence>0) ? (vertical_size+15)/16 : 2*((vertical_size+31)/32); + Coded_Picture_Width = mb_width<<4; + Coded_Picture_Height = mb_height<<4; - Coded_Picture_Width = 16 * mb_width; - Coded_Picture_Height = 16 * mb_height; + Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width : Coded_Picture_Width>>1; + Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height : Coded_Picture_Height>>1; - Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width : Coded_Picture_Width>>1; - Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height : Coded_Picture_Height>>1; + block_count = ChromaFormat[chroma_format]; - block_count = ChromaFormat[chroma_format]; + if (picture_coding_type==I_TYPE) + resizePixels(Coded_Picture_Width, Coded_Picture_Height, horizontal_size, vertical_size); + } - if (picture_coding_type==I_TYPE) - pixels = new int[Coded_Picture_Width*Coded_Picture_Height]; //DM30112003 081.5++ fix -} + public void resizePixels(int cw, int ch, int hs, int vs) + { + //value set from outside + Coded_Picture_Width = cw; + Coded_Picture_Height = ch; + horizontal_size = hs; + vertical_size = vs; + if (pixels.length != Coded_Picture_Width * Coded_Picture_Height) + pixels = new int[Coded_Picture_Width * Coded_Picture_Height]; + else + Arrays.fill(pixels, 0); + } //public void Decode_Picture(int ref, byte dst, int pitch){ public void Decode_Picture(){ @@ -1388,14 +1517,12 @@ } //moved - String SH[] = { "G","S" }; - String cf[] = { "res.","4:2:0","4:2:2","4:4:4" }; String fieldorder[] = {"bff","tff"}; //<==TheHorse 221003 - String picture_struc[] = {"-","T","B","F"}; //DM08022004 081.6 int16 add + String picture_struc[] = {"-","Top","Bottom","Frame"}; //DM08022004 081.6 int16 add //DM26022004 081.6 int18 changed //DM06052004 081.7 int02 changed - info_2 = "" + gop_hour + ":" + gop_minute + ":" + gop_sec + ":" + gop_frame + " "; + info_2 = Common.adaptString(gop_hour, 2) + ":" + Common.adaptString(gop_minute, 2) + ":" + Common.adaptString(gop_sec, 2) + ":" + Common.adaptString(gop_frame, 2) + " "; info_2 += ", " + drop_flag + "/" + closed_gop + "/" + broken_link + " "; info_2 += ", " + (Math.round(frame_rate * 1000) / 1000.0f) + "fps "; //DM06022004 081.6 int15 change info_2 += ", " + SH[SequenceHeader] + " "; @@ -1404,6 +1531,15 @@ info_2 += ", " + cf[chroma_format]; info_2 += info_3; + mpg_info[4] = "Chroma: " + cf[chroma_format]; + mpg_info[8] = "Main Header: " + SH[SequenceHeader]; + mpg_info[9] = Common.adaptString(gop_hour, 2) + ":" + Common.adaptString(gop_minute, 2) + ":" + Common.adaptString(gop_sec, 2) + ":" + Common.adaptString(gop_frame, 2); + mpg_info[9] += " " + drop_flag + "/" + closed_gop + "/" + broken_link; + mpg_info[12] = "Pic.Struct.: " + picture_struc[picture_structure]; + + if (profile_and_level_indication != 0) + mpg_info[13] += " / " + ((progressive_sequence==0) ? fieldorder[top_field_first] : "-"); + SequenceHeader=0; Update_Picture_Buffers(); picture_data(); @@ -1720,527 +1856,588 @@ } -/* decode one intra coded MPEG-2 block */ -public void Decode_MPEG2_Intra_Block(int comp, int dc_dct_pred[]) { + /* decode one intra coded MPEG-2 block */ + private void Decode_MPEG2_Intra_Block(int comp, int dc_dct_pred[]) + { + int val=0, i, j, sign, qmat[]; //qmat woanders?? + int code; + byte tab[]; + short bp[]; //bp woanders array? - int val=0, i, j, sign, qmat[]; //qmat woanders?? - int code; - byte tab[]; - short bp[]; //bp woanders array? - - bp = block[comp]; //macroblock - qmat = (comp<4 || chroma_format==CHROMA420) - ? intra_quantizer_matrix : chroma_intra_quantizer_matrix; - - /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */ - switch (cc_table[comp]) { - case 0: + bp = block[comp]; //macroblock + qmat = (comp<4 || chroma_format==CHROMA420) + ? intra_quantizer_matrix : chroma_intra_quantizer_matrix; + + /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */ + switch (cc_table[comp]) + { + case 0: val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff()); break; - case 1: - val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff()); - break; + case 1: + val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff()); + break; - case 2: - val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff()); - break; - } + case 2: + val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff()); + break; + } -//test -/** -System.out.println("comp " + comp + " /dc " + val); -if (quantizer_scale > 4) - val -= 128; -**/ - bp[0] = (short)(val << (3-intra_dc_precision)); //the top-left pixel value of block + //test + /** + System.out.println("comp " + comp + " /dc " + val); + if (quantizer_scale > 4) + val -= 128; + **/ + bp[0] = (short)(val << (3-intra_dc_precision)); //the top-left pixel value of block - /* decode AC coefficients */ - for (i=1; ; i++){ - code = Show_Bits(16); - - if (code>=16384 && intra_vlc_format<1) - tab = DCTtabnext[(code>>12)-4]; - else if (code>=1024){ - if (intra_vlc_format>0) - tab = DCTtab0a[(code>>8)-4]; - else - tab = DCTtab0[(code>>8)-4]; - } - else if (code>=512){ - if (intra_vlc_format>0) - tab = DCTtab1a[(code>>6)-8]; + /* decode AC coefficients */ + for (i=1; ; i++) + { + code = Show_Bits(16); + + if (code>=16384 && intra_vlc_format<1) + tab = DCTtabnext[(code>>12)-4]; + else if (code>=1024) + { + if (intra_vlc_format>0) + tab = DCTtab0a[(code>>8)-4]; + else + tab = DCTtab0[(code>>8)-4]; + } + else if (code>=512) + { + if (intra_vlc_format>0) + tab = DCTtab1a[(code>>6)-8]; + else + tab = DCTtab1[(code>>6)-8]; + } + else if (code>=256) + tab = DCTtab2[(code>>4)-16]; + else if (code>=128) + tab = DCTtab3[(code>>3)-16]; + else if (code>=64) + tab = DCTtab4[(code>>2)-16]; + else if (code>=32) + tab = DCTtab5[(code>>1)-16]; + else if (code>=16) + tab = DCTtab6[code-16]; else - tab = DCTtab1[(code>>6)-8]; - } - else if (code>=256) - tab = DCTtab2[(code>>4)-16]; - else if (code>=128) - tab = DCTtab3[(code>>3)-16]; - else if (code>=64) - tab = DCTtab4[(code>>2)-16]; - else if (code>=32) - tab = DCTtab5[(code>>1)-16]; - else if (code>=16) - tab = DCTtab6[code-16]; - else{ - Fault_Flag = 1; - return; - } + { + Fault_Flag = 1; + return; + } - Flush_Bits(tab[2]); + Flush_Bits(tab[2]); - if (tab[0]<64){ - i+= tab[0]; - val = tab[1]; - sign = Get_Bits(1); - } - else if (tab[0]==64) /* end_of_block */ - return; + if (tab[0]<64) + { + i+= tab[0]; + val = tab[1]; + sign = Get_Bits(1); + } + else if (tab[0]==64) /* end_of_block */ + return; - else{ /* escape */ - if (profile_and_level_indication==0){ - //mpeg1 //DM28112003 081.5++ - i+= Get_Bits(6); - val = Get_Bits(8); - if (val==0) + else + { /* escape */ + if (profile_and_level_indication==0) + { + //mpeg1 //DM28112003 081.5++ + i+= Get_Bits(6); val = Get_Bits(8); - else if(val==128) - val = Get_Bits(8)-128; - else if(val>128) - val-=256; - sign = 0; - }else{ - //mpeg2 - i+= Get_Bits(6); - val = Get_Bits(12); - if ( (sign = (val>=2048)?1:0) >0) - val = 4096 - val; + + if (val==0) + val = Get_Bits(8); + else if(val==128) + val = Get_Bits(8)-128; + else if(val>128) + val-=256; + sign = 0; + } + else + { + //mpeg2 + i+= Get_Bits(6); + val = Get_Bits(12); + + if ( (sign = (val>=2048)?1:0) >0) + val = 4096 - val; + } } - } - //prevent outside index - i = i > 63 ? 63 : i; + //prevent outside index + i = i > 63 ? 63 : i; - j = scan[alternate_scan][i]; + j = scan[alternate_scan][i]; - val = (val * quantizer_scale * qmat[j]) >> 4; - bp[j] = (short)((sign>0) ? -val : val); + val = (val * quantizer_scale * qmat[j]) >> 4; + bp[j] = (short)((sign>0) ? -val : val); + } } -} -/* decode one non-intra coded MPEG-2 block */ -public void Decode_MPEG2_Non_Intra_Block(int comp){ - int val, i, j, sign, qmat[]; - int code; - byte tab[]; - short bp[]; - - bp = block[comp]; - qmat = (comp<4 || chroma_format==CHROMA420) - ? non_intra_quantizer_matrix : chroma_non_intra_quantizer_matrix; - - /* decode AC coefficients */ - for (i=0; ; i++){ - code = Show_Bits(16); - - if (code>=16384){ - if (i==0) - tab = DCTtabfirst[(code>>12)-4]; - else - tab = DCTtabnext[(code>>12)-4]; - } - else if (code>=1024) - tab = DCTtab0[(code>>8)-4]; - else if (code>=512) - tab = DCTtab1[(code>>6)-8]; - else if (code>=256) - tab = DCTtab2[(code>>4)-16]; - else if (code>=128) - tab = DCTtab3[(code>>3)-16]; - else if (code>=64) - tab = DCTtab4[(code>>2)-16]; - else if (code>=32) - tab = DCTtab5[(code>>1)-16]; - else if (code>=16) - tab = DCTtab6[code-16]; - else{ - Fault_Flag = 1; - return; - } + /* decode one non-intra coded MPEG-2 block */ + private void Decode_MPEG2_Non_Intra_Block(int comp) + { + int val, i, j, sign, qmat[]; + int code; + byte tab[]; + short bp[]; - Flush_Bits(tab[2]); + bp = block[comp]; + qmat = (comp<4 || chroma_format==CHROMA420) + ? non_intra_quantizer_matrix : chroma_non_intra_quantizer_matrix; - if (tab[0]<64){ - i+= tab[0]; - val = tab[1]; - sign = Get_Bits(1); - } - else if (tab[0]==64) /* end_of_block */ - return; - else { /* escape */ - i+= Get_Bits(6); - val = Get_Bits(12); + /* decode AC coefficients */ + for (i=0; ; i++) + { + code = Show_Bits(16); - if ( (sign = (val>=2048)?1:0)>0 ) - val = 4096 - val; - } + if (code>=16384) + { + if (i==0) + tab = DCTtabfirst[(code>>12)-4]; + else + tab = DCTtabnext[(code>>12)-4]; + } + else if (code>=1024) + tab = DCTtab0[(code>>8)-4]; + else if (code>=512) + tab = DCTtab1[(code>>6)-8]; + else if (code>=256) + tab = DCTtab2[(code>>4)-16]; + else if (code>=128) + tab = DCTtab3[(code>>3)-16]; + else if (code>=64) + tab = DCTtab4[(code>>2)-16]; + else if (code>=32) + tab = DCTtab5[(code>>1)-16]; + else if (code>=16) + tab = DCTtab6[code-16]; + else + { + Fault_Flag = 1; + return; + } - j = scan[alternate_scan][i]; + Flush_Bits(tab[2]); - val = (((val<<1)+1) * quantizer_scale * qmat[j]) >> 5; - bp[j] = (short)((sign>0) ? -val : val); - } -} + if (tab[0]<64) + { + i+= tab[0]; + val = tab[1]; + sign = Get_Bits(1); + } + else if (tab[0]==64) /* end_of_block */ + return; + else + { /* escape */ + i+= Get_Bits(6); + val = Get_Bits(12); + if ( (sign = (val>=2048)?1:0)>0 ) + val = 4096 - val; + } -/* - parse VLC and perform dct_diff arithmetic. - MPEG-2: ISO/IEC 13818-2 section 7.2.1 + j = scan[alternate_scan][i]; - Note: the arithmetic here is presented more elegantly than - the spec, yet the results, dct_diff, are the same. -*/ -public int Get_Luma_DC_dct_diff(){ - int code, size, dct_diff; - - /* decode length */ - code = Show_Bits(5); - - if (code<31){ - size = DClumtab0[code][0]; - Flush_Bits(DClumtab0[code][1]); - }else{ - code = Show_Bits(9) - 0x1f0; - size = DClumtab1[code][0]; - Flush_Bits(DClumtab1[code][1]); + val = (((val<<1)+1) * quantizer_scale * qmat[j]) >> 5; + bp[j] = (short)((sign>0) ? -val : val); + } } - if (size==0) - dct_diff = 0; - else{ - dct_diff = Get_Bits(size); - if ((dct_diff & (1<<(size-1)))==0) - dct_diff-= (1<=128) { - code >>= 4; - Flush_Bits(CBPtab0[code][1]); + if ((dct_diff & (1<<(size-1)))==0) + dct_diff-= (1<=8) { - code >>= 1; - Flush_Bits(CBPtab1[code][1]); - return CBPtab1[code][0]; - } + private int Get_coded_block_pattern() + { + int code; - if (code<1) { - Fault_Flag = 3; - return 0; - } + if ((code = Show_Bits(9))>=128) + { + code >>= 4; + Flush_Bits(CBPtab0[code][1]); - Flush_Bits(CBPtab2[code][1]); + return CBPtab0[code][0]; + } - return CBPtab2[code][0]; -} + if (code>=8) + { + code >>= 1; + Flush_Bits(CBPtab1[code][1]); + return CBPtab1[code][0]; + } -/* return==-1 means go to next picture */ -/* the expression "start of slice" is used throughout the normative - body of the MPEG specification */ -public int start_of_slice(int MBA[], int MBAinc[], int dc_dct_pred[], int PMV[][][]){ + if (code<1) + { + Fault_Flag = 3; + return 0; + } - next_start_code(); - int code = Get_Bits(32); + Flush_Bits(CBPtab2[code][1]); - if (codeSLICE_START_CODE_MAX){ - // only slice headers are allowed in picture_data - Fault_Flag = 10; - return -1; + return CBPtab2[code][0]; } - /* decode slice header (may change quantizer_scale) */ - int slice_vert_pos_ext = slice_header(); - /* decode macroblock address increment */ - MBAinc[0] = Get_macroblock_address_increment(); + /* return==-1 means go to next picture */ + /* the expression "start of slice" is used throughout the normative + body of the MPEG specification */ + private int start_of_slice(int MBA[], int MBAinc[], int dc_dct_pred[], int PMV[][][]) + { - if (Fault_Flag>0) return -1; + next_start_code(); + int code = Get_Bits(32); - /* set current location */ - /* NOTE: the arithmetic used to derive macroblock_address below is - equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock */ - MBA[0] = ((slice_vert_pos_ext<<7) + (code&255) - 1) * mb_width + MBAinc[0] - 1; - MBAinc[0] = 1; // first macroblock in slice: not skipped + if (codeSLICE_START_CODE_MAX) + { + // only slice headers are allowed in picture_data + Fault_Flag = 10; + return -1; + } - /* reset all DC coefficient and motion vector predictors */ - /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */ - dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0; + /* decode slice header (may change quantizer_scale) */ + int slice_vert_pos_ext = slice_header(); + + /* decode macroblock address increment */ + MBAinc[0] = Get_macroblock_address_increment(); + + if (Fault_Flag>0) + return -1; + + /* set current location */ + /* NOTE: the arithmetic used to derive macroblock_address below is + equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock */ + MBA[0] = ((slice_vert_pos_ext<<7) + (code&255) - 1) * mb_width + MBAinc[0] - 1; + MBAinc[0] = 1; // first macroblock in slice: not skipped + + /* reset all DC coefficient and motion vector predictors */ + /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */ + dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0; - /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */ - PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0; - PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0; + /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */ + PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0; + PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0; - /* successfull: trigger decode macroblocks in slice */ - return 1; -} + /* successfull: trigger decode macroblocks in slice */ + return 1; + } -public int Get_macroblock_address_increment(){ - int code=0, val=0; + private int Get_macroblock_address_increment() + { + int code=0, val=0; - while ((code = Show_Bits(11))<24){ - if (code!=15){ /* if not macroblock_stuffing */ - if (code==8) /* if macroblock_escape */ - val+= 33; - else{ - Fault_Flag = 4; - return 1; + while ((code = Show_Bits(11))<24) + { + if (code!=15) + { /* if not macroblock_stuffing */ + if (code==8) /* if macroblock_escape */ + val+= 33; + else + { + Fault_Flag = 4; + return 1; + } } + Flush_Bits(11); } - Flush_Bits(11); - } - /* macroblock_address_increment == 1 */ - /* ('1' is in the MSB position of the lookahead) */ - if (code>=1024) { - Flush_Bits(1); - return (val + 1); - } + /* macroblock_address_increment == 1 */ + /* ('1' is in the MSB position of the lookahead) */ + if (code>=1024) + { + Flush_Bits(1); + return (val + 1); + } - /* codes 00010 ... 011xx */ - if (code>=128) { - /* remove leading zeros */ - code >>= 6; - Flush_Bits(MBAtab1[code][1]); + /* codes 00010 ... 011xx */ + if (code>=128) + { + /* remove leading zeros */ + code >>= 6; + Flush_Bits(MBAtab1[code][1]); - return (val + MBAtab1[code][0]); - } + return (val + MBAtab1[code][0]); + } - /* codes 00000011000 ... 0000111xxxx */ - code-= 24; /* remove common base */ - Flush_Bits(MBAtab2[code][1]); + /* codes 00000011000 ... 0000111xxxx */ + code-= 24; /* remove common base */ + Flush_Bits(MBAtab2[code][1]); - return (val + MBAtab2[code][0]); -} + return (val + MBAtab2[code][0]); + } -/* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */ -public void motion_vectors(int PMV[][][],int dmvector[], + /* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */ + private void motion_vectors(int PMV[][][],int dmvector[], int motion_vertical_field_select[][], int s, int motion_vector_count[], int mv_format[], int h_r_size, - int v_r_size, int dmv[], int mvscale[]){ + int v_r_size, int dmv[], int mvscale[]) + { - if (motion_vector_count[0]==1) { - if (mv_format[0]==MV_FIELD && dmv[0]<1) - motion_vertical_field_select[1][s] = + if (motion_vector_count[0]==1) + { + if (mv_format[0]==MV_FIELD && dmv[0]<1) + motion_vertical_field_select[1][s] = + motion_vertical_field_select[0][s] = Get_Bits(1); + + motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0); + + /* update other motion vector predictors */ + PMV[1][s][0] = PMV[0][s][0]; + PMV[1][s][1] = PMV[0][s][1]; + } + else + { motion_vertical_field_select[0][s] = Get_Bits(1); - - motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0); - - /* update other motion vector predictors */ - PMV[1][s][0] = PMV[0][s][0]; - PMV[1][s][1] = PMV[0][s][1]; - }else{ - motion_vertical_field_select[0][s] = Get_Bits(1); - motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0); - motion_vertical_field_select[1][s] = Get_Bits(1); - motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0); + motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0); + motion_vertical_field_select[1][s] = Get_Bits(1); + motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0); + } } -} -/* get and decode motion vector and differential motion vector for one prediction */ -public void motion_vector(int PMV[], int dmvector[], int h_r_size, int v_r_size, - int dmv[], int mvscale[], int full_pel_vector){ + /* get and decode motion vector and differential motion vector for one prediction */ + private void motion_vector(int PMV[], int dmvector[], int h_r_size, int v_r_size, + int dmv[], int mvscale[], int full_pel_vector) + { - int motion_code, motion_residual; + int motion_code, motion_residual; - /* horizontal component */ - /* ISO/IEC 13818-2 Table B-10 */ - motion_code = Get_motion_code(); + /* horizontal component */ + /* ISO/IEC 13818-2 Table B-10 */ + motion_code = Get_motion_code(); - motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0; + motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0; + decode_motion_vector(PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector); + if (dmv[0]>0) + dmvector[0] = Get_dmvector(); - decode_motion_vector(PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector); + /* vertical component */ + motion_code = Get_motion_code(); + motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0; - if (dmv[0]>0) - dmvector[0] = Get_dmvector(); + if (mvscale[0]>0) + PMV[1] >>= 1; /* DIV 2 */ - /* vertical component */ - motion_code = Get_motion_code(); - motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0; + decode_motion_vector(PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector); - if (mvscale[0]>0) - PMV[1] >>= 1; /* DIV 2 */ + if (mvscale[0]>0) + PMV[1] <<= 1; - decode_motion_vector(PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector); + if (dmv[0]>0) + dmvector[1] = Get_dmvector(); + } - if (mvscale[0]>0) - PMV[1] <<= 1; + /* calculate motion vector component */ + /* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */ + /* Note: the arithmetic here is more elegant than that which is shown + in 7.6.3.1. The end results (PMV[][][]) should, however, be the same. */ + private void decode_motion_vector(int pred, int r_size, int motion_code, + int motion_residual, int full_pel_vector) + { - if (dmv[0]>0) - dmvector[1] = Get_dmvector(); -} + int lim, vec; -/* calculate motion vector component */ -/* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */ -/* Note: the arithmetic here is more elegant than that which is shown - in 7.6.3.1. The end results (PMV[][][]) should, however, be the same. */ -public void decode_motion_vector(int pred, int r_size, int motion_code, - int motion_residual, int full_pel_vector){ - - int lim, vec; - - lim = 16<0) ? (pred >> 1) : (pred); - - if (motion_code>0){ - vec+= ((motion_code-1)<=lim) - vec-= lim + lim; - }else if (motion_code<0){ - vec-= ((-motion_code-1)<0) ? (pred >> 1) : (pred); - pred = (full_pel_vector>0) ? (vec<<1) : vec; -} + if (motion_code>0) + { + vec+= ((motion_code-1)<=lim) + vec-= lim + lim; + } + else if (motion_code<0) + { + vec-= ((-motion_code-1)<0){ - /* vector for prediction of top field from bottom field */ - DMV[0][0] = ((mvx +((mvx>0)?1:0))>>1) + dmvector[0]; - DMV[0][1] = ((mvy +((mvy>0)?1:0))>>1) + dmvector[1] - 1; - - /* vector for prediction of bottom field from top field */ - DMV[1][0] = ((3*mvx+((mvx>0)?1:0))>>1) + dmvector[0]; - DMV[1][1] = ((3*mvy+((mvy>0)?1:0))>>1) + dmvector[1] + 1; - }else{ - /* vector for prediction of top field from bottom field */ - DMV[0][0] = ((3*mvx+((mvx>0)?1:0))>>1) + dmvector[0]; - DMV[0][1] = ((3*mvy+((mvy>0)?1:0))>>1) + dmvector[1] - 1; - - /* vector for prediction of bottom field from top field */ - DMV[1][0] = ((mvx +((mvx>0)?1:0))>>1) + dmvector[0]; - DMV[1][1] = ((mvy +((mvy>0)?1:0))>>1) + dmvector[1] + 1; - } - }else{ - /* vector for prediction from field of opposite 'parity' */ - DMV[0][0] = ((mvx+((mvx>0)?1:0))>>1) + dmvector[0]; - DMV[0][1] = ((mvy+((mvy>0)?1:0))>>1) + dmvector[1]; - - /* correct for vertical field shift */ - if (picture_structure==TOP_FIELD) - DMV[0][1]--; + if (vec<-lim) + vec+= lim + lim; + } + pred = (full_pel_vector>0) ? (vec<<1) : vec; + } + /* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */ + private void Dual_Prime_Arithmetic(int DMV[][],int dmvector[], int mvx,int mvy) + { + if (picture_structure==FRAME_PICTURE) + { + if (top_field_first>0) + { + /* vector for prediction of top field from bottom field */ + DMV[0][0] = ((mvx +((mvx>0)?1:0))>>1) + dmvector[0]; + DMV[0][1] = ((mvy +((mvy>0)?1:0))>>1) + dmvector[1] - 1; + + /* vector for prediction of bottom field from top field */ + DMV[1][0] = ((3*mvx+((mvx>0)?1:0))>>1) + dmvector[0]; + DMV[1][1] = ((3*mvy+((mvy>0)?1:0))>>1) + dmvector[1] + 1; + } + else + { + /* vector for prediction of top field from bottom field */ + DMV[0][0] = ((3*mvx+((mvx>0)?1:0))>>1) + dmvector[0]; + DMV[0][1] = ((3*mvy+((mvy>0)?1:0))>>1) + dmvector[1] - 1; + + /* vector for prediction of bottom field from top field */ + DMV[1][0] = ((mvx +((mvx>0)?1:0))>>1) + dmvector[0]; + DMV[1][1] = ((mvy +((mvy>0)?1:0))>>1) + dmvector[1] + 1; + } + } else - DMV[0][1]++; + { + /* vector for prediction from field of opposite 'parity' */ + DMV[0][0] = ((mvx+((mvx>0)?1:0))>>1) + dmvector[0]; + DMV[0][1] = ((mvy+((mvy>0)?1:0))>>1) + dmvector[1]; + + /* correct for vertical field shift */ + if (picture_structure==TOP_FIELD) + DMV[0][1]--; + + else + DMV[0][1]++; + } } -} -/* ISO/IEC 13818-2 section 7.6 */ -public void motion_compensation(int MBA[], int macroblock_type[], int motion_type[], + /* ISO/IEC 13818-2 section 7.6 */ + private void motion_compensation(int MBA[], int macroblock_type[], int motion_type[], int PMV[][][], int motion_vertical_field_select[][], - int dmvector[], int dct_type[]){ + int dmvector[], int dct_type[]) + { - int bx, by; - int comp; + int bx, by; + int comp; - /* derive current macroblock position within picture */ - /* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */ - bx = 16*(MBA[0]%mb_width); - by = 16*(MBA[0]/mb_width); + /* derive current macroblock position within picture */ + /* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */ + bx = (MBA[0] % mb_width)<<4; + by = (MBA[0] / mb_width)<<4; - /* motion compensation */ - //if ((macroblock_type[0] & MACROBLOCK_INTRA)<1) - //form_predictions(bx, by, macroblock_type, motion_type, PMV, motion_vertical_field_select, dmvector); + /* motion compensation */ + //if ((macroblock_type[0] & MACROBLOCK_INTRA)<1) + //form_predictions(bx, by, macroblock_type, motion_type, PMV, motion_vertical_field_select, dmvector); - if (IDCTSseNative.isLibraryLoaded()) - { - /* copy or add block data into picture */ - for (comp=0; comp0){ - rfp = current_frame[0] + Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3); + /* move/add 8x8-Block from block[comp] to backward_reference_frame */ + /* copy reconstructed 8x8 block from block[comp] to current_frame[] + ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data + This stage also embodies some of the operations implied by: + - ISO/IEC 13818-2 section 7.6.7: Combining predictions + - ISO/IEC 13818-2 section 6.1.3: Macroblock + */ + //DM02092003+ changed + //DM08022004 081.6 int16 changed to float + private void Add_Block(int comp, int bx, int by, int dct_type[], boolean addflag) + { + int cc, iincr; + int rfp; + short Block_Ptr[] = block[comp]; + + /* derive color component index */ + /* equivalent to ISO/IEC 13818-2 Table 7-1 */ + cc = cc_table[comp]; + + + if (cc == 0) + { + if (picture_structure == FRAME_PICTURE) + { //progressive + if (dct_type[0] > 0) + { + rfp = current_frame[0] + Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3); + iincr = (Coded_Picture_Width<<1) - 8; + } + else + { + rfp = current_frame[0] + Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3); + iincr = Coded_Picture_Width - 8; + } + } + else + { + rfp = current_frame[0] + (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3); iincr = (Coded_Picture_Width<<1) - 8; - }else{ - rfp = current_frame[0] + Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3); - iincr = Coded_Picture_Width - 8; } - }else{ - rfp = current_frame[0] + (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3); - iincr = (Coded_Picture_Width<<1) - 8; } - }else{ - // chrominance - // scale coordinates - if (chroma_format!=CHROMA444) bx >>= 1; - //if (chroma_format==CHROMA420) by >>= 1; // disabled - - if (picture_structure==FRAME_PICTURE){ //two fields in one pic=std - if (dct_type[0]>0 && chroma_format!=CHROMA420){ - // field DCT coding - rfp = current_frame[cc] + Chroma_Width*(by+((comp&2)>>1)) + bx + (comp&8); + else + { + // chrominance + // scale coordinates + if (chroma_format != CHROMA444) + bx >>= 1; + //if (chroma_format==CHROMA420) by >>= 1; // disabled + + if (picture_structure == FRAME_PICTURE) + { //two fields in one pic=std + if (dct_type[0] > 0 && chroma_format != CHROMA420) + { + // field DCT coding + rfp = current_frame[cc] + Chroma_Width*(by+((comp&2)>>1)) + bx + (comp&8); + iincr = (Chroma_Width<<1) - 8; + } + else + { + // frame DCT coding + rfp = current_frame[cc] + Chroma_Width*(by+((comp&2)<<2)) + bx + (comp&8); + iincr = Chroma_Width - 8; + } + } + else + { + // field picture, one field in one pic + rfp = current_frame[cc] + (Chroma_Width<<1)*(by+((comp&2)<<2)) + bx + (comp&8); iincr = (Chroma_Width<<1) - 8; - }else{ - // frame DCT coding - rfp = current_frame[cc] + Chroma_Width*(by+((comp&2)<<2)) + bx + (comp&8); - iincr = Chroma_Width - 8; } - }else{ - // field picture, one field in one pic - rfp = current_frame[cc] + (Chroma_Width<<1)*(by+((comp&2)<<2)) + bx + (comp&8); - iincr = (Chroma_Width<<1) - 8; } - } - iincr += 8; - //DM02092003+ - int val, luma, pPos, r, g, b; + iincr += 8; - //DM20082004 081.7 int10 changed - if (cc == 0) //lumi - { - for (int y = 0; y < 8; y++) - { - for (int x = 0; x < 8; x++) + //DM02092003+ + int val, luma, pPos, r, g, b; + int gain = picture_coding_type == I_TYPE ? 128 : 0; + + gain += YGain; + + int chroma_value_444 = chroma_format == CHROMA444 ? 1 : 0; + int chroma_value_420 = chroma_format != CHROMA420 ? 1 : 0; + int cc_value = cc == 1 ? 8 : 0; + int x, y; + int tmp1, tmp2, tmp3; + + //DM20082004 081.7 int10 changed + if (cc == 0) //lumi + { + // for (y = 0; y < 8; y++) + for (y = 8; --y >= 0; ) { - pPos = rfp + x + (y * iincr); - val = Block_Ptr[x + (y * 8)] + ((picture_coding_type == I_TYPE) ? 128 : 0); - val = val < 0 ? 0 : (val > 255 ? 255 : val); + tmp1 = rfp + (y * iincr); + tmp2 = y<<3; - pixels[pPos] |= val<<16; //Y + // for (x = 0; x < 8; x++) + for (x = 8; --x >= 0; ) + { + pPos = x + tmp1; + val = Block_Ptr[x + tmp2] + gain; + val = val < 0 ? 0 : (val > 255 ? 255 : val); + + pixels[pPos] |= val<<16; //Y + } } } - } - else - { //chroma cc1 = Cb, cc2=Cr - if (chroma_format != CHROMA444) - { - rfp <<= 1; - iincr <<= 1; - } + else + { //chroma cc1 = Cb, cc2=Cr + if (chroma_format != CHROMA444) + { + rfp <<= 1; + iincr <<= 1; + } - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) + for (y = 0; y < 16; y++) { - pPos = rfp + (x >>(chroma_format == CHROMA444 ? 1 : 0)) + ((y >>(chroma_format != CHROMA420 ? 1 : 0)) * iincr); - val = 128 + Block_Ptr[(x >>1) + (8 * (chroma_format != CHROMA420 ? (y >>1) : ((y & 1) == 0 ? ((y >>1) & ~dct_type[0]) : ((y >>1) | dct_type[0]))))]; - val = val < 0 ? 0 : (val > 255 ? 255 : val); + tmp1 = rfp + (y >>(chroma_value_420)) * iincr; + tmp3 = y >>1; + tmp2 = (chroma_format != CHROMA420 ? tmp3 : ((y & 1) == 0 ? (tmp3 & ~dct_type[0]) : (tmp3 | dct_type[0])))<<3; - if (cc == 1) //U - pixels[pPos] |= val<<8; + for (x = 0; x < 16; x++) + { + pPos = (x >> chroma_value_444) + tmp1; + val = 128 + Block_Ptr[(x >>1) + tmp2]; + val = val < 0 ? 0 : (val > 255 ? 255 : val); - else //V - pixels[pPos] |= val; + // cc==1 -> U else V + pixels[pPos] |= val << cc_value; - if (chroma_format == CHROMA444) - x++; - } + x += chroma_value_444; + } - if (chroma_format != CHROMA420) - y++; + y += chroma_value_420; + } } } -} -//DM02092003- + //DM02092003- -/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */ -public void macroblock_modes(int pmacroblock_type[], int pmotion_type[], + /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */ + private void macroblock_modes(int pmacroblock_type[], int pmotion_type[], int pmotion_vector_count[], int pmv_format[], - int pdmv[], int pmvscale[], int pdct_type[]){ + int pdmv[], int pmvscale[], int pdct_type[]) + { - int macroblock_type, motion_type=0, motion_vector_count; - int mv_format, dmv, mvscale, dct_type; + int macroblock_type, motion_type=0, motion_vector_count; + int mv_format, dmv, mvscale, dct_type; - /* get macroblock_type */ - macroblock_type = Get_macroblock_type(); + /* get macroblock_type */ + macroblock_type = Get_macroblock_type(); - if (Fault_Flag>0) return; + if (Fault_Flag > 0) + return; - /* get frame/field motion type */ - if ((macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))>0) { - if (picture_structure==FRAME_PICTURE) - motion_type = (frame_pred_frame_dct>0) ? MC_FRAME : Get_Bits(2); + /* get frame/field motion type */ + if ((macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD)) > 0) + { + if (picture_structure==FRAME_PICTURE) + motion_type = (frame_pred_frame_dct>0) ? MC_FRAME : Get_Bits(2); + else + motion_type = Get_Bits(2); + } + else if ((macroblock_type & MACROBLOCK_INTRA) > 0 && concealment_motion_vectors > 0) + motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD; + + /* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */ + if (picture_structure == FRAME_PICTURE) + { + motion_vector_count = (motion_type == MC_FIELD) ? 2 : 1; + mv_format = (motion_type == MC_FRAME) ? MV_FRAME : MV_FIELD; + } else - motion_type = Get_Bits(2); - }else if ((macroblock_type & MACROBLOCK_INTRA)>0 && concealment_motion_vectors>0) - motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD; - - /* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */ - if (picture_structure==FRAME_PICTURE){ - motion_vector_count = (motion_type==MC_FIELD) ? 2 : 1; - mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD; - }else{ - motion_vector_count = (motion_type==MC_16X8) ? 2 : 1; - mv_format = MV_FIELD; - } + { + motion_vector_count = (motion_type == MC_16X8) ? 2 : 1; + mv_format = MV_FIELD; + } - dmv = (motion_type==MC_DMV)?1:0; /* dual prime */ - - /* - field mv predictions in frame pictures have to be scaled - ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors - */ - mvscale = ((mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE)) ?1:0; + dmv = (motion_type == MC_DMV) ? 1 : 0; /* dual prime */ - /* get dct_type (frame DCT / field DCT) */ - dct_type = (picture_structure==FRAME_PICTURE) && (frame_pred_frame_dct<1) - && ((macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA))>0 ) + /* + field mv predictions in frame pictures have to be scaled + ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors + */ + mvscale = ((mv_format==MV_FIELD) && (picture_structure == FRAME_PICTURE)) ? 1 : 0; + + /* get dct_type (frame DCT / field DCT) */ + dct_type = (picture_structure == FRAME_PICTURE) && (frame_pred_frame_dct < 1) + && ((macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)) > 0 ) ? Get_Bits(1) : 0; - /* return values */ - pmacroblock_type[0] = macroblock_type; - pmotion_type[0] = motion_type; - pmotion_vector_count[0] = motion_vector_count; - pmv_format[0] = mv_format; - pdmv[0] = dmv; - pmvscale[0] = mvscale; - pdct_type[0] = dct_type; -} + /* return values */ + pmacroblock_type[0] = macroblock_type; + pmotion_type[0] = motion_type; + pmotion_vector_count[0] = motion_vector_count; + pmv_format[0] = mv_format; + pdmv[0] = dmv; + pmvscale[0] = mvscale; + pdct_type[0] = dct_type; + } private int Get_macroblock_type() @@ -2684,30 +2933,101 @@ return (T<<24 | R<<16 | G<<8 | B); } - /** * scales source picture to 2nd picture of memoryimagesource * includes YUV to RGB conversion */ private void scale_Picture() { + scale_Picture(0); + } + + /** + * scales source picture to 2nd picture of memoryimagesource + * includes YUV to RGB conversion + */ + private void scale_Picture(int silent) + { Arrays.fill(pixels2, 0xFF505050); - int x_offset = ((aspect_ratio_information == 3 || aspect_ratio_information == 4) && profile_and_level_indication != 0) ? 0 : 64; - int scanline = 512; - int ny = 288; - int nx = x_offset == 0 ? scanline : scanline - x_offset; - - float Y = 0, X = 0; - float Ydecimate = vertical_size / (float)ny; - float Xdecimate = horizontal_size / (float)(nx - x_offset); + int x_offset = getMpg2AspectRatioOffset(); + + if (x_offset > 0 && preview_horizontal_size != 512) + x_offset = (int)((preview_horizontal_size - Math.round(preview_vertical_size * 1.33333)) / 2.0); + + int z_horizontal_size = horizontal_size; + int z_vertical_size = vertical_size; + int new_x = zoomArea[0]; + + float Y = 0, X = 0, X_Off = 0; + + switch (zoomMode) + { + case 1: + if (x_offset > 0) //LB zoom 4:3 + { + x_offset = 0; + z_vertical_size = vertical_size - (vertical_size>>>2); + Y += vertical_size>>>3; + } + + break; + + case 2: + if (x_offset == 0) //zoom anamorphics + { + X_Off = (new_x * horizontal_size) / preview_horizontal_size; + X += X_Off; + Y += (zoomArea[1] * vertical_size) / preview_vertical_size; + z_horizontal_size = (zoomArea[2] * horizontal_size) / preview_horizontal_size; + z_vertical_size = (zoomArea[3] * vertical_size) / preview_vertical_size; + } + + else //zoom 4:3 + { + if (new_x < x_offset) + new_x = x_offset = 0; + + else + new_x -= x_offset; + + X_Off = (int) ((new_x * horizontal_size) / (preview_vertical_size * 1.33333)); + X += X_Off; + Y += (zoomArea[1] * vertical_size) / preview_vertical_size; + + z_horizontal_size = (int) ((zoomArea[2] * horizontal_size) / (preview_vertical_size * 1.33333)); + z_vertical_size = (zoomArea[3] * vertical_size) / preview_vertical_size; + + x_offset = 0; + } + } + + int nx = preview_horizontal_size - x_offset; + + float Xdecimate = z_horizontal_size / (float) (nx - x_offset); + float Ydecimate = z_vertical_size / (float) preview_vertical_size; + + //~50ms + for (int y = 0, tmp1, tmp2; Coded_Picture_Width >= 0 && Y < vertical_size && y < preview_vertical_size; Y += Ydecimate, y++, X = X_Off) + { + tmp1 = y * preview_horizontal_size; + tmp2 = (int)Y * Coded_Picture_Width; - for (int y = 0; Y < vertical_size && y < ny; Y += Ydecimate, y++, X=0) for (int x = x_offset; X < horizontal_size && x < nx; X += Xdecimate, x++) - pixels2[x + (y * scanline)] = YUVtoRGB(pixels[(int)X + ((int)Y * Coded_Picture_Width)]); + pixels2[x + tmp1] = YUVtoRGB(pixels[(int)X + tmp2]); + } + + //file props preview + if (silent == 1) + return; + if (silent == 2) + { + Common.getGuiInterface().updatePreviewPixel(); + return; + } - //source.newPixels(); + //~100ms Common.getGuiInterface().updatePreviewPixel(); messageStreamInfo(); @@ -2737,6 +3057,19 @@ prof[7 & profile_and_level_indication>>>4] + "@" + lev[15 & profile_and_level_indication]); info_1 += "(" + Coded_Picture_Width + "*" + Coded_Picture_Height + ") "; info_1 += info_4; + + mpg_info[1] = horizontal_size + " * " + vertical_size + prog[progressive_sequence]; + mpg_info[1] += " @ " + String.valueOf((Math.round(frame_rate * 1000) / 1000.0f)) + " fps "; + mpg_info[3] = "DAR(PAR): " + aspect_ratio_string[aspect_ratio_information]; + mpg_info[0] = (profile_and_level_indication == 0 ? "MPEG-1" : "MPEG-2 " + prof[7 & profile_and_level_indication>>>4] + "@" + lev[15 & profile_and_level_indication]) + " " + (1 & profile_and_level_indication>>>7); + + if (profile_and_level_indication != 0) + mpg_info[0] += info_4; + + mpg_info[5] = "SDE: " + video_format_S[video_format]; + mpg_info[5] += info_3; + mpg_info[11] = "Pic.Type: " + picture_coding_type_string[picture_coding_type] + "-" + progressive_string[progressive_frame] + " t.Ref.: " + temporal_reference; + mpg_info[14] = "encod.Pixel: " + Coded_Picture_Width + " * " + Coded_Picture_Height; } /** @@ -2758,10 +3091,30 @@ /** * */ + public void setPreviewSize(int w, int h) + { + preview_horizontal_size = w; + preview_vertical_size = h; + + if (pixels2.length != preview_horizontal_size * preview_vertical_size) + pixels2 = new int[preview_horizontal_size * preview_vertical_size]; + else + Arrays.fill(pixels2, 0); + + scale_Picture(2); + } + + /** + * + */ public void clearPreviewPixel() { info_1 = ""; info_2 = ""; + info_3 = ""; + info_4 = ""; + + Arrays.fill(mpg_info, ""); Arrays.fill(pixels2, 0xFF505050); @@ -2797,6 +3150,16 @@ /** * */ + public int getMpg2AspectRatioOffset() + { + int value = ((getAspectRatio() == 3 || getAspectRatio() == 4) && profile_and_level_indication != 0) ? 0 : 64; + + return value; + } + + /** + * + */ public String getInfo_1() { return info_1; @@ -2813,6 +3176,102 @@ /** * */ + public String[] getMpgInfo() + { + return mpg_info; + } + + /** + * + */ + public void resetProcessedPosition() + { + PositionList.clear(); + } + + /** + * + */ + public void setProcessedPosition(long value, List previewList) + { + resetProcessedPosition(); + + PositionList.add(new Long(value)); + + for (int i = 0, j = previewList.size(); i < j; i++) + PositionList.add(new Long(((PreviewObject) previewList.get(i)).getEnd())); + } + + /** + * + */ + public List getPositions() + { + return PositionList; + } + + /** + * + */ + public void setPidAndFileInfo(String str) + { + processedPidAndFile = str; + } + + /** + * + */ + public String getPidAndFileInfo() + { + return processedPidAndFile; + } + + /** + * + */ + public int getZoomMode() + { + return zoomMode; + } + + /** + * + */ + public void setZoomMode(int value) + { + zoomMode = value; + + if (info_2.length() > 0) + scale_Picture(); + } + + /** + * + */ + public void setZoomMode(int[] values) + { + System.arraycopy(values, 0, zoomArea, 0, zoomArea.length); + + setZoomMode(2); + } + + /** + * + */ + public String getZoomInfo() + { + if (zoomMode == 1 && getAspectRatio() != 3 && getAspectRatio() != 4) + return "LB Zoom"; + + else if (zoomMode == 2) + return ("Manual Zoom: x" + zoomArea[0] + ", y" + zoomArea[1] + " - " + zoomArea[2] + "*" + zoomArea[3]); + + return ""; + } + + /** + * + */ public String getWSSInfo() { return WSS.getWSS(); @@ -2839,7 +3298,7 @@ */ public int getErrors() { - return (0 | (ERROR1 ? 1 : 0) | (ERROR2 ? 2 : 0) | (ERROR3 ? 4 : 0)); + return (0 | (ERROR1 ? 1 : 0) | (ERROR2 ? 2 : 0) | (ERROR3 ? 4 : 0) | (ERROR4 ? 8 : 0) | (ERROR5 ? 0x10 : 0) | (ERROR6 ? 0x20 : 0)); } /** @@ -2855,10 +3314,22 @@ */ public int[] getCutImage() { - int new_height = 126; - int new_width = 224; - int source_height = 288; - int source_width = 512; + int[] cut_image = new int[pixels2.length]; + + System.arraycopy(pixels2, 0, cut_image, 0, pixels2.length); + + return cut_image; + } + + /** + * create new smaller cutimage pixel data + */ + public int[] getScaledCutImage() + { + int new_width = cutview_horizontal_size; + int new_height = cutview_vertical_size; + int source_width = preview_horizontal_size; + int source_height = preview_vertical_size; float Y = 0; float X = 0; @@ -2874,6 +3345,29 @@ return cut_image; } + + /** + * add new smaller matrix cutimage pixel data + * the mixed overlay image will be partialy overridden, in a 5x5 matrix of 100*56 each (in 512*288) + */ + public void getScaledCutMatrixImage(int[] matrix_image, int new_width, int new_height, int matrix_x, int matrix_y) + { + int source_width = preview_horizontal_size; + int source_height = preview_vertical_size; + + float Y = 0; + float X = 0; + float decimate_height = (float)source_height / new_height; + float decimate_width = (float)source_width / new_width; + + int[] cut_image = new int[new_width * new_height]; + + for (int y = 0; Y < source_height && y < new_height; Y += decimate_height, y++, X = 0) + for (int x = 0; X < source_width && x < new_width; X += decimate_width, x++) + matrix_image[(matrix_x + x) + ((matrix_y + y) * source_width)] = pixels2[(int)X + ((int)Y * source_width)]; + // matrix_image[x + (y * new_width)] = pixels2[(int)X + ((int)Y * source_width)]; + } + /** * returns arrays byteposition offset of 1st successful decoded GOP * interface, entry point to decode picture for preview @@ -2884,9 +3378,24 @@ * @param4 - simple_fast decode * @return */ - public long decodeArray(byte array[], boolean direction, boolean _viewGOP, boolean fast) + public long decodeArray(byte array[], boolean direction, boolean _viewGOP, boolean fast, int yGain) { - return decodeArray(array, 0, direction, _viewGOP, fast); + return decodeArray(array, 0, direction, _viewGOP, fast, yGain, false); + } + + /** + * returns arrays byteposition offset of 1st successful decoded GOP + * interface, entry point to decode picture for preview + * + * @param1 - ES byte array + * @param2 - search direction + * @param3 - enable GOPheader alignment + * @param4 - simple_fast decode + * @return + */ + public long decodeArray(byte array[], boolean direction, boolean _viewGOP, boolean fast, int yGain, boolean silent) + { + return decodeArray(array, 0, direction, _viewGOP, fast, yGain, silent); } /** @@ -2900,14 +3409,21 @@ * @param5 - simple_fast decode * @return */ - public long decodeArray(byte array[], int start_position, boolean direction, boolean _viewGOP, boolean fast) + public long decodeArray(byte[] array, int start_position, boolean direction, boolean _viewGOP, boolean fast, int yGain, boolean silent) { + setAcceleration(Common.getSettings().getBooleanProperty(Keys.KEY_Preview_fastDecode)); + FAST = fast; DIRECTION = direction; + YGain = yGain; ERROR1 = false; ERROR2 = false; ERROR3 = false; + ERROR4 = false; + ERROR5 = false; + ERROR6 = false; + Arrays.fill(LastPosVal, -1); buf = array; BufferPos = start_position; @@ -2934,18 +3450,15 @@ BufferPos += 2048; continue; } - InitialDecoder(); Decode_Picture(); - scale_Picture(); - repaint(); + scale_Picture(silent ? 1 : 0); return StartPos; } else if (ERROR_CODE1 == 2 ) { - repaint(); return 0; } @@ -2960,13 +3473,444 @@ } catch (Error ee) { ERROR1 = true; + ERROR6 = ee.toString().indexOf("OutOfMemory") > 0; } - scale_Picture(); + if (ERROR1 && !ERROR6) + if (parseH264(buf, buf.length, mpg_info)) + ERROR4 = true; + +//H264Decoder h264 = new H264Decoder(); +//ERROR4 = h264.parseStream(buf, start_position); +//H264Decoder1 h264 = new H264Decoder1(); +//ERROR4 = h264.parseStream(buf, start_position); - repaint(); + scale_Picture(ERROR4 ? 2 : 1); return 0; } +//// + + /** + * short analysis of H.264 + */ + public boolean parseH264(byte[] array, int length, String[] h264_info) + { + byte[] check = new byte[100]; + boolean run_in = false; + boolean sequ_found = false; + int[] temp_values = new int[12]; + + int[] BitPosition = { 0 }; + + for (int i = 0, flag, nal_unit, nal_ref, profile_idc, zero, level_idc, hori, vert, j = length - 50; i < j; i++) + { + if (array[i] != 0 || array[1 + i] != 0 || array[2 + i] != 0 || array[3 + i] != 1) + continue; + + BitPosition[0] = (4 + i)<<3; + + zero = getBits(array, BitPosition, 1); //forb_zero = 0x80 & check[4 + i]; + nal_ref = getBits(array, BitPosition, 2); //nal_ref = (0xE0 & check[4 + i])>>>5; + nal_unit = getBits(array, BitPosition, 5); //nal_unit = 0x1F & check[4 + i]; + + if (zero == 0 && nal_unit == 9) //run-in + { + run_in = true; + continue; + } + + if (!run_in || zero != 0) + continue; + + if (sequ_found && (nal_unit == 1 || nal_unit == 5)) + return slice_wo_partitioning(array, i, nal_unit, temp_values); + + else if (nal_unit != 7) + continue; + + //emulation prevention + for (int m = i + 5, rbsp = 0; rbsp < 100 - 3; m++) + { + if (array[m] == 0 && array[m + 1] == 0 && array[m + 2] == 3) + { + rbsp += 2; //2 bytes value 0 + m += 2; //emulation_prevention_three_byte /* equal to 0x03 */ + } + else + check[rbsp++] = array[m]; + } + + //reset for check + BitPosition[0] = 0; + + //seq_param + profile_idc = getBits(check, BitPosition, 8); //profile = 0xFF & check[5 + i]; + getBits(check, BitPosition, 4); //constraint 0,1,2,3 + zero = getBits(check, BitPosition, 4); //4 res zero_bits + + if (zero != 0) + continue; + + sequ_found = true; + + level_idc = getBits(check, BitPosition, 8); //0xFF & check[7 + i]; + flag = getCodeNum(check, BitPosition); // seq_parameter_set_id 0 ue(v) + + int chroma_format_idc = 1; //dflt + + if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 44 || profile_idc == 244) + { + chroma_format_idc = getCodeNum(check, BitPosition); //chroma_format_idc 0 ue(v) + + if (chroma_format_idc == 3) + getBits(check, BitPosition, 1); //separate_colour_plane_flag 0 u(1) + + getCodeNum(check, BitPosition); //bit_depth_luma_minus8 0 ue(v) + getCodeNum(check, BitPosition); //bit_depth_chroma_minus8 0 ue(v) + + getBits(check, BitPosition, 1); //qpprime_y_zero_transform_bypass_flag 0 u(1) + flag = getBits(check, BitPosition, 1); //seq_scaling_matrix_present_flag 0 u(1) + + if (flag == 1) + { + for (int l = 0; l < ((chroma_format_idc != 3) ? 8 : 12); l++) + { + flag = getBits(check, BitPosition, 1); //seq_scaling_list_present_flag[ i ] 0 u(1) + + if (flag == 1) + if (l < 6) + scaling_list(check, BitPosition, null, 16, null); //scaling_list( ScalingList4x4[ i ], 16, + //UseDefaultScalingMatrix4x4Flag[ i ]) + else + scaling_list(check, BitPosition, null, 64, null); //scaling_list( ScalingList8x8[ i 6 ], 64, + //UseDefaultScalingMatrix8x8Flag[ i 6 ] ) + } + } + } + + temp_values[0] = 4 + getCodeNum(check, BitPosition); // log2_max_frame_num_minus4 0 ue(v) + temp_values[2] = getCodeNum(check, BitPosition); // pic_order_cnt_type 0 ue(v) + + if (temp_values[2] == 0) + temp_values[3] = 4 + getCodeNum(check, BitPosition); // log2_max_pic_order_cnt_lsb_minus4 0 ue(v) + + else if (temp_values[2] == 1) + { + getBits(check, BitPosition, 1); //delta_pic_order_always_zero_flag 0 u(1) + getSignedCodeNum(check, BitPosition); //offset_for_non_ref_pic 0 se(v) + getSignedCodeNum(check, BitPosition); //offset_for_top_to_bottom_field 0 se(v) + flag = getCodeNum(check, BitPosition); // num_ref_frames_in_pic_order_cnt_cycle 0 ue(v) + + for (int k = 0; k < flag; k++) + getSignedCodeNum(check, BitPosition); //offset_for_ref_frame[ i ] 0 se(v) + } + + flag = getCodeNum(check, BitPosition); //num_ref_frames 0 ue(v) + + getBits(check, BitPosition, 1); //gaps_in_frame_num_value_allowed_flag 0 u(1) + hori = 16 * (1 + getCodeNum(check, BitPosition)); //pic_width_in_mbs_minus1 0 ue(v) + vert = 16 * (1 + getCodeNum(check, BitPosition)); //pic_height_in_map_units_minus1 0 ue(v) + flag = getBits(check, BitPosition, 1); //frame_mbs_only_flag 0 u(1) + temp_values[5] = flag; + + info_2 = "MPEG-4/H.264, " + hori + "*" + (flag == 0 ? vert<<1 : vert); + + Arrays.fill(h264_info, ""); + + h264_info[1] = "" + hori + " * " + (flag == 0 ? vert<<1 : vert) + " @ "; + h264_info[16] = String.valueOf(hori); + h264_info[17] = String.valueOf(flag == 0 ? vert<<1 : vert); + + h264_info[4] = "Chroma: " + cf[chroma_format_idc]; + + h264_info[0] = "MPEG-4/H.264 "; + + if (profile_idc == 66) + h264_info[0] += "Base@"; + else if (profile_idc == 77) + h264_info[0] += "Main@"; + else if (profile_idc == 88) + h264_info[0] += "Ext@"; + else if (profile_idc == 100) + h264_info[0] += "High@"; + else if (profile_idc == 110) + h264_info[0] += "High10@"; + else if (profile_idc == 122) + h264_info[0] += "High422"; + else if (profile_idc == 144) + h264_info[0] += "High444@"; + else if (profile_idc == 44) + h264_info[0] += "High444a@"; + else if (profile_idc == 244) + h264_info[0] += "High444b@"; + //else if (profile_idc == 166) + // vbasics[2] = "High@"; + //else if (profile_idc == 188) + // vbasics[2] = "High@"; + else + h264_info[0] += String.valueOf(profile_idc) + "@"; + + h264_info[0] += String.valueOf(level_idc / 10.0); + h264_info[8] = "Main Header: " + SH[1]; + + if (flag == 0) //if( !frame_mbs_only_flag ) + getBits(check, BitPosition, 1); //mb_adaptive_frame_field_flag 0 u(1) + + getBits(check, BitPosition, 1); //direct_8x8_inference_flag 0 u(1) + flag = getBits(check, BitPosition, 1); //frame_cropping_flag 0 u(1) + + if (flag == 1) //if( frame_cropping_flag ) { + { + getCodeNum(check, BitPosition); //frame_crop_left_offset 0 ue(v) + getCodeNum(check, BitPosition); //frame_crop_right_offset 0 ue(v) + getCodeNum(check, BitPosition); //frame_crop_top_offset 0 ue(v) + getCodeNum(check, BitPosition); //frame_crop_bottom_offset 0 ue(v) + } + + flag = getBits(check, BitPosition, 1); //vui_parameters_present_flag 0 u(1) + + if (flag == 1) //if( vui_parameters_present_flag ) + vui_parameters(check, BitPosition, h264_info); //vui_parameters( ) 0 + + //rbsp_trailing_bits( ) 0 + + continue; + + //return true; + } + + return false; + } + + // + private int getSignedCodeNum(byte[] array, int[] BitPosition) + { + int codeNum = getCodeNum(array, BitPosition); + + codeNum = (codeNum & 1) == 0 ? codeNum>>>1 : -(codeNum>>>1); + + return codeNum; + } + + // + private int getCodeNum(byte[] array, int[] BitPosition) + { + int leadingZeroBits = -1; + int codeNum; + + for (int b = 0; b == 0; leadingZeroBits++) + b = getBits(array, BitPosition, 1); + + codeNum = (1<>>2] + (pic_id != - 1 ? " / Id: " + pic_id : ""); + String picture_struc[][] = {{ "Frame", "Frame" },{ "Top", "Bottom" }}; + mpg_info[12] = "Pic.Struct.: " + picture_struc[temp_values[6]][temp_values[7]]; + mpg_info[13] = "Pic.Ord.: " + temp_values[4] + " FrNum.: " + temp_values[1]; + mpg_info[14] = "SliceType: " + picture_code2[temp_values[11]]; + mpg_info[15] = "Ref.Idx: " + (7 & check[4 + offset]>>5); + + //if( pic_order_cnt_type = = 1 && !delta_pic_order_always_zero_flag ) { + //delta_pic_order_cnt[ 0 ] 2 se(v) + //if( pic_order_present_flag && !field_pic_flag ) + //delta_pic_order_cnt[ 1 ] 2 se(v) + //} + + return true; + } + + // + private int getBits(byte[] array, int[] BitPosition, int N) + { + int Pos, Val; + Pos = BitPosition[0]>>>3; + + if (N == 0) + return 0; + + if (Pos >= array.length - 4) + { + BitPosition[0] += N; + return -1; + } + + Val = (0xFF & array[Pos])<<24 | + (0xFF & array[Pos + 1])<<16 | + (0xFF & array[Pos + 2])<<8 | + (0xFF & array[Pos + 3]); + + Val <<= BitPosition[0] & 7; + Val >>>= 32 - N; + + BitPosition[0] += N; + + return Val; + } + +/// + + } \ No newline at end of file diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/video/Preview.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/video/Preview.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/video/Preview.java 2005-12-17 22:14:08.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/video/Preview.java 2009-07-11 14:08:24.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)Preview.java - prepare files for previewing * - * Copyright (c) 2004-2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2004-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -48,6 +48,8 @@ private String processed_file; + private boolean silent = true; + private List positionList; private PreviewObject preview_object; private Object[] predefined_Pids; @@ -62,20 +64,45 @@ processed_file = ""; } + /** + * + */ public String getProcessedFile() { return processed_file; } + /** + * + */ public String getProcessedPID() { if (processed_PID < 0) - return "---"; + return "no (P)ID"; + + return ("(P)ID 0x" + Common.adaptString(Integer.toHexString(processed_PID).toUpperCase(), 4)); + } + + /** + * + */ + public long silentload(long startposition, int size, List previewList, boolean direction, boolean all_gops, boolean fast_decode, int y_gain, Object[] _predefined_Pids, int _active_collection) + { + return load(startposition, size, previewList, direction, all_gops, fast_decode, y_gain, _predefined_Pids, _active_collection, true); + } - return (Integer.toHexString(processed_PID).toUpperCase()); + /** + * + */ + public long load(long startposition, int size, List previewList, boolean direction, boolean all_gops, boolean fast_decode, int y_gain, Object[] _predefined_Pids, int _active_collection) + { + return load(startposition, size, previewList, direction, all_gops, fast_decode, y_gain, _predefined_Pids, _active_collection, false); } - public long load(long startposition, int size, List previewList, boolean direction, boolean all_gops, boolean fast_decode, Object[] _predefined_Pids, int _active_collection) throws IOException + /** + * + */ + public long load(long startposition, int size, List previewList, boolean direction, boolean all_gops, boolean fast_decode, int y_gain, Object[] _predefined_Pids, int _active_collection, boolean silent) { predefined_Pids = _predefined_Pids; active_collection = _active_collection; @@ -83,143 +110,231 @@ preview_data = new byte[size]; int filetype = 0; + int subfiletype = 0; int read_offset = 0; - for (int i = 0; i < previewList.size(); i++) - { - preview_object = (PreviewObject) previewList.get(i); - filetype = preview_object.getType(); + try { - if (startposition < preview_object.getEnd()) + for (int i = 0; i < previewList.size(); i++) { - XInputFile lXInputFile = (XInputFile) preview_object.getFile(); - lXInputFile.randomAccessOpen("r"); - lXInputFile.randomAccessSeek(startposition - preview_object.getStart()); - lXInputFile.randomAccessRead(preview_data, read_offset, size); - lXInputFile.randomAccessClose(); + preview_object = (PreviewObject) previewList.get(i); + filetype = preview_object.getType(); - if (preview_object.getEnd() - startposition < size && i < previewList.size() - 1) + if (startposition < preview_object.getEnd()) { - i++; + XInputFile lXInputFile = (XInputFile) preview_object.getFile(); + lXInputFile.randomAccessOpen("r"); + lXInputFile.randomAccessSeek(startposition - preview_object.getStart()); + lXInputFile.randomAccessRead(preview_data, read_offset, size); + lXInputFile.randomAccessClose(); - int diff = (int)(preview_object.getEnd() - startposition); - byte data2[] = new byte[size]; + if (preview_object.getEnd() - startposition < size && i < previewList.size() - 1) + { + i++; + + int diff = (int)(preview_object.getEnd() - startposition); + byte data2[] = new byte[size]; - preview_object = (PreviewObject) previewList.get(i); + preview_object = (PreviewObject) previewList.get(i); - lXInputFile = (XInputFile) preview_object.getFile(); - lXInputFile.randomAccessSingleRead(data2, 0); + lXInputFile = (XInputFile) preview_object.getFile(); + lXInputFile.randomAccessSingleRead(data2, 0); + + System.arraycopy(data2, 0, preview_data, diff, size - diff); + data2 = null; + } - System.arraycopy(data2, 0, preview_data, diff, size - diff); - data2 = null; + subfiletype = lXInputFile.getStreamInfo().getStreamSubType(); + + break; } + } + + preview_data = search(preview_data, startposition, filetype, subfiletype); + + long newposition = Common.getMpvDecoderClass().decodeArray(preview_data, direction, all_gops, fast_decode, y_gain, silent); - break; + for (int i = positionList.size() - 1; i >= 0; i--) + { + position = (int[]) positionList.get(i); + if (position[1] <= newposition) + { + startposition += position[0]; + i = 0; + } } - } - preview_data = search(preview_data, startposition, filetype); + if (positionList.size() == 0) + startposition += newposition; - long newposition = Common.getMpvDecoderClass().decodeArray(preview_data, direction, all_gops, fast_decode); + for (int i = 0; !silent && i < previewList.size(); i++) + { + preview_object = (PreviewObject)previewList.get(i); - for (int i = positionList.size() - 1; i >= 0; i--) - { - position = (int[]) positionList.get(i); - if (position[1] <= newposition) + if (startposition < preview_object.getEnd()) + { + processed_file = "" + i + "/" + (previewList.size() - 1) + " - " + preview_object.getFile().getName(); + break; + } + } + + preview_data = null; + + if (!silent) { - startposition += position[0]; - i = 0; + Common.getMpvDecoderClass().setProcessedPosition(startposition, previewList); + Common.getMpvDecoderClass().setPidAndFileInfo(getProcessedPID() + " Part: " + getProcessedFile()); + Common.getGuiInterface().repaintPicturePanel(); } + + } catch (Exception e) { + Common.setExceptionMessage(e); } - if (positionList.size() == 0) - startposition += newposition; + return startposition; + } - for (int i = 0; i < previewList.size(); i++) - { - preview_object = (PreviewObject)previewList.get(i); + /** + * + */ + public long previewFile(XInputFile lXInputFile, long startposition, int size, boolean all_gops, boolean fast_decode, int y_gain) + { + preview_data = new byte[size]; + predefined_Pids = new Object[0]; - if (startposition < preview_object.getEnd()) - { - processed_file = "" + (i + 1) + "/" + previewList.size() + " - " + preview_object.getFile().getName(); - break; - } + int filetype = lXInputFile.getStreamInfo().getStreamType(); + int subfiletype = lXInputFile.getStreamInfo().getStreamSubType(); + + try { + + lXInputFile.randomAccessOpen("r"); + lXInputFile.randomAccessSeek(startposition); + lXInputFile.randomAccessRead(preview_data, 0, size); + lXInputFile.randomAccessClose(); + + } catch (IOException e) { + Common.setExceptionMessage(e); } + preview_data = search(preview_data, startposition, filetype, subfiletype); + + long newposition = Common.getMpvDecoderClass().decodeArray(preview_data, false, all_gops, fast_decode, y_gain, true); + + startposition += newposition; + preview_data = null; //System.gc(); return startposition; } - private byte[] search(byte data[], long startposition, int filetype) + /** + * + */ + private byte[] search(byte data[], long startposition, int filetype, int subfiletype) { - ByteArrayOutputStream array = new ByteArrayOutputStream(); - positionList.clear(); - byte[] hav_chunk = { 0x5B, 0x48, 0x4F, 0x4A, 0x49, 0x4E, 0x20, 0x41 }; //'[HOJIN A' - - int mark = 0; - int offset = 0; - int ID = -1; int[] include = new int[predefined_Pids.length]; - boolean save = false; - - for (int i = 0; i < include.length; i++) include[i] = Integer.parseInt(predefined_Pids[i].toString().substring(2), 16); Arrays.sort(include); - for (int a = 0; a < data.length - 9; a++) + //do the parse + switch (filetype) { - //mpg es: - if (filetype == CommonParsing.ES_MPV_TYPE) - return data; + case CommonParsing.ES_MPV_TYPE: + return data; + + case CommonParsing.MPEG2PS_TYPE: + case CommonParsing.PES_AV_TYPE: + return parseMPG2(data, include); + + case CommonParsing.MPEG1PS_TYPE: + return parseMPG1(data, include); + + case CommonParsing.PVA_TYPE: + return parsePVA(data, include); + + case CommonParsing.TS_TYPE: + if (subfiletype == CommonParsing.TS_TYPE_192BYTE>>>8) + return parseTS192(data, include); + else + return parseTS(data, include); + } + + return data; + } + + /** + * TS 188 + */ + private byte[] parseTS(byte[] data, int[] include) + { + ByteArrayOutputStream array = new ByteArrayOutputStream(); + + byte[] hav_chunk = { 0x5B, 0x48, 0x4F, 0x4A, 0x49, 0x4E, 0x20, 0x41 }; //'[HOJIN A' + + boolean save = false; + + int mark = 0; + int offset = 0; + int ID = -1; + + int a = 0; - //pva: - if (filetype == CommonParsing.PVA_TYPE && (0xFF & data[a]) == 0x41 && (0xFF & data[a + 1]) == 0x56 && (0xFF & data[a + 4]) == 0x55) + for (int PID, dl = data.length - 9; a < dl; a++) + { + //humax chunk + if (data[a] == 0x7F && data[a + 1] == 0x41 && data[a + 2] == 4 && data[a + 3] == (byte)0xFD) { - if (save) + if (save && mark <= a) array.write(data, mark, a - mark); - mark = a; + save = false; + a += 1183; + mark = a + 1; - if (data[a + 2] == 1) - { - ID = 1; - mark = ((0x10 & data[a + 5]) != 0) ? a + 12 : a + 8; - int currentposition[] = { a,array.size() }; - positionList.add(currentposition); - save = true; - } - else - save = false; + continue; + } + + //koscom chunk + if (a < data.length - 5 && data[a + 2] == 0 && data[a + 3] == 0 && data[a + 4] == 0x47) + { + if (save && mark <= a) + array.write(data, mark, a - mark); - a += 7 + ((0xFF & data[a + 6])<<8 | (0xFF & data[a + 7])); + save = false; + a += 3; + mark = a + 1; + + continue; } - //humax .vid workaround, skip special data chunk - if (filetype == CommonParsing.TS_TYPE && data[a] == 0x7F && data[a + 1] == 0x41 && data[a + 2] == 4 && data[a + 3] == (byte)0xFD) + //jepssen chunk + if (a < data.length - 36 && data[a + 2] == 0 && data[a + 3] == 0 && data[a + 36] == 0x47) { if (save && mark <= a) array.write(data, mark, a - mark); save = false; - a += 1183; + a += 35; mark = a + 1; continue; } //ts: - if (filetype == CommonParsing.TS_TYPE && a < data.length - 188 && data[a] == 0x47) + // if (a < data.length - 188 && data[a] == 0x47) + if (a < data.length && data[a] == 0x47) { int chunk_offset = 0; - if (data[a + 188] != 0x47 && data[a + 188] != 0x7F) + //handan chunk + // if (data[a + 188] != 0x47 && data[a + 188] != 0x7F) + if (a < data.length - 188 && data[a + 188] != 0x47 && data[a + 188] != 0x7F) { int i = a + 188; int j; @@ -263,7 +378,15 @@ } } - if (chunk_offset == 0) + //jepssen chunk + if (chunk_offset == 0 && a < data.length - 224 && data[a + 190] == 0 && data[a + 191] == 0 && data[a + 224] == 0x47) + {} + + //koscom chunk + else if (chunk_offset == 0 && a < data.length - 224 && data[a + 190] == 0 && data[a + 191] == 0 && data[a + 192] == 0x47) + {} + + else if (chunk_offset == 0) continue; } @@ -271,7 +394,8 @@ array.write(data, mark, a - mark); mark = a; - int PID = (0x1F & data[a + 1])<<8 | (0xFF & data[a + 2]); + + PID = (0x1F & data[a + 1])<<8 | (0xFF & data[a + 2]); if (include.length > 0 && Arrays.binarySearch(include, PID) < 0) save = false; @@ -307,96 +431,315 @@ mark += chunk_offset; } - //mpg2-ps - if ((filetype == CommonParsing.MPEG2PS_TYPE || filetype == CommonParsing.PES_AV_TYPE) && data[a] == 0 && data[a + 1] == 0 && data[a + 2] == 1) - { - int PID = 0xFF&data[a+3]; + } + + //save last marked packet + if (save && mark < data.length && a <= data.length) + array.write(data, mark, a - mark); + + + processed_PID = ID; + + return array.toByteArray(); + } - if (PID < 0xB9) - continue; + /** + * TS 192 + */ + private byte[] parseTS192(byte[] data, int[] include) + { + ByteArrayOutputStream array = new ByteArrayOutputStream(); + + boolean save = false; + + int mark = 0; + int offset = 0; + int ID = -1; - if (save) - array.write(data,mark,a-mark); + for (int a = 0, PID, dl = data.length - 9; a < dl; a++) + { + //ts: + if (a < data.length - 192 && data[a] == 0x47) + { + if (save && mark <= a) + array.write(data, mark, a - mark - 4); mark = a; - if (include.length>0 && Arrays.binarySearch(include,PID)<0) - save=false; + PID = (0x1F & data[a + 1])<<8 | (0xFF & data[a + 2]); - else if ((ID==PID || ID==-1) && (0xF0&PID)==0xE0) - { - ID=PID; - mark = a + 9 + (0xFF&data[a+8]); - int currentposition[] = { a,array.size() }; - positionList.add(currentposition); - save=true; + if (include.length > 0 && Arrays.binarySearch(include, PID) < 0) + save = false; + + else if ((ID == PID || ID == -1) && (0xD & data[a + 3]>>>4) == 1) + { + if ((0x20 & data[a + 3]) != 0) //payload start position, adaption field + mark = a + 5 + (0xFF & data[a + 4]); + else + mark = a + 4; + + if ((0x40 & data[a + 1]) != 0) //start indicator + { + if (data[mark] == 0 && data[mark + 1] == 0 && data[mark + 2] == 1 && (0xF0 & data[mark + 3]) == 0xE0) //DM06032004 081.6 int18 fix + { + ID = PID; + mark = mark + 9 + (0xFF & data[mark + 8]); + int[] currentposition = { a, array.size() }; + positionList.add(currentposition); + } + else + save = false; + } + + if (ID == PID) + save = true; } else - save=false; + save = false; + + a += 191; + } + + } + + processed_PID = ID; + + return array.toByteArray(); + } + + /** + * PES_AV + MPG2 + */ + private byte[] parseMPG2(byte[] pes_data, int[] include) + { + ByteArrayOutputStream array = new ByteArrayOutputStream(); + + boolean savePacket = false; - offset=(0xFF&data[a+3])<0xBB?11:0; - a += (offset==0) ? (5+((0xFF&data[a+4])<<8 | (0xFF&data[a+5]))) : offset; + int mark = 0; + int pes_headerlength = 9; + int pes_offset = 6; + int pes_payloadlength = 0; + int pes_ID = -1; + + for (int offset = 0, offset2, pes_ID_tmp, returncode, j = pes_data.length - pes_headerlength; offset < j; ) + { + if ((returncode = CommonParsing.validateStartcode(pes_data, offset)) < 0) + { + offset += -returncode; + continue; } - //mpg1-ps - if (filetype == CommonParsing.MPEG1PS_TYPE && data[a]==0 && data[a+1]==0 && data[a+2]==1) + pes_ID_tmp = CommonParsing.getPES_IdField(pes_data, offset); + + if (pes_ID_tmp < CommonParsing.SYSTEM_END_CODE) { - int PID = 0xFF&data[a+3]; + offset += 4; + continue; + } - if (PID < 0xB9) - continue; + if (savePacket) + array.write(pes_data, mark, offset - mark); - if (save) - array.write(data,mark,a-mark); + mark = offset; - mark = a; + if (include.length > 0 && Arrays.binarySearch(include, pes_ID_tmp) < 0) + savePacket = false; + + else if ((pes_ID == pes_ID_tmp || pes_ID == -1) && (0xF0 & pes_ID_tmp) == 0xE0) + { + pes_ID = pes_ID_tmp; + mark = offset + pes_headerlength + CommonParsing.getPES_ExtensionLengthField(pes_data, offset); + + int[] currentposition = { offset, array.size() }; + + positionList.add(currentposition); + savePacket = true; + } + + else + savePacket = false; - if (include.length>0 && Arrays.binarySearch(include,PID)<0) - save=false; + offset2 = pes_ID_tmp < CommonParsing.SYSTEM_START_CODE ? 12 : 0; //BA - else if ((ID==PID || ID==-1) && (0xF0&PID)==0xE0){ - ID=PID; - int shift=a+6; - skiploop: + pes_payloadlength = CommonParsing.getPES_LengthField(pes_data, offset); - while(true) + if (pes_payloadlength == 0) //zero length + offset2 = pes_headerlength; + + offset += (offset2 == 0 ? (pes_offset + pes_payloadlength) : offset2); + } + + processed_PID = pes_ID; + + return array.toByteArray(); + } + + /** + * MPG1 + */ + private byte[] parseMPG1(byte[] pes_data, int[] include) + { + ByteArrayOutputStream array = new ByteArrayOutputStream(); + + boolean savePacket = false; + + int mark = 0; + int pes_headerlength = 7; + int pes_offset = 6; + int pes_payloadlength = 0; + int pes_ID = -1; + + for (int offset = 0, offset2, pes_ID_tmp, returncode, shift, j = pes_data.length - pes_headerlength; offset < j; ) + { + if ((returncode = CommonParsing.validateStartcode(pes_data, offset)) < 0) + { + offset += -returncode; + continue; + } + + pes_ID_tmp = CommonParsing.getPES_IdField(pes_data, offset); + + if (pes_ID_tmp < CommonParsing.SYSTEM_END_CODE) + { + offset += 4; + continue; + } + + if (savePacket) + array.write(pes_data, mark, offset - mark); + + mark = offset; + + if (include.length > 0 && Arrays.binarySearch(include, pes_ID_tmp) < 0) + savePacket = false; + + else if ((pes_ID == pes_ID_tmp || pes_ID == -1) && (0xF0 & pes_ID_tmp) == 0xE0) + { + pes_ID = pes_ID_tmp; + + shift = offset + pes_offset; + + skiploop: + while(true) + { + switch (0xC0 & pes_data[shift]) { - switch (0xC0&data[shift]) { - case 0x40: shift+=2; - continue skiploop; - case 0x80: shift+=3; - continue skiploop; - case 0xC0: shift++; - continue skiploop; - case 0: break; - } - switch (0x30&data[shift]) { - case 0x20: shift+=5; - break skiploop; - case 0x30: shift+=10; - break skiploop; - case 0x10: shift+=5; - break skiploop; - case 0: shift++; - break skiploop; - } + case 0x40: + shift += 2; + continue skiploop; + + case 0x80: + shift += 3; + continue skiploop; + + case 0xC0: + shift++; + continue skiploop; + + case 0: + break; } - mark = shift; - int currentposition[] = { a,array.size() }; - positionList.add(currentposition); - save=true; + switch (0x30 & pes_data[shift]) + { + case 0x20: + shift += 5; + break skiploop; + + case 0x30: + shift += 10; + break skiploop; + + case 0x10: + shift += 5; + break skiploop; + + case 0: + shift++; + break skiploop; + } } - else - save = false; - offset = (0xFF & data[a + 3]) < 0xBB ? 11 : 0; - a += (offset == 0) ? (5 + ((0xFF & data[a + 4])<<8 | (0xFF & data[a + 5]))) : offset; + mark = shift; + + int[] currentposition = { offset, array.size() }; + + positionList.add(currentposition); + savePacket = true; } + + else + savePacket = false; + + + offset2 = pes_ID_tmp < CommonParsing.SYSTEM_START_CODE ? 12 : 0; //BA + + pes_payloadlength = CommonParsing.getPES_LengthField(pes_data, offset); + + if (pes_payloadlength == 0) //zero length + offset2 = pes_headerlength; + + offset += (offset2 == 0 ? (pes_offset + pes_payloadlength) : offset2); } - processed_PID = ID; + processed_PID = pes_ID; + + return array.toByteArray(); + } + + /** + * PVA + */ + private byte[] parsePVA(byte[] pes_data, int[] include) + { + ByteArrayOutputStream array = new ByteArrayOutputStream(); + + boolean savePacket = false; + + int mark = 0; + int pes_headerlength = 8; + int pes_offset = 8; + int pes_payloadlength = 0; + int pes_ID = -1; + + for (int offset = 0, pes_ID_tmp, j = pes_data.length - pes_headerlength; offset < j; ) + { + if ((0xFF & pes_data[offset]) != 0x41 || (0xFF & pes_data[offset + 1]) != 0x56 || (0xFF & pes_data[offset + 4]) != 0x55) + { + offset++; + continue; + } + + if (savePacket) + array.write(pes_data, mark, offset - mark); + + mark = offset; + + pes_ID_tmp = 0xFF & pes_data[offset + 2]; + + if (pes_ID_tmp == 1) + { + pes_ID = 1; + mark = ((0x10 & pes_data[offset + 5]) != 0) ? offset + pes_offset + 4 : offset + pes_offset; + + int[] currentposition = { offset, array.size() }; + + positionList.add(currentposition); + savePacket = true; + } + + else + savePacket = false; + + pes_payloadlength = (0xFF & pes_data[offset + 6])<<8 | (0xFF & pes_data[offset + 7]); + + offset += (pes_offset + pes_payloadlength); + } + + processed_PID = pes_ID; return array.toByteArray(); } } + diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/ftp/FtpServer.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/ftp/FtpServer.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/ftp/FtpServer.java 2005-12-17 22:16:20.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/ftp/FtpServer.java 2006-06-04 13:05:14.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)FtpServer.java - for ftp access * - * Copyright (c) 2004-2005 by roehrist, All Rights Reserved. + * Copyright (c) 2004-2006 by roehrist, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -34,8 +34,12 @@ import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; + import net.sourceforge.dvb.projectx.common.Resource; import net.sourceforge.dvb.projectx.xinput.XInputFile; +import net.sourceforge.dvb.projectx.xinput.XInputDirectory; +import net.sourceforge.dvb.projectx.xinput.ftp.FtpVO; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; @@ -114,25 +118,83 @@ return isSuccessful; } - public XInputFile[] listFiles() { + /** + * + */ + public XInputFile[] listFiles() + { + ArrayList list = new ArrayList(); FTPFile[] ftpFiles = null; - XInputFile[] ftpInputFiles = null; + try { ftpFiles = ftpClient.listFiles(); - ftpInputFiles = new XInputFile[ftpFiles.length]; - for (int i = 0; i < ftpFiles.length; i++) { + for (int i = 0, j = ftpFiles.length; i < j; i++) + { + if (!ftpFiles[i].isFile()) + continue; + FtpVO tempFtpVO = (FtpVO) ftpVO.clone(); + tempFtpVO.setFtpFile(ftpFiles[i]); - ftpInputFiles[i] = new XInputFile(tempFtpVO); + + list.add(new XInputFile(tempFtpVO)); } } catch (Exception e) { - ftpInputFiles = new XInputFile[0]; + + System.err.println("!> error create ftp filelist: " + e); } + + XInputFile[] ftpInputFiles = new XInputFile[list.size()]; + + for (int i = 0, j = ftpInputFiles.length; i < j; i++) + ftpInputFiles[i] = (XInputFile) list.get(i); + return ftpInputFiles; } + /** + * + */ + public FtpVO[] listDirectories() + { + ArrayList list = new ArrayList(); + FTPFile[] ftpFiles = null; + + try { + ftpFiles = ftpClient.listFiles(); + + for (int i = 0, j = ftpFiles.length; i < j; i++) + { + if (!ftpFiles[i].isDirectory()) + continue; + + else if (ftpFiles[i].getName().startsWith(".")) + continue; + + FtpVO tempFtpVO = (FtpVO) ftpVO.clone(); + + tempFtpVO.setDirectory(tempFtpVO.getDirectory() + "/" + ftpFiles[i].getName()); + tempFtpVO.setFtpFile(ftpFiles[i]); + + list.add(tempFtpVO); + } + + } catch (Exception e) { + + System.err.println("!> error create ftp directory list: " + e); + } + + FtpVO[] ftpInputDirectories = new FtpVO[list.size()]; + + for (int i = 0, j = ftpInputDirectories.length; i < j; i++) + ftpInputDirectories[i] = (FtpVO) list.get(i); + + return ftpInputDirectories; + } + + public InputStream retrieveFileStream(String aFileName) throws IOException { return ftpClient.retrieveFileStream(aFileName); } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/ftp/XInputDirectoryImpl.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/ftp/XInputDirectoryImpl.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/ftp/XInputDirectoryImpl.java 2005-12-17 22:16:50.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/ftp/XInputDirectoryImpl.java 2006-06-04 13:05:00.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)XInputDirectoryImpl.java - implementation for ftp access * - * Copyright (c) 2004-2005 by roehrist, All Rights Reserved. + * Copyright (c) 2004-2006 by roehrist, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -31,6 +31,10 @@ import net.sourceforge.dvb.projectx.xinput.XInputFile; import java.net.URL; +import java.util.ArrayList; + +import net.sourceforge.dvb.projectx.common.Common; +import net.sourceforge.dvb.projectx.common.Keys; public class XInputDirectoryImpl implements XInputDirectoryIF { @@ -77,8 +81,10 @@ int posAt = aFileIdentifier.indexOf('@', posColon); int posSlash = aFileIdentifier.indexOf('/', posAt); - if (posAt == -1 || posColon == -1 || posSlash == -1) { throw new IllegalArgumentException( - "aFileIdentifier is a malformed ftp URL!"); } + if (posAt == -1 || posColon == -1 || posSlash == -1) + { + throw new IllegalArgumentException("aFileIdentifier is a malformed ftp URL!"); + } String user = aFileIdentifier.substring(6, posColon); String password = aFileIdentifier.substring(posColon + 1, posAt); @@ -87,6 +93,7 @@ String port = null; int posColon2 = server.indexOf(':'); + if (posColon2 != -1) { server = server.substring(0, posColon2); @@ -271,16 +278,56 @@ */ public XInputFile[] getFiles() { - XInputFile[] xInputFiles = null; + ArrayList list = new ArrayList(); ftpServer.open(); - xInputFiles = ftpServer.listFiles(); + XInputFile[] xInputFiles = ftpServer.listFiles(); ftpServer.close(); + for (int i = 0, j = xInputFiles.length; i < j; i++) + list.add(xInputFiles[i]); + + if (Common.getSettings().getBooleanProperty(Keys.KEY_InputDirectoriesDepth)) + getDirectories(ftpVO, list); // depth 1 + + xInputFiles = new XInputFile[list.size()]; + + for (int i = 0, j = xInputFiles.length; i < j; i++) { + xInputFiles[i] = (XInputFile) list.get(i); + } + return xInputFiles; } /** + * + */ + private void getDirectories(FtpVO aFtpVO, ArrayList list) + { + FtpServer server = new FtpServer(aFtpVO); + + server.open(); + FtpVO[] xFtpVO = server.listDirectories(); + server.close(); + + XInputFile[] xInputFiles; + + for (int i = 0; i < xFtpVO.length; i++) + { + server = new FtpServer(xFtpVO[i]); + + server.open(); + xInputFiles = server.listFiles(); + server.close(); + + for (int j = 0; j < xInputFiles.length; j++) + list.add(xInputFiles[j]); + + getDirectories(xFtpVO[i], list); // depth 2 + } + } + + /** * Test if directory data is valid. * * @return Test successful or not diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/ftp/XInputFileImpl.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/ftp/XInputFileImpl.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/ftp/XInputFileImpl.java 2005-12-17 22:16:58.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/ftp/XInputFileImpl.java 2006-06-04 13:05:24.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)XInputFileImpl.java - implementation for ftp access * - * Copyright (c) 2004-2005 by roehrist, All Rights Reserved. + * Copyright (c) 2004-2006 by roehrist, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/StreamInfo.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/StreamInfo.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/StreamInfo.java 2005-12-17 22:15:12.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/StreamInfo.java 2008-12-19 19:57:48.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)StreamInfo * - * Copyright (c) 2005 by dvb.matt, All Rights Reserved. + * Copyright (c) 2005-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -53,6 +53,10 @@ private Object[] pids; private byte[] videoheader; + private int[] thumbnail; + + private long scanposition = 0; + private String line_separator = System.getProperty("line.separator"); /** @@ -82,11 +86,12 @@ /** * */ - public StreamInfo(int _streamtype, String _file_source, String _file_type, String _file_name, String _file_location, String _file_date, String _file_size, String _file_playtime, Object[] _videostreams, Object[] _audiostreams, Object[] _teletextstreams, Object[] _subpicturestreams, Object[] _pids, byte[] _videoheader) + public StreamInfo(int _streamtype, String _file_source, String _file_type, String _file_name, String _file_location, String _file_date, String _file_size, String _file_playtime, Object[] _videostreams, Object[] _audiostreams, Object[] _teletextstreams, Object[] _subpicturestreams, Object[] _pids, byte[] _videoheader, int[] _thumbnail) { streamtype = _streamtype; pids = _pids; videoheader = _videoheader; + thumbnail = _thumbnail; setStreamInfo(_file_source, _file_type, _file_name, _file_location, _file_date, _file_size, _file_playtime, _videostreams, _audiostreams, _teletextstreams, _subpicturestreams); } @@ -121,6 +126,23 @@ /** * */ + public int[] getThumbnail() + { + return thumbnail; + } + + /** + * + */ + public void setThumbnail(int[] pic) + { + thumbnail = new int[pic.length]; + System.arraycopy(pic, 0, thumbnail, 0, pic.length); + } + + /** + * + */ public String getFileName() { return file_name; @@ -315,10 +337,26 @@ /** * */ + public long getScanPosition() + { + return scanposition; + } + + /** + * + */ + public void setScanPosition(long value) + { + scanposition = value; + } + + /** + * + */ public void setStreamType(int _streamtype) { streamtype = _streamtype; - file_type = Keys.ITEMS_FileTypes[streamtype].toString(); + file_type = Keys.ITEMS_FileTypes[getStreamType()].toString(); } /** @@ -327,7 +365,7 @@ public void setStreamType(int _streamtype, String str) { streamtype = _streamtype; - file_type = Keys.ITEMS_FileTypes[streamtype].toString() + str; + file_type = "[" + getStreamSubType() + "] " + Keys.ITEMS_FileTypes[getStreamType()].toString() + " " + str; } /** @@ -335,6 +373,22 @@ */ public int getStreamType() { + return (0xFF & streamtype); + } + + /** + * + */ + public int getStreamSubType() + { + return (0xFF & streamtype>>>8); + } + + /** + * + */ + public int getStreamFullType() + { return streamtype; } @@ -430,11 +484,26 @@ } /** + * + */ + private int[] copyContent(int[] _array) + { + if (_array == null) + return null; + + int[] array = new int[_array.length]; + + System.arraycopy(_array, 0, array, 0, array.length); + + return array; + } + + /** * */ public StreamInfo getNewInstance() { - return new StreamInfo(streamtype, file_source, file_type, file_name, file_location, file_date, file_size, file_playtime, copyContent(videostreams), copyContent(audiostreams), copyContent(teletextstreams), copyContent(subpicturestreams), copyContent(pids), copyContent(videoheader)); + return new StreamInfo(streamtype, file_source, file_type, file_name, file_location, file_date, file_size, file_playtime, copyContent(videostreams), copyContent(audiostreams), copyContent(teletextstreams), copyContent(subpicturestreams), copyContent(pids), copyContent(videoheader), copyContent(thumbnail)); } } diff -Nru project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/XInputFile.java project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/XInputFile.java --- project-x-0.90.4dfsg/src/net/sourceforge/dvb/projectx/xinput/XInputFile.java 2005-12-30 20:52:40.000000000 +0000 +++ project-x-0.91.0/src/net/sourceforge/dvb/projectx/xinput/XInputFile.java 2007-08-24 19:45:34.000000000 +0000 @@ -1,7 +1,7 @@ /* * @(#)XInputFile.java * - * Copyright (c) 2004-2005 by roehrist, All Rights Reserved. + * Copyright (c) 2004-2007 by roehrist, dvbmatt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, @@ -45,6 +45,8 @@ private Object constructorParameter = null; + public String file_id = ""; + /** * Private Constructor, don't use! */ @@ -79,6 +81,9 @@ if (xif.getImpl() == null) return null; + // copy file_id + xif.setFileID(getFileID()); + /** * copy already parsed streaminfo */ @@ -568,4 +573,19 @@ return (impl != null ? impl.getStreamInfo() : null); } + /** + * + */ + public String getFileID() + { + return file_id; + } + + /** + * + */ + public void setFileID(String str) + { + file_id = str; + } } \ No newline at end of file