View suitable for videoplayer

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

View suitable for videoplayer

Howard Oh
Hi folks

What is the best way to implement a video player in Dolphin?

I currently using ImagePresenter for it. a series of bitmap is put
into the ImagePresenter as its model.

There is a need to call ...

    ImagePresenter>>model: aBimap

... at least 5 times per a second to make it a video player.

The problem is that imagePresenter(StaticBitmap) blinks too loud in repeated
model: calls.

Example:
i := ImagePresenter show.
b1 := Bitmap fromFile: '.....'.
b2 := Bitmap fromFile: '......'.
[[i model: b1. i model: b2]repeat] forkBack.

As you can see from the above example, whitened image is shown most of the
time and b1 b2 very brief.

Hwa Jong Oh


Reply | Threaded
Open this post in threaded view
|

Re: View suitable for videoplayer

Bill Schwab-2
Hwa Jong,

> What is the best way to implement a video player in Dolphin?
>
> I currently using ImagePresenter for it. a series of bitmap is put
> into the ImagePresenter as its model.
>
> There is a need to call ...
>
>     ImagePresenter>>model: aBimap
>
> ... at least 5 times per a second to make it a video player.

There are a couple of levels of overhead that will cause you problems.
First, Windows itself is not the fastest video handling system; it was
designed for cooperative multitasking and device independence, which is hard
to do at all let alone to do it fast.  In response, Microsoft created (and
in at least some places bought) DirectX and friends to provide a lower-level
interface to hardware with better performance as a result.

Even with very fast screen updates, you'll likely run into limits on how
quickly you can update the screen.  I'm no expert on the subject, but, my
understanding is that video playback gets a boost from identifying regions
that have changed significantly and updating only those areas of the image.
Finally, I doubt that Smalltalk is going to be quick enough to do all of the
low-level work.

With that said, Dolphin should be able to host a video playback view as an
ActiveX control.

Have a good one,

Bill

--
Wilhelm K. Schwab, Ph.D.
[hidden email]


Reply | Threaded
Open this post in threaded view
|

Re: View suitable for videoplayer

Alain Fischer-3
In reply to this post by Howard Oh
Long time ago there was a thread on the old newsgroup
(news.newcastle.ca/Dolphin.smalltalk) with an example
package from Andy.

Subject: Bitmap animation
Date: Wed, 18 Feb 1998 16:02:43 +0100

I have never tried the example but ask me if you want it,
I think I have it in my archive.

Have a nice day
Alain Fischer



"Hwa Jong Oh" <[hidden email]> a écrit dans le message news:
90hj3u$17im6$[hidden email]...

> Hi folks
>
> What is the best way to implement a video player in Dolphin?
>
> I currently using ImagePresenter for it. a series of bitmap is put
> into the ImagePresenter as its model.
>
> There is a need to call ...
>
>     ImagePresenter>>model: aBimap
>
> ... at least 5 times per a second to make it a video player.
>
> The problem is that imagePresenter(StaticBitmap) blinks too loud in
repeated

> model: calls.
>
> Example:
> i := ImagePresenter show.
> b1 := Bitmap fromFile: '.....'.
> b2 := Bitmap fromFile: '......'.
> [[i model: b1. i model: b2]repeat] forkBack.
>
> As you can see from the above example, whitened image is shown most of the
> time and b1 b2 very brief.
>
> Hwa Jong Oh
>
>


Reply | Threaded
Open this post in threaded view
|

Re: View suitable for videoplayer

Howard Oh
Alain,

There was? I'm very interested to see it.
Could you look it for me in the archive?
I have a deadline of 3 more hours. Please post them quick
if you can.

Best Regards
Hwa Jong Oh

Alain Fischer <[hidden email]>ÀÌ(°¡) ¾Æ·¡ ¸Þ½ÃÁö¸¦
news:[hidden email]¿¡ °Ô½ÃÇÏ¿´½À´Ï´Ù.

> Long time ago there was a thread on the old newsgroup
> (news.newcastle.ca/Dolphin.smalltalk) with an example
> package from Andy.
>
> Subject: Bitmap animation
> Date: Wed, 18 Feb 1998 16:02:43 +0100
>
> I have never tried the example but ask me if you want it,
> I think I have it in my archive.
>
> Have a nice day
> Alain Fischer
>
>
>
> "Hwa Jong Oh" <[hidden email]> a ?rit dans le message news:
> 90hj3u$17im6$[hidden email]...
> > Hi folks
> >
> > What is the best way to implement a video player in Dolphin?
> >
> > I currently using ImagePresenter for it. a series of bitmap is put
> > into the ImagePresenter as its model.
> >
> > There is a need to call ...
> >
> >     ImagePresenter>>model: aBimap
> >
> > ... at least 5 times per a second to make it a video player.
> >
> > The problem is that imagePresenter(StaticBitmap) blinks too loud in
> repeated
> > model: calls.
> >
> > Example:
> > i := ImagePresenter show.
> > b1 := Bitmap fromFile: '.....'.
> > b2 := Bitmap fromFile: '......'.
> > [[i model: b1. i model: b2]repeat] forkBack.
> >
> > As you can see from the above example, whitened image is shown most of
the
> > time and b1 b2 very brief.
> >
> > Hwa Jong Oh
> >
> >
>
>


Reply | Threaded
Open this post in threaded view
|

Re: View suitable for videoplayer

Alain Fischer-3
Have fun with this ...
Alain Fischer



"Hwa Jong Oh" <[hidden email]> a écrit dans le message news:
90joaq$18v5v$[hidden email]...

> Alain,
>
> There was? I'm very interested to see it.
> Could you look it for me in the archive?
> I have a deadline of 3 more hours. Please post them quick
> if you can.
>
> Best Regards
> Hwa Jong Oh
>
> Alain Fischer <[hidden email]>ÀÌ(°¡) ¾Æ·¡ ¸Þ½ÃÁö¸¦
> news:[hidden email]¿¡ °Ô½ÃÇÏ¿´½À´Ï´Ù.
> > Long time ago there was a thread on the old newsgroup
> > (news.newcastle.ca/Dolphin.smalltalk) with an example
> > package from Andy.
> >
> > Subject: Bitmap animation
> > Date: Wed, 18 Feb 1998 16:02:43 +0100
> >
> > I have never tried the example but ask me if you want it,
> > I think I have it in my archive.
> >
> > Have a nice day
> > Alain Fischer
> >
> >
> >
> > "Hwa Jong Oh" <[hidden email]> a ?rit dans le message news:
> > 90hj3u$17im6$[hidden email]...
> > > Hi folks
> > >
> > > What is the best way to implement a video player in Dolphin?
> > >
> > > I currently using ImagePresenter for it. a series of bitmap is put
> > > into the ImagePresenter as its model.
> > >
> > > There is a need to call ...
> > >
> > >     ImagePresenter>>model: aBimap
> > >
> > > ... at least 5 times per a second to make it a video player.
> > >
> > > The problem is that imagePresenter(StaticBitmap) blinks too loud in
> > repeated
> > > model: calls.
> > >
> > > Example:
> > > i := ImagePresenter show.
> > > b1 := Bitmap fromFile: '.....'.
> > > b2 := Bitmap fromFile: '......'.
> > > [[i model: b1. i model: b2]repeat] forkBack.
> > >
> > > As you can see from the above example, whitened image is shown most of
> the
> > > time and b1 b2 very brief.
> > >
> > > Hwa Jong Oh
> > >
> > >
> >
> >
>
>
























begin 666 BitmapAnimationShell.cls
M(D9I;&5D(&]U="!F<F]M($1O;'!H:6X@4VUA;&QT86QK+SDX(')E;&5A<V4@
M,2XP(B$-"@T*4VAE;&Q6:65W('-U8F-L87-S.B C0FET;6%P06YI;6%T:6]N
M4VAE;&P-"@EI;G-T86YC959A<FEA8FQE3F%M97,Z("=F;W)E0FET<R!B86-K
M0FET<R!R861I86YS(&%N:6UA=&EO;E!R;V-E<W,G#0H)8VQA<W-687)I86)L
M94YA;65S.B G)PT*"7!O;VQ$:6-T:6]N87)I97,Z("<G(0T*#0I":71M87!!
M;FEM871I;VY3:&5L;"!C;&%S<R!I;G-T86YC959A<FEA8FQE3F%M97,Z("<G
M(0T*#0I":71M87!!;FEM871I;VY3:&5L;"!C;VUM96YT.B G)R$-"@T*(4)I
M=&UA<$%N:6UA=&EO;E-H96QL(&-A=&5G;W)I97-&;W)#;&%S<R%.;R!C871E
M9V]R>2$@(0T*#0HA0FET;6%P06YI;6%T:6]N4VAE;&P@;65T:&]D<T9O<B$-
M"@T*8V]M<&]S94)A8VLZ(&%#86YV87,-"@DB0V]M<&]S92!T:&4@<V-E;F4@
M:6YT;R!T:&4@8F%C:V=R;W5N9"!C86YV87,L(&%#86YV87,N(%1H:7,@:7,@
M=&AE(&UE=&AO9"!R97-P;VYS:6)L92!F;W(@<F5N9&5R:6YG#0H)=&AE('-C
M96YE+B!(97)E('=E(&IU<W0@;6]V92!S;VUE('1E>'0@86)O=70B#0H-"@E\
M(&]R:6=I;B!P;W,@<F%D:75S('P-"@EO<FEG:6X@.CT@<V5L9B!C;&EE;G12
M96-T86YG;&4@8V5N=&5R+@T*"7)A9&EA;G,@.CT@<F%D:6%N<R K("A&;&]A
M="!P:2HR("\S-C I+@T*"7)A9&EU<R Z/2 Q,# N#0H)<&]S(#H]("@H<F%D
M:6%N<R!S:6XI($ @*')A9&EA;G,@8V]S*2DJ<F%D:75S*V]R:6=I;BX-"@EA
M0V%N=F%S( T*"0EF;VYT.B H1F]N="!N86UE.B G5&EM97,@3F5W(%)O;6%N
M)R!P;VEN=%-I>F4Z(#(T*3L-"@D)=&5X=#H@)TAE;&QO('=O<FQD)R!A=#H@
M<&]S(')O=6YD960N(0T*#0IC;VUP;W-E4V-E;F4-"@DB0V]M<&]S92!T:&4@
M<V-E;F4N(%=E(&5X<&QI8VET;'D@9G)E92!T:&4@8V%N=F%S(')A=&AE<B!T
M:&%N(&%L;&]W:6YG#0H)9V%R8F%G92!C;VQL96-T:6]N('1O(&1O('1H:7,@
M<VEN8V4@=&AI<R!M971H;V0@:7,@;&EA8FQE('1O(&)E(&-A;&QE9"!V97)Y
M(&9R97%U96YT;'DN(%1H:7,-"@EW:6QL(&%V;VED('1E;7!O<F%R:6QY(&%C
M8W5M=6QA=&EN9R!L87)G92!A;6]U;G1S(&]F(&=A<F)A9V4@(@T*#0H)?"!C
M86YV87,@? T*"6-A;G9A<R Z/2!B86-K0FET<R!C86YV87,N#0H)<V5L9B!E
M<F%S94)A8VLZ(&-A;G9A<RX-"@ES96QF(&-O;7!O<V5"86-K.B!C86YV87,N
M#0H)8V%N=F%S(&9R964N#0H)<V5L9B!F;&EP+B$-"@T*97)A<V5"86-K.B!A
M0V%N=F%S#0H)(D5R87-E('1H92!B86-K9W)O=6YD(&)I=',@:6X@84-A;G9A
M<R!T;R!W:&ET92XB#0H-"@EA0V%N=F%S(&9I;&Q296-T86YG;&4Z('-E;&8@
M8VQI96YT4F5C=&%N9VQE(&)R=7-H.B!"<G5S:"!W:&ET92XA#0H-"F9L:7 -
M"@DB1FQI<',@8F%C:V=R;W5N9"!A;F0@9F]R96=R;W5N9"!B:71M87!S(&%N
M9"!C875S92!T:&4@;F5W(&9O<F5G<F]U;F0@=&\@8F4@<&%I;G1E9"(-"@T*
M"7P@=&5M<"!C86YV87,@? T*"71E;7 @.CT@9F]R94)I=',N#0H)9F]R94)I
M=',@.CT@8F%C:T)I=',N#0H)8F%C:T)I=',@.CT@=&5M<"X-"@T*"6-A;G9A
M<R Z/2!S96QF(&-A;G9A<RX-"@EF;W)E0FET<R!D<F%W3VXZ(&-A;G9A<RX-
M"@EC86YV87,@9G)E90T*(0T*#0II;FET:6%L:7IE#0H)(E!R:79A=&4@+2!)
M;FET:6%L:7IE('1H92!R96-E:79E<B(-"@T*"7-U<&5R(&EN:71I86QI>F4N
M#0H)<F%D:6%N<R Z/2 P(0T*#0IO;D1E<W1R;WEE9 T*"2)497)M:6YA=&4@
M=&AE(&%N:6UA=&EO;B!P<F]C97-S(@T*#0H)86YI;6%T:6]N4')O8V5S<R!T
M97)M:6YA=&4N#0H)<W5P97(@;VY$97-T<F]Y960N#0HA#0H-"F]N4&%I;G12
M97%U:7)E9#H@85!A:6YT179E;G0-"@DB4&%I;G0@=&AE(&)A8VMG<F]U;F0@
M8FET;6%P(@T*#0H)?"!C86YV87,@? T*"6-A;G9A<R Z/2!A4&%I;G1%=F5N
M="!C86YV87,N#0H)9F]R94)I=',@9')A=T]N.B!C86YV87,N#0H)8V%N=F%S
M(&9R964-"@DA#0H-"F]N4F5S:7IE9#H@85-I>F5%=F5N= T*"2)4:&4@<F5C
M96EV97(@:&%S(&)E96X@<F5S:7IE9#L@<V5T('5P(&$@8F%C:V=R;W5N9"!B
M:71M87 @;V8@=&AE(&%P<')O<')I871E('-I>F4B#0H-"@ES=7!E<B!O;E)E
M<VEZ960Z(&%3:7IE179E;G0N#0H)8F%C:T)I=',@.CT@0FET;6%P(&-O;7!A
M=&EB;&4Z('-E;&8@8V%N=F%S('=I9'1H.B!A4VEZ945V96YT('=I9'1H(&AE
M:6=H=#H@85-I>F5%=F5N="!H96EG:'0N#0H)9F]R94)I=',@.CT@0FET;6%P
M(&-O;7!A=&EB;&4Z('-E;&8@8V%N=F%S('=I9'1H.B!A4VEZ945V96YT('=I
M9'1H(&AE:6=H=#H@85-I>F5%=F5N="!H96EG:'0N#0H-"@EA;FEM871I;VY0
M<F]C97-S(&ES3FEL(&EF5')U93H@6PT*"0EA;FEM871I;VY0<F]C97-S(#H]
M(%M;<V5L9B!C;VUP;W-E4V-E;F4N(%!R;V-E<W-O<B!S;&5E<#H@,3 P72!R
M97!E870@72!F;W)K070Z(%!R;V-E<W-O<B!U<V5R0F%C:V=R;W5N9%!R:6]R
M:71Y(%TN(2 A#0H-"B%":71M87!!;FEM871I;VY3:&5L;"!C871E9V]R:65S
M1F]R.B C8V]M<&]S94)A8VLZ(6]P97)A=&EO;G,A("$-"B%":71M87!!;FEM
M871I;VY3:&5L;"!C871E9V]R:65S1F]R.B C8V]M<&]S95-C96YE(6]P97)A
M=&EO;G,A("$-"B%":71M87!!;FEM871I;VY3:&5L;"!C871E9V]R:65S1F]R
M.B C97)A<V5"86-K.B%O<&5R871I;VYS(2 A#0HA0FET;6%P06YI;6%T:6]N
M4VAE;&P@8V%T96=O<FEE<T9O<CH@(V9L:7 A;W!E<F%T:6]N<R$@(0T*(4)I
M=&UA<$%N:6UA=&EO;E-H96QL(&-A=&5G;W)I97-&;W(Z("-I;FET:6%L:7IE
M(6YO(&-A=&5G;W)Y(2 A#0HA0FET;6%P06YI;6%T:6]N4VAE;&P@8V%T96=O
M<FEE<T9O<CH@(V]N1&5S=')O>65D(65V96YT(&AA;F1L:6YG(2 A#0HA0FET
M;6%P06YI;6%T:6]N4VAE;&P@8V%T96=O<FEE<T9O<CH@(V]N4&%I;G1297%U
M:7)E9#HA979E;G0@:&%N9&QI;F<A("$-"B%":71M87!!;FEM871I;VY3:&5L
M;"!C871E9V]R:65S1F]R.B C;VY297-I>F5D.B%E=F5N="!H86YD;&EN9R$@
%(0T*#0H`
`
end


Reply | Threaded
Open this post in threaded view
|

Re: View suitable for videoplayer

Howard Oh
In reply to this post by Alain Fischer-3
Alain Fischer,

Filed Out Class 'BitmapAnimationShell' attached at your mail,
had some problems some are serious some are minor.

I have fixed some features and wants to post it here.

Problems found in the original version was:
[1] BitmapAnimationShell is a subclass of a ShellView. Therefore,
Its name is quite confusing. So I renamed it "BitmapAnimationShellView"
[2] #onResized: method is not included is the pure image since 3.05.
BitmapAnimationShell is triggered by #onResized. BitmapAnimationShell won't
be started.
So I added #wmResize:lParam:wParam: to the class to get it triggered.
[3] "animationProcess terminate" message will make error if there hasn't
been any process triggered. So I fixed like this;
(animationProcess isKindOf: Process) ifTrue: [ animationProcess terminate ].
[4] Canvas>>font: method is very dangers if called many times rapidly.
BitmapAnimationShell is the case. Canvas>>font: will
consume font resource each time called.
Font of the canvas must be stored before the Canvas>>font:
action, and it must be return after the action.

#composeBack:
...
oldFont := aCanvas font.
 aCanvas
  font: (Font name: 'Times New Roman' pointSize: 24);
  text: 'Hello world' at: pos rounded.
 aCanvas font: oldFont

Have a good one
Hwa Jong Oh

==============<BEGIN:BitmapAnimationShellView.cls>==============
"Filed out from Dolphin Smalltalk 99 release 3.0"!

ShellView subclass: #BitmapAnimationShellView
 instanceVariableNames: 'foreBits backBits radians animationProcess'
 classVariableNames: ''
 poolDictionaries: ''!

BitmapAnimationShellView class instanceVariableNames: ''!

BitmapAnimationShellView comment: ''!

BitmapAnimationShellView guid: (GUID fromString:
'{D7CA0A20-CBD2-11D4-A7B9-0050DAC5AC82}')!

!BitmapAnimationShellView categoriesForClass!No category! !

!BitmapAnimationShellView methodsFor!

composeBack: aCanvas
 "Compose the scene into the background canvas, aCanvas. This is the method
responsible for rendering
 the scene. Here we just move some text about"

 | origin pos radius oldFont|
 origin := self clientRectangle center.
 radians := radians + (Float pi*2 /360).
 radius := 100.
 pos := ((radians sin) @ (radians cos))*radius+origin.
 oldFont := aCanvas font.
 aCanvas
  font: (Font name: 'Times New Roman' pointSize: 24);
  text: 'Hello world' at: pos rounded.
 aCanvas font: oldFont!

composeScene
 "Compose the scene. We explicitly free the canvas rather than allowing
 garbage collection to do this since this method is liable to be called very
frequently. This
 will avoid temporarily accumulating large amounts of garbage "

 | canvas |
 canvas := backBits canvas.
 self eraseBack: canvas.
 self composeBack: canvas.
 canvas free.
 self flip.!

eraseBack: aCanvas
 "Erase the background bits in aCanvas to white."

 aCanvas fillRectangle: self clientRectangle brush: Brush white.!

flip
 "Flips background and foreground bitmaps and cause the new foreground to be
painted"

 | temp canvas |
 temp := foreBits.
 foreBits := backBits.
 backBits := temp.

 canvas := self canvas.
 foreBits drawOn: canvas.
 canvas free
!

initialize
 "Private - Initialize the receiver"

 super initialize.
 radians := 0!

model: aBitmap

 "ºñÆ®¸ÊÀ» backBits¿¡ ÀúÀå(º¹»ç)ÇÏ°í flip½ÃŲ´Ù"
 super model: aBitmap!

onDestroyed
 "Terminate the animation process"

 (animationProcess isKindOf: Process) ifTrue: [ animationProcess
terminate ].
 super onDestroyed.
!

onPaintRequired: aPaintEvent
 "Paint the background bitmap"

 | canvas |
 foreBits isNil
  ifFalse:
  [canvas := aPaintEvent canvas.
  foreBits drawOn: canvas.
  canvas free]
 !

onResized: aSizeEvent
 "The receiver has been resized; set up a background bitmap of the
appropriate size"

 "super onResized: aSizeEvent."
 backBits := Bitmap compatible: self canvas width: aSizeEvent width height:
aSizeEvent height.
 foreBits := Bitmap compatible: self canvas width: aSizeEvent width height:
aSizeEvent height.

 animationProcess isNil ifTrue: [
  animationProcess := [[self composeScene. Processor sleep: 100] repeat ]
forkAt: Processor userBackgroundPriority ].!

wmSize: message wParam: wParam lParam: lParam
 "Private - Default handler for a WM_SIZE (window resized) message."

 super wmSize: message wParam: wParam lParam: lParam.
 self onResized: (SizeEvent message: message handle: handle wParam: wParam
lParam: lParam)! !

!BitmapAnimationShellView categoriesFor: #composeBack:!operations!public! !
!BitmapAnimationShellView categoriesFor: #composeScene!operations!public! !
!BitmapAnimationShellView categoriesFor: #eraseBack:!operations!public! !
!BitmapAnimationShellView categoriesFor: #flip!operations!public! !
!BitmapAnimationShellView categoriesFor: #initialize!*-unclassified!public!
!
!BitmapAnimationShellView categoriesFor: #model:!*-unclassified!public! !
!BitmapAnimationShellView categoriesFor: #onDestroyed!event handling!public!
!
!BitmapAnimationShellView categoriesFor: #onPaintRequired:!event
handling!public! !
!BitmapAnimationShellView categoriesFor: #onResized:!event handling!public!
!
!BitmapAnimationShellView categoriesFor: #wmSize:wParam:lParam:!event
handling!event handling-win32!private! !



==============<END:BitmapAnimationShellView.cls>================


Reply | Threaded
Open this post in threaded view
|

Re: View suitable for videoplayer

Blair McGlashan
In reply to this post by Howard Oh
Hwa Jong Oh

You wrote in message news:90hj3u$17im6$[hidden email]...
>
> What is the best way to implement a video player in Dolphin?
>...

The "best" way in D4 (or at least the one which makes best use of existing
code, rather than reinventing it) would be to use an Active-X control, e.g.
the Windows Media Player, or the Microsoft Multimedia control. The latter
is, I think, just an OCX wrapper around the Windows MCI control, intended so
that it can be accessed from VB, and a ControlView subclass could be added
to D3 which interfaces to it (the MCI control) directly; search for MCIWnd
on MSDN.

Regards

Blair