home *** CD-ROM | disk | FTP | other *** search
- ##mpgtx frontend for win32;
- ##require win32-gui 0.670 or higher.
-
- use Win32::MCI::Basic;
- use Win32::GUI;
- use Win32::API;
- $|=1;
-
- $Window=Win32::GUI::Window->new(-name=>'Main',-text=>'Mpgcutter',-size=>[558,364]);
- $Window->AddLabel(-name=>"Status1",-pos=>[4,4],-size=>[400,20],-text=>"Drop mpeg file.",);
- $Window->AddButton(-name=>"play",-pos=>[4,30],-text=>"play",);
- $Window->AddButton(-name=>"pause",-pos=>[44,30],-text=>"pause",);
- $Window->AddButton(-name=>"rev",-pos=>[104,30],-text=>"<",);
- $Window->AddButton(-name=>"ff",-pos=>[126,30],-text=>">",);
- $Window->AddButton(-name=>"frev",-pos=>[148,30],-text=>"<<",);
- $Window->AddButton(-name=>"fff",-pos=>[176,30],-text=>">>",);
- $Window->AddTextfield(-name=>"Textfield1",-pos=>[204,30],-size=>[80,20],);
- $Window->AddLabel(-name=>"Frame",-pos=>[286,32],-size=>[80,20],);
- $Window->AddSlider(-name=>"Slider",-pos=>[4,50],-size=>[400,50]);
- $Window->AddButton(-name=>"regist",-pos=>[404,4],-text=>"regist",);
- $Window->AddButton(-name=>"remove",-pos=>[404,24],-text=>"remove",);
- $Window->AddButton(-name=>"done",-pos=>[404,44],-text=>"done",);
- $Window->AddListbox(-name => "List1",-pos=>[454,4],-size=>[90,100],-menu =>1,-group=>1,-addstyle=>WS_VSCROLL,-sort=>1);
-
- #Get PlayMovies WindowHandle
- $Window->AddLabel(-name=>"ID",-pos=>[4,108],-visible=>1);
- $hwndx=$Window->ID->GetWindow(GW_HWNDLAST);
-
- #Movie is play on another window.
- #$hwndx=0;
-
- #### Enable DragDrop Only allwindow.
- $myhandle=$Window->{-handle};
- $DragAcceptFiles=new Win32::API('shell32', 'DragAcceptFiles', "II", "");
- $DragAcceptFiles->Call($myhandle,"1");
-
- ##set default window style.
- $Window->Textfield1->Text("1000");
- $Window->Slider->Min(0);$Window->Slider->Max(200);
- $Window->AddTimer('T1',50);
-
- $Window->Show();
- Win32::GUI::Dialog();
-
- ####GUI Events
-
- sub regist_Click{
- ($i,$mess)=mciSendString("status avi1 position");
- #end can't regist
- if ($mess ==$length){return;}
- #equal time can't regist
- $sel=$Window->List1->Count();$sel--;
- for(0..$sel){
- $eq = $Window->List1->GetString($_);$eq=$eq*1000;
- if ($eq == $mess){return;}
- }
- $mess=sprintf("%012.03f",($mess/1000));
- $Window->List1->AddString($mess);
- }
-
- sub Main_DropFiles{
- $file=shift;
- @data=&hndlview($file);
- # foreach (@data){print ":$_\n";}
- $fname=$data[0];
- # print "fname $fname\n";
- mciSendString("close avi1");
- mciSendString("open \"$fname\" alias avi1");
- mciSendString("set avi1 time format ms");
- mciSendString("window avi1 handle $hwndx");
- ($i,$buff)=mciSendString("status avi1 length");$length=$buff;
- ($i,$buff)=mciSendString("where avi1 source");
- # print "$buff\n";
- (undef,undef,$x,$y)=split(/ /,$buff);
- $Window->ID->Resize($x,$y);
- $view=sprintf("%12.03f [%03d,%03d] ",($length/1000),$x,$y);
- $view.=" $fname";
- $Window->Status1->Text("$view");
- $Window->List1->Reset();
- }
-
- ###Timer.. FrameNumber Update
- sub T1_Timer{
- if ($length <1){return;}
- ($i,$buff)=mciSendString("status avi1 position");
- $spos=int((200/$length)*$buff);$Window->Slider->Pos($spos);
- $buff3=sprintf("%12.03f",($buff/1000));
- $Window->Frame->Text($buff3);
- $Window->Update();
- }
-
- sub Main_Terminate{return -1;}
- sub play_Click{mciSendString("play avi1");}
- sub pause_Click{mciSendString("pause avi1");}
- sub rev_Click{&move_frame(-1);}
- sub ff_Click{&move_frame(1);}
- sub frev_Click{$step=$Window->Textfield1->Text;&move_frame(-$step);}
- sub fff_Click{$step=$Window->Textfield1->Text;&move_frame($step);}
-
- ####Frame seek
- sub move_frame{
- $set=shift;
- ($i,$mess)=mciSendString("status avi1 position");
- $mess=$mess+$set;
- mciSendString("seek avi1 to $mess");
- &T1_Timer;
- }
-
- sub Slider_Scroll {
- $mess=int(($Window->Slider->Pos)*($length/200));
- # print "Scroll $mess\n";
- mciSendString("seek avi1 to $mess");
- &T1_Timer;
- }
-
- sub remove_Click{
- $sel = $Window->List1->SelectedItem();
- # print "Remove $sel\n";
- if ($sel==-1){return;}
- $Window->List1->RemoveItem($sel);
- }
-
- sub List1_DblClick{
- $mess = $Window->List1->SelectedItem();
- $mess = $Window->List1->GetString($mess);
- $mess2=$mess*1000;
- mciSendString("seek avi1 to $mess2");
- &T1_Timer;
- }
-
- ###make result.bat and run.
- sub done_Click{
- open (DATA,">./result.bat");
- print DATA "mpgtx -s $fname ";
- $sel=$Window->List1->Count();$sel--;
- $mess = $Window->List1->GetString(0);
- if ($mess==0){
- $flug=0;$sels=1;
- }else{
- $flug=1;$sels=0;print DATA "[-";
- }
- $chunk=0;
- for($sels..$sel){
- $mess = $Window->List1->GetString($_);
- $mess=$mess*1000;
- ##time format convert
- $hour=int($mess/3600000);$mess=$mess-$hour*3600000;
- $min=int($mess/60000);$mess=$mess-$min*60000;
- $sec=int($mess/1000);$secs=$mess%1000;
- if ($flug==0){
- $flug=1;print DATA "\[$hour:$min:$sec\.$secs-";
- }else{
- $flug=0;print DATA "$hour:$min:$sec\] ";$chunk++;
- }
- }
- if ($flug==1){print DATA "\]";$chunk++;}
- #work file delete.
- unlink "chunk.mpg";
- # print "chunk $chunk\n";
- if ($chunk==1){
- ##only 1-file
- unlink "chunk.mpg";
- }else{
- print DATA "\n"."mpgtx -j ";
- for(1..$chunk){
- unlink "chunk-".$_.".mpg";
- print DATA "chunk-".$_.".mpg ";
- }
- }
- close (DATA);
-
- #run batch file
- system("result.bat");
- #rename.
- rename "chunk.mpg","$fname\.mpg";
- print "Successed.\n";
- }
-
- ####extract Dragdrop keyhandle
- sub hndlview{
- my @data;
- my $DragQueryFile =new Win32::API('shell32','DragQueryFileA',"NNPN","N");
- my $DragFinish =new Win32::API('shell32','DragFinish',"N","");
- my $hndl=shift;
- my $buffer=' 'x1024;
- my $no = $DragQueryFile->Call($hndl, 0xFFFFFFFF, $buffer,1024);
- $no--;
- for (0..$no){
- my $fname= $DragQueryFile->Call($hndl,$_,$buffer,1024);
- push (@data,substr($buffer,0,$fname));
- }
- $DragFinish->Call($hndl);
- return (@data);
- }
-