--- diascope-0.2-beta-2 2007-04-08 11:29:54.000000000 +0000 +++ diascope-0.2-beta-2b 2007-04-20 08:59:45.000000000 +0000 @@ -1554,8 +1554,9 @@ # --------------------------------------------------------------------- # parse_frames parses the frame parameter in fstr. This function is also # called to evaluate the title frames. +# maxframes=3 for a duration, 4 for a title spec # -function parse_frames(ndv,fstr,FRAMES,SETTINGS, +function parse_frames(ndv,fstr,FRAMES,SETTINGS,maxframes, TMP,num,t2f,parsed_ok) { t2f=SETTINGS[SET_DURMULT]; @@ -1572,15 +1573,15 @@ FRAMES[ndv,FRM_WAIT]= 0; FRAMES[ndv,FRM_BEFORE]=0; FRAMES[ndv,FRM_EFFECT]=round(t2f*TMP[1]); FRAMES[ndv,FRM_AFTER]= 0; } - else if ( num==2 ) { + else if ( num==2 && maxframes>=2 ) { FRAMES[ndv,FRM_WAIT]= 0; FRAMES[ndv,FRM_BEFORE]=round(t2f*TMP[1]); FRAMES[ndv,FRM_EFFECT]=round(t2f*TMP[2]); FRAMES[ndv,FRM_AFTER]= 0; } - else if ( num==3 ) { + else if ( num==3 && maxframes>=3 ) { FRAMES[ndv,FRM_WAIT]= 0; FRAMES[ndv,FRM_BEFORE]=round(t2f*TMP[1]); FRAMES[ndv,FRM_EFFECT]=round(t2f*TMP[2]); FRAMES[ndv,FRM_AFTER]= round(t2f*TMP[3]); } - else if ( num==4 ) { # Only a title specification can have 4 fields! + else if ( num==4 && maxframes>=4 ) { # Only a title specification can have 4 fields! FRAMES[ndv,FRM_WAIT]= round(t2f*TMP[1]); FRAMES[ndv,FRM_BEFORE]=round(t2f*TMP[2]); FRAMES[ndv,FRM_EFFECT]=round(t2f*TMP[3]); FRAMES[ndv,FRM_AFTER]= round(t2f*TMP[4]); } @@ -1625,9 +1626,9 @@ parsing=1; while ((idx<=NF) && parsing) { parsing=0; - if ($(idx)~/mirror/) { VOPTIONS[ndv,OPT_MIR]=MIRROR_ON; idx++; parsing=1; } - else if ($(idx)~/redo/) { VOPTIONS[ndv,OPT_REDO]=REDO_ON; idx++; parsing=1; } - else if ($(idx)~/accel=/) { + if ($(idx)~/^mirror/) { VOPTIONS[ndv,OPT_MIR]=MIRROR_ON; idx++; parsing=1; } + else if ($(idx)~/^redo/) { VOPTIONS[ndv,OPT_REDO]=REDO_ON; idx++; parsing=1; } + else if ($(idx)~/^accel=/) { if (EFFECT[ndv]!=EF_KBRN) { printf("** Warning: clip %i, accel= option is only applicable to kbrn\n",ndv); } @@ -1641,7 +1642,7 @@ } idx++; parsing=1; } - else if ($(idx)~/over=/) { + else if ($(idx)~/^over=/) { if (EFFECT[ndv]!=EF_KBRN) { printf("** Warning: clip %i, over= option is only applicable to kbrn\n",ndv); } @@ -1655,7 +1656,7 @@ } idx++; parsing=1; } - else if ($(idx)~/rotate=/) { + else if ($(idx)~/^rotate=/) { VOPTIONS[ndv,OPT_ROT]=key_value($(idx)); if (VOPTIONS[ndv,OPT_ROT]=="") { VOPTIONS[ndv,OPT_ROT]=0; @@ -1664,14 +1665,14 @@ } idx++; parsing=1; } - else if ($(idx)~/bg=/) { + else if ($(idx)~/^bg=/) { if (EFFECT[ndv]!=EF_FADE) { printf("** Warning: clip %i, bg= option is only applicable to fadein/fadeout\n",ndv); } parsed_ok=(VOPTIONS[ndv,OPT_FADERGB]=get_rgbcolour(key_value($(idx)))); if (parsed_ok) { parsing=1; idx++ } } - else if ($(idx)~/xyw=/) { + else if ($(idx)~/^xyw=/) { split(key_value($(idx)),TMP,","); for (j=1;j<=3;j++) { parsed_ok=parsed_ok && check_integer_percent(TMP[j]) } if (! parsed_ok) { @@ -1685,21 +1686,21 @@ idx++; parsing=1; } } - else if ($(idx)~/start=/) { + else if ($(idx)~/^start=/) { if (EFFECT[ndv]!=EF_SEQU) { printf("** Warning: clip %i, start= option is only applicable to sequ\n",ndv); } parsed_ok=((VOPTIONS[ndv,OPT_SEQUSTART]=key_value($(idx))) != ""); idx++; parsing=1; } - else if ($(idx)~/end=/) { + else if ($(idx)~/^end=/) { if (EFFECT[ndv]!=EF_SEQU) { printf("** Warning: clip %i, end= option is only applicable to sequ\n",ndv); } parsed_ok=((VOPTIONS[ndv,OPT_SEQUEND]=key_value($(idx))) != ""); idx++; parsing=1; } - else if ($(idx)~/title=/) { + else if ($(idx)~/^title=/) { if (idx==NF) { printf("Error: clip %d, incomplete title specfication \"%s\"\n",ndv,$(idx)) >> STDOUT; EffectSyntax("",syntaxtframes); @@ -1707,7 +1708,7 @@ } else { split($(idx),TMP,"="); - if (! parse_frames(ndv,TMP[2],TITLEFRAMES,SETTINGS)) { + if (! parse_frames(ndv,TMP[2],TITLEFRAMES,SETTINGS,4)) { printf("Error: clip %d, in title frame specification \"%s\"\n",ndv,$(idx)) >> STDOUT; parsed_ok=0; } @@ -1768,7 +1769,7 @@ parsed_ok) { EFFECT[ndv]=EF_CROP; - parsed_ok = parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS) && identify_image(ndv,$3,IMAGE,FILE_MODE) && + parsed_ok = parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS,3) && identify_image(ndv,$3,IMAGE,FILE_MODE) && parse_voptions(ndv,4,EFFECT,VOPTIONS,XYW,TITLEFRAMES,SETTINGS); return(parsed_ok); } @@ -1778,7 +1779,7 @@ parsed_ok) { EFFECT[ndv]=EF_CREATE; - parsed_ok = parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS) && (IMAGE[ndv,IMG_FILE]=get_rgbcolour($3)) && + parsed_ok = parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS,3) && (IMAGE[ndv,IMG_FILE]=get_rgbcolour($3)) && parse_voptions(ndv,4,EFFECT,VOPTIONS,XYW,TITLEFRAMES,SETTINGS); return(parsed_ok); } @@ -1798,7 +1799,7 @@ parsed_ok=0; } parsed_ok = parsed_ok && - parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS) && identify_image(ndv,$3,IMAGE,FILE_MODE) && + parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS,3) && identify_image(ndv,$3,IMAGE,FILE_MODE) && parse_voptions(ndv,4,EFFECT,VOPTIONS,XYW,TITLEFRAMES,SETTINGS); if (!(VOPTIONS[ndv,OPT_FADERGB])) { VOPTIONS[ndv,OPT_FADERGB]=get_rgbcolour("black") } return(parsed_ok); @@ -1808,7 +1809,7 @@ parsed_ok) { EFFECT[ndv]=EF_KBRN; - parsed_ok = parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS) && identify_image(ndv,$3,IMAGE,FILE_MODE) && + parsed_ok = parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS,3) && identify_image(ndv,$3,IMAGE,FILE_MODE) && parse_voptions(ndv,4,EFFECT,VOPTIONS,XYW,TITLEFRAMES,SETTINGS); return(parsed_ok); } @@ -1817,7 +1818,7 @@ parsed_ok) { EFFECT[ndv]=EF_SEQU; - parsed_ok = parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS) && + parsed_ok = parse_frames(ndv,$2,VIDEOFRAMES,SETTINGS,3) && parse_voptions(ndv,4,EFFECT,VOPTIONS,XYW,TITLEFRAMES,SETTINGS) && identify_imagesequ(ndv,$3,IMAGE,VOPTIONS[ndv,OPT_SEQUSTART],VOPTIONS[ndv,OPT_SEQUEND],FILE_MODE); return(parsed_ok); @@ -1841,23 +1842,23 @@ TOPTIONS[ndv,OPT_BGRGB]=BGRGB_DEFAULT; idx=4; parsing=1; while (parsing) { parsing=0; - if ($(idx)~/spin=/) { + if ($(idx)~/^spin=/) { parsed_ok=parsed_ok && check_integer(TOPTIONS[ndv,OPT_SPIN]=key_value($(idx))); if (parsed_ok) { parsing=1; idx++ } else printf("Error in spin option of transition %d -> %d, \"%s\"\n",ndv,ndv+1,$(idx)) >> STDOUT; } - else if ($(idx)~/accel=/) { + else if ($(idx)~/^accel=/) { parsed_ok=parsed_ok && ((TOPTIONS[ndv,OPT_SPINSIG]=key_value($(idx)))!=""); if (parsed_ok) { parsing=1; idx++ } else printf("Error in accel option of transition %d -> %d, \"%s\"\n",ndv,ndv+1,$(idx)) >> STDOUT; } - else if ($(idx)~/bg=/) { + else if ($(idx)~/^bg=/) { parsed_ok=parsed_ok && ((TOPTIONS[ndv,OPT_BGRGB]=get_rgbcolour(key_value($(idx))))!=""); if (parsed_ok) { parsing=1; idx++ } else printf("Error in background colour option of transition %d -> %d, \"%s\"\n", ndv,ndv+1,$(idx)) >> STDOUT; } - else if ($(idx)~/redo/) { idx++; parsing=1 } # set above + else if ($(idx)~/^redo/) { idx++; parsing=1 } # set above else if ($(idx)!="") { printf("Error: unknown option in transition %d -> %d, \"%s\"\n",ndv,ndv+1,$(idx)) >> STDOUT; parsed_ok=0; @@ -1873,7 +1874,7 @@ TOPTIONS[ndv,OPT_LUMARFX]=LUMAROLLFRAC_DEFAULT; TOPTIONS[ndv,OPT_LUMARFY]=LUMAROLLFRAC_DEFAULT; idx=4; parsing=1; while ((parsing) && (idx<=NF)) { parsing=0; - if ($(idx)~/dir=/) { + if ($(idx)~/^dir=/) { if (ndv in LUMAFILE) { printf("Error: must have either \"dir=\" or \"file=\" in luma transition %d\n",ndv) >> STDOUT; parsed_ok=0; @@ -1891,7 +1892,7 @@ if ( parsed_ok ) { parsing=1; idx++ } } } - else if ($(idx)~/file=/) { + else if ($(idx)~/^file=/) { if (TOPTIONS[ndv,OPT_DIRECTION]!="" && \ ! (TOPTIONS[ndv,OPT_DIRECTION]==DIR_FILE || TOPTIONS[ndv,OPT_DIRECTION]==DIR_FILEREV)) { printf("Error: must have either \"dir=\" or \"file=\" in luma transition %d\n",ndv) >> STDOUT; @@ -1903,7 +1904,7 @@ if ( parsed_ok ) { parsing=1; idx++ } } } - else if ($(idx)~/reverse/) { + else if ($(idx)~/^reverse/) { if (TOPTIONS[ndv,OPT_DIRECTION]!="" && \ ! (TOPTIONS[ndv,OPT_DIRECTION]==DIR_FILE || TOPTIONS[ndv,OPT_DIRECTION]==DIR_FILEREV)) { printf("Error: \"reverse\" works only for luma file transition %d\n",ndv) >> STDOUT; @@ -1915,14 +1916,14 @@ idx++; parsing=1; } } - else if ($(idx)~/sharp=/) { + else if ($(idx)~/^sharp=/) { if (! check_real(TOPTIONS[ndv,OPT_LUMASIG]=key_value($(idx)))) { printf("Error: not a real number in transition %d, %s\n",ndv,$(idx)) >> STDOUT; parsed_ok=0; } if ( parsed_ok ) { parsing=1; idx++ } } - else if ($(idx)~/roll=/) { + else if ($(idx)~/^roll=/) { if (TOPTIONS[ndv,OPT_DIRECTION]!="" && \ ! (TOPTIONS[ndv,OPT_DIRECTION]==DIR_FILE || TOPTIONS[ndv,OPT_DIRECTION]==DIR_FILEREV)) { printf("Error: \"roll\" works only for luma file transition %d\n",ndv) >> STDOUT; @@ -1938,7 +1939,7 @@ } } } - else if ($(idx)~/redo/) { idx++; parsing=1; } # set above + else if ($(idx)~/^redo/) { idx++; parsing=1; } # set above else if ($(idx)!="") { printf("Error: unknown option in transition %d -> %d, \"%s\"\n",ndv,ndv+1,$(idx)) >> STDOUT; parsed_ok=0; @@ -1954,7 +1955,7 @@ idx=4; parsing=1; while (parsing) { parsing=0; - if ($(idx)~/dir=/) { + if ($(idx)~/^dir=/) { direction=key_value($(idx)); if (direction=="td") { TOPTIONS[ndv,OPT_DIRECTION]=DIR_TD } else if (direction=="rl") { TOPTIONS[ndv,OPT_DIRECTION]=DIR_RL } @@ -1968,7 +1969,7 @@ } if ( parsed_ok ) { parsing=1; idx++ } } - else if ($(idx)~/redo/) { idx++; parsing=1; } # set above + else if ($(idx)~/^redo/) { idx++; parsing=1; } # set above else if ($(idx)!="") { printf("Error: unknown option in transition %d -> %d, \"%s\"\n",ndv,ndv+1,$(idx)) >> STDOUT; parsed_ok=0; @@ -2776,9 +2777,9 @@ # plot_paths plots the specified kbrn path and the crop specs onto # a scaled down version of the image to help visualise it. -function plot_path(ndv,nxyw,XYW,frames,CROPPATH,mirror,rotate,imgin,imgin_w,aspect,interlaced, \ +function plot_path(ndv,nxyw,XYW,frames,CROPPATH,mirror,rotate,imgin,imgin_w,imgin_h,aspect,interlaced, \ NDVIDXTABLE, \ - j,k,kmax,imgout,layer,x0,y0,x1,y1,scale,TMP) + j,kmax,imgout,layer,xres,yres,x0,y0,x1,y1,scale,TMP) { if (EFFECT[ndv]!=EF_KBRN) return; @@ -2786,11 +2787,13 @@ layer=dv_name(TMPDIR "/" PATHPREFIX,"png",ndv,NDVIDXTABLE); j=split(imgin,TMP,"/"); imgout=dv_name(TMPDIR "/" PATHPREFIX "-" gensub(/\./,"_","g",TMP[j]),PATHEXT,ndv,NDVIDXTABLE); - scale=PATHXRES/imgin_w; + + if (imgin_w>imgin_h) { scale=PATHRES/imgin_w } else { scale=PATHRES/imgin_h } + xres=imgin_w*scale; yres=imgin_h*scale; printf("echo \" plotting path into %s\"\n",abbrevstr(10,43,imgout)) >> SCRIPTF; printf("convert -size %dx%d xc:transparent -rotate %i -fill %s -stroke none -draw \"", - PATHXRES,PATHXRES/aspect,rotate,PATHRECTFILL) >> SCRIPTF; + xres,yres,rotate,PATHRECTFILL) >> SCRIPTF; for (j=1;j<=nxyw;j++) { x0=XYW[ndv,j,CRP_X]; y0=XYW[ndv,j,CRP_Y]; x1=x0+XYW[ndv,j,CRP_W]; y1=y0+XYW[ndv,j,CRP_W]/aspect; @@ -2799,7 +2802,7 @@ printf("\" %s\n",layer) >> SCRIPTF; printf("convert %s -sample %dx%d -rotate %i miff:- | " \ "composite -blend 50%% %s miff:- %s\n",imgin, - PATHXRES,PATHXRES/aspect,rotate,layer,imgout) >> SCRIPTF; + xres,yres,rotate,layer,imgout) >> SCRIPTF; printf("rm -f %s\n",layer) >> SCRIPTF; printf("mogrify %s -strokewidth 1 -pointsize %s -fill none -stroke %s -draw \"", @@ -2821,11 +2824,9 @@ for (J=0;J<=int((frames-1)/PATH_BLOCKS);J++) { printf("mogrify -stroke %s -strokewidth 2 -fill none -draw 'polyline",PATHFILL) >> SCRIPTF; for (j=J*PATH_BLOCKS;j> SCRIPTF; - } + x0=CROPPATH[ndv,(kmax+1)*j,CRP_X]; y0=CROPPATH[ndv,(kmax+1)*j,CRP_Y]; + x1=x0+CROPPATH[ndv,(kmax+1)*j,CRP_W]; y1=y0+CROPPATH[ndv,(kmax+1)*j,CRP_W]/aspect; + printf(" %d,%d",0.5*(x0+x1)*scale,0.5*(y0+y1)*scale) >> SCRIPTF; } printf("' %s\n",imgout) >> SCRIPTF; } @@ -2883,10 +2884,10 @@ # create_supportfiles creates files needed for diascope to run function create_supportfiles() { - if ((FMTSPEC[FMT_INTERLACED]==INTERLACED_ON) && !check_file(TMPDIR "/" WEAVEF,1)) { + if (FMTSPEC[FMT_INTERLACED]==INTERLACED_ON) { printf("echo \" Creating weave mask to interlace kbrn fields.\"\n") >> SCRIPTF; - printf("convert -depth 8 -size %sx%s \\( xc:black -fx 'j%2' \\) %s\n", - FMTSPEC[FMT_OUTW],FMTSPEC[FMT_OUTH],TMPDIR "/" WEAVEF) >> SCRIPTF; + printf("[ -f %s ] || convert -depth 8 -size %sx%s \\( xc:black -fx 'j%2' \\) %s\n", + TMPDIR "/" WEAVEF, FMTSPEC[FMT_OUTW],FMTSPEC[FMT_OUTH],TMPDIR "/" WEAVEF) >> SCRIPTF; } } @@ -2907,7 +2908,7 @@ BEGIN{ STDOUT="/dev/stdout"; - VERSION="0.2-beta-2"; + VERSION="0.2-beta-2b"; if (PRINTINTERNALS=="") { PRINTINTERNALS=0 } else { PRINTINTERNALS=1 } # defined on commandline? TMPDIR=""; DIASCOPE_WWW="http://diascope.sf.net"; @@ -3106,7 +3107,7 @@ SAVFILE_MODE=0; INFILE_MODE=1; # Settings for the generated path plots - PATHXRES=800; PATHFILL="white"; + PATHRES=800; PATHFILL="white"; PATHRECTFILL="white"; PATHRECTSTROKE="black"; PATHTEXTPS=12; PATHTEXTFILL="black"; PATHTEXTSTROKE="white"; @@ -3163,6 +3164,8 @@ printf(" echo -n \"-- Cleaning up...\"\n") >> SCRIPTF; printf(" if [ \"$1\" == \"0\" ]; then echo skipped!; exit; fi\n") >> SCRIPTF; printf(" find %s -name '%s*.%s' | xargs rm -f\n",TMPDIR,FRAMEPREFIX,FRMEXT) >> SCRIPTF; + printf(" find %s -name '%s*.%s' | xargs rm -f\n",TMPDIR,TOPFIELDPREFIX,FRMEXT) >> SCRIPTF; + printf(" find %s -name '%s*.%s' | xargs rm -f\n",TMPDIR,BOTFIELDPREFIX,FRMEXT) >> SCRIPTF; printf(" find %s -name '%s*.%s' | xargs rm -f\n",TMPDIR,FRAMEPREFIX,BAKEXT) >> SCRIPTF; printf(" rm -f %s*\n",TMPDIR "/" LUMAPREFIX) >> SCRIPTF; printf(" rm -f %s*.%s %s*.%s %s*.mpc %s*.cache\n",TMPDIR "/" CROPPREFIX,FRMEXT,TMPDIR "/" PATHPREFIX,PATHEXT, @@ -3305,7 +3308,7 @@ VOPTIONS[ndv,OPT_OSM],FMTSPEC[FMT_INTERLACED],VOPTIONS[ndv,OPT_RESIZE]); plot_path(ndv,VOPTIONS[ndv,OPT_NXYW],XYW,VIDEOFRAMES[ndv,FRM_EFFECT],CROPPATH, VOPTIONS[ndv,OPT_MIR],VOPTIONS[ndv,OPT_ROT],IMAGE[ndv,IMG_FILE], IMAGE[ndv,IMG_W], - FMTSPEC[FMT_ASPECTNUM],FMTSPEC[FMT_INTERLACED],NDVIDXTABLE); + IMAGE[ndv,IMG_H], FMTSPEC[FMT_ASPECTNUM],FMTSPEC[FMT_INTERLACED],NDVIDXTABLE); } else if (EFFECT[ndv]==EF_CREATE) { create(ndv,VIDEOFRAMES[ndv,FRM_EFFECT],VOPTIONS[ndv,OPT_MIR],VOPTIONS[ndv,OPT_ROT],