List Info

Thread: Packets pile up in STREAM_INFO:: m_EventList due to Rebuffering.




Packets pile up in STREAM_INFO:: m_EventList due to Rebuffering.
user name
2006-08-29 16:52:22
At 05:43 AM 8/29/2006, a Vivek Dabas wrote:
>Hello Greg and Milko,
>
>Thanks for your response. We are trying to characterise
the devsound 
>implementation on our platform so that we can say for
certain that problem 
>exist in the devsound on our platform.

The code in Helix symbian audio device contains code that
tries to 
compensate for DevSound issues.  We found that different
type of 
compensation was needed for different versions. When
reviewing, you should 
consider DevSound and Helix Symbian audio device
implementation as the 
interaction between the two is responsible for the resulting
time-line.

>But there is one more observation that suggest us
something else too.
>I checked out latest neptunex 130 branch and tried to
play the same audio 
>file over series 60 SDK.
>I got almost the same results over this SDK also.
>The playback became choppy after arround 8-9 minutes of
playback. It gets 
>marred by frequent pause/resume/rebuffering.
>In one test i even seeked the file to the middle and
then allowed it to 
>playback. Here also it gets choppy after 8-9 minutes and
frequent 
>pause/resume/rebuffering.
>Ultimately the emulator crashes after doing arround 15
minutes of playback.

This is still consistent with audio device subsystem having
issues - which 
has historically been the case on Symbian SDKs.
Also keep in mind that emulator has much lower timing
granularity than the 
device which can make it more sensitive to time-line jitter
given that in 
mobile profile the post-decode buffers are significantly
reduced.

>
>Thanks,
>vivek
>
>________________________________
>
>From: helix-client-dev-bounceshelixcommunity.org on
behalf of 
>helix-client-dev-requesthelixcommunity.org
>Sent: Mon 8/28/2006 2:05 PM
>To: helix-client-devhelixcommunity.org
>Subject: Helix-client-dev Digest, Vol 31, Issue 48
>
>
>
>Send Helix-client-dev mailing list submissions to
>         helix-client-devhelixcommunity.org
>
>To subscribe or unsubscribe via the World Wide Web,
visit
>         http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev
>or, via email, send a message with subject or body
'help' to
>         helix-client-dev-requesthelixcommunity.org
>
>You can reach the person managing the list at
>         helix-client-dev-ownerhelixcommunity.org
>
>When replying, please edit your Subject line so it is
more specific
>than "Re: Contents of Helix-client-dev
digest..."
>
>
>Today's Topics:
>
>    1. what is the input file format for rv40dec (Kiger
Zhang)
>    2. Multiple instances of helix player Query. (a
Vivek Dabas)
>    3. Re: Packets pile up in STREAM_INFO:: m_EventList 
due     to
>       rebuffering. (Greg Wright)
>    4. Re: Fwd: [Helix-client-dev] what is the input
file format for
>       rv40dec (Karl Lillevold)
>    5. Re: Packets pile up in STREAM_INFO::     
m_EventList due to
>       rebuffering. (Milko Boic)
>    6. CR-Client: Core start performance (Milko Boic)
>
>
>--------------------------------------------------------
--------------
>
>Message: 1
>Date: Thu, 24 Aug 2006 14:18:24 +0800
>From: "Kiger Zhang" <kiger.zhanggmail.com>
>Subject: [Helix-client-dev] what is the input file
format for rv40dec
>To: helix-client-devhelixcommunity.org
>Message-ID:
>        
<ea257a250608232318x353b0b29ma84f5371be688c52mail.gmail.com>
>Content-Type: text/plain;
charset="iso-8859-1"
>
>Hi  all,
>
>I build the  client, get the executable
"rv40dec" file .
>I want to do a test for it, But what is the input format
for it?
>
>I checked some document, it indicated that the input
file for rv40dec is the
>compessed  RM video data. But I am not sure it is just
the packet data get
>from RM file
>or need to add  additional info into it.
>
>Thanks!
>
>Kiger
>-------------- next part --------------
>An HTML attachment was scrubbed...
>URL: 
>htt
p://lists.helixcommunity.org/pipermail/helix-client-dev/atta
chments/20060824/f3bf677f/attachment-0001.html
>
>------------------------------
>
>Message: 2
>Date: Thu, 24 Aug 2006 02:07:04 -0700
>From: "a Vivek Dabas" <dabaspv.com>
>Subject: [Helix-client-dev] Multiple instances of helix
player Query.
>To: <helix-client-devhelixcommunity.org>
>Message-ID:
<D3099360D13C2F4F8F3C12EADC7A346A0D925742srsdmail.pv.com>
>Content-Type: text/plain;
charset="iso-8859-1"
>
>Hello Everyone,
>
>On our Platform there is a possibility in Media player
wherein when one 
>real media file is being played back
>through helix mmf controller, the user can go the file
list view and can 
>choose to view the information about other
>files present on the phone. Its a Symbian OS phone.
>
>When i try to do it with helix mmf player, i get a
crash.
>I have tried to debug and this is what i understand.
>1. This media player application is a process. It loads
the helix 
>controller and starts playing an rm file.
>2. When helix controller is playing back one file it is
running in one 
>thread in the process and has loaded
>    the helix engine and otther dlls needed to play the
file.
>3. Media player lets the user to go a different file
list view when file 
>is playing back and allows the user to
>    view the file meta data.
>4. To view the meta data, helix controller has to be
loaded again. This 
>will create one more thread and controller
>    tries to load helix engine once again since to know
the meta data of 
> the file, the engine has to be loaded again.
>5. When the helix controller tries to load the helix
engine, 
>HXPlayer::HXPlayer() gets executed which calls
>    CHXSiteManager::CHXSiteManager(). This function
calls HXGlobalInt32::Get.
>    Finally this loading crashes at GlobalPtr 
> HXGlobalManager::Get(GlobalID id)
>
>The error reported is KERN-EXEC 3.
>Please let me know if the design of helix player
especially global manager 
>stuff can allow such a thing to execute fine.
>I guess it is like having two instances of helix player
running in two 
>threads but in the same process.
>How is global manager implementation broken in this
case?
>How can i resolve this issue?
>
>thanks,
>vivek
>
>
>-------------- next part --------------
>An HTML attachment was scrubbed...
>URL: 
>htt
p://lists.helixcommunity.org/pipermail/helix-client-dev/atta
chments/20060824/3a7d7ceb/attachment-0001.html
>
>------------------------------
>
>Message: 3
>Date: Thu, 24 Aug 2006 12:17:56 -0700
>From: Greg Wright <gwrightreal.com>
>Subject: Re: [Helix-client-dev] Packets pile up in
STREAM_INFO::
>         m_EventList     due     to rebuffering.
>To: a Gaurav Mahendroo <mgauravpv.com>
>Cc: helix-client-devhelixcommunity.org
>Message-ID: <44EDFB64.4090004real.com>
>Content-Type: text/plain; charset=ISO-8859-1;
format=flowed
>
>a Gaurav Mahendroo wrote:
> > hello Greg and Milko,
> >
> > Thanks for responding.
> > I am also working on this problem with vivek.
> > I have taken logs as asked by you. I have attached
logs.zip.
> > It has following two files :
> > 1. audio_logs.txt- logs taken for an audio only
file.
> > 2. video_logs.txt- logs for A/V file.
> >
> > I have tried the fix suggested by Milko. It works
fine for the audio
> > only file. The memory allocation remains under
control and I can play
> > the full file but with a lot of pauses due to
rebuffer.
> > As vivek has written, "At the time of the
log, aTotalAllocSize  tells
> > the total memory consumed by the engine
thread"
> > But in case of A/V still keeps on accumulating
somewhere and ultimately
> > it consumes 4MB of memory.
> >
> > I have put logs in SendPacket as asked by Milko,
for eg.
> >
> > HXPlayer::SendPacket Enter PlayBackTime()=180415
timestamp=183902
> >
> > Also, I have put a logging statement as asked by
you
> > HXSymbianAudioSession::GetTime() nMSTime=183642
m_msTimePlayed=181751
> >
> > where nMSTime
> > nMSTime =  m_ulPauseTime
+HX_GET_TICKCOUNT()-m_ulStartTime ;
> > and
> > m_msTimePlayed is the time to be returned from
GetCurrentAudioTime()
>
>I am not sure about ::GetTime, but if it is indeed the
same as
>putting a printf in GetCurrentAudioTime, then you have a
problem.
>
>There is no way you will get good playback with a clock
that
>becomes divergent to over 3.5 seconds that quickly. 3.5
seconds
>of data (audio and video) in the system is a lot.
>
>You need to look into why this is happening before
anything else.
>
>--greg.
>
> >
> > We can see these two  timestamps diverging over
time. In case of A/V
> > file these diverge a lot and playback is very
choppy.
> > Please, have a look at the attached logs .
> >
> > Thanks and regards,
> > Gaurav Mahendroo
> >
> >
> >
> >
------------------------------------------------------------
------------
> >
> > _______________________________________________
> > Helix-client-dev mailing list
> > Helix-client-devhelixcommunity.org
> > http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev
>
>
>
>------------------------------
>
>Message: 4
>Date: Thu, 24 Aug 2006 12:22:06 -0700
>From: Karl Lillevold <karllreal.com>
>Subject: Re: Fwd: [Helix-client-dev] what is the input
file format for
>         rv40dec
>To: kiger.zhanggmail.com, helix-client-devhelixcommunity.org
>Message-ID: <44EDFC5E.40208real.com>
>Content-Type: text/plain; charset=ISO-8859-1
>
>Hi,
>
>Please see this FAQ
>ht
tps://rarvcode-video.helixcommunity.org/faq.html
>regarding the raw bitstream decoder testapp.
>
>Karl.
>
>
>Milko Boic wrote:
> >
> > Carl, can you answer this one?
> >
> > Thanks,
> > Milko
> >
> >
> >> X-Spam-Checker-Version: SpamAssassin 3.1.1
(2006-03-10) on jor-el.real.com
> >> X-Spam-Level:
> >> X-Spam-Status: No, score=-2.6 required=5.0
tests=BAYES_00,HTML_MESSAGE
> >>          autolearn=ham version=3.1.1
> >> Delivered-To: milkoreal.com
> >> DomainKey-Signature: a=rsa-sha1; q=dns;
c=nofws; s=beta; d=gmail.com;
> >>
> >>
h=received:message-id:date:from:to:subject:mime-version:cont
ent-type;
> >>
> >> 
>
b=RN5/zPCB+2mSDDFSoUzpBLAUOq/GvxMYRyNjpJCrKzNwaG8y058oVy7Cdf
EvzjAbBC3eMOptDXWClggNRFv4Gyz9RbO0MTe6/2OFJhNH84sWPqXy9i+dGL
SMVjFyC2J4D1uMTYhI+FMpw7/RK3Ev9X4GllTiga8mOZboImJa4Ck=
> >> Date: Thu, 24 Aug 2006 14:18:24 +0800
> >> From: "Kiger Zhang"
<kiger.zhanggmail.com>
> >> To: helix-client-devhelixcommunity.org
> >> Subject: [Helix-client-dev] what is the input
file format for rv40dec
> >> X-BeenThere: helix-client-devhelixcommunity.org
> >> X-Mailman-Version: 2.1.5
> >> List-Id: "Main developer discussion list
for the Helix DNA Client. "
> >>         
<helix-client-dev.helixcommunity.org>
> >> List-Unsubscribe: <
> >> http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev >,
> >>          <
> >> mailto:helix-client-dev-requesthelixcommunity.org?subject=unsubscribe
> >> <mailto:helix-client-dev-requesthelixcommunity.org%3Fsubject=unsubscribe>
> >> >
> >> List-Archive: <
> >> http://lists.helixcommunity.org/pipermail/helix-cl
ient-dev>
> >> List-Post: < mailto:helix-client-devhelixcommunity.org>
> >> List-Help: <
> >> mailto:helix-client-dev-requesthelixcommunity.org?subject=help
> >> <mailto:helix-client-dev-requesthelixcommunity.org%3Fsubject=help> >
> >> List-Subscribe: <
> >> http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev >,
> >>          <
> >> mailto:helix-client-dev-requesthelixcommunity.org?subject=subscribe
> >> <mailto:helix-client-dev-requesthelixcommunity.org%3Fsubject=subscribe> >
> >> Sender: helix-client-dev-bounceshelixcommunity.org
> >> X-PMX-Version: 4.7.0.111621, Antispam-Engine:
2.4.0.264935,
> >> Antispam-Data: 2006.8.23.225443
> >> X-PerlMx-Spam: Gauge=IIIIIII, Probability=7%,
Report='HTML_70_90 0.1,
> >> __CP_MEDIA_BODY 0, __CP_URI_IN_BODY 0, __CT 0,
__CTYPE_HAS_BOUNDARY 0,
> >> __CTYPE_MULTIPART 0, __HAS_MSGID 0,
__MIME_HTML 0, __MIME_VERSION 0,
> >> __SANE_MSGID 0, __STOCK_CRUFT 0'
> >>
> >> Hi  all,
> >>
> >> I build the  client, get the executable
"rv40dec" file .
> >> I want to do a test for it, But what is the
input format for it?
> >>
> >> I checked some document, it indicated that the
input file for rv40dec
> >> is the
> >> compessed  RM video data. But I am not sure it
is just the packet data
> >> get from RM file
> >> or need to add  additional info into it.
> >>
> >> Thanks!
> >>
> >> Kiger
> >>
_______________________________________________
> >> Helix-client-dev mailing list
> >> Helix-client-devhelixcommunity.org
> >> http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev
> >
>
>
>
>------------------------------
>
>Message: 5
>Date: Thu, 24 Aug 2006 13:23:49 -0700
>From: Milko Boic <milkoreal.com>
>Subject: Re: [Helix-client-dev] Packets pile up in
STREAM_INFO::
>         m_EventList due to rebuffering.
>To: "a Gaurav Mahendroo" <mgauravpv.com>,
>         helix-client-devhelixcommunity.org
>Message-ID: <6.2.1.2.2.20060824130923.0b9c7ea8mailone.real.com>
>Content-Type: text/plain; charset="us-ascii"
>
>At 07:08 PM 8/23/2006, a Gaurav Mahendroo wrote:
> >hello Greg and Milko,
> >
> >Thanks for responding.
> >I am also working on this problem with vivek.
> >I have taken logs as asked by you. I have attached
logs.zip.
> >It has following two files :
> >1. audio_logs.txt- logs taken for an audio only
file.
> >2. video_logs.txt- logs for A/V file.
> >
> >I have tried the fix suggested by Milko. It works
fine for the audio only
> >file. The memory allocation remains under control
and I can play the full
> >file but with a lot of pauses due to rebuffer.
> >As vivek has written, "At the time of the
log, aTotalAllocSize  tells the
> >total memory consumed by the engine thread"
> >But in case of A/V still keeps on accumulating
somewhere and ultimately it
> >consumes 4MB of memory.
>
>This behavior is consistent with the theory that your
audio device is
>under-reporting time played.
>In case of audio only, since audio device is
under-reporting played time,
>audio data in the audio renderer and down stream (audio
stream) will
>periodically deplete, engine will re-buffer to pull in
more data and play
>until the data is depleted again.  The depletion occurs
due to time being
>under-report and thus engine under-pacing the data flow
into the renderes.
>
>The memory accumulation for video in such scenario also
is expected.  Since
>time is under-reported, video will play slower than
audio and the
>difference in true audio time and reported audio time
will be converted
>into accumulation of video data in RAM.  This is due to
data for audio and
>video being retrieved from the file in interleaved
fashion. That is, if you
>need to retrieve audio up to certain time, video will
also be retrieved up
>to that time.   In other words, audio and video data is
always read with
>the same time-rate from the file.  If video is consumed
slower (which it
>is), it will accumulate in RAM.
>
>You need to fix the audio device to report the time
properly.
>
>Milko
>
> >
> >I have put logs in SendPacket as asked by Milko,
for eg.
> >
> >HXPlayer::SendPacket Enter PlayBackTime()=180415
timestamp=183902
> >
> >Also, I have put a logging statement as asked by
you
> >HXSymbianAudioSession::GetTime() nMSTime=183642
m_msTimePlayed=181751
> >
> >where nMSTime
> >nMSTime =  m_ulPauseTime
+HX_GET_TICKCOUNT()-m_ulStartTime ;
> >and
> >m_msTimePlayed is the time to be returned from
GetCurrentAudioTime()
> >
> >We can see these two  timestamps diverging over
time. In case of A/V file
> >these diverge a lot and playback is very choppy.
> >Please, have a look at the attached logs .
> >
> >Thanks and regards,
> >Gaurav Mahendroo
> >
> >_______________________________________________
> >Helix-client-dev mailing list
> >Helix-client-devhelixcommunity.org
> >http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev
>
>-------------- next part --------------
>An HTML attachment was scrubbed...
>URL: 
>htt
p://lists.helixcommunity.org/pipermail/helix-client-dev/atta
chments/20060824/edbbeb92/attachment-0001.html
>
>------------------------------
>
>Message: 6
>Date: Mon, 28 Aug 2006 14:05:05 -0700
>From: Milko Boic <milkoreal.com>
>Subject: [Helix-client-dev] CR-Client: Core start
performance
>To: helix-client-devhelixcommunity.org
>Message-ID: <6.2.1.2.2.20060828135848.05b52230mailone.real.com>
>Content-Type: text/plain; charset="us-ascii"
>
>Modified by: milkoreal.com
>Date: 8:28:06
>Project: Atlas
>
>Synopsis: Player core start optimizations
>
>Overview:
>The change provides logistical optimizations for
management of time and
>data flow processing during start-up period.  Prior
logic was inefficient
>due to insufficient granularity among data retrieval,
data transfer to
>renderers/devices and buffering fulfillment
determination.  Previously
>small time-gaps also occurred when transitioning between
start-up states
>due to necessary deferral to next player processing
slice (a.k.a process 
>idle).
>
>A test of an A/V clip on windows platform shows more
than 50% reduction in
>start-up time (631ms -> 307ms).  See detailed trace
below.
>
>The new logic during buffering phase, moves data from
data source into
>renderers one packet at the time and at the moment the
initial buffering
>needs are satisfied, the resumption of audio is
attempted and then any
>remaining buffering needs addressed.  The start-up from
local files takes
>advantage of fast-start behavior by resuming the
playback as soon as first
>frame of video and minimal audio pushdown of audio have
been supplied to
>the output devices.
>
>New set of logging statements has been added based on
which this work was 
>done:
>"CORP" - Core Performance
>
>A few issues have been fixed as well:
>- core lock accounting was flawed since it used a
boolean and was
>invalidate in some cases by recursive calls
>- Accounting of buffering in file source as part of
FillBuffers was
>conceptually incorrect and resulted in premature start
of play.  The
>buffering must be accounted at the time event is
supplied.  FillBuffers
>only provides async to sync data retrieval conversion
and any buffering at
>that level cannot be counted toward completion of
buffering since this data
>is not yet checked for transfer to renderers.  That is,
data buffered by
>FillBuffers is the equivalent of transport buffer in
network source.
>- base video renderer smoothing filter is now reset on
occurrence of
>buffering resulting in faster re-sync to the new
time-line.  Previously,
>sluggishness could be observed until the filter received
sufficient number
>of new samples to re-lock onto new time-line trend.
>
>Timing Results:
>===============
>New improved core:
>------------------
>CORE    43490241        2212   
HXPlayer[00B5ACD8]::OpenURL(): 
>file://br-av-ss-hi.rm
>CORE    43490252        2212   
ClientPrerollHelper::GetPreroll() header 
>[00BABF68]:
>Preroll 1864 PostDecodeDelay 0 Total 1864
>CORE    43490252        2212
>HXBufferingState[video/x-pn-realvideo-00BAEE9D]::OnStrea
mHeader()
>                 StreamNum=0 PreRoll=1864 PreData=0
PDStart=0 PDSeek=0 
> PRStart=0 PRSeek=0
>AvgBitRate=603532 MaxBitRate=603532
mimeType=video/x-pn-realvideo
>CORE    43490253        2212   
ClientPrerollHelper::GetPreroll() header 
>[00BAD680]:
>Preroll 3714 PostDecodeDelay 0 Total 3714
>CORE    43490253        2212
>HXBufferingState[audio/x-pn-realaudio-00BB486D]::OnStrea
mHeader()
>                 StreamNum=1 PreRoll=3714 PreData=0
PDStart=0 PDSeek=0 
> PRStart=0 PRSeek=0
>AvgBitRate=96468 MaxBitRate=96468
mimeType=audio/x-pn-realaudio
>CORE    43490254        2212
>HXBufferingState[video/x-pn-realvideo-00BAEE9D]::Init(ul
PerfectPlayTime=0)
>CORE    43490254        2212
>HXBufferingState[audio/x-pn-realaudio-00BB486D]::Init(ul
PerfectPlayTime=0)
>CORE    43490254        2212   
HXPlayer[00B5ACD8]::Begin()
>CORE    43490254        2212   
HXPlayer[00B5ACD8]::BeginPlayer()
>CORE    43490256        2212
>HXBufferingState[video/x-pn-realvideo-00BAEE9D]::OnStrea
m(pStream=0x00bab860)
>CORE    43490257        2212
>HXBufferingState[audio/x-pn-realaudio-00BB486D]::OnStrea
m(pStream=0x00bb97d0)
>CORE    43490265        2212   
ClientPrerollHelper::GetPreroll() header 
>[00BABF68]:
>Preroll 1864 PostDecodeDelay 500 Total 2364
>CORE    43490265        2212
>HXBufferingState[video/x-pn-realvideo-00BAEE9D]::UpdateP
reroll(ulPreroll=2364)
>CORE    43490271        2212   
ClientPrerollHelper::GetPreroll() header 
>[00BAD680]:
>Preroll 1857 PostDecodeDelay 1000 Total 2857
>CORE    43490271        2212
>HXBufferingState[audio/x-pn-realaudio-00BB486D]::UpdateP
reroll(ulPreroll=2857)
>CORE    43490341        3724   
ClientPrerollHelper::GetPreroll() header 
>[00BABF68]:
>Preroll 1864 PostDecodeDelay 500 Total 2364
>CORE    43490341        3724   
ClientPrerollHelper::GetPreroll() header 
>[00BAD680]:
>Preroll 1857 PostDecodeDelay 1000 Total 2857
>CORE    43490341        3724   
HXSource[00BA3088]::SetMinimumPreroll(): 
>Preroll 2857
>MinPreroll 0 MaxLatencyThreshold 3857
>CORE    43490341        3724
>HXBufferingState[video/x-pn-realvideo-00BAEE9D]::SetMini
mumPreroll(ulSourcePreroll=0,ulPerfectPlayTime=0,bIsRebuffer
ing=0)
>CORE    43490341        3724
>HXBufferingState[audio/x-pn-realaudio-00BB486D]::SetMini
mumPreroll(ulSourcePreroll=0,ulPerfectPlayTime=0,bIsRebuffer
ing=0)
>CORE    43490341        3724
>HXBufferingState[video/x-pn-realvideo-00BAEE9D]::SetMini
mumPreroll(ulSourcePreroll=0,ulPerfectPlayTime=0,bIsRebuffer
ing=0)
>CORE    43490341        3724
>HXBufferingState[audio/x-pn-realaudio-00BB486D]::SetMini
mumPreroll(ulSourcePreroll=0,ulPerfectPlayTime=0,bIsRebuffer
ing=0)
>CORE    43490346        3724    CBufferManager[00BA3378]
Wallclock delay 
>for stream 0
>set to 0
>CORE    43490346        3724    CBufferManager[00BA3378]
Wallclock delay 
>for stream 1
>set to 0
>CORE    43490346        3724    CBufferManager[00BA3378]
Wallclock delay 
>for stream 1
>set to 0
>TRAN    43490380        2212    (00BA3088) AudioPushDown
Satisfied 278 100
>TRAN    43490547        3724    (00BA3088) VideoPushDown
Satisfied 1 1
>TRAN    43490547        3724    (00BA3088) TURBO Started
>CORE    43490548        3724   
HXPlayer[00B5ACD8]::CheckForAudioResume(): 
>resuming
>audio player
>CORE    43490548        3724
>HXBufferingState[video/x-pn-realvideo-00BAEE9D]::OnResum
ed 0 54776
>CORE    43490548        3724
>HXBufferingState[audio/x-pn-realaudio-00BB486D]::OnResum
ed 1 60200
>
>Previous core:
>--------------
>CORE    861730519       0596   
HXPlayer[00B5ACD8]::OpenURL(): 
>file://br-av-ss-hi.rm
>CORE    861730586       0596   
ClientPrerollHelper::GetPreroll() header 
>[00BAC018]:
>Preroll 1864 PostDecodeDelay 0 Total 1864
>CORE    861730586       0596
>HXBufferingState[video/x-pn-realvideo-00BAEF4D]::OnStrea
mHeader()
>                 StreamNum=0 PreRoll=1864 PreData=0
PDStart=0 PDSeek=0 
> PRStart=0 PRSeek=0
>AvgBitRate=603532 MaxBitRate=603532
mimeType=video/x-pn-realvideo
>CORE    861730587       0596   
ClientPrerollHelper::GetPreroll() header 
>[00BAD730]:
>Preroll 3714 PostDecodeDelay 0 Total 3714
>CORE    861730587       0596
>HXBufferingState[audio/x-pn-realaudio-00BB4D3D]::OnStrea
mHeader()
>                 StreamNum=1 PreRoll=3714 PreData=0
PDStart=0 PDSeek=0 
> PRStart=0 PRSeek=0
>AvgBitRate=96468 MaxBitRate=96468
mimeType=audio/x-pn-realaudio
>CORE    861730588       0596
>HXBufferingState[video/x-pn-realvideo-00BAEF4D]::Init(ul
PerfectPlayTime=0)
>CORE    861730588       0596
>HXBufferingState[audio/x-pn-realaudio-00BB4D3D]::Init(ul
PerfectPlayTime=0)
>CORE    861730589       0596   
HXPlayer[00B5ACD8]::Begin()
>CORE    861730589       0596   
HXPlayer[00B5ACD8]::BeginPlayer()
>CORE    861730594       0596
>HXBufferingState[video/x-pn-realvideo-00BAEF4D]::OnStrea
m(pStream=0x00bab910)
>CORE    861730606       0596
>HXBufferingState[audio/x-pn-realaudio-00BB4D3D]::OnStrea
m(pStream=0x00bba8d8)
>CORE    861730614       0596   
ClientPrerollHelper::GetPreroll() header 
>[00BAC018]:
>Preroll 1864 PostDecodeDelay 500 Total 2364
>CORE    861730614       0596
>HXBufferingState[video/x-pn-realvideo-00BAEF4D]::UpdateP
reroll(ulPreroll=2364)
>CORE    861730622       0596   
ClientPrerollHelper::GetPreroll() header 
>[00BAD730]:
>Preroll 1857 PostDecodeDelay 1000 Total 2857
>CORE    861730622       0596
>HXBufferingState[audio/x-pn-realaudio-00BB4D3D]::UpdateP
reroll(ulPreroll=2857)
>CORE    861730730       0596   
ClientPrerollHelper::GetPreroll() header 
>[00BAC018]:
>Preroll 1864 PostDecodeDelay 500 Total 2364
>CORE    861730730       0596   
ClientPrerollHelper::GetPreroll() header 
>[00BAD730]:
>Preroll 1857 PostDecodeDelay 1000 Total 2857
>CORE    861730730       0596   
HXSource[00BA3198]::SetMinimumPreroll(): 
>Preroll 2857
>MinPreroll 0 MaxLatencyThreshold 3857
>CORE    861730730       0596
>HXBufferingState[video/x-pn-realvideo-00BAEF4D]::SetMini
mumPreroll(ulSourcePreroll=0,ulPerfectPlayTime=0,bIsRebuffer
ing=0)
>CORE    861730730       0596
>HXBufferingState[audio/x-pn-realaudio-00BB4D3D]::SetMini
mumPreroll(ulSourcePreroll=0,ulPerfectPlayTime=0,bIsRebuffer
ing=0)
>CORE    861730730       0596
>HXBufferingState[video/x-pn-realvideo-00BAEF4D]::SetMini
mumPreroll(ulSourcePreroll=0,ulPerfectPlayTime=0,bIsRebuffer
ing=0)
>CORE    861730730       0596
>HXBufferingState[audio/x-pn-realaudio-00BB4D3D]::SetMini
mumPreroll(ulSourcePreroll=0,ulPerfectPlayTime=0,bIsRebuffer
ing=0)
>CORE    861730754       0596    CBufferManager[00BA3488]
Wallclock delay 
>for stream 0
>set to 0
>CORE    861730755       0596    CBufferManager[00BA3488]
Wallclock delay 
>for stream 1
>set to 0
>CORE    861730768       0596    CBufferManager[00BA3488]
Wallclock delay 
>for stream 1
>set to 14
>TRAN    861730834       0596    (00BA3198) AudioPushDown
Satisfied 278 100
>TRAN    861731057       0596    (00BA3198) VideoPushDown
Satisfied 1 1
>TRAN    861731057       0596    (00BA3198) TURBO Started
>CORE    861731150       0596   
HXPlayer[00B5ACD8]::CheckForAudioResume(): 
>resuming
>audio player
>CORE    861731150       0596
>HXBufferingState[video/x-pn-realvideo-00BAEF4D]::OnResum
ed 0 265635
>CORE    861731150       0596
>HXBufferingState[audio/x-pn-realaudio-00BB4D3D]::OnResum
ed 1 37800
>
>
>Files Modified:
>/client/core/hxbufstate.cpp,v
>/client/core/hxflsrc.cpp,v
>/client/core/hxflsrc.h,v
>/client/core/hxplay.cpp,v
>/client/core/pub/hxplay.h,v
>/common/include/ihxtlogsystem.h,v
>/datatype/common/vidrend/vidrend.cpp,v
>
>Image Size and Heap Use impact (Client -Only):
>next to none
>
>Platforms and Profiles Affected:
>all
>
>Distribution Libraries Affected:
>none
>
>Distribution library impact and planned action:
>n/a
>
>Platforms and Profiles Build Verified:
>win32-i386-vc7, helix-client-all-defines
>
>Platforms and Profiles Functionality verified:
>win32-i386-vc7, helix-client-all-defines
>
>Branch:
>HEAD
>-------------- next part --------------
>
>Index: core/hxbufstate.cpp
>========================================================
===========
>RCS file: /cvsroot/client/core/hxbufstate.cpp,v
>retrieving revision 1.26
>diff -u -w -r1.26 hxbufstate.cpp
>--- core/hxbufstate.cpp 17 Aug 2006 04:37:06 -0000     
1.26
>+++ core/hxbufstate.cpp 28 Aug 2006 20:18:53 -0000
> -800,15 +800,24 
>  void
HXBufferingState::setupMinPrerollAndBuffering(ULONG32
ulMinPrerollInMs,
>                                                    
ULONG32 
> ulMinBufferingInMs)
>  {
>+    m_ulMinimumPreroll = getPredata();
>+    m_ulMinimumBuffering = m_ulMinimumPreroll;
>+
>+    m_ulMinimumPrerollInMs    = m_ulPreroll;
>+    m_ulMinimumBufferingInMs  = m_ulMinimumPrerollInMs;
>+
>+    // Streams without buffering requirement, always
stay without buffering
>+    // requirement.
>+    // For example, a very sparse streams such as event
stream cannot 
>have its
>+    // buffering modified (increased) as the concept of
buffering does 
>not apply.
>+    if (m_ulMinimumPreroll || m_ulMinimumBufferingInMs)
>+    {
>      UINT32 ulMaxBandwidth     = maxBandwidth();
>      UINT32 ulAvgBandwidth     = AvgBandwidth();
>
>      m_ulMinimumPrerollInMs    = ulMinPrerollInMs;
>      m_ulMinimumBufferingInMs  = ulMinBufferingInMs;
>
>-    m_ulMinimumPreroll = getPredata();
>-    m_ulMinimumBuffering = m_ulMinimumPreroll;
>-
>      if (ulAvgBandwidth && ulMaxBandwidth)
>      {
>          UINT32 ulPredataFromPrerollInMs =
msToBytes(m_ulMinimumPrerollInMs,
> -830,6 +839,7 
>                                           
ulAvgBandwidth);
>      }
>  }
>+}
>
>  void
HXBufferingState::updateCurrentBufferingInMs(INT64
llLowestTimeStamp,
>                                                   INT64
llHighestTimeStamp)
>Index: core/hxflsrc.cpp
>========================================================
===========
>RCS file: /cvsroot/client/core/hxflsrc.cpp,v
>retrieving revision 1.106
>diff -u -w -r1.106 hxflsrc.cpp
>--- core/hxflsrc.cpp    19 Aug 2006 00:11:25 -0000     
1.106
>+++ core/hxflsrc.cpp    28 Aug 2006 20:18:53 -0000
> -127,7 +127,6 
>      , m_pFileFormatEnumerator(NULL)
>      , m_pFFClaimURLEnumerator(NULL)
>      , m_pCurrentFileFormatUnk(NULL)
>-    , m_ulMaxTimeFillBuffers(20)
>  #if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS)
>      , m_pPDSObserverList(NULL)
>  #endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS.
> -347,9 +346,6 
>
>      ReadPreferences();
>
>-    HX_ASSERT(m_pPreferences);
>-    ReadPrefUINT32( m_pPreferences,
"MaxTimeFillBuffers", 
>m_ulMaxTimeFillBuffers);
>-
>      HX_VECTOR_DELETE(m_pszURL);
>      HX_DELETE(m_pURL);
>
> -1716,7 +1712,9 
>                 theErr = HXR_OUTOFMEMORY;
>
>             if(m_pBufferManager)
>+           {
>                
m_pBufferManager->UpdateCounters(pPacket, 0);
>+           }
>
>              if (m_pHXSrcBufStats &&
!pPacket->IsLost())
>              {
> -1770,8 +1768,24 
>
>      if (!theErr)
>      {
>+       IHXPacket* pPacket;
>+
>         // this event will be deleted by the player...
>         theEvent = lEventList->RemoveHead();
>+
>+       pPacket = theEvent->GetPacket();        //
Not Addref-ed
>+        if (pPacket)
>+        {
>+           if (m_pBufferManager)
>+           {
>+              
m_pBufferManager->UpdateCounters(pPacket, 0);
>+           }
>+
>+           if (m_pHXSrcBufStats &&
!pPacket->IsLost())
>+           {
>+               m_pHXSrcBufStats->OnPacket(pPacket);
>+           }
>+       }
>      }
>
>  #ifdef LOSS_HACK
> -2525,16 +2539,6 
>             theEvent->SetTimeOffset(m_ulStartTime -
m_ulDelay);
>             theErr =
lEventList->InsertEvent(theEvent);
>         }
>-
>-       if (!theErr)
>-       {
>-           m_pBufferManager->UpdateCounters(pPacket,
0);
>-       }
>-
>-        if (m_pHXSrcBufStats &&
!pPacket->IsLost())
>-        {
>-            m_pHXSrcBufStats->OnPacket(pPacket);
>-        }
>      }
>
>      if (!theErr)
> -3077,7 +3081,7 
>  #endif //HELIX_FEATURE_STOP_STREAM_BY_TEMP_FILE_ERROR
>         }
>
>-       if ((HX_GET_BETTERTICKCOUNT() - ulNow) >
m_ulMaxTimeFillBuffers)
>+       if ((HX_GET_BETTERTICKCOUNT() - ulNow) > 
>m_pPlayer->GetPlayerUpdateInterval())
>         {
>             break;
>         }
> -3152,7 +3156,8 
>         }
>      }
>
>-    if (bHasUnfilledStreams && bSelectedStream
&& (!bSelectedEmptyStream))
>+    if (bHasUnfilledStreams && bSelectedStream
&& (!bSelectedEmptyStream) &&
>+       (((!m_bInitialBuffering) &&
(REBUFFER_REQUIRED != 
>m_rebufferStatus)) || (ulEmptyStreamsMaxBufferingInMs ==
0)))
>      {
>         // We need to make sure we do not select
streams to be filled too far
>         // ahead of time and thus loading too much data
and into RAM and
> -3165,6 +3170,9 
>         // we check that the minimum renderer dispatch
time of the empty 
> stream is
>         // ahead of where the play-time currently is
and if so we do
>         // not select the stream to fill.
>+       // We skip this check when we are in the
buffering mode and empty 
>streams
>+       // have a buffering requirement (all very sparse
streams should 
>have no
>+       // buffering requirement).
>
>         // We are computing rendering time from the
renderer dispatch 
> time below by
>         // subtracting the minimum buffering time.
>Index: core/hxflsrc.h
>========================================================
===========
>RCS file: /cvsroot/client/core/hxflsrc.h,v
>retrieving revision 1.27
>diff -u -w -r1.27 hxflsrc.h
>--- core/hxflsrc.h      17 Aug 2006 04:37:06 -0000     
1.27
>+++ core/hxflsrc.h      28 Aug 2006 20:18:53 -0000
> -397,8 +397,6 
>      IHXPluginSearchEnumerator*
m_pFFClaimURLEnumerator;
>      IUnknown*              m_pCurrentFileFormatUnk;
>
>-    ULONG32                 m_ulMaxTimeFillBuffers;
>-
>  #if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS)
>      CHXSimpleList*          m_pPDSObserverList;
>      HX_RESULT              
EstablishPDSObserverList();
>Index: core/hxplay.cpp
>========================================================
===========
>RCS file: /cvsroot/client/core/hxplay.cpp,v
>retrieving revision 1.154
>diff -u -w -r1.154 hxplay.cpp
>--- core/hxplay.cpp     19 Aug 2006 00:11:25 -0000     
1.154
>+++ core/hxplay.cpp     28 Aug 2006 20:18:54 -0000
> -215,7 +215,6 
>
>  #define MIN_DELAYBEFORE_START       2000
>  #define BEGIN_SYNC_FUDGE_FACTOR     50
>-#define MAX_LOOP_EXE_TIME           300
>  #define ALLFS                       0xFFFFFFFF
>  #define DEFAULT_NUM_FORWARD_KEYFRAMES_AHEAD   2
>  #define DEFAULT_NUM_REVERSE_KEYFRAMES_AHEAD   4
> -237,13 +236,11 
>      ,m_LastSeverity(HXLOG_ERR)
>      ,m_ulLastUserCode(HXR_OK)
>      ,m_pLastMoreInfoURL(NULL)
>-    ,m_ulMaxTimeInLoop(20)
>      ,m_pRegistry(0)
>      ,m_pStats(0)
>      ,m_pUpdateStatsCallback(0)
>      ,m_pHXPlayerCallback(0)
>      ,m_pHXPlayerInterruptCallback(NULL)
>-    ,m_pSetupCallback(0)
>      ,m_pAuthenticationCallback(NULL)
>      ,m_pAutheticationValues(NULL)
>      ,m_ulStatsGranularity(1000)
> -309,7 +306,7 
>      ,m_bIsPresentationClosedToBeSent(FALSE)
>      ,m_bCloseAllRenderersPending(FALSE)
>      ,m_bUseCoreThread(FALSE)
>-    ,m_bCoreLocked(FALSE)
>+    ,m_ulCoreLockCount(0)
>      ,m_bPaused(FALSE)
>      ,m_bBeginPending(FALSE)
>      ,m_bIsFirstBeginPending(FALSE)
> -438,19 +435,15 
>  #if defined (_WIN32) || defined (_MACINTOSH) ||
defined(THREADS_SUPPORTED)
>      m_pHXPlayerCallback = new
HXPlayerCallback((void*)this, 
> (fGenericCBFunc)PlayerCallback);
>      m_pHXPlayerInterruptCallback = new
HXPlayerCallback((void*)this, 
> (fGenericCBFunc)PlayerCallback);
>-    m_pSetupCallback = new
HXPlayerCallback((void*)this, 
>(fGenericCBFunc)SetupCallback);
>
>     
((HXPlayerCallback*)m_pHXPlayerInterruptCallback)->m_bInt
errupSafe 
> = TRUE;
>-   
((HXPlayerCallback*)m_pSetupCallback)->m_bInterrupSafe =
TRUE;
>
>  #else
>      m_pHXPlayerCallback = new
CHXGenericCallback((void*)this, 
> (fGenericCBFunc)PlayerCallback);
>      m_pHXPlayerInterruptCallback = new
CHXGenericCallback((void*)this, 
> (fGenericCBFunc)PlayerCallback);
>-    m_pSetupCallback = new
CHXGenericCallback((void*)this, 
>(fGenericCBFunc)SetupCallback);
>  #endif
>      m_pHXPlayerCallback->AddRef();
>      m_pHXPlayerInterruptCallback->AddRef();
>-    m_pSetupCallback->AddRef();
>
>  #if defined(HELIX_FEATURE_AUTHENTICATION)
>      m_pAuthenticationCallback = new
CHXGenericCallback((void*)this, 
> (fGenericCBFunc)AuthenticationCallback);
> -794,14 +787,14 
>      HXLOGL1(HXLOG_CORE,
"HXPlayer[%p]::Begin()", this);
>      HX_RESULT theErr = HXR_OK;
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>
>      LeaveQuickSeekMode(TRUE);
>      theErr = BeginPlayer();
>
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return theErr;
>  }
> -903,14 +896,14 
>          return HXR_OK;
>      }
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>
>      LeaveQuickSeekMode();
>      StopPlayer(END_STOP);
>
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return HXR_OK;
>  }
> -936,11 +929,11 
>      HXLOGL3(HXLOG_CORE,
"HXPlayer[%p]::Pause()", this);
>      HX_RESULT theErr = HXR_OK;
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>      theErr = PausePlayer();
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return theErr;
>  }
> -1013,14 +1006,14 
>      HXLOGL1(HXLOG_CORE,
"HXPlayer[%p]::Seek(%lu)", this, ulTime);
>      HX_RESULT theErr = HXR_OK;
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>
>      LeaveQuickSeekMode();
>      theErr = SeekPlayer(ulTime);
>
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return theErr;
>  }
> -1428,8 +1421,6 
>      }
>  #endif /* #if defined(HELIX_FEATURE_PREFERENCES) */
>
>-    ReadPrefUINT32( m_pPreferences,
"MaxTimeInEventLoop", 
>m_ulMaxTimeInLoop );
>-
>      return HXR_OK;
>  }
>
> -1633,11 +1624,11 
>  {
>      HX_RESULT theErr = HXR_OK;
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>      theErr =
m_pAudioPlayer->GetCurrentPlayBackTime();
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return theErr;
>  }
> -1673,16 +1664,16 
>  {
>      HX_RESULT theErr = HXR_OK;
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>  #if defined(HELIX_FEATURE_SINKCONTROL)
>      if (m_pAdviseSink)
>      {
>          theErr =
m_pAdviseSink->RemoveAdviseSink(pAdviseSink);
>      }
>  #endif /* HELIX_FEATURE_SINKCONTROL */
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return theErr;
>  }
> -1718,16 +1709,16 
>  {
>      HX_RESULT theErr = HXR_OK;
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>  #if defined(HELIX_FEATURE_SINKCONTROL)
>      if (m_pClientStateAdviseSink)
>      {
>          theErr = 
>
m_pClientStateAdviseSink->RemoveClientStateAdviseSink(pCl
ientStateAdviseSink);
>      }
>  #endif /* HELIX_FEATURE_SINKCONTROL */
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return theErr;
>  }
> -1772,8 +1763,8 
>  HXPlayer::ClosePresentation()
>  {
>      HXLOGL3(HXLOG_CORE,
"HXPlayer[%p]::ClosePresentation()", this);
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>
>      // This stops the player if it is playing and
cleans up the layout.
>      StopPlayer(END_STOP);
> -1787,8 +1778,8 
>      }
>  #endif /* HELIX_FEATURE_VIDEO */
>
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return HXR_OK;
>  }
> -1982,13 +1973,8 
>  #if defined(THREADS_SUPPORTED) &&
!defined(_MAC_UNIX)
>      if (m_bUseCoreThread &&
!m_pEngine->AtInterruptTime())
>      {
>-       
HX_ASSERT(m_pSetupCallback->GetPendingCallback() == 0);
>-        if (!m_pSetupCallback->GetPendingCallback())
>-        {
>-            m_pSetupCallback->CallbackScheduled(
>-           
m_pScheduler->RelativeEnter(m_pSetupCallback, 0));
>-        }
>-
>+       // Schedule player again looking for invocation
on core thread
>+        SchedulePlayer(PLAYER_SCHEDULE_INTERRUPT | 
>PLAYER_SCHEDULE_IMMEDIATE);
>          return HXR_OK;
>      }
>  #endif /*_WIN32*/
> -2026,18 +2012,27 
>
>  HX_RESULT HXPlayer::ProcessIdle(void)
>  {
>+    HXLOGL4(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() Entering: Init=%c 
>PostSetupDue=%c InterrTime=%c",
>+       this,
>+       m_bInitialized ? 'T' : 'F',
>+       m_bPostSetupToBeDone ? 'T' : 'F',
>+       m_pEngine->AtInterruptTime() ? 'T' :
'F');
>+
>      if ((!m_bInitialized || m_bPostSetupToBeDone )
&& 
> m_pEngine->AtInterruptTime())
>      {
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() Non-interr time 
>needed: Bailing out", this);
>          return HXR_OK;
>      }
>
>-    if (m_bCoreLocked)
>+    if (m_ulCoreLockCount)
>      {
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() Core Locked: 
>Bailing out", this);
>          SchedulePlayer();
>          return HXR_OK;
>      }
>
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>
>  #if 0
>  #if defined(_WIN32) && defined(_DEBUG)
> -2045,7 +2040,7 
>  #endif
>  #endif
>
>-    m_bCoreLocked   = TRUE;
>+    m_bSourceMapUpdated = FALSE;
>
>      HX_RESULT           theErr              = HXR_OK;
>      HXBOOL                bIsBuffering        = FALSE;
> -2077,7 +2072,7 
>          QuickSeek(m_ulSeekQueue);
>      }
>
>-    if (m_bIsDone || m_bSetupToBeDone)
>+    if (m_bIsDone)
>      {
>          goto exitRoutine;
>      }
> -2168,7 +2163,7 
>          HX_RELEASE(pStatusDesc);
>      }
>
>-    // initialize renderes if not done yet..
>+    // initialize renderers if not done yet..
>      // this involves reading headers from source
object
>      // creating the right renderers for each stream
and pass this
>      // header to the renderer.
> -2179,8 +2174,14 
>           */
>          m_bIsSmilRenderer = m_bSetupLayoutSiteGroup;
>
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() Initialize 
>Renderers: Start", this);
>+
>          theErr = InitializeRenderers();
>
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() Initialize 
>Renderers: End", this);
>+
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() SetupLayout: 
>Start", this);
>+
>  #if defined(HELIX_FEATURE_VIDEO)
>          if (!m_bPlayerWithoutSources &&
!theErr)
>          {
> -2193,6 +2194,8 
>              }
>          }
>  #endif /* HELIX_FEATURE_VIDEO */
>+
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() SetupLayout: 
>End", this);
>      }
>
>      // Perform prefetching if we are in the connected
state and there is 
> no halt set or halt has been cleared
> -2204,17 +2207,31 
>         m_eClientStateStatus =
HX_CLIENT_STATE_STATUS_ACTIVE;
>         SetClientState(HX_CLIENT_STATE_OPENING);
>
>+       m_bSetupToBeDone = TRUE;
>+
>         AdjustPresentationTime();
>+    }
>
>-       m_bSetupToBeDone = TRUE;
>+    if ((m_eClientState == HX_CLIENT_STATE_OPENING)
&& m_bSetupToBeDone)
>+    {
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() SetupAudioPlayer: 
>Start", this);
>
>         theErr = SetupAudioPlayer();
>+
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() SetupAudioPlayer: 
>End", this);
>+
>+       if (m_bSetupToBeDone)
>+       {
>+           goto exitRoutine;
>+       }
>      }
>
>      if (m_bPostSetupToBeDone)
>      {
>          m_bPostSetupToBeDone = FALSE;
>
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() PostSetup: 
>Start", this);
>+
>          /* Initialize audio services */
>          if (!theErr && m_bInitialized)
>          {
> -2232,7 +2249,11 
>             }
>             if (m_bSeekCached && !theErr)
>             {
>+               HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>SeekPlayer: Start", this);
>+
>                 theErr = SeekPlayer(m_ulSeekTime);
>+
>+               HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>SeekPlayer: End", this);
>             }
>          }
>
> -2268,14 +2289,19 
>           */
>          if (!theErr && m_bInitialized
&& m_bIsFirstBegin && !m_bIsDone)
>          {
>+           HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>StartDownload: Start", this);
>+
>              theErr = StartDownload();
>+
>+           HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>StartDownload: End", this);
>          }
>+
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() PostSetup: End", 
>this);
>      }
>
>      // if it is still not initialized check error code
and return
>      if (theErr || !m_bInitialized ||
m_eClientStateStatus == 
> HX_CLIENT_STATE_STATUS_HALTED)
>      {
>-        // my first use of goto..!!
>          goto exitRoutine;
>      }
>
> -2291,14 +2317,23 
>          CheckBeginList();
>      }
>
>+    HXBOOL bWasBuffering;
>+    HXBOOL bAttemptedResume = FALSE;
>+
>+    do
>+    {
>      while (!theErr && !bDone &&
m_uNumSourcesActive > 0)
>      {
>+           bWasBuffering = bIsBuffering;
>+           bIsBuffering = FALSE;
>+
>          ndxSource = m_pSourceMap->Begin();
>          for (;!theErr && ndxSource !=
m_pSourceMap->End(); ++ndxSource)
>          {
>              pSourceInfo = (SourceInfo*)(*ndxSource);
>
>-            theErr =
pSourceInfo->ProcessIdle(bIsFirst, 
>ulNumStreamsToBeFilled,
>+               theErr = pSourceInfo->ProcessIdle(
>+                   bIsFirst, ulNumStreamsToBeFilled,
>                                               
bIsBuffering, 
> uLowestBuffering);
>
>              if (pSourceInfo->m_pPeerSourceInfo)
> -2308,7 +2343,8 
>                  UINT32  tmp_ulNumStreamsToBeFilled =
0;
>                  UINT16  tmp_uLowestBuffering = 100;
>
>-               
pSourceInfo->m_pPeerSourceInfo->ProcessIdle(tmp_bIsFir
st, 
>tmp_ulNumStreamsToBeFilled,
>+                  
pSourceInfo->m_pPeerSourceInfo->ProcessIdle(
>+                       tmp_bIsFirst,
tmp_ulNumStreamsToBeFilled,
> 
>tmp_bIsBuffering, tmp_uLowestBuffering);
>              }
>
> -2317,11 +2353,26 
>               */
>              if (m_bSourceMapUpdated)
>              {
>+                   bDone = TRUE;
>                  break;
>              }
>          }
>
>-        if (bIsBuffering && !m_bIsPlaying)
>+           bIsFirst = FALSE;
>+
>+           if (bIsBuffering && !bWasBuffering)
>+           {
>+               HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>Buffering...", this);
>+           }
>+
>+           if (bWasBuffering && !bIsBuffering)
>+           {
>+               HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() Buffering 
>completed", this);
>+           }
>+
>+           if (!m_bIsPlaying)
>+           {
>+               if (bIsBuffering)
>          {
>              if (ulLoopEntryTime == 0)
>             {
> -2364,20 +2415,28 
>             // free some CPU time (cooperative
multi-tasking) if we are stuck
>             // filling the renderers with the data from
the sources
>             if (!theErr &&
>-                ((HX_GET_BETTERTICKCOUNT() -
ulLoopEntryTime) >= 
>MAX_LOOP_EXE_TIME))
>+                       ((HX_GET_BETTERTICKCOUNT() -
ulLoopEntryTime) >= 
>m_ulPlayerUpdateInterval))
>+                   {
>+                       bDone = TRUE;
>+                       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>Buffering CPU use timeout: Time=%lu", this,
HX_GET_BETTERTICKCOUNT() - 
>ulLoopEntryTime);
>+                   }
>+               }
>+               else if ((!bAttemptedResume) &&
(!m_bSourceMapUpdated))
>              {
>+                   // We are not buffering any more,
still not playing 
>and we have not attempted to
>+                   // resume playback - try to resume.
>+                   HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>Buffering done: Trying to resume...", this);
>                  break;
>              }
>          }
>
>          if (theErr || m_bSourceMapUpdated)
>          {
>-            m_bSourceMapUpdated = FALSE;
>+               bDone = TRUE;
>+               HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>SourceMapUpdated: Skipping to exit...", this);
>              goto exitRoutine;
>          }
>
>-        bIsFirst = FALSE;
>-
>          if (ulNumStreamsToBeFilled == 0)
>          {
>              bDone = TRUE;
> -2409,13 +2468,21 
>       */
>      if (!theErr && !bIsBuffering &&
m_bFastStartInProgress && !m_bIsDone)
>      {
>+           HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>PauseDownload: Start", this);
>+
>          theErr = PauseDownload();
>+
>+           HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>PauseDownload: End", this);
>      }
>
>      // Process Current Events Due...
>      if (!theErr)
>      {
>+           HXLOGL4(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>ProcessCurrentEvents: Start", this);
>+
>          theErr = ProcessCurrentEvents();
>+
>+           HXLOGL4(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() 
>ProcessCurrentEvents: End", this);
>      }
>
>      // repeat source specific
> -2427,6 +2494,9 
>          theErr = CheckForAudioResume();
>      }
>
>+       bAttemptedResume = TRUE;
>+    } while (!theErr && !bDone &&
(m_uNumSourcesActive > 0));
>+
>      if (!theErr && !m_bLastGroup &&
!m_bNextGroupStarted && 
> !m_pEngine->AtInterruptTime())
>      {
>          CheckToStartNextGroup();
> -2630,9 +2700,11 
>
>  cleanup:
>
>-    m_bCoreLocked   = FALSE;
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>
>+    HXLOGL4(HXLOG_CORP,
"HXPlayer[%p]::ProcessIdle() Exiting", this);
>+
>      return theErr;
>  }
>
> -2996,7 +3068,7 
>          m_bPartOfNextGroup = FALSE;
>          HX_DELETE(pMainSourceInfo);
>
>-        SchedulePlayer();
>+        SchedulePlayer(PLAYER_SCHEDULE_DEFAULT |
PLAYER_SCHEDULE_IMMEDIATE);
>      }
>      else
>      {
> -3076,20 +3148,22 
>  }
>
>  void
>-HXPlayer::SchedulePlayer(void)
>+HXPlayer::SchedulePlayer(UINT32 ulFlags)
>  {
>-    if ((!m_bIsDone || m_LastError ||
m_pEngine->AtInterruptTime()) &&
>+    if ((ulFlags & PLAYER_SCHEDULE_MAIN) &&
>+       (!m_bIsDone || m_LastError ||
m_pEngine->AtInterruptTime()) &&
>          !m_pHXPlayerCallback->GetPendingCallback())
>      {
>          m_pHXPlayerCallback->CallbackScheduled(
>-           
m_pScheduler->RelativeEnter(m_pHXPlayerCallback, 
>m_ulPlayerUpdateInterval));
>+          
m_pScheduler->RelativeEnter(m_pHXPlayerCallback, (ulFlags
& 
>PLAYER_SCHEDULE_IMMEDIATE) ? 0 :
m_ulPlayerUpdateInterval));
>      }
>
>-    if ((!m_bIsDone || m_LastError) &&
>+    if ((ulFlags & PLAYER_SCHEDULE_INTERRUPT)
&&
>+       (!m_bIsDone || m_LastError) &&
>         
!m_pHXPlayerInterruptCallback->GetPendingCallback())
>      {
>         
m_pHXPlayerInterruptCallback->CallbackScheduled(
>-           
m_pScheduler->RelativeEnter(m_pHXPlayerInterruptCallback,

>m_ulPlayerUpdateInterval));
>+          
m_pScheduler->RelativeEnter(m_pHXPlayerInterruptCallback,

>(ulFlags & PLAYER_SCHEDULE_IMMEDIATE) ? 0 :
m_ulPlayerUpdateInterval));
>      }
>
>  }
> -3103,6 +3177,8 
>          (m_bBeginPending || m_bTimelineToBeResumed)
&&
>          m_uNumSourceToBeInitializedBeforeBegin == 0)
>      {
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::CheckForAudioResume(): Starting 
>to resume...", this);
>+
>          if (m_b100BufferingToBeSent)
>          {
>              m_b100BufferingToBeSent = FALSE;
> -3128,6 +3204,7 
>           */
>          if (m_bPaused || !m_bInitialized)
>          {
>+           HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::CheckForAudioResume(): 
>Interrupted: Bailing out", this);
>              return HXR_OK;
>          }
>
> -3157,6 +3234,8 
>  #endif /* #if !defined(HELIX_FEATURE_LOGLEVEL_NONE) */
>
>          theErr = m_pAudioPlayer->Resume();
>+
>+       HXLOGL3(HXLOG_CORP,
"HXPlayer[%p]::CheckForAudioResume(): 
>Completed resume", this);
>      }
>
>      return theErr;
> -3512,9 +3591,8 
>
>      ResetError();
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>-
>+    m_ulCoreLockCount++;
>
>      /* Validate the URL */
>      theErr = pCHXURL->GetLastError();
> -3571,7 +3649,7 
>
>      if (!theErr)
>      {
>-        SchedulePlayer();
>+        SchedulePlayer(PLAYER_SCHEDULE_DEFAULT |
PLAYER_SCHEDULE_IMMEDIATE);
>      }
>
>  exit:
> -3597,7 +3675,7 
>           * would be reported/ auto-upgrade will be
requested.
>           */
>          m_bIsDone = FALSE;
>-        SchedulePlayer();
>+        SchedulePlayer(PLAYER_SCHEDULE_DEFAULT |
PLAYER_SCHEDULE_IMMEDIATE);
>          m_bIsDone = TRUE;
>          theErr = HXR_OK;
>      }
> -3610,8 +3688,8 
>          }
>      }
>
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return (theErr);
>  }
> -5413,7 +5491,6 
>
>      RemovePendingCallback(m_pHXPlayerCallback);
>     
RemovePendingCallback(m_pHXPlayerInterruptCallback);
>-    RemovePendingCallback(m_pSetupCallback);
>
>  #if defined(HELIX_FEATURE_AUTHENTICATION)
>      ClearPendingAuthenticationRequests();
> -6000,11 +6077,11 
>   */
>  void HXPlayer::ClosePlayer(void)
>  {
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>      Close();
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>  }
>
>  void
> -6090,9 +6167,6 
>     
RemovePendingCallback(m_pHXPlayerInterruptCallback);
>      HX_RELEASE(m_pHXPlayerInterruptCallback);
>
>-    RemovePendingCallback(m_pSetupCallback);
>-    HX_RELEASE(m_pSetupCallback);
>-
>  #if defined(HELIX_FEATURE_AUTHENTICATION)
>      if (m_pAuthenticationCallback)
>      {
> -7840,16 +7914,6 
>      }
>  }
>
>-void HXPlayer::SetupCallback(void* pParam)
>-{
>-    HXPlayer* pObj = (HXPlayer*)pParam;
>-
>-    if (pObj)
>-    {
>-        pObj->SetupAudioPlayer();
>-    }
>-}
>-
>  #if defined(HELIX_FEATURE_AUTHENTICATION)
>  void HXPlayer::AuthenticationCallback(void* pParam)
>  {
> -8562,8 +8626,8 
>  #if defined(HELIX_FEATURE_BASICGROUPMGR)
>      HX_RESULT theErr = HXR_OK;
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>      /* If we called SetCurrentGroup, ignore this
callback */
>      m_bIsPresentationClosedToBeSent = FALSE;
>      StopAllStreams(END_STOP);
> -8694,14 +8758,14 
>          Begin();
>      }
>
>-    SchedulePlayer();
>+    SchedulePlayer(PLAYER_SCHEDULE_DEFAULT |
PLAYER_SCHEDULE_IMMEDIATE);
>
>      if (theErr)
>      {
>          ReportError(NULL, theErr, NULL);
>      }
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>      return HXR_OK;
>  #else
>      return HXR_NOTIMPL;
> -8889,16 +8953,16 
>  HXPlayer::InternalReset(void)
>  {
>      HXLOGL3(HXLOG_CORE,
"HXPlayer[%p]::InternalReset()", this);
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>
>      m_bInternalReset = TRUE;
>      PausePlayer();
>      BeginPlayer();
>      m_bInternalReset = FALSE;
>
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return HXR_OK;
>  }
> -11014,8 +11078,8 
>                      if (bPlaying)
>                      {
>                          // Get the core mutex
>-                        m_bCoreLocked = TRUE;
>                          m_pCoreMutex->Lock();
>+                       m_ulCoreLockCount++;
>                          // Disable the advise sink
OnPause call
> 
>m_pAdviseSink->DisableAdviseSink(HX_ADVISE_SINK_FLAG_
ONPAUSE);
>                          // Pause the player
> -11023,8 +11087,8 
>                          // Re-enable the advise sink
OnPause call
> 
>m_pAdviseSink->EnableAdviseSink(HX_ADVISE_SINK_FLAG_O
NPAUSE);
>                          // Release the core mutex
>+                       m_ulCoreLockCount--;
>                          m_pCoreMutex->Unlock();
>-                        m_bCoreLocked = FALSE;
>                      }
>                      // Copy the new velocity to the
member variable
>                      m_lPlaybackVelocity = lVelocity;
> -11037,8 +11101,8 
>                      if (SUCCEEDED(retVal))
>                      {
>                          // Get the core mutex
>-                        m_bCoreLocked = TRUE;
>                          m_pCoreMutex->Lock();
>+                       m_ulCoreLockCount++;
>                          // Seek the player
>                          SeekPlayer(ulOrigTime);
>                          // If we were playing when we
got the SetVelocity,
> -11053,8 +11117,8 
> 
>m_pAdviseSink->EnableAdviseSink(HX_ADVISE_SINK_FLAG_O
NBEGIN);
>                          }
>                          // Release the core mutex
>+                       m_ulCoreLockCount--;
>                          m_pCoreMutex->Unlock();
>-                        m_bCoreLocked = FALSE;
>                      }
>                      else
>                      {
> -12973,11 +13037,11 
>      HXLOGL1(HXLOG_CORE,
"HXPlayer[%p]::SetPlaybackModifiers()", this);
>      HX_RESULT theErr = HXR_OK;
>
>-    m_bCoreLocked = TRUE;
>      m_pCoreMutex->Lock();
>+    m_ulCoreLockCount++;
>      theErr = ParsePlaybackModifiers(pModifiers);
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return theErr;
>  }
> -13182,7 +13246,7 
>      }
>
>      m_pCoreMutex->Lock();
>-    m_bCoreLocked = TRUE;
>+    m_ulCoreLockCount++;
>
>      m_bQuickSeekMode = TRUE;
>
> -13208,8 +13272,8 
>          m_ulSeekQueue = kNoValue;
>      }
>
>+    m_ulCoreLockCount--;
>      m_pCoreMutex->Unlock();
>-    m_bCoreLocked = FALSE;
>
>      return theErr;
>  }
>Index: core/pub/hxplay.h
>========================================================
===========
>RCS file: /cvsroot/client/core/pub/hxplay.h,v
>retrieving revision 1.51
>diff -u -w -r1.51 hxplay.h
>--- core/pub/hxplay.h   28 Jul 2006 19:36:58 -0000     
1.51
>+++ core/pub/hxplay.h   28 Aug 2006 20:18:54 -0000
> -456,6 +456,11 
>      URL_REDIRECTED
>  } URL_TYPE;
>
>+#define PLAYER_SCHEDULE_IMMEDIATE   0x01
>+#define PLAYER_SCHEDULE_MAIN       0x02
>+#define PLAYER_SCHEDULE_INTERRUPT   0x04
>+#define PLAYER_SCHEDULE_DEFAULT           
(PLAYER_SCHEDULE_MAIN | 
>PLAYER_SCHEDULE_INTERRUPT)
>+
>  const UINT32 kNoValue = MAX_UINT32;
>
>  class HXPlayer :   public IHXPlayer,
> -505,8 +510,6 
>      UINT32                     m_ulLastUserCode;
>      char*                      m_pLastMoreInfoURL;
>
>-    ULONG32                     m_ulMaxTimeInLoop;
>-
>  #if defined(HELIX_FEATURE_REGISTRY)
>      // statistic variables
>      HXClientRegistry*          m_pRegistry;
> -524,7 +527,6 
>
>      CHXGenericCallback*               
m_pHXPlayerCallback;
>      CHXGenericCallback*               
m_pHXPlayerInterruptCallback;
>-    CHXGenericCallback*               
m_pSetupCallback;
>  #if defined(HELIX_FEATURE_AUTHENTICATION)
>      CHXGenericCallback*               
m_pAuthenticationCallback;
>  #else
> -1711,6 +1713,8 
>      UINT32              ComputeFillEndTime(UINT32
ulCurTime, UINT32 
> ulOffsetScale, UINT32 ulOffsetFixed);
>      void               
CheckForPacketTimeOffsetUpdate(RendererInfo* 
> pRendInfo);
>
>+    UINT32             GetPlayerUpdateInterval(void)  
{ return 
>m_ulPlayerUpdateInterval; }
>+
>      static void         PlayerCallback(void *pParam);
>      static void                SetupCallback(void
*pParam);
>  #if defined(HELIX_FEATURE_AUTHENTICATION)
> -1857,7 +1861,7 
>      void       ResetPlayer(void);
>      void       ResetGroup(void);
>      void       SetMinimumPushdown(void);
>-    void       SchedulePlayer(void);
>+    void       SchedulePlayer(UINT32 ulFlags =
PLAYER_SCHEDULE_DEFAULT);
>      HX_RESULT  CheckForAudioResume(void);
>
>      HX_RESULT  InitializeNetworkDrivers(void);
> -1936,7 +1940,6 
>      HX_BITFIELD               
m_bCloseAllRenderersPending : 1;
>
>      HX_BITFIELD                m_bUseCoreThread : 1;
>-    HX_BITFIELD                m_bCoreLocked : 1;
>      HX_BITFIELD                m_bPaused : 1;
>      HX_BITFIELD                m_bBeginPending : 1;
>
> -1962,6 +1965,7 
>      HX_BITFIELD                m_bProcessEventsLocked
: 1;
>      HX_BITFIELD                m_bDidWeDeleteAllEvents
: 1;
>
>+    UINT32             m_ulCoreLockCount;
>      ULONG32            m_ulLowestGranularity;
>      UINT32             m_ulElapsedPauseTime;
>      UINT32             m_ulLiveSeekTime;
>-------------- next part --------------
>
>Index: include/ihxtlogsystem.h
>========================================================
===========
>RCS file: /cvsroot/common/include/ihxtlogsystem.h,v
>retrieving revision 1.31
>diff -u -w -r1.31 ihxtlogsystem.h
>--- include/ihxtlogsystem.h     17 Aug 2006 04:35:30
-0000      1.31
>+++ include/ihxtlogsystem.h     28 Aug 2006 20:22:58
-0000
> -194,6 +194,7 
>      ,HXLOG_TONE = HX_MAKE4CC('T','O','N','E') 
// TONE Sequence Plugin
>      ,HXLOG_RTSF = HX_MAKE4CC('R','T','S','F') 
// RTSP File Format Plugin
>      ,HXLOG_NGTF = HX_MAKE4CC('N','G','T','F') 
// Media Nugget File 
> Format Plugin
>+    ,HXLOG_CORP = HX_MAKE4CC('C','O','R','P') 
// Core performance logging
>  };
>
>  static const struct _ClientLogging4CC
> -255,6 +256,7 
>      {HXLOG_TONE, "Tone generator plugin"},
>      {HXLOG_RTSF, "RTSP File Format"},
>      {HXLOG_NGTF, "Media Nugget File
Format"},
>+    {HXLOG_CORP, "Core performance"},
>      {0,          NULL}  // This entry should ALWAYS
remain the last entry
>  };
>
>-------------- next part --------------
>
>Index: vidrend.cpp
>========================================================
===========
>RCS file: /cvsroot/datatype/common/vidrend/vidrend.cpp,v
>retrieving revision 1.78
>diff -u -w -r1.78 vidrend.cpp
>--- vidrend.cpp 17 Aug 2006 04:42:52 -0000      1.78
>+++ vidrend.cpp 28 Aug 2006 20:26:25 -0000
> -1210,7 +1210,7 
>          m_pTimeSyncSmoother->SetBaseTimeFlag();
>
>          // Reset the offset to avoid race condition
>-        // with m_ulTimeNormalizationOffset setting in
OnPacket()
>+        // with BaseTime setting in OnPacket()
>          if
(m_pTimeSyncSmoother->WasLastSampleGood())
>          {
>              m_pTimeSyncSmoother->ResetOffset();
> -1495,6 +1495,10 
>      }
>      else if (m_PlayState == Playing)
>      {
>+       // Time-line halted - clear the time-line
smoothing history as the
>+       // on resumption, we'll have a play-time to
wall-clock time shift and
>+       // will need to restart learning the relation
between the two.
>+       m_pTimeSyncSmoother->ResetSampleCounts();
>          m_PlayState = PlayStarting;
>      }
>
>-------------- next part --------------
>
>
>------------------------------
>
>_______________________________________________
>Helix-client-dev mailing list
>Helix-client-devhelixcommunity.org
>http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev
>
>
>End of Helix-client-dev Digest, Vol 31, Issue 48
>************************************************
>
>
>
>
>_______________________________________________
>Helix-client-dev mailing list
>Helix-client-devhelixcommunity.org
>http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev



_______________________________________________
Helix-client-dev mailing list
Helix-client-devhelixcommunity.org
http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev
[1]

about | contact  Other archives ( Real Estate discussion Medical topics )