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-bounces helixcommunity.org on
behalf of
>helix-client-dev-request helixcommunity.org
>Sent: Mon 8/28/2006 2:05 PM
>To: helix-client-dev helixcommunity.org
>Subject: Helix-client-dev Digest, Vol 31, Issue 48
>
>
>
>Send Helix-client-dev mailing list submissions to
> helix-client-dev helixcommunity.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-request helixcommunity.org
>
>You can reach the person managing the list at
> helix-client-dev-owner helixcommunity.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.zhang gmail.com>
>Subject: [Helix-client-dev] what is the input file
format for rv40dec
>To: helix-client-dev helixcommunity.org
>Message-ID:
>
<ea257a250608232318x353b0b29ma84f5371be688c52 mail.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" <dabas pv.com>
>Subject: [Helix-client-dev] Multiple instances of helix
player Query.
>To: <helix-client-dev helixcommunity.org>
>Message-ID:
<D3099360D13C2F4F8F3C12EADC7A346A0D925742 srsdmail.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 <gwright real.com>
>Subject: Re: [Helix-client-dev] Packets pile up in
STREAM_INFO::
> m_EventList due to rebuffering.
>To: a Gaurav Mahendroo <mgaurav pv.com>
>Cc: helix-client-dev helixcommunity.org
>Message-ID: <44EDFB64.4090004 real.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-dev helixcommunity.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 <karll real.com>
>Subject: Re: Fwd: [Helix-client-dev] what is the input
file format for
> rv40dec
>To: kiger.zhang gmail.com, helix-client-dev helixcommunity.org
>Message-ID: <44EDFC5E.40208 real.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: milko real.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.zhang gmail.com>
> >> To: helix-client-dev helixcommunity.org
> >> Subject: [Helix-client-dev] what is the input
file format for rv40dec
> >> X-BeenThere: helix-client-dev helixcommunity.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-request helixcommunity.org?subject=unsubscribe
> >> <mailto:helix-client-dev-request helixcommunity.org%3Fsubject=unsubscribe>
> >> >
> >> List-Archive: <
> >> http://lists.helixcommunity.org/pipermail/helix-cl
ient-dev>
> >> List-Post: < mailto:helix-client-dev helixcommunity.org>
> >> List-Help: <
> >> mailto:helix-client-dev-request helixcommunity.org?subject=help
> >> <mailto:helix-client-dev-request helixcommunity.org%3Fsubject=help> >
> >> List-Subscribe: <
> >> http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev >,
> >> <
> >> mailto:helix-client-dev-request helixcommunity.org?subject=subscribe
> >> <mailto:helix-client-dev-request helixcommunity.org%3Fsubject=subscribe> >
> >> Sender: helix-client-dev-bounces helixcommunity.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-dev helixcommunity.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 <milko real.com>
>Subject: Re: [Helix-client-dev] Packets pile up in
STREAM_INFO::
> m_EventList due to rebuffering.
>To: "a Gaurav Mahendroo" <mgaurav pv.com>,
> helix-client-dev helixcommunity.org
>Message-ID: <6.2.1.2.2.20060824130923.0b9c7ea8 mailone.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-dev helixcommunity.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 <milko real.com>
>Subject: [Helix-client-dev] CR-Client: Core start
performance
>To: helix-client-dev helixcommunity.org
>Message-ID: <6.2.1.2.2.20060828135848.05b52230 mailone.real.com>
>Content-Type: text/plain; charset="us-ascii"
>
>Modified by: milko real.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-dev helixcommunity.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-dev helixcommunity.org
>http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev
_______________________________________________
Helix-client-dev mailing list
Helix-client-dev helixcommunity.org
http://lists.helixcommunity.org/mailman/listinf
o/helix-client-dev
|