|
Bug Reports And Codecs Report BS.Player bugs here - help us to improve BS.Player even further. |
| LinkBack | Thread Tools | Search this Thread | Display Modes |
| |||
sdk: seek does't work (time>300 000msec) I've got a problem with the sdk. I want to seek to a special position. When seeking to a position up to about 250 000 (msec) everything works fine. But if a time of about 300 000 (msec) or larger is specified, there just happens nothing! (I am using Borland C++ Builder) Any ideas? Yours, Franz |
| |||
BSP_seek bug
Hi, I've got the same problem in Borland Delphi 5, 7: when send message with BSP_seek > 214748 - nothing happens. I use BSPlayer version 0.85 build 492, 11. Nov, 2002. Developers, any ideas? ;) P.S. I thought that this bug would fixed in build 492. Waiting for your raply (or fixing in next build). Thanks a lot! BSPlayer rulezz! :) But some bug must gone away... :) |
| |||
Re: BSP_seek bug Quote:
This problem is in BPlayer version 0.85 build 492, 11. Nov, 2002. in address: $4C0ED4 In this address we have two commands: IMUL EAX, [EBX + 8], 2710H CDQ these commands mul milliseconds ([EBX + 8]) on 2710. but it mul work incorrectly. I replace these commands to three: mov eax, [ebx+8] movzx edx, al xor al, al And all work! But now we must send to BSPlayer not milliseconds, see example: procedure TForm1.SeekTo(Position: Cardinal);// Milliseconds, real: (+- 256) var i: Int64; j: Cardinal; begin i := Int64(Position) * $2710; j := (i and $FFFFFF00) + (i shr 32); SendMessage(bsp_hand, WM_BSP_CMD, BSP_Seek, j); end; For patch BSPlayer I use WriteProcess. You can see full example below, it tested on Windows 2000, Delphi 5, and BPlayer version 0.85 build 492, 11. Nov, 2002. ---------------------------------------------------------------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } bsp_hand: HWND; PHandle: HWND; function RunPlayer(const PlayerStr, FileStr: string): Boolean; procedure SeekTo(Position: Cardinal);// Milliseconds, real: (+- 256) public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} uses bsp; procedure TForm1.Button1Click(Sender: TObject); begin SeekTo(60*60*1000); end; procedure TForm1.Button2Click(Sender: TObject); begin RunPlayer('c:\Program Files\BSPlayer\bplay.exe', 'd:\v\Harley.avi'); end; procedure TForm1.SeekTo(Position: Cardinal);// Milliseconds, real: (+- 256) var i: Int64; j: Cardinal; begin i := Int64(Position) * $2710; j := (i and $FFFFFF00) + (i shr 32); SendMessage(bsp_hand, WM_BSP_CMD, BSP_Seek, j); end; function TForm1.RunPlayer(const PlayerStr, FileStr: string): Boolean; const Patch: array[0..1] of Cardinal = ($0F08438B, $C030D0B6); // mov eax, [ebx+8] //3 // movzx edx, al //3 // xor al, al //2 var SInf: STARTUPINFO; PInf:PROCESS_INFORMATION; BytesCount: Cardinal; Buf: array[0..1] of Cardinal; RunStr: PChar; T: TDateTime; begin Result := False; if PHandle <> 0 then exit; GetMem(RunStr, Length(PlayerStr) + Length(FileStr) + 6); try StrPCopy(RunStr,'"' + PlayerStr + '" "' + FileStr + '"'); FillChar(SInf, SizeOf(SInf), 0); SInf.cb := SizeOf(SInf); if not CreateProcess(nil, RunStr, nil, nil, FALSE, CREATE_NEW_CONSOLE, nil, nil, SInf, PInf) then begin ShowMessage('Failed to run: ' + RunStr); exit; end; PHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PInf.dwProcessId); if PHandle = 0 then begin ShowMessage('Failed to open running process: ' + RunStr); exit; end; T := Time; repeat bsp_hand := FindWindow('BSPlayer', nil); Application.ProcessMessages; if Time - T > 1/24/60 then begin ShowMessage('Cannot find window for process: ' + RunStr); exit; end; until bsp_hand <> 0; if not ReadProcessMemory(PHandle, Pointer($4C0ED4), @Buf, 8, BytesCount) then begin ShowMessage('Failed to read process memory: ' + RunStr); exit; end; if BytesCount <> 8 then begin ShowMessage('Failed to read process memory: ' + RunStr); exit; end; if (Buf[0] <> $10084369) and (Buf[1] <> $99000027) then begin ShowMessage('Required only BSPlayer version 0.85 (C) 2000-2002 BST'+ #13#10'Build 492, 11 Nov, 2002.'); exit; end; if not WriteProcessMemory(PHandle, Pointer($4C0ED4), @Patch, 8, BytesCount) then begin ShowMessage('Failed to write process memory: ' + RunStr); exit; end; if BytesCount <> 8 then begin ShowMessage('Failed to write process memory: ' + RunStr); exit; end; Result := True; finally FreeMem(RunStr); end; end; procedure TForm1.FormCreate(Sender: TObject); begin PHandle := 0; end; procedure TForm1.FormDestroy(Sender: TObject); begin if PHandle = 0 then exit; TerminateProcess(PHandle, 0); end; end. |
Tags |
doest, sdk, seek, time>300 |
Thread Tools | Search this Thread |
Display Modes | |
| |